From 58ebb39d8161236f015175231cc858bbbb57b738 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Mon, 4 Oct 2021 21:13:01 +0200 Subject: [PATCH 001/592] mkbd65 added --- keyboards/mkbd65/README.md | 17 ++ keyboards/mkbd65/config.h | 158 +++++++++++ keyboards/mkbd65/info.json | 310 +++++++++++++++++++++ keyboards/mkbd65/keymaps/default/README.md | 52 ++++ keyboards/mkbd65/keymaps/default/config.h | 19 ++ keyboards/mkbd65/keymaps/default/keymap.c | 45 +++ keyboards/mkbd65/mkbd65.c | 43 +++ keyboards/mkbd65/mkbd65.h | 56 ++++ keyboards/mkbd65/rules.mk | 80 ++++++ 9 files changed, 780 insertions(+) create mode 100644 keyboards/mkbd65/README.md create mode 100644 keyboards/mkbd65/config.h create mode 100644 keyboards/mkbd65/info.json create mode 100644 keyboards/mkbd65/keymaps/default/README.md create mode 100644 keyboards/mkbd65/keymaps/default/config.h create mode 100644 keyboards/mkbd65/keymaps/default/keymap.c create mode 100644 keyboards/mkbd65/mkbd65.c create mode 100644 keyboards/mkbd65/mkbd65.h create mode 100644 keyboards/mkbd65/rules.mk diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md new file mode 100644 index 0000000000..b9946cfd26 --- /dev/null +++ b/keyboards/mkbd65/README.md @@ -0,0 +1,17 @@ +# mkbd65 + +![mkbd65](https://gitlab.com/mkbd65/pcb/raw/master/mkbd65.png) + +A mobile keyboard addon for smartphones. + +Keyboard Maintainer: [XenGi](https://xengi.de) +Hardware Supported: [mkbd65 PCB](https://gitlab.com/mkbd65) +Hardware Availability: - + +Make example for this keyboard (after setting up your build environment): + +``` +make mkbd65:default +``` + +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). diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h new file mode 100644 index 0000000000..704fe8f4dc --- /dev/null +++ b/keyboards/mkbd65/config.h @@ -0,0 +1,158 @@ +/* +Copyright 2018 XenGi + +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 "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xDEAD +#define PRODUCT_ID 0xBEAF +#define DEVICE_VER 0x0001 +#define MANUFACTURER XenGi +#define PRODUCT mkbd65 +#define DESCRIPTION Custom keyboard addon for smartphones + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D4, D6, D7, B4, B5 } +#define MATRIX_COL_PINS { D5, C7, C6, D3, D2, D1, D0, B7, B3, B2, B1, B0 } +#define UNUSED_PINS { E6, F0, F1, F4, F5, F6, F7 } + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +// #define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +// #define LOCKING_RESYNC_ENABLE + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +#define GRAVE_ESC_CTRL_OVERRIDE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json new file mode 100644 index 0000000000..a63e1f9a43 --- /dev/null +++ b/keyboards/mkbd65/info.json @@ -0,0 +1,310 @@ +{ + "keyboard_name": "MKBD65", + "url": "https://gitlab.com/xengi/mkbd65", + "maintainer": "XenGi", + "width": 12, + "height": 5, + "layouts": { + "LAYOUT": { + "key_count": 58, + "layout": [ + { + "label": "Esc", + "x": 0, + "y": 0 + }, + { + "label": "1", + "x": 1, + "y": 0 + }, + { + "label": "2", + "x": 2, + "y": 0 + }, + { + "label": "3", + "x": 3, + "y": 0 + }, + { + "label": "4", + "x": 4, + "y": 0 + }, + { + "label": "5", + "x": 5, + "y": 0 + }, + { + "label": "6", + "x": 6, + "y": 0 + }, + { + "label": "7", + "x": 7, + "y": 0 + }, + { + "label": "8", + "x": 8, + "y": 0 + }, + { + "label": "9", + "x": 9, + "y": 0 + }, + { + "label": "0", + "x": 10, + "y": 0 + }, + { + "label": "Delete", + "x": 11, + "y": 0 + }, + { + "label": "Q", + "x": 0, + "y": 1 + }, + { + "label": "W", + "x": 1, + "y": 1 + }, + { + "label": "E", + "x": 2, + "y": 1 + }, + { + "label": "R", + "x": 3, + "y": 1 + }, + { + "label": "T", + "x": 4, + "y": 1 + }, + { + "label": "Y", + "x": 5, + "y": 1 + }, + { + "label": "U", + "x": 6, + "y": 1 + }, + { + "label": "I", + "x": 7, + "y": 1 + }, + { + "label": "O", + "x": 8, + "y": 1 + }, + { + "label": "P", + "x": 9, + "y": 1 + }, + { + "label": "{", + "x": 10, + "y": 1 + }, + { + "label": "}", + "x": 11, + "y": 1 + }, + { + "label": "A", + "x": 0, + "y": 3 + }, + { + "label": "S", + "x": 1, + "y": 3 + }, + { + "label": "D", + "x": 2, + "y": 3 + }, + { + "label": "F", + "x": 3, + "y": 3 + }, + { + "label": "G", + "x": 4, + "y": 3 + }, + { + "label": "H", + "x": 5, + "y": 3 + }, + { + "label": "J", + "x": 6, + "y": 3 + }, + { + "label": "K", + "x": 7, + "y": 3 + }, + { + "label": "L", + "x": 8, + "y": 3 + }, + { + "label": ":", + "x": 9, + "y": 3 + }, + { + "label": "\"", + "x": 10, + "y": 3 + }, + { + "label": "Enter", + "x": 11, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 0, + "y": 4 + }, + { + "label": "X", + "x": 1, + "y": 4 + }, + { + "label": "C", + "x": 2, + "y": 4 + }, + { + "label": "V", + "x": 3, + "y": 4 + }, + { + "label": "B", + "x": 4, + "y": 4 + }, + { + "label": "N", + "x": 5, + "y": 4 + }, + { + "label": "M", + "x": 6, + "y": 4 + }, + { + "label": "<", + "x": 7, + "y": 4 + }, + { + "label": ">", + "x": 8, + "y": 4 + }, + { + "label": "?", + "x": 9, + "y": 4 + }, + { + "label": "↑", + "x": 10, + "y": 4 + }, + { + "label": "Shift", + "x": 11, + "y": 4 + }, + { + "label": "Ctrl", + "x": 0, + "y": 5 + }, + { + "label": "Fn", + "x": 1, + "y": 5 + }, + { + "label": "Shift", + "x": 2, + "y": 5 + }, + { + "label": "Alt", + "x": 3, + "y": 5 + }, + { + "label": "|", + "x": 4, + "y": 5 + }, + { + "x": 5, + "y": 5, + "w": 2 + }, + { + "label": "_", + "x": 7, + "y": 5 + }, + { + "label": "+", + "x": 8, + "y": 5 + }, + { + "label": "←", + "x": 9, + "y": 5 + }, + { + "label": "↓", + "x": 10, + "y": 5 + }, + { + "label": "→", + "x": 11, + "y": 5 + } + ] + } + } +} diff --git a/keyboards/mkbd65/keymaps/default/README.md b/keyboards/mkbd65/keymaps/default/README.md new file mode 100644 index 0000000000..2f7e9c220f --- /dev/null +++ b/keyboards/mkbd65/keymaps/default/README.md @@ -0,0 +1,52 @@ +# The default keymap for mkbd65 + +``` +0: no mod +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ +║ ESC║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║BKSP║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ q ║ w ║ e ║ r ║ t ║ y ║ u ║ i ║ o ║ p ║ [ ║ ] ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ; ║ ' ║ RET║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ z ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ / ║ ▲ ║SHFT║ +╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ +║CTRL║ FN ║SHFT║ ALT║ \ ║ SPACE ║ - ║ = ║ ◀ ║ ▼ ║ ▶ ║ +╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +1: mod shift +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ +║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║BKSP║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ RET║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ▲ ║░░░░║ +╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ +║CTRL║ FN ║░░░░║ ALT║ | ║ SPACE ║ _ ║ + ║ ◀ ║ ▼ ║ ▶ ║ +╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +2: mod alt +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ +║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║BKSP║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ RET║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║SHFT║ +╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ +║CTRL║ FN ║SHFT║░░░░║ ║ SPACE ║ ║ ║ ◀ ║ ▼ ║ ▶ ║ +╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +3: mod fn +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ +║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Del║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║SUPR║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║SHFT║ +╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ +║CTRL║░░░░║SHFT║ ALT║ ║ Tab ║ ║ ` ║Pos1║PgDn║ End║ +╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +``` diff --git a/keyboards/mkbd65/keymaps/default/config.h b/keyboards/mkbd65/keymaps/default/config.h new file mode 100644 index 0000000000..d08c67c094 --- /dev/null +++ b/keyboards/mkbd65/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 XenGi + * + * 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 + +// place overrides here diff --git a/keyboards/mkbd65/keymaps/default/keymap.c b/keyboards/mkbd65/keymaps/default/keymap.c new file mode 100644 index 0000000000..f57e6871fb --- /dev/null +++ b/keyboards/mkbd65/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2018 XenGi + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base layer */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_BSLS, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT( /* Function layer */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END + ), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} + diff --git a/keyboards/mkbd65/mkbd65.c b/keyboards/mkbd65/mkbd65.c new file mode 100644 index 0000000000..ab03178a44 --- /dev/null +++ b/keyboards/mkbd65/mkbd65.c @@ -0,0 +1,43 @@ +/* Copyright 2018 XenGi + * + * 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 "mkbd65.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/mkbd65/mkbd65.h b/keyboards/mkbd65/mkbd65.h new file mode 100644 index 0000000000..b9437d02b3 --- /dev/null +++ b/keyboards/mkbd65/mkbd65.h @@ -0,0 +1,56 @@ +/* Copyright 2018 XenGi + * + * 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 . + */ +#ifndef MKBD65_H +#define MKBD65_H + +#include "quantum.h" + +/* LAYOUT + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┴───┼───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ 2.0U │ │ │ │ │ │ + * └───┴───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┘ + * This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, \ + K40, K41, K42, K43, K44, K45, K47, K48, K49, K410, K411 \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311 }, \ + { K40, K41, K42, K43, K44, K45, KC_NO, K47, K48, K49, K410, K411 } \ +} + +#endif diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk new file mode 100644 index 0000000000..0187f822d3 --- /dev/null +++ b/keyboards/mkbd65/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = halfkay + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE = no # Audio output on port C6 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From d7ebb14089b49446dfdbbdd293290288eaec615c Mon Sep 17 00:00:00 2001 From: XenGi Date: Thu, 4 Nov 2021 17:45:28 +0000 Subject: [PATCH 002/592] Update README.md --- keyboards/mkbd65/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index b9946cfd26..887aa2a795 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -2,11 +2,11 @@ ![mkbd65](https://gitlab.com/mkbd65/pcb/raw/master/mkbd65.png) -A mobile keyboard addon for smartphones. +A mobile keyboard addon for modern smartphones. -Keyboard Maintainer: [XenGi](https://xengi.de) -Hardware Supported: [mkbd65 PCB](https://gitlab.com/mkbd65) -Hardware Availability: - +- Keyboard Maintainer: [XenGi](https://xengi.de) +- Hardware Supported: [mkbd65 PCB](https://gitlab.com/mkbd65/pcb) +- Hardware Availability: - Make example for this keyboard (after setting up your build environment): From 822e0caf42e190d846d4ef2496a740f1af625ef2 Mon Sep 17 00:00:00 2001 From: XenGi Date: Thu, 4 Nov 2021 17:48:29 +0000 Subject: [PATCH 003/592] Update keyboards/mkbd65/mkbd65.png, keyboards/mkbd65/README.md --- keyboards/mkbd65/README.md | 2 +- keyboards/mkbd65/mkbd65.png | Bin 0 -> 812 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 keyboards/mkbd65/mkbd65.png diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index 887aa2a795..08852e8fc2 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -1,6 +1,6 @@ # mkbd65 -![mkbd65](https://gitlab.com/mkbd65/pcb/raw/master/mkbd65.png) +![mkbd65](https://gitlab.com/mkbd65/qmk-firmware/-/raw/mkbd65/keyboards/mkbd65/mkbd65.png?inline=false) A mobile keyboard addon for modern smartphones. diff --git a/keyboards/mkbd65/mkbd65.png b/keyboards/mkbd65/mkbd65.png new file mode 100644 index 0000000000000000000000000000000000000000..b873771c748a467ea808d6c7f91220fe7642e11c GIT binary patch literal 812 zcmeAS@N?(olHy`uVBq!ia0y~yVDMsKU@+%kVqjoU;q$g+U|?*?baoE#baqxKD9TUE z%t>Wn(3n^|(bnUzgUr$R%UwZQO}ZM7CM>jy6c8=Eq9wA>X@zK1slm=K+_OwnboKh0 zvJW2YKf0>9d-FQJbxjIC7#}@*w&aD9>OXzWEgc^p?2v!|&i36sMyJJROtcO7GODin zs6I+k+pSf$U#WxPm*BC6GdjtBlO}zTiU0oL<5#_7oA;dmYgu)5&QXT>9yX_WHhb-H zwAmYJYVls!Jt8oy^L*!VpIr(cm9L9Vzi%NfBUX`i#Ao@lPURy>3!A6%rMU(x&r|AK zHOud()3Ma4pT*MG#w4$;{v_U3^y`$-^-MnHMpqrjCJt89DFJSxhEb(KI!iL_-#wHs z`XjVcq-g4a6B`@2OiuL4|KYDI&wi?|erHL5%!{gxZ~FxoREuX^%l-ZP#HAX4HWh(Z*iu2j;oqsWVlfw@&j&(ct zZv9sHi($#i)lYZ}3OIViG^+1DzH2*o@89ZWSMT$y&MWHZ6T5Pofq{Xuz$3Dlfk96h zgc&QA+LtjfFtC?+`ns||EZzkx!g~flkEm$e^vd7w~p1<#LG+X z*IfVhA#h>pBrff{Vawkv`gAnB?yBC`poGZxYvVRQS74qSe0$f27ImAh88;6swplmr z+l&v>$^!TQ5Wg?M;Zo6ZGT&?A$+H{^h3@A9WQsy!D$hO4KNXqFv;By~|DTgsa@wO} ztLrr0dRAYW_surb|JLMhOKdaW`)?_K8Q@~Md`tPVy$Al9uk*e5KsMk`{ULjX`!&i( VH6?xTGcYhPc)I$ztaD0e0s!C_ZHNE> literal 0 HcmV?d00001 From 706bbd9228da354a6a653421b4030b5f72e7fc19 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Wed, 5 Jan 2022 00:59:33 +0100 Subject: [PATCH 004/592] support new PCB and ANSI and ISO layout --- keyboards/mkbd65/README.md | 11 ++- keyboards/mkbd65/config.h | 19 ++-- keyboards/mkbd65/info.json | 2 +- .../keymaps/{default => ansi}/README.md | 92 ++++++++++--------- .../mkbd65/keymaps/{default => ansi}/config.h | 2 +- keyboards/mkbd65/keymaps/ansi/keymap.c | 45 +++++++++ keyboards/mkbd65/keymaps/default | 1 + keyboards/mkbd65/keymaps/iso/README.md | 54 +++++++++++ keyboards/mkbd65/keymaps/iso/config.h | 19 ++++ .../mkbd65/keymaps/{default => iso}/keymap.c | 14 +-- keyboards/mkbd65/mkbd65.c | 2 +- keyboards/mkbd65/mkbd65.h | 78 +++++++++++----- 12 files changed, 248 insertions(+), 91 deletions(-) rename keyboards/mkbd65/keymaps/{default => ansi}/README.md (52%) rename keyboards/mkbd65/keymaps/{default => ansi}/config.h (96%) create mode 100644 keyboards/mkbd65/keymaps/ansi/keymap.c create mode 120000 keyboards/mkbd65/keymaps/default create mode 100644 keyboards/mkbd65/keymaps/iso/README.md create mode 100644 keyboards/mkbd65/keymaps/iso/config.h rename keyboards/mkbd65/keymaps/{default => iso}/keymap.c (78%) diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index 08852e8fc2..045589252f 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -1,7 +1,7 @@ -# mkbd65 - ![mkbd65](https://gitlab.com/mkbd65/qmk-firmware/-/raw/mkbd65/keyboards/mkbd65/mkbd65.png?inline=false) +# mkbd65 + A mobile keyboard addon for modern smartphones. - Keyboard Maintainer: [XenGi](https://xengi.de) @@ -14,4 +14,11 @@ Make example for this keyboard (after setting up your build environment): make mkbd65:default ``` +Available layouts: + + - ansi (default) + - iso (upright `Enter` key) + +_Don't forget to connect the correct solder joints on the PCB to switch the layout._ + 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). diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index 704fe8f4dc..6b4e2fbe05 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -1,5 +1,5 @@ /* -Copyright 2018 XenGi +Copyright 2022 XenGi 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 @@ -20,8 +20,8 @@ along with this program. If not, see . #include "config_common.h" /* USB Device descriptor parameter */ -#define VENDOR_ID 0xDEAD -#define PRODUCT_ID 0xBEAF +#define VENDOR_ID 0x1209 +#define PRODUCT_ID 0x4803 #define DEVICE_VER 0x0001 #define MANUFACTURER XenGi #define PRODUCT mkbd65 @@ -29,7 +29,7 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 5 -#define MATRIX_COLS 12 +#define MATRIX_COLS 13 /* * Keyboard Matrix Assignments @@ -41,16 +41,17 @@ along with this program. If not, see . * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * */ -#define MATRIX_ROW_PINS { D4, D6, D7, B4, B5 } -#define MATRIX_COL_PINS { D5, C7, C6, D3, D2, D1, D0, B7, B3, B2, B1, B0 } -#define UNUSED_PINS { E6, F0, F1, F4, F5, F6, F7 } +#define MATRIX_COL_PINS { D4, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } +#define MATRIX_ROW_PINS { D5, D3, D2, D1, D0 } +#define UNUSED_PINS { B3, B2, B1, B0, E6 } /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -#define DIODE_DIRECTION COL2ROW +#define DIODE_DIRECTION ROW2COL -#define BACKLIGHT_PIN B6 +#define BACKLIGHT_PIN B7 #define BACKLIGHT_BREATHING #define BACKLIGHT_LEVELS 3 +#define BACKLIGHT_ON_STATE 1 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json index a63e1f9a43..dd4edfcd06 100644 --- a/keyboards/mkbd65/info.json +++ b/keyboards/mkbd65/info.json @@ -1,6 +1,6 @@ { "keyboard_name": "MKBD65", - "url": "https://gitlab.com/xengi/mkbd65", + "url": "https://gitlab.com/mkbd65", "maintainer": "XenGi", "width": 12, "height": 5, diff --git a/keyboards/mkbd65/keymaps/default/README.md b/keyboards/mkbd65/keymaps/ansi/README.md similarity index 52% rename from keyboards/mkbd65/keymaps/default/README.md rename to keyboards/mkbd65/keymaps/ansi/README.md index 2f7e9c220f..00feeefc77 100644 --- a/keyboards/mkbd65/keymaps/default/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -1,52 +1,54 @@ -# The default keymap for mkbd65 +# The ANSI keymap for mkbd65 + +This is the default layout. ``` 0: no mod -╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ -║ ESC║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║BKSP║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ q ║ w ║ e ║ r ║ t ║ y ║ u ║ i ║ o ║ p ║ [ ║ ] ║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ; ║ ' ║ RET║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ z ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ / ║ ▲ ║SHFT║ -╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ -║CTRL║ FN ║SHFT║ ALT║ \ ║ SPACE ║ - ║ = ║ ◀ ║ ▼ ║ ▶ ║ -╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ q ║ w ║ e ║ r ║ t ║ y ║ u ║ i ║ o ║ p ║ [ ║ ] ║ \ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ; ║ ' ║ Return ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ z ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ / ║ ▲ ║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║Shft║AltG║ Space ║ - ║ = ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ 1: mod shift -╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ -║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║BKSP║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ RET║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ▲ ║░░░░║ -╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ -║CTRL║ FN ║░░░░║ ALT║ | ║ SPACE ║ _ ║ + ║ ◀ ║ ▼ ║ ▶ ║ -╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ | ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ Return ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ▲ ║░░░░░░░░░║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║░░░░║AltG║ Space ║ _ ║ + ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ 2: mod alt -╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ -║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║BKSP║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ RET║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║SHFT║ -╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ -║CTRL║ FN ║SHFT║░░░░║ ║ SPACE ║ ║ ║ ◀ ║ ▼ ║ ▶ ║ -╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ¬ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Return ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║Shft║░░░░║ Space ║ ║ ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ 3: mod fn -╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╗ -║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Del║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║SUPR║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║SHFT║ -╠════╬════╬════╬════╬════╬════╩════╬════╬════╬════╬════╬════╣ -║CTRL║░░░░║SHFT║ ALT║ ║ Tab ║ ║ ` ║Pos1║PgDn║ End║ -╚════╩════╩════╩════╩════╩═════════╩════╩════╩════╩════╩════╝ +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Delete ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Super ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ` ║Pos1║PgDn║ End║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` diff --git a/keyboards/mkbd65/keymaps/default/config.h b/keyboards/mkbd65/keymaps/ansi/config.h similarity index 96% rename from keyboards/mkbd65/keymaps/default/config.h rename to keyboards/mkbd65/keymaps/ansi/config.h index d08c67c094..b0d0727509 100644 --- a/keyboards/mkbd65/keymaps/default/config.h +++ b/keyboards/mkbd65/keymaps/ansi/config.h @@ -1,4 +1,4 @@ -/* Copyright 2018 XenGi +/* Copyright 2022 XenGi * * 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 diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c new file mode 100644 index 0000000000..4b7b3520a4 --- /dev/null +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2022 XenGi + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ANSI( /* Base layer */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, + ), + + [1] = LAYOUT_ANSI( /* Function layer */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, + ), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} + diff --git a/keyboards/mkbd65/keymaps/default b/keyboards/mkbd65/keymaps/default new file mode 120000 index 0000000000..44ad4f4f7e --- /dev/null +++ b/keyboards/mkbd65/keymaps/default @@ -0,0 +1 @@ +ansi \ No newline at end of file diff --git a/keyboards/mkbd65/keymaps/iso/README.md b/keyboards/mkbd65/keymaps/iso/README.md new file mode 100644 index 0000000000..d08f8c1b9e --- /dev/null +++ b/keyboards/mkbd65/keymaps/iso/README.md @@ -0,0 +1,54 @@ +# The iso-like keymap for mkbd65 + +It's actually just ANSI but with an upright `Enter` key. + +``` +0: no mod +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ q ║ w ║ e ║ r ║ t ║ y ║ u ║ i ║ o ║ p ║ [ ║ ] ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ Ret║ +║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ; ║ ' ║ \ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ z ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ / ║ ▲ ║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║Shft║AltG║ SPACE ║ - ║ = ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +1: mod shift +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ Ret║ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ | ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ▲ ║░░░░░░░░░║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║░░░░║AltG║ SPACE ║ _ ║ + ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +2: mod alt +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ Ret║ +║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ¬ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║Shft║░░░░║ SPACE ║ ║ ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +3: mod fn +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Delete ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣Supr║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ` ║Pos1║PgDn║ End║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +``` diff --git a/keyboards/mkbd65/keymaps/iso/config.h b/keyboards/mkbd65/keymaps/iso/config.h new file mode 100644 index 0000000000..b0d0727509 --- /dev/null +++ b/keyboards/mkbd65/keymaps/iso/config.h @@ -0,0 +1,19 @@ +/* Copyright 2022 XenGi + * + * 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 + +// place overrides here diff --git a/keyboards/mkbd65/keymaps/default/keymap.c b/keyboards/mkbd65/keymaps/iso/keymap.c similarity index 78% rename from keyboards/mkbd65/keymaps/default/keymap.c rename to keyboards/mkbd65/keymaps/iso/keymap.c index f57e6871fb..155a2b205b 100644 --- a/keyboards/mkbd65/keymaps/default/keymap.c +++ b/keyboards/mkbd65/keymaps/iso/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2018 XenGi +/* Copyright 2022 XenGi * * 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 @@ -17,20 +17,20 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( /* Base layer */ + [0] = LAYOUT_ISO( /* Base layer */ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_BSLS, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, ), - [1] = LAYOUT( /* Function layer */ + [1] = LAYOUT_ISO( /* Function layer */ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, _______, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END + _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, ), }; diff --git a/keyboards/mkbd65/mkbd65.c b/keyboards/mkbd65/mkbd65.c index ab03178a44..fae93a8ea5 100644 --- a/keyboards/mkbd65/mkbd65.c +++ b/keyboards/mkbd65/mkbd65.c @@ -1,4 +1,4 @@ -/* Copyright 2018 XenGi +/* Copyright 2022 XenGi * * 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 diff --git a/keyboards/mkbd65/mkbd65.h b/keyboards/mkbd65/mkbd65.h index b9437d02b3..1a53cad69f 100644 --- a/keyboards/mkbd65/mkbd65.h +++ b/keyboards/mkbd65/mkbd65.h @@ -1,4 +1,4 @@ -/* Copyright 2018 XenGi +/* Copyright 2022 XenGi * * 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 @@ -18,19 +18,19 @@ #include "quantum.h" -/* LAYOUT - * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ - * │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ - * │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ - * │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ - * │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┴───┼───┼───┼───┼───┼───┤ - * │ │ │ │ │ │ 2.0U │ │ │ │ │ │ - * └───┴───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┘ - * This a shortcut to help you visually see your layout. +/* LAYOUT_ANSI + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───────┤ + * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ + * ├───┼───┼───┼───┼───┴───┴───┼───┼───┼───┼───┼───┬───┤ + * │ │ │ │ │ 3.0U │ │ │ │ │ │ │ + * └───┴───┴───┴───┴───────────┴───┴───┴───┴───┴───┴───┘ + * This is a shortcut to help you visually see your layout. * * The first section contains all of the arguments representing the physical * layout of the board and position of the keys. @@ -38,19 +38,47 @@ * The second converts the arguments into a two-dimensional array which * represents the switch matrix. */ -#define LAYOUT( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, \ - K40, K41, K42, K43, K44, K45, K47, K48, K49, K410, K411 \ +#define LAYOUT_ANSI( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, \ + K40, K41, K42, K43, K44, K47, K48, K49, K410, K411, K412 \ ) \ { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011 }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111 }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211 }, \ - { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311 }, \ - { K40, K41, K42, K43, K44, K45, KC_NO, K47, K48, K49, K410, K411 } \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, KC_NO }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, KC_NO }, \ + { K40, K41, K42, K43, K44, KC_NO, KC_NO, K47, K48, K49, K410, K411, K412 } \ +} + +/* LAYOUT_ISO + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ + * │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ + * ├───┼───┼───┼───┼───┴───┴───┼───┼───┼───┼───┼───┬───┤ + * │ │ │ │ │ 3.0U │ │ │ │ │ │ │ + * └───┴───┴───┴───┴───────────┴───┴───┴───┴───┴───┴───┘ + */ +#define LAYOUT_ISO( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, \ + K40, K41, K42, K43, K44, K47, K48, K49, K410, K411, K412 \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, KC_NO }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, KC_NO }, \ + { K40, K41, K42, K43, K44, KC_NO, KC_NO, K47, K48, K49, K410, K411, K412 } \ } #endif From ae675071394ce10ae1698f34b4bbae446cf070bc Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Wed, 26 Jan 2022 00:06:05 +0100 Subject: [PATCH 005/592] fix code; first successful flash --- keyboards/mkbd65/README.md | 4 +- keyboards/mkbd65/info.json | 310 ------------------------- keyboards/mkbd65/keymaps/ansi/keymap.c | 6 +- keyboards/mkbd65/rules.mk | 2 +- 4 files changed, 6 insertions(+), 316 deletions(-) delete mode 100644 keyboards/mkbd65/info.json diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index 045589252f..d130cbf8e2 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -8,10 +8,10 @@ A mobile keyboard addon for modern smartphones. - Hardware Supported: [mkbd65 PCB](https://gitlab.com/mkbd65/pcb) - Hardware Availability: - -Make example for this keyboard (after setting up your build environment): +Flashing this keyboard with ANSI layout (after setting up your build environment): ``` -make mkbd65:default +qmk flash -kb mkbd65 -km ansi ``` Available layouts: diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json deleted file mode 100644 index dd4edfcd06..0000000000 --- a/keyboards/mkbd65/info.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "keyboard_name": "MKBD65", - "url": "https://gitlab.com/mkbd65", - "maintainer": "XenGi", - "width": 12, - "height": 5, - "layouts": { - "LAYOUT": { - "key_count": 58, - "layout": [ - { - "label": "Esc", - "x": 0, - "y": 0 - }, - { - "label": "1", - "x": 1, - "y": 0 - }, - { - "label": "2", - "x": 2, - "y": 0 - }, - { - "label": "3", - "x": 3, - "y": 0 - }, - { - "label": "4", - "x": 4, - "y": 0 - }, - { - "label": "5", - "x": 5, - "y": 0 - }, - { - "label": "6", - "x": 6, - "y": 0 - }, - { - "label": "7", - "x": 7, - "y": 0 - }, - { - "label": "8", - "x": 8, - "y": 0 - }, - { - "label": "9", - "x": 9, - "y": 0 - }, - { - "label": "0", - "x": 10, - "y": 0 - }, - { - "label": "Delete", - "x": 11, - "y": 0 - }, - { - "label": "Q", - "x": 0, - "y": 1 - }, - { - "label": "W", - "x": 1, - "y": 1 - }, - { - "label": "E", - "x": 2, - "y": 1 - }, - { - "label": "R", - "x": 3, - "y": 1 - }, - { - "label": "T", - "x": 4, - "y": 1 - }, - { - "label": "Y", - "x": 5, - "y": 1 - }, - { - "label": "U", - "x": 6, - "y": 1 - }, - { - "label": "I", - "x": 7, - "y": 1 - }, - { - "label": "O", - "x": 8, - "y": 1 - }, - { - "label": "P", - "x": 9, - "y": 1 - }, - { - "label": "{", - "x": 10, - "y": 1 - }, - { - "label": "}", - "x": 11, - "y": 1 - }, - { - "label": "A", - "x": 0, - "y": 3 - }, - { - "label": "S", - "x": 1, - "y": 3 - }, - { - "label": "D", - "x": 2, - "y": 3 - }, - { - "label": "F", - "x": 3, - "y": 3 - }, - { - "label": "G", - "x": 4, - "y": 3 - }, - { - "label": "H", - "x": 5, - "y": 3 - }, - { - "label": "J", - "x": 6, - "y": 3 - }, - { - "label": "K", - "x": 7, - "y": 3 - }, - { - "label": "L", - "x": 8, - "y": 3 - }, - { - "label": ":", - "x": 9, - "y": 3 - }, - { - "label": "\"", - "x": 10, - "y": 3 - }, - { - "label": "Enter", - "x": 11, - "y": 3, - "w": 2.25 - }, - { - "label": "Z", - "x": 0, - "y": 4 - }, - { - "label": "X", - "x": 1, - "y": 4 - }, - { - "label": "C", - "x": 2, - "y": 4 - }, - { - "label": "V", - "x": 3, - "y": 4 - }, - { - "label": "B", - "x": 4, - "y": 4 - }, - { - "label": "N", - "x": 5, - "y": 4 - }, - { - "label": "M", - "x": 6, - "y": 4 - }, - { - "label": "<", - "x": 7, - "y": 4 - }, - { - "label": ">", - "x": 8, - "y": 4 - }, - { - "label": "?", - "x": 9, - "y": 4 - }, - { - "label": "↑", - "x": 10, - "y": 4 - }, - { - "label": "Shift", - "x": 11, - "y": 4 - }, - { - "label": "Ctrl", - "x": 0, - "y": 5 - }, - { - "label": "Fn", - "x": 1, - "y": 5 - }, - { - "label": "Shift", - "x": 2, - "y": 5 - }, - { - "label": "Alt", - "x": 3, - "y": 5 - }, - { - "label": "|", - "x": 4, - "y": 5 - }, - { - "x": 5, - "y": 5, - "w": 2 - }, - { - "label": "_", - "x": 7, - "y": 5 - }, - { - "label": "+", - "x": 8, - "y": 5 - }, - { - "label": "←", - "x": 9, - "y": 5 - }, - { - "label": "↓", - "x": 10, - "y": 5 - }, - { - "label": "→", - "x": 11, - "y": 5 - } - ] - } - } -} diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index 4b7b3520a4..cc7c6018cc 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, + KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL ), [1] = LAYOUT_ANSI( /* Function layer */ @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, - ), + _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ + ) }; void matrix_init_user(void) { diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk index 0187f822d3..a6bdd38bae 100644 --- a/keyboards/mkbd65/rules.mk +++ b/keyboards/mkbd65/rules.mk @@ -45,7 +45,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # LUFA DFU lufa-dfu # QMK DFU qmk-dfu # atmega32a bootloadHID -BOOTLOADER = halfkay +BOOTLOADER = atmel-dfu # If you don't know the bootloader type, then you can specify the From 7b8e2a8ea070d6bf4b9878788fb52892fef71447 Mon Sep 17 00:00:00 2001 From: XenGi Date: Thu, 27 Jan 2022 19:46:54 +0000 Subject: [PATCH 006/592] Update keyboards/mkbd65/keymaps/ansi/README.md --- keyboards/mkbd65/keymaps/ansi/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index 00feeefc77..99bec108a1 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -30,7 +30,7 @@ This is the default layout. 2: mod alt ╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ ║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║Backspace║ -╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +╠════╬════╬════╬════╬════╬════╬════╬════╬══` ══╬════╬════╬════╦════╣ ║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ¬ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ ║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Return ║ @@ -45,10 +45,10 @@ This is the default layout. ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Super ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ Shift ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ -║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ` ║Pos1║PgDn║ End║Ctrl║ +║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ║Pos1║PgDn║ End║Ctrl║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` From f0cb73c17581fb40cc5db36d7a182218aaabfb49 Mon Sep 17 00:00:00 2001 From: XenGi Date: Thu, 27 Jan 2022 19:47:25 +0000 Subject: [PATCH 007/592] Update keyboards/mkbd65/keymaps/ansi/README.md --- keyboards/mkbd65/keymaps/ansi/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index 99bec108a1..87759b323b 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -30,12 +30,12 @@ This is the default layout. 2: mod alt ╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ ║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║Backspace║ -╠════╬════╬════╬════╬════╬════╬════╬════╬══` ══╬════╬════╬════╦════╣ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ¬ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ ║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Return ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║ Shift ║ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║ Shift ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ ║Ctrl║ Fn ║Shft║░░░░║ Space ║ ║ ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ From acb282080a689bfe8eb64792f15433f8a14501c4 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sat, 19 Feb 2022 18:31:46 +0100 Subject: [PATCH 008/592] make AltGr a sticky key, Fixes #1 --- keyboards/mkbd65/config.h | 5 +++-- keyboards/mkbd65/keymaps/ansi/keymap.c | 2 +- keyboards/mkbd65/keymaps/iso/keymap.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index 6b4e2fbe05..8eff7c175d 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -22,9 +22,9 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0x1209 #define PRODUCT_ID 0x4803 -#define DEVICE_VER 0x0001 +#define DEVICE_VER 0x0002 #define MANUFACTURER XenGi -#define PRODUCT mkbd65 +#define PRODUCT mkbd65 rev1 #define DESCRIPTION Custom keyboard addon for smartphones /* key matrix size */ @@ -48,6 +48,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL +/* (back)light configuration */ #define BACKLIGHT_PIN B7 #define BACKLIGHT_BREATHING #define BACKLIGHT_LEVELS 3 diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index cc7c6018cc..52e6bb289e 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL ), [1] = LAYOUT_ANSI( /* Function layer */ diff --git a/keyboards/mkbd65/keymaps/iso/keymap.c b/keyboards/mkbd65/keymaps/iso/keymap.c index 155a2b205b..9187478d99 100644 --- a/keyboards/mkbd65/keymaps/iso/keymap.c +++ b/keyboards/mkbd65/keymaps/iso/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, KC_RALT, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, ), [1] = LAYOUT_ISO( /* Function layer */ From 4dcbaafb78c86cdbb7d0bdf70413bcd55db1c8ae Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sat, 19 Feb 2022 21:58:06 +0100 Subject: [PATCH 009/592] add media controls --- keyboards/mkbd65/keymaps/ansi/keymap.c | 6 +++--- keyboards/mkbd65/keymaps/iso/keymap.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index 52e6bb289e..972410b3dd 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -27,9 +27,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_ANSI( /* Function layer */ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, KC_LGUI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ ) }; diff --git a/keyboards/mkbd65/keymaps/iso/keymap.c b/keyboards/mkbd65/keymaps/iso/keymap.c index 9187478d99..eff19b0c4f 100644 --- a/keyboards/mkbd65/keymaps/iso/keymap.c +++ b/keyboards/mkbd65/keymaps/iso/keymap.c @@ -28,8 +28,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_ISO( /* Function layer */ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV, _______, KC_LGUI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_APP, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, ), }; From 9c3912ba8fb9cc211bbe57ee56b08cbb057affa6 Mon Sep 17 00:00:00 2001 From: XenGi Date: Fri, 26 May 2023 11:11:10 +0000 Subject: [PATCH 010/592] Update README.md --- keyboards/mkbd65/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index d130cbf8e2..6c694a5f92 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -19,6 +19,4 @@ Available layouts: - ansi (default) - iso (upright `Enter` key) -_Don't forget to connect the correct solder joints on the PCB to switch the layout._ - 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). From 2ba9ed711088e7ccfa0df89fa9948aed6161cae9 Mon Sep 17 00:00:00 2001 From: XenGi Date: Fri, 26 May 2023 11:13:43 +0000 Subject: [PATCH 011/592] Update README.md --- keyboards/mkbd65/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index 6c694a5f92..f30b7c91ea 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -8,15 +8,19 @@ A mobile keyboard addon for modern smartphones. - Hardware Supported: [mkbd65 PCB](https://gitlab.com/mkbd65/pcb) - Hardware Availability: - -Flashing this keyboard with ANSI layout (after setting up your build environment): +Flashing this keyboard with `en-us-intl` layout (after setting up your build environment): ``` -qmk flash -kb mkbd65 -km ansi +qmk flash -kb mkbd65 -km en-us-intl ``` Available layouts: - - ansi (default) - - iso (upright `Enter` key) + - en-us-intl (ansi) + - de-de (iso) + +You can find community provided layouts here: https://gitlab.com/mkbd65/community + +--- 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). From 1bb2a178572b1fb6416032b5898d956436902aab Mon Sep 17 00:00:00 2001 From: XenGi Date: Fri, 26 May 2023 11:27:32 +0000 Subject: [PATCH 012/592] Update README.md --- keyboards/mkbd65/keymaps/ansi/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index 87759b323b..923a3ccf57 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -1,6 +1,9 @@ -# The ANSI keymap for mkbd65 +# The English US International keymap for mkbd65 by XenGi + +This is the default layout for the mkbd65 keyboard. You can use it as a reference for other layouts. + +It is based on the "English (intl., with AltGr dead keys)" layout. -This is the default layout. ``` 0: no mod From 462077f2dd3d5069986ac9a34ac779c36047c900 Mon Sep 17 00:00:00 2001 From: XenGi Date: Fri, 26 May 2023 11:33:48 +0000 Subject: [PATCH 013/592] Update README.md --- keyboards/mkbd65/keymaps/ansi/README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index 923a3ccf57..b394d98f2c 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -4,6 +4,7 @@ This is the default layout for the mkbd65 keyboard. You can use it as a referenc It is based on the "English (intl., with AltGr dead keys)" layout. +This is the key matrix (no label means the key from layer 0 will be used): ``` 0: no mod @@ -20,27 +21,27 @@ It is based on the "English (intl., with AltGr dead keys)" layout. ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ 1: mod shift ╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ -║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║Backspace║ +║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ | ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ -║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ Return ║ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ▲ ║░░░░░░░░░║ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ║░░░░░░░░░║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ -║Ctrl║ Fn ║░░░░║AltG║ Space ║ _ ║ + ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +║ ║ ║░░░░║ ║ ║ _ ║ + ║ ║ ║ ║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ -2: mod alt +2: mod altgr ╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ -║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║Backspace║ +║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ¬ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ -║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ Return ║ +║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ▲ ║ Shift ║ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ -║Ctrl║ Fn ║Shft║░░░░║ Space ║ ║ ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +║ ║ ║ ║░░░░║ ║ ║ ║ ║ ║ ║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ 3: mod fn ╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ @@ -50,8 +51,8 @@ It is based on the "English (intl., with AltGr dead keys)" layout. ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ Shift ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ -║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ║Pos1║PgDn║ End║Ctrl║ +║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` From 725bf551684ee117cea6e60208289ecb043c6593 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sun, 11 Jun 2023 19:51:12 +0200 Subject: [PATCH 014/592] updated to fit qmk standards --- keyboards/mkbd65/README.md | 21 ++- keyboards/mkbd65/config.h | 159 +----------------- keyboards/mkbd65/info.json | 20 +++ keyboards/mkbd65/keymaps/ansi/README.md | 2 +- keyboards/mkbd65/keymaps/ansi/config.h | 19 --- keyboards/mkbd65/keymaps/ansi/keymap.c | 49 ++---- keyboards/mkbd65/keymaps/de/README.md | 56 ++++++ keyboards/mkbd65/keymaps/de/keymap.c | 23 +++ .../mkbd65/keymaps/{default => en-us-intl} | 0 keyboards/mkbd65/keymaps/iso/README.md | 2 +- keyboards/mkbd65/keymaps/iso/config.h | 19 --- keyboards/mkbd65/keymaps/iso/keymap.c | 27 +-- keyboards/mkbd65/mkbd65.c | 43 ----- keyboards/mkbd65/rev0/info.json | 147 ++++++++++++++++ keyboards/mkbd65/rev0/mkbd65.c | 4 + keyboards/mkbd65/{ => rev0}/mkbd65.h | 48 ++---- keyboards/mkbd65/rev0/rules.mk | 9 + keyboards/mkbd65/rev1/info.json | 157 +++++++++++++++++ keyboards/mkbd65/rev1/mkbd65.c | 4 + keyboards/mkbd65/rev1/mkbd65.h | 42 +++++ keyboards/mkbd65/rev1/rules.mk | 3 + keyboards/mkbd65/rules.mk | 85 +--------- 22 files changed, 530 insertions(+), 409 deletions(-) create mode 100644 keyboards/mkbd65/info.json delete mode 100644 keyboards/mkbd65/keymaps/ansi/config.h create mode 100644 keyboards/mkbd65/keymaps/de/README.md create mode 100644 keyboards/mkbd65/keymaps/de/keymap.c rename keyboards/mkbd65/keymaps/{default => en-us-intl} (100%) delete mode 100644 keyboards/mkbd65/keymaps/iso/config.h delete mode 100644 keyboards/mkbd65/mkbd65.c create mode 100644 keyboards/mkbd65/rev0/info.json create mode 100644 keyboards/mkbd65/rev0/mkbd65.c rename keyboards/mkbd65/{ => rev0}/mkbd65.h (65%) create mode 100644 keyboards/mkbd65/rev0/rules.mk create mode 100644 keyboards/mkbd65/rev1/info.json create mode 100644 keyboards/mkbd65/rev1/mkbd65.c create mode 100644 keyboards/mkbd65/rev1/mkbd65.h create mode 100644 keyboards/mkbd65/rev1/rules.mk diff --git a/keyboards/mkbd65/README.md b/keyboards/mkbd65/README.md index f30b7c91ea..817bde28b3 100644 --- a/keyboards/mkbd65/README.md +++ b/keyboards/mkbd65/README.md @@ -11,16 +11,31 @@ A mobile keyboard addon for modern smartphones. Flashing this keyboard with `en-us-intl` layout (after setting up your build environment): ``` -qmk flash -kb mkbd65 -km en-us-intl +qmk flash -kb mkbd65:rev1 -km en-us-intl ``` Available layouts: - en-us-intl (ansi) - - de-de (iso) + - de (iso) You can find community provided layouts here: https://gitlab.com/mkbd65/community +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). + --- -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). +Copyright 2023 XenGi mkbd65@xengi.de @XenGi + +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 . diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index 8eff7c175d..4ac3a7eaf5 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -1,160 +1,13 @@ -/* -Copyright 2022 XenGi - -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 . -*/ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0x1209 -#define PRODUCT_ID 0x4803 -#define DEVICE_VER 0x0002 -#define MANUFACTURER XenGi -#define PRODUCT mkbd65 rev1 -#define DESCRIPTION Custom keyboard addon for smartphones - -/* key matrix size */ -#define MATRIX_ROWS 5 -#define MATRIX_COLS 13 - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * -*/ -#define MATRIX_COL_PINS { D4, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } -#define MATRIX_ROW_PINS { D5, D3, D2, D1, D0 } -#define UNUSED_PINS { B3, B2, B1, B0, E6 } - -/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -#define DIODE_DIRECTION ROW2COL - -/* (back)light configuration */ -#define BACKLIGHT_PIN B7 -#define BACKLIGHT_BREATHING -#define BACKLIGHT_LEVELS 3 -#define BACKLIGHT_ON_STATE 1 - -/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -// #define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -// #define LOCKING_RESYNC_ENABLE - -/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. - * This is userful for the Windows task manager shortcut (ctrl+shift+esc). - */ -#define GRAVE_ESC_CTRL_OVERRIDE - -/* - * Force NKRO - * - * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved - * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the - * makefile for this to work.) - * - * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) - * until the next keyboard reset. - * - * NKRO may prevent your keystrokes from being detected in the BIOS, but it is - * fully operational during normal computer usage. - * - * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) - * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by - * bootmagic, NKRO mode will always be enabled until it is toggled again during a - * power-up. - * - */ -//#define FORCE_NKRO - -/* - * Magic Key Options - * - * Magic keys are hotkey commands that allow control over firmware functions of - * the keyboard. They are best used in combination with the HID Listen program, - * found here: https://www.pjrc.com/teensy/hid_listen.html - * - * The options below allow the magic key functionality to be changed. This is - * useful if your keyboard/keypad is missing keys and you want magic key support. - * - */ - -/* key combination for magic key command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* control how magic key switches layers */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false - -/* override magic key keymap */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM -//#define MAGIC_KEY_HELP1 H -//#define MAGIC_KEY_HELP2 SLASH -//#define MAGIC_KEY_DEBUG D -//#define MAGIC_KEY_DEBUG_MATRIX X -//#define MAGIC_KEY_DEBUG_KBD K -//#define MAGIC_KEY_DEBUG_MOUSE M -//#define MAGIC_KEY_VERSION V -//#define MAGIC_KEY_STATUS S -//#define MAGIC_KEY_CONSOLE C -//#define MAGIC_KEY_LAYER0_ALT1 ESC -//#define MAGIC_KEY_LAYER0_ALT2 GRAVE -//#define MAGIC_KEY_LAYER0 0 -//#define MAGIC_KEY_LAYER1 1 -//#define MAGIC_KEY_LAYER2 2 -//#define MAGIC_KEY_LAYER3 3 -//#define MAGIC_KEY_LAYER4 4 -//#define MAGIC_KEY_LAYER5 5 -//#define MAGIC_KEY_LAYER6 6 -//#define MAGIC_KEY_LAYER7 7 -//#define MAGIC_KEY_LAYER8 8 -//#define MAGIC_KEY_LAYER9 9 -//#define MAGIC_KEY_BOOTLOADER PAUSE -//#define MAGIC_KEY_LOCK CAPS -//#define MAGIC_KEY_EEPROM E -//#define MAGIC_KEY_NKRO N -//#define MAGIC_KEY_SLEEP_LED Z - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ +// disable debugging //#define NO_DEBUG - -/* disable print */ +// disable printing/debugging using hid_listen //#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER +// disable tap dance and other tapping features //#define NO_ACTION_TAPPING +// disable one-shot modifiers //#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json new file mode 100644 index 0000000000..aea164d043 --- /dev/null +++ b/keyboards/mkbd65/info.json @@ -0,0 +1,20 @@ +{ + "keyboard_name": "mkbd65", + "manufacturer": "XenGi", + "url": "https://mkbd65.xengi.de", + "maintainer": "XenGi", + "author": ["XenGi"], + "usb": { + "vid": "0x1209", + "pid": "0x4803" + }, + "debounce": 5, + "diode_direction": "ROW2COL", + "bootmagic": { + "enabled": true, + "matrix": [0, 0] + }, + "tags": ["mobile", "65%"], + "description": "A mobile keyboard addon for modern smartphones. Fits any smartphones within some minimal size requirements. Supports any keyboard layout you want, as long as it doesn't need more keys.", + "short": "A mobile keyboard addon for modern smartphones." +} diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index b394d98f2c..96e8f7bb14 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -1,4 +1,4 @@ -# The English US International keymap for mkbd65 by XenGi +# The English US International keymap for mkbd65 rev0 by XenGi This is the default layout for the mkbd65 keyboard. You can use it as a reference for other layouts. diff --git a/keyboards/mkbd65/keymaps/ansi/config.h b/keyboards/mkbd65/keymaps/ansi/config.h deleted file mode 100644 index b0d0727509..0000000000 --- a/keyboards/mkbd65/keymaps/ansi/config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright 2022 XenGi - * - * 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 - -// place overrides here diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index 972410b3dd..ddda2b83bc 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -1,45 +1,22 @@ -/* Copyright 2022 XenGi - * - * 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 . - */ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_ANSI( /* Base layer */ - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL + [0] = LAYOUT( /* Base layer */ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, + 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_SPC, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL ), - [1] = LAYOUT_ANSI( /* Function layer */ - RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + [1] = LAYOUT( /* Function layer */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, - _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, - _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, + _______, _______, _______, _______, KC_TAB, KC_TAB, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ ) }; - -void matrix_init_user(void) { -} - -void matrix_scan_user(void) { -} - -void led_set_user(uint8_t usb_led) { -} - diff --git a/keyboards/mkbd65/keymaps/de/README.md b/keyboards/mkbd65/keymaps/de/README.md new file mode 100644 index 0000000000..f5c29d8e85 --- /dev/null +++ b/keyboards/mkbd65/keymaps/de/README.md @@ -0,0 +1,56 @@ +# The German keymap for mkbd65 rev1 by XenGi + +This is the german layout for the mkbd65 keyboard. You can use it as a reference for other ISO based layouts. + +This is the key matrix (no label means the key from layer 0 will be used): + +``` +0: no mod +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ q ║ w ║ e ║ r ║ t ║ z ║ u ║ i ║ o ║ p ║ ü ║ + ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ Ret║ +║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ö ║ ä ║ # ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ y ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ - ║ ▲ ║ < ║Shft║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ +║Ctrl║ Fn ║Shft║AltG║ Space ║ ß ║ ´ ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +1: mod shift +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ° ║ ! ║ " ║ § ║ $ ║ % ║ & ║ / ║ ( ║ ) ║ = ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ Ü ║ * ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ ║ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ Ö ║ Ä ║ ' ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ ; ║ : ║ _ ║ ║ > ║░░░░║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║░░░░║ ║ ║ ? ║ ` ║ ║ ║ ║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +2: mod altgr +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ║ ¹ ║ ² ║ ³ ║ ║ ║ ║ { ║ [ ║ ] ║ } ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ @ ║ ║ € ║ ║ ║ ║ ║ ║ ║ ║ ║ ~ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ║ ║ | ║ ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║░░░░║ ║ \ ║ ║ ║ ║ ║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +3: mod fn +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Delete ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣Supr║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ^ ║ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ +║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +``` diff --git a/keyboards/mkbd65/keymaps/de/keymap.c b/keyboards/mkbd65/keymaps/de/keymap.c new file mode 100644 index 0000000000..1246f1e8bc --- /dev/null +++ b/keyboards/mkbd65/keymaps/de/keymap.c @@ -0,0 +1,23 @@ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H +#include "keymap_german.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base layer */ + KC_GESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_BSPC, KC_BSPC, + DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UDIA, DE_PLUS, KC_ENT, + DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_ODIA, DE_ADIA, DE_HASH, KC_ENT, + DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, KC_UP, DE_LABK, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_SPC, KC_SPC, DE_SS, DE_ACUT, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL + ), + + [1] = LAYOUT( /* Function layer */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, + _______, _______, _______, _______, KC_TAB, KC_TAB, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ + ) +}; diff --git a/keyboards/mkbd65/keymaps/default b/keyboards/mkbd65/keymaps/en-us-intl similarity index 100% rename from keyboards/mkbd65/keymaps/default rename to keyboards/mkbd65/keymaps/en-us-intl diff --git a/keyboards/mkbd65/keymaps/iso/README.md b/keyboards/mkbd65/keymaps/iso/README.md index d08f8c1b9e..beb5cc2783 100644 --- a/keyboards/mkbd65/keymaps/iso/README.md +++ b/keyboards/mkbd65/keymaps/iso/README.md @@ -1,4 +1,4 @@ -# The iso-like keymap for mkbd65 +# The iso-like keymap for mkbd65 rev0 It's actually just ANSI but with an upright `Enter` key. diff --git a/keyboards/mkbd65/keymaps/iso/config.h b/keyboards/mkbd65/keymaps/iso/config.h deleted file mode 100644 index b0d0727509..0000000000 --- a/keyboards/mkbd65/keymaps/iso/config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright 2022 XenGi - * - * 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 - -// place overrides here diff --git a/keyboards/mkbd65/keymaps/iso/keymap.c b/keyboards/mkbd65/keymaps/iso/keymap.c index eff19b0c4f..2b59ffd0cf 100644 --- a/keyboards/mkbd65/keymaps/iso/keymap.c +++ b/keyboards/mkbd65/keymaps/iso/keymap.c @@ -1,18 +1,5 @@ -/* Copyright 2022 XenGi - * - * 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 . - */ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H @@ -33,13 +20,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, ), }; - -void matrix_init_user(void) { -} - -void matrix_scan_user(void) { -} - -void led_set_user(uint8_t usb_led) { -} - diff --git a/keyboards/mkbd65/mkbd65.c b/keyboards/mkbd65/mkbd65.c deleted file mode 100644 index fae93a8ea5..0000000000 --- a/keyboards/mkbd65/mkbd65.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright 2022 XenGi - * - * 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 "mkbd65.h" - -void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - - matrix_init_user(); -} - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - - led_set_user(usb_led); -} diff --git a/keyboards/mkbd65/rev0/info.json b/keyboards/mkbd65/rev0/info.json new file mode 100644 index 0000000000..cea5523e84 --- /dev/null +++ b/keyboards/mkbd65/rev0/info.json @@ -0,0 +1,147 @@ +{ + "usb": { + "device_version": "0.0.0" + }, + "layouts": { + "LAYOUT_ansi": { + "layout": [ + {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, + {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, + {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, + {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, + {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, + {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, + {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, + {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, + {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, + {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, + {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, + {"x": 11, "y": 0, "w": 2, "label": "Backspace", "matrix": [0, 11]}, + + {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, + {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, + {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, + {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, + {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, + {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, + {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, + {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, + {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, + {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, + {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, + {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, + {"x": 12, "y": 1, "label": "\\", "matrix": [1, 12]}, + + {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, + {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, + {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, + {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, + {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, + {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, + {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, + {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, + {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, + {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, + {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, + {"x": 11, "y": 2, "w": 2, "label": "Enter", "matrix": [2, 11]}, + + {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, + {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, + {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, + {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, + {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, + {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, + {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, + {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, + {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, + {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, + {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, + {"x": 11, "y": 3, "w": 2, "label": "RShift", "matrix": [3, 11]}, + + {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, + {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, + {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, + {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, + {"x": 4, "y": 4, "w": 3, "label": "Space", "matrix": [4, 4]}, + {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, + {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, + {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, + {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, + {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, + {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, + {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, + {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, + {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, + {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, + {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, + {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, + {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, + {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, + {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, + {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, + {"x": 11, "y": 0, "w": 2, "label": "Backspace", "matrix": [0, 11]}, + + {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, + {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, + {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, + {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, + {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, + {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, + {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, + {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, + {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, + {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, + {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, + {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, + + {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, + {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, + {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, + {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, + {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, + {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, + {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, + {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, + {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, + {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, + {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, + {"x": 11, "y": 2, "label": "\\", "matrix": [2, 11]}, + {"x": 12, "y": 2, "h": 2, "label": "Enter", "matrix": [2, 12]}, + + {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, + {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, + {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, + {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, + {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, + {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, + {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, + {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, + {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, + {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, + {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, + {"x": 11, "y": 3, "w": 2, "label": "RShift", "matrix": [3, 11]}, + + {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, + {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, + {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, + {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, + {"x": 4, "y": 4, "w": 3, "label": "Space", "matrix": [4, 4]}, + {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, + {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, + {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, + {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, + {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, + {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} + ] + } + }, + "matrix_pins": { + "cols": ["D4", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5", "F4", "F1", "F0"], + "rows": ["D5", "D3", "D2", "D1", "D0"] + } +} diff --git a/keyboards/mkbd65/rev0/mkbd65.c b/keyboards/mkbd65/rev0/mkbd65.c new file mode 100644 index 0000000000..baca6508d4 --- /dev/null +++ b/keyboards/mkbd65/rev0/mkbd65.c @@ -0,0 +1,4 @@ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "mkbd65.h" diff --git a/keyboards/mkbd65/mkbd65.h b/keyboards/mkbd65/rev0/mkbd65.h similarity index 65% rename from keyboards/mkbd65/mkbd65.h rename to keyboards/mkbd65/rev0/mkbd65.h index 1a53cad69f..aae0d388fa 100644 --- a/keyboards/mkbd65/mkbd65.h +++ b/keyboards/mkbd65/rev0/mkbd65.h @@ -1,24 +1,12 @@ -/* Copyright 2022 XenGi - * - * 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 . - */ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + #ifndef MKBD65_H #define MKBD65_H #include "quantum.h" -/* LAYOUT_ANSI +/* LAYOUT_ansi * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───┤ @@ -38,7 +26,7 @@ * The second converts the arguments into a two-dimensional array which * represents the switch matrix. */ -#define LAYOUT_ANSI( \ +#define LAYOUT_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, \ @@ -53,20 +41,20 @@ { K40, K41, K42, K43, K44, KC_NO, KC_NO, K47, K48, K49, K410, K411, K412 } \ } -/* LAYOUT_ISO - * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ - * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───┤ - * │ │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ - * │ │ │ │ │ │ │ │ │ │ │ │ │ │ - * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┤ - * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ - * ├───┼───┼───┼───┼───┴───┴───┼───┼───┼───┼───┼───┬───┤ - * │ │ │ │ │ 3.0U │ │ │ │ │ │ │ - * └───┴───┴───┴───┴───────────┴───┴───┴───┴───┴───┴───┘ +/* LAYOUT_iso + * ╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══════╗ + * ║ │ │ │ │ │ │ │ │ │ │ │ 2.0U ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ ║ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ 2.0U ║ + * ╟───┼───┼───┼───┼───┴───┴───┼───┼───┼───┼───┼───┬───╢ + * ║ │ │ │ │ 3.0U │ │ │ │ │ │ ║ + * ╚═══╧═══╧═══╧═══╧═══════════╧═══╧═══╧═══╧═══╧═══╧═══╝ */ -#define LAYOUT_ISO( \ +#define LAYOUT_iso( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ diff --git a/keyboards/mkbd65/rev0/rules.mk b/keyboards/mkbd65/rev0/rules.mk new file mode 100644 index 0000000000..94d4ac53b6 --- /dev/null +++ b/keyboards/mkbd65/rev0/rules.mk @@ -0,0 +1,9 @@ +# A list of layouts this keyboard supports. +LAYOUTS = ansi iso + +MCU = atmega32u4 +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +BOOTLOADER = atmel-dfu diff --git a/keyboards/mkbd65/rev1/info.json b/keyboards/mkbd65/rev1/info.json new file mode 100644 index 0000000000..276775db17 --- /dev/null +++ b/keyboards/mkbd65/rev1/info.json @@ -0,0 +1,157 @@ +{ + "usb": { + "device_version": "1.0.0" + }, + "layouts": { + "LAYOUT_en-us-intl": { + "layout": [ + {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, + {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, + {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, + {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, + {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, + {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, + {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, + {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, + {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, + {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, + {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, + {"x": 11, "y": 0, "label": "Backspace", "matrix": [0, 11]}, + {"x": 12, "y": 0, "label": "Backspace", "matrix": [0, 12]}, + + {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, + {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, + {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, + {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, + {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, + {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, + {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, + {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, + {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, + {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, + {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, + {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, + {"x": 12, "y": 1, "label": "\\", "matrix": [1, 12]}, + + {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, + {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, + {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, + {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, + {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, + {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, + {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, + {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, + {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, + {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, + {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, + {"x": 11, "y": 2, "label": "Enter", "matrix": [2, 11]}, + {"x": 12, "y": 2, "label": "Enter", "matrix": [2, 12]}, + + {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, + {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, + {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, + {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, + {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, + {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, + {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, + {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, + {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, + {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, + {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, + {"x": 11, "y": 3, "label": "RShift", "matrix": [3, 11]}, + {"x": 12, "y": 3, "label": "RShift", "matrix": [3, 12]}, + + {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, + {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, + {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, + {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, + {"x": 4, "y": 4, "label": "Space", "matrix": [4, 4]}, + {"x": 5, "y": 4, "label": "Space", "matrix": [4, 5]}, + {"x": 6, "y": 4, "label": "Space", "matrix": [4, 6]}, + {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, + {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, + {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, + {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, + {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, + {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} + ] + }, + "LAYOUT_de": { + "layout": [ + {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, + {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, + {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, + {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, + {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, + {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, + {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, + {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, + {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, + {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, + {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, + {"x": 11, "y": 0, "label": "Backspace", "matrix": [0, 11]}, + {"x": 12, "y": 0, "label": "Backspace", "matrix": [0, 12]}, + + {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, + {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, + {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, + {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, + {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, + {"x": 5, "y": 1, "label": "Z", "matrix": [1, 5]}, + {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, + {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, + {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, + {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, + {"x": 10, "y": 1, "label": "Ü", "matrix": [1, 10]}, + {"x": 11, "y": 1, "label": "+", "matrix": [1, 11]}, + {"x": 12, "y": 1, "label": "Enter", "matrix": [1, 12]}, + + {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, + {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, + {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, + {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, + {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, + {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, + {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, + {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, + {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, + {"x": 9, "y": 2, "label": "Ö", "matrix": [2, 9]}, + {"x": 10, "y": 2, "label": "Ä", "matrix": [2, 10]}, + {"x": 11, "y": 2, "label": "#", "matrix": [2, 11]}, + {"x": 12, "y": 2, "label": "Enter", "matrix": [2, 12]}, + + {"x": 0, "y": 3, "label": "Y", "matrix": [3, 0]}, + {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, + {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, + {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, + {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, + {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, + {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, + {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, + {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, + {"x": 9, "y": 3, "label": "-", "matrix": [3, 9]}, + {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, + {"x": 11, "y": 3, "label": "<", "matrix": [3, 11]}, + {"x": 12, "y": 3, "label": "RShift", "matrix": [3, 12]}, + + {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, + {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, + {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, + {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, + {"x": 4, "y": 4, "label": "Space", "matrix": [4, 4]}, + {"x": 5, "y": 4, "label": "Space", "matrix": [4, 5]}, + {"x": 6, "y": 4, "label": "Space", "matrix": [4, 6]}, + {"x": 7, "y": 4, "label": "ß", "matrix": [4, 7]}, + {"x": 8, "y": 4, "label": "´", "matrix": [4, 8]}, + {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, + {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, + {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, + {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} + ] + } + }, + "matrix_pins": { + "cols": [], + "rows": [] + } +} diff --git a/keyboards/mkbd65/rev1/mkbd65.c b/keyboards/mkbd65/rev1/mkbd65.c new file mode 100644 index 0000000000..baca6508d4 --- /dev/null +++ b/keyboards/mkbd65/rev1/mkbd65.c @@ -0,0 +1,4 @@ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "mkbd65.h" diff --git a/keyboards/mkbd65/rev1/mkbd65.h b/keyboards/mkbd65/rev1/mkbd65.h new file mode 100644 index 0000000000..0e4293dd98 --- /dev/null +++ b/keyboards/mkbd65/rev1/mkbd65.h @@ -0,0 +1,42 @@ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef MKBD65_H +#define MKBD65_H + +#include "quantum.h" + +/* LAYOUT + * ╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╟───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───╢ + * ║ │ │ │ │ │ │ │ │ │ │ │ │ ║ + * ╚═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝ + * This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412 \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412 } \ +} diff --git a/keyboards/mkbd65/rev1/rules.mk b/keyboards/mkbd65/rev1/rules.mk new file mode 100644 index 0000000000..84345ec0aa --- /dev/null +++ b/keyboards/mkbd65/rev1/rules.mk @@ -0,0 +1,3 @@ +# A list of layouts this keyboard supports. +LAYOUTS = en-us-intl de + \ No newline at end of file diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk index a6bdd38bae..8e66f2e4d8 100644 --- a/keyboards/mkbd65/rules.mk +++ b/keyboards/mkbd65/rules.mk @@ -1,80 +1,7 @@ -# MCU name -MCU = atmega32u4 +DEFAULT_FOLDER = rev1 +# Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can +# significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). +LTO_ENABLE = 1 -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Bootloader selection -# Teensy halfkay -# Pro Micro caterina -# Atmel DFU atmel-dfu -# LUFA DFU lufa-dfu -# QMK DFU qmk-dfu -# atmega32a bootloadHID -BOOTLOADER = atmel-dfu - - -# If you don't know the bootloader type, then you can specify the -# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -# OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# change yes to no to disable -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default -RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow -MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE = no # Audio output on port C6 -FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +BOOTMAGIC_ENABLE = 1 +EXTRAKEY_ENABLE = 1 From f57bc9bdca5a63636cc0e1bff5de00a39dcdd850 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sun, 11 Jun 2023 20:22:50 +0200 Subject: [PATCH 015/592] fix layout name --- keyboards/mkbd65/config.h | 4 ++++ keyboards/mkbd65/info.json | 4 ---- keyboards/mkbd65/keymaps/{en-us-intl => en_us_intl} | 0 keyboards/mkbd65/rev0/info.json | 2 ++ keyboards/mkbd65/rev0/rules.mk | 3 +++ keyboards/mkbd65/rev1/info.json | 2 ++ keyboards/mkbd65/rev1/rules.mk | 9 +++++++-- 7 files changed, 18 insertions(+), 6 deletions(-) rename keyboards/mkbd65/keymaps/{en-us-intl => en_us_intl} (100%) diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index 4ac3a7eaf5..c6367adeab 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -11,3 +11,7 @@ //#define NO_ACTION_TAPPING // disable one-shot modifiers //#define NO_ACTION_ONESHOT + +// disable these deprecated features by default +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION \ No newline at end of file diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json index aea164d043..7a2cd0c8f7 100644 --- a/keyboards/mkbd65/info.json +++ b/keyboards/mkbd65/info.json @@ -4,10 +4,6 @@ "url": "https://mkbd65.xengi.de", "maintainer": "XenGi", "author": ["XenGi"], - "usb": { - "vid": "0x1209", - "pid": "0x4803" - }, "debounce": 5, "diode_direction": "ROW2COL", "bootmagic": { diff --git a/keyboards/mkbd65/keymaps/en-us-intl b/keyboards/mkbd65/keymaps/en_us_intl similarity index 100% rename from keyboards/mkbd65/keymaps/en-us-intl rename to keyboards/mkbd65/keymaps/en_us_intl diff --git a/keyboards/mkbd65/rev0/info.json b/keyboards/mkbd65/rev0/info.json index cea5523e84..5d2c940129 100644 --- a/keyboards/mkbd65/rev0/info.json +++ b/keyboards/mkbd65/rev0/info.json @@ -1,5 +1,7 @@ { "usb": { + "vid": "0x1209", + "pid": "0x4803", "device_version": "0.0.0" }, "layouts": { diff --git a/keyboards/mkbd65/rev0/rules.mk b/keyboards/mkbd65/rev0/rules.mk index 94d4ac53b6..2f6c65ff11 100644 --- a/keyboards/mkbd65/rev0/rules.mk +++ b/keyboards/mkbd65/rev0/rules.mk @@ -7,3 +7,6 @@ ARCH = AVR8 F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT BOOTLOADER = atmel-dfu + +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +EXTRAKEY_ENABLE = yes # Audio control and System control \ No newline at end of file diff --git a/keyboards/mkbd65/rev1/info.json b/keyboards/mkbd65/rev1/info.json index 276775db17..9e3dd7105e 100644 --- a/keyboards/mkbd65/rev1/info.json +++ b/keyboards/mkbd65/rev1/info.json @@ -1,5 +1,7 @@ { "usb": { + "vid": "0x1209", + "pid": "0x4803", "device_version": "1.0.0" }, "layouts": { diff --git a/keyboards/mkbd65/rev1/rules.mk b/keyboards/mkbd65/rev1/rules.mk index 84345ec0aa..ef6c3bb862 100644 --- a/keyboards/mkbd65/rev1/rules.mk +++ b/keyboards/mkbd65/rev1/rules.mk @@ -1,3 +1,8 @@ # A list of layouts this keyboard supports. -LAYOUTS = en-us-intl de - \ No newline at end of file +LAYOUTS = en_us_intl de + +MCU = STM32F072 +BOOTLOADER = stm32-dfu + +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +EXTRAKEY_ENABLE = yes # Audio control and System control \ No newline at end of file From 6f63dca06f1d9c4c9e61725bd5479c0252aad6b7 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sun, 11 Jun 2023 20:58:20 +0200 Subject: [PATCH 016/592] rev0 compiles --- keyboards/mkbd65/config.h | 4 -- keyboards/mkbd65/keymaps/ansi/keymap.c | 20 +++---- keyboards/mkbd65/keymaps/de/keymap.c | 4 +- keyboards/mkbd65/keymaps/en_us_intl | 1 - keyboards/mkbd65/keymaps/en_us_intl/README.md | 58 +++++++++++++++++++ keyboards/mkbd65/keymaps/en_us_intl/keymap.c | 22 +++++++ keyboards/mkbd65/keymaps/iso/keymap.c | 12 ++-- keyboards/mkbd65/rev0/rules.mk | 6 -- keyboards/mkbd65/rev1/info.json | 6 +- keyboards/mkbd65/rev1/mkbd65.h | 4 +- keyboards/mkbd65/rev1/rules.mk | 6 -- keyboards/mkbd65/rules.mk | 5 +- 12 files changed, 106 insertions(+), 42 deletions(-) delete mode 120000 keyboards/mkbd65/keymaps/en_us_intl create mode 100644 keyboards/mkbd65/keymaps/en_us_intl/README.md create mode 100644 keyboards/mkbd65/keymaps/en_us_intl/keymap.c diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index c6367adeab..4ac3a7eaf5 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -11,7 +11,3 @@ //#define NO_ACTION_TAPPING // disable one-shot modifiers //#define NO_ACTION_ONESHOT - -// disable these deprecated features by default -#define NO_ACTION_MACRO -#define NO_ACTION_FUNCTION \ No newline at end of file diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index ddda2b83bc..fb5f196098 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -4,19 +4,19 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( /* Base layer */ - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, + [0] = LAYOUT_ansi( /* Base layer */ + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_SPC, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL + 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_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL ), - [1] = LAYOUT( /* Function layer */ - RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, + [1] = LAYOUT_ansi( /* Function layer */ + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, KC_LGUI, - _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, - _______, _______, _______, _______, KC_TAB, KC_TAB, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, + _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ ) }; diff --git a/keyboards/mkbd65/keymaps/de/keymap.c b/keyboards/mkbd65/keymaps/de/keymap.c index 1246f1e8bc..6ba90e876f 100644 --- a/keyboards/mkbd65/keymaps/de/keymap.c +++ b/keyboards/mkbd65/keymaps/de/keymap.c @@ -6,7 +6,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base layer */ - KC_GESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_BSPC, KC_BSPC, + QK_GESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, KC_BSPC, KC_BSPC, DE_Q, DE_W, DE_E, DE_R, DE_T, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UDIA, DE_PLUS, KC_ENT, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, DE_ODIA, DE_ADIA, DE_HASH, KC_ENT, DE_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, DE_COMM, DE_DOT, DE_MINS, KC_UP, DE_LABK, KC_RSFT, @@ -14,7 +14,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( /* Function layer */ - RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, diff --git a/keyboards/mkbd65/keymaps/en_us_intl b/keyboards/mkbd65/keymaps/en_us_intl deleted file mode 120000 index 44ad4f4f7e..0000000000 --- a/keyboards/mkbd65/keymaps/en_us_intl +++ /dev/null @@ -1 +0,0 @@ -ansi \ No newline at end of file diff --git a/keyboards/mkbd65/keymaps/en_us_intl/README.md b/keyboards/mkbd65/keymaps/en_us_intl/README.md new file mode 100644 index 0000000000..96e8f7bb14 --- /dev/null +++ b/keyboards/mkbd65/keymaps/en_us_intl/README.md @@ -0,0 +1,58 @@ +# The English US International keymap for mkbd65 rev0 by XenGi + +This is the default layout for the mkbd65 keyboard. You can use it as a reference for other layouts. + +It is based on the "English (intl., with AltGr dead keys)" layout. + +This is the key matrix (no label means the key from layer 0 will be used): + +``` +0: no mod +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ 0 ║Backspace║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ q ║ w ║ e ║ r ║ t ║ y ║ u ║ i ║ o ║ p ║ [ ║ ] ║ \ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ a ║ s ║ d ║ f ║ g ║ h ║ j ║ k ║ l ║ ; ║ ' ║ Return ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ z ║ x ║ c ║ v ║ b ║ n ║ m ║ , ║ . ║ / ║ ▲ ║ Shift ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║Ctrl║ Fn ║Shft║AltG║ Space ║ - ║ = ║ ◀ ║ ▼ ║ ▶ ║Ctrl║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +1: mod shift +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ~ ║ ! ║ @ ║ # ║ $ ║ % ║ ^ ║ & ║ * ║ ( ║ ) ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ Q ║ W ║ E ║ R ║ T ║ Y ║ U ║ I ║ O ║ P ║ { ║ } ║ | ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ A ║ S ║ D ║ F ║ G ║ H ║ J ║ K ║ L ║ : ║ " ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ Z ║ X ║ C ║ V ║ B ║ N ║ M ║ < ║ > ║ ? ║ ║░░░░░░░░░║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║░░░░║ ║ ║ _ ║ + ║ ║ ║ ║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +2: mod altgr +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ ║ ¹ ║ ² ║ ³ ║ ║ € ║ ║ ║ ║ ║ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ä ║ ║ ║ ║ ║ ü ║ ║ ║ ║ ö ║ « ║ » ║ ¬ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║ ║░░░░║ ║ ║ ║ ║ ║ ║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +3: mod fn +╔════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦════╦═════════╗ +║ Esc║ F1 ║ F2 ║ F3 ║ F4 ║ F5 ║ F6 ║ F7 ║ F8 ║ F9 ║ F10║ Delete ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ +╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ +╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ +║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ +╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ +``` diff --git a/keyboards/mkbd65/keymaps/en_us_intl/keymap.c b/keyboards/mkbd65/keymaps/en_us_intl/keymap.c new file mode 100644 index 0000000000..96d7855ff8 --- /dev/null +++ b/keyboards/mkbd65/keymaps/en_us_intl/keymap.c @@ -0,0 +1,22 @@ +// Copyright 2023 XenGi (@XenGi) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( /* Base layer */ + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, + 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, KC_RSFT, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_SPC, KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL + ), + + [1] = LAYOUT_all( /* Function layer */ + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, KC_APP, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_LGUI, KC_LGUI, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, _______, + _______, _______, _______, _______, KC_TAB, KC_TAB, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ + ) +}; diff --git a/keyboards/mkbd65/keymaps/iso/keymap.c b/keyboards/mkbd65/keymaps/iso/keymap.c index 2b59ffd0cf..a7dd99463e 100644 --- a/keyboards/mkbd65/keymaps/iso/keymap.c +++ b/keyboards/mkbd65/keymaps/iso/keymap.c @@ -4,19 +4,19 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_ISO( /* Base layer */ - KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + [0] = LAYOUT_iso( /* Base layer */ + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 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_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, - KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL, + KC_LCTL, MO(1), KC_LSFT, OSM(MOD_RALT), KC_SPC, KC_MINS, KC_EQL, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCTL ), - [1] = LAYOUT_ISO( /* Function layer */ - RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + [1] = LAYOUT_iso( /* Function layer */ + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_GRV, KC_APP, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PGUP, _______, - _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, + _______, _______, _______, _______, KC_TAB, _______, _______, KC_HOME, KC_PGDN, KC_END, _______ ), }; diff --git a/keyboards/mkbd65/rev0/rules.mk b/keyboards/mkbd65/rev0/rules.mk index 2f6c65ff11..2d23977af0 100644 --- a/keyboards/mkbd65/rev0/rules.mk +++ b/keyboards/mkbd65/rev0/rules.mk @@ -1,12 +1,6 @@ -# A list of layouts this keyboard supports. -LAYOUTS = ansi iso - MCU = atmega32u4 F_CPU = 16000000 ARCH = AVR8 F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT BOOTLOADER = atmel-dfu - -BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite -EXTRAKEY_ENABLE = yes # Audio control and System control \ No newline at end of file diff --git a/keyboards/mkbd65/rev1/info.json b/keyboards/mkbd65/rev1/info.json index 9e3dd7105e..42ed48f137 100644 --- a/keyboards/mkbd65/rev1/info.json +++ b/keyboards/mkbd65/rev1/info.json @@ -5,7 +5,7 @@ "device_version": "1.0.0" }, "layouts": { - "LAYOUT_en-us-intl": { + "LAYOUT_en_us_intl": { "layout": [ {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, @@ -153,7 +153,7 @@ } }, "matrix_pins": { - "cols": [], - "rows": [] + "cols": ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "B2", "B10", "B11"], + "rows": ["B12", "B13", "B14", "B15", "A8"] } } diff --git a/keyboards/mkbd65/rev1/mkbd65.h b/keyboards/mkbd65/rev1/mkbd65.h index 0e4293dd98..759166bbcf 100644 --- a/keyboards/mkbd65/rev1/mkbd65.h +++ b/keyboards/mkbd65/rev1/mkbd65.h @@ -26,7 +26,7 @@ * The second converts the arguments into a two-dimensional array which * represents the switch matrix. */ -#define LAYOUT( \ +#define LAYOUT_all( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ @@ -40,3 +40,5 @@ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312 }, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412 } \ } + +#endif diff --git a/keyboards/mkbd65/rev1/rules.mk b/keyboards/mkbd65/rev1/rules.mk index ef6c3bb862..e5116166cc 100644 --- a/keyboards/mkbd65/rev1/rules.mk +++ b/keyboards/mkbd65/rev1/rules.mk @@ -1,8 +1,2 @@ -# A list of layouts this keyboard supports. -LAYOUTS = en_us_intl de - MCU = STM32F072 BOOTLOADER = stm32-dfu - -BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite -EXTRAKEY_ENABLE = yes # Audio control and System control \ No newline at end of file diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk index 8e66f2e4d8..cc4a04ee68 100644 --- a/keyboards/mkbd65/rules.mk +++ b/keyboards/mkbd65/rules.mk @@ -1,7 +1,6 @@ DEFAULT_FOLDER = rev1 # Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can # significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). -LTO_ENABLE = 1 +LTO_ENABLE = yes -BOOTMAGIC_ENABLE = 1 -EXTRAKEY_ENABLE = 1 +EXTRAKEY_ENABLE = yes # Audio control and System control From 7d8f193988495deb0e12ad79d5104d30c0724bf9 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 24 Nov 2024 20:32:30 +1100 Subject: [PATCH 017/592] Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. (#23451) --- builddefs/build_keyboard.mk | 5 ++- data/schemas/keymap.jsonschema | 7 +-- keyboards/handwired/onekey/info.json | 3 -- keyboards/handwired/onekey/kb2040/config.h | 5 +-- .../handwired/onekey/keymaps/adc/keymap.json | 10 +++++ .../handwired/onekey/keymaps/adc/rules.mk | 2 - .../handwired/onekey/keymaps/apa102/config.h | 14 ------ .../onekey/keymaps/apa102/keymap.json | 29 +++++++++++++ .../handwired/onekey/keymaps/apa102/rules.mk | 2 - .../onekey/keymaps/backlight/config.h | 3 -- .../onekey/keymaps/backlight/keymap.json | 14 ++++++ .../onekey/keymaps/backlight/rules.mk | 2 - .../onekey/keymaps/console/keymap.json | 8 ++++ .../handwired/onekey/keymaps/console/rules.mk | 2 - .../onekey/keymaps/default/keymap.json | 7 +++ keyboards/handwired/onekey/rp2040/config.h | 3 -- .../pterodactyl/keymaps/default/keymap.c | 2 +- .../pterodactyl/keymaps/default/keymap.json | 43 ------------------- lib/python/qmk/commands.py | 2 +- lib/python/qmk/keymap.py | 29 +++++++------ lib/python/qmk/tests/test_cli_commands.py | 24 ++++------- lib/python/qmk/tests/test_qmk_keymap.py | 9 ++-- 22 files changed, 105 insertions(+), 120 deletions(-) create mode 100644 keyboards/handwired/onekey/keymaps/adc/keymap.json delete mode 100644 keyboards/handwired/onekey/keymaps/apa102/config.h create mode 100644 keyboards/handwired/onekey/keymaps/apa102/keymap.json delete mode 100644 keyboards/handwired/onekey/keymaps/apa102/rules.mk delete mode 100644 keyboards/handwired/onekey/keymaps/backlight/config.h create mode 100644 keyboards/handwired/onekey/keymaps/backlight/keymap.json delete mode 100644 keyboards/handwired/onekey/keymaps/backlight/rules.mk create mode 100644 keyboards/handwired/onekey/keymaps/console/keymap.json delete mode 100644 keyboards/handwired/onekey/keymaps/console/rules.mk create mode 100644 keyboards/handwired/onekey/keymaps/default/keymap.json delete mode 100644 keyboards/handwired/pterodactyl/keymaps/default/keymap.json diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index ccd7e50b05..afad67a76d 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -186,7 +186,10 @@ endif # Have we found a keymap.json? ifneq ("$(wildcard $(KEYMAP_JSON))", "") ifneq ("$(wildcard $(KEYMAP_C))", "") - $(call WARNING_MESSAGE,Keymap is specified as both keymap.json and keymap.c -- keymap.json file wins.) + # Allow a separately-found keymap.c next to keymap.json -- the keymap.c + # generator will include the other keymap.c in the process, if supplied. + OTHER_KEYMAP_C := $(KEYMAP_C) + OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\" endif KEYMAP_PATH := $(KEYMAP_JSON_PATH) diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema index 7233e896e9..e967e45c53 100644 --- a/data/schemas/keymap.jsonschema +++ b/data/schemas/keymap.jsonschema @@ -72,10 +72,5 @@ "notes": { "type": "string" } - }, - "required": [ - "keyboard", - "layout", - "layers" - ] + } } diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json index c952758265..5cf7c600ee 100644 --- a/keyboards/handwired/onekey/info.json +++ b/keyboards/handwired/onekey/info.json @@ -7,9 +7,6 @@ "pid": "0x6465", "device_version": "0.0.1" }, - "tapping": { - "term": 500 - }, "diode_direction": "COL2ROW", "features": { "bootmagic": false, diff --git a/keyboards/handwired/onekey/kb2040/config.h b/keyboards/handwired/onekey/kb2040/config.h index e0bf180056..e9c4eef273 100644 --- a/keyboards/handwired/onekey/kb2040/config.h +++ b/keyboards/handwired/onekey/kb2040/config.h @@ -3,9 +3,6 @@ #pragma once - -#define DEBUG_MATRIX_SCAN_RATE - #define QMK_WAITING_TEST_BUSY_PIN GP8 #define QMK_WAITING_TEST_YIELD_PIN GP9 @@ -18,4 +15,4 @@ #define I2C_DRIVER I2CD0 #define I2C1_SDA_PIN GP12 #define I2C1_SCL_PIN GP13 - + diff --git a/keyboards/handwired/onekey/keymaps/adc/keymap.json b/keyboards/handwired/onekey/keymaps/adc/keymap.json new file mode 100644 index 0000000000..e051d1a30b --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/adc/keymap.json @@ -0,0 +1,10 @@ +{ + "config": { + "features": { + "console": true + }, + "tapping": { + "term": 500 + } + } +} diff --git a/keyboards/handwired/onekey/keymaps/adc/rules.mk b/keyboards/handwired/onekey/keymaps/adc/rules.mk index 8b36baccb0..cc58820278 100644 --- a/keyboards/handwired/onekey/keymaps/adc/rules.mk +++ b/keyboards/handwired/onekey/keymaps/adc/rules.mk @@ -1,3 +1 @@ -CONSOLE_ENABLE = yes - ANALOG_DRIVER_REQUIRED = yes diff --git a/keyboards/handwired/onekey/keymaps/apa102/config.h b/keyboards/handwired/onekey/keymaps/apa102/config.h deleted file mode 100644 index bb618d77fb..0000000000 --- a/keyboards/handwired/onekey/keymaps/apa102/config.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#define RGBLIGHT_LED_COUNT 40 -#define APA102_DEFAULT_BRIGHTNESS 5 -#define RGBLIGHT_EFFECT_BREATHING -#define RGBLIGHT_EFFECT_RAINBOW_MOOD -#define RGBLIGHT_EFFECT_RAINBOW_SWIRL -#define RGBLIGHT_EFFECT_SNAKE -#define RGBLIGHT_EFFECT_KNIGHT -#define RGBLIGHT_EFFECT_CHRISTMAS -#define RGBLIGHT_EFFECT_STATIC_GRADIENT -#define RGBLIGHT_EFFECT_RGB_TEST -#define RGBLIGHT_EFFECT_ALTERNATING -#define RGBLIGHT_EFFECT_TWINKLE diff --git a/keyboards/handwired/onekey/keymaps/apa102/keymap.json b/keyboards/handwired/onekey/keymaps/apa102/keymap.json new file mode 100644 index 0000000000..917d39eb33 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/apa102/keymap.json @@ -0,0 +1,29 @@ +{ + "config": { + "features": { + "rgblight": true + }, + "tapping": { + "term": 500 + }, + "rgblight": { + "driver": "apa102", + "led_count": 40, + "default": { + "val": 5 + }, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "knight": true, + "christmas": true, + "static_gradient": true, + "rgb_test": true, + "alternating": true, + "twinkle": true + } + } + } +} diff --git a/keyboards/handwired/onekey/keymaps/apa102/rules.mk b/keyboards/handwired/onekey/keymaps/apa102/rules.mk deleted file mode 100644 index 5f15fa9e70..0000000000 --- a/keyboards/handwired/onekey/keymaps/apa102/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -RGBLIGHT_ENABLE = yes -RGBLIGHT_DRIVER = apa102 diff --git a/keyboards/handwired/onekey/keymaps/backlight/config.h b/keyboards/handwired/onekey/keymaps/backlight/config.h deleted file mode 100644 index af01528b43..0000000000 --- a/keyboards/handwired/onekey/keymaps/backlight/config.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define BACKLIGHT_BREATHING diff --git a/keyboards/handwired/onekey/keymaps/backlight/keymap.json b/keyboards/handwired/onekey/keymaps/backlight/keymap.json new file mode 100644 index 0000000000..e8895520cd --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/backlight/keymap.json @@ -0,0 +1,14 @@ +{ + "config": { + "features": { + "backlight": true, + "tap_dance": true + }, + "tapping": { + "term": 500 + }, + "backlight": { + "breathing": true + } + } +} diff --git a/keyboards/handwired/onekey/keymaps/backlight/rules.mk b/keyboards/handwired/onekey/keymaps/backlight/rules.mk deleted file mode 100644 index 176e099770..0000000000 --- a/keyboards/handwired/onekey/keymaps/backlight/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -BACKLIGHT_ENABLE = yes -TAP_DANCE_ENABLE = yes diff --git a/keyboards/handwired/onekey/keymaps/console/keymap.json b/keyboards/handwired/onekey/keymaps/console/keymap.json new file mode 100644 index 0000000000..f451f7df04 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/console/keymap.json @@ -0,0 +1,8 @@ +{ + "config": { + "features": { + "console": true, + "debug_matrix_scan_rate": true + } + } +} diff --git a/keyboards/handwired/onekey/keymaps/console/rules.mk b/keyboards/handwired/onekey/keymaps/console/rules.mk deleted file mode 100644 index 7c83606d2d..0000000000 --- a/keyboards/handwired/onekey/keymaps/console/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -CONSOLE_ENABLE = yes -DEBUG_MATRIX_SCAN_RATE_ENABLE = yes diff --git a/keyboards/handwired/onekey/keymaps/default/keymap.json b/keyboards/handwired/onekey/keymaps/default/keymap.json new file mode 100644 index 0000000000..5cd219693a --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/default/keymap.json @@ -0,0 +1,7 @@ +{ + "config": { + "tapping": { + "term": 500 + } + } +} diff --git a/keyboards/handwired/onekey/rp2040/config.h b/keyboards/handwired/onekey/rp2040/config.h index 0563ebfa5f..0030e97b0f 100644 --- a/keyboards/handwired/onekey/rp2040/config.h +++ b/keyboards/handwired/onekey/rp2040/config.h @@ -3,9 +3,6 @@ #pragma once - -#define DEBUG_MATRIX_SCAN_RATE - #define QMK_WAITING_TEST_BUSY_PIN GP8 #define QMK_WAITING_TEST_YIELD_PIN GP9 diff --git a/keyboards/handwired/pterodactyl/keymaps/default/keymap.c b/keyboards/handwired/pterodactyl/keymaps/default/keymap.c index 61d650c76b..c53f6841ce 100644 --- a/keyboards/handwired/pterodactyl/keymaps/default/keymap.c +++ b/keyboards/handwired/pterodactyl/keymaps/default/keymap.c @@ -54,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------| |------+------+------+------+------+------| * | | % | ^ | [ | ] | ~ | | & | 1 | 2 | 3 | \ | | * |------+------+------+------+------+------' `------+------+------+------+------+------| - * |QK_BOOT | | | | | | | . | 0 | = | | + * |BtLdr | | | | | | | . | 0 | = | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | | | diff --git a/keyboards/handwired/pterodactyl/keymaps/default/keymap.json b/keyboards/handwired/pterodactyl/keymaps/default/keymap.json deleted file mode 100644 index 181b32b8c3..0000000000 --- a/keyboards/handwired/pterodactyl/keymaps/default/keymap.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "version": 1, - "notes": "", - "author": "Marcus Young", - "keyboard": "handwired/pterodactyl", - "keymap": "default", - "layout": "LAYOUT", - "layers": [ - [ - "KC_EQL", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_MINS", - "KC_DEL", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSLS", - "KC_BSPC", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "LT(2,KC_SCLN)", "LGUI_T(KC_QUOT)", - "KC_LSFT", "LCTL_T(KC_Z)", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "LCTL_T(KC_SLSH)", "KC_RSFT", - "LT(1,KC_GRV)", "KC_QUOT", "LALT(KC_LSFT)", "KC_LEFT", "KC_RGHT", "KC_UP", "KC_DOWN", "KC_LBRC", "KC_RBRC", "TT(1)", - - "LALT_T(KC_APP)", "KC_LGUI", "KC_RALT", "LCTL_T(KC_ESC)", - "KC_HOME", "KC_PGUP", - "KC_SPC", "KC_BSPC", "KC_END", "KC_PGDN", "KC_TAB", "KC_ENT" - ], - [ - "KC_TRNS", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", - "KC_TRNS", "KC_EXLM", "KC_AT", "KC_LCBR", "KC_RCBR", "KC_PIPE", "KC_UP", "KC_7", "KC_8", "KC_9", "KC_ASTR", "KC_F12", - "KC_TRNS", "KC_HASH", "KC_DLR", "KC_LPRN", "KC_RPRN", "KC_GRV", "KC_DOWN", "KC_4", "KC_5", "KC_6", "KC_PLUS", "KC_TRNS", - "KC_TRNS", "KC_PERC", "KC_CIRC", "KC_LBRC", "KC_RBRC", "KC_TILD", "KC_AMPR", "KC_1", "KC_2", "KC_3", "KC_BSLS", "KC_TRNS", - "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_DOT", "KC_0", "KC_EQL", "KC_TRNS", - - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" - ], - [ - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MS_U", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_MS_L", "KC_MS_D", "KC_MS_R", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPRV", "KC_MNXT", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_BTN1", "KC_BTN2", "KC_VOLU", "KC_VOLD", "KC_MUTE", "KC_TRNS", "KC_TRNS", - - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_WBAK" - ] - ] -} diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 97d9c5032c..a05b3641b5 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -55,7 +55,7 @@ def parse_configurator_json(configurator_file): cli.log.error(f'Invalid JSON keymap: {configurator_file} : {e.message}') maybe_exit(1) - keyboard = user_keymap['keyboard'] + keyboard = user_keymap.get('keyboard', None) aliases = keyboard_alias_definitions() while keyboard in aliases: diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 97c358788a..9dd043c4a8 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -29,38 +29,40 @@ __INCLUDES__ * This file was generated by qmk json2c. You may or may not want to * edit it directly. */ -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + __KEYMAP_GOES_HERE__ -}; - -#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { __ENCODER_MAP_GOES_HERE__ -}; -#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) - __MACRO_OUTPUT_GOES_HERE__ + +#ifdef OTHER_KEYMAP_C +# include OTHER_KEYMAP_C +#endif // OTHER_KEYMAP_C """ def _generate_keymap_table(keymap_json): - lines = [] + lines = ['const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {'] for layer_num, layer in enumerate(keymap_json['layers']): if layer_num != 0: lines[-1] = lines[-1] + ',' layer = map(_strip_any, layer) layer_keys = ', '.join(layer) lines.append(' [%s] = %s(%s)' % (layer_num, keymap_json['layout'], layer_keys)) + lines.append('};') return lines def _generate_encodermap_table(keymap_json): - lines = [] + lines = [ + '#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)', + 'const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {', + ] for layer_num, layer in enumerate(keymap_json['encoders']): if layer_num != 0: lines[-1] = lines[-1] + ',' encoder_keycode_txt = ', '.join([f'ENCODER_CCW_CW({_strip_any(e["ccw"])}, {_strip_any(e["cw"])})' for e in layer]) lines.append(' [%s] = {%s}' % (layer_num, encoder_keycode_txt)) + lines.extend(['};', '#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE)']) return lines @@ -271,8 +273,11 @@ def generate_c(keymap_json): A sequence of strings containing macros to implement for this keyboard. """ new_keymap = DEFAULT_KEYMAP_C - layer_txt = _generate_keymap_table(keymap_json) - keymap = '\n'.join(layer_txt) + + keymap = '' + if 'layers' in keymap_json and keymap_json['layers'] is not None: + layer_txt = _generate_keymap_table(keymap_json) + keymap = '\n'.join(layer_txt) new_keymap = new_keymap.replace('__KEYMAP_GOES_HERE__', keymap) encodermap = '' diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index b10fd8d19d..dd659fe0f2 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -152,17 +152,16 @@ def test_json2c(): * This file was generated by qmk json2c. You may or may not want to * edit it directly. */ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_1x1(KC_A) }; -#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - -}; -#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +#ifdef OTHER_KEYMAP_C +# include OTHER_KEYMAP_C +#endif // OTHER_KEYMAP_C """ @@ -190,28 +189,21 @@ def test_json2c_stdin(): * This file was generated by qmk json2c. You may or may not want to * edit it directly. */ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_1x1(KC_A) }; -#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - -}; -#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +#ifdef OTHER_KEYMAP_C +# include OTHER_KEYMAP_C +#endif // OTHER_KEYMAP_C """ -def test_json2c_wrong_json(): - result = check_subcommand('json2c', 'keyboards/handwired/pytest/info.json') - check_returncode(result, [1]) - assert 'Invalid JSON keymap' in result.stdout - - def test_json2c_no_json(): result = check_subcommand('json2c', 'keyboards/handwired/pytest/basic/keymaps/default/keymap.c') check_returncode(result, [1]) diff --git a/lib/python/qmk/tests/test_qmk_keymap.py b/lib/python/qmk/tests/test_qmk_keymap.py index 7482848eff..80cc679b00 100644 --- a/lib/python/qmk/tests/test_qmk_keymap.py +++ b/lib/python/qmk/tests/test_qmk_keymap.py @@ -20,17 +20,16 @@ def test_generate_c_pytest_basic(): * This file was generated by qmk json2c. You may or may not want to * edit it directly. */ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT(KC_A) }; -#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - -}; -#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +#ifdef OTHER_KEYMAP_C +# include OTHER_KEYMAP_C +#endif // OTHER_KEYMAP_C """ From f3bae5680843dae8a59cf90b5ac6535da632f42c Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 24 Nov 2024 23:03:08 +1100 Subject: [PATCH 018/592] Update keycodes for keyboards with RGB Matrix (#24484) --- .../1upocarina/keymaps/default/keymap.c | 2 +- .../1upslider8/keymaps/default/keymap.c | 4 ++-- .../1upsuper16v3/keymaps/default/keymap.c | 6 ++--- .../pi40/keymaps/default/keymap.c | 6 ++--- .../pi50/keymaps/default/keymap.c | 4 ++-- .../pi60/keymaps/default/keymap.c | 4 ++-- .../pi60_hse/keymaps/default/keymap.c | 4 ++-- .../super16/keymaps/default/keymap.c | 8 +++---- .../super16v2/keymaps/default/keymap.c | 6 ++--- .../sweet16v2/keymaps/default/keymap.c | 8 +++---- .../perk60_iso/keymaps/default/keymap.c | 2 +- .../abko/ak84bt/keymaps/default/keymap.c | 6 ++--- .../apollo/87h/delta/keymaps/default/keymap.c | 4 ++-- .../apollo/87h/gamma/keymaps/default/keymap.c | 4 ++-- .../apollo/87htsc/keymaps/default/keymap.c | 4 ++-- .../apollo/88htsc/keymaps/default/keymap.c | 4 ++-- .../adm42/rev4/keymaps/default/keymap.json | 6 ++--- .../akemipad/keymaps/default/keymap.c | 6 ++--- .../akemipad/keymaps/default_numpad/keymap.c | 6 ++--- keyboards/akko/5108/keymaps/default/keymap.c | 20 ++++++++-------- keyboards/akko/acr87/keymaps/default/keymap.c | 20 ++++++++-------- keyboards/akko/top40/keymaps/default/keymap.c | 6 ++--- .../alpaca/wfeclipse/keymaps/default/keymap.c | 4 ++-- .../wings/keymaps/default/keymap.c | 4 ++-- keyboards/ashwing66/keymaps/default/keymap.c | 6 ++--- .../atlantis/ak81_ve/keymaps/default/keymap.c | 12 +++++----- .../atlantis/ps17/keymaps/default/keymap.c | 8 +++---- .../charybdis/3x5/keymaps/default/keymap.c | 2 +- .../charybdis/3x6/keymaps/default/keymap.c | 2 +- .../charybdis/4x6/keymaps/default/keymap.c | 6 ++--- .../dilemma/4x6_4/keymaps/default/keymap.c | 6 ++--- .../bastardkb/scylla/keymaps/default/keymap.c | 2 +- .../skeletyl/keymaps/default/keymap.c | 4 ++-- .../tbkmini/keymaps/default/keymap.c | 4 ++-- .../binepad/bnk9/keymaps/default/keymap.c | 10 ++++---- .../ac980mini/keymaps/default/keymap.c | 8 +++---- .../beiwagon/keymaps/default/keymap.c | 4 ++-- .../equals/60/keymaps/default/keymap.c | 2 +- .../equals/avr/keymaps/default/keymap.c | 2 +- .../boardsource/lulu/keymaps/default/keymap.c | 6 ++--- .../sessanta/keymaps/default/keymap.json | 4 ++-- .../technik_o/keymaps/default/keymap.c | 4 ++-- .../technik_s/keymaps/default/keymap.c | 4 ++-- .../the_q/keymaps/default/keymap.json | 6 ++--- .../unicorne/keymaps/default/keymap.json | 4 ++-- .../2019/keymaps/default/keymap.c | 6 ++--- .../bubble75/hotswap/keymaps/default/keymap.c | 10 ++++---- .../canary60rgb/keymaps/default/keymap.c | 4 ++-- .../cu80/v2/ansi/keymaps/default/keymap.c | 8 +++---- .../cu80/v2/iso/keymaps/default/keymap.c | 6 ++--- .../leeloo/keymaps/default/keymap.c | 4 ++-- .../city42/keymaps/default/keymap.c | 4 ++-- .../mini36/keymaps/default/keymap.c | 4 ++-- .../mini42/keymaps/default/keymap.c | 4 ++-- keyboards/crkbd/keymaps/default/keymap.c | 14 +++++------ .../cxt_studio/keymaps/default/keymap.json | 2 +- .../keymaps/default/keymap.c | 16 ++++++------- .../keymaps/default/keymap.c | 16 ++++++------- .../darmoshark/k3/keymaps/default/keymap.c | 12 +++++----- .../dasky/reverb/keymaps/default/keymap.json | 4 ++-- .../deemen17/de80/keymaps/default/keymap.c | 10 ++++---- .../duckypad/keymaps/default/keymap.c | 8 +++---- keyboards/deng/djam/keymaps/default/keymap.c | 4 ++-- .../deng/thirty/keymaps/default/keymap.c | 4 ++-- keyboards/doio/kb04/keymaps/default/keymap.c | 2 +- keyboards/doio/kb09/keymaps/default/keymap.c | 6 ++--- keyboards/doio/kb12/keymaps/default/keymap.c | 2 +- keyboards/doio/kb16/keymaps/default/keymap.c | 8 +++---- keyboards/doio/kb30/keymaps/default/keymap.c | 8 +++---- keyboards/doio/kb38/keymaps/default/keymap.c | 4 ++-- keyboards/doio/kb3x/keymaps/default/keymap.c | 2 +- keyboards/doro67/rgb/keymaps/default/keymap.c | 4 ++-- .../dotmod/dymium65/keymaps/default/keymap.c | 14 +++++------ keyboards/dp3000/keymaps/default/keymap.c | 10 ++++---- keyboards/dp60/keymaps/default/keymap.c | 2 +- .../dosa40rgb/keymaps/default/keymap.c | 4 ++-- .../ducky/one2mini/keymaps/ansi/keymap.c | 8 +++---- .../ducky/one2mini/keymaps/default/keymap.c | 8 +++---- keyboards/ducky/one2mini/keymaps/iso/keymap.c | 8 +++---- .../ducky/one2sf/keymaps/default/keymap.c | 4 ++-- .../one2sf/keymaps/default_ansi/keymap.c | 4 ++-- .../ducky/one2sf/keymaps/default_iso/keymap.c | 4 ++-- .../dumbpad/v3x/keymaps/default/keymap.c | 8 +++---- .../dgk6x/galaxy/keymaps/default/keymap.json | 10 ++++---- .../hades_ansi/keymaps/default/keymap.json | 10 ++++---- .../hades_iso/keymaps/default/keymap.json | 10 ++++---- .../dgk6x/venus/keymaps/default/keymap.json | 10 ++++---- .../dztech/dz60rgb/keymaps/default/keymap.c | 4 ++-- .../dz60rgb_ansi/keymaps/default/keymap.c | 4 ++-- .../dz60rgb_wkl/keymaps/default/keymap.c | 4 ++-- .../dztech/dz64rgb/keymaps/default/keymap.c | 4 ++-- .../dztech/dz65rgb/keymaps/default/keymap.c | 4 ++-- .../dztech/tofu/ii/keymaps/default/keymap.c | 4 ++-- .../dztech/tofu/jr/keymaps/default/keymap.c | 4 ++-- keyboards/eek/keymaps/ledtest/keymap.c | 10 ++++---- .../eggsworks/egg58/keymaps/default/keymap.c | 4 ++-- keyboards/ein_60/keymaps/default/keymap.c | 4 ++-- .../delirium/rgb/keymaps/default/keymap.c | 10 ++++---- .../linx3/fave65s/keymaps/default/keymap.c | 2 +- .../sirind/brick65/keymaps/default/keymap.c | 4 ++-- .../era/sirind/tomak/keymaps/default/keymap.c | 4 ++-- .../tomak/keymaps/default_ansi/keymap.c | 4 ++-- .../keymaps/default_ansi_split_bs/keymap.c | 4 ++-- .../default_ansi_split_rshift/keymap.c | 4 ++-- .../default_ansi_split_rshift_bs/keymap.c | 4 ++-- .../evyd13/atom47/keymaps/default/keymap.c | 4 ++-- .../fancyalice66/keymaps/default/keymap.c | 8 +++---- keyboards/ferris/keymaps/default/keymap.json | 4 ++-- .../horizon_z/keymaps/default/keymap.c | 2 +- .../walnut/keymaps/default/keymap.c | 8 +++---- .../walnut/keymaps/default_ansi/keymap.c | 8 +++---- .../walnut/keymaps/default_iso/keymap.c | 8 +++---- .../fs_streampad/keymaps/default/keymap.c | 2 +- .../tester/keymaps/default/keymap.c | 2 +- keyboards/gh60/satan/keymaps/isoHHKB/keymap.c | 2 +- .../gk6/keymaps/12x5/keymap.c | 2 +- .../gk6/keymaps/1x2u/keymap.c | 2 +- .../gk6/keymaps/default/keymap.c | 2 +- .../gpad8_2r/keymaps/default/keymap.c | 4 ++-- .../greatpad/keymaps/default/keymap.c | 4 ++-- .../gmmk2/p65/ansi/keymaps/default/keymap.c | 4 ++-- .../gmmk2/p65/iso/keymaps/default/keymap.c | 4 ++-- .../gmmk2/p96/ansi/keymaps/default/keymap.c | 4 ++-- .../gmmk2/p96/iso/keymaps/default/keymap.c | 4 ++-- .../gmmk/numpad/keymaps/default/keymap.c | 8 +++---- .../pro/rev1/ansi/keymaps/default/keymap.c | 10 ++++---- .../pro/rev1/iso/keymaps/default/keymap.c | 10 ++++---- .../pro/rev2/ansi/keymaps/default/keymap.c | 12 +++++----- .../pro/rev2/iso/keymaps/default/keymap.c | 10 ++++---- .../keymaps/jmdaly_hhkb_split_space/keymap.c | 2 +- .../colorlice/keymaps/default/keymap.c | 6 ++--- .../dygma/raise/keymaps/ansi/keymap.c | 2 +- .../dygma/raise/keymaps/default/keymap.c | 2 +- .../dygma/raise/keymaps/iso/keymap.c | 2 +- .../hnah108/keymaps/default/keymap.c | 2 +- .../handwired/hnah40rgb/keymaps/ansi/keymap.c | 4 ++-- .../hnah40rgb/keymaps/default/keymap.c | 4 ++-- .../handwired/p65rgb/keymaps/default/keymap.c | 4 ++-- .../helix/rev2/keymaps/led_test/keymap.c | 6 ++--- .../hfdkb/ac001/keymaps/default/keymap.c | 2 +- .../keymaps/default/led/custom_gradient.c | 2 +- .../hs60/v1/ansi/keymaps/default/keymap.c | 4 ++-- .../hs60/v1/iso/keymaps/default/keymap.c | 4 ++-- .../idobao/id42/keymaps/default/keymap.c | 6 ++--- .../idobao/id61/keymaps/default/keymap.c | 4 ++-- .../idobao/id63/keymaps/default/keymap.c | 4 ++-- .../idobao/id67/keymaps/default/keymap.c | 4 ++-- .../idobao/id75/keymaps/default75/keymap.c | 8 +++---- .../id80/v3/ansi/keymaps/default/keymap.c | 4 ++-- .../idobao/id87/v2/keymaps/default/keymap.c | 10 ++++---- .../montex/v1rgb/keymaps/default/keymap.c | 10 ++++---- .../idobao/montex/v2/keymaps/default/keymap.c | 10 ++++---- .../ilumkb/simpler61/keymaps/default/keymap.c | 2 +- .../ilumkb/simpler64/keymaps/default/keymap.c | 2 +- .../inland/mk47/keymaps/default/keymap.c | 6 ++--- .../inland/v83p/keymaps/default/keymap.c | 24 +++++++++---------- .../k_type/keymaps/default/keymap.c | 6 ++--- .../piggy60/keymaps/default/keymap.c | 2 +- .../jadookb/jkb65/keymaps/default/keymap.c | 8 +++---- .../jidohun/km113/keymaps/default/keymap.c | 8 +++---- .../keymaps/default/keymap.c | 6 ++--- .../hub20/keymaps/default/keymap.c | 8 +++---- .../hub20/keymaps/left_hand_numpad/keymap.c | 8 +++---- .../hub20/keymaps/right_hand_numpad/keymap.c | 8 +++---- .../jukaie/jk01/keymaps/default/keymap.c | 16 ++++++------- keyboards/junco/keymaps/default/keymap.c | 4 ++-- keyboards/kapl/keymaps/default/keymap.c | 6 ++--- .../kbdcraft/adam64/keymaps/default/keymap.c | 6 ++--- .../baguette66/rgb/keymaps/default/keymap.c | 12 +++++----- .../bella/rgb/keymaps/default/keymap.c | 2 +- .../bella/rgb_iso/keymaps/default/keymap.c | 2 +- .../boop65/rgb/keymaps/default/keymap.c | 4 ++-- .../kbd67/mkiirgb/keymaps/default/keymap.c | 4 ++-- .../mkiirgb_iso/keymaps/default/keymap.c | 4 ++-- .../kbdfans/maja/keymaps/default/keymap.c | 4 ++-- .../keebio/bamfk1/keymaps/default/keymap.c | 2 +- .../keebio/bdn9/keymaps/default/keymap.c | 4 ++-- keyboards/keebio/bdn9/keymaps/test/keymap.c | 2 +- .../keebio/cepstrum/keymaps/default/keymap.c | 6 ++--- .../chiri_ce/keymaps/default/keymap.json | 8 +++---- .../keebio/chocopad/keymaps/default/keymap.c | 4 ++-- .../convolution/keymaps/default/keymap.c | 8 +++---- .../keebio/iris/keymaps/default/keymap.json | 8 +++---- .../keebio/iris_ce/keymaps/default/keymap.c | 8 +++---- .../irispad/keymaps/default/keymap.json | 4 ++-- .../keebio/nyquist/keymaps/default/keymap.c | 4 ++-- .../nyquistpad/keymaps/default/keymap.c | 2 +- .../keebio/sinc/keymaps/default/keymap.c | 6 ++--- keyboards/keebio/sinc/keymaps/iso/keymap.c | 6 ++--- .../model01/keymaps/default/keymap.c | 4 ++-- .../kimiko/rev2/keymaps/default/keymap.c | 10 ++++---- .../q60/ansi/keymaps/default/keymap.c | 4 ++-- .../tgr_lena/keymaps/default/keymap.c | 2 +- .../bm16a/v2/keymaps/default/keymap.c | 4 ++-- .../bm40hsrgb/rev1/keymaps/default/keymap.c | 4 ++-- .../bm40hsrgb/rev2/keymaps/default/keymap.c | 4 ++-- .../bm60hsrgb/rev1/keymaps/default/keymap.c | 2 +- .../bm60hsrgb/rev2/keymaps/default/keymap.c | 2 +- .../rev1/keymaps/default/keymap.c | 2 +- .../rev1/keymaps/default/keymap.c | 2 +- .../keymaps/iso_nordic_sleepmode/keymap.c | 2 +- .../rev2/keymaps/default/keymap.c | 2 +- .../rev1/keymaps/default/keymap.c | 2 +- .../rev2/keymaps/default/keymap.c | 2 +- .../bm65hsrgb/keymaps/default/keymap.c | 2 +- .../rev1/keymaps/default/keymap.c | 2 +- .../bm68hsrgb/rev1/keymaps/default/keymap.c | 2 +- .../bm80hsrgb/keymaps/default/keymap.c | 2 +- .../bm80v2/keymaps/default/keymap.c | 2 +- .../bm80v2_iso/keymaps/default/keymap.c | 2 +- .../bm980hsrgb/keymaps/default/keymap.c | 2 +- .../cstc40/keymaps/default/keymap.c | 4 ++-- .../kuro/kuro65/keymaps/default/keymap.c | 2 +- .../pumpkinpad/keymaps/default/keymap.c | 6 ++--- .../latin17rgb/keymaps/default/keymap.c | 2 +- .../latin60rgb/keymaps/default/keymap.c | 8 +++---- .../latin6rgb/keymaps/default/keymap.c | 2 +- .../latinpad/keymaps/default/keymap.c | 16 ++++++------- .../lfkpad/keymaps/default/keymap.c | 10 ++++---- .../linworks/fave60a/keymaps/default/keymap.c | 2 +- .../linworks/fave84h/keymaps/default/keymap.c | 2 +- .../linworks/fave87h/keymaps/default/keymap.c | 2 +- .../favepada/keymaps/default/keymap.c | 2 +- .../magic_force/mf17/keymaps/default/keymap.c | 6 ++--- .../magic_force/mf34/keymaps/default/keymap.c | 8 +++---- .../matrix/noah/keymaps/default/keymap.c | 2 +- keyboards/matrix/noah/keymaps/iso/keymap.c | 2 +- .../matrix/noah/keymaps/splitspace/keymap.c | 2 +- keyboards/matrix/noah/keymaps/wkl/keymap.c | 2 +- keyboards/matrix/noah/noah.c | 18 -------------- .../delphine/keymaps/default/keymap.c | 2 +- .../infinity875/keymaps/default/keymap.c | 10 ++++---- .../bbpad/keymaps/default/keymap.json | 6 ++--- .../kafkasplit/keymaps/default/keymap.c | 2 +- .../melgeek/mach80/keymaps/default/keymap.c | 4 ++-- keyboards/melgeek/mach80/keymaps/tkl/keymap.c | 4 ++-- keyboards/melgeek/mach80/keymaps/wkl/keymap.c | 4 ++-- .../melgeek/mj61/keymaps/default/keymap.c | 4 ++-- .../melgeek/mj63/keymaps/default/keymap.c | 4 ++-- .../melgeek/mj64/keymaps/default/keymap.c | 4 ++-- .../melgeek/mj65/keymaps/default/keymap.c | 4 ++-- .../melgeek/mojo68/keymaps/default/keymap.c | 4 ++-- .../melgeek/mojo75/keymaps/default/keymap.c | 4 ++-- .../melgeek/tegic/keymaps/default/keymap.c | 4 ++-- .../melgeek/z70ultra/keymaps/default/keymap.c | 4 ++-- .../miiiw/blackio83/keymaps/default/keymap.c | 8 +++---- .../miller/gm862/keymaps/default/keymap.c | 2 +- .../moky/moky67/keymaps/default/keymap.c | 18 +++++++------- .../moky/moky88/keymaps/default/keymap.c | 18 +++++++------- .../monsgeek/m5/keymaps/default/keymap.c | 20 ++++++++-------- .../xo87/rgb/keymaps/default/keymap.c | 2 +- .../xo87/solderable/keymaps/default/keymap.c | 2 +- keyboards/mt/mt64rgb/keymaps/default/keymap.c | 2 +- keyboards/mt/mt84/keymaps/default/keymap.c | 2 +- .../mw65_rgb/keymaps/default/keymap.c | 12 +++++----- .../mwstudio/mw75/keymaps/default/keymap.c | 12 +++++----- .../mwstudio/mw75r2/keymaps/default/keymap.c | 12 +++++----- keyboards/nack/keymaps/default/keymap.c | 6 ++--- .../tb16_rgb/keymaps/default/keymap.c | 4 ++-- .../novelkeys/nk20/keymaps/default/keymap.c | 8 +++---- .../novelkeys/nk65b/keymaps/default/keymap.c | 2 +- .../novelkeys/nk87b/keymaps/default/keymap.c | 2 +- .../nk_classic_tkl/keymaps/default/keymap.c | 2 +- .../keymaps/default/keymap.c | 2 +- .../nk_plus/keymaps/default/keymap.c | 2 +- .../orthograph/keymaps/default/keymap.json | 2 +- .../voice65/hotswap/keymaps/default/keymap.c | 4 ++-- .../voice65/soldered/keymaps/default/keymap.c | 4 ++-- .../albacore/keymaps/default/keymap.c | 4 ++-- .../canoe_gen2/keymaps/default/keymap.c | 4 ++-- .../titan65/hotswap/keymaps/default/keymap.c | 4 ++-- .../phentech/rpk_001/keymaps/default/keymap.c | 2 +- .../keybow2040/keymaps/default/keymap.json | 4 ++-- .../playkbtw/pk64rgb/keymaps/default/keymap.c | 2 +- .../projectd_65_ansi/keymaps/default/keymap.c | 6 ++--- .../projectd/75/ansi/keymaps/default/keymap.c | 6 ++--- .../projectd/75/iso/keymaps/default/keymap.c | 6 ++--- .../protozoa/p01/keymaps/default/keymap.c | 2 +- .../quarkeys/z40/keymaps/default/keymap.c | 8 +++---- .../redragon/k667/keymaps/default/keymap.c | 8 +++---- keyboards/rgbkb/mun/keymaps/default/keymap.c | 12 +++++----- keyboards/rgbkb/pan/keymaps/default/keymap.c | 14 +++++------ .../rgbkb/pan/keymaps/default_eee/keymap.c | 14 +++++------ .../rgbkb/pan/keymaps/default_sss/keymap.c | 6 ++--- .../h4ckb0ard/keymaps/default/keymap.c | 8 +++---- .../rskeys100/keymaps/default/keymap.c | 4 ++-- .../s_ol/0xc_pad/keymaps/default/keymap.c | 2 +- .../skiller_sgk50_s2/keymaps/default/keymap.c | 6 ++--- .../skiller_sgk50_s3/keymaps/default/keymap.c | 8 +++---- .../skiller_sgk50_s4/keymaps/default/keymap.c | 6 ++--- .../frost68/keymaps/default/keymap.c | 2 +- keyboards/skmt/15k/keymaps/default/keymap.c | 6 ++--- .../skyloong/dt40/keymaps/default/keymap.c | 2 +- .../skyloong/gk61/v1/keymaps/default/keymap.c | 4 ++-- .../keymaps/default/keymap.c | 4 ++-- .../smallkeyboard/keymaps/default/keymap.c | 2 +- .../sowbug/68keys/keymaps/default/keymap.c | 6 ++--- .../sowbug/ansi_tkl/keymaps/default/keymap.c | 8 +++---- .../nebula12b/keymaps/default/keymap.c | 2 +- .../nebula68b/keymaps/default/keymap.c | 2 +- .../solder/keymaps/default_split_bs/keymap.c | 2 +- .../aurora/corne/keymaps/default/keymap.json | 4 ++-- .../aurora/helix/keymaps/default/keymap.json | 4 ++-- .../aurora/lily58/keymaps/default/keymap.json | 4 ++-- .../sofle_v2/keymaps/default/keymap.json | 4 ++-- .../aurora/sweep/keymaps/default/keymap.json | 6 ++--- .../splitkb/kyria/keymaps/default/keymap.c | 4 ++-- keyboards/stront/keymaps/default/keymap.c | 6 ++--- keyboards/stront/keymaps/hid/keymap.c | 6 ++--- keyboards/stront/keymaps/i2c/keymap.c | 6 ++--- .../native/ansi/keymaps/default/keymap.c | 8 +++---- .../native/iso/keymaps/default/keymap.c | 8 +++---- .../tkc/portico/keymaps/default/keymap.c | 6 ++--- .../tkc/portico68v2/keymaps/default/keymap.c | 4 ++-- .../le_chiffre/keymaps/default/keymap.c | 4 ++-- .../treasure/type9s3/keymaps/default/keymap.c | 6 ++--- .../tzarc/djinn/keymaps/default/keymap.c | 8 +++---- .../tzarc/ghoul/keymaps/default/keymap.c | 16 ++++++------- .../launch_pad/keymaps/default/keymap.c | 8 +++---- keyboards/wekey/we27/keymaps/default/keymap.c | 10 ++++---- .../winry/winry315/keymaps/default/keymap.c | 6 ++--- .../winry315/keymaps/left_numpad/keymap.c | 10 ++++---- keyboards/wolf/m60_b/keymaps/default/keymap.c | 4 ++-- .../woodkeys/meira/keymaps/takmiya/keymap.c | 4 ++-- .../xbows/knight/keymaps/default/keymap.c | 4 ++-- .../knight_plus/keymaps/default/keymap.c | 4 ++-- .../xbows/nature/keymaps/default/keymap.c | 4 ++-- .../xbows/numpad/keymaps/default/keymap.c | 6 ++--- .../xbows/ranger/keymaps/default/keymap.c | 4 ++-- .../xbows/woody/keymaps/default/keymap.c | 4 ++-- .../xelus/pachi/rgb/keymaps/default/keymap.c | 8 +++---- .../xelus/valor/rev2/keymaps/default/keymap.c | 4 ++-- .../xiudi/xd60/keymaps/crd_ansi/keymap.c | 4 ++-- .../yandrstudio/nz64/keymaps/default/keymap.c | 4 ++-- .../nz67v2/keymaps/default/keymap.c | 4 ++-- .../yandrstudio/tg67/keymaps/default/keymap.c | 4 ++-- .../ymdk/id75/keymaps/default/keymap.json | 2 +- keyboards/ymdk/ymd09/keymaps/default/keymap.c | 6 ++--- .../ymdk/ymd40/air40/keymaps/default/keymap.c | 4 ++-- keyboards/ymdk/ymd62/keymaps/default/keymap.c | 2 +- .../ymd75/rev4/iso/keymaps/default/keymap.c | 2 +- .../yncognito/batpad/keymaps/default/keymap.c | 6 ++--- .../quick17/keymaps/default/keymap.c | 6 ++--- .../lets_split_v3/keymaps/default/keymap.c | 2 +- .../zsa/planck_ez/keymaps/default/keymap.json | 2 +- 345 files changed, 923 insertions(+), 941 deletions(-) diff --git a/keyboards/1upkeyboards/1upocarina/keymaps/default/keymap.c b/keyboards/1upkeyboards/1upocarina/keymaps/default/keymap.c index 86e3f440fe..ff93f51ee4 100644 --- a/keyboards/1upkeyboards/1upocarina/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1upocarina/keymaps/default/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_1x5( - RGB_TOG, RGB_MOD, KC_TRNS, RGB_VAD, RGB_VAI + RM_TOGG, RM_NEXT, KC_TRNS, RM_VALD, RM_VALU ) }; diff --git a/keyboards/1upkeyboards/1upslider8/keymaps/default/keymap.c b/keyboards/1upkeyboards/1upslider8/keymaps/default/keymap.c index 9e39f9d3e3..2f0ac1976e 100644 --- a/keyboards/1upkeyboards/1upslider8/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1upslider8/keymaps/default/keymap.c @@ -18,7 +18,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - RGB_TOG, + RM_TOGG, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8 ) @@ -26,6 +26,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD)} + [0] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT)} }; #endif diff --git a/keyboards/1upkeyboards/1upsuper16v3/keymaps/default/keymap.c b/keyboards/1upkeyboards/1upsuper16v3/keymaps/default/keymap.c index e7be96bd81..79c99fd7db 100644 --- a/keyboards/1upkeyboards/1upsuper16v3/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1upsuper16v3/keymaps/default/keymap.c @@ -24,9 +24,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(1), KC_P0, KC_PDOT, KC_PENT ), [1] = LAYOUT_ortho_4x4( - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, - RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, + RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT ) }; diff --git a/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c b/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c index bc0d37eca0..72445452bc 100644 --- a/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/pi40/keymaps/default/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ONE] = LAYOUT_ortho_4x12 ( - RGB_TOG, + RM_TOGG, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, 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_ENT , @@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FOUR] = LAYOUT_ortho_4x12 ( KC_MUTE, - _______, QK_BOOT, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, QK_BOOT, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_DEL , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ @@ -116,7 +116,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_ONE] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) }, + [_ONE] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT) }, [_TWO] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_THREE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_FOUR] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } diff --git a/keyboards/1upkeyboards/pi50/keymaps/default/keymap.c b/keyboards/1upkeyboards/pi50/keymaps/default/keymap.c index bd66c00bff..40b3c520e0 100644 --- a/keyboards/1upkeyboards/pi50/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/pi50/keymaps/default/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ONE] = LAYOUT_ortho_5x12 ( - RGB_TOG, + RM_TOGG, KC_GRV, 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_DEL, KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, @@ -128,7 +128,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_ONE] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) }, + [_ONE] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT) }, [_TWO] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_THREE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_FOUR] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } diff --git a/keyboards/1upkeyboards/pi60/keymaps/default/keymap.c b/keyboards/1upkeyboards/pi60/keymaps/default/keymap.c index 8a83e83b52..5d1c82a023 100644 --- a/keyboards/1upkeyboards/pi60/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/pi60/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = LAYOUT_all( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/1upkeyboards/pi60_hse/keymaps/default/keymap.c b/keyboards/1upkeyboards/pi60_hse/keymaps/default/keymap.c index 22e1a4c0d9..ddb7f98869 100644 --- a/keyboards/1upkeyboards/pi60_hse/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/pi60_hse/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = LAYOUT_60_ansi_split_bs_rshift( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/1upkeyboards/super16/keymaps/default/keymap.c b/keyboards/1upkeyboards/super16/keymaps/default/keymap.c index 4414a658c5..640687c790 100644 --- a/keyboards/1upkeyboards/super16/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/super16/keymaps/default/keymap.c @@ -17,9 +17,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_4x4( /* Base */ - RGB_TOG, KC_1, KC_U, KC_P, - RGB_MOD, KC_1, KC_U, KC_P, - RGB_TOG, KC_1, KC_U, KC_P, - RGB_MOD, KC_1, KC_U, KC_P + RM_TOGG, KC_1, KC_U, KC_P, + RM_NEXT, KC_1, KC_U, KC_P, + RM_TOGG, KC_1, KC_U, KC_P, + RM_NEXT, KC_1, KC_U, KC_P ), }; diff --git a/keyboards/1upkeyboards/super16v2/keymaps/default/keymap.c b/keyboards/1upkeyboards/super16v2/keymaps/default/keymap.c index ba6d6c4d71..ac30909566 100644 --- a/keyboards/1upkeyboards/super16v2/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/super16v2/keymaps/default/keymap.c @@ -25,9 +25,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_ortho_4x4( /* Fn Layer */ - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, - RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, + RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT ), }; diff --git a/keyboards/1upkeyboards/sweet16v2/keymaps/default/keymap.c b/keyboards/1upkeyboards/sweet16v2/keymaps/default/keymap.c index 14168ee700..6ccf21e18f 100644 --- a/keyboards/1upkeyboards/sweet16v2/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/sweet16v2/keymaps/default/keymap.c @@ -25,9 +25,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_ortho_4x4( - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, - RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, + RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT ) }; @@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RM_VALD, RM_VALU) }, [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) } }; #endif \ No newline at end of file diff --git a/keyboards/4pplet/perk60_iso/keymaps/default/keymap.c b/keyboards/4pplet/perk60_iso/keymaps/default/keymap.c index d720096ad3..6c2698b4f8 100644 --- a/keyboards/4pplet/perk60_iso/keymaps/default/keymap.c +++ b/keyboards/4pplet/perk60_iso/keymaps/default/keymap.c @@ -29,6 +29,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, RGB_M_B, RGB_M_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/abko/ak84bt/keymaps/default/keymap.c b/keyboards/abko/ak84bt/keymaps/default/keymap.c index 48fab8614b..6e4c85ac14 100644 --- a/keyboards/abko/ak84bt/keymaps/default/keymap.c +++ b/keyboards/abko/ak84bt/keymaps/default/keymap.c @@ -33,10 +33,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FnLay] = LAYOUT( QK_BOOT, KC_MY_COMPUTER, KC_WWW_HOME, KC_CALCULATOR, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_MAIL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAI, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, XXXXXXX, _______, XXXXXXX, RGB_SPD, RGB_VAD, RGB_SPI + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_VALU, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, RM_TOGG, XXXXXXX, _______, XXXXXXX, RM_SPDD, RM_VALD, RM_SPDU ) }; diff --git a/keyboards/acheron/apollo/87h/delta/keymaps/default/keymap.c b/keyboards/acheron/apollo/87h/delta/keymaps/default/keymap.c index 3ad45e3679..94f049f55c 100755 --- a/keyboards/acheron/apollo/87h/delta/keymaps/default/keymap.c +++ b/keyboards/acheron/apollo/87h/delta/keymaps/default/keymap.c @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_tkl_ansi( diff --git a/keyboards/acheron/apollo/87h/gamma/keymaps/default/keymap.c b/keyboards/acheron/apollo/87h/gamma/keymaps/default/keymap.c index 3ad45e3679..94f049f55c 100755 --- a/keyboards/acheron/apollo/87h/gamma/keymaps/default/keymap.c +++ b/keyboards/acheron/apollo/87h/gamma/keymaps/default/keymap.c @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_tkl_ansi( diff --git a/keyboards/acheron/apollo/87htsc/keymaps/default/keymap.c b/keyboards/acheron/apollo/87htsc/keymaps/default/keymap.c index f814960810..44404bbc4c 100755 --- a/keyboards/acheron/apollo/87htsc/keymaps/default/keymap.c +++ b/keyboards/acheron/apollo/87htsc/keymaps/default/keymap.c @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_tkl_ansi_tsangan( diff --git a/keyboards/acheron/apollo/88htsc/keymaps/default/keymap.c b/keyboards/acheron/apollo/88htsc/keymaps/default/keymap.c index abed7e6fbe..023ddef74c 100755 --- a/keyboards/acheron/apollo/88htsc/keymaps/default/keymap.c +++ b/keyboards/acheron/apollo/88htsc/keymaps/default/keymap.c @@ -30,8 +30,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_tkl_f13_ansi_tsangan( diff --git a/keyboards/adm42/rev4/keymaps/default/keymap.json b/keyboards/adm42/rev4/keymaps/default/keymap.json index 72eb7d50de..dce2405bc0 100644 --- a/keyboards/adm42/rev4/keymaps/default/keymap.json +++ b/keyboards/adm42/rev4/keymaps/default/keymap.json @@ -29,9 +29,9 @@ "KC_CAPS", "_______", "_______", "_______", "_______", "KC_CAPS" ], [ - "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_M_B", "RGB_VAD", "RGB_VAI", "RGB_SAD", "RGB_SAI", "XXXXXXX", - "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_TOG", "RGB_MOD", "RGB_RMOD", "RGB_HUD", "RGB_HUI", "XXXXXXX", - "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_M_P", "RGB_SPD", "RGB_SPI", "XXXXXXX", "XXXXXXX", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_M_B", "RM_VALD", "RM_VALU", "RM_SATD", "RM_SATU", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_TOGG", "RM_NEXT", "RM_PREV", "RM_HUED", "RM_HUEU", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_M_P", "RM_SPDD", "RM_SPDU", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "MO(5)", "XXXXXXX", "XXXXXXX" ], [ diff --git a/keyboards/adpenrose/akemipad/keymaps/default/keymap.c b/keyboards/adpenrose/akemipad/keymaps/default/keymap.c index 7226b85f2c..ad71e0281f 100644 --- a/keyboards/adpenrose/akemipad/keymaps/default/keymap.c +++ b/keyboards/adpenrose/akemipad/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #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(RGB_HUD, RGB_HUI) }, - [2] = { ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, - [3] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } + [1] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU) }, + [2] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [3] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) } }; #endif diff --git a/keyboards/adpenrose/akemipad/keymaps/default_numpad/keymap.c b/keyboards/adpenrose/akemipad/keymaps/default_numpad/keymap.c index 080df8d182..3f76587dde 100644 --- a/keyboards/adpenrose/akemipad/keymaps/default_numpad/keymap.c +++ b/keyboards/adpenrose/akemipad/keymaps/default_numpad/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #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(RGB_HUD, RGB_HUI) }, - [2] = { ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, - [3] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } + [1] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU) }, + [2] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [3] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) } }; #endif diff --git a/keyboards/akko/5108/keymaps/default/keymap.c b/keyboards/akko/5108/keymaps/default/keymap.c index ef92432ff5..588d895cd3 100644 --- a/keyboards/akko/5108/keymaps/default/keymap.c +++ b/keyboards/akko/5108/keymaps/default/keymap.c @@ -46,11 +46,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT( /* FN */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______,TG(WIN_W),_______,_______,_______,_______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI, _______, _______), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______,TG(WIN_W),_______,_______,_______,_______, _______, _______, DF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 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_PSCR, KC_SCRL, KC_PAUS, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, @@ -70,10 +70,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [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, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______,TG(MAC_W),_______,_______,_______,_______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI, _______, _______) + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______,TG(MAC_W),_______,_______,_______,_______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU, _______, _______) }; // clang-format on diff --git a/keyboards/akko/acr87/keymaps/default/keymap.c b/keyboards/akko/acr87/keymaps/default/keymap.c index 88bfbc8e1f..51f21a0097 100644 --- a/keyboards/akko/acr87/keymaps/default/keymap.c +++ b/keyboards/akko/acr87/keymaps/default/keymap.c @@ -47,11 +47,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT( /* FN */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, - _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, - _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI, - _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, + _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, 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_PSCR, KC_SCRL, KC_PAUS, @@ -70,10 +70,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, 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, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, - _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, - _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI) + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, + _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU) }; // clang-format on diff --git a/keyboards/akko/top40/keymaps/default/keymap.c b/keyboards/akko/top40/keymaps/default/keymap.c index fb9df16235..8f06ab969e 100644 --- a/keyboards/akko/top40/keymaps/default/keymap.c +++ b/keyboards/akko/top40/keymaps/default/keymap.c @@ -31,7 +31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT( /* Fn */ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END, RGB_TOG, RGB_MOD, - _______, _______, _______, KC_CALC, _______, AG_TOGG, _______, KC_MUTE, KC_VOLD, KC_VOLU, RGB_VAI, _______, - _______, GU_TOGG, _______, _______, _______, _______, RGB_SPI, RGB_VAD, RGB_SAI) + _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_HOME, KC_END, RM_TOGG, RM_NEXT, + _______, _______, _______, KC_CALC, _______, AG_TOGG, _______, KC_MUTE, KC_VOLD, KC_VOLU, RM_VALU, _______, + _______, GU_TOGG, _______, _______, _______, _______, RM_SPDU, RM_VALD, RM_SATU) }; diff --git a/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c b/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c index 3849b2889c..548db39a10 100644 --- a/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c +++ b/keyboards/alpaca/wfeclipse/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_PSCR, KC_SCRL, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,KC_MPRV, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, KC_TRNS, KC_MNXT, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_HUD, RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, KC_MNXT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_HUED, RM_TOGG, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/arrowmechanics/wings/keymaps/default/keymap.c b/keyboards/arrowmechanics/wings/keymaps/default/keymap.c index 949219b820..6e0a6a18dc 100644 --- a/keyboards/arrowmechanics/wings/keymaps/default/keymap.c +++ b/keyboards/arrowmechanics/wings/keymaps/default/keymap.c @@ -10,7 +10,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [BASE] = LAYOUT( KC_VOLU, 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_EQL, KC_PSCR, KC_DEL, - KC_VOLD, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_MOD, KC_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC, + KC_VOLD, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RM_NEXT, KC_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC, KC_MPLY, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, C(KC_C), C(KC_V), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MNXT, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, C(KC_Z), C(KC_Y), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_MPRV, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_HOME, @@ -20,6 +20,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [BASE] = { ENCODER_CCW_CW(RGB_HUI, RGB_HUD), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [BASE] = { ENCODER_CCW_CW(RM_HUEU, RM_HUED), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, }; #endif diff --git a/keyboards/ashwing66/keymaps/default/keymap.c b/keyboards/ashwing66/keymaps/default/keymap.c index 2b317e19eb..304f888742 100644 --- a/keyboards/ashwing66/keymaps/default/keymap.c +++ b/keyboards/ashwing66/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LBRC,KC_PSCR,KC_CAPS ,MO(_LAYERB),KC_LGUI ,KC_LALT ,KC_SPC ,KC_PGDN ,KC_PGUP ,KC_ENT ,KC_BSPC ,MO(_LAYERC),KC_INS ,KC_DEL ,KC_BSLS ,KC_RBRC ), [_LAYERB] = LAYOUT_5x16( - KC_ESC ,RGB_TOG,RGB_RMOD,RGB_MOD ,RGB_VAD ,RGB_VAI ,RGB_SPD ,RGB_SPI ,RGB_HUD ,RGB_HUI ,RGB_SAD ,RGB_SAI , + KC_ESC ,RM_TOGG,RM_PREV ,RM_NEXT ,RM_VALD ,RM_VALU ,RM_SPDD ,RM_SPDU ,RM_HUED ,RM_HUEU ,RM_SATD ,RM_SATU , KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_P ,KC_EQL , KC_LCTL,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_SCLN ,KC_QUOT , KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_LBRC ,KC_MUTE ,KC_RBRC ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , @@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_LAYERA] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, - [_LAYERB] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI)}, - [_LAYERC] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI)} + [_LAYERB] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU)}, + [_LAYERC] = { ENCODER_CCW_CW(RM_VALD, RM_VALU)} }; #endif diff --git a/keyboards/atlantis/ak81_ve/keymaps/default/keymap.c b/keyboards/atlantis/ak81_ve/keymaps/default/keymap.c index 59c23c97d3..afe041d515 100644 --- a/keyboards/atlantis/ak81_ve/keymaps/default/keymap.c +++ b/keyboards/atlantis/ak81_ve/keymaps/default/keymap.c @@ -27,11 +27,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT( - KC_SYSTEM_SLEEP, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, RGB_TOG, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, - _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, - _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, RGB_HUI, RGB_SPD, - _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_SAI) + KC_SYSTEM_SLEEP, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALD, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, RM_HUEU, RM_SPDD, + _______, _______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_SATU) }; \ No newline at end of file diff --git a/keyboards/atlantis/ps17/keymaps/default/keymap.c b/keyboards/atlantis/ps17/keymaps/default/keymap.c index 36042fbb18..26fe6b3066 100644 --- a/keyboards/atlantis/ps17/keymaps/default/keymap.c +++ b/keyboards/atlantis/ps17/keymaps/default/keymap.c @@ -14,7 +14,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_KP_0, KC_PDOT ), [1] = LAYOUT( - RGB_MOD, + RM_NEXT, TO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS ), [2] = LAYOUT( - RGB_MOD, + RM_NEXT, TO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS ), [3] = LAYOUT( - RGB_MOD, + RM_NEXT, TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #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(RGB_HUI, RGB_HUD) }, + [1] = { ENCODER_CCW_CW(RM_HUEU, RM_HUED) }, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, }; diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c index b1bd74957d..e5e0ba1207 100644 --- a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c +++ b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_LOWER] = LAYOUT( // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - RGB_TOG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, + RM_TOGG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c index c3aa67a944..ba8028104e 100644 --- a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c +++ b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_LOWER] = LAYOUT( // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - XXXXXXX, RGB_TOG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, + XXXXXXX, RM_TOGG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c index 304e9fc9a4..f440dac8cb 100644 --- a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c +++ b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c @@ -46,11 +46,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_P7, KC_P8, KC_P9, KC_RBRC, XXXXXXX, + RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_P7, KC_P8, KC_P9, KC_RBRC, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_TOG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL, + RM_TOGG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT, + RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ XXXXXXX, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_P0 diff --git a/keyboards/bastardkb/dilemma/4x6_4/keymaps/default/keymap.c b/keyboards/bastardkb/dilemma/4x6_4/keymaps/default/keymap.c index 2e5564f5e9..4ac5230988 100644 --- a/keyboards/bastardkb/dilemma/4x6_4/keymaps/default/keymap.c +++ b/keyboards/bastardkb/dilemma/4x6_4/keymaps/default/keymap.c @@ -46,11 +46,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_P7, KC_P8, KC_P9, KC_RBRC, XXXXXXX, + RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_P7, KC_P8, KC_P9, KC_RBRC, XXXXXXX, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_TOG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL, + RM_TOGG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL, // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT, + RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT, // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______ // ╰───────────────────────────────────╯ ╰───────────────────────────────────╯ diff --git a/keyboards/bastardkb/scylla/keymaps/default/keymap.c b/keyboards/bastardkb/scylla/keymaps/default/keymap.c index 10adac4126..8e9b0190d4 100644 --- a/keyboards/bastardkb/scylla/keymaps/default/keymap.c +++ b/keyboards/bastardkb/scylla/keymaps/default/keymap.c @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = LAYOUT_split_4x6_5(KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, //---------------------------------------------------------//--------------------------------------------------------------// - _______, _______, RGB_RMOD, RGB_TOG, RGB_MOD, KC_LBRC, KC_RBRC, _______, KC_NUM, KC_INS, KC_SCRL, KC_MUTE, + _______, _______, RM_PREV, RM_TOGG, RM_NEXT, KC_LBRC, KC_RBRC, _______, KC_NUM, KC_INS, KC_SCRL, KC_MUTE, //---------------------------------------------------------//--------------------------------------------------------------// _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_LPRN, KC_RPRN, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_VOLU, //---------------------------------------------------------//--------------------------------------------------------------// diff --git a/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c b/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c index 56e56d9a43..1f49629c88 100644 --- a/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c +++ b/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c @@ -60,9 +60,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------. ,-----------------------------------------------------. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, KC_SPC, _______, _______, KC_ENT, KC_RALT //`--------------------------' `--------------------------' diff --git a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c index 551aea127f..d87e9c2a44 100644 --- a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c +++ b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c @@ -60,9 +60,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------. ,-----------------------------------------------------. QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, KC_SPC, _______, _______, KC_ENT, KC_RALT //`--------------------------' `--------------------------' diff --git a/keyboards/binepad/bnk9/keymaps/default/keymap.c b/keyboards/binepad/bnk9/keymaps/default/keymap.c index 9ae1e4541f..60b0210599 100644 --- a/keyboards/binepad/bnk9/keymaps/default/keymap.c +++ b/keyboards/binepad/bnk9/keymaps/default/keymap.c @@ -11,10 +11,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P7, KC_P8, LT(1, KC_P9) ), [1] = LAYOUT( - RGB_TOG, - RGB_HUI, RGB_SAI, RGB_SPI, - RGB_HUD, RGB_SAD, RGB_SPD, - RGB_RMOD, RGB_MOD, _______ + RM_TOGG, + RM_HUEU, RM_SATU, RM_SPDU, + RM_HUED, RM_SATD, RM_SPDD, + RM_PREV, RM_NEXT, _______ ) }; @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [1] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } + [1] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) } }; #endif diff --git a/keyboards/blockboy/ac980mini/keymaps/default/keymap.c b/keyboards/blockboy/ac980mini/keymaps/default/keymap.c index b5541ed23e..0194281ebf 100644 --- a/keyboards/blockboy/ac980mini/keymaps/default/keymap.c +++ b/keyboards/blockboy/ac980mini/keymaps/default/keymap.c @@ -40,14 +40,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), // RGB Control [1] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RGB_TOG, RGB_SPI, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RM_TOGG, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, - _______, _______, _______, _______, _______, MO(2), _______, RGB_MOD, RGB_HUI, RGB_SAI, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, + _______, _______, _______, _______, _______, MO(2), _______, RM_NEXT, RM_HUEU, RM_SATU, _______, _______, _______ ), [2] = LAYOUT( - QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/boardsource/beiwagon/keymaps/default/keymap.c b/keyboards/boardsource/beiwagon/keymaps/default/keymap.c index 584ada4830..4f799550e1 100644 --- a/keyboards/boardsource/beiwagon/keymaps/default/keymap.c +++ b/keyboards/boardsource/beiwagon/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_0, KC_PENT,RAISE ), [_RAISE] = LAYOUT( - KC_7, KC_8, RGB_TOG, - KC_4, KC_5, RGB_MOD, + KC_7, KC_8, RM_TOGG, + KC_4, KC_5, RM_NEXT, KC_1, KC_2, KC_3, KC_0, KC_PENT,_______ ) diff --git a/keyboards/boardsource/equals/60/keymaps/default/keymap.c b/keyboards/boardsource/equals/60/keymaps/default/keymap.c index 48e26a4094..b744ea6c4c 100644 --- a/keyboards/boardsource/equals/60/keymaps/default/keymap.c +++ b/keyboards/boardsource/equals/60/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_ESC, 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_ENT, - KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_RGHT, RGB_MOD, RGB_TOG + KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_RGHT, RM_NEXT, RM_TOGG ), [_RAISE] = LAYOUT_ortho_5x12( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, diff --git a/keyboards/boardsource/equals/avr/keymaps/default/keymap.c b/keyboards/boardsource/equals/avr/keymaps/default/keymap.c index 99a049214b..6cac7e1a0f 100644 --- a/keyboards/boardsource/equals/avr/keymaps/default/keymap.c +++ b/keyboards/boardsource/equals/avr/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_ESC, 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_ENT, - KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, CK_TOGG, RGB_MOD, RGB_TOG + KC_PIPE, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, CK_TOGG, RM_NEXT, RM_TOGG ), [_RAISE] = LAYOUT_ortho_5x12( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, diff --git a/keyboards/boardsource/lulu/keymaps/default/keymap.c b/keyboards/boardsource/lulu/keymaps/default/keymap.c index cbee1401ed..9c1ed869ef 100644 --- a/keyboards/boardsource/lulu/keymaps/default/keymap.c +++ b/keyboards/boardsource/lulu/keymaps/default/keymap.c @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | - * |------+------+------+------+------+------|RGB_TOG| | ] |------+------+------+------+------+------| + * |------+------+------+------+------+------|RM_TOGG| | ] |------+------+------+------+------+------| * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | * `-----------------------------------------/ / \ \-----------------------------------------' * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | @@ -74,10 +74,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = LAYOUT( - RGB_MOD, RGB_RMOD,RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, + RM_NEXT, RM_PREV, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RGB_TOG, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, RM_TOGG, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______ ), /* ADJUST diff --git a/keyboards/boardsource/sessanta/keymaps/default/keymap.json b/keyboards/boardsource/sessanta/keymaps/default/keymap.json index b99333c46d..d8fb2f8e4a 100644 --- a/keyboards/boardsource/sessanta/keymaps/default/keymap.json +++ b/keyboards/boardsource/sessanta/keymaps/default/keymap.json @@ -12,8 +12,8 @@ ], [ "QK_BOOT", "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_F13", - "QK_RBT", "RGB_MOD", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_TOG", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", - "EE_CLR", "RGB_RMOD", "RGB_VAD", "RGB_HUD", "RGB_SAD", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "QK_RBT", "RM_NEXT", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_TOGG", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "EE_CLR", "RM_PREV", "RM_VALD", "RM_HUED", "RM_SATD", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" ] diff --git a/keyboards/boardsource/technik_o/keymaps/default/keymap.c b/keyboards/boardsource/technik_o/keymaps/default/keymap.c index a43d930c4f..4299269190 100644 --- a/keyboards/boardsource/technik_o/keymaps/default/keymap.c +++ b/keyboards/boardsource/technik_o/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, 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_ENT , - RGB_TOG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + RM_TOGG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), [_RAISE] = LAYOUT_ortho_4x12( KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, - RGB_MOD, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + RM_NEXT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ) }; diff --git a/keyboards/boardsource/technik_s/keymaps/default/keymap.c b/keyboards/boardsource/technik_s/keymaps/default/keymap.c index bae6438d15..9c215f99e2 100644 --- a/keyboards/boardsource/technik_s/keymaps/default/keymap.c +++ b/keyboards/boardsource/technik_s/keymaps/default/keymap.c @@ -30,12 +30,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_LSFT,KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_UP, KC_ENT , - RGB_TOG, KC_LCTL, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_RIGHT + RM_TOGG, KC_LCTL, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_RIGHT ), [_RAISE] = LAYOUT( KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, - RGB_MOD, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + RM_NEXT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD ), [_LOWER] = LAYOUT( diff --git a/keyboards/boardsource/the_q/keymaps/default/keymap.json b/keyboards/boardsource/the_q/keymaps/default/keymap.json index 69aa6f8629..5cd91661d0 100644 --- a/keyboards/boardsource/the_q/keymaps/default/keymap.json +++ b/keyboards/boardsource/the_q/keymaps/default/keymap.json @@ -16,9 +16,9 @@ "_______", "_______", "_______", "_______", "_______", "_______" ], [ - "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_MOD", "RGB_TOG", "_______", - "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RGB_VAD", "RGB_HUD", "RGB_SAD", "RGB_RMOD", "_______", "_______", - "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" ] ] diff --git a/keyboards/boardsource/unicorne/keymaps/default/keymap.json b/keyboards/boardsource/unicorne/keymaps/default/keymap.json index 1980bc3c87..1aa2917778 100644 --- a/keyboards/boardsource/unicorne/keymaps/default/keymap.json +++ b/keyboards/boardsource/unicorne/keymaps/default/keymap.json @@ -16,8 +16,8 @@ "_______", "_______", "_______", "_______", "_______", "_______" ], [ - "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RGB_VAI", "RGB_HUI", "RGB_SAI", "RGB_MOD", "RGB_TOG", "_______", - "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RGB_VAD", "RGB_HUD", "RGB_SAD", "RGB_RMOD", "CK_TOGG", "_______", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "CK_TOGG", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" ] diff --git a/keyboards/boston_meetup/2019/keymaps/default/keymap.c b/keyboards/boston_meetup/2019/keymaps/default/keymap.c index b4d7280640..ea65556636 100644 --- a/keyboards/boston_meetup/2019/keymaps/default/keymap.c +++ b/keyboards/boston_meetup/2019/keymaps/default/keymap.c @@ -78,9 +78,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = LAYOUT( KC_NUM, - RGB_TOG, RGB_MOD, RGB_RMOD, XXXXXXX, - _______, RGB_HUI, RGB_SAI, RGB_VAI, - _______, RGB_HUD, RGB_SAD, RGB_VAD + RM_TOGG, RM_NEXT, RM_PREV, XXXXXXX, + _______, RM_HUEU, RM_SATU, RM_VALU, + _______, RM_HUED, RM_SATD, RM_VALD ), diff --git a/keyboards/bubble75/hotswap/keymaps/default/keymap.c b/keyboards/bubble75/hotswap/keymaps/default/keymap.c index 7ce1f6bf91..1f878ebe32 100644 --- a/keyboards/bubble75/hotswap/keymaps/default/keymap.c +++ b/keyboards/bubble75/hotswap/keymaps/default/keymap.c @@ -15,11 +15,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_HUD, - _______, _______, _______, RGB_MOD, RGB_TOG, _______, RGB_SPD, RGB_VAD, RGB_SPI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, RM_HUED, + _______, _______, _______, RM_NEXT, RM_TOGG, _______, RM_SPDD, RM_VALD, RM_SPDU), [2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/canary/canary60rgb/keymaps/default/keymap.c b/keyboards/canary/canary60rgb/keymaps/default/keymap.c index 094595130f..f57f83b933 100644 --- a/keyboards/canary/canary60rgb/keymaps/default/keymap.c +++ b/keyboards/canary/canary60rgb/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT( _______, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, EE_CLR, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/capsunlocked/cu80/v2/ansi/keymaps/default/keymap.c b/keyboards/capsunlocked/cu80/v2/ansi/keymaps/default/keymap.c index b0270d17f9..27725440e4 100644 --- a/keyboards/capsunlocked/cu80/v2/ansi/keymaps/default/keymap.c +++ b/keyboards/capsunlocked/cu80/v2/ansi/keymaps/default/keymap.c @@ -29,10 +29,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_R, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, RM_SATU, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_SPD, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_TOG, RGB_MOD + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_SPDD, + _______, _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_TOGG, RM_NEXT ) }; diff --git a/keyboards/capsunlocked/cu80/v2/iso/keymaps/default/keymap.c b/keyboards/capsunlocked/cu80/v2/iso/keymaps/default/keymap.c index 4bae95ed07..c13c244a3d 100644 --- a/keyboards/capsunlocked/cu80/v2/iso/keymaps/default/keymap.c +++ b/keyboards/capsunlocked/cu80/v2/iso/keymaps/default/keymap.c @@ -29,10 +29,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_iso( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_R, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, RM_SATU, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_TOG, RGB_MOD + _______, _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_TOGG, RM_NEXT ) }; diff --git a/keyboards/clickety_split/leeloo/keymaps/default/keymap.c b/keyboards/clickety_split/leeloo/keymaps/default/keymap.c index 6bf9824472..65ca621330 100644 --- a/keyboards/clickety_split/leeloo/keymaps/default/keymap.c +++ b/keyboards/clickety_split/leeloo/keymaps/default/keymap.c @@ -107,8 +107,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, - _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, KC_VOLD, _______, _______, _______, - _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, + _______, RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, _______, _______, _______, KC_VOLD, _______, _______, _______, + _______, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/controllerworks/city42/keymaps/default/keymap.c b/keyboards/controllerworks/city42/keymaps/default/keymap.c index 7f46648a7e..b6b3597e98 100644 --- a/keyboards/controllerworks/city42/keymaps/default/keymap.c +++ b/keyboards/controllerworks/city42/keymaps/default/keymap.c @@ -58,9 +58,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------. ,-----------------------------------------------------. QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUM, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT //`--------------------------' `--------------------------' diff --git a/keyboards/controllerworks/mini36/keymaps/default/keymap.c b/keyboards/controllerworks/mini36/keymaps/default/keymap.c index b5fbe49bb2..45f46b47bd 100644 --- a/keyboards/controllerworks/mini36/keymaps/default/keymap.c +++ b/keyboards/controllerworks/mini36/keymaps/default/keymap.c @@ -58,9 +58,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,--------------------------------------------. ,--------------------------------------------. QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT //`--------------------------' `--------------------------' diff --git a/keyboards/controllerworks/mini42/keymaps/default/keymap.c b/keyboards/controllerworks/mini42/keymaps/default/keymap.c index af9a62b400..50ffd9fd55 100644 --- a/keyboards/controllerworks/mini42/keymaps/default/keymap.c +++ b/keyboards/controllerworks/mini42/keymaps/default/keymap.c @@ -58,9 +58,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------. ,-----------------------------------------------------. QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUM, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT //`--------------------------' `--------------------------' diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index f4d6f900ce..6d8d5b7f1d 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -58,11 +58,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [3] = LAYOUT_split_3x6_3( //,-----------------------------------------------------. ,-----------------------------------------------------. - QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT //`--------------------------' `--------------------------' @@ -71,9 +71,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, - [1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, - [2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, - [3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, + [1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, + [2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, + [3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_RGHT, KC_LEFT), }, }; #endif diff --git a/keyboards/cxt_studio/keymaps/default/keymap.json b/keyboards/cxt_studio/keymaps/default/keymap.json index 77b4cabc92..9e31833520 100644 --- a/keyboards/cxt_studio/keymaps/default/keymap.json +++ b/keyboards/cxt_studio/keymaps/default/keymap.json @@ -7,7 +7,7 @@ "KC_ESC", "KC_F11", "KC_NO", "KC_MSTP", "KC_NO", "KC_NO", "KC_MRWD", "KC_MFFD", "KC_NO", "KC_MPLY", "KC_MPLY", "KC_MNXT", - "KC_MUTE", "KC_NO", "KC_NO", "RGB_TOG" + "KC_MUTE", "KC_NO", "KC_NO", "RM_TOGG" ] ] } diff --git a/keyboards/darkproject/kd83a_bfg_edition/keymaps/default/keymap.c b/keyboards/darkproject/kd83a_bfg_edition/keymaps/default/keymap.c index 0c23701f5b..8218f5fd6c 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/keymaps/default/keymap.c +++ b/keyboards/darkproject/kd83a_bfg_edition/keymaps/default/keymap.c @@ -46,20 +46,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(Macfn),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [Winfn] = LAYOUT( - QK_BOOT, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RGB_MOD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, + QK_BOOT, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RM_NEXT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, KC_TRNS, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, KC_TRNS, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), [Macfn] = LAYOUT( - QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RGB_MOD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RM_NEXT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), }; diff --git a/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c b/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c index 8d48ed9acf..4c36cd29eb 100644 --- a/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c +++ b/keyboards/darkproject/kd87a_bfg_edition/keymaps/default/keymap.c @@ -47,19 +47,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [Winfn] = LAYOUT_tkl_ansi( QK_BOOT, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_SCRL, KC_PAUS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, KC_TRNS, - KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, + KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), [Macfn] = LAYOUT_tkl_ansi( QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, KC_TRNS, - KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, + KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), }; diff --git a/keyboards/darmoshark/k3/keymaps/default/keymap.c b/keyboards/darmoshark/k3/keymaps/default/keymap.c index 5c49cab1a3..8c70bf10f2 100644 --- a/keyboards/darmoshark/k3/keymaps/default/keymap.c +++ b/keyboards/darmoshark/k3/keymaps/default/keymap.c @@ -15,11 +15,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_numpad_6x4( - EE_CLR, _______, RGB_MOD, _______, - KC_CALC, _______, _______, RGB_VAD, - _______, RGB_SPI, _______, - _______, _______, _______, RGB_VAI, - _______, RGB_SPD, _______, - _______, RGB_TOG, _______ + EE_CLR, _______, RM_NEXT, _______, + KC_CALC, _______, _______, RM_VALD, + _______, RM_SPDU, _______, + _______, _______, _______, RM_VALU, + _______, RM_SPDD, _______, + _______, RM_TOGG, _______ ) }; diff --git a/keyboards/dasky/reverb/keymaps/default/keymap.json b/keyboards/dasky/reverb/keymaps/default/keymap.json index c23702d4c0..bce24be260 100644 --- a/keyboards/dasky/reverb/keymaps/default/keymap.json +++ b/keyboards/dasky/reverb/keymaps/default/keymap.json @@ -25,8 +25,8 @@ ["KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_PSCR", "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", - "RGB_TOG", "RGB_HUI", "RGB_SAI", "RGB_VAI", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", - "RGB_MOD", "RGB_HUD", "RGB_SAD", "RGB_VAD", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "KC_LGUI", "KC_TRNS", "KC_SPC", "KC_ENT", "KC_TRNS", "KC_RALT"] ] } diff --git a/keyboards/deemen17/de80/keymaps/default/keymap.c b/keyboards/deemen17/de80/keymaps/default/keymap.c index cd35430447..4a1a2563cf 100644 --- a/keyboards/deemen17/de80/keymaps/default/keymap.c +++ b/keyboards/deemen17/de80/keymaps/default/keymap.c @@ -28,11 +28,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, RGB_HUI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_HUD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, RGB_VAD, RGB_MOD + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_SATU, UG_HUEU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_SATD, UG_HUED, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_VALU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_PREV, UG_VALD, UG_NEXT ) }; diff --git a/keyboards/dekunukem/duckypad/keymaps/default/keymap.c b/keyboards/dekunukem/duckypad/keymaps/default/keymap.c index 5665bcb799..7f7a8925fd 100644 --- a/keyboards/dekunukem/duckypad/keymaps/default/keymap.c +++ b/keyboards/dekunukem/duckypad/keymaps/default/keymap.c @@ -82,10 +82,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RGB] = LAYOUT( RGB_M_P, RGB_M_B, RGB_M_R, - RGB_M_SW, RGB_SPD, RGB_SPI, - RGB_MOD, RGB_SAD, RGB_SAI, - RGB_RMOD, RGB_HUD, RGB_HUI, - RGB_TOG, RGB_VAD, RGB_VAI, + RGB_M_SW, RM_SPDD, RM_SPDU, + RM_NEXT, RM_SATD, RM_SATU, + RM_PREV, RM_HUED, RM_HUEU, + RM_TOGG, RM_VALD, RM_VALU, RGB_LAYER, KC_NO ) }; diff --git a/keyboards/deng/djam/keymaps/default/keymap.c b/keyboards/deng/djam/keymaps/default/keymap.c index 11508963b1..d46cc6fcc3 100644 --- a/keyboards/deng/djam/keymaps/default/keymap.c +++ b/keyboards/deng/djam/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LEFT, KC_RGHT, KC_LSFT, L1_SPC, KC_RSFT, KC_UP, KC_DOWN), [1] = LAYOUT( - RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, RGB_RMOD, - _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, RGB_MOD, RGB_TOG, + RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, RM_PREV, + _______, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, _______, RM_NEXT, RM_TOGG, _______, _______, BL_TOGG, _______, BL_STEP, _______, _______) }; diff --git a/keyboards/deng/thirty/keymaps/default/keymap.c b/keyboards/deng/thirty/keymaps/default/keymap.c index 68bf26ccad..fcda453e8e 100644 --- a/keyboards/deng/thirty/keymaps/default/keymap.c +++ b/keyboards/deng/thirty/keymaps/default/keymap.c @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), [4] = LAYOUT_ortho_3x10( - QK_BOOT, KC_BRID, KC_BRIU, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_MOD, - KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_M_B, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_RMOD, + QK_BOOT, KC_BRID, KC_BRIU, _______, RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RM_NEXT, + KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_M_B, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, RM_PREV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) }; diff --git a/keyboards/doio/kb04/keymaps/default/keymap.c b/keyboards/doio/kb04/keymaps/default/keymap.c index 7df80397fd..9203aea481 100644 --- a/keyboards/doio/kb04/keymaps/default/keymap.c +++ b/keyboards/doio/kb04/keymaps/default/keymap.c @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(_LAY1), KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE ), [_LAY1] = LAYOUT( - KC_TRNS, RGB_HUD, RGB_TOG, RGB_MOD, KC_TRNS + KC_TRNS, RM_HUED, RM_TOGG, RM_NEXT, KC_TRNS ) }; diff --git a/keyboards/doio/kb09/keymaps/default/keymap.c b/keyboards/doio/kb09/keymaps/default/keymap.c index 657a6bc428..b5a0e5f62d 100644 --- a/keyboards/doio/kb09/keymaps/default/keymap.c +++ b/keyboards/doio/kb09/keymaps/default/keymap.c @@ -42,9 +42,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_C, KC_V, C(KC_M), TO(3), KC_TRNS), [_LAY3] = LAYOUT( - KC_TRNS, RGB_SPI, RGB_SPD, RGB_HUI, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_SAI, RGB_SAD, RGB_HUD, - KC_TRNS, RGB_MOD, RGB_VAI, RGB_VAD, + KC_TRNS, RM_SPDU, RM_SPDD, RM_HUEU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_SATU, RM_SATD, RM_HUED, + KC_TRNS, RM_NEXT, RM_VALU, RM_VALD, TO(0), KC_TRNS) }; diff --git a/keyboards/doio/kb12/keymaps/default/keymap.c b/keyboards/doio/kb12/keymaps/default/keymap.c index 72360f1a8b..21786fd743 100644 --- a/keyboards/doio/kb12/keymaps/default/keymap.c +++ b/keyboards/doio/kb12/keymaps/default/keymap.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAY4] = LAYOUT( TO(5), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_LAY5] = LAYOUT( - TO(0), RGB_TOG, RGB_MOD, RGB_SPI, RGB_SPD, RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS) + TO(0), RM_TOGG, RM_NEXT, RM_SPDU, RM_SPDD, RM_SATU, RM_SATD, RM_HUEU, RM_HUED, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/doio/kb16/keymaps/default/keymap.c b/keyboards/doio/kb16/keymaps/default/keymap.c index fc1f1dcfaa..9e6c0e8662 100644 --- a/keyboards/doio/kb16/keymaps/default/keymap.c +++ b/keyboards/doio/kb16/keymaps/default/keymap.c @@ -115,10 +115,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ /* Row: 0 1 2 3 4 */ [_FN2] = LAYOUT( - RGB_SPI, RGB_SPD, _______, QK_BOOT, _______, - RGB_SAI, RGB_SAD, _______, _______, TO(_BASE), - RGB_TOG, RGB_MOD, RGB_HUI, _______, _______, - _______, RGB_VAI, RGB_HUD, RGB_VAD + RM_SPDU, RM_SPDD, _______, QK_BOOT, _______, + RM_SATU, RM_SATD, _______, _______, TO(_BASE), + RM_TOGG, RM_NEXT, RM_HUEU, _______, _______, + _______, RM_VALU, RM_HUED, RM_VALD ), }; diff --git a/keyboards/doio/kb30/keymaps/default/keymap.c b/keyboards/doio/kb30/keymaps/default/keymap.c index 2e385d24e3..855fba1697 100644 --- a/keyboards/doio/kb30/keymaps/default/keymap.c +++ b/keyboards/doio/kb30/keymaps/default/keymap.c @@ -47,11 +47,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(3), KC_TRNS), [_LAY3] = LAYOUT( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_SPI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_SPD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_SPDU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, - KC_TRNS, KC_TRNS, RGB_VAD, RGB_TOG, RGB_VAI, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, + KC_TRNS, KC_TRNS, RM_VALD, RM_TOGG, RM_VALU, KC_TRNS, TO(0), KC_TRNS) }; diff --git a/keyboards/doio/kb38/keymaps/default/keymap.c b/keyboards/doio/kb38/keymaps/default/keymap.c index 96a548e512..6f5304c004 100644 --- a/keyboards/doio/kb38/keymaps/default/keymap.c +++ b/keyboards/doio/kb38/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └───────┴───┴───┘└───┴───┴───┘└───────────┘ */ [_QWERTY] = LAYOUT( - MO(1), KC_BSPC, RGB_RMOD, RGB_TOG, RGB_MOD, KC_F1, KC_F2, KC_F3, + MO(1), KC_BSPC, RM_PREV, RM_TOGG, RM_NEXT, KC_F1, KC_F2, KC_F3, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_PAUS, KC_SCRL, KC_PSCR, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_INS, KC_HOME, KC_PGUP, KC_HOME, KC_END, KC_P4, KC_P5, KC_P6, KC_END, KC_DEL, KC_PGDN, @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT ), [_LAYERTWO] = LAYOUT( - _______, KC_BSPC, RGB_RMOD, RGB_TOG, RGB_MOD, KC_A, QK_RBT, QK_BOOT, + _______, KC_BSPC, RM_PREV, RM_TOGG, RM_NEXT, KC_A, QK_RBT, QK_BOOT, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_PAUS, KC_SCRL, KC_PSCR, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_INS, KC_HOME, KC_PGUP, KC_HOME, KC_END, KC_P4, KC_P5, KC_P6, KC_END, KC_DEL, KC_PGDN, diff --git a/keyboards/doio/kb3x/keymaps/default/keymap.c b/keyboards/doio/kb3x/keymaps/default/keymap.c index 934019e8cf..02dddfe517 100644 --- a/keyboards/doio/kb3x/keymaps/default/keymap.c +++ b/keyboards/doio/kb3x/keymaps/default/keymap.c @@ -26,7 +26,7 @@ enum layer_names { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAY0] = LAYOUT( - TO(1), RGB_MOD, RGB_TOG, RGB_HUI, RGB_VAD, RGB_VAI, + TO(1), RM_NEXT, RM_TOGG, RM_HUEU, RM_VALD, RM_VALU, KC_MPLY, KC_UP, KC_UP, KC_MNXT, KC_TRNS, KC_MPRV, A(KC_LEFT), KC_TRNS, A(KC_RIGHT), KC_RIGHT, KC_TRNS, KC_LEFT, KC_MPLY, KC_DOWN, KC_DOWN), diff --git a/keyboards/doro67/rgb/keymaps/default/keymap.c b/keyboards/doro67/rgb/keymaps/default/keymap.c index ca9ec2e612..bc4485af66 100644 --- a/keyboards/doro67/rgb/keymaps/default/keymap.c +++ b/keyboards/doro67/rgb/keymaps/default/keymap.c @@ -59,8 +59,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_65_ansi_blocker( 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, _______, _______, QMKBEST, QMKURL, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), }; diff --git a/keyboards/dotmod/dymium65/keymaps/default/keymap.c b/keyboards/dotmod/dymium65/keymaps/default/keymap.c index e18c3b5b23..23e50f2907 100644 --- a/keyboards/dotmod/dymium65/keymaps/default/keymap.c +++ b/keyboards/dotmod/dymium65/keymaps/default/keymap.c @@ -39,10 +39,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FN] = LAYOUT( KC_GRAVE, 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_BACKSPACE, KC_TRNS, - RGB_TOG, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, RGB_HUI, RGB_HUD, KC_BACKSLASH, KC_TRNS, - KC_CAPS_LOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, RGB_SAD, RGB_SAI, KC_ENTER, KC_TRNS, - KC_LEFT_SHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, MO(_LN), KC_SLASH, KC_RIGHT_SHIFT, RGB_VAI, - KC_LEFT_CTRL, KC_LEFT_GUI, KC_LEFT_ALT, KC_SPACE, RGB_MOD, _______, KC_RIGHT_CTRL, RGB_SPD, RGB_VAD, RGB_SPI + RM_TOGG, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, RM_HUEU, RM_HUED, KC_BACKSLASH, KC_TRNS, + KC_CAPS_LOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, RM_SATD, RM_SATU, KC_ENTER, KC_TRNS, + KC_LEFT_SHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, MO(_LN), KC_SLASH, KC_RIGHT_SHIFT, RM_VALU, + KC_LEFT_CTRL, KC_LEFT_GUI, KC_LEFT_ALT, KC_SPACE, RM_NEXT, _______, KC_RIGHT_CTRL, RM_SPDD, RM_VALD, RM_SPDU ), [_LN] = LAYOUT( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BACKSPACE, KC_TRNS, @@ -64,8 +64,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_BASE] = { ENCODER_CCW_CW(KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP) }, - [_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, - [_LN] = { ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, - [_MT] = { ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }, + [_FN] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) }, + [_LN] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [_MT] = { ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, }; #endif diff --git a/keyboards/dp3000/keymaps/default/keymap.c b/keyboards/dp3000/keymaps/default/keymap.c index 6d3561edbc..1455e153ef 100644 --- a/keyboards/dp3000/keymaps/default/keymap.c +++ b/keyboards/dp3000/keymaps/default/keymap.c @@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, _______, KC_1, KC_2, KC_3, KC_4, - TO(0), TO(2), TO(3), RGB_TOG + TO(0), TO(2), TO(3), RM_TOGG ), [2] = LAYOUT( _______, _______, @@ -50,9 +50,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; #if defined (ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_HUD, RGB_HUI) }, - [1] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, - [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }, - [3] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT)}, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RM_HUED, RM_HUEU) }, + [1] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [2] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, + [3] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT)}, }; #endif diff --git a/keyboards/dp60/keymaps/default/keymap.c b/keyboards/dp60/keymaps/default/keymap.c index 3d49bd268f..0054aef212 100644 --- a/keyboards/dp60/keymaps/default/keymap.c +++ b/keyboards/dp60/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_60_ansi_split_bs_rshift( _______, 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_PSCR, - QK_BOOT, RGB_TOG,RGB_MOD,_______,KC_F13,KC_F14,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______, + QK_BOOT, RM_TOGG,RM_NEXT,_______,KC_F13,KC_F14,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______, _______, _______,_______,_______,_______,_______,KC_LEFT,KC_DOWN, KC_UP,KC_RIGHT,KC_HOME,KC_END,_______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______, _______, _______,_______,TG(0),_______), diff --git a/keyboards/dtisaac/dosa40rgb/keymaps/default/keymap.c b/keyboards/dtisaac/dosa40rgb/keymaps/default/keymap.c index 38db55938a..e9038537f2 100644 --- a/keyboards/dtisaac/dosa40rgb/keymaps/default/keymap.c +++ b/keyboards/dtisaac/dosa40rgb/keymaps/default/keymap.c @@ -45,8 +45,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [_L2] = LAYOUT( - RGB_TOG, RGB_RMOD, KC_UP, RGB_MOD, RGB_HUI, RGB_VAI, RGB_SAI, RGB_SPI, KC_TRNS, OU_USB, OU_BT, KC_TRNS, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RGB_HUD, RGB_VAD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_BSLS, + RM_TOGG, RM_PREV, KC_UP, RM_NEXT, RM_HUEU, RM_VALU, RM_SATU, RM_SPDU, KC_TRNS, OU_USB, OU_BT, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RM_HUED, RM_VALD, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/ducky/one2mini/keymaps/ansi/keymap.c b/keyboards/ducky/one2mini/keymaps/ansi/keymap.c index 8ea4a1729f..2b42eb6e95 100644 --- a/keyboards/ducky/one2mini/keymaps/ansi/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/ansi/keymap.c @@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLOUR] = LAYOUT_60_ansi( // 2 3 4 5 6 7 8 9 10 11 12 13 14 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_TOG, _______, _______, _______, _______ + _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, + _______, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_TOGG, _______, _______, _______, _______ ), }; diff --git a/keyboards/ducky/one2mini/keymaps/default/keymap.c b/keyboards/ducky/one2mini/keymaps/default/keymap.c index 537c5a420e..d8941bacdc 100644 --- a/keyboards/ducky/one2mini/keymaps/default/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/default/keymap.c @@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLOUR] = LAYOUT_all( // 2 3 4 5 6 7 8 9 10 11 12 13 14 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_TOG, _______, _______, _______, _______ + _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_TOGG, _______, _______, _______, _______ ), }; diff --git a/keyboards/ducky/one2mini/keymaps/iso/keymap.c b/keyboards/ducky/one2mini/keymaps/iso/keymap.c index 1c653d0fd5..585655d554 100644 --- a/keyboards/ducky/one2mini/keymaps/iso/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/iso/keymap.c @@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLOUR] = LAYOUT_60_iso( // 2 3 4 5 6 7 8 9 10 11 12 13 14 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_TOG, _______, _______, _______, _______ + _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_TOGG, _______, _______, _______, _______ ), }; diff --git a/keyboards/ducky/one2sf/keymaps/default/keymap.c b/keyboards/ducky/one2sf/keymaps/default/keymap.c index 044b5067f6..bfa354f508 100644 --- a/keyboards/ducky/one2sf/keymaps/default/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUSE, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, KC_END, _______, _______, KC_END, - _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, _______, + _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c b/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c index 089f5f5f07..fd65bd543a 100644 --- a/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_END, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c b/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c index be678520e6..94963fcab5 100644 --- a/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, KC_HOME, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, _______, KC_END, - _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, _______, + _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/dumbpad/v3x/keymaps/default/keymap.c b/keyboards/dumbpad/v3x/keymaps/default/keymap.c index 0c65fac187..bbd9687ea9 100644 --- a/keyboards/dumbpad/v3x/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v3x/keymaps/default/keymap.c @@ -50,10 +50,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \-----------------------------------------------------' */ [1] = LAYOUT( - RGB_TOG, RGB_VAD, RGB_VAI, QK_BOOT, - KC_NO, RGB_HUD, RGB_HUI, KC_NO, - KC_NO, RGB_SAD, RGB_SAI, KC_NO, - KC_NO, _______, RGB_SPD, RGB_SPI, KC_NO + RM_TOGG, RM_VALD, RM_VALU, QK_BOOT, + KC_NO, RM_HUED, RM_HUEU, KC_NO, + KC_NO, RM_SATD, RM_SATU, KC_NO, + KC_NO, _______, RM_SPDD, RM_SPDU, KC_NO ), }; // clang-format on diff --git a/keyboards/durgod/dgk6x/galaxy/keymaps/default/keymap.json b/keyboards/durgod/dgk6x/galaxy/keymaps/default/keymap.json index 83b285786d..c6834b5660 100644 --- a/keyboards/durgod/dgk6x/galaxy/keymaps/default/keymap.json +++ b/keyboards/durgod/dgk6x/galaxy/keymaps/default/keymap.json @@ -20,20 +20,20 @@ "KC_TRNS", "GU_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS", "KC_TRNS" ], [ - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_RMOD","RGB_MOD", "RGB_TOG", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_PREV", "RM_NEXT", "RM_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_VALU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "RM_SPDD", "RM_VALD", "RM_SPDU" ], [ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_SAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_HUD", "RGB_SAD", "RGB_HUI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_SATU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_HUED", "RM_SATD", "RM_HUEU" ] ], "author":"dkjer", diff --git a/keyboards/durgod/dgk6x/hades_ansi/keymaps/default/keymap.json b/keyboards/durgod/dgk6x/hades_ansi/keymaps/default/keymap.json index fc2a11b35c..c19a834337 100644 --- a/keyboards/durgod/dgk6x/hades_ansi/keymaps/default/keymap.json +++ b/keyboards/durgod/dgk6x/hades_ansi/keymaps/default/keymap.json @@ -18,18 +18,18 @@ "KC_TRNS", "GU_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_APP", "KC_TRNS", "KC_TRNS" ], [ - "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MUTE", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_RMOD", "KC_TRNS", + "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MUTE", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_TOGG", "RM_NEXT", "RM_PREV", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_VALU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS", "RM_SPDD", "RM_VALD", "RM_SPDU" ], [ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_SAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_HUD", "RGB_SAD", "RGB_HUI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_SATU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_HUED", "RM_SATD", "RM_HUEU" ] ], "author":"J-Sully", diff --git a/keyboards/durgod/dgk6x/hades_iso/keymaps/default/keymap.json b/keyboards/durgod/dgk6x/hades_iso/keymaps/default/keymap.json index f3ecd2cc9b..987886e72d 100644 --- a/keyboards/durgod/dgk6x/hades_iso/keymaps/default/keymap.json +++ b/keyboards/durgod/dgk6x/hades_iso/keymaps/default/keymap.json @@ -18,18 +18,18 @@ "KC_TRNS", "GU_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_APP", "KC_TRNS", "KC_TRNS" ], [ - "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MUTE", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_RMOD", "KC_TRNS", + "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MUTE", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_TOGG", "RM_NEXT", "RM_PREV", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_VALU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS", "RM_SPDD", "RM_VALD", "RM_SPDU" ], [ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_SAI", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_HUD", "RGB_SAD", "RGB_HUI" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_SATU", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_HUED", "RM_SATD", "RM_HUEU" ] ], "author":"ebastler", diff --git a/keyboards/durgod/dgk6x/venus/keymaps/default/keymap.json b/keyboards/durgod/dgk6x/venus/keymaps/default/keymap.json index ff3f85d9e4..8acd302a05 100644 --- a/keyboards/durgod/dgk6x/venus/keymaps/default/keymap.json +++ b/keyboards/durgod/dgk6x/venus/keymaps/default/keymap.json @@ -18,16 +18,16 @@ "KC_TRNS", "GU_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS" ], [ - "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_MUTE", "KC_VOLD", "KC_VOLU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_RMOD", - "KC_TRNS", "KC_TRNS", "RGB_VAI", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "RGB_SPD", "RGB_VAD", "RGB_SPI", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_MPLY", "KC_MSTP", "KC_MPRV", "KC_MNXT", "KC_MUTE", "KC_VOLD", "KC_VOLU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_TOGG", "RM_NEXT", "RM_PREV", + "KC_TRNS", "KC_TRNS", "RM_VALU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "RM_SPDD", "RM_VALD", "RM_SPDU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "MO(3)", "KC_TRNS", "KC_TRNS" ], [ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", - "XXXXXXX", "XXXXXXX", "RGB_SAI", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", - "XXXXXXX", "RGB_HUD", "RGB_SAD", "RGB_HUI", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "RM_SATU", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", + "XXXXXXX", "RM_HUED", "RM_SATD", "RM_HUEU", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "KC_TRNS", "KC_TRNS", "XXXXXXX" ] diff --git a/keyboards/dztech/dz60rgb/keymaps/default/keymap.c b/keyboards/dztech/dz60rgb/keymaps/default/keymap.c index 87e64544e0..b98886ed1d 100644 --- a/keyboards/dztech/dz60rgb/keymaps/default/keymap.c +++ b/keyboards/dztech/dz60rgb/keymaps/default/keymap.c @@ -17,8 +17,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT( _______, 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, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, EE_CLR, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/dztech/dz60rgb_ansi/keymaps/default/keymap.c b/keyboards/dztech/dz60rgb_ansi/keymaps/default/keymap.c index 339d2fa428..b13c115528 100644 --- a/keyboards/dztech/dz60rgb_ansi/keymaps/default/keymap.c +++ b/keyboards/dztech/dz60rgb_ansi/keymaps/default/keymap.c @@ -17,8 +17,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT_60_ansi( _______, 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, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/dztech/dz60rgb_wkl/keymaps/default/keymap.c b/keyboards/dztech/dz60rgb_wkl/keymaps/default/keymap.c index a1bbe830e3..7382750d16 100644 --- a/keyboards/dztech/dz60rgb_wkl/keymaps/default/keymap.c +++ b/keyboards/dztech/dz60rgb_wkl/keymaps/default/keymap.c @@ -17,8 +17,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT_60_ansi_tsangan_split_bs_rshift( _______, 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, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/dztech/dz64rgb/keymaps/default/keymap.c b/keyboards/dztech/dz64rgb/keymaps/default/keymap.c index 032473f88f..6d9b275513 100644 --- a/keyboards/dztech/dz64rgb/keymaps/default/keymap.c +++ b/keyboards/dztech/dz64rgb/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT_64_ansi( _______, 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, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, EE_CLR, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/dztech/dz65rgb/keymaps/default/keymap.c b/keyboards/dztech/dz65rgb/keymaps/default/keymap.c index 548d55799a..ae73fdc0a7 100644 --- a/keyboards/dztech/dz65rgb/keymaps/default/keymap.c +++ b/keyboards/dztech/dz65rgb/keymaps/default/keymap.c @@ -10,8 +10,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi( QK_GESC, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - CTL_T(KC_CAPS), RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, KC_PGDN, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + CTL_T(KC_CAPS), RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, KC_PGDN, KC_LSFT, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/dztech/tofu/ii/keymaps/default/keymap.c b/keyboards/dztech/tofu/ii/keymaps/default/keymap.c index 2f5a6316e4..f6c9387968 100644 --- a/keyboards/dztech/tofu/ii/keymaps/default/keymap.c +++ b/keyboards/dztech/tofu/ii/keymaps/default/keymap.c @@ -25,8 +25,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT( QK_GESC, 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_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/dztech/tofu/jr/keymaps/default/keymap.c b/keyboards/dztech/tofu/jr/keymaps/default/keymap.c index 406c8f7fd5..cf7b90b55a 100644 --- a/keyboards/dztech/tofu/jr/keymaps/default/keymap.c +++ b/keyboards/dztech/tofu/jr/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi( QK_GESC, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - KC_CAPS, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, KC_PGDN, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + KC_CAPS, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, KC_PGDN, KC_LSFT, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ), diff --git a/keyboards/eek/keymaps/ledtest/keymap.c b/keyboards/eek/keymaps/ledtest/keymap.c index 3a6cc6f38c..232f928be4 100644 --- a/keyboards/eek/keymaps/ledtest/keymap.c +++ b/keyboards/eek/keymaps/ledtest/keymap.c @@ -44,9 +44,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * */ [_QUERTY] = LAYOUT_split_3x5_3( - KC_Q, KC_W, KC_E, KC_R, KC_T, RGBRST, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, - KC_A, KC_S, KC_D, KC_F, KC_G, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, - KC_Z, KC_X, KC_C, KC_V, KC_B, RGB_TOG, KC_M, KC_COMM, KC_DOT, KC_SLSH, + KC_Q, KC_W, KC_E, KC_R, KC_T, RGBRST, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, + KC_A, KC_S, KC_D, KC_F, KC_G, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, + KC_Z, KC_X, KC_C, KC_V, KC_B, RM_TOGG, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LCTL, MO(_LOWER), KC_SPC, KC_BSPC, MO(_RAISE), OSM(MOD_LSFT) ), @@ -65,8 +65,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_ADJUST] = LAYOUT_split_3x5_3( - RGB_VAI, RGB_SAI, RGB_HUI, RGB_MOD, RGB_TOG, _______, KC_F9, KC_F10, KC_F11, KC_F12, - RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, _______, _______, KC_F5, KC_F6, KC_F7, KC_F8, + RM_VALU, RM_SATU, RM_HUEU, RM_NEXT, RM_TOGG, _______, KC_F9, KC_F10, KC_F11, KC_F12, + RM_VALD, RM_SATD, RM_HUED, RM_PREV, _______, _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/eggsworks/egg58/keymaps/default/keymap.c b/keyboards/eggsworks/egg58/keymaps/default/keymap.c index 482a34c129..aa46b90955 100644 --- a/keyboards/eggsworks/egg58/keymaps/default/keymap.c +++ b/keyboards/eggsworks/egg58/keymaps/default/keymap.c @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_F12, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_HOME, KC_TRNS, KC_END, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SAI, RGB_VAI, KC_DEL, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPI, RGB_MOD, RGB_TOG + KC_TRNS, KC_HOME, KC_TRNS, KC_END, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, RM_HUEU, RM_SATU, RM_VALU, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU, RM_NEXT, RM_TOGG ) }; diff --git a/keyboards/ein_60/keymaps/default/keymap.c b/keyboards/ein_60/keymaps/default/keymap.c index 038e8ce19a..0df24cdcb6 100644 --- a/keyboards/ein_60/keymaps/default/keymap.c +++ b/keyboards/ein_60/keymaps/default/keymap.c @@ -92,8 +92,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------' `------' `-----------------------------------------' */ [_ADJUST] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, RGBRST, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,RGB_VAD, RGB_SAD, RGB_HUD, RGB_TOG, + _______, _______, _______, _______, _______, _______, _______, RGBRST, RM_NEXT, RM_VALU, RM_SATU, RM_HUEU, _______, + _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_SATD, RM_HUED, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT ), diff --git a/keyboards/enviousdesign/delirium/rgb/keymaps/default/keymap.c b/keyboards/enviousdesign/delirium/rgb/keymaps/default/keymap.c index d791874aff..1152fc70b3 100644 --- a/keyboards/enviousdesign/delirium/rgb/keymaps/default/keymap.c +++ b/keyboards/enviousdesign/delirium/rgb/keymaps/default/keymap.c @@ -30,11 +30,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_iso( QK_BOOTLOADER, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_MUTE, KC_VOLD, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_SAI, RGB_VAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MYCM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_SAD, RGB_VAD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, RGB_SPD, RGB_HUD + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, RM_SATU, RM_VALU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MYCM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SATD, RM_VALD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, RM_SPDD, RM_HUED ) }; diff --git a/keyboards/era/linx3/fave65s/keymaps/default/keymap.c b/keyboards/era/linx3/fave65s/keymaps/default/keymap.c index 85eb4fb4ee..278b466c9e 100644 --- a/keyboards/era/linx3/fave65s/keymaps/default/keymap.c +++ b/keyboards/era/linx3/fave65s/keymaps/default/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_TOGG, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/era/sirind/brick65/keymaps/default/keymap.c b/keyboards/era/sirind/brick65/keymaps/default/keymap.c index f77a7aabff..7d55b76632 100644 --- a/keyboards/era/sirind/brick65/keymaps/default/keymap.c +++ b/keyboards/era/sirind/brick65/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TILD, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, RM_TOGG, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/era/sirind/tomak/keymaps/default/keymap.c b/keyboards/era/sirind/tomak/keymaps/default/keymap.c index 62941ff8b7..bf070bd9fa 100644 --- a/keyboards/era/sirind/tomak/keymaps/default/keymap.c +++ b/keyboards/era/sirind/tomak/keymaps/default/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c index 3823cc69c3..7a1edcb15f 100644 --- a/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c +++ b/keyboards/era/sirind/tomak/keymaps/default_ansi/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c index 87f3072a9e..20d99d5fa7 100644 --- a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c +++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_bs/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c index 6b8fb56e33..e5d064cb47 100644 --- a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c +++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c index 380689dd46..c85224d234 100644 --- a/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c +++ b/keyboards/era/sirind/tomak/keymaps/default_ansi_split_rshift_bs/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/evyd13/atom47/keymaps/default/keymap.c b/keyboards/evyd13/atom47/keymaps/default/keymap.c index bba4b99929..f00d689813 100644 --- a/keyboards/evyd13/atom47/keymaps/default/keymap.c +++ b/keyboards/evyd13/atom47/keymaps/default/keymap.c @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_PN] = LAYOUT_split_space( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT), }; diff --git a/keyboards/fancytech/fancyalice66/keymaps/default/keymap.c b/keyboards/fancytech/fancyalice66/keymaps/default/keymap.c index 0fed76c1b3..7ce470a71c 100644 --- a/keyboards/fancytech/fancyalice66/keymaps/default/keymap.c +++ b/keyboards/fancytech/fancyalice66/keymaps/default/keymap.c @@ -41,9 +41,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QK_BOOT, KC_PSCR, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, RGB_SAD, RGB_TOG, RGB_HUI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, - _______, _______, _______, _______, _______, RGB_MOD, _______, RGB_VAD, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATU, RM_SATD, RM_TOGG, RM_HUEU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, RM_NEXT, _______, RM_VALD, _______ ) }; \ No newline at end of file diff --git a/keyboards/ferris/keymaps/default/keymap.json b/keyboards/ferris/keymaps/default/keymap.json index cc156df246..3f927ae5b1 100644 --- a/keyboards/ferris/keymaps/default/keymap.json +++ b/keyboards/ferris/keymaps/default/keymap.json @@ -50,8 +50,8 @@ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_MINS" , "KC_BSLS" , "KC_GRV" , "KC_TRNS", - "RGB_RMOD" , "KC_TRNS", - "KC_TRNS" , "RGB_MOD" + "RM_PREV" , "KC_TRNS", + "KC_TRNS" , "RM_NEXT" ], ["KC_TRNS" , "KC_COLN" , "KC_LT" , "KC_GT" , "KC_SCLN", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", diff --git a/keyboards/flashquark/horizon_z/keymaps/default/keymap.c b/keyboards/flashquark/horizon_z/keymaps/default/keymap.c index 5b8838c3b2..eb2dbdc22d 100755 --- a/keyboards/flashquark/horizon_z/keymaps/default/keymap.c +++ b/keyboards/flashquark/horizon_z/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL), [_LAYER1] = LAYOUT_60_ansi( /* FN */ QK_GESC, 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_TRNS, RGB_TOG, KC_UP, RGB_MOD, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT , + KC_TRNS, RM_TOGG, KC_UP, RM_NEXT, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT , KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_MPRV, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), diff --git a/keyboards/frooastboard/walnut/keymaps/default/keymap.c b/keyboards/frooastboard/walnut/keymaps/default/keymap.c index 57058d5de7..bb0e702389 100644 --- a/keyboards/frooastboard/walnut/keymaps/default/keymap.c +++ b/keyboards/frooastboard/walnut/keymaps/default/keymap.c @@ -13,8 +13,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [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, EE_CLR, KC_PSCR, KC_SCRL, KC_PAUS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, RGB_HUI, RGB_SPI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_VAD, RGB_MOD) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SATU, RM_HUEU, RM_SPDU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_VALD, RM_NEXT) }; diff --git a/keyboards/frooastboard/walnut/keymaps/default_ansi/keymap.c b/keyboards/frooastboard/walnut/keymaps/default_ansi/keymap.c index b9abd07d7d..d785c66438 100644 --- a/keyboards/frooastboard/walnut/keymaps/default_ansi/keymap.c +++ b/keyboards/frooastboard/walnut/keymaps/default_ansi/keymap.c @@ -13,8 +13,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_nofrow_ansi( 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, EE_CLR, KC_PSCR, KC_SCRL, KC_PAUS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, RGB_HUI, RGB_SPI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_VAD, RGB_MOD) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SATU, RM_HUEU, RM_SPDU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_VALD, RM_NEXT) }; diff --git a/keyboards/frooastboard/walnut/keymaps/default_iso/keymap.c b/keyboards/frooastboard/walnut/keymaps/default_iso/keymap.c index e6dd393f15..e8380f5e2a 100644 --- a/keyboards/frooastboard/walnut/keymaps/default_iso/keymap.c +++ b/keyboards/frooastboard/walnut/keymaps/default_iso/keymap.c @@ -13,8 +13,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_nofrow_iso( 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, EE_CLR, KC_PSCR, KC_SCRL, KC_PAUS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, RGB_HUI, RGB_SPI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_VAD, RGB_MOD) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SATU, RM_HUEU, RM_SPDU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_VALD, RM_NEXT) }; diff --git a/keyboards/fs_streampad/keymaps/default/keymap.c b/keyboards/fs_streampad/keymaps/default/keymap.c index 15997a0839..bcbeaa0686 100644 --- a/keyboards/fs_streampad/keymaps/default/keymap.c +++ b/keyboards/fs_streampad/keymaps/default/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( - RGB_TOG, RGB_MOD, RGB_RMOD, + RM_TOGG, RM_NEXT, RM_PREV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) diff --git a/keyboards/geekboards/tester/keymaps/default/keymap.c b/keyboards/geekboards/tester/keymaps/default/keymap.c index acf63cb36a..8412a3c550 100644 --- a/keyboards/geekboards/tester/keymaps/default/keymap.c +++ b/keyboards/geekboards/tester/keymaps/default/keymap.c @@ -1,7 +1,7 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - RGB_MOD, KC_1, KC_2, KC_3, + RM_NEXT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, MO(1) ), [1] = LAYOUT( /* Base */ diff --git a/keyboards/gh60/satan/keymaps/isoHHKB/keymap.c b/keyboards/gh60/satan/keymaps/isoHHKB/keymap.c index b0ec4a72cd..524b1b1b3f 100644 --- a/keyboards/gh60/satan/keymaps/isoHHKB/keymap.c +++ b/keyboards/gh60/satan/keymaps/isoHHKB/keymap.c @@ -51,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FL] = LAYOUT_60_iso_split_rshift( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_PSCR, QK_BOOT, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_CAPS, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, RGB_TOG, RGB_MOD, RGB_M_B, RGB_VAI, RGB_VAD, BL_UP, BL_DOWN, _______, + KC_CAPS, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, UG_TOGG, UG_NEXT, RGB_M_B, UG_VALU, UG_VALD, BL_UP, BL_DOWN, _______, _______, _______, _______, _______, KC_CEDL, _______, BL_TOGG, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, _______, _______, _______, _______ ) diff --git a/keyboards/gizmo_engineering/gk6/keymaps/12x5/keymap.c b/keyboards/gizmo_engineering/gk6/keymaps/12x5/keymap.c index 374152b945..5c9208aacf 100755 --- a/keyboards/gizmo_engineering/gk6/keymaps/12x5/keymap.c +++ b/keyboards/gizmo_engineering/gk6/keymaps/12x5/keymap.c @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, KC_PIPE, KC_BSLS, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, KC_PIPE, KC_BSLS, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/gizmo_engineering/gk6/keymaps/1x2u/keymap.c b/keyboards/gizmo_engineering/gk6/keymaps/1x2u/keymap.c index b303032171..eac0406751 100755 --- a/keyboards/gizmo_engineering/gk6/keymaps/1x2u/keymap.c +++ b/keyboards/gizmo_engineering/gk6/keymaps/1x2u/keymap.c @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, KC_PIPE, KC_BSLS, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, KC_PIPE, KC_BSLS, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/gizmo_engineering/gk6/keymaps/default/keymap.c b/keyboards/gizmo_engineering/gk6/keymaps/default/keymap.c index b0e1615479..041353b5a8 100755 --- a/keyboards/gizmo_engineering/gk6/keymaps/default/keymap.c +++ b/keyboards/gizmo_engineering/gk6/keymaps/default/keymap.c @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, KC_PIPE, KC_BSLS, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, KC_PIPE, KC_BSLS, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT ), diff --git a/keyboards/gkeyboard/gpad8_2r/keymaps/default/keymap.c b/keyboards/gkeyboard/gpad8_2r/keymaps/default/keymap.c index 536a1ee7d8..7ad050edb9 100644 --- a/keyboards/gkeyboard/gpad8_2r/keymaps/default/keymap.c +++ b/keyboards/gkeyboard/gpad8_2r/keymaps/default/keymap.c @@ -18,7 +18,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - KC_MUTE, RGB_TOG, + KC_MUTE, RM_TOGG, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H ), @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_MOD, RGB_RMOD) }, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RM_NEXT, RM_PREV) }, [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) } diff --git a/keyboards/gkeyboard/greatpad/keymaps/default/keymap.c b/keyboards/gkeyboard/greatpad/keymaps/default/keymap.c index 1fd0edc5ca..47cf419dd1 100644 --- a/keyboards/gkeyboard/greatpad/keymaps/default/keymap.c +++ b/keyboards/gkeyboard/greatpad/keymaps/default/keymap.c @@ -6,7 +6,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - KC_MUTE, RGB_TOG, + KC_MUTE, RM_TOGG, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_NUM, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PGUP, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PGDN, @@ -16,6 +16,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) }, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RM_PREV, RM_NEXT) }, }; #endif diff --git a/keyboards/gmmk/gmmk2/p65/ansi/keymaps/default/keymap.c b/keyboards/gmmk/gmmk2/p65/ansi/keymaps/default/keymap.c index 42affd3de6..2de830820a 100644 --- a/keyboards/gmmk/gmmk2/p65/ansi/keymaps/default/keymap.c +++ b/keyboards/gmmk/gmmk2/p65/ansi/keymaps/default/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_HUI, RGB_HUD, RGB_SPD, RGB_SPI, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, _______, RGB_VAI, KC_HOME, - _______, _______, _______, QK_BOOT, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD + _______, RM_HUEU, RM_HUED, RM_SPDD, RM_SPDU, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, _______, RM_VALU, KC_HOME, + _______, _______, _______, QK_BOOT, _______, _______, RM_PREV, RM_VALD, RM_NEXT ) }; diff --git a/keyboards/gmmk/gmmk2/p65/iso/keymaps/default/keymap.c b/keyboards/gmmk/gmmk2/p65/iso/keymaps/default/keymap.c index 6a3da299a2..d0f1d08fd1 100644 --- a/keyboards/gmmk/gmmk2/p65/iso/keymaps/default/keymap.c +++ b/keyboards/gmmk/gmmk2/p65/iso/keymaps/default/keymap.c @@ -39,6 +39,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, 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_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, RGB_HUD, RGB_SPD, RGB_SPI, KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, _______, RGB_VAI, KC_HOME, - _______, _______, _______, QK_BOOT, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD) + _______, _______, RM_HUEU, RM_HUED, RM_SPDD, RM_SPDU, KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, _______, RM_VALU, KC_HOME, + _______, _______, _______, QK_BOOT, _______, _______, RM_PREV, RM_VALD, RM_NEXT) }; diff --git a/keyboards/gmmk/gmmk2/p96/ansi/keymaps/default/keymap.c b/keyboards/gmmk/gmmk2/p96/ansi/keymaps/default/keymap.c index 2fc12c4f03..36a9324844 100644 --- a/keyboards/gmmk/gmmk2/p96/ansi/keymaps/default/keymap.c +++ b/keyboards/gmmk/gmmk2/p96/ansi/keymaps/default/keymap.c @@ -41,6 +41,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_HUI, RGB_HUD, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, UC_WIN, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD, _______, _______) + _______, RM_HUEU, RM_HUED, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, UC_WIN, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_NEXT, _______, _______) }; diff --git a/keyboards/gmmk/gmmk2/p96/iso/keymaps/default/keymap.c b/keyboards/gmmk/gmmk2/p96/iso/keymaps/default/keymap.c index 0f56355d09..80684a2d0b 100644 --- a/keyboards/gmmk/gmmk2/p96/iso/keymaps/default/keymap.c +++ b/keyboards/gmmk/gmmk2/p96/iso/keymaps/default/keymap.c @@ -39,6 +39,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_SAI, RGB_SAD, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, UC_WIN, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD, _______, _______) + _______, _______, RM_SATU, RM_SATD, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, UC_WIN, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_NEXT, _______, _______) }; diff --git a/keyboards/gmmk/numpad/keymaps/default/keymap.c b/keyboards/gmmk/numpad/keymaps/default/keymap.c index aa1829cdd4..b7f9ff46b3 100644 --- a/keyboards/gmmk/numpad/keymaps/default/keymap.c +++ b/keyboards/gmmk/numpad/keymaps/default/keymap.c @@ -37,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( _______, KC_PSLS, KC_PAST, KC_PMNS, - KC_P7, RGB_VAI, KC_P9, KC_PPLS, - RGB_RMOD, KC_P5, RGB_MOD, KC_CALC, - KC_P1, RGB_VAD, KC_P3, KC_PENT, - RGB_TOG, QK_BOOT + KC_P7, RM_VALU, KC_P9, KC_PPLS, + RM_PREV, KC_P5, RM_NEXT, KC_CALC, + KC_P1, RM_VALD, KC_P3, KC_PENT, + RM_TOGG, QK_BOOT ) }; diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/default/keymap.c b/keyboards/gmmk/pro/rev1/ansi/keymaps/default/keymap.c index 95f82d9a3d..5d9aab5465 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/default/keymap.c +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/default/keymap.c @@ -49,11 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, - _______, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + _______, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + _______, _______, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_PREV, RM_SPDU ), diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/default/keymap.c b/keyboards/gmmk/pro/rev1/iso/keymaps/default/keymap.c index 49752bf6a0..272c18a0df 100644 --- a/keyboards/gmmk/pro/rev1/iso/keymaps/default/keymap.c +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/default/keymap.c @@ -49,11 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, - _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_HUI, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + _______, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_HUEU, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_PREV, RM_SPDU ), diff --git a/keyboards/gmmk/pro/rev2/ansi/keymaps/default/keymap.c b/keyboards/gmmk/pro/rev2/ansi/keymaps/default/keymap.c index cbea58716e..2863121e7f 100644 --- a/keyboards/gmmk/pro/rev2/ansi/keymaps/default/keymap.c +++ b/keyboards/gmmk/pro/rev2/ansi/keymaps/default/keymap.c @@ -49,11 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, - _______, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUI, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + _______, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + _______, _______, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_PREV, RM_SPDU ), @@ -63,6 +63,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #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(RGB_VAD, RGB_VAI) } + [1] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) } }; #endif \ No newline at end of file diff --git a/keyboards/gmmk/pro/rev2/iso/keymaps/default/keymap.c b/keyboards/gmmk/pro/rev2/iso/keymaps/default/keymap.c index e22e616505..fc2abb8b17 100644 --- a/keyboards/gmmk/pro/rev2/iso/keymaps/default/keymap.c +++ b/keyboards/gmmk/pro/rev2/iso/keymaps/default/keymap.c @@ -49,11 +49,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, - _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_HUI, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI + _______, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_HUEU, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_PREV, RM_SPDU ), diff --git a/keyboards/handwired/co60/keymaps/jmdaly_hhkb_split_space/keymap.c b/keyboards/handwired/co60/keymaps/jmdaly_hhkb_split_space/keymap.c index 1d49d91346..592a6c6b97 100644 --- a/keyboards/handwired/co60/keymaps/jmdaly_hhkb_split_space/keymap.c +++ b/keyboards/handwired/co60/keymaps/jmdaly_hhkb_split_space/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_L3] = LAYOUT_60_hhkb_split_625u_space( /* Function */ QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_BRTG, BL_TOGG, BL_UP, BL_DOWN,BL_ON, BL_OFF, _______, _______, _______, _______, _______, KC_PGUP, KC_INSERT, KC_DEL, - _______, RGB_TOG, RGB_MOD, RGB_RMOD, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_HOME, KC_END, _______, + _______, UG_TOGG, UG_NEXT, UG_PREV, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_HOME, KC_END, _______, _______, BL_DOWN, _______, _______, _______, _______, _______, DF(_L1), DF(_L2), _______, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/handwired/colorlice/keymaps/default/keymap.c b/keyboards/handwired/colorlice/keymaps/default/keymap.c index 1b17cce81a..e1c827c746 100644 --- a/keyboards/handwired/colorlice/keymaps/default/keymap.c +++ b/keyboards/handwired/colorlice/keymaps/default/keymap.c @@ -18,15 +18,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_alice_split_bs( - RGB_TOG, 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_GRV, KC_BSLS, - RGB_MOD, 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_BSPC, + RM_TOGG, 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_GRV, KC_BSLS, + RM_NEXT, 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_BSPC, KC_PGDN, 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_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL), [1] = LAYOUT_alice_split_bs( _______, _______, 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_DEL, - _______, _______, _______, KC_UP, _______, _______, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD , _______, _______, + _______, _______, _______, KC_UP, _______, _______, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD , _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/handwired/dygma/raise/keymaps/ansi/keymap.c b/keyboards/handwired/dygma/raise/keymaps/ansi/keymap.c index 427b9ddb14..d3bb0f3c1a 100644 --- a/keyboards/handwired/dygma/raise/keymaps/ansi/keymap.c +++ b/keyboards/handwired/dygma/raise/keymaps/ansi/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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, - KC_LCTL, RGB_MOD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, + KC_LCTL, RM_NEXT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_BSPC, KC_ENT, KC_NO, KC_DEL ) }; diff --git a/keyboards/handwired/dygma/raise/keymaps/default/keymap.c b/keyboards/handwired/dygma/raise/keymaps/default/keymap.c index c766fb7203..9c70416539 100644 --- a/keyboards/handwired/dygma/raise/keymaps/default/keymap.c +++ b/keyboards/handwired/dygma/raise/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_ENT, 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_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_LCTL, RGB_MOD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, + KC_LCTL, RM_NEXT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_BSPC, KC_ENT, KC_NO, KC_DEL ) }; diff --git a/keyboards/handwired/dygma/raise/keymaps/iso/keymap.c b/keyboards/handwired/dygma/raise/keymaps/iso/keymap.c index 2fd0b49b0b..fe9651d031 100644 --- a/keyboards/handwired/dygma/raise/keymaps/iso/keymap.c +++ b/keyboards/handwired/dygma/raise/keymaps/iso/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_ENT, 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_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_LCTL, RGB_MOD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, + KC_LCTL, RM_NEXT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_BSPC, KC_ENT, KC_NO, KC_DEL ) }; diff --git a/keyboards/handwired/hnah108/keymaps/default/keymap.c b/keyboards/handwired/hnah108/keymaps/default/keymap.c index d2f86a7de9..530bd3d0b1 100644 --- a/keyboards/handwired/hnah108/keymaps/default/keymap.c +++ b/keyboards/handwired/hnah108/keymaps/default/keymap.c @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FN] = LAYOUT_all( - QK_BOOT, BL_STEP, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, BL_STEP, RM_TOGG, RM_NEXT, RM_PREV, RM_HUEU, RM_HUED, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/handwired/hnah40rgb/keymaps/ansi/keymap.c b/keyboards/handwired/hnah40rgb/keymaps/ansi/keymap.c index 9732c74cfc..4a21a7bfd6 100644 --- a/keyboards/handwired/hnah40rgb/keymaps/ansi/keymap.c +++ b/keyboards/handwired/hnah40rgb/keymaps/ansi/keymap.c @@ -44,8 +44,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [_L2] = LAYOUT_ansi(/* Base */ - RGB_TOG, RGB_RMOD, KC_UP, RGB_MOD, RGB_HUI, RGB_VAI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RGB_HUD, RGB_VAD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_PREV, KC_UP, RM_NEXT, RM_HUEU, RM_VALU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RM_HUED, RM_VALD, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TAB, KC_TRNS, KC_TRNS ), }; diff --git a/keyboards/handwired/hnah40rgb/keymaps/default/keymap.c b/keyboards/handwired/hnah40rgb/keymaps/default/keymap.c index 7af40caae7..6f98a272e6 100644 --- a/keyboards/handwired/hnah40rgb/keymaps/default/keymap.c +++ b/keyboards/handwired/hnah40rgb/keymaps/default/keymap.c @@ -44,8 +44,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [_L2] = LAYOUT_all(/* Base */ - RGB_TOG, RGB_RMOD, KC_UP, RGB_MOD, RGB_HUI, RGB_VAI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RGB_HUD, RGB_VAD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_BSLS, + RM_TOGG, RM_PREV, KC_UP, RM_NEXT, RM_HUEU, RM_VALU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RM_HUED, RM_VALD, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TAB, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), }; diff --git a/keyboards/handwired/p65rgb/keymaps/default/keymap.c b/keyboards/handwired/p65rgb/keymaps/default/keymap.c index 235a919130..b9d3233379 100644 --- a/keyboards/handwired/p65rgb/keymaps/default/keymap.c +++ b/keyboards/handwired/p65rgb/keymaps/default/keymap.c @@ -25,8 +25,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_APP, KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT( /* FN */ QK_GESC, 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_TRNS, KC_TRNS, KC_INS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_HOME, - CTL_T(KC_CAPS),RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_END, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_HOME, + CTL_T(KC_CAPS),RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_END, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), diff --git a/keyboards/helix/rev2/keymaps/led_test/keymap.c b/keyboards/helix/rev2/keymaps/led_test/keymap.c index 0074153ccf..a48a855e02 100644 --- a/keyboards/helix/rev2/keymaps/led_test/keymap.c +++ b/keyboards/helix/rev2/keymaps/led_test/keymap.c @@ -173,8 +173,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, QK_BOOT, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD ) }; @@ -287,7 +287,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case RGB_MOD: + case QK_UNDERGLOW_MODE_NEXT: #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { rgblight_mode(RGB_current_mode); diff --git a/keyboards/hfdkb/ac001/keymaps/default/keymap.c b/keyboards/hfdkb/ac001/keymaps/default/keymap.c index 56c767503e..6682e9d4d9 100644 --- a/keyboards/hfdkb/ac001/keymaps/default/keymap.c +++ b/keyboards/hfdkb/ac001/keymaps/default/keymap.c @@ -18,6 +18,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - RGB_MOD, KC_LCTL, KC_ENT,KC_NO,KC_NO), + RM_NEXT, KC_LCTL, KC_ENT,KC_NO,KC_NO), }; diff --git a/keyboards/horrortroll/handwired_k552/keymaps/default/led/custom_gradient.c b/keyboards/horrortroll/handwired_k552/keymaps/default/led/custom_gradient.c index 346d079a0d..f7e79f4c67 100644 --- a/keyboards/horrortroll/handwired_k552/keymaps/default/led/custom_gradient.c +++ b/keyboards/horrortroll/handwired_k552/keymaps/default/led/custom_gradient.c @@ -33,7 +33,7 @@ static hsv_t INTERPOLATE_HSV(float step, hsv_t gradient_0, hsv_t gradient_100) { color.s = gradient_0.s + step * (gradient_100.s - gradient_0.s); - // Scale V with global RGB Matrix's V, so users can still control overall brightness with RGB_VAI & RGB_VAD0 + // Scale V with global RGB Matrix's V, so users can still control overall brightness with RM_VALU & RM_VALD color.v = round((gradient_0.v + step * (gradient_100.v - gradient_0.v)) * ((float)rgb_matrix_config.hsv.v / 255)); return color; diff --git a/keyboards/hs60/v1/ansi/keymaps/default/keymap.c b/keyboards/hs60/v1/ansi/keymaps/default/keymap.c index 3d52fe4d52..2e2dd2d2a5 100644 --- a/keyboards/hs60/v1/ansi/keymaps/default/keymap.c +++ b/keyboards/hs60/v1/ansi/keymaps/default/keymap.c @@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_60_ansi( /* FN */ KC_TRNS, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT , KC_TRNS, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/hs60/v1/iso/keymaps/default/keymap.c b/keyboards/hs60/v1/iso/keymaps/default/keymap.c index 5059aabe20..f4e76108b2 100644 --- a/keyboards/hs60/v1/iso/keymaps/default/keymap.c +++ b/keyboards/hs60/v1/iso/keymaps/default/keymap.c @@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_60_iso( /* FN */ KC_TRNS, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT , + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/idobao/id42/keymaps/default/keymap.c b/keyboards/idobao/id42/keymaps/default/keymap.c index ffcef7a7ed..a3ef12a91d 100644 --- a/keyboards/idobao/id42/keymaps/default/keymap.c +++ b/keyboards/idobao/id42/keymaps/default/keymap.c @@ -76,8 +76,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [3] = LAYOUT( _______, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX, XXXXXXX, _______, - _______, RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NK_TOGG, XXXXXXX, XXXXXXX, RGB_VAI, XXXXXXX, - _______, _______, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI + _______, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NK_TOGG, XXXXXXX, XXXXXXX, RM_VALU, XXXXXXX, + _______, _______, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU ), }; diff --git a/keyboards/idobao/id61/keymaps/default/keymap.c b/keyboards/idobao/id61/keymaps/default/keymap.c index 0476f18024..f689f8ce76 100644 --- a/keyboards/idobao/id61/keymaps/default/keymap.c +++ b/keyboards/idobao/id61/keymaps/default/keymap.c @@ -40,8 +40,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [1] = LAYOUT_60_ansi( 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_UP, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_PSCR, KC_HOME, KC_END, _______, - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_PGUP, KC_PGDN, _______, + _______, _______, KC_UP, _______, _______, RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_PSCR, KC_HOME, KC_END, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______, QK_BOOT, NK_TOGG, _______, _______, KC_INS, KC_DEL, KC_UP, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT ) diff --git a/keyboards/idobao/id63/keymaps/default/keymap.c b/keyboards/idobao/id63/keymaps/default/keymap.c index c6ad7e5abf..155209eb73 100644 --- a/keyboards/idobao/id63/keymaps/default/keymap.c +++ b/keyboards/idobao/id63/keymaps/default/keymap.c @@ -40,8 +40,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [1] = LAYOUT_60_ansi_arrow( 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, - _______, RGB_TOG, KC_UP, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_PSCR, KC_SCRL, KC_PAUS, KC_INS, - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, KC_UP, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_PSCR, KC_SCRL, KC_PAUS, KC_INS, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, NK_TOGG, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ) diff --git a/keyboards/idobao/id67/keymaps/default/keymap.c b/keyboards/idobao/id67/keymaps/default/keymap.c index 55e6fd88cd..39d86abd7f 100644 --- a/keyboards/idobao/id67/keymaps/default/keymap.c +++ b/keyboards/idobao/id67/keymaps/default/keymap.c @@ -40,9 +40,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [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, _______, _______, - _______, RGB_TOG, KC_UP, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, KC_UP, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, _______, - _______, QK_BOOT, RGB_SPI, RGB_SPD, _______, KC_VOLD, KC_MUTE, KC_VOLU, KC_DEL, KC_END, KC_PGDN, _______, _______, _______, + _______, QK_BOOT, RM_SPDU, RM_SPDD, _______, KC_VOLD, KC_MUTE, KC_VOLU, KC_DEL, KC_END, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/idobao/id75/keymaps/default75/keymap.c b/keyboards/idobao/id75/keymaps/default75/keymap.c index 69865b0c0a..4ef4500c42 100644 --- a/keyboards/idobao/id75/keymaps/default75/keymap.c +++ b/keyboards/idobao/id75/keymaps/default75/keymap.c @@ -59,9 +59,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NUM, KC_SLSH, KC_ASTR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - KC_MSEL, KC_CALC, KC_MYCM, KC_MAIL, RGB_HUD, RGB_HUI, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, - KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, RGB_SAD, RGB_SAI, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, QK_BOOT, _______, _______, _______, - KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, RGB_VAD, RGB_VAI, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, - _______, _______, RGB_TOG, MO(_FN), RGB_RMOD,RGB_MOD, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ + KC_MSEL, KC_CALC, KC_MYCM, KC_MAIL, RM_HUED, RM_HUEU, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, + KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, RM_SATD, RM_SATU, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, QK_BOOT, _______, _______, _______, + KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, RM_VALD, RM_VALU, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, + _______, _______, RM_TOGG, MO(_FN), RM_PREV, RM_NEXT, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ ), }; diff --git a/keyboards/idobao/id80/v3/ansi/keymaps/default/keymap.c b/keyboards/idobao/id80/v3/ansi/keymaps/default/keymap.c index 92248393de..b2aa8515e5 100644 --- a/keyboards/idobao/id80/v3/ansi/keymaps/default/keymap.c +++ b/keyboards/idobao/id80/v3/ansi/keymaps/default/keymap.c @@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_80_ansi( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, - _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, _______, _______, KC_VOLD, + _______, RM_TOGG, _______, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, RGB_RMOD, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_PGUP, + _______, _______, _______, RM_PREV, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ) }; diff --git a/keyboards/idobao/id87/v2/keymaps/default/keymap.c b/keyboards/idobao/id87/v2/keymaps/default/keymap.c index 3910ac76bc..8e3df79ee4 100644 --- a/keyboards/idobao/id87/v2/keymaps/default/keymap.c +++ b/keyboards/idobao/id87/v2/keymaps/default/keymap.c @@ -49,10 +49,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [1] = LAYOUT_tkl_ansi( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, - _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_SAI, - _______, _______, RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, _______, + _______, RM_TOGG, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_SATU, + _______, _______, RM_PREV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU ) }; diff --git a/keyboards/idobao/montex/v1rgb/keymaps/default/keymap.c b/keyboards/idobao/montex/v1rgb/keymaps/default/keymap.c index c5c1bf7e18..bd6a7a3bb7 100755 --- a/keyboards/idobao/montex/v1rgb/keymaps/default/keymap.c +++ b/keyboards/idobao/montex/v1rgb/keymaps/default/keymap.c @@ -44,11 +44,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └───┴───────┴───┴───┘ */ [1] = LAYOUT_numpad_6x5( - QK_BOOT, RGB_TOG, RGB_MOD, KC_PSCR, KC_SCRL, - RGB_HUI, XXXXXXX, RGB_SPD, RGB_SPI, RGB_VAD, - RGB_HUD, KC_HOME, KC_UP, KC_PGUP, RGB_VAI, - RGB_SAI, KC_LEFT, XXXXXXX, KC_RGHT, - RGB_SAD, KC_END, KC_DOWN, KC_PGDN, KC_ENT, + QK_BOOT, RM_TOGG, RM_NEXT, KC_PSCR, KC_SCRL, + RM_HUEU, XXXXXXX, RM_SPDD, RM_SPDU, RM_VALD, + RM_HUED, KC_HOME, KC_UP, KC_PGUP, RM_VALU, + RM_SATU, KC_LEFT, XXXXXXX, KC_RGHT, + RM_SATD, KC_END, KC_DOWN, KC_PGDN, KC_ENT, _______, KC_INS, KC_DEL ) }; diff --git a/keyboards/idobao/montex/v2/keymaps/default/keymap.c b/keyboards/idobao/montex/v2/keymaps/default/keymap.c index db37bc72c7..cd017317f5 100755 --- a/keyboards/idobao/montex/v2/keymaps/default/keymap.c +++ b/keyboards/idobao/montex/v2/keymaps/default/keymap.c @@ -44,11 +44,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └───┴───────┴───┘───┘ */ [1] = LAYOUT_numpad_6x5( - QK_BOOT, RGB_TOG, RGB_MOD, KC_PSCR, KC_SCRL, - RGB_HUI, XXXXXXX, RGB_SPD, RGB_SPI, RGB_VAD, - RGB_HUD, KC_HOME, KC_UP, KC_PGUP, RGB_VAI, - RGB_SAI, KC_LEFT, XXXXXXX, KC_RGHT, - RGB_SAD, KC_END, KC_DOWN, KC_PGDN, KC_ENT, + QK_BOOT, RM_TOGG, RM_NEXT, KC_PSCR, KC_SCRL, + RM_HUEU, XXXXXXX, RM_SPDD, RM_SPDU, RM_VALD, + RM_HUED, KC_HOME, KC_UP, KC_PGUP, RM_VALU, + RM_SATU, KC_LEFT, XXXXXXX, KC_RGHT, + RM_SATD, KC_END, KC_DOWN, KC_PGDN, KC_ENT, _______, KC_INS, KC_DEL ) }; diff --git a/keyboards/ilumkb/simpler61/keymaps/default/keymap.c b/keyboards/ilumkb/simpler61/keymaps/default/keymap.c index bd9e605eda..d6c6a7f183 100644 --- a/keyboards/ilumkb/simpler61/keymaps/default/keymap.c +++ b/keyboards/ilumkb/simpler61/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_61_ansi( QK_GESC, 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_UP, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, QK_BOOT, + _______, _______, KC_UP, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, QK_BOOT, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, EE_CLR, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, KC_END, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/ilumkb/simpler64/keymaps/default/keymap.c b/keyboards/ilumkb/simpler64/keymaps/default/keymap.c index bc4b232480..e338fe6d76 100644 --- a/keyboards/ilumkb/simpler64/keymaps/default/keymap.c +++ b/keyboards/ilumkb/simpler64/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_64_ansi( QK_GESC, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, KC_END, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/inland/mk47/keymaps/default/keymap.c b/keyboards/inland/mk47/keymaps/default/keymap.c index dab9c63782..087ed46869 100644 --- a/keyboards/inland/mk47/keymaps/default/keymap.c +++ b/keyboards/inland/mk47/keymaps/default/keymap.c @@ -27,10 +27,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_planck_mit( - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RGB_MOD, + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RM_NEXT, KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, RGB_VAI, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, RM_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALD, KC_TRNS ), [2] = LAYOUT_planck_mit( diff --git a/keyboards/inland/v83p/keymaps/default/keymap.c b/keyboards/inland/v83p/keymaps/default/keymap.c index 359939a015..cc4ea3a480 100644 --- a/keyboards/inland/v83p/keymaps/default/keymap.c +++ b/keyboards/inland/v83p/keymaps/default/keymap.c @@ -20,12 +20,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [WIN_FN] = LAYOUT_ansi( /* FN */ - EE_CLR, KC_BRID, KC_BRIU, KC_MAIL, KC_WSCH, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RGB_TOG, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, + EE_CLR, KC_BRID, KC_BRIU, KC_MAIL, KC_WSCH, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, - _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI, RGB_HUD, - _______, GU_TOGG, _______, _______, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, RM_HUED, + _______, GU_TOGG, _______, _______, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU), [MAC_B] = LAYOUT_ansi( /* Base */ KC_ESC, KC_BRID, KC_BRIU, KC_F3, KC_F4, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_MUTE, @@ -36,20 +36,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [MAC_FN] = LAYOUT_ansi( /* FN */ - EE_CLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RGB_TOG, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, + EE_CLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, - _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RGB_VAI, RGB_HUD, - _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI) + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, RM_HUED, + _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU) }; #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(RGB_SAI, RGB_SAD) }, + [WIN_FN] = { ENCODER_CCW_CW(RM_SATU, RM_SATD) }, [MAC_B] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD) }, - [MAC_FN] = { ENCODER_CCW_CW(RGB_SAI, RGB_SAD) }, + [MAC_FN] = { ENCODER_CCW_CW(RM_SATU, RM_SATD) }, }; #endif diff --git a/keyboards/input_club/k_type/keymaps/default/keymap.c b/keyboards/input_club/k_type/keymaps/default/keymap.c index 452791b13a..94f1080475 100644 --- a/keyboards/input_club/k_type/keymaps/default/keymap.c +++ b/keyboards/input_club/k_type/keymaps/default/keymap.c @@ -14,10 +14,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [1] = LAYOUT_tkl_ansi( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_MOD, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, RM_NEXT, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, RGB_HUI, RGB_SAI, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, RM_HUEU, RM_SATU, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c b/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c index f3d83c98ae..2330caf6ff 100644 --- a/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c +++ b/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_PSCR, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_PGUP, KC_HOME, KC_TRNS, KC_VOLU, KC_BRIU, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_TRNS, KC_VOLD, KC_BRID, KC_TRNS, KC_WH_D, KC_TRNS, KC_TRNS, - RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/jadookb/jkb65/keymaps/default/keymap.c b/keyboards/jadookb/jkb65/keymaps/default/keymap.c index 14055736cd..8af9c97684 100644 --- a/keyboards/jadookb/jkb65/keymaps/default/keymap.c +++ b/keyboards/jadookb/jkb65/keymaps/default/keymap.c @@ -29,9 +29,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( 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_PSCR, - _______, RGB_RMOD, RGB_HUI, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_HUD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - GU_ON, GU_OFF, _______, RGB_TOG, _______, MO(2), RGB_SPD, RGB_VAD, RGB_SPI + _______, RM_PREV, RM_HUEU, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUED, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + GU_ON, GU_OFF, _______, RM_TOGG, _______, MO(2), RM_SPDD, RM_VALD, RM_SPDU ) }; diff --git a/keyboards/jidohun/km113/keymaps/default/keymap.c b/keyboards/jidohun/km113/keymaps/default/keymap.c index 088adc8742..31b0c64ad9 100644 --- a/keyboards/jidohun/km113/keymaps/default/keymap.c +++ b/keyboards/jidohun/km113/keymaps/default/keymap.c @@ -16,11 +16,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( EE_CLR, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_MYCM, KC_CALC, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_MOD, _______, _______, - _______, _______, _______, _______, RGB_MOD, _______, _______, KC_PSCR, KC_PGUP, KC_DEL, _______, _______, _______, _______, TO(0), _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_NEXT, _______, _______, + _______, _______, _______, _______, RM_NEXT, _______, _______, KC_PSCR, KC_PGUP, KC_DEL, _______, _______, _______, _______, TO(0), _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_PGDN, KC_END, _______, _______, _______, TO(1), _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, TO(2), _______, - _______, GU_TOGG, _______, RGB_TOG, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI,TO(3), _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, TO(2), _______, + _______, GU_TOGG, _______, RM_TOGG, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU,TO(3), _______ ), [2] = LAYOUT( diff --git a/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c b/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c index ae5f304eed..0d813f808a 100644 --- a/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c +++ b/keyboards/jlw/vault35_wkl_universal/keymaps/default/keymap.c @@ -7,7 +7,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_all( KC_Q, KC_W, KC_E, KC_R, KC_T, KC_VOLU, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_A, KC_S, KC_D, KC_F, KC_G, KC_VOLD, KC_H, KC_J, KC_K, KC_L, KC_QUOT, - KC_Z, KC_X, KC_C, KC_V, KC_B, RGB_TOG, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, + KC_Z, KC_X, KC_C, KC_V, KC_B, RM_TOGG, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ESC, MO(1), KC_ENT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_BSPC ), @@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef 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(RGB_HUD, RGB_HUI) }, - [2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } + [1] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU) }, + [2] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) } }; #endif diff --git a/keyboards/joshajohnson/hub20/keymaps/default/keymap.c b/keyboards/joshajohnson/hub20/keymaps/default/keymap.c index fe6dd37d05..970d496620 100644 --- a/keyboards/joshajohnson/hub20/keymaps/default/keymap.c +++ b/keyboards/joshajohnson/hub20/keymaps/default/keymap.c @@ -28,10 +28,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_all( QK_BOOT, _______, - RGB_TOG, RGB_RMOD, RGB_MOD, _______, - _______, RGB_VAD, RGB_VAI, _______, - _______, RGB_HUD, RGB_HUI, _______, - _______, RGB_SAD, RGB_SAI, _______, + RM_TOGG, RM_PREV, RM_NEXT, _______, + _______, RM_VALD, RM_VALU, _______, + _______, RM_HUED, RM_HUEU, _______, + _______, RM_SATD, RM_SATU, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/joshajohnson/hub20/keymaps/left_hand_numpad/keymap.c b/keyboards/joshajohnson/hub20/keymaps/left_hand_numpad/keymap.c index a7853accc5..6613a80963 100644 --- a/keyboards/joshajohnson/hub20/keymaps/left_hand_numpad/keymap.c +++ b/keyboards/joshajohnson/hub20/keymaps/left_hand_numpad/keymap.c @@ -33,10 +33,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_left_handed( QK_BOOT, _______, - RGB_TOG, RGB_RMOD, RGB_MOD, _______, - _______, RGB_VAD, RGB_VAI, _______, - RGB_HUD, RGB_HUI, _______, - _______, RGB_SAD, RGB_SAI, _______, + RM_TOGG, RM_PREV, RM_NEXT, _______, + _______, RM_VALD, RM_VALU, _______, + RM_HUED, RM_HUEU, _______, + _______, RM_SATD, RM_SATU, _______, _______, _______ ) }; diff --git a/keyboards/joshajohnson/hub20/keymaps/right_hand_numpad/keymap.c b/keyboards/joshajohnson/hub20/keymaps/right_hand_numpad/keymap.c index 78198ab951..f4ecf869c4 100644 --- a/keyboards/joshajohnson/hub20/keymaps/right_hand_numpad/keymap.c +++ b/keyboards/joshajohnson/hub20/keymaps/right_hand_numpad/keymap.c @@ -35,10 +35,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_right_handed( QK_BOOT, _______, - RGB_TOG, RGB_RMOD, RGB_MOD, _______, - _______, RGB_VAD, RGB_VAI, - _______, RGB_HUD, RGB_HUI, _______, - _______, RGB_SAD, RGB_SAI, + RM_TOGG, RM_PREV, RM_NEXT, _______, + _______, RM_VALD, RM_VALU, + _______, RM_HUED, RM_HUEU, _______, + _______, RM_SATD, RM_SATU, _______, _______, _______ ) }; diff --git a/keyboards/jukaie/jk01/keymaps/default/keymap.c b/keyboards/jukaie/jk01/keymaps/default/keymap.c index 243c782fad..10a24c45e6 100644 --- a/keyboards/jukaie/jk01/keymaps/default/keymap.c +++ b/keyboards/jukaie/jk01/keymaps/default/keymap.c @@ -46,20 +46,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(Macfn),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [Winfn] = LAYOUT( - QK_BOOT, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RGB_MOD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, + QK_BOOT, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, RM_NEXT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, KC_TRNS, - KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, KC_TRNS, + KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), [Macfn] = LAYOUT( - QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RGB_MOD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUI, + QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RM_NEXT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_HUEU, KC_TRNS, KC_TRNS, TO(Win), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TO(Mac), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), }; diff --git a/keyboards/junco/keymaps/default/keymap.c b/keyboards/junco/keymaps/default/keymap.c index 8ff3513891..8fe73e035a 100644 --- a/keyboards/junco/keymaps/default/keymap.c +++ b/keyboards/junco/keymaps/default/keymap.c @@ -118,8 +118,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT_split4x6_r1( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - RGB_SPI, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, KC_NO, KC_NO, EE_CLR, QK_RBT, DB_TOGG, QK_BOOT, KC_NO, - RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD, RGB_TOG, KC_NO, DF(_QWERTY), DF(_COLEMAK_DH), KC_NO, KC_NO, KC_NO, + RM_SPDU, RM_HUEU, RM_SATU, RM_VALU, RM_NEXT, KC_NO, KC_NO, EE_CLR, QK_RBT, DB_TOGG, QK_BOOT, KC_NO, + RM_SPDD, RM_HUED, RM_SATD, RM_VALD, RM_PREV, RM_TOGG, KC_NO, DF(_QWERTY), DF(_COLEMAK_DH), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/kapl/keymaps/default/keymap.c b/keyboards/kapl/keymaps/default/keymap.c index 376b247218..29d72582b4 100644 --- a/keyboards/kapl/keymaps/default/keymap.c +++ b/keyboards/kapl/keymaps/default/keymap.c @@ -37,11 +37,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_NO, RGB_SAI, RGB_SPI, RGB_VAI, RGB_HUI, RGB_MOD, KC_NO, KC_NO, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, RM_SATU, RM_SPDU, RM_VALU, RM_HUEU, RM_NEXT, KC_NO, KC_NO, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_NO, RGB_SAD, RGB_SPD, RGB_VAD, RGB_HUD, RGB_RMOD, KC_NO, KC_NO, KC_VOLD, KC_MPLY, KC_MNXT, KC_MPRV, KC_NO, KC_NO, + KC_NO, RM_SATD, RM_SPDD, RM_VALD, RM_HUED, RM_PREV, KC_NO, KC_NO, KC_VOLD, KC_MPLY, KC_MNXT, KC_MPRV, KC_NO, KC_NO, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_NO, KC_NO, KC_NO, KC_NO, RGB_TOG, RGB_M_P, KC_NO, KC_NO, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, RM_TOGG, RGB_M_P, KC_NO, KC_NO, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, //├────────┼────────┼────────┼────────┼────────┼─┬──────┴─┬──────┴─┐ ┌─┴──────┬─┴──────┬─┼────────┼────────┼────────┼────────┼────────┤ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO //└────────┴────────┴────────┴────────┴────────┘ └────────┴────────┘ └────────┴────────┘ └────────┴────────┴────────┴────────┴────────┘ diff --git a/keyboards/kbdcraft/adam64/keymaps/default/keymap.c b/keyboards/kbdcraft/adam64/keymaps/default/keymap.c index 0396bd77d1..cdd32beedd 100644 --- a/keyboards/kbdcraft/adam64/keymaps/default/keymap.c +++ b/keyboards/kbdcraft/adam64/keymaps/default/keymap.c @@ -29,9 +29,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_64_ansi( 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_NO, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, KC_PSCR, KC_SCRL, KC_PAUS, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SPI, RGB_SPD, KC_HOME, KC_PGUP, EE_CLR, + KC_NO, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, KC_PSCR, KC_SCRL, KC_PAUS, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RM_SPDU, RM_SPDD, KC_HOME, KC_PGUP, EE_CLR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, NK_TOGG, KC_NO, KC_NO, KC_INS, KC_END, KC_PGDN, KC_VOLU, KC_MUTE, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, RGB_MOD, KC_VOLD, RGB_TOG + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, RM_NEXT, KC_VOLD, RM_TOGG ) }; diff --git a/keyboards/kbdfans/baguette66/rgb/keymaps/default/keymap.c b/keyboards/kbdfans/baguette66/rgb/keymaps/default/keymap.c index a420edfa7b..201ea64563 100644 --- a/keyboards/kbdfans/baguette66/rgb/keymaps/default/keymap.c +++ b/keyboards/kbdfans/baguette66/rgb/keymaps/default/keymap.c @@ -25,20 +25,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN, KC_RIGHT), [1] = LAYOUT( QK_GESC, 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_GRAVE, KC_PGUP, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), [2] = LAYOUT( QK_GESC, 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_GRAVE, KC_PGUP, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), [3] = LAYOUT( QK_GESC, 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_GRAVE, KC_PGUP, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGDN, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/kbdfans/bella/rgb/keymaps/default/keymap.c b/keyboards/kbdfans/bella/rgb/keymaps/default/keymap.c index bc7955c1a8..bde7e448d9 100644 --- a/keyboards/kbdfans/bella/rgb/keymaps/default/keymap.c +++ b/keyboards/kbdfans/bella/rgb/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, + KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) diff --git a/keyboards/kbdfans/bella/rgb_iso/keymaps/default/keymap.c b/keyboards/kbdfans/bella/rgb_iso/keymaps/default/keymap.c index 5391c17755..927f88c47e 100644 --- a/keyboards/kbdfans/bella/rgb_iso/keymaps/default/keymap.c +++ b/keyboards/kbdfans/bella/rgb_iso/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) diff --git a/keyboards/kbdfans/boop65/rgb/keymaps/default/keymap.c b/keyboards/kbdfans/boop65/rgb/keymaps/default/keymap.c index 7ad5c5bf17..cafcd2152c 100644 --- a/keyboards/kbdfans/boop65/rgb/keymaps/default/keymap.c +++ b/keyboards/kbdfans/boop65/rgb/keymaps/default/keymap.c @@ -25,8 +25,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT_65_ansi_blocker( QK_GESC, 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_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), [2] = LAYOUT_65_ansi_blocker( diff --git a/keyboards/kbdfans/kbd67/mkiirgb/keymaps/default/keymap.c b/keyboards/kbdfans/kbd67/mkiirgb/keymaps/default/keymap.c index d00b74f7b6..8d7999eaab 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/keymaps/default/keymap.c +++ b/keyboards/kbdfans/kbd67/mkiirgb/keymaps/default/keymap.c @@ -10,8 +10,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT), [_LAYER1] = LAYOUT_65_ansi_blocker( /* FN */ QK_GESC, 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_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - CTL_T(KC_CAPS),RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + CTL_T(KC_CAPS),RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/kbdfans/kbd67/mkiirgb_iso/keymaps/default/keymap.c b/keyboards/kbdfans/kbd67/mkiirgb_iso/keymaps/default/keymap.c index 221cccefb4..206ed3e19d 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb_iso/keymaps/default/keymap.c +++ b/keyboards/kbdfans/kbd67/mkiirgb_iso/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_iso_blocker( QK_GESC, 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_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_PGUP, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, QK_BOOT, KC_PGDN, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_PGUP, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, QK_BOOT, KC_PGDN, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT ), diff --git a/keyboards/kbdfans/maja/keymaps/default/keymap.c b/keyboards/kbdfans/maja/keymaps/default/keymap.c index fbc0f59304..7f92ac593a 100755 --- a/keyboards/kbdfans/maja/keymaps/default/keymap.c +++ b/keyboards/kbdfans/maja/keymaps/default/keymap.c @@ -10,8 +10,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT( /* FN */ QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QK_BOOT, KC_HOME, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - CTL_T(KC_CAPS),RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU,RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + CTL_T(KC_CAPS),RM_SPDU, RM_SPDD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_PGDN, KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/keebio/bamfk1/keymaps/default/keymap.c b/keyboards/keebio/bamfk1/keymaps/default/keymap.c index 8ff3f794a5..80f296a494 100644 --- a/keyboards/keebio/bamfk1/keymaps/default/keymap.c +++ b/keyboards/keebio/bamfk1/keymaps/default/keymap.c @@ -13,7 +13,7 @@ enum layer_names { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MAIN] = LAYOUT( - RGB_MOD, // Big Switch + RM_NEXT, // Big Switch TL_LOWR, KC_MUTE // Encoder presses ), [_FN1] = LAYOUT( diff --git a/keyboards/keebio/bdn9/keymaps/default/keymap.c b/keyboards/keebio/bdn9/keymaps/default/keymap.c index dae8cb6035..4e389218f0 100644 --- a/keyboards/keebio/bdn9/keymaps/default/keymap.c +++ b/keyboards/keebio/bdn9/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [0] = LAYOUT( KC_MUTE, KC_HOME, KC_MPLY, - MO(1) , KC_UP , RGB_MOD, + MO(1) , KC_UP , RM_NEXT, KC_LEFT, KC_DOWN, KC_RGHT ), /* @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [1] = LAYOUT( QK_BOOT , BL_STEP, KC_STOP, - _______, KC_HOME, RGB_MOD, + _______, KC_HOME, RM_NEXT, KC_MPRV, KC_END , KC_MNXT ), }; diff --git a/keyboards/keebio/bdn9/keymaps/test/keymap.c b/keyboards/keebio/bdn9/keymaps/test/keymap.c index ecf7338a57..67eecf967f 100644 --- a/keyboards/keebio/bdn9/keymaps/test/keymap.c +++ b/keyboards/keebio/bdn9/keymaps/test/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, - KC_G, KC_H, RGB_MOD + KC_G, KC_H, RM_NEXT ), }; diff --git a/keyboards/keebio/cepstrum/keymaps/default/keymap.c b/keyboards/keebio/cepstrum/keymaps/default/keymap.c index e8fc2e29c9..5bbd5a79ec 100644 --- a/keyboards/keebio/cepstrum/keymaps/default/keymap.c +++ b/keyboards/keebio/cepstrum/keymaps/default/keymap.c @@ -12,9 +12,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F9, KC_F10, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [1] = LAYOUT_65xt( - RGB_HUI, RGB_HUD, 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, _______, _______, - RGB_SAI, RGB_SAD, RGB_TOG, RGB_MOD, KC_UP, _______, QK_BOOT, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, - RGB_VAI, RGB_VAD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_HUEU, RM_HUED, 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, _______, _______, + RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, KC_UP, _______, QK_BOOT, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + RM_VALU, RM_VALD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/keebio/chiri_ce/keymaps/default/keymap.json b/keyboards/keebio/chiri_ce/keymaps/default/keymap.json index 18c9e441e0..2ad48e577d 100644 --- a/keyboards/keebio/chiri_ce/keymaps/default/keymap.json +++ b/keyboards/keebio/chiri_ce/keymaps/default/keymap.json @@ -13,13 +13,13 @@ [ "KC_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_BSPC", "KC_ESC" , "KC_LEFT", "KC_DOWN", "KC_UP" , "KC_RGHT", "KC_LBRC", "KC_RBRC", "KC_P4" , "KC_P5" , "KC_P6" , "KC_PLUS", "KC_PIPE", - "RGB_MOD", "_______", "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", "KC_RPRN", "KC_RCBR", "KC_P1" , "KC_P2" , "KC_P3" , "KC_MINS", "_______", + "RM_NEXT", "_______", "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", "KC_RPRN", "KC_RCBR", "KC_P1" , "KC_P2" , "KC_P3" , "KC_MINS", "_______", "_______", "_______", "KC_DEL" , "KC_DEL" , "_______", "KC_P0" ], [ - "RGB_TOG", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "QK_BOOT", - "RGB_MOD", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", "KC_EQL" , "KC_HOME", "RGB_HUI", "RGB_SAI", "RGB_VAI", "KC_BSLS", - "KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN", "_______", "KC_PLUS", "KC_END" , "RGB_HUD", "RGB_SAD", "RGB_VAD", "_______", + "RM_TOGG", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "QK_BOOT", + "RM_NEXT", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", "KC_EQL" , "KC_HOME", "RM_HUEU", "RM_SATU", "RM_VALU", "KC_BSLS", + "KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN", "_______", "KC_PLUS", "KC_END" , "RM_HUED", "RM_SATD", "RM_VALD", "_______", "_______", "_______", "_______", "_______", "_______", "_______" ], [ diff --git a/keyboards/keebio/chocopad/keymaps/default/keymap.c b/keyboards/keebio/chocopad/keymaps/default/keymap.c index 8c83d72cfe..17347a1af1 100644 --- a/keyboards/keebio/chocopad/keymaps/default/keymap.c +++ b/keyboards/keebio/chocopad/keymaps/default/keymap.c @@ -22,8 +22,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_P0, KC_P0, KC_DOT ), [_FN2] = LAYOUT_ortho_4x4( - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, QK_BOOT, BL_STEP, _______, _______, _______ ) diff --git a/keyboards/keebio/convolution/keymaps/default/keymap.c b/keyboards/keebio/convolution/keymaps/default/keymap.c index e9e8d88344..b350d2bda2 100644 --- a/keyboards/keebio/convolution/keymaps/default/keymap.c +++ b/keyboards/keebio/convolution/keymaps/default/keymap.c @@ -22,9 +22,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65xt( - RGB_HUI, RGB_HUD, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - RGB_SAI, RGB_SAD, RGB_TOG, RGB_MOD, _______, KC_UP, QK_BOOT, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_VAI, RGB_VAD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_HUEU, RM_HUED, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, _______, KC_UP, QK_BOOT, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_VALU, RM_VALD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -34,6 +34,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, - [1] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(KC_MNXT, KC_MPRV) }, + [1] = { ENCODER_CCW_CW(RM_NEXT, RM_PREV), ENCODER_CCW_CW(KC_MNXT, KC_MPRV) }, }; #endif diff --git a/keyboards/keebio/iris/keymaps/default/keymap.json b/keyboards/keebio/iris/keymaps/default/keymap.json index 623c532a30..779c59d834 100644 --- a/keyboards/keebio/iris/keymaps/default/keymap.json +++ b/keyboards/keebio/iris/keymaps/default/keymap.json @@ -15,14 +15,14 @@ "KC_TILD", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_PGUP", "KC_GRV" , "_______", "KC_UP" , "_______", "QK_BOOT", "_______", "_______", "KC_P7" , "KC_P8" , "KC_P9" , "KC_P0" , "KC_PGDN", "KC_DEL" , "KC_LEFT", "KC_DOWN", "KC_RGHT", "_______", "KC_LBRC", "KC_RBRC", "KC_P4" , "KC_P5" , "KC_P6" , "KC_PLUS", "KC_PIPE", - "RGB_MOD", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", "KC_RPRN", "KC_RCBR", "KC_P1" , "KC_P2" , "KC_P3" , "KC_MINS", "_______", + "RM_NEXT", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", "KC_RPRN", "KC_RCBR", "KC_P1" , "KC_P2" , "KC_P3" , "KC_MINS", "_______", "_______", "_______", "KC_DEL" , "KC_DEL" , "_______", "KC_P0" ], [ "KC_F12" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" , "KC_F6" , "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" , - "RGB_TOG", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "QK_BOOT", - "RGB_MOD", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", "KC_EQL" , "KC_HOME", "RGB_HUI", "RGB_SAI", "RGB_VAI", "KC_BSLS", - "KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN", "_______", "KC_PLUS", "KC_END" , "RGB_HUD", "RGB_SAD", "RGB_VAD", "EE_CLR" , + "RM_TOGG", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "QK_BOOT", + "RM_NEXT", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", "KC_EQL" , "KC_HOME", "RM_HUEU", "RM_SATU", "RM_VALU", "KC_BSLS", + "KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN", "_______", "KC_PLUS", "KC_END" , "RM_HUED", "RM_SATD", "RM_VALD", "EE_CLR" , "_______", "_______", "_______", "_______", "_______", "_______" ] ] diff --git a/keyboards/keebio/iris_ce/keymaps/default/keymap.c b/keyboards/keebio/iris_ce/keymaps/default/keymap.c index d5021d647d..7a0625a36a 100644 --- a/keyboards/keebio/iris_ce/keymaps/default/keymap.c +++ b/keyboards/keebio/iris_ce/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_MOD, EE_CLR, _______, _______, _______, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, + RM_NEXT, EE_CLR, _______, _______, _______, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ _______, _______, KC_DEL, KC_DEL, _______, KC_P0 // └────────┴────────┴────────┘ └────────┴────────┴────────┘ @@ -43,11 +43,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_TOG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, QK_BOOT, + RM_TOGG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, QK_BOOT, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_MOD, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_BSLS, + RM_NEXT, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RM_HUEU, RM_SATU, RM_VALU, KC_BSLS, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, EE_CLR, + KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RM_HUED, RM_SATD, RM_VALD, EE_CLR, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ _______, _______, _______, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ diff --git a/keyboards/keebio/irispad/keymaps/default/keymap.json b/keyboards/keebio/irispad/keymaps/default/keymap.json index e9c52fa99f..29aa060926 100644 --- a/keyboards/keebio/irispad/keymaps/default/keymap.json +++ b/keyboards/keebio/irispad/keymaps/default/keymap.json @@ -15,13 +15,13 @@ "KC_TILD", "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_GRV" , "_______", "KC_UP" , "_______", "QK_BOOT", "_______", "KC_DEL" , "KC_LEFT", "KC_DOWN", "KC_RGHT", "_______", "KC_LBRC", - "RGB_MOD", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", + "RM_NEXT", "EE_CLR" , "_______", "_______", "_______", "KC_LCBR", "KC_LPRN", "_______", "_______", "KC_DEL" ], [ "KC_F6" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" , "KC_F12", "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" , - "RGB_MOD", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", + "RM_NEXT", "KC_MPRV", "KC_MNXT", "KC_VOLU", "KC_PGUP", "KC_UNDS", "KC_MUTE", "KC_MSTP", "KC_MPLY", "KC_VOLD", "KC_PGDN", "KC_MINS", "KC_LPRN", "_______", "_______", "_______" ] diff --git a/keyboards/keebio/nyquist/keymaps/default/keymap.c b/keyboards/keebio/nyquist/keymaps/default/keymap.c index df399d355f..178ff47456 100644 --- a/keyboards/keebio/nyquist/keymaps/default/keymap.c +++ b/keyboards/keebio/nyquist/keymaps/default/keymap.c @@ -147,7 +147,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT_ortho_5x12( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, QK_BOOT, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, + _______, QK_BOOT, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, _______, KC_DEL, _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ @@ -228,7 +228,7 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, [_COLEMAK] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, [_DVORAK] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, - [_LOWER] = { ENCODER_CCW_CW(RGB_MOD, RGB_RMOD), ENCODER_CCW_CW(KC_MNXT, KC_MPRV) }, + [_LOWER] = { ENCODER_CCW_CW(RM_NEXT, RM_PREV), ENCODER_CCW_CW(KC_MNXT, KC_MPRV) }, [_RAISE] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, [_ADJUST] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) } }; diff --git a/keyboards/keebio/nyquistpad/keymaps/default/keymap.c b/keyboards/keebio/nyquistpad/keymaps/default/keymap.c index 42c036556d..5a5a8ad497 100644 --- a/keyboards/keebio/nyquistpad/keymaps/default/keymap.c +++ b/keyboards/keebio/nyquistpad/keymaps/default/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(2), KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC ), [1] = LAYOUT_ortho_5x6( - RGB_MOD, _______, _______, _______, _______, _______, + RM_NEXT, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, KC_VOLU, KC_PGUP, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_PGDN, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/keebio/sinc/keymaps/default/keymap.c b/keyboards/keebio/sinc/keymaps/default/keymap.c index 171b7a7d05..f0cf80366e 100644 --- a/keyboards/keebio/sinc/keymaps/default/keymap.c +++ b/keyboards/keebio/sinc/keymaps/default/keymap.c @@ -14,9 +14,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_80_with_macro( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_HUI, RGB_HUD, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - RGB_SAI, RGB_SAD, RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_VAI, RGB_VAD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_HUEU, RM_HUED, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_VALU, RM_VALD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/keebio/sinc/keymaps/iso/keymap.c b/keyboards/keebio/sinc/keymaps/iso/keymap.c index f3eaaa5bca..205af033c6 100644 --- a/keyboards/keebio/sinc/keymaps/iso/keymap.c +++ b/keyboards/keebio/sinc/keymaps/iso/keymap.c @@ -14,9 +14,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_80_iso_with_macro( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_HUI, RGB_HUD, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - RGB_SAI, RGB_SAD, RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_VAI, RGB_VAD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_HUEU, RM_HUED, QK_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_VALU, RM_VALD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/keyboardio/model01/keymaps/default/keymap.c b/keyboards/keyboardio/model01/keymaps/default/keymap.c index 3ed72adb73..756cffcf23 100644 --- a/keyboards/keyboardio/model01/keymaps/default/keymap.c +++ b/keyboards/keyboardio/model01/keymaps/default/keymap.c @@ -26,7 +26,7 @@ enum { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [DEF] = LAYOUT( QK_BOOT , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM), - KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_MOD, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RM_NEXT, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, KC_LCTL, KC_RCTL, @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [FUN] = LAYOUT( _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , - KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_TOG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RM_TOGG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, _______, _______, diff --git a/keyboards/keycapsss/kimiko/rev2/keymaps/default/keymap.c b/keyboards/keycapsss/kimiko/rev2/keymaps/default/keymap.c index e2518afd54..a569beed22 100644 --- a/keyboards/keycapsss/kimiko/rev2/keymaps/default/keymap.c +++ b/keyboards/keycapsss/kimiko/rev2/keymaps/default/keymap.c @@ -103,8 +103,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT( QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) @@ -115,8 +115,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_DOWN, KC_UP), ENCODER_CCW_CW(KC_LEFT, KC_RGHT) }, - [_LOWER] = { ENCODER_CCW_CW(RGB_HUI, KC_TAB), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }, - [_ADJUST] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, + [_LOWER] = { ENCODER_CCW_CW(RM_HUEU, KC_TAB), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_RAISE] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, + [_ADJUST] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(RM_SATD, RM_SATU) }, }; #endif // ENCODER_MAP_ENABLE diff --git a/keyboards/keychron/q60/ansi/keymaps/default/keymap.c b/keyboards/keychron/q60/ansi/keymaps/default/keymap.c index 48c38a8c85..16fc41fcf5 100644 --- a/keyboards/keychron/q60/ansi/keymaps/default/keymap.c +++ b/keyboards/keychron/q60/ansi/keymaps/default/keymap.c @@ -44,8 +44,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [FUNC] = LAYOUT_ansi_60( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), diff --git a/keyboards/kopibeng/tgr_lena/keymaps/default/keymap.c b/keyboards/kopibeng/tgr_lena/keymaps/default/keymap.c index 7b4fd9db81..cec02156da 100644 --- a/keyboards/kopibeng/tgr_lena/keymaps/default/keymap.c +++ b/keyboards/kopibeng/tgr_lena/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/kprepublic/bm16a/v2/keymaps/default/keymap.c b/keyboards/kprepublic/bm16a/v2/keymaps/default/keymap.c index 0cb2b68fb9..5ff7d3edb6 100644 --- a/keyboards/kprepublic/bm16a/v2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm16a/v2/keymaps/default/keymap.c @@ -12,8 +12,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_ortho_4x4( QK_BOOT, KC_PAST, KC_PSLS, _______, - RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, - RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, + RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, + RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______ ) }; diff --git a/keyboards/kprepublic/bm40hsrgb/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm40hsrgb/rev1/keymaps/default/keymap.c index 838561269a..55892c8bf8 100755 --- a/keyboards/kprepublic/bm40hsrgb/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm40hsrgb/rev1/keymaps/default/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, 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_ENT , - RGB_TOG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + RM_TOGG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Lower @@ -94,7 +94,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_planck_mit( - _______, QK_BOOT, DB_TOGG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, QK_BOOT, DB_TOGG, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_DEL , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/keymaps/default/keymap.c b/keyboards/kprepublic/bm40hsrgb/rev2/keymaps/default/keymap.c index 5f389e4caf..187bdca534 100755 --- a/keyboards/kprepublic/bm40hsrgb/rev2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm40hsrgb/rev2/keymaps/default/keymap.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, 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_ENT , - RGB_TOG, KC_LCTL, KC_LALT, KC_LGUI, TL_LOWR, KC_SPC, TL_UPPR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + RM_TOGG, KC_LCTL, KC_LALT, KC_LGUI, TL_LOWR, KC_SPC, TL_UPPR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Lower @@ -91,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_ortho_4x12_1x2uC( - _______, QK_BOOT, DB_TOGG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, QK_BOOT, DB_TOGG, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_DEL , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm60hsrgb/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb/rev1/keymaps/default/keymap.c index f89dd675a0..8ee2387bd8 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb/rev1/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi_arrow( QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm60hsrgb/rev2/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb/rev2/keymaps/default/keymap.c index 51ac4708fc..7b6d1ae693 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb/rev2/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi_arrow( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QK_BOOT, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keymaps/default/keymap.c index 680c20327b..2cf8d792f8 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/default/keymap.c index 558f03e1f2..b82babca7f 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_iso_arrow( QK_BOOT, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/iso_nordic_sleepmode/keymap.c b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/iso_nordic_sleepmode/keymap.c index 4e874b26df..a7859aa8e9 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/iso_nordic_sleepmode/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keymaps/iso_nordic_sleepmode/keymap.c @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [1] = LAYOUT( 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev2/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb_iso/rev2/keymaps/default/keymap.c index 3b7ca14c98..f3aa8083f1 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev2/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_iso_arrow( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QK_BOOT, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keymaps/default/keymap.c index db0ba7cd50..32a8c86c02 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi( QK_BOOT, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev2/keymaps/default/keymap.c b/keyboards/kprepublic/bm60hsrgb_poker/rev2/keymaps/default/keymap.c index dac3e07c7c..637d49d467 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev2/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, QK_BOOT, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm65hsrgb/keymaps/default/keymap.c b/keyboards/kprepublic/bm65hsrgb/keymaps/default/keymap.c index 1b3ce7a456..daae44d099 100644 --- a/keyboards/kprepublic/bm65hsrgb/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm65hsrgb/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c index 4b5364fc9b..ca4df9e000 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c @@ -27,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_65_iso_blocker( QK_BOOT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c index 27812c7bbe..7b2cf7e0f4 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi( KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm80hsrgb/keymaps/default/keymap.c b/keyboards/kprepublic/bm80hsrgb/keymaps/default/keymap.c index 69b3540a3a..893141eff9 100644 --- a/keyboards/kprepublic/bm80hsrgb/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm80hsrgb/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/kprepublic/bm80v2/keymaps/default/keymap.c b/keyboards/kprepublic/bm80v2/keymaps/default/keymap.c index 090d61bed0..dbb11a97f3 100644 --- a/keyboards/kprepublic/bm80v2/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm80v2/keymaps/default/keymap.c @@ -16,7 +16,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/bm80v2_iso/keymaps/default/keymap.c b/keyboards/kprepublic/bm80v2_iso/keymaps/default/keymap.c index 5cd13af665..c4ab980dd5 100644 --- a/keyboards/kprepublic/bm80v2_iso/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm80v2_iso/keymaps/default/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_iso( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/kprepublic/bm980hsrgb/keymaps/default/keymap.c b/keyboards/kprepublic/bm980hsrgb/keymaps/default/keymap.c index 084ae6e11f..c80fb02ae5 100644 --- a/keyboards/kprepublic/bm980hsrgb/keymaps/default/keymap.c +++ b/keyboards/kprepublic/bm980hsrgb/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kprepublic/cstc40/keymaps/default/keymap.c b/keyboards/kprepublic/cstc40/keymaps/default/keymap.c index e47ff226a9..4d1be333ce 100644 --- a/keyboards/kprepublic/cstc40/keymaps/default/keymap.c +++ b/keyboards/kprepublic/cstc40/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_ESC, 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_ENT , - RGB_TOG, KC_LCTL, KC_LALT, KC_LGUI, TL_LOWR, KC_SPC, TL_UPPR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + RM_TOGG, KC_LCTL, KC_LALT, KC_LGUI, TL_LOWR, KC_SPC, TL_UPPR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Lower @@ -85,7 +85,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [3] = LAYOUT_planck_mit( - _______, QK_BOOT, DB_TOGG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL, + _______, QK_BOOT, DB_TOGG, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/kuro/kuro65/keymaps/default/keymap.c b/keyboards/kuro/kuro65/keymaps/default/keymap.c index cb8d125a8f..4224bb8a3e 100644 --- a/keyboards/kuro/kuro65/keymaps/default/keymap.c +++ b/keyboards/kuro/kuro65/keymaps/default/keymap.c @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [FN1] = LAYOUT_65_iso( 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_HOME, - KC_NO, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_HOME, + KC_NO, RM_TOGG, RM_NEXT, RM_PREV, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MPLY, KC_VOLU, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_MPRV, KC_VOLD, KC_MNXT diff --git a/keyboards/laser_ninja/pumpkinpad/keymaps/default/keymap.c b/keyboards/laser_ninja/pumpkinpad/keymaps/default/keymap.c index 8b60519b90..9250d0d6b8 100644 --- a/keyboards/laser_ninja/pumpkinpad/keymaps/default/keymap.c +++ b/keyboards/laser_ninja/pumpkinpad/keymaps/default/keymap.c @@ -24,8 +24,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F8, MO(1), KC_F10 ), [1] = LAYOUT( - RGB_TOG, RGB_MOD, RGB_RMOD, - RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, - RGB_VAI, RGB_VAD, _______ + RM_TOGG, RM_NEXT, RM_PREV, + RM_HUEU, RM_HUED, RM_SATU, RM_SATD, + RM_VALU, RM_VALD, _______ ) }; diff --git a/keyboards/latincompass/latin17rgb/keymaps/default/keymap.c b/keyboards/latincompass/latin17rgb/keymaps/default/keymap.c index 237f4a6d65..9a421e209d 100644 --- a/keyboards/latincompass/latin17rgb/keymaps/default/keymap.c +++ b/keyboards/latincompass/latin17rgb/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P0, KC_PDOT, KC_PENT ), [1] = LAYOUT_numpad_5x4( - RGB_TOG, RGB_MOD, KC_PMNS, _______, + RM_TOGG, RM_NEXT, KC_PMNS, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, _______, _______, _______, diff --git a/keyboards/latincompass/latin60rgb/keymaps/default/keymap.c b/keyboards/latincompass/latin60rgb/keymaps/default/keymap.c index 763f54c00a..95654d6feb 100644 --- a/keyboards/latincompass/latin60rgb/keymaps/default/keymap.c +++ b/keyboards/latincompass/latin60rgb/keymaps/default/keymap.c @@ -24,16 +24,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_SPC, KC_PGUP, KC_PGDN ), [1] = LAYOUT_60_latin_hhkb( - RGB_TOG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + RM_TOGG, 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_UP, _______, _______, _______, KC_CALC, _______, KC_INS, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_UP, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, NK_TOGG, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______,_______, KC_LALT, _______, _______, _______, _______ ), [2] = LAYOUT_60_latin_hhkb( - RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, RGB_SPI, RGB_SPD, KC_F11, KC_F12, KC_DEL, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, RM_SPDU, RM_SPDD, KC_F11, KC_F12, KC_DEL, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/latincompass/latin6rgb/keymaps/default/keymap.c b/keyboards/latincompass/latin6rgb/keymaps/default/keymap.c index 90b96751ef..efcff4f56a 100644 --- a/keyboards/latincompass/latin6rgb/keymaps/default/keymap.c +++ b/keyboards/latincompass/latin6rgb/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P4, KC_P5, MO(1), KC_P1, KC_P2, KC_P3), [1] = LAYOUT_numpad_2x3( - RGB_TOG, RGB_MOD, MO(1), + RM_TOGG, RM_NEXT, MO(1), AU_ON, AU_OFF, MI_ON), [2] = LAYOUT_numpad_2x3( KC_P4, KC_P5, MO(1), diff --git a/keyboards/latincompass/latinpad/keymaps/default/keymap.c b/keyboards/latincompass/latinpad/keymaps/default/keymap.c index cf966d6826..6d2af556ed 100644 --- a/keyboards/latincompass/latinpad/keymaps/default/keymap.c +++ b/keyboards/latincompass/latinpad/keymaps/default/keymap.c @@ -17,13 +17,13 @@ * .---------------. * |NUMLOCK|Calc. | * |--------------------------------. - * |RGB_TOG|RGB_MOD|RGB_M_K|RGB_M_X | + * |RM_TOGG|RM_NEXT|RGB_M_K|RGB_M_X | * |-------|-------|-------|--------| - * |RGB_SAI|RGB_SAD|RGB_HUI|RGB_HUD | + * |RM_SATU|RM_SATD|RM_HUEU|RM_HUED | * |-------|-------|-------|--------| - * |RGB_VAI|RGB_VAD|RGB_SPI|RGB_SPD | + * |RM_VALU|RM_VALD|RM_SPDU|RM_SPDD | * |-------|-------|-------|--------| - * |RGB_SPI|RGB_SPD|RGB_TOG|KC_TRNS | + * |RM_SPDU|RM_SPDD|RM_TOGG|KC_TRNS | * .--------------------------------. */ @@ -37,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P0, KC_PDOT,KC_DELETE, KC_KP_ENTER), [1] = LAYOUT( KC_NUM, KC_CALCULATOR, - RGB_TOG, RGB_MOD, RGB_M_K, RGB_M_X, - RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD, - RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, - RGB_SPI, RGB_SPD, RGB_TOG, KC_TRNS), + RM_TOGG, RM_NEXT, RGB_M_K, RGB_M_X, + RM_SATU, RM_SATD, RM_HUEU, RM_HUED, + RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, + RM_SPDU, RM_SPDD, RM_TOGG, KC_TRNS), }; static void render_logo(void) { diff --git a/keyboards/lfkeyboards/lfkpad/keymaps/default/keymap.c b/keyboards/lfkeyboards/lfkpad/keymaps/default/keymap.c index 05f42b8b98..6a5eae6b26 100644 --- a/keyboards/lfkeyboards/lfkpad/keymaps/default/keymap.c +++ b/keyboards/lfkeyboards/lfkpad/keymaps/default/keymap.c @@ -13,11 +13,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* RGB */ [1] = LAYOUT_numpad_6x4( - RGB_SAI, RGB_VAI, RGB_HUI, _______, - RGB_SAD, RGB_VAD, RGB_HUD, _______, - RGB_M_X, RGB_M_G, RGB_MOD, - RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_RMOD, + RM_SATU, RM_VALU, RM_HUEU, _______, + RM_SATD, RM_VALD, RM_HUED, _______, + RGB_M_X, RGB_M_G, RM_NEXT, + RGB_M_SW,RGB_M_SN,RGB_M_K, RM_PREV, RGB_M_P, RGB_M_B, RGB_M_R, - XXXXXXX, XXXXXXX, RGB_TOG + XXXXXXX, XXXXXXX, RM_TOGG ) }; diff --git a/keyboards/linworks/fave60a/keymaps/default/keymap.c b/keyboards/linworks/fave60a/keymaps/default/keymap.c index 350b9571ef..e683f0c8a6 100644 --- a/keyboards/linworks/fave60a/keymaps/default/keymap.c +++ b/keyboards/linworks/fave60a/keymaps/default/keymap.c @@ -27,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, 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_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SCRL, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_DEL, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/linworks/fave84h/keymaps/default/keymap.c b/keyboards/linworks/fave84h/keymaps/default/keymap.c index 64e5dc07d3..3c95786d15 100644 --- a/keyboards/linworks/fave84h/keymaps/default/keymap.c +++ b/keyboards/linworks/fave84h/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAYER1] = LAYOUT_tkl_ansi_tsangan_split_bs( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT diff --git a/keyboards/linworks/fave87h/keymaps/default/keymap.c b/keyboards/linworks/fave87h/keymaps/default/keymap.c index f669452b2e..d3c53b2a0b 100644 --- a/keyboards/linworks/fave87h/keymaps/default/keymap.c +++ b/keyboards/linworks/fave87h/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAYER1] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT diff --git a/keyboards/linworks/favepada/keymaps/default/keymap.c b/keyboards/linworks/favepada/keymaps/default/keymap.c index e17d76109a..ddeafbb71e 100644 --- a/keyboards/linworks/favepada/keymaps/default/keymap.c +++ b/keyboards/linworks/favepada/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P0, KC_PDOT, KC_PENT ), [1] = LAYOUT_numpad_6x4( - KC_TRNS, RGB_TOG, RGB_MOD, KC_D, + KC_TRNS, RM_TOGG, RM_NEXT, KC_D, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_P4, KC_P5, KC_P6, KC_PPLS, diff --git a/keyboards/magic_force/mf17/keymaps/default/keymap.c b/keyboards/magic_force/mf17/keymaps/default/keymap.c index 1ebe11b6d9..c845d80f13 100755 --- a/keyboards/magic_force/mf17/keymaps/default/keymap.c +++ b/keyboards/magic_force/mf17/keymaps/default/keymap.c @@ -25,8 +25,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P0, KC_PDOT, KC_PENT), [1] = LAYOUT_numpad_5x4( KC_TRNS, KC_CALCULATOR, KC_BSPC, KC_TRNS, - RGB_MOD, RGB_VAI, RGB_HUI, - RGB_SPD, RGB_TOG, RGB_SPI, QK_BOOTLOADER, - RGB_RMOD, RGB_VAD, RGB_HUD, + RM_NEXT, RM_VALU, RM_HUEU, + RM_SPDD, RM_TOGG, RM_SPDU, QK_BOOTLOADER, + RM_PREV, RM_VALD, RM_HUED, KC_TRNS, KC_TRNS, QK_CLEAR_EEPROM), }; \ No newline at end of file diff --git a/keyboards/magic_force/mf34/keymaps/default/keymap.c b/keyboards/magic_force/mf34/keymaps/default/keymap.c index 03135be226..0ee4db2985 100755 --- a/keyboards/magic_force/mf34/keymaps/default/keymap.c +++ b/keyboards/magic_force/mf34/keymaps/default/keymap.c @@ -30,10 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), [_FN] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOTLOADER, - RGB_TOG, RGB_HUI, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_HUD, RGB_RMOD, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_HUEU, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_HUED, RM_PREV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, - RGB_SPD, RGB_VAD, RGB_SPI, KC_TRNS, KC_TRNS, QK_CLEAR_EEPROM), + RM_VALU, KC_TRNS, KC_TRNS, KC_TRNS, + RM_SPDD, RM_VALD, RM_SPDU, KC_TRNS, KC_TRNS, QK_CLEAR_EEPROM), }; diff --git a/keyboards/matrix/noah/keymaps/default/keymap.c b/keyboards/matrix/noah/keymaps/default/keymap.c index daa4ae833a..452867d856 100644 --- a/keyboards/matrix/noah/keymaps/default/keymap.c +++ b/keyboards/matrix/noah/keymaps/default/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT_default( KC_BSLS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - QK_BOOT, RGB_TOG, RGB_MOD, _______, KC_F13, KC_F14, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, UG_TOGG, UG_NEXT, _______, RM_TOGG, RM_NEXT, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, _______), diff --git a/keyboards/matrix/noah/keymaps/iso/keymap.c b/keyboards/matrix/noah/keymaps/iso/keymap.c index fad13f3026..2f57e4b92b 100644 --- a/keyboards/matrix/noah/keymaps/iso/keymap.c +++ b/keyboards/matrix/noah/keymaps/iso/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN,KC_RIGHT), [1] = LAYOUT_iso( 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, _______, _______, - QK_BOOT, RGB_TOG, RGB_MOD, _______, KC_F13, KC_F14, KC_F24, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, UG_TOGG, UG_NEXT, _______, RM_TOGG, RM_NEXT, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), diff --git a/keyboards/matrix/noah/keymaps/splitspace/keymap.c b/keyboards/matrix/noah/keymaps/splitspace/keymap.c index fe231abb50..c9287123f7 100644 --- a/keyboards/matrix/noah/keymaps/splitspace/keymap.c +++ b/keyboards/matrix/noah/keymaps/splitspace/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT_default_splitspace( KC_BSLS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - QK_BOOT, RGB_TOG, RGB_MOD, _______, KC_F13, KC_F14, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, UG_TOGG, UG_NEXT, _______, RM_TOGG, RM_NEXT, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), diff --git a/keyboards/matrix/noah/keymaps/wkl/keymap.c b/keyboards/matrix/noah/keymaps/wkl/keymap.c index dec76f1b37..2e2377f18d 100644 --- a/keyboards/matrix/noah/keymaps/wkl/keymap.c +++ b/keyboards/matrix/noah/keymaps/wkl/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT), [1] = LAYOUT_wkl( KC_BSLS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, - QK_BOOT, RGB_TOG, RGB_MOD, _______, KC_F13, KC_F14, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, UG_TOGG, UG_NEXT, _______, RM_TOGG, RM_NEXT, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), diff --git a/keyboards/matrix/noah/noah.c b/keyboards/matrix/noah/noah.c index 22d159328a..959490e4f7 100644 --- a/keyboards/matrix/noah/noah.c +++ b/keyboards/matrix/noah/noah.c @@ -95,21 +95,3 @@ const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = { {1, C9_16, C7_15, C6_15}, // RGB5012 }; #endif - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - switch(keycode) { - #ifdef RGB_MATRIX_ENABLE - case KC_F13: // toggle rgb matrix - rgb_matrix_toggle(); - return false; - case KC_F14: - rgb_matrix_step(); - return false; - #endif - default: - break; - } - } - return process_record_user(keycode, record); -} diff --git a/keyboards/mechlovin/delphine/keymaps/default/keymap.c b/keyboards/mechlovin/delphine/keymaps/default/keymap.c index 81bd4ffdf7..6498b69262 100644 --- a/keyboards/mechlovin/delphine/keymaps/default/keymap.c +++ b/keyboards/mechlovin/delphine/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_6x4( - KC_ESC, BL_STEP, RGB_TOG, RGB_MOD, + KC_ESC, BL_STEP, RM_TOGG, RM_NEXT, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PEQL, diff --git a/keyboards/mechlovin/infinity875/keymaps/default/keymap.c b/keyboards/mechlovin/infinity875/keymaps/default/keymap.c index 750a94dab5..010038d113 100644 --- a/keyboards/mechlovin/infinity875/keymaps/default/keymap.c +++ b/keyboards/mechlovin/infinity875/keymaps/default/keymap.c @@ -26,10 +26,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_all( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, RGB_HUI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAD, RGB_HUD, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, - KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, RGB_VAD, RGB_MOD + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SATU, RM_HUEU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SATD, RM_HUED, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, + KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_VALD, RM_NEXT ) }; diff --git a/keyboards/mechwild/bbpad/keymaps/default/keymap.json b/keyboards/mechwild/bbpad/keymaps/default/keymap.json index d0e924191b..33043e41ac 100644 --- a/keyboards/mechwild/bbpad/keymaps/default/keymap.json +++ b/keyboards/mechwild/bbpad/keymaps/default/keymap.json @@ -12,9 +12,9 @@ ], [ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "RGB_RMOD", "KC_TRNS", "RGB_MOD", "KC_TRNS", "KC_TRNS", + "RM_PREV", "KC_TRNS", "RM_NEXT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_NUM", "RGB_TOG" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_NUM", "RM_TOGG" ] ], "config": { @@ -24,6 +24,6 @@ }, "encoders": [ [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}], - [{"ccw": "RGB_VAD", "cw": "RGB_VAI"}] + [{"ccw": "RM_VALD", "cw": "RM_VALU"}] ] } diff --git a/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c index db6ccd8912..9cc5d83624 100644 --- a/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c +++ b/keyboards/meetlab/kafkasplit/keymaps/default/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| KC_LCTL, XXXXXXX, KC_AMPR, KC_PIPE, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TILD, KC_GRV, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_RSFT, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, XXXXXXX, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, KC_RSFT, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| _______, KC_LGUI, _______, KC_SPC, KC_ENT, _______, _______, KC_LALT //`---------------------------------' `-----------------------------------' diff --git a/keyboards/melgeek/mach80/keymaps/default/keymap.c b/keyboards/melgeek/mach80/keymaps/default/keymap.c index 49b67c40b3..c566d773f1 100755 --- a/keyboards/melgeek/mach80/keymaps/default/keymap.c +++ b/keyboards/melgeek/mach80/keymaps/default/keymap.c @@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( /* FN */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, KC_END, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mach80/keymaps/tkl/keymap.c b/keyboards/melgeek/mach80/keymaps/tkl/keymap.c index 3ce16cd736..732e188e97 100755 --- a/keyboards/melgeek/mach80/keymaps/tkl/keymap.c +++ b/keyboards/melgeek/mach80/keymaps/tkl/keymap.c @@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( /* FN */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, KC_END, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mach80/keymaps/wkl/keymap.c b/keyboards/melgeek/mach80/keymaps/wkl/keymap.c index fcaae9338a..3bc9ca064c 100755 --- a/keyboards/melgeek/mach80/keymaps/wkl/keymap.c +++ b/keyboards/melgeek/mach80/keymaps/wkl/keymap.c @@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi_wkl( /* FN */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, KC_END, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, _______, KC_INS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mj61/keymaps/default/keymap.c b/keyboards/melgeek/mj61/keymaps/default/keymap.c index d11223bd34..a9d237ca1d 100644 --- a/keyboards/melgeek/mj61/keymaps/default/keymap.c +++ b/keyboards/melgeek/mj61/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT_60_ansi( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/melgeek/mj63/keymaps/default/keymap.c b/keyboards/melgeek/mj63/keymaps/default/keymap.c index 1bac2f819c..c926cf61b7 100644 --- a/keyboards/melgeek/mj63/keymaps/default/keymap.c +++ b/keyboards/melgeek/mj63/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT_60_ansi_arrow( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/melgeek/mj64/keymaps/default/keymap.c b/keyboards/melgeek/mj64/keymaps/default/keymap.c index 775afccbff..a20a84caba 100644 --- a/keyboards/melgeek/mj64/keymaps/default/keymap.c +++ b/keyboards/melgeek/mj64/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_64_ansi( /* FN */ QK_GESC, 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, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, KC_HOME, KC_PGUP, EE_CLR, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, KC_HOME, KC_PGUP, EE_CLR, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, KC_INS, KC_END, KC_PGDN, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mj65/keymaps/default/keymap.c b/keyboards/melgeek/mj65/keymaps/default/keymap.c index 4e96ba55f1..31ea954fa1 100644 --- a/keyboards/melgeek/mj65/keymaps/default/keymap.c +++ b/keyboards/melgeek/mj65/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi( /* FN */ QK_GESC, 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, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, KC_HOME, _______, EE_CLR, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, KC_HOME, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, KC_INS, KC_END, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mojo68/keymaps/default/keymap.c b/keyboards/melgeek/mojo68/keymaps/default/keymap.c index d5c1d91985..8b9245d639 100755 --- a/keyboards/melgeek/mojo68/keymaps/default/keymap.c +++ b/keyboards/melgeek/mojo68/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_68_ansi( 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_PSCR, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, KC_HOME, _______, EE_CLR, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, KC_HOME, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, KC_INS, KC_END, KC_MPLY, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/mojo75/keymaps/default/keymap.c b/keyboards/melgeek/mojo75/keymaps/default/keymap.c index 730ce55bf6..c287b86fe1 100644 --- a/keyboards/melgeek/mojo75/keymaps/default/keymap.c +++ b/keyboards/melgeek/mojo75/keymaps/default/keymap.c @@ -28,8 +28,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_75_ansi( /* FN */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, KC_END, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, _______, _______, QK_BOOT, KC_INS, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, EE_CLR, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, _______, _______, QK_BOOT, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/tegic/keymaps/default/keymap.c b/keyboards/melgeek/tegic/keymaps/default/keymap.c index 4c1e241549..c5edf2821a 100755 --- a/keyboards/melgeek/tegic/keymaps/default/keymap.c +++ b/keyboards/melgeek/tegic/keymaps/default/keymap.c @@ -28,8 +28,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( /* FN */ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, KC_END, _______, - _______, RGB_TOG, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_MOD, _______, QK_BOOT, _______, KC_INS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPI, RGB_SPD, _______, _______, _______, + _______, RM_TOGG, _______, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_NEXT, _______, QK_BOOT, _______, KC_INS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/melgeek/z70ultra/keymaps/default/keymap.c b/keyboards/melgeek/z70ultra/keymaps/default/keymap.c index 2987796572..dbb588efae 100644 --- a/keyboards/melgeek/z70ultra/keymaps/default/keymap.c +++ b/keyboards/melgeek/z70ultra/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( /* FN */ 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, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, - _______, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, + _______, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, EE_CLR, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ), diff --git a/keyboards/miiiw/blackio83/keymaps/default/keymap.c b/keyboards/miiiw/blackio83/keymaps/default/keymap.c index dc906f7e2c..9a611417d9 100644 --- a/keyboards/miiiw/blackio83/keymaps/default/keymap.c +++ b/keyboards/miiiw/blackio83/keymaps/default/keymap.c @@ -43,8 +43,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_NEXT ), /* Keymap MAC_BL: Mac Base Layer @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_NEXT ), }; diff --git a/keyboards/miller/gm862/keymaps/default/keymap.c b/keyboards/miller/gm862/keymaps/default/keymap.c index 2eb134f53d..f6c2b264f7 100644 --- a/keyboards/miller/gm862/keymaps/default/keymap.c +++ b/keyboards/miller/gm862/keymaps/default/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL), [_LAYER1] = LAYOUT_60_ansi( /* FN */ QK_GESC, 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_TRNS, RGB_TOG, KC_UP, RGB_MOD, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT , + KC_TRNS, RM_TOGG, KC_UP, RM_NEXT, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT , KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_MPRV, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), diff --git a/keyboards/moky/moky67/keymaps/default/keymap.c b/keyboards/moky/moky67/keymaps/default/keymap.c index aab6493c2e..7a396e12dc 100644 --- a/keyboards/moky/moky67/keymaps/default/keymap.c +++ b/keyboards/moky/moky67/keymaps/default/keymap.c @@ -15,10 +15,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( /* Base */ KC_GRV, KC_MYCM, KC_WHOM, KC_MAIL, KC_CALC, KC_MSEL, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, - QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, - _______, GU_TOGG, _______, EE_CLR, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI), + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, + _______, GU_TOGG, _______, EE_CLR, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU), [2] = LAYOUT( /* Base */ KC_ESC, KC_BRMD, KC_BRMU, KC_F3, _______, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSPC, _______, @@ -29,10 +29,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [3] = LAYOUT( /* FN */ 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, _______, _______, - QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, _______, - _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, - _______, _______, _______, EE_CLR, _______, _______, _______, RGB_SPD, RGB_VAD, RGB_SPI), + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, _______, + _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, EE_CLR, _______, _______, _______, RM_SPDD, RM_VALD, RM_SPDU), }; // clang-format on @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD)}, - [1] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD)}, + [1] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT)}, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, }; diff --git a/keyboards/moky/moky88/keymaps/default/keymap.c b/keyboards/moky/moky88/keymaps/default/keymap.c index 5b86c306cf..7ae5e0d8a1 100644 --- a/keyboards/moky/moky88/keymaps/default/keymap.c +++ b/keyboards/moky/moky88/keymaps/default/keymap.c @@ -16,11 +16,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_f13_ansi( /* Base */ _______, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_CALC, KC_WSCH, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, RGB_TOG, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, RGB_MOD, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, RM_TOGG, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_NEXT, _______, _______, _______, _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, - _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RM_HUED, RM_VALD, RM_HUEU), [2] = LAYOUT_tkl_f13_ansi( /* Base */ KC_ESC, KC_BRMD, KC_BRMU, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_PSCR, KC_SCRL, KC_PAUSE, @@ -32,17 +32,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [3] = LAYOUT_tkl_f13_ansi( /* FN */ _______, 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_MUTE, KC_PSCR, KC_SCRL, KC_PAUSE, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, RGB_TOG, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, RGB_MOD, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, RM_TOGG, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_NEXT, _______, _______, _______, _______, TO(0), TO(2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, RM_VALD, RM_HUEU), }; const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD)}, - [1] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD)}, + [1] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT)}, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, }; diff --git a/keyboards/monsgeek/m5/keymaps/default/keymap.c b/keyboards/monsgeek/m5/keymaps/default/keymap.c index 6fe98a89d6..bb10cb9f82 100644 --- a/keyboards/monsgeek/m5/keymaps/default/keymap.c +++ b/keyboards/monsgeek/m5/keymaps/default/keymap.c @@ -47,11 +47,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT( /* FN */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______,TG(WIN_WASD),_______,_______,_______,_______, _______, _______, DF(MAC_B),_______,_______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI, _______, _______), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______,TG(WIN_WASD),_______,_______,_______,_______, _______, _______, DF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 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_PSCR, KC_SCRL, KC_PAUS, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, @@ -70,10 +70,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, 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, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______,TG(MAC_WASD),_______,_______,_______,_______, _______, _______, DF(WIN_B),_______,_______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, RGB_HUI, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_VAD, RGB_SAI, _______, _______) + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______,TG(MAC_WASD),_______,_______,_______,_______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU, _______, _______) }; // clang-format on diff --git a/keyboards/monstargear/xo87/rgb/keymaps/default/keymap.c b/keyboards/monstargear/xo87/rgb/keymaps/default/keymap.c index 8e5ab5b617..175b6c1fab 100644 --- a/keyboards/monstargear/xo87/rgb/keymaps/default/keymap.c +++ b/keyboards/monstargear/xo87/rgb/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/monstargear/xo87/solderable/keymaps/default/keymap.c b/keyboards/monstargear/xo87/solderable/keymaps/default/keymap.c index ba3079afda..f6f7573e19 100644 --- a/keyboards/monstargear/xo87/solderable/keymaps/default/keymap.c +++ b/keyboards/monstargear/xo87/solderable/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_UP, diff --git a/keyboards/mt/mt64rgb/keymaps/default/keymap.c b/keyboards/mt/mt64rgb/keymaps/default/keymap.c index 6c0d1a83fd..594311d43d 100644 --- a/keyboards/mt/mt64rgb/keymaps/default/keymap.c +++ b/keyboards/mt/mt64rgb/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_64_ansi( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______,_______,_______, _______,_______, _______, _______,_______,_______, _______,_______,_______, _______, - RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, _______, _______,_______, _______, + RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, _______, _______,_______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, _______,_______,_______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/mt/mt84/keymaps/default/keymap.c b/keyboards/mt/mt84/keymaps/default/keymap.c index 2b3371257c..698805ca17 100644 --- a/keyboards/mt/mt84/keymaps/default/keymap.c +++ b/keyboards/mt/mt84/keymaps/default/keymap.c @@ -24,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - RGB_TOG, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, _______, _______,_______, _______,_______, + RM_TOGG, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, _______, _______,_______, _______,_______, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, _______,_______,_______,_______, _______, _______, _______, _______, KC_TRNS, _______, _______, _______, _______, _______ ) diff --git a/keyboards/mwstudio/mw65_rgb/keymaps/default/keymap.c b/keyboards/mwstudio/mw65_rgb/keymaps/default/keymap.c index 77750b5174..23d476af0e 100644 --- a/keyboards/mwstudio/mw65_rgb/keymaps/default/keymap.c +++ b/keyboards/mwstudio/mw65_rgb/keymaps/default/keymap.c @@ -21,15 +21,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_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_ENT, 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, RGB_TOG, + 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, RM_TOGG, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT ), [1] = LAYOUT( - 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, _______, RGB_HUI, - RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_SAD, - _______, _______, _______, _______, RGB_MOD, _______, RGB_SPD, RGB_VAD, RGB_SPI + 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, _______, RM_HUEU, + RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, RM_SATD, + _______, _______, _______, _______, RM_NEXT, _______, RM_SPDD, RM_VALD, RM_SPDU ) }; diff --git a/keyboards/mwstudio/mw75/keymaps/default/keymap.c b/keyboards/mwstudio/mw75/keymaps/default/keymap.c index 1a7b9bf067..e1fbf3f30a 100644 --- a/keyboards/mwstudio/mw75/keymaps/default/keymap.c +++ b/keyboards/mwstudio/mw75/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - 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_VOLD, RGB_TOG, KC_VOLU, + 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_VOLD, RM_TOGG, KC_VOLU, 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_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_ENT, KC_PGDN, @@ -30,10 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, - RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_SAD, - _______, _______, _______, _______, RGB_MOD, _______, RGB_SPD, RGB_VAD, RGB_SPI + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, + RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, RM_SATD, + _______, _______, _______, _______, RM_NEXT, _______, RM_SPDD, RM_VALD, RM_SPDU ), }; diff --git a/keyboards/mwstudio/mw75r2/keymaps/default/keymap.c b/keyboards/mwstudio/mw75r2/keymaps/default/keymap.c index 5976aec91f..7adb32297e 100644 --- a/keyboards/mwstudio/mw75r2/keymaps/default/keymap.c +++ b/keyboards/mwstudio/mw75r2/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - 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, RGB_TOG, + 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, RM_TOGG, 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_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_ENT, KC_PGDN, @@ -30,10 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, - RGB_TOG, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_SAD, - _______, _______, _______, _______, RGB_MOD, _______, RGB_SPD, RGB_VAD, RGB_SPI + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUEU, + RM_TOGG, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_HUED, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, RM_SATD, + _______, _______, _______, _______, RM_NEXT, _______, RM_SPDD, RM_VALD, RM_SPDU ), }; diff --git a/keyboards/nack/keymaps/default/keymap.c b/keyboards/nack/keymaps/default/keymap.c index 79ff514e8c..0831440058 100644 --- a/keyboards/nack/keymaps/default/keymap.c +++ b/keyboards/nack/keymaps/default/keymap.c @@ -53,13 +53,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* __________________________________________________________________________________________________________________________________________________________________________ | \ \ \ \ \ \ \ \ \ \ \ \ \ \ */ // | |-RGB TOGGLE-|-CHANGE RGB-|-RGB HUE UP-|-RGB SAT UP-|------------|------------|------------|------------|------------|------------|------------|------------|-QK_BOOT KBD--| - RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, // | |------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------| MU_TOGG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, // | |------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|-RGB LIGHT +|------------| - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_VAI, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RM_VALU, KC_NO, // | |------------|------------|------------|---FN_1-----|------------|------------|----FN_2----|------------|------------|------------|------------|-RGB LIGHT -|------------| - KC_NO, KC_NO, KC_NO, MO(NUM), KC_NO, KC_NO, TO(BASE), KC_NO, KC_NO, KC_NO, KC_NO, RGB_VAD, KC_NO + KC_NO, KC_NO, KC_NO, MO(NUM), KC_NO, KC_NO, TO(BASE), KC_NO, KC_NO, KC_NO, KC_NO, RM_VALD, KC_NO // \|____________|____________|____________|____________|____________|____________|____________|____________|____________|____________|____________|____________|____________| ) }; diff --git a/keyboards/ning/tiny_board/tb16_rgb/keymaps/default/keymap.c b/keyboards/ning/tiny_board/tb16_rgb/keymaps/default/keymap.c index f8ef14aa93..6a39460b39 100644 --- a/keyboards/ning/tiny_board/tb16_rgb/keymaps/default/keymap.c +++ b/keyboards/ning/tiny_board/tb16_rgb/keymaps/default/keymap.c @@ -29,8 +29,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └───┴───┴───┴───┘ */ [0] = LAYOUT_ortho_4x4( - KC_P7, KC_P8, KC_P9, RGB_TOG, - KC_P4, KC_P5, KC_P6, RGB_MOD, + KC_P7, KC_P8, KC_P9, RM_TOGG, + KC_P4, KC_P5, KC_P6, RM_NEXT, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_P0, KC_PDOT, KC_PENT, KC_PPLS ) diff --git a/keyboards/novelkeys/nk20/keymaps/default/keymap.c b/keyboards/novelkeys/nk20/keymaps/default/keymap.c index 26a066f150..315f89e8c1 100644 --- a/keyboards/novelkeys/nk20/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk20/keymaps/default/keymap.c @@ -26,9 +26,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( /* FN */ KC_NUM, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_SPD, RGB_SPI, KC_TRNS, - RGB_TOG, RGB_MOD, RGB_HUD, KC_TRNS, - RGB_SAD, RGB_SAI, RGB_HUI, - RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, + KC_TRNS, RM_SPDD, RM_SPDU, KC_TRNS, + RM_TOGG, RM_NEXT, RM_HUED, KC_TRNS, + RM_SATD, RM_SATU, RM_HUEU, + RM_VALD, RM_VALU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/novelkeys/nk65b/keymaps/default/keymap.c b/keyboards/novelkeys/nk65b/keymaps/default/keymap.c index 1a2496db27..d675d70ca5 100755 --- a/keyboards/novelkeys/nk65b/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk65b/keymaps/default/keymap.c @@ -27,6 +27,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/novelkeys/nk87b/keymaps/default/keymap.c b/keyboards/novelkeys/nk87b/keymaps/default/keymap.c index 6960d0bdfa..e43ea201f6 100644 --- a/keyboards/novelkeys/nk87b/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk87b/keymaps/default/keymap.c @@ -29,6 +29,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c b/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c index a0ea79c45f..6f647f54f9 100644 --- a/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk_classic_tkl/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, RETRO_RGB, _______, _______, _______, _______, _______, _______), }; diff --git a/keyboards/novelkeys/nk_classic_tkl_iso/keymaps/default/keymap.c b/keyboards/novelkeys/nk_classic_tkl_iso/keymaps/default/keymap.c index 8939cde8a4..23014881bd 100644 --- a/keyboards/novelkeys/nk_classic_tkl_iso/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk_classic_tkl_iso/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______, + _______, _______, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, RETRO_RGB, _______, _______, _______, _______, _______, _______), }; diff --git a/keyboards/novelkeys/nk_plus/keymaps/default/keymap.c b/keyboards/novelkeys/nk_plus/keymaps/default/keymap.c index 358ea8b18b..b5ac448666 100644 --- a/keyboards/novelkeys/nk_plus/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk_plus/keymaps/default/keymap.c @@ -27,6 +27,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/orthograph/keymaps/default/keymap.json b/keyboards/orthograph/keymaps/default/keymap.json index 8d2f53c71a..128016b742 100644 --- a/keyboards/orthograph/keymaps/default/keymap.json +++ b/keyboards/orthograph/keymaps/default/keymap.json @@ -18,7 +18,7 @@ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_INS", "KC_HOME", "KC_PGUP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_DEL", "KC_END", "KC_PGDN", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_MOD","KC_TRNS", "RGB_TOG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_NEXT","KC_TRNS", "RM_TOGG", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" ] ] } \ No newline at end of file diff --git a/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c b/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c index 5d640c162b..d189bc66f6 100644 --- a/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c +++ b/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c @@ -28,9 +28,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( 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_TRNS, QK_BOOT, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, + KC_TRNS, UG_TOGG, UG_NEXT, UG_PREV, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_VALU, UG_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, KC_TRNS, KC_VOLU, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, - KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS ), [2] = LAYOUT_65_ansi_blocker( diff --git a/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c b/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c index 5d640c162b..fc92357cf5 100644 --- a/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c +++ b/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c @@ -28,9 +28,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( 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_TRNS, QK_BOOT, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_HOME, KC_TRNS, KC_VOLU, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, - KC_TRNS, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS, + KC_TRNS, UG_TOGG, UG_NEXT, UG_PREV, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_VALU, UG_VALD, KC_TRNS, KC_TRNS, KC_F22, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F23, KC_TRNS ), [2] = LAYOUT_65_ansi_blocker( diff --git a/keyboards/paprikman/albacore/keymaps/default/keymap.c b/keyboards/paprikman/albacore/keymaps/default/keymap.c index 022250caf1..9d50ba024e 100644 --- a/keyboards/paprikman/albacore/keymaps/default/keymap.c +++ b/keyboards/paprikman/albacore/keymaps/default/keymap.c @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(1), KC_MPRV, KC_MPLY, KC_MNXT ), [1] = LAYOUT( - RGB_TOG, RGB_MOD, RGB_VAI, - _______, RGB_SPI, RGB_SPD, RGB_VAD + RM_TOGG, RM_NEXT, RM_VALU, + _______, RM_SPDU, RM_SPDD, RM_VALD ), }; diff --git a/keyboards/percent/canoe_gen2/keymaps/default/keymap.c b/keyboards/percent/canoe_gen2/keymaps/default/keymap.c index a434fd184a..a21efb2322 100644 --- a/keyboards/percent/canoe_gen2/keymaps/default/keymap.c +++ b/keyboards/percent/canoe_gen2/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, - _______, _______, _______, _______, RGB_MOD, _______, _______, _______, _______), + _______, RM_TOGG, RM_NEXT, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, + _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______), }; diff --git a/keyboards/phase_studio/titan65/hotswap/keymaps/default/keymap.c b/keyboards/phase_studio/titan65/hotswap/keymaps/default/keymap.c index 5da05af159..5885b93482 100644 --- a/keyboards/phase_studio/titan65/hotswap/keymaps/default/keymap.c +++ b/keyboards/phase_studio/titan65/hotswap/keymaps/default/keymap.c @@ -26,8 +26,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT( KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, - _______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/phentech/rpk_001/keymaps/default/keymap.c b/keyboards/phentech/rpk_001/keymaps/default/keymap.c index b07a7f64c0..3cc983f707 100644 --- a/keyboards/phentech/rpk_001/keymaps/default/keymap.c +++ b/keyboards/phentech/rpk_001/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_RMOD, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_PREV, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/pimoroni/keybow2040/keymaps/default/keymap.json b/keyboards/pimoroni/keybow2040/keymaps/default/keymap.json index 8f26d6c78f..e099c28733 100644 --- a/keyboards/pimoroni/keybow2040/keymaps/default/keymap.json +++ b/keyboards/pimoroni/keybow2040/keymaps/default/keymap.json @@ -15,8 +15,8 @@ [ "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", "KC_TRANSPARENT", - "RGB_SAD", "RGB_SAI", "RGB_HUD", "RGB_HUI", - "KC_TRANSPARENT", "RGB_TOG", "RGB_RMOD", "RGB_MOD", + "RM_SATD", "RM_SATU", "RM_HUED", "RM_HUEU", + "KC_TRANSPARENT", "RM_TOGG", "RM_PREV", "RM_NEXT", "TO(0)" ] ] diff --git a/keyboards/playkbtw/pk64rgb/keymaps/default/keymap.c b/keyboards/playkbtw/pk64rgb/keymaps/default/keymap.c index 1b3b6fe102..ee8e4e0967 100644 --- a/keyboards/playkbtw/pk64rgb/keymaps/default/keymap.c +++ b/keyboards/playkbtw/pk64rgb/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_64_ansi( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______,_______,_______, _______,_______, _______, _______,_______,_______, _______,_______,_______, _______, - RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, _______, _______,_______, _______, + RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, _______, _______,_______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, _______,_______,_______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/projectd/65/projectd_65_ansi/keymaps/default/keymap.c b/keyboards/projectd/65/projectd_65_ansi/keymaps/default/keymap.c index e7a34d3467..f8700f624b 100644 --- a/keyboards/projectd/65/projectd_65_ansi/keymaps/default/keymap.c +++ b/keyboards/projectd/65/projectd_65_ansi/keymaps/default/keymap.c @@ -80,10 +80,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT( 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_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, RGB_VAI, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI), + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, RM_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU), [2] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/projectd/75/ansi/keymaps/default/keymap.c b/keyboards/projectd/75/ansi/keymaps/default/keymap.c index 36e4937481..699f6915da 100644 --- a/keyboards/projectd/75/ansi/keymaps/default/keymap.c +++ b/keyboards/projectd/75/ansi/keymaps/default/keymap.c @@ -32,10 +32,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, RM_TOGG, RM_NEXT, RM_PREV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - _______, _______, _______, _______, MO(2), _______, _______, RGB_SPD, RGB_VAD, RGB_SPI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + _______, _______, _______, _______, MO(2), _______, _______, RM_SPDD, RM_VALD, RM_SPDU), [2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/projectd/75/iso/keymaps/default/keymap.c b/keyboards/projectd/75/iso/keymaps/default/keymap.c index 2f6e6cf310..e61afe5ada 100644 --- a/keyboards/projectd/75/iso/keymaps/default/keymap.c +++ b/keyboards/projectd/75/iso/keymaps/default/keymap.c @@ -32,10 +32,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, RM_TOGG, RM_NEXT, RM_PREV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - _______, _______, _______, _______, MO(2), _______, _______, RGB_SPD, RGB_VAD, RGB_SPI), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + _______, _______, _______, _______, MO(2), _______, _______, RM_SPDD, RM_VALD, RM_SPDU), [2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/protozoa/p01/keymaps/default/keymap.c b/keyboards/protozoa/p01/keymaps/default/keymap.c index 61ef46c909..949d77902b 100644 --- a/keyboards/protozoa/p01/keymaps/default/keymap.c +++ b/keyboards/protozoa/p01/keymaps/default/keymap.c @@ -31,7 +31,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/quarkeys/z40/keymaps/default/keymap.c b/keyboards/quarkeys/z40/keymaps/default/keymap.c index 8a08e47153..2524fc43ee 100644 --- a/keyboards/quarkeys/z40/keymaps/default/keymap.c +++ b/keyboards/quarkeys/z40/keymaps/default/keymap.c @@ -45,10 +45,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+------+------+------+------+-------------+------+------+------+-------+------' */ [1] = LAYOUT_planck_mit( - QK_BOOT, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, KC_BSLS, KC_7, KC_8, KC_9, RGB_TOG, _______, - _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_PLUS, KC_MINS, KC_4, KC_5, KC_6, RGB_MOD, _______, - _______, KC_VOLD, KC_VOLU, _______, _______, KC_ASTR, KC_SLSH, KC_1, KC_2, KC_3, RGB_HUI, _______, - RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_0, _______, _______, KC_DOT, RGB_HUD, KC_EQL + QK_BOOT, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, KC_BSLS, KC_7, KC_8, KC_9, RM_TOGG, _______, + _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_PLUS, KC_MINS, KC_4, KC_5, KC_6, RM_NEXT, _______, + _______, KC_VOLD, KC_VOLU, _______, _______, KC_ASTR, KC_SLSH, KC_1, KC_2, KC_3, RM_HUEU, _______, + RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_0, _______, _______, KC_DOT, RM_HUED, KC_EQL ), /* [2] diff --git a/keyboards/redragon/k667/keymaps/default/keymap.c b/keyboards/redragon/k667/keymaps/default/keymap.c index d4c2eb964a..8d1a07592c 100644 --- a/keyboards/redragon/k667/keymaps/default/keymap.c +++ b/keyboards/redragon/k667/keymaps/default/keymap.c @@ -25,7 +25,7 @@ enum layer_names #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_FnLay] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [_FnLay] = { ENCODER_CCW_CW(RM_VALD, RM_VALU) }, }; #endif @@ -40,10 +40,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FnLay] = LAYOUT( QK_BOOT, KC_MY_COMPUTER, KC_WWW_HOME, KC_CALCULATOR, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_MAIL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAI, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, XXXXXXX, _______, XXXXXXX, RGB_SPD, RGB_VAD, RGB_SPI + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_VALU, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, RM_TOGG, XXXXXXX, _______, XXXXXXX, RM_SPDD, RM_VALD, RM_SPDU ) }; diff --git a/keyboards/rgbkb/mun/keymaps/default/keymap.c b/keyboards/rgbkb/mun/keymaps/default/keymap.c index 100e5f745e..a309aef809 100644 --- a/keyboards/rgbkb/mun/keymaps/default/keymap.c +++ b/keyboards/rgbkb/mun/keymaps/default/keymap.c @@ -75,9 +75,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LPRN, KC_RPRN, 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_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SC_SENT, - KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, ADJUST, KC_SPC, KC_DEL, KC_ENT, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_RCTL, + KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, ADJUST, KC_SPC, KC_DEL, KC_ENT, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_RCTL, - KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_MPRV, RGB_HUI, RGB_HUD, RGB_RMOD,RGB_TOG, RGB_MOD + KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_MPRV, RM_HUEU, RM_HUED, RM_PREV, RM_TOGG, RM_NEXT ), [_COLEMAK] = LAYOUT( @@ -112,10 +112,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, - _______, RGB_SAD, RGB_VAI, RGB_SAI, QK_BOOT, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, - _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, - _______, RGB_SPD, _______, RGB_SPI, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, GAME, - _______, RGB_RMOD,_______, RGB_MOD, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, QWERTY, COLEMAK, + _______, RM_SATD, RM_VALU, RM_SATU, QK_BOOT, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, + _______, RM_HUED, RM_VALD, RM_HUEU, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, + _______, RM_SPDD, _______, RM_SPDU, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, GAME, + _______, RM_PREV, _______, RM_NEXT, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, QWERTY, COLEMAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/rgbkb/pan/keymaps/default/keymap.c b/keyboards/rgbkb/pan/keymaps/default/keymap.c index 887056723e..3647ae2ad6 100644 --- a/keyboards/rgbkb/pan/keymaps/default/keymap.c +++ b/keyboards/rgbkb/pan/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SC_RSPC, - KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT + KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT ), [_COLEMAK] = LAYOUT_all( @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, FN_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SC_RSPC, KC_ENT, - KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT + KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT ), [_FN] = LAYOUT_all( @@ -54,15 +54,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_PGDN, KC_UP, KC_PGUP, _______, _______, _______, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, _______, KC_RBRC, _______, _______, _______, - _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______ ), [_ADJ] = 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, KC_PSCR, - _______, RGB_SAD, RGB_VAI, RGB_SAI, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, - _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, - _______, RGB_SPD, _______, RGB_SPI, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, - _______, _______, _______, RGB_MOD, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, _QWERTY, _COLEMAK + _______, RM_SATD, RM_VALU, RM_SATU, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, + _______, RM_HUED, RM_VALD, RM_HUEU, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, + _______, RM_SPDD, _______, RM_SPDU, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, + _______, _______, _______, RM_NEXT, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, _QWERTY, _COLEMAK ) }; diff --git a/keyboards/rgbkb/pan/keymaps/default_eee/keymap.c b/keyboards/rgbkb/pan/keymaps/default_eee/keymap.c index 57b0dafd6a..2de45d88e6 100644 --- a/keyboards/rgbkb/pan/keymaps/default_eee/keymap.c +++ b/keyboards/rgbkb/pan/keymaps/default_eee/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SC_RSPC, - KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), [_COLEMAK] = LAYOUT_eee( @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, FN_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, 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_ENT, - KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, MO(_ADJ),KC_SPC, KC_SPC, MO(_FN), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), [_FN] = LAYOUT_eee( @@ -54,15 +54,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_PGDN, KC_UP, KC_PGUP, _______, _______, _______, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, _______, KC_RBRC, _______, _______, - _______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______ ), [_ADJ] = LAYOUT_eee( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_PSCR, - _______, RGB_SAD, RGB_VAI, RGB_SAI, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, - _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, - _______, RGB_SPD, _______, RGB_SPI, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, - _______, _______, _______, RGB_MOD, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, QWERTY, COLEMAK + _______, RM_SATD, RM_VALU, RM_SATU, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, + _______, RM_HUED, RM_VALD, RM_HUEU, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, + _______, RM_SPDD, _______, RM_SPDU, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, + _______, _______, _______, RM_NEXT, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, QWERTY, COLEMAK ) }; diff --git a/keyboards/rgbkb/pan/keymaps/default_sss/keymap.c b/keyboards/rgbkb/pan/keymaps/default_sss/keymap.c index a872175c75..b0b8bd1898 100644 --- a/keyboards/rgbkb/pan/keymaps/default_sss/keymap.c +++ b/keyboards/rgbkb/pan/keymaps/default_sss/keymap.c @@ -59,9 +59,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJ] = LAYOUT_sss( 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_PSCR, - _______, RGB_SAD, RGB_VAI, RGB_SAI, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, - _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, - _______, RGB_SPD, _______, RGB_SPI, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, + _______, RM_SATD, RM_VALU, RM_SATU, QK_BOOT, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, + _______, RM_HUED, RM_VALD, RM_HUEU, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, + _______, RM_SPDD, _______, RM_SPDU, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, _______, _______, _______, QWERTY, _______, COLEMAK ) }; diff --git a/keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c b/keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c index ab938a9b3d..45f7117989 100755 --- a/keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c +++ b/keyboards/rot13labs/h4ckb0ard/keymaps/default/keymap.c @@ -38,8 +38,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* SPC - RGB control layer */ [3] = LAYOUT( - KC_ESC, KC_Q, RGB_M_SW, KC_E, RGB_M_R, KC_T, KC_Y, RGB_SPD, RGB_SPI, RGB_RMOD, RGB_MOD, KC_DEL, - KC_TAB, KC_A, RGB_M_P, KC_D, KC_F, KC_G, KC_H, RGB_SAD, RGB_SAI, RGB_TOG, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, RGB_M_B, KC_N, KC_M, KC_RCTL, RGB_VAI, DF(0), - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, _______, RGB_HUD, RGB_VAD, RGB_HUI), + KC_ESC, KC_Q, RGB_M_SW, KC_E, RGB_M_R, KC_T, KC_Y, RM_SPDD, RM_SPDU, RM_PREV, RM_NEXT, KC_DEL, + KC_TAB, KC_A, RGB_M_P, KC_D, KC_F, KC_G, KC_H, RM_SATD, RM_SATU, RM_TOGG, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, RGB_M_B, KC_N, KC_M, KC_RCTL, RM_VALU, DF(0), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, _______, RM_HUED, RM_VALD, RM_HUEU), }; \ No newline at end of file diff --git a/keyboards/ryanskidmore/rskeys100/keymaps/default/keymap.c b/keyboards/ryanskidmore/rskeys100/keymaps/default/keymap.c index 8b88f90dae..3d7a383051 100644 --- a/keyboards/ryanskidmore/rskeys100/keymaps/default/keymap.c +++ b/keyboards/ryanskidmore/rskeys100/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALD, _______, _______, _______ ), }; diff --git a/keyboards/s_ol/0xc_pad/keymaps/default/keymap.c b/keyboards/s_ol/0xc_pad/keymaps/default/keymap.c index 562d895071..15d84b6d72 100644 --- a/keyboards/s_ol/0xc_pad/keymaps/default/keymap.c +++ b/keyboards/s_ol/0xc_pad/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - RGB_RMOD, RGB_MOD, + RM_PREV, RM_NEXT, KC_CUT , KC_COPY, KC_PSTE, KC_PGUP, KC_PGDN, KC_VOLU, KC_VOLD, KC_1 , KC_2 , KC_3 diff --git a/keyboards/sharkoon/skiller_sgk50_s2/keymaps/default/keymap.c b/keyboards/sharkoon/skiller_sgk50_s2/keymaps/default/keymap.c index 01e78f3124..823d779b7f 100644 --- a/keyboards/sharkoon/skiller_sgk50_s2/keymaps/default/keymap.c +++ b/keyboards/sharkoon/skiller_sgk50_s2/keymaps/default/keymap.c @@ -15,11 +15,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_all( - EE_CLR, KC_MPLY, KC_MPRV, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_SPD, RGB_SPI, _______, _______, KC_PSCR, KC_SCRL, _______, _______, _______, _______, _______, _______, + EE_CLR, KC_MPLY, KC_MPRV, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RM_SPDD, RM_SPDU, _______, _______, KC_PSCR, KC_SCRL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, - _______, GU_TOGG, _______, _______, _______, _______, _______, RGB_HUI, RGB_VAD, RGB_MOD, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, RM_HUEU, RM_VALD, RM_NEXT, _______, _______ ), }; diff --git a/keyboards/sharkoon/skiller_sgk50_s3/keymaps/default/keymap.c b/keyboards/sharkoon/skiller_sgk50_s3/keymaps/default/keymap.c index dd09e56060..38a52dad28 100644 --- a/keyboards/sharkoon/skiller_sgk50_s3/keymaps/default/keymap.c +++ b/keyboards/sharkoon/skiller_sgk50_s3/keymaps/default/keymap.c @@ -15,10 +15,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( EE_CLR, KC_MPLY, KC_MPRV, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SPD, RGB_SPI, _______, RGB_SAI, - _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, RM_SATU, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, - _______, GU_TOGG, _______, _______, _______, _______, _______, RGB_HUI, RGB_VAD, RGB_MOD + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_VALU, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, RM_HUEU, RM_VALD, RM_NEXT ), }; diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c index 84e72510d7..a8a64d1f2d 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c +++ b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c @@ -14,9 +14,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [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, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, RGB_VAI, + _______, _______, _______, _______, _______, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, RM_VALU, _______, _______, _______, _______, _______, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, RGB_VAD, _______, - _______, GU_TOGG, _______, _______, _______, _______, RGB_HUI, RGB_MOD + _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, RM_VALD, _______, + _______, GU_TOGG, _______, _______, _______, _______, RM_HUEU, RM_NEXT ) }; diff --git a/keyboards/skeletonkbd/frost68/keymaps/default/keymap.c b/keyboards/skeletonkbd/frost68/keymaps/default/keymap.c index 3d0d6dc794..be7c414f8a 100644 --- a/keyboards/skeletonkbd/frost68/keymaps/default/keymap.c +++ b/keyboards/skeletonkbd/frost68/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_L1] = LAYOUT( 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_TRNS, KC_PSCR, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_SCRL, KC_PAUS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RM_SPDU, RM_SPDD, KC_SCRL, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LNG2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS), diff --git a/keyboards/skmt/15k/keymaps/default/keymap.c b/keyboards/skmt/15k/keymaps/default/keymap.c index 74144f71a5..093a813f95 100644 --- a/keyboards/skmt/15k/keymaps/default/keymap.c +++ b/keyboards/skmt/15k/keymaps/default/keymap.c @@ -19,8 +19,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F1, KC_KP_7, KC_KP_4, KC_KP_1, KC_KP_0 ), [1] = LAYOUT_default( - RGB_TOG,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - RGB_MOD,RGB_HUI,RGB_SAI,RGB_VAI,RGB_SPI, - RGB_RMOD,RGB_HUD,RGB_SAD,RGB_VAD,RGB_SPD + RM_TOGG,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + RM_NEXT,RM_HUEU,RM_SATU,RM_VALU,RM_SPDU, + RM_PREV,RM_HUED,RM_SATD,RM_VALD,RM_SPDD ) }; diff --git a/keyboards/skyloong/dt40/keymaps/default/keymap.c b/keyboards/skyloong/dt40/keymaps/default/keymap.c index c8f828156a..9f7503930b 100644 --- a/keyboards/skyloong/dt40/keymaps/default/keymap.c +++ b/keyboards/skyloong/dt40/keymaps/default/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_O, KC_I, KC_BSPC, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_L, KC_P, KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RSFT, KC_UP, RGB_TOG, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RSFT, KC_UP, RM_TOGG, KC_LCTL, KC_LALT, KC_SPC, KC_LWIN, KC_SPC, KC_K, KC_SPC, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT ) }; diff --git a/keyboards/skyloong/gk61/v1/keymaps/default/keymap.c b/keyboards/skyloong/gk61/v1/keymaps/default/keymap.c index 4ddb35f6f4..615d66fe6f 100644 --- a/keyboards/skyloong/gk61/v1/keymaps/default/keymap.c +++ b/keyboards/skyloong/gk61/v1/keymaps/default/keymap.c @@ -36,8 +36,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Fn+ */ [_FN] = LAYOUT_all( 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_PSCR, - RGB_TOG, RGB_VAD, RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLD, KC_VOLU, KC_MUTE, - RGB_MOD, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MPRV, KC_MNXT, KC_MPLY, + RM_TOGG, RM_VALD, RM_VALU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLD, KC_VOLU, KC_MUTE, + RM_NEXT, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MPRV, KC_MNXT, KC_MPLY, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_UP, KC_RSFT, KC_CALC, KC_MAIL, KC_NO, KC_SPC, KC_SPC, KC_SPC, KC_LEFT, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO ), diff --git a/keyboards/sleepy_craft_studios/sleepy_keeb_split/keymaps/default/keymap.c b/keyboards/sleepy_craft_studios/sleepy_keeb_split/keymaps/default/keymap.c index 65bd5c4609..3ac3ccbfeb 100644 --- a/keyboards/sleepy_craft_studios/sleepy_keeb_split/keymaps/default/keymap.c +++ b/keyboards/sleepy_craft_studios/sleepy_keeb_split/keymaps/default/keymap.c @@ -17,13 +17,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_UP, KC_DOWN, KC_LEFT, KC_RGHT ), [_RAISE] = LAYOUT_ortho_4x12( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, RGB_MOD, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, UG_NEXT, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), [_FN] = LAYOUT_ortho_4x12( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, RGB_TOG, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UG_TOGG, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY diff --git a/keyboards/smallkeyboard/keymaps/default/keymap.c b/keyboards/smallkeyboard/keymaps/default/keymap.c index 9ab00be05c..e39fde99c1 100644 --- a/keyboards/smallkeyboard/keymaps/default/keymap.c +++ b/keyboards/smallkeyboard/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_P1, KC_P2, MO(1), KC_P3, KC_P4, KC_P3), [1] = LAYOUT_ortho_2x3( - RGB_TOG, RGB_MOD, MO(1), + RM_TOGG, RM_NEXT, MO(1), AU_ON, AU_OFF, MI_ON), [2] = LAYOUT_ortho_2x3( KC_P4, KC_P5, MO(1), diff --git a/keyboards/sowbug/68keys/keymaps/default/keymap.c b/keyboards/sowbug/68keys/keymaps/default/keymap.c index b8c34f9525..0fe7465c88 100644 --- a/keyboards/sowbug/68keys/keymaps/default/keymap.c +++ b/keyboards/sowbug/68keys/keymaps/default/keymap.c @@ -34,13 +34,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ _______, 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_HOME, //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ - BL_TOGG, BL_STEP, KC_UP, _______, _______, _______, _______, _______, RGB_SPI, KC_PSCR, KC_SCRL, KC_PAUS, _______, KC_BSLS, _______, KC_END, + BL_TOGG, BL_STEP, KC_UP, _______, _______, _______, _______, _______, RM_SPDU, KC_PSCR, KC_SCRL, KC_PAUS, _______, KC_BSLS, _______, KC_END, //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_QUOT, KC_ENTER, //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ - _______, _______, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_END, _______, RGB_MOD, + _______, _______, KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_END, _______, RM_NEXT, //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ - _______, _______, _______, _______, _______, _______, KC_MENU, RGB_VAI, RGB_TOG, RGB_HUI + _______, _______, _______, _______, _______, _______, KC_MENU, RM_VALU, RM_TOGG, RM_HUEU //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ ) diff --git a/keyboards/sowbug/ansi_tkl/keymaps/default/keymap.c b/keyboards/sowbug/ansi_tkl/keymaps/default/keymap.c index 0015ae8c34..894fd67a7d 100644 --- a/keyboards/sowbug/ansi_tkl/keymaps/default/keymap.c +++ b/keyboards/sowbug/ansi_tkl/keymaps/default/keymap.c @@ -28,11 +28,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [1] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, QK_BOOT , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, QK_BOOT, _______, BL_TOGG, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, - _______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, - _______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, RM_SPDD, RM_VALU, RM_SPDU, RM_HUEU, RM_SATU, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, + _______, RM_PREV, RM_VALD, RM_NEXT, RM_HUED, RM_SATD, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* diff --git a/keyboards/spaceholdings/nebula12b/keymaps/default/keymap.c b/keyboards/spaceholdings/nebula12b/keymaps/default/keymap.c index f6c680d095..d7297e3fa9 100755 --- a/keyboards/spaceholdings/nebula12b/keymaps/default/keymap.c +++ b/keyboards/spaceholdings/nebula12b/keymaps/default/keymap.c @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MO(1), KC_P0, KC_PDOT), [1] = LAYOUT_ortho_4x3( /* FN */ - RGB_TOG, RGB_MOD, KC_TRNS, + RM_TOGG, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PENT) diff --git a/keyboards/spaceholdings/nebula68b/keymaps/default/keymap.c b/keyboards/spaceholdings/nebula68b/keymaps/default/keymap.c index c42ca071f3..e441b52cab 100644 --- a/keyboards/spaceholdings/nebula68b/keymaps/default/keymap.c +++ b/keyboards/spaceholdings/nebula68b/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_68_ansi( /* FN */ 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, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, _______, _______, _______, _______, _______) diff --git a/keyboards/spaceholdings/nebula68b/solder/keymaps/default_split_bs/keymap.c b/keyboards/spaceholdings/nebula68b/solder/keymaps/default_split_bs/keymap.c index 68fe5d22fd..353a36d018 100755 --- a/keyboards/spaceholdings/nebula68b/solder/keymaps/default_split_bs/keymap.c +++ b/keyboards/spaceholdings/nebula68b/solder/keymaps/default_split_bs/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_68_ansi_split_bs( /* FN */ 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, _______, _______, - _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, _______, _______, _______, _______, _______) diff --git a/keyboards/splitkb/aurora/corne/keymaps/default/keymap.json b/keyboards/splitkb/aurora/corne/keymaps/default/keymap.json index 75918297c5..8c4861dda3 100644 --- a/keyboards/splitkb/aurora/corne/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/corne/keymaps/default/keymap.json @@ -24,8 +24,8 @@ ], [ "QK_BOOT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , - "RGB_TOG" , "RGB_HUI" , "RGB_SAI" , "RGB_VAI" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , - "RGB_MOD" , "RGB_HUD" , "RGB_SAD" , "RGB_VAD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "RM_TOGG" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "RM_NEXT" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT" ] diff --git a/keyboards/splitkb/aurora/helix/keymaps/default/keymap.json b/keyboards/splitkb/aurora/helix/keymaps/default/keymap.json index bc818a7322..5411d34941 100644 --- a/keyboards/splitkb/aurora/helix/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/helix/keymaps/default/keymap.json @@ -43,8 +43,8 @@ "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "_______", "QK_BOOT", "_______", "EE_CLR", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "KC_DEL", "_______", "_______", "_______", "_______", "_______", "AG_NORM", "AG_SWAP", "_______", "_______", "_______", "_______", "_______", - "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "RGB_TOG", "RGB_HUI", "RGB_SAI", "RGB_VAI", - "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "RGB_MOD", "RGB_HUD", "RGB_SAD", "RGB_VAD" + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD" ] ], "layout": "LAYOUT", diff --git a/keyboards/splitkb/aurora/lily58/keymaps/default/keymap.json b/keyboards/splitkb/aurora/lily58/keymaps/default/keymap.json index de46093800..ed1bfcf9e7 100644 --- a/keyboards/splitkb/aurora/lily58/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/lily58/keymaps/default/keymap.json @@ -28,8 +28,8 @@ [ "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", - "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_TOG", "RGB_HUI", "RGB_SAI", "RGB_VAI", - "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RGB_MOD", "RGB_HUD", "RGB_SAD", "RGB_VAD", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" ] ], diff --git a/keyboards/splitkb/aurora/sofle_v2/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sofle_v2/keymaps/default/keymap.json index 226952964b..19146dbde1 100644 --- a/keyboards/splitkb/aurora/sofle_v2/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/sofle_v2/keymaps/default/keymap.json @@ -28,8 +28,8 @@ [ "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , - "XXXXXXX" , "RGB_TOG" , "RGB_HUI" , "RGB_SAI" , "RGB_VAI" , "XXXXXXX" , "XXXXXXX" , "KC_VOLD" , "KC_MUTE" , "KC_VOLU" , "XXXXXXX" , "XXXXXXX" , - "XXXXXXX" , "RGB_MOD" , "RGB_HUD" , "RGB_SAD" , "RGB_VAD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_MPRV" , "KC_MPLY" , "KC_MNXT" , "XXXXXXX" , "XXXXXXX" , + "XXXXXXX" , "RM_TOGG" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "XXXXXXX" , "XXXXXXX" , "KC_VOLD" , "KC_MUTE" , "KC_VOLU" , "XXXXXXX" , "XXXXXXX" , + "XXXXXXX" , "RM_NEXT" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_MPRV" , "KC_MPLY" , "KC_MNXT" , "XXXXXXX" , "XXXXXXX" , "_______" , "_______" , "_______" , "_______" , "_______" , "_______" , "_______" , "_______" , "_______" , "_______" ] ], diff --git a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json index ade21d5ece..1d308d531f 100644 --- a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json @@ -11,9 +11,9 @@ "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1" ], [ - "RGB_TOG" , "RGB_MOD" , "RGB_HUI" , "RGB_SAI" , "RGB_VAI" , "RGB_SPI" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", + "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", - "KC_TRNS" , "RGB_RMOD" , "RGB_HUD" , "RGB_SAD" , "RGB_VAD" , "RGB_SPD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" ], [ @@ -26,7 +26,7 @@ "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_UNDS" , "KC_PIPE" , "KC_QUOT" , "KC_TRNS", "KC_CIRC" , "KC_ASTR" , "KC_AMPR" , "KC_NO" , "KC_TRNS" , "KC_HASH" , "KC_TILD" , "KC_SLSH" , "KC_DQUO" , "KC_DLR", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_MINS" , "KC_BSLS" , "KC_GRV" , "KC_TRNS", - "RGB_RMOD" , "KC_TRNS" , "KC_TRNS" , "RGB_MOD" + "RM_PREV" , "KC_TRNS" , "KC_TRNS" , "RM_NEXT" ], [ "KC_TRNS" , "KC_COLN" , "KC_LT" , "KC_GT" , "KC_SCLN" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", diff --git a/keyboards/splitkb/kyria/keymaps/default/keymap.c b/keyboards/splitkb/kyria/keymaps/default/keymap.c index dacbc423b2..5512293078 100644 --- a/keyboards/splitkb/kyria/keymaps/default/keymap.c +++ b/keyboards/splitkb/kyria/keymaps/default/keymap.c @@ -189,8 +189,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT( _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, DVORAK , _______, _______, RGB_TOG, RGB_SAI, RGB_HUI, RGB_VAI, RGB_MOD, _______, - _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_VAD, RGB_RMOD, _______, + _______, _______, _______, DVORAK , _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______, + _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______, _______, _______, _______,_______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/stront/keymaps/default/keymap.c b/keyboards/stront/keymaps/default/keymap.c index 793a2495c7..d9418c50f0 100644 --- a/keyboards/stront/keymaps/default/keymap.c +++ b/keyboards/stront/keymaps/default/keymap.c @@ -98,9 +98,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_SYS] = LAYOUT( - BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, - EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RM_TOGG, RM_NEXT, RM_PREV, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, EH_LEFT, _______, QK_BOOT, _______, _______, QK_BOOT, _______ ) // clang-format on diff --git a/keyboards/stront/keymaps/hid/keymap.c b/keyboards/stront/keymaps/hid/keymap.c index 11cb89c48e..806f92f7a9 100644 --- a/keyboards/stront/keymaps/hid/keymap.c +++ b/keyboards/stront/keymaps/hid/keymap.c @@ -90,9 +90,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_SYS] = LAYOUT( - BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, - EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RM_TOGG, RM_NEXT, RM_PREV, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, EH_LEFT, _______, QK_BOOT, _______, _______, QK_BOOT, _______ ) // clang-format on diff --git a/keyboards/stront/keymaps/i2c/keymap.c b/keyboards/stront/keymaps/i2c/keymap.c index 793a2495c7..d9418c50f0 100644 --- a/keyboards/stront/keymaps/i2c/keymap.c +++ b/keyboards/stront/keymaps/i2c/keymap.c @@ -98,9 +98,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_SYS] = LAYOUT( - BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, - EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, EH_LEFT, + BL_DOWN, BL_UP, BL_TOGG, XXXXXXX, XXXXXXX, RM_TOGG, RM_NEXT, RM_PREV, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, RGB_M_P, + EH_LEFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EH_RGHT, EH_RGHT, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, EH_LEFT, _______, QK_BOOT, _______, _______, QK_BOOT, _______ ) // clang-format on diff --git a/keyboards/teleport/native/ansi/keymaps/default/keymap.c b/keyboards/teleport/native/ansi/keymaps/default/keymap.c index 692aa49359..381228f42d 100644 --- a/keyboards/teleport/native/ansi/keymaps/default/keymap.c +++ b/keyboards/teleport/native/ansi/keymaps/default/keymap.c @@ -42,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FN1] = LAYOUT_75_ansi( /* keymap for layer 2 */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, - RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, - KC_TRNS, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, + RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, + KC_TRNS, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(GAME),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) diff --git a/keyboards/teleport/native/iso/keymaps/default/keymap.c b/keyboards/teleport/native/iso/keymaps/default/keymap.c index 1f226c6358..1ad7cb1f62 100644 --- a/keyboards/teleport/native/iso/keymaps/default/keymap.c +++ b/keyboards/teleport/native/iso/keymaps/default/keymap.c @@ -42,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FN1] = LAYOUT_75_iso( /* keymap for layer 2 */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, - RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, - KC_TRNS, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_TOGG, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, + RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, + KC_TRNS, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG(GAME),KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/tkc/portico/keymaps/default/keymap.c b/keyboards/tkc/portico/keymaps/default/keymap.c index d00d0bbf2c..e83249bf81 100644 --- a/keyboards/tkc/portico/keymaps/default/keymap.c +++ b/keyboards/tkc/portico/keymaps/default/keymap.c @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef RGB_BACKLIGHT_PORTICO [1] = LAYOUT_65_ansi_blocker( QK_GESC, 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, - _______, EF_INC, EF_DEC, BR_INC, BR_DEC, H1_INC, H1_DEC, S1_INC, S1_DEC, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + _______, EF_INC, EF_DEC, BR_INC, BR_DEC, H1_INC, H1_DEC, S1_INC, S1_DEC, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, KC_CAPS, _______, _______, _______, _______, H2_INC, H2_DEC, S2_INC, S2_DEC, _______, _______, _______, _______, KC_PGDN, KC_LSFT, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT @@ -44,8 +44,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #else [1] = LAYOUT_65_ansi_blocker( QK_GESC, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - KC_CAPS, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + KC_CAPS, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_LSFT, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ), diff --git a/keyboards/tkc/portico68v2/keymaps/default/keymap.c b/keyboards/tkc/portico68v2/keymaps/default/keymap.c index 6a15b17613..7c190f387f 100644 --- a/keyboards/tkc/portico68v2/keymaps/default/keymap.c +++ b/keyboards/tkc/portico68v2/keymaps/default/keymap.c @@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_65_ansi_blocker( QK_GESC, 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, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, - KC_CAPS, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, + _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_PGUP, + KC_CAPS, RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_LSFT, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c b/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c index c7e12ebbb7..291f98a60e 100644 --- a/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c +++ b/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c @@ -49,8 +49,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAV] = LAYOUT( QK_BOOT, _______, AG_NORM, AG_SWAP, DB_TOGG, KC_TRNS, KC_GRV, KC_PGDN, KC_UP, KC_PGUP, KC_SCLN, - RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_MINS, KC_INT1, KC_COMM, KC_DOT, KC_BSLS, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, KC_NO, KC_MINS, KC_INT1, KC_COMM, KC_DOT, KC_BSLS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/treasure/type9s3/keymaps/default/keymap.c b/keyboards/treasure/type9s3/keymaps/default/keymap.c index aecf899e6c..1c789f3eba 100644 --- a/keyboards/treasure/type9s3/keymaps/default/keymap.c +++ b/keyboards/treasure/type9s3/keymaps/default/keymap.c @@ -6,15 +6,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_3x3( - MO(1), KC_MPLY, RGB_TOG, + MO(1), KC_MPLY, RM_TOGG, KC_VOLD, KC_MUTE, KC_VOLU, KC_KP_1, KC_KP_2, KC_KP_3 ), [1] = LAYOUT_ortho_3x3( KC_TRNS, RGB_M_P, MO(2), - RGB_MOD, RGB_HUI, RGB_VAI, - RGB_RMOD, RGB_HUD, RGB_VAD + RM_NEXT, RM_HUEU, RM_VALU, + RM_PREV, RM_HUED, RM_VALD ), [2] = LAYOUT_ortho_3x3( diff --git a/keyboards/tzarc/djinn/keymaps/default/keymap.c b/keyboards/tzarc/djinn/keymaps/default/keymap.c index 972b9c97a6..b63e1624c7 100644 --- a/keyboards/tzarc/djinn/keymaps/default/keymap.c +++ b/keyboards/tzarc/djinn/keymaps/default/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_PGUP, 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_END, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_LGUI, MO(_LOWER),KC_SPC, KC_NO, KC_NO, KC_SPC, MO(_RAISE),KC_LALT, - RGB_RMOD, RGB_MOD, + RM_PREV, RM_NEXT, KC_UP, KC_UP, KC_LEFT, _______, KC_RIGHT, KC_LEFT, _______, KC_RIGHT, KC_DOWN, KC_DOWN @@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // clang-format off const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) }, - [_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) }, - [_ADJUST] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, + [_LOWER] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU), ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [_RAISE] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, + [_ADJUST] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, }; // clang-format on diff --git a/keyboards/tzarc/ghoul/keymaps/default/keymap.c b/keyboards/tzarc/ghoul/keymaps/default/keymap.c index 57010c3a7b..e572e5ab01 100644 --- a/keyboards/tzarc/ghoul/keymaps/default/keymap.c +++ b/keyboards/tzarc/ghoul/keymaps/default/keymap.c @@ -27,25 +27,25 @@ extern void ui_task(void); // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT( - KC_Q, KC_W, KC_E, KC_R, KC_T, RGB_MOD, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_Q, KC_W, KC_E, KC_R, KC_T, RM_NEXT, KC_Y, KC_U, KC_I, KC_O, KC_P, HOME_A, HOME_S, HOME_D, HOME_F, KC_G, KC_H, HOME_J, HOME_K, HOME_L, HOME_SCLN, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ESC, KC_LCTL, KC_LGUI, KC_SPC, LOWER, RAISE, KC_SPC, KC_LALT, KC_BSPC, SC_SENT ), [_LOWER] = LAYOUT( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [_RAISE] = LAYOUT( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [_ADJUST] = LAYOUT( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, KC_TRNS, DB_TOGG, EE_CLR, QK_BOOT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, KC_TRNS, KC_TRNS, DB_TOGG, EE_CLR, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS @@ -54,10 +54,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // clang-format on const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_QWERTY] = {ENCODER_CCW_CW(RGB_HUI, RGB_HUD)}, - [_LOWER] = {ENCODER_CCW_CW(RGB_HUI, RGB_HUD)}, - [_RAISE] = {ENCODER_CCW_CW(RGB_HUI, RGB_HUD)}, - [_ADJUST] = {ENCODER_CCW_CW(RGB_HUI, RGB_HUD)}, + [_QWERTY] = {ENCODER_CCW_CW(RM_HUEU, RM_HUED)}, + [_LOWER] = {ENCODER_CCW_CW(RM_HUEU, RM_HUED)}, + [_RAISE] = {ENCODER_CCW_CW(RM_HUEU, RM_HUED)}, + [_ADJUST] = {ENCODER_CCW_CW(RM_HUEU, RM_HUED)}, }; layer_state_t layer_state_set_user(layer_state_t state) { diff --git a/keyboards/ungodly/launch_pad/keymaps/default/keymap.c b/keyboards/ungodly/launch_pad/keymaps/default/keymap.c index fb7a1e90be..701e3f6dc9 100644 --- a/keyboards/ungodly/launch_pad/keymaps/default/keymap.c +++ b/keyboards/ungodly/launch_pad/keymaps/default/keymap.c @@ -118,10 +118,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------' */ [2] = LAYOUT_ortho_5x4( - KC_LUP, XXXXXXX, XXXXXXX, RGB_TOG, - RGB_HUD, RGB_HUI, XXXXXXX, RGB_M_P, - RGB_SAD, RGB_SAI, XXXXXXX, RGB_MOD, - RGB_VAD, RGB_VAI, XXXXXXX, XXXXXXX, + KC_LUP, XXXXXXX, XXXXXXX, RM_TOGG, + RM_HUED, RM_HUEU, XXXXXXX, RGB_M_P, + RM_SATD, RM_SATU, XXXXXXX, RM_NEXT, + RM_VALD, RM_VALU, XXXXXXX, XXXXXXX, QK_BOOT, QK_BOOT, XXXXXXX, XXXXXXX ), }; diff --git a/keyboards/wekey/we27/keymaps/default/keymap.c b/keyboards/wekey/we27/keymaps/default/keymap.c index cd2d215d2c..7574c90e7c 100644 --- a/keyboards/wekey/we27/keymaps/default/keymap.c +++ b/keyboards/wekey/we27/keymaps/default/keymap.c @@ -20,16 +20,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_numpad_6x5( KC_ESC , KC_PWR , KC_SLEP, KC_F11 , KC_MUTE, KC_NUM, KC_BSPC, KC_PSLS, KC_PAST, KC_PMNS, - RGB_MOD, KC_P7 , KC_P8 , KC_P9 , - RGB_RMOD, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, - RGB_TOG, KC_P1 , KC_P2 , KC_P3 , + RM_NEXT, KC_P7 , KC_P8 , KC_P9 , + RM_PREV, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, + RM_TOGG, KC_P1 , KC_P2 , KC_P3 , MO(1) , KC_P0 , KC_PDOT, KC_PENT ), [1] = LAYOUT_numpad_6x5( _______, _______, _______, _______, KC_MPLY, _______, _______, _______, _______, _______, - RGB_SPI, RGB_HUI, RGB_SAI, RGB_VAI, - RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, _______, + RM_SPDU, RM_HUEU, RM_SATU, RM_VALU, + RM_SPDD, RM_HUED, RM_SATD, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT ), diff --git a/keyboards/winry/winry315/keymaps/default/keymap.c b/keyboards/winry/winry315/keymaps/default/keymap.c index a0bc2706ca..d884d08ea4 100644 --- a/keyboards/winry/winry315/keymaps/default/keymap.c +++ b/keyboards/winry/winry315/keymaps/default/keymap.c @@ -25,9 +25,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // RGB configuration [_RGB] = LAYOUT_top( RGB_M_P, RGB_M_B, RGB_M_R, - RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, - RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, - KC_TRNS, RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R + RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, + RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, + KC_TRNS, RM_TOGG, RGB_M_P, RGB_M_B, RGB_M_R ), }; // clang-format on diff --git a/keyboards/winry/winry315/keymaps/left_numpad/keymap.c b/keyboards/winry/winry315/keymaps/left_numpad/keymap.c index caa8811a5d..0ee1774814 100644 --- a/keyboards/winry/winry315/keymaps/left_numpad/keymap.c +++ b/keyboards/winry/winry315/keymaps/left_numpad/keymap.c @@ -25,11 +25,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* RGB configuration */ [_RGB] = LAYOUT_left( - RGB_M_R, KC_TRNS, RGB_SPD, RGB_SPI, - RGB_TOG, RGB_HUD, RGB_HUI, - RGB_M_B, RGB_M_P, RGB_SAD, RGB_SAI, - KC_NO, RGB_VAD, RGB_VAI, - RGB_M_P, KC_NUM, RGB_RMOD,RGB_MOD + RGB_M_R, KC_TRNS, RM_SPDD, RM_SPDU, + RM_TOGG, RM_HUED, RM_HUEU, + RGB_M_B, RGB_M_P, RM_SATD, RM_SATU, + KC_NO, RM_VALD, RM_VALU, + RGB_M_P, KC_NUM, RM_PREV, RM_NEXT ), }; // clang-format on diff --git a/keyboards/wolf/m60_b/keymaps/default/keymap.c b/keyboards/wolf/m60_b/keymaps/default/keymap.c index 152ab88b50..3c0fd2bc36 100644 --- a/keyboards/wolf/m60_b/keymaps/default/keymap.c +++ b/keyboards/wolf/m60_b/keymaps/default/keymap.c @@ -31,8 +31,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAYER1] = LAYOUT_60_hhkb( 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_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_TRNS, KC_TRNS, + KC_TRNS, RM_SPDU, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) diff --git a/keyboards/woodkeys/meira/keymaps/takmiya/keymap.c b/keyboards/woodkeys/meira/keymaps/takmiya/keymap.c index bba1b5583e..6442000ce1 100644 --- a/keyboards/woodkeys/meira/keymaps/takmiya/keymap.c +++ b/keyboards/woodkeys/meira/keymaps/takmiya/keymap.c @@ -103,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = LAYOUT( BL_TOGG, QK_BOOT, _______, KC_MRWD, KC_MPLY, KC_MFFD, KC_PSCR, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, - BL_STEP, RGB_MOD, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, + BL_STEP, UG_NEXT, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) @@ -191,7 +191,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released #ifdef RGBLIGHT_ENABLE - case RGB_MOD: + case QK_UNDERGLOW_MODE_NEXT: if (record->event.pressed) { rgblight_mode(RGB_current_mode); rgblight_step(); diff --git a/keyboards/xbows/knight/keymaps/default/keymap.c b/keyboards/xbows/knight/keymaps/default/keymap.c index 45f8afa8ff..33d832f9f8 100644 --- a/keyboards/xbows/knight/keymaps/default/keymap.c +++ b/keyboards/xbows/knight/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MYCM, KC_MSEL, KC_MAIL, NK_TOGG, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NUM, - RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, - KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, + KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/xbows/knight_plus/keymaps/default/keymap.c b/keyboards/xbows/knight_plus/keymaps/default/keymap.c index d7b3a65672..c77980cf5b 100644 --- a/keyboards/xbows/knight_plus/keymaps/default/keymap.c +++ b/keyboards/xbows/knight_plus/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MYCM, KC_MSEL, KC_MAIL, NK_TOGG, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NUM, - RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, - KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, + KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/xbows/nature/keymaps/default/keymap.c b/keyboards/xbows/nature/keymaps/default/keymap.c index 4ce9eaa964..edd690cdd8 100644 --- a/keyboards/xbows/nature/keymaps/default/keymap.c +++ b/keyboards/xbows/nature/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MYCM, KC_MSEL, KC_MAIL, NK_TOGG, EE_CLR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NUM, - RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, - KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, + KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/xbows/numpad/keymaps/default/keymap.c b/keyboards/xbows/numpad/keymaps/default/keymap.c index 177478ef9f..52c916114f 100644 --- a/keyboards/xbows/numpad/keymaps/default/keymap.c +++ b/keyboards/xbows/numpad/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_BOOT, EE_CLR, KC_TRNS, KC_TRNS, KC_CALC, KC_MYCM, KC_MSEL, KC_MAIL, - RGB_MOD, RGB_VAI, RGB_HUI, KC_VOLD, - RGB_SPD, RGB_TOG, RGB_SPI, KC_VOLU, - KC_TRNS, RGB_VAD, KC_TRNS, KC_TRNS, + RM_NEXT, RM_VALU, RM_HUEU, KC_VOLD, + RM_SPDD, RM_TOGG, RM_SPDU, KC_VOLU, + KC_TRNS, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/xbows/ranger/keymaps/default/keymap.c b/keyboards/xbows/ranger/keymaps/default/keymap.c index 1cce103f8d..f0e1d5c6f6 100644 --- a/keyboards/xbows/ranger/keymaps/default/keymap.c +++ b/keyboards/xbows/ranger/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi( QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MYCM, KC_MSEL, KC_MAIL, NK_TOGG, EE_CLR, KC_NUM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_SPD, RGB_VAD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_SPDD, RM_VALD, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/xbows/woody/keymaps/default/keymap.c b/keyboards/xbows/woody/keymaps/default/keymap.c index ea2cf42e2e..062ac97f6c 100644 --- a/keyboards/xbows/woody/keymaps/default/keymap.c +++ b/keyboards/xbows/woody/keymaps/default/keymap.c @@ -9,8 +9,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT( /* FN */ QK_GESC, 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_DEL, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_HOME, - KC_CAPS, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_END, + KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, KC_HOME, + KC_CAPS, RM_SPDU, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/xelus/pachi/rgb/keymaps/default/keymap.c b/keyboards/xelus/pachi/rgb/keymaps/default/keymap.c index 3f41f8ca40..8031a750d7 100644 --- a/keyboards/xelus/pachi/rgb/keymaps/default/keymap.c +++ b/keyboards/xelus/pachi/rgb/keymaps/default/keymap.c @@ -27,9 +27,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_tkl_ansi_tsangan( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT , RGB_TOG, RGB_HUI, RGB_SAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_HUD, RGB_SAD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, RM_TOGG, RM_HUEU, RM_SATU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_NEXT, RM_HUED, RM_SATD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAI, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD,RGB_VAD, RGB_MOD) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_VALD, RM_NEXT) }; diff --git a/keyboards/xelus/valor/rev2/keymaps/default/keymap.c b/keyboards/xelus/valor/rev2/keymaps/default/keymap.c index af6823a5a4..b51d9d5d3e 100644 --- a/keyboards/xelus/valor/rev2/keymaps/default/keymap.c +++ b/keyboards/xelus/valor/rev2/keymaps/default/keymap.c @@ -25,8 +25,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_all( - RGB_TOG, KC_TRNS, 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_TRNS, KC_TRNS, - RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RM_TOGG, KC_TRNS, 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_TRNS, KC_TRNS, + RM_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS diff --git a/keyboards/xiudi/xd60/keymaps/crd_ansi/keymap.c b/keyboards/xiudi/xd60/keymaps/crd_ansi/keymap.c index a5be75c180..9cd135176c 100644 --- a/keyboards/xiudi/xd60/keymaps/crd_ansi/keymap.c +++ b/keyboards/xiudi/xd60/keymaps/crd_ansi/keymap.c @@ -23,8 +23,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FL] = LAYOUT_60_ansi( 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_UP, KC_END, _______, _______, _______, _______, KC_MUTE, _______, _______, KC_PGDN, KC_PGUP, QK_BOOT, - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SCRL, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, RGB_TOG, - _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, RGB_MOD, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_SCRL, KC_VOLD, KC_VOLU, KC_PAUS, _______, _______, UG_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, UG_VALD, UG_VALU, UG_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/yandrstudio/nz64/keymaps/default/keymap.c b/keyboards/yandrstudio/nz64/keymaps/default/keymap.c index 9283a3f975..26f9a0c748 100644 --- a/keyboards/yandrstudio/nz64/keymaps/default/keymap.c +++ b/keyboards/yandrstudio/nz64/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, URGB_K, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, URGB_K, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_TRNS, KC_TRNS, KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/yandrstudio/nz67v2/keymaps/default/keymap.c b/keyboards/yandrstudio/nz67v2/keymaps/default/keymap.c index 522b8d1043..01d3781d4f 100644 --- a/keyboards/yandrstudio/nz67v2/keymaps/default/keymap.c +++ b/keyboards/yandrstudio/nz67v2/keymaps/default/keymap.c @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, URGB_K, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, URGB_K, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_TRNS, KC_TRNS, KC_TRNS, GU_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/yandrstudio/tg67/keymaps/default/keymap.c b/keyboards/yandrstudio/tg67/keymaps/default/keymap.c index 17e31d90c5..e5d11b0178 100644 --- a/keyboards/yandrstudio/tg67/keymaps/default/keymap.c +++ b/keyboards/yandrstudio/tg67/keymaps/default/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_VALU, RM_VALD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/ymdk/id75/keymaps/default/keymap.json b/keyboards/ymdk/id75/keymaps/default/keymap.json index cfea8be494..7d0664c0a6 100644 --- a/keyboards/ymdk/id75/keymaps/default/keymap.json +++ b/keyboards/ymdk/id75/keymaps/default/keymap.json @@ -16,7 +16,7 @@ [ "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "RGB_MOD", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "RM_NEXT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "QK_BOOT" ] diff --git a/keyboards/ymdk/ymd09/keymaps/default/keymap.c b/keyboards/ymdk/ymd09/keymaps/default/keymap.c index 035bc079b8..820235abcf 100644 --- a/keyboards/ymdk/ymd09/keymaps/default/keymap.c +++ b/keyboards/ymdk/ymd09/keymaps/default/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_KP_4, LT(1, KC_KP_5), KC_KP_6, KC_KP_1, KC_KP_2, KC_KP_3), - [1] = LAYOUT(RGB_RMOD, RGB_VAI, RGB_MOD, - RGB_HUI, KC_TRNS, RGB_SAI, - RGB_HUD, RGB_VAD, RGB_SAD), + [1] = LAYOUT(RM_PREV, RM_VALU, RM_NEXT, + RM_HUEU, KC_TRNS, RM_SATU, + RM_HUED, RM_VALD, RM_SATD), }; diff --git a/keyboards/ymdk/ymd40/air40/keymaps/default/keymap.c b/keyboards/ymdk/ymd40/air40/keymaps/default/keymap.c index b798dce7b2..ea09ee215a 100644 --- a/keyboards/ymdk/ymd40/air40/keymaps/default/keymap.c +++ b/keyboards/ymdk/ymd40/air40/keymaps/default/keymap.c @@ -43,8 +43,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), [_ADJUST] = LAYOUT_ortho_4x12( - QK_BOOT, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, DB_TOGG, - _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, + QK_BOOT, RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, _______, _______, _______, _______, _______, _______, DB_TOGG, + _______, RM_NEXT, RM_HUED, RM_SATD, RM_VALD, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/ymdk/ymd62/keymaps/default/keymap.c b/keyboards/ymdk/ymd62/keymaps/default/keymap.c index 79c128295e..e5be1d7910 100644 --- a/keyboards/ymdk/ymd62/keymaps/default/keymap.c +++ b/keyboards/ymdk/ymd62/keymaps/default/keymap.c @@ -14,6 +14,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT , KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_M_P, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_NEXT, RM_PREV, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, RGB_M_P, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; \ No newline at end of file diff --git a/keyboards/ymdk/ymd75/rev4/iso/keymaps/default/keymap.c b/keyboards/ymdk/ymd75/rev4/iso/keymaps/default/keymap.c index 15dc1dc8b7..3f5225c432 100644 --- a/keyboards/ymdk/ymd75/rev4/iso/keymaps/default/keymap.c +++ b/keyboards/ymdk/ymd75/rev4/iso/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_75_iso( QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_TOGG, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/yncognito/batpad/keymaps/default/keymap.c b/keyboards/yncognito/batpad/keymaps/default/keymap.c index 6cf40a182e..26ad7e81eb 100644 --- a/keyboards/yncognito/batpad/keymaps/default/keymap.c +++ b/keyboards/yncognito/batpad/keymaps/default/keymap.c @@ -19,15 +19,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_2x4( KC_Q, KC_W, KC_E, KC_R, - KC_LGUI, KC_SPC, RGB_TOG, RGB_MOD + KC_LGUI, KC_SPC, RM_TOGG, RM_NEXT ), [1] = LAYOUT_ortho_2x4( KC_Q, KC_W, KC_E, KC_R, - KC_LGUI, KC_SPC, RGB_TOG, RGB_MOD + KC_LGUI, KC_SPC, RM_TOGG, RM_NEXT ), [2] = LAYOUT_ortho_2x4( KC_Q, KC_W, KC_E, KC_R, - KC_LGUI, KC_SPC, RGB_TOG, RGB_MOD + KC_LGUI, KC_SPC, RM_TOGG, RM_NEXT ), diff --git a/keyboards/yushakobo/quick17/keymaps/default/keymap.c b/keyboards/yushakobo/quick17/keymaps/default/keymap.c index 2bde382cae..80e1b04ca5 100644 --- a/keyboards/yushakobo/quick17/keymaps/default/keymap.c +++ b/keyboards/yushakobo/quick17/keymaps/default/keymap.c @@ -35,11 +35,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_EDIT2] = LAYOUT( KC_ESC, KC_Q, KC_BTN3,KC_INS, KC_ENT, KC_DEL, KC_LCTL,KC_LBRC,KC_RBRC,KC_PGDN,KC_PGUP,LCTL(KC_Y), - KC_LSFT,TO(3), RGB_TOG,TO(0), _______,KC_NO + KC_LSFT,TO(3), RM_TOGG,TO(0), _______,KC_NO ), [_FN] = LAYOUT( - KC_ESC, KC_LANG,KC_NO, RGB_TOG,KC_MNXT,KC_VOLU, - KC_CAPS,KC_NUM, KC_NO, RGB_MOD,KC_MPRV,KC_VOLD, + KC_ESC, KC_LANG,KC_NO, RM_TOGG,KC_MNXT,KC_VOLU, + KC_CAPS,KC_NUM, KC_NO, RM_NEXT,KC_MPRV,KC_VOLD, CG_NORM,CG_LSWP,EE_CLR, QK_BOOT,TO(0), KC_MUTE ) }; diff --git a/keyboards/ziptyze/lets_split_v3/keymaps/default/keymap.c b/keyboards/ziptyze/lets_split_v3/keymaps/default/keymap.c index d640e1bf23..cd899c8a89 100644 --- a/keyboards/ziptyze/lets_split_v3/keymaps/default/keymap.c +++ b/keyboards/ziptyze/lets_split_v3/keymaps/default/keymap.c @@ -37,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [3] = LAYOUT_ortho_4x12( - _______, QK_BOOT, DB_TOGG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, QK_BOOT, DB_TOGG, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, RM_VALU, RM_VALD, KC_DEL , _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/zsa/planck_ez/keymaps/default/keymap.json b/keyboards/zsa/planck_ez/keymaps/default/keymap.json index 4b27cc2970..b9f0cd2ae4 100644 --- a/keyboards/zsa/planck_ez/keymaps/default/keymap.json +++ b/keyboards/zsa/planck_ez/keymaps/default/keymap.json @@ -5,7 +5,7 @@ ["KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", "KC_ESC", "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_ENT", "CW_TOGG", "KC_LCTL", "KC_LALT", "KC_LGUI", "TL_LOWR", "KC_SPC", "TL_UPPR", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT"], ["KC_TILD", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_BSPC", "KC_DEL", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_UNDS", "KC_PLUS", "KC_LCBR", "KC_RCBR", "KC_PIPE", "KC_TRNS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "S(KC_NUHS)", "S(KC_NUBS)", "KC_HOME", "KC_END", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY"], ["KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_BSPC", "KC_DEL", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_BSLS", "KC_TRNS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "KC_NUHS", "KC_NUBS", "KC_PGUP", "KC_PGDN", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY"], - ["KC_TRNS", "QK_BOOT", "DB_TOGG", "RGB_TOG", "RGB_MOD", "RGB_HUI", "RGB_HUD", "RGB_SAI", "RGB_SAD", "RGB_VAI", "RGB_VAD", "KC_DEL", "KC_TRNS", "KC_TRNS", "MU_NEXT", "AU_ON", "AU_OFF", "AG_NORM", "AG_SWAP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "AU_PREV", "AU_NEXT", "MU_ON", "MU_OFF", "MI_ON", "MI_OFF", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"] + ["KC_TRNS", "QK_BOOT", "DB_TOGG", "RM_TOGG", "RM_NEXT", "RM_HUEU", "RM_HUED", "RM_SATU", "RM_SATD", "RM_VALU", "RM_VALD", "KC_DEL", "KC_TRNS", "KC_TRNS", "MU_NEXT", "AU_ON", "AU_OFF", "AG_NORM", "AG_SWAP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "AU_PREV", "AU_NEXT", "MU_ON", "MU_OFF", "MI_ON", "MI_OFF", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"] ], "layout": "LAYOUT_planck_1x2uC", "config": { From 36f306b4a5973568997691b6b820a863bbb6b043 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 24 Nov 2024 20:35:21 +0000 Subject: [PATCH 019/592] Provide method to save a single default layer in the full range of 0-31 (#24639) --- quantum/eeconfig.c | 25 ++++++++++++++++++++----- quantum/eeconfig.h | 5 +++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index ffbbf43a95..e27f604f12 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -3,7 +3,6 @@ #include #include "eeprom.h" #include "eeconfig.h" -#include "action_layer.h" #if defined(EEPROM_DRIVER) # include "eeprom_driver.h" @@ -52,7 +51,7 @@ void eeconfig_init_quantum(void) { eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); eeprom_update_byte(EECONFIG_DEBUG, 0); default_layer_state = (layer_state_t)1 << 0; - eeprom_update_byte(EECONFIG_DEFAULT_LAYER, default_layer_state); + eeconfig_update_default_layer(default_layer_state); // Enable oneshot and autocorrect by default: 0b0001 0100 0000 0000 eeprom_update_word(EECONFIG_KEYMAP, 0x1400); eeprom_update_byte(EECONFIG_BACKLIGHT, 0); @@ -160,14 +159,30 @@ void eeconfig_update_debug(uint8_t val) { * * FIXME: needs doc */ -uint8_t eeconfig_read_default_layer(void) { - return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); +layer_state_t eeconfig_read_default_layer(void) { + uint8_t val = eeprom_read_byte(EECONFIG_DEFAULT_LAYER); + +#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK + // stored as a layer number, so convert back to bitmask + return 1 << val; +#else + // stored as 8-bit-wide bitmask, so read the value directly - handling padding to 16/32 bit layer_state_t + return val; +#endif } /** \brief eeconfig update default layer * * FIXME: needs doc */ -void eeconfig_update_default_layer(uint8_t val) { +void eeconfig_update_default_layer(layer_state_t state) { +#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK + // stored as a layer number, so only store the highest layer + uint8_t val = get_highest_layer(state); +#else + // stored as 8-bit-wide bitmask, so write the value directly - handling truncation from 16/32 bit layer_state_t + uint8_t val = state; +#endif + eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); } diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index fa0dd799d1..11cf1ccbca 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -22,6 +22,7 @@ along with this program. If not, see . #include // offsetof #include "eeprom.h" #include "util.h" +#include "action_layer.h" // layer_state_t #ifndef EECONFIG_MAGIC_NUMBER # define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues @@ -122,8 +123,8 @@ void eeconfig_disable(void); uint8_t eeconfig_read_debug(void); void eeconfig_update_debug(uint8_t val); -uint8_t eeconfig_read_default_layer(void); -void eeconfig_update_default_layer(uint8_t val); +layer_state_t eeconfig_read_default_layer(void); +void eeconfig_update_default_layer(layer_state_t val); uint16_t eeconfig_read_keymap(void); void eeconfig_update_keymap(uint16_t val); From b7b0eb76a9c3fa9731a90814a225fd1e63d59366 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 27 Nov 2024 21:19:17 +1100 Subject: [PATCH 020/592] `develop` 2024q4 changelog. (#24638) --- docs/ChangeLog/20241124.md | 122 +++++++++++++++++++++++++++++++ docs/_sidebar.json | 2 +- docs/breaking_changes.md | 20 ++--- docs/breaking_changes_history.md | 1 + 4 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 docs/ChangeLog/20241124.md diff --git a/docs/ChangeLog/20241124.md b/docs/ChangeLog/20241124.md new file mode 100644 index 0000000000..f18c5d981e --- /dev/null +++ b/docs/ChangeLog/20241124.md @@ -0,0 +1,122 @@ +# QMK Breaking Changes - 2024 November 24 Changelog + +## Notable Features + +November 2024 brings a relatively lightweight QMK release. As with previous cycles, almost all PRs were related to cleanup or re-organization of aspects of QMK. + +One notable item is the removal of `arm_atsam` -- this affects users with `massdrop/ctrl` or `massdrop/alt` keyboards. These have no current replacement, but support for an alternative to the `arm_atsam` backend is nearing completion. Unfortunately the alternative backend didn't make this quarter's list of merges, so there's a temporary removal of these boards. Users who need to build for these targets should stay on the `0.26.x` version of QMK until these boards have been restored. + +## Changes Requiring User Action + +### Updated Keyboard Codebases + +One note with updated keyboard names -- historical keyboard names are still considered valid when using [External Userspace](../newbs_external_userspace) for builds. If you're already using External Userspace, you do not need to move your keymap inside your repository. + +| Old Keyboard Name | New Keyboard Name | +|-------------------|-------------------------| +| saevus/cor | concreteflowers/cor | +| saevus/cor_tkl | concreteflowers/cor_tkl | + +## Deprecation Notices + +In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here. + +### RGB Keycode Overhaul ([#23679](https://github.com/qmk/qmk_firmware/pull/23679), [#24484](https://github.com/qmk/qmk_firmware/pull/24484), [#24490](https://github.com/qmk/qmk_firmware/pull/24490)) + +RGB keycodes have been reworked to allow for both rgblight and rgb_matrix to coexist for the handful of boards in the repo with both enabled. Previously, `RGB_xxx` style keycodes were available, but now for rgblight we have `UG_xxx` (underglow), and `RM_xxx` for rgb_matrix. Default keymaps have been updated to reflect whichever system the respective board enables. + +Longer-term, `RGB_xxx` style keycodes will be removed, but for now they act as if they're `UG_xxx`, and `UG_xxx` keycodes act upon both rgblight and rgb_matrix simultaneously. Put simply, the existing `RGB_xxx` keycodes act as they always have, giving users time to transition across to the new keycodes instead. + +### ADNS9800 and PMW33xx sensor firmware ROM removal ([#24428](https://github.com/qmk/qmk_firmware/pull/24428)) + +Following on from the last Breaking Changes cycle, Binary blobs for optical sensors have been removed from the QMK codebase. Hooks allowing users to supply their own have been put in place; users wishing to source firmware blobs and integrate them into their keymap may do so. Doing so renders their firmware un-distributable due to licensing incompatibility with the GPL -- as such user firmware containing such blobs must not be distributed. + +Please get in touch with the QMK team on Discord if your sensor is no longer functional. + +## Full changelist + +Core: +* Refactor F4 ld files to use common files ([#18059](https://github.com/qmk/qmk_firmware/pull/18059)) +* Add LD7032 support to QP. ([#20828](https://github.com/qmk/qmk_firmware/pull/20828)) +* Add combo key repress feature ([#22858](https://github.com/qmk/qmk_firmware/pull/22858)) +* Add Layer Lock feature ([#23430](https://github.com/qmk/qmk_firmware/pull/23430)) +* Added MCU support for ArteryTek AT32F415 ([#23445](https://github.com/qmk/qmk_firmware/pull/23445)) +* Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. ([#23451](https://github.com/qmk/qmk_firmware/pull/23451)) +* Separate RGBLight/RGB Matrix keycode handling ([#23679](https://github.com/qmk/qmk_firmware/pull/23679)) +* Allow for inverted SPI CS logic ([#23699](https://github.com/qmk/qmk_firmware/pull/23699)) +* Add timer_save and _restore functions. ([#23887](https://github.com/qmk/qmk_firmware/pull/23887)) +* Allow for `get_hardware_id()` to be used for serial number. ([#24053](https://github.com/qmk/qmk_firmware/pull/24053)) +* Segregrate keycode at pre-process record quantum ([#24194](https://github.com/qmk/qmk_firmware/pull/24194)) +* Add ability to poweroff ADNS5050 sensor ([#24223](https://github.com/qmk/qmk_firmware/pull/24223)) +* quantum: util: add bit and bitmask helpers ([#24229](https://github.com/qmk/qmk_firmware/pull/24229)) +* Add new connection keycodes for Bluetooth, 2.4GHz. ([#24251](https://github.com/qmk/qmk_firmware/pull/24251)) +* `usb_device_state`: consolidate usb state handling across implementations ([#24258](https://github.com/qmk/qmk_firmware/pull/24258)) +* Remove global k_rgb_matrix_split ([#24348](https://github.com/qmk/qmk_firmware/pull/24348)) +* util: uf2families: sync with upstream ([#24351](https://github.com/qmk/qmk_firmware/pull/24351)) +* [Maintenance] builddefs: common_rules: overhaul debug information generation ([#24352](https://github.com/qmk/qmk_firmware/pull/24352)) +* Add easier way to set default single layer ([#24376](https://github.com/qmk/qmk_firmware/pull/24376)) +* Tweak OS detect, add OS_DETECTION_SINGLE_REPORT ([#24379](https://github.com/qmk/qmk_firmware/pull/24379)) +* Reinstate global `k_rgb_matrix_split` ([#24388](https://github.com/qmk/qmk_firmware/pull/24388)) +* Bring supported STM32F4 configs in line with F4x1 ([#24413](https://github.com/qmk/qmk_firmware/pull/24413)) +* Extended wheel reports ([#24422](https://github.com/qmk/qmk_firmware/pull/24422)) +* Remove binary blobs from optical sensors. ([#24428](https://github.com/qmk/qmk_firmware/pull/24428)) +* Remove `STM32_PWM_USE_ADVANCED` references ([#24432](https://github.com/qmk/qmk_firmware/pull/24432)) +* Remove `RING_BUFFERED_6KRO_REPORT_ENABLE` due to disuse. ([#24433](https://github.com/qmk/qmk_firmware/pull/24433)) +* Move pointing device driver code ([#24445](https://github.com/qmk/qmk_firmware/pull/24445)) +* Add svlinky converter ([#24449](https://github.com/qmk/qmk_firmware/pull/24449)) +* Update combo user function variable ([#24467](https://github.com/qmk/qmk_firmware/pull/24467)) +* `qmk find`: expand operator support ([#24468](https://github.com/qmk/qmk_firmware/pull/24468)) +* Rename RGB and HSV structs ([#24471](https://github.com/qmk/qmk_firmware/pull/24471)) +* RGBLight: Improve RGB Test animation ([#24477](https://github.com/qmk/qmk_firmware/pull/24477)) +* Change default ARM hardware PWM WS2812 tick frequency to 800kHz ([#24508](https://github.com/qmk/qmk_firmware/pull/24508)) +* Add pointing tests ([#24513](https://github.com/qmk/qmk_firmware/pull/24513)) +* Joystick: add support for 8-way hat switch ([#24515](https://github.com/qmk/qmk_firmware/pull/24515)) +* Refactor Riverflow matrix effect with runner ([#24520](https://github.com/qmk/qmk_firmware/pull/24520)) +* Update Pixel Rain to respect LED range limits ([#24532](https://github.com/qmk/qmk_firmware/pull/24532)) +* Update Jellybean Raindrops to respect LED range limits ([#24534](https://github.com/qmk/qmk_firmware/pull/24534)) +* Refactor Breathing effect with runner ([#24535](https://github.com/qmk/qmk_firmware/pull/24535)) +* Refactor LED Breathing effect with runner ([#24540](https://github.com/qmk/qmk_firmware/pull/24540)) +* Expose rgb_matrix_update_pwm_buffers to be available in keymaps ([#24573](https://github.com/qmk/qmk_firmware/pull/24573)) +* Simple Python script to show polling rate ([#24622](https://github.com/qmk/qmk_firmware/pull/24622)) +* Add keycode PDF(layer) to set the default layer in EEPROM ([#24630](https://github.com/qmk/qmk_firmware/pull/24630)) +* Provide method to save a single default layer in the full range of 0-31 ([#24639](https://github.com/qmk/qmk_firmware/pull/24639)) + +CLI: +* Refactor painter arguments to table instead of commandline ([#24456](https://github.com/qmk/qmk_firmware/pull/24456)) +* `qmk new-keyboard`: separate dev board and MCU selection ([#24548](https://github.com/qmk/qmk_firmware/pull/24548)) +* Bump minimum required Python version ([#24554](https://github.com/qmk/qmk_firmware/pull/24554)) + +Submodule updates: +* Remove `arm_atsam` platform ([#24337](https://github.com/qmk/qmk_firmware/pull/24337)) + +Keyboards: +* add ergodox Community Layout for LAYOUT_ergodox keyboards ([#22963](https://github.com/qmk/qmk_firmware/pull/22963)) +* Cutie Club Fidelity Layout Additions ([#23838](https://github.com/qmk/qmk_firmware/pull/23838)) +* Add Ploopyco functions for host state control ([#23953](https://github.com/qmk/qmk_firmware/pull/23953)) +* Corne rev4 ([#24084](https://github.com/qmk/qmk_firmware/pull/24084)) +* Rename saevus to concreteflowers ([#24249](https://github.com/qmk/qmk_firmware/pull/24249)) +* Remove `60_tsangan_hhkb` community layout ([#24355](https://github.com/qmk/qmk_firmware/pull/24355)) +* add USART configuration to config.h for PS/2 mouse support ([#24398](https://github.com/qmk/qmk_firmware/pull/24398)) +* Add SteelSeries Prime+ mouse ([#24408](https://github.com/qmk/qmk_firmware/pull/24408)) +* Rename RGB/HSV structs: keyboard-level code ([#24476](https://github.com/qmk/qmk_firmware/pull/24476)) +* xiudi/xd002: Remove broken oversized `multilayer_rgb` keymap ([#24480](https://github.com/qmk/qmk_firmware/pull/24480)) +* Update keycodes for keyboards with RGB Matrix ([#24484](https://github.com/qmk/qmk_firmware/pull/24484)) +* Cipulot Updates ([#24539](https://github.com/qmk/qmk_firmware/pull/24539)) +* Update keymaps to use PDF keycode ([#24633](https://github.com/qmk/qmk_firmware/pull/24633)) +* Remove keyboard use of eeconfig_read_default_layer ([#24635](https://github.com/qmk/qmk_firmware/pull/24635)) + +Keyboard fixes: +* Fix rendering of `keymap_config.no_gui` within `led_update_kb` ([#24473](https://github.com/qmk/qmk_firmware/pull/24473)) +* Fix duplication of core `GU_TOGG` keycode ([#24474](https://github.com/qmk/qmk_firmware/pull/24474)) +* keebio/nyquist: Remove invalid I2C config ([#24479](https://github.com/qmk/qmk_firmware/pull/24479)) +* horrortroll/nyx/rev1: Fix compilation of custom RGB effect ([#24481](https://github.com/qmk/qmk_firmware/pull/24481)) + +Others: +* Improve consistency of syntax within `data/constants/keycodes` ([#24528](https://github.com/qmk/qmk_firmware/pull/24528)) + +Bugs: +* WS2812 API rework ([#24364](https://github.com/qmk/qmk_firmware/pull/24364)) +* Backward compatibility for new RGB keycode handling ([#24490](https://github.com/qmk/qmk_firmware/pull/24490)) +* Fix compiliation issues with OS Detection ([#24502](https://github.com/qmk/qmk_firmware/pull/24502)) +* Revert removal of `QK_OUTPUT_AUTO`, fixup docs to reflect. ([#24593](https://github.com/qmk/qmk_firmware/pull/24593)) +* Review fixes for layer lock feature ([#24627](https://github.com/qmk/qmk_firmware/pull/24627)) diff --git a/docs/_sidebar.json b/docs/_sidebar.json index 15c3cbec31..a68516b5de 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -205,7 +205,7 @@ { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "Most Recent ChangeLog", - "link": "/ChangeLog/20240825" + "link": "/ChangeLog/20241124" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Deprecation Policy", "link": "/support_deprecation_policy" } diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md index 536fda5fd6..132c5943cc 100644 --- a/docs/breaking_changes.md +++ b/docs/breaking_changes.md @@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch ## What has been included in past Breaking Changes? +* [2024 Nov 24](ChangeLog/20241124) * [2024 Aug 25](ChangeLog/20240825) * [2024 May 26](ChangeLog/20240526) -* [2024 Feb 25](ChangeLog/20240225) * [Older Breaking Changes](breaking_changes_history) ## When is the next Breaking Change? -The next Breaking Change is scheduled for November 24, 2024. +The next Breaking Change is scheduled for February 23, 2025. ### Important Dates -* 2024 Aug 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. -* 2024 Oct 27 - `develop` closed to new PRs. -* 2024 Oct 27 - Call for testers. -* 2024 Nov 10 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes -* 2024 Nov 17 - `develop` is locked, only critical bugfix PRs merged. -* 2024 Nov 22 - `master` is locked, no PRs merged. -* 2024 Nov 24 - Merge `develop` to `master`. -* 2024 Nov 24 - `master` is unlocked. PRs can be merged again. +* 2024 Nov 24 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. +* 2025 Jan 26 - `develop` closed to new PRs. +* 2025 Jan 26 - Call for testers. +* 2025 Feb 9 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes +* 2025 Feb 16 - `develop` is locked, only critical bugfix PRs merged. +* 2024 Nov 21 - `master` is locked, no PRs merged. +* 2025 Feb 23 - Merge `develop` to `master`. +* 2025 Feb 23 - `master` is unlocked. PRs can be merged again. ## What changes will be included? diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md index 1596aa1f54..f877f42639 100644 --- a/docs/breaking_changes_history.md +++ b/docs/breaking_changes_history.md @@ -2,6 +2,7 @@ This page links to all previous changelogs from the QMK Breaking Changes process. +* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0 * [2024 Aug 25](ChangeLog/20240825) - version 0.26.0 * [2024 May 26](ChangeLog/20240526) - version 0.25.0 * [2024 Feb 25](ChangeLog/20240225) - version 0.24.0 From eb04b94eecbb9b3e64ca9c74f937b5f762440b17 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 27 Nov 2024 21:26:34 +1100 Subject: [PATCH 021/592] Merge point for 2024q4 breaking change. --- readme.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/readme.md b/readme.md index e5c0d41b7b..62aed12066 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,3 @@ -# THIS IS THE DEVELOP BRANCH - -Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. - # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From b0ac5bcf915c84fb25c260158fae7e7073e2c7b3 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 27 Nov 2024 21:31:31 +1100 Subject: [PATCH 022/592] Branch point for 2025q1 breaking change --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 62aed12066..e5c0d41b7b 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,7 @@ +# THIS IS THE DEVELOP BRANCH + +Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. + # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From 66d0d53dc1041ce148612ccde9da7ec78668ce7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 19:45:59 +0000 Subject: [PATCH 023/592] Bump JamesIves/github-pages-deploy-action from 4.6.9 to 4.7.1 (#24654) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.6.9 to 4.7.1. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.6.9...v4.7.1) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e04bcd080b..95a2cfa3af 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,7 +56,7 @@ jobs: - name: Deploy if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }} - uses: JamesIves/github-pages-deploy-action@v4.6.9 + uses: JamesIves/github-pages-deploy-action@v4.7.1 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages From 50491c44ca4651e6c1ba1fabefed96b633cd3cfa Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 29 Nov 2024 21:51:16 +0000 Subject: [PATCH 024/592] moky/moky88: Remove use of deprecated defines (#24656) --- keyboards/moky/moky88/config.h | 3 +- keyboards/moky/moky88/moky88.c | 176 ++++++++++++++++----------------- 2 files changed, 89 insertions(+), 90 deletions(-) diff --git a/keyboards/moky/moky88/config.h b/keyboards/moky/moky88/config.h index a673a38069..7c102e1a97 100644 --- a/keyboards/moky/moky88/config.h +++ b/keyboards/moky/moky88/config.h @@ -15,5 +15,4 @@ /* RGB Driver */ #define AW20216S_CS_PIN_1 D2 #define AW20216S_CS_PIN_2 B8 -#define AW20216S_EN_PIN_1 B9 -#define AW20216S_EN_PIN_2 B9 +#define AW20216S_EN_PIN B9 diff --git a/keyboards/moky/moky88/moky88.c b/keyboards/moky/moky88/moky88.c index 3cbd6e1468..2de672f94f 100644 --- a/keyboards/moky/moky88/moky88.c +++ b/keyboards/moky/moky88/moky88.c @@ -23,97 +23,97 @@ const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT] = { * | | G location * | | | B location * | | | | */ - {0, CS18_SW2, CS17_SW2, CS16_SW2 }, // 0 Esc - {0, CS18_SW3, CS17_SW3, CS16_SW3 }, // 1 F1 - {0, CS18_SW4, CS17_SW4, CS16_SW4 }, // 2 F2 - {0, CS18_SW5, CS17_SW5, CS16_SW5 }, // 3 F3 - {0, CS18_SW6, CS17_SW6, CS16_SW6 }, // 4 F4 - {0, CS18_SW7, CS17_SW7, CS16_SW7 }, // 5 F5 - {0, CS18_SW8, CS17_SW8, CS16_SW8 }, // 6 F6 - {0, CS18_SW9, CS17_SW9, CS16_SW9 }, // 7 F7 - {0, CS18_SW10, CS17_SW10, CS16_SW10 }, // 8 F8 - {0, CS18_SW11, CS17_SW11, CS16_SW11 }, // 9 F9 - {0, CS18_SW12, CS17_SW12, CS16_SW12 }, // 10 F10 - {1, CS18_SW1, CS17_SW1, CS16_SW1 }, // 11 F11 - {1, CS18_SW2, CS17_SW2, CS16_SW2 }, // 12 F12 - {1, CS18_SW3, CS17_SW3, CS16_SW3 }, // 13 MUTE - {1, CS18_SW4, CS17_SW4, CS16_SW4 }, // 14 PSCR - {1, CS18_SW5, CS17_SW5, CS16_SW5 }, // 15 SCRL - {1, CS18_SW6, CS17_SW6, CS16_SW6 }, // 16 PAUSE + {0, SW2_CS18, SW2_CS17, SW2_CS16 }, // 0 Esc + {0, SW3_CS18, SW3_CS17, SW3_CS16 }, // 1 F1 + {0, SW4_CS18, SW4_CS17, SW4_CS16 }, // 2 F2 + {0, SW5_CS18, SW5_CS17, SW5_CS16 }, // 3 F3 + {0, SW6_CS18, SW6_CS17, SW6_CS16 }, // 4 F4 + {0, SW7_CS18, SW7_CS17, SW7_CS16 }, // 5 F5 + {0, SW8_CS18, SW8_CS17, SW8_CS16 }, // 6 F6 + {0, SW9_CS18, SW9_CS17, SW9_CS16 }, // 7 F7 + {0, SW10_CS18, SW10_CS17, SW10_CS16 }, // 8 F8 + {0, SW11_CS18, SW11_CS17, SW11_CS16 }, // 9 F9 + {0, SW12_CS18, SW12_CS17, SW12_CS16 }, // 10 F10 + {1, SW1_CS18, SW1_CS17, SW1_CS16 }, // 11 F11 + {1, SW2_CS18, SW2_CS17, SW2_CS16 }, // 12 F12 + {1, SW3_CS18, SW3_CS17, SW3_CS16 }, // 13 MUTE + {1, SW4_CS18, SW4_CS17, SW4_CS16 }, // 14 PSCR + {1, SW5_CS18, SW5_CS17, SW5_CS16 }, // 15 SCRL + {1, SW6_CS18, SW6_CS17, SW6_CS16 }, // 16 PAUSE - {0, CS15_SW2, CS14_SW2, CS13_SW2 }, // 17 `~ - {0, CS15_SW3, CS14_SW3, CS13_SW3 }, // 18 1 - {0, CS15_SW4, CS14_SW4, CS13_SW4 }, // 19 2 - {0, CS15_SW5, CS14_SW5, CS13_SW5 }, // 20 3 - {0, CS15_SW6, CS14_SW6, CS13_SW6 }, // 21 4 - {0, CS15_SW7, CS14_SW7, CS13_SW7 }, // 22 5 - {0, CS15_SW8, CS14_SW8, CS13_SW8 }, // 23 6 - {0, CS15_SW9, CS14_SW9, CS13_SW9 }, // 24 7 - {0, CS15_SW10, CS14_SW10, CS13_SW10 }, // 25 8 - {0, CS15_SW11, CS14_SW11, CS13_SW11 }, // 26 9 - {0, CS15_SW12, CS14_SW12, CS13_SW12 }, // 27 0 - {1, CS15_SW1, CS14_SW1, CS13_SW1 }, // 28 -_ - {1, CS15_SW2, CS14_SW2, CS13_SW2 }, // 29 =+ - {1, CS15_SW3, CS14_SW3, CS13_SW3 }, // 30 BSPC - {1, CS15_SW4, CS14_SW4, CS13_SW4 }, // 31 INS - {1, CS15_SW5, CS14_SW5, CS13_SW5 }, // 32 HOME - {1, CS15_SW6, CS14_SW6, CS13_SW6 }, // 33 PGUP + {0, SW2_CS15, SW2_CS14, SW2_CS13 }, // 17 `~ + {0, SW3_CS15, SW3_CS14, SW3_CS13 }, // 18 1 + {0, SW4_CS15, SW4_CS14, SW4_CS13 }, // 19 2 + {0, SW5_CS15, SW5_CS14, SW5_CS13 }, // 20 3 + {0, SW6_CS15, SW6_CS14, SW6_CS13 }, // 21 4 + {0, SW7_CS15, SW7_CS14, SW7_CS13 }, // 22 5 + {0, SW8_CS15, SW8_CS14, SW8_CS13 }, // 23 6 + {0, SW9_CS15, SW9_CS14, SW9_CS13 }, // 24 7 + {0, SW10_CS15, SW10_CS14, SW10_CS13 }, // 25 8 + {0, SW11_CS15, SW11_CS14, SW11_CS13 }, // 26 9 + {0, SW12_CS15, SW12_CS14, SW12_CS13 }, // 27 0 + {1, SW1_CS15, SW1_CS14, SW1_CS13 }, // 28 -_ + {1, SW2_CS15, SW2_CS14, SW2_CS13 }, // 29 =+ + {1, SW3_CS15, SW3_CS14, SW3_CS13 }, // 30 BSPC + {1, SW4_CS15, SW4_CS14, SW4_CS13 }, // 31 INS + {1, SW5_CS15, SW5_CS14, SW5_CS13 }, // 32 HOME + {1, SW6_CS15, SW6_CS14, SW6_CS13 }, // 33 PGUP - {0, CS12_SW2, CS11_SW2, CS10_SW2 }, // 34 Tab - {0, CS12_SW3, CS11_SW3, CS10_SW3 }, // 35 Q - {0, CS12_SW4, CS11_SW4, CS10_SW4 }, // 36 W - {0, CS12_SW5, CS11_SW5, CS10_SW5 }, // 37 E - {0, CS12_SW6, CS11_SW6, CS10_SW6 }, // 38 R - {0, CS12_SW7, CS11_SW7, CS10_SW7 }, // 39 T - {0, CS12_SW8, CS11_SW8, CS10_SW8 }, // 40 Y - {0, CS12_SW9, CS11_SW9, CS10_SW9 }, // 41 U - {0, CS12_SW10, CS11_SW10, CS10_SW10 }, // 42 I - {0, CS12_SW11, CS11_SW11, CS10_SW11 }, // 43 O - {0, CS12_SW12, CS11_SW12, CS10_SW12 }, // 44 P - {1, CS12_SW1, CS11_SW1, CS10_SW1 }, // 45 [{ - {1, CS12_SW2, CS11_SW2, CS10_SW2 }, // 48 ]} - {1, CS12_SW3, CS11_SW3, CS10_SW3 }, // 47 \| - {1, CS12_SW4, CS11_SW4, CS10_SW4 }, // 48 Del - {1, CS12_SW5, CS11_SW5, CS10_SW5 }, // 49 End - {1, CS12_SW6, CS11_SW6, CS10_SW6 }, // 50 PGDN + {0, SW2_CS12, SW2_CS11, SW2_CS10 }, // 34 Tab + {0, SW3_CS12, SW3_CS11, SW3_CS10 }, // 35 Q + {0, SW4_CS12, SW4_CS11, SW4_CS10 }, // 36 W + {0, SW5_CS12, SW5_CS11, SW5_CS10 }, // 37 E + {0, SW6_CS12, SW6_CS11, SW6_CS10 }, // 38 R + {0, SW7_CS12, SW7_CS11, SW7_CS10 }, // 39 T + {0, SW8_CS12, SW8_CS11, SW8_CS10 }, // 40 Y + {0, SW9_CS12, SW9_CS11, SW9_CS10 }, // 41 U + {0, SW10_CS12, SW10_CS11, SW10_CS10 }, // 42 I + {0, SW11_CS12, SW11_CS11, SW11_CS10 }, // 43 O + {0, SW12_CS12, SW12_CS11, SW12_CS10 }, // 44 P + {1, SW1_CS12, SW1_CS11, SW1_CS10 }, // 45 [{ + {1, SW2_CS12, SW2_CS11, SW2_CS10 }, // 48 ]} + {1, SW3_CS12, SW3_CS11, SW3_CS10 }, // 47 \| + {1, SW4_CS12, SW4_CS11, SW4_CS10 }, // 48 Del + {1, SW5_CS12, SW5_CS11, SW5_CS10 }, // 49 End + {1, SW6_CS12, SW6_CS11, SW6_CS10 }, // 50 PGDN - {0, CS1_SW2, CS2_SW2, CS3_SW2 }, // 51 Caps - {0, CS1_SW3, CS2_SW3, CS3_SW3 }, // 52 A - {0, CS1_SW4, CS2_SW4, CS3_SW4 }, // 33 S - {0, CS1_SW5, CS2_SW5, CS3_SW5 }, // 54 D - {0, CS1_SW6, CS2_SW6, CS3_SW6 }, // 55 F - {0, CS1_SW7, CS2_SW7, CS3_SW7 }, // 56 G - {0, CS1_SW8, CS2_SW8, CS3_SW8 }, // 57 H - {0, CS1_SW9, CS2_SW9, CS3_SW9 }, // 58 J - {0, CS1_SW10, CS2_SW10, CS3_SW10 }, // 59 K - {0, CS1_SW11, CS2_SW11, CS3_SW11 }, // 60 L - {0, CS1_SW12, CS2_SW12, CS3_SW12 }, // 61 ;: - {1, CS1_SW1, CS2_SW1, CS3_SW1 }, // 62 ' - {1, CS1_SW3, CS2_SW3, CS3_SW3 }, // 63 Enter + {0, SW2_CS1, SW2_CS2, SW2_CS3 }, // 51 Caps + {0, SW3_CS1, SW3_CS2, SW3_CS3 }, // 52 A + {0, SW4_CS1, SW4_CS2, SW4_CS3 }, // 33 S + {0, SW5_CS1, SW5_CS2, SW5_CS3 }, // 54 D + {0, SW6_CS1, SW6_CS2, SW6_CS3 }, // 55 F + {0, SW7_CS1, SW7_CS2, SW7_CS3 }, // 56 G + {0, SW8_CS1, SW8_CS2, SW8_CS3 }, // 57 H + {0, SW9_CS1, SW9_CS2, SW9_CS3 }, // 58 J + {0, SW10_CS1, SW10_CS2, SW10_CS3 }, // 59 K + {0, SW11_CS1, SW11_CS2, SW11_CS3 }, // 60 L + {0, SW12_CS1, SW12_CS2, SW12_CS3 }, // 61 ;: + {1, SW1_CS1, SW1_CS2, SW1_CS3 }, // 62 ' + {1, SW3_CS1, SW3_CS2, SW3_CS3 }, // 63 Enter - {0, CS4_SW2, CS5_SW2, CS6_SW2 }, // 64 Shift - {0, CS4_SW4, CS5_SW4, CS6_SW4 }, // 65 Z - {0, CS4_SW5, CS5_SW5, CS6_SW5 }, // 66 X - {0, CS4_SW6, CS5_SW6, CS6_SW6 }, // 67 C - {0, CS4_SW7, CS5_SW7, CS6_SW7 }, // 68 V - {0, CS4_SW8, CS5_SW8, CS6_SW8 }, // 69 B - {0, CS4_SW9, CS5_SW9, CS6_SW9 }, // 70 N - {0, CS4_SW10, CS5_SW10, CS6_SW10 }, // 71 M - {0, CS4_SW11, CS5_SW11, CS6_SW11 }, // 72 ,< - {0, CS4_SW12, CS5_SW12, CS6_SW12 }, // 73 .> - {1, CS4_SW1, CS5_SW1, CS6_SW1 }, // 74 ? - {1, CS4_SW3, CS5_SW3, CS6_SW3 }, // 75 Shift - {1, CS4_SW5, CS5_SW5, CS6_SW5 }, // 76 Up + {0, SW2_CS4, SW2_CS5, SW2_CS6 }, // 64 Shift + {0, SW4_CS4, SW4_CS5, SW4_CS6 }, // 65 Z + {0, SW5_CS4, SW5_CS5, SW5_CS6 }, // 66 X + {0, SW6_CS4, SW6_CS5, SW6_CS6 }, // 67 C + {0, SW7_CS4, SW7_CS5, SW7_CS6 }, // 68 V + {0, SW8_CS4, SW8_CS5, SW8_CS6 }, // 69 B + {0, SW9_CS4, SW9_CS5, SW9_CS6 }, // 70 N + {0, SW10_CS4, SW10_CS5, SW10_CS6 }, // 71 M + {0, SW11_CS4, SW11_CS5, SW11_CS6 }, // 72 ,< + {0, SW12_CS4, SW12_CS5, SW12_CS6 }, // 73 .> + {1, SW1_CS4, SW1_CS5, SW1_CS6 }, // 74 ? + {1, SW3_CS4, SW3_CS5, SW3_CS6 }, // 75 Shift + {1, SW5_CS4, SW5_CS5, SW5_CS6 }, // 76 Up - {0, CS7_SW2, CS8_SW2, CS9_SW2 }, // 77 Ctrl_L - {0, CS7_SW3, CS8_SW3, CS9_SW3 }, // 78 Win_L - {0, CS7_SW4, CS8_SW4, CS9_SW4 }, // 79 ALT_L - {0, CS7_SW8, CS8_SW8, CS9_SW8 }, // 80 SPACE - {0, CS7_SW12, CS8_SW12, CS9_SW12 }, // 81 ALT_L - {1, CS7_SW1, CS8_SW1, CS9_SW1 }, // 82 Win_L - {1, CS7_SW2, CS8_SW2, CS9_SW2 }, // 83 Fn - {1, CS7_SW3, CS8_SW3, CS9_SW3 }, // 84 Ctrl_L - {1, CS7_SW4, CS8_SW4, CS9_SW4 }, // 85 Left - {1, CS7_SW5, CS8_SW5, CS9_SW5 }, // 86 Down - {1, CS7_SW6, CS8_SW6, CS9_SW6 }, // 87 Right + {0, SW2_CS7, SW2_CS8, SW2_CS9 }, // 77 Ctrl_L + {0, SW3_CS7, SW3_CS8, SW3_CS9 }, // 78 Win_L + {0, SW4_CS7, SW4_CS8, SW4_CS9 }, // 79 ALT_L + {0, SW8_CS7, SW8_CS8, SW8_CS9 }, // 80 SPACE + {0, SW12_CS7, SW12_CS8, SW12_CS9 }, // 81 ALT_L + {1, SW1_CS7, SW1_CS8, SW1_CS9 }, // 82 Win_L + {1, SW2_CS7, SW2_CS8, SW2_CS9 }, // 83 Fn + {1, SW3_CS7, SW3_CS8, SW3_CS9 }, // 84 Ctrl_L + {1, SW4_CS7, SW4_CS8, SW4_CS9 }, // 85 Left + {1, SW5_CS7, SW5_CS8, SW5_CS9 }, // 86 Down + {1, SW6_CS7, SW6_CS8, SW6_CS9 }, // 87 Right }; From 97547ac762a48b343b4b49de4f144f127da3c131 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 30 Nov 2024 16:30:05 +1100 Subject: [PATCH 025/592] Update leftover RGB keycodes (#24653) --- docs/configurator_default_keymaps.md | 4 ++-- keyboards/era/sirind/tomak79h/keymaps/default/keymap.c | 4 ++-- keyboards/keebfront/vanguard65/keymaps/default/keymap.c | 4 ++-- keyboards/keebio/iris_lm/keymaps/default/keymap.c | 8 ++++---- keyboards/xdboards/recon/keymaps/default/keymap.c | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/configurator_default_keymaps.md b/docs/configurator_default_keymaps.md index 40304dc57b..0dfc41ea21 100644 --- a/docs/configurator_default_keymaps.md +++ b/docs/configurator_default_keymaps.md @@ -54,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT_all( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, BL_TOGG, BL_DOWN, BL_UP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_NEXT, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, BL_TOGG, BL_DOWN, BL_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -82,7 +82,7 @@ The default keymap uses the `LAYOUT_all` macro, so that will be the value of the "KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "MO(1)", "KC_RGUI", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT" ], [ - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_HUD", "RGB_HUI", "RGB_SAD", "RGB_SAI", "RGB_VAD", "RGB_VAI", "BL_TOGG", "BL_DOWN", "BL_UP", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "UG_TOGG", "UG_NEXT", "UG_HUED", "UG_HUEU", "UG_SATD", "UG_SATU", "UG_VALD", "UG_VALU", "BL_TOGG", "BL_DOWN", "BL_UP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_VOLU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MNXT", "KC_VOLD", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", diff --git a/keyboards/era/sirind/tomak79h/keymaps/default/keymap.c b/keyboards/era/sirind/tomak79h/keymaps/default/keymap.c index 7b8a5b8a13..d1434f8cd0 100644 --- a/keyboards/era/sirind/tomak79h/keymaps/default/keymap.c +++ b/keyboards/era/sirind/tomak79h/keymaps/default/keymap.c @@ -17,8 +17,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; \ No newline at end of file diff --git a/keyboards/keebfront/vanguard65/keymaps/default/keymap.c b/keyboards/keebfront/vanguard65/keymaps/default/keymap.c index 3768ba89cc..225873183e 100644 --- a/keyboards/keebfront/vanguard65/keymaps/default/keymap.c +++ b/keyboards/keebfront/vanguard65/keymaps/default/keymap.c @@ -34,8 +34,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAYER1] = LAYOUT_all( _______, QK_GESC, 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_END, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, - _______, RGB_SPI, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, UG_TOGG, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_VALU, UG_VALD, _______, KC_PSCR, KC_SCRL, KC_PAUS, QK_BOOT, _______, + _______, UG_SPDU, UG_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ) diff --git a/keyboards/keebio/iris_lm/keymaps/default/keymap.c b/keyboards/keebio/iris_lm/keymaps/default/keymap.c index d5021d647d..7a0625a36a 100644 --- a/keyboards/keebio/iris_lm/keymaps/default/keymap.c +++ b/keyboards/keebio/iris_lm/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_MOD, EE_CLR, _______, _______, _______, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, + RM_NEXT, EE_CLR, _______, _______, _______, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ _______, _______, KC_DEL, KC_DEL, _______, KC_P0 // └────────┴────────┴────────┘ └────────┴────────┴────────┘ @@ -43,11 +43,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_TOG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, QK_BOOT, + RM_TOGG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, QK_BOOT, //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ - RGB_MOD, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_BSLS, + RM_NEXT, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RM_HUEU, RM_SATU, RM_VALU, KC_BSLS, //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, EE_CLR, + KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RM_HUED, RM_SATD, RM_VALD, EE_CLR, //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ _______, _______, _______, _______, _______, _______ // └────────┴────────┴────────┘ └────────┴────────┴────────┘ diff --git a/keyboards/xdboards/recon/keymaps/default/keymap.c b/keyboards/xdboards/recon/keymaps/default/keymap.c index 30d96e09ba..841f8b0b6a 100644 --- a/keyboards/xdboards/recon/keymaps/default/keymap.c +++ b/keyboards/xdboards/recon/keymaps/default/keymap.c @@ -145,8 +145,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RGB] = LAYOUT( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - RGB_TOG, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + RM_TOGG, RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO , KC_NO, KC_NO, KC_NO, KC_NO , KC_NO, KC_NO, KC_NO, KC_NO , KC_NO, KC_NO, KC_NO, KC_NO , KC_NO, KC_NO, KC_NO From 1da8aa8259fe624e30f0f2c09a814798caebb9f6 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 30 Nov 2024 16:30:45 +1100 Subject: [PATCH 026/592] Improve "feature/encoder config both specified" warnings (#24641) --- lib/python/qmk/info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 5dae353538..74a62721a3 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -292,7 +292,7 @@ def _extract_features(info_data, rules): info_data['features'] = {} if key in info_data['features']: - _log_warning(info_data, 'Feature %s is specified in both info.json and rules.mk, the rules.mk value wins.' % (key,)) + _log_warning(info_data, 'Feature %s is specified in both info.json (%s) and rules.mk (%s). The rules.mk value wins.' % (key, info_data['features'], value)) info_data['features'][key] = value info_data['config_h_features'][key] = value @@ -415,7 +415,7 @@ def _extract_encoders(info_data, config_c): info_data['encoder'] = {} if 'rotary' in info_data['encoder']: - _log_warning(info_data, 'Encoder config is specified in both config.h and info.json (encoder.rotary) (Value: %s), the config.h value wins.' % info_data['encoder']['rotary']) + _log_warning(info_data, 'Encoder config is specified in both config.h (%s) and info.json (%s). The config.h value wins.' % (encoders, info_data['encoder']['rotary'])) info_data['encoder']['rotary'] = encoders From df9bf9efa1bb0844f01c1c2fcc4ad7da78b30ac4 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 30 Nov 2024 22:51:41 +1100 Subject: [PATCH 027/592] Update ChibiOS to latest stable branch. (#24651) --- lib/chibios | 2 +- lib/chibios-contrib | 2 +- .../GENERIC_STM32_H723XG/configs/mcuconf.h | 2 ++ .../boards/QMK_PROTON_C/configs/chconf.h | 23 +++++++++++++++++++ .../chibios/boards/common/configs/chconf.h | 23 +++++++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lib/chibios b/lib/chibios index be44b3305f..9dd6eaf669 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit be44b3305f9a9fe5f2f49a4e7b978db322dc463e +Subproject commit 9dd6eaf669e83eb9d5aaabe736ecfdf2f790a9fd diff --git a/lib/chibios-contrib b/lib/chibios-contrib index 77cb0a4f75..b643aad980 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit 77cb0a4f7589f89e724f5e6ecb1d76d514dd1212 +Subproject commit b643aad980d061021565c55745925c2cde4a3c6f diff --git a/platforms/chibios/boards/GENERIC_STM32_H723XG/configs/mcuconf.h b/platforms/chibios/boards/GENERIC_STM32_H723XG/configs/mcuconf.h index 0239ec5273..09096c3977 100644 --- a/platforms/chibios/boards/GENERIC_STM32_H723XG/configs/mcuconf.h +++ b/platforms/chibios/boards/GENERIC_STM32_H723XG/configs/mcuconf.h @@ -182,6 +182,7 @@ #define STM32_IRQ_FDCAN1_PRIORITY 10 #define STM32_IRQ_FDCAN2_PRIORITY 10 +#define STM32_IRQ_FDCAN3_PRIORITY 10 #define STM32_IRQ_MDMA_PRIORITY 9 @@ -235,6 +236,7 @@ */ #define STM32_CAN_USE_FDCAN1 FALSE #define STM32_CAN_USE_FDCAN2 FALSE +#define STM32_CAN_USE_FDCAN3 FALSE /* * DAC driver system settings. diff --git a/platforms/chibios/boards/QMK_PROTON_C/configs/chconf.h b/platforms/chibios/boards/QMK_PROTON_C/configs/chconf.h index cc10304a3f..e92b7aeb98 100644 --- a/platforms/chibios/boards/QMK_PROTON_C/configs/chconf.h +++ b/platforms/chibios/boards/QMK_PROTON_C/configs/chconf.h @@ -49,6 +49,19 @@ #define CH_CFG_SMP_MODE FALSE #endif +/** + * @brief Kernel hardening level. + * @details This option is the level of functional-safety checks enabled + * in the kerkel. The meaning is: + * - 0: No checks, maximum performance. + * - 1: Reasonable checks. + * - 2: All checks. + * . + */ +#if !defined(CH_CFG_HARDENING_LEVEL) +#define CH_CFG_HARDENING_LEVEL 0 +#endif + /** @} */ /*===========================================================================*/ @@ -360,6 +373,16 @@ #define CH_CFG_USE_MAILBOXES TRUE #endif +/** + * @brief Memory checks APIs. + * @details If enabled then the memory checks APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MEMCHECKS) +#define CH_CFG_USE_MEMCHECKS TRUE +#endif + /** * @brief Core Memory Manager APIs. * @details If enabled then the core memory manager APIs are included diff --git a/platforms/chibios/boards/common/configs/chconf.h b/platforms/chibios/boards/common/configs/chconf.h index 5db836e37c..6381298ef7 100644 --- a/platforms/chibios/boards/common/configs/chconf.h +++ b/platforms/chibios/boards/common/configs/chconf.h @@ -49,6 +49,19 @@ #define CH_CFG_SMP_MODE FALSE #endif +/** + * @brief Kernel hardening level. + * @details This option is the level of functional-safety checks enabled + * in the kerkel. The meaning is: + * - 0: No checks, maximum performance. + * - 1: Reasonable checks. + * - 2: All checks. + * . + */ +#if !defined(CH_CFG_HARDENING_LEVEL) +#define CH_CFG_HARDENING_LEVEL 0 +#endif + /** @} */ /*===========================================================================*/ @@ -360,6 +373,16 @@ #define CH_CFG_USE_MAILBOXES FALSE #endif +/** + * @brief Memory checks APIs. + * @details If enabled then the memory checks APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MEMCHECKS) +#define CH_CFG_USE_MEMCHECKS TRUE +#endif + /** * @brief Core Memory Manager APIs. * @details If enabled then the core memory manager APIs are included From 5eb53be671b4103626d0c0bb7828474d8be03ec7 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 1 Dec 2024 19:24:44 +0000 Subject: [PATCH 028/592] Avoid loading keymap rules.mk twice (#24665) --- builddefs/build_keyboard.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index afad67a76d..7d58c29462 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -197,8 +197,10 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "") KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h - # Load the keymap-level rules.mk if exists - -include $(KEYMAP_PATH)/rules.mk + ifeq ($(OTHER_KEYMAP_C),) + # Load the keymap-level rules.mk if exists (and we havent already loaded it for keymap.c) + -include $(KEYMAP_PATH)/rules.mk + endif # Load any rules.mk content from keymap.json INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON)) From b022d3bc6b9c6c1816272bcc6ad5d0f03c2d96a5 Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Sun, 1 Dec 2024 23:01:05 -0500 Subject: [PATCH 029/592] [Keyboard] Add fistbnmp (#24595) --- keyboards/rpiguy9907/fistbnmp/keyboard.json | 178 ++++++++++++++++++ .../fistbnmp/keymaps/default/keymap.json | 14 ++ keyboards/rpiguy9907/fistbnmp/readme.md | 27 +++ 3 files changed, 219 insertions(+) create mode 100644 keyboards/rpiguy9907/fistbnmp/keyboard.json create mode 100644 keyboards/rpiguy9907/fistbnmp/keymaps/default/keymap.json create mode 100644 keyboards/rpiguy9907/fistbnmp/readme.md diff --git a/keyboards/rpiguy9907/fistbnmp/keyboard.json b/keyboards/rpiguy9907/fistbnmp/keyboard.json new file mode 100644 index 0000000000..b4e76341e0 --- /dev/null +++ b/keyboards/rpiguy9907/fistbnmp/keyboard.json @@ -0,0 +1,178 @@ +{ + "manufacturer": "rpiguy9907", + "keyboard_name": "fistbnmp", + "maintainer": "lesshonor", + "bootloader": "atmel-dfu", + "bootloader_instructions": "Press the button labeled SW1 on the back of the PCB.", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["C6", "C7", "B4", "F7", "D0", "D6", "D3", "D4", "D5"], + "rows": ["F0", "B6", "D7", "B5"] + }, + "processor": "atmega32u4", + "url": "https://github.com/rpiguy9907", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT_3u": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 4], "x": 3, "y": 3, "w": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3} + ] + }, + "LAYOUT_7u": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 4], "x": 1, "y": 3, "w": 7}, + {"matrix": [3, 8], "x": 8, "y": 3} + ] + }, + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3} + ] + }, + "LAYOUT_split_space": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 4.5, "y": 3, "w": 1.5}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3} + ] + } + } +} diff --git a/keyboards/rpiguy9907/fistbnmp/keymaps/default/keymap.json b/keyboards/rpiguy9907/fistbnmp/keymaps/default/keymap.json new file mode 100644 index 0000000000..4cc23703e2 --- /dev/null +++ b/keyboards/rpiguy9907/fistbnmp/keymaps/default/keymap.json @@ -0,0 +1,14 @@ +{ + "keyboard": "rpiguy9907/fistbnmp", + "keymap": "default", + "version": 1, + "layout": "LAYOUT_all", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", + "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_P", "KC_DOT", + "KC_LCTL", "KC_LALT", "KC_LGUI", "KC_SPC", "KC_SPC", "KC_RIGHT", "KC_LEFT", "KC_DOWN", "KC_UP" + ] + ] +} diff --git a/keyboards/rpiguy9907/fistbnmp/readme.md b/keyboards/rpiguy9907/fistbnmp/readme.md new file mode 100644 index 0000000000..2b6721f926 --- /dev/null +++ b/keyboards/rpiguy9907/fistbnmp/readme.md @@ -0,0 +1,27 @@ +# FistBNMP + +![FistBNMP assembled proto and bare PCB](https://i.redd.it/uv34770qmc371.jpg) + +A compact 9u layout with support for standard Cherry MX and Low Profile MX switches. + +* Keyboard Maintainer: [rpiguy9907](https://github.com/rpiguy9907), [lesshonor](https://github.com/lesshonor) +* Hardware Supported: FistBNMP PCB (atmega32u4, atmel-dfu) +* Hardware Availability: Files available on request; ask in the 40% Discord + +Make example for this keyboard (after setting up your build environment): + + make rpiguy9907/fistbnmp:default + +Flashing example for this keyboard: + + make rpiguy9907/fistbnmp: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 top left key and plug in the keyboard. This will also clear EEPROM, so it is a good first step if the keyboard is misbehaving. +* **Physical reset button**: Briefly press the button labeled `SW1` on the back of the PCB. +* **Keycode in layout**: There is no key mapped to `QK_BOOT` in the pre-created keymaps, but you may assign this key in any keymaps you create. From 39c40f55cb3a7c808ff322177435042cb40153bb Mon Sep 17 00:00:00 2001 From: "Christian C. Berclaz" Date: Mon, 2 Dec 2024 05:05:29 +0100 Subject: [PATCH 030/592] Add Xlant XL keyboard (#24608) Co-authored-by: jack --- keyboards/zlant_xl/keyboard.json | 89 +++++++++++++++++++++ keyboards/zlant_xl/keymaps/default/keymap.c | 42 ++++++++++ keyboards/zlant_xl/readme.md | 26 ++++++ 3 files changed, 157 insertions(+) create mode 100644 keyboards/zlant_xl/keyboard.json create mode 100644 keyboards/zlant_xl/keymaps/default/keymap.c create mode 100644 keyboards/zlant_xl/readme.md diff --git a/keyboards/zlant_xl/keyboard.json b/keyboards/zlant_xl/keyboard.json new file mode 100644 index 0000000000..540f1e7506 --- /dev/null +++ b/keyboards/zlant_xl/keyboard.json @@ -0,0 +1,89 @@ +{ + "manufacturer": "Ziptyze", + "keyboard_name": "ZlantXL", + "maintainer": "chrisgve", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["D6", "D5", "C7", "C5", "D3", "D4"], + "rows": ["C4", "C6", "B1", "B0", "B3", "B2", "B5", "B4", "B7", "B6"] + }, + "processor": "atmega32u2", + "usb": { + "device_version": "0.0.1", + "pid": "0x6800", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [1, 0], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "3", "matrix": [1, 1], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 2], "x": 4, "y": 0}, + {"label": "5", "matrix": [1, 2], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 3], "x": 6, "y": 0}, + {"label": "7", "matrix": [1, 3], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 4], "x": 8, "y": 0}, + {"label": "9", "matrix": [1, 4], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 5], "x": 10, "y": 0}, + {"label": "Del", "matrix": [1, 5], "x": 11, "y": 0}, + {"label": "Tab", "matrix": [2, 0], "x": 0, "y": 1}, + {"label": "Q", "matrix": [3, 0], "x": 1, "y": 1}, + {"label": "W", "matrix": [2, 1], "x": 2, "y": 1}, + {"label": "E", "matrix": [3, 1], "x": 3, "y": 1}, + {"label": "R", "matrix": [2, 2], "x": 4, "y": 1}, + {"label": "T", "matrix": [3, 2], "x": 5, "y": 1}, + {"label": "Y", "matrix": [2, 3], "x": 6, "y": 1}, + {"label": "U", "matrix": [3, 3], "x": 7, "y": 1}, + {"label": "I", "matrix": [2, 4], "x": 8, "y": 1}, + {"label": "O", "matrix": [3, 4], "x": 9, "y": 1}, + {"label": "P", "matrix": [2, 5], "x": 10, "y": 1}, + {"label": "Backspace", "matrix": [3, 5], "x": 11, "y": 1}, + {"label": "Keycaps", "matrix": [4, 0], "x": 0, "y": 2}, + {"label": "A", "matrix": [5, 0], "x": 1, "y": 2}, + {"label": "S", "matrix": [4, 1], "x": 2, "y": 2}, + {"label": "D", "matrix": [5, 1], "x": 3, "y": 2}, + {"label": "F", "matrix": [4, 2], "x": 4, "y": 2}, + {"label": "G", "matrix": [5, 2], "x": 5, "y": 2}, + {"label": "H", "matrix": [4, 3], "x": 6, "y": 2}, + {"label": "J", "matrix": [5, 3], "x": 7, "y": 2}, + {"label": "K", "matrix": [4, 4], "x": 8, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9, "y": 2}, + {"label": ";", "matrix": [4, 5], "x": 10, "y": 2}, + {"label": "'", "matrix": [5, 5], "x": 11, "y": 2}, + {"label": "Shift", "matrix": [6, 0], "x": 0, "y": 3}, + {"label": "Z", "matrix": [7, 0], "x": 1, "y": 3}, + {"label": "X", "matrix": [6, 1], "x": 2, "y": 3}, + {"label": "C", "matrix": [7, 1], "x": 3, "y": 3}, + {"label": "V", "matrix": [6, 2], "x": 4, "y": 3}, + {"label": "B", "matrix": [7, 2], "x": 5, "y": 3}, + {"label": "N", "matrix": [6, 3], "x": 6, "y": 3}, + {"label": "M", "matrix": [7, 3], "x": 7, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 8, "y": 3}, + {"label": ".", "matrix": [7, 4], "x": 9, "y": 3}, + {"label": "/", "matrix": [6, 5], "x": 10, "y": 3}, + {"label": "Enter", "matrix": [7, 5], "x": 11, "y": 3}, + {"label": "", "matrix": [8, 0], "x": 0, "y": 4}, + {"label": "Ctrl", "matrix": [9, 0], "x": 1, "y": 4}, + {"label": "Alt", "matrix": [8, 1], "x": 2, "y": 4}, + {"label": "GUI", "matrix": [9, 1], "x": 3, "y": 4}, + {"label": "MO(2)", "matrix": [8, 2], "x": 4, "y": 4}, + {"label": " ", "matrix": [9, 2], "x": 5, "y": 4}, + {"label": " ", "matrix": [8, 3], "x": 6, "y": 4}, + {"label": "MO(1)", "matrix": [9, 3], "x": 7, "y": 4}, + {"label": "Left", "matrix": [8, 4], "x": 8, "y": 4}, + {"label": "Down", "matrix": [9, 4], "x": 9, "y": 4}, + {"label": "Up", "matrix": [8, 5], "x": 10, "y": 4}, + {"label": "Right", "matrix": [9, 5], "x": 11, "y": 4} + ] + } + } +} diff --git a/keyboards/zlant_xl/keymaps/default/keymap.c b/keyboards/zlant_xl/keymaps/default/keymap.c new file mode 100644 index 0000000000..c92960048f --- /dev/null +++ b/keyboards/zlant_xl/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 Christian C. Berclaz + * + * 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 + +enum layers { + BASE, + FN +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BASE] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC, + 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, + _______, KC_LCTL, KC_LALT, KC_LGUI, KC_LSFT, KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [FN] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ) +}; +// clang-format on diff --git a/keyboards/zlant_xl/readme.md b/keyboards/zlant_xl/readme.md new file mode 100644 index 0000000000..aab5746096 --- /dev/null +++ b/keyboards/zlant_xl/readme.md @@ -0,0 +1,26 @@ +# ZLANT XL + +![ZLANT XL](https://imgur.com/Vcmjwro.jpg) +_A unique 50% mechanical keyboard that uses a slanted ortholinear layout_ + +- Keyboard Maintainer: [chrisgve](https://github.com/chrisgve) +- Hardware Supported: Zlant XL w/Ziptyze's atmega32u2 powered controller [The Rune](https://1upkeyboards.com/shop/controllers/the-rune-by-ziptyze/) +- Hardware Availability: [1UP Keyboards](https://1upkeyboards.com/shop/keyboard-kits/diy-40-kits/zlantxl-50-mechanical-keyboard-kit/) + +Make example for this keyboard (after setting up your build environment): + + make zlant_xl:default + +Flashing example for this keyboard: + + make zlant_xl: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 board (button on The Rune) +- **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From b599c785483c82236d1e8a61e3e8deefac14422f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 1 Dec 2024 21:58:18 -0800 Subject: [PATCH 031/592] Fix Quantum Painter compiliation issues with heavy optimization (#24667) --- quantum/painter/qgf.c | 8 ++++---- quantum/painter/qp_draw_image.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/painter/qgf.c b/quantum/painter/qgf.c index bc2df94933..07c3f80314 100644 --- a/quantum/painter/qgf.c +++ b/quantum/painter/qgf.c @@ -255,10 +255,10 @@ bool qgf_validate_stream(qp_stream_t *stream) { // Read and validate all the frames (automatically validates the frame offset descriptor in the process) for (uint16_t i = 0; i < frame_count; ++i) { // Validate the frame descriptor block - uint8_t bpp; - bool has_palette; - bool is_panel_native; - bool has_delta; + uint8_t bpp = 0; + bool has_palette = false; + bool is_panel_native = false; + bool has_delta = false; if (!qgf_validate_frame_descriptor(stream, i, &bpp, &has_palette, &is_panel_native, &has_delta)) { return false; } diff --git a/quantum/painter/qp_draw_image.c b/quantum/painter/qp_draw_image.c index 18fa38cb19..a225039af4 100644 --- a/quantum/painter/qp_draw_image.c +++ b/quantum/painter/qp_draw_image.c @@ -318,9 +318,9 @@ static deferred_token qp_render_animation_state(animation_state_t *state, uint16 } static uint32_t animation_callback(uint32_t trigger_time, void *cb_arg) { - animation_state_t *state = (animation_state_t *)cb_arg; - uint16_t delay_ms; - bool ret = qp_render_animation_state(state, &delay_ms); + animation_state_t *state = (animation_state_t *)cb_arg; + uint16_t delay_ms = 0; + bool ret = qp_render_animation_state(state, &delay_ms); if (!ret) { // Setting the device to NULL clears the animation slot state->device = NULL; From be7786bfc6f8e14a796cf13991428d1ef8135f26 Mon Sep 17 00:00:00 2001 From: Stephen Onnen Date: Mon, 2 Dec 2024 08:57:34 -0600 Subject: [PATCH 032/592] Addition of Hotdog Pad (#24650) * Add Hotdog Pad * remove encoder_map feature * Add rules.mk * move rules.mk into keymap * Update keyboards/onnenon/hotdog_pad/keyboard.json Co-authored-by: Joel Challis * Update keyboards/onnenon/hotdog_pad/keyboard.json Co-authored-by: Joel Challis * Update keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c Co-authored-by: Joel Challis * Update keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c Co-authored-by: Joel Challis * add hotdog_pad.c * fix reversed encoder pins * Update keyboards/onnenon/hotdog_pad/hotdog_pad.c Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- keyboards/onnenon/hotdog_pad/hotdog_pad.c | 12 +++++ keyboards/onnenon/hotdog_pad/keyboard.json | 53 +++++++++++++++++++ .../hotdog_pad/keymaps/default/keymap.c | 14 +++++ .../hotdog_pad/keymaps/default/rules.mk | 1 + keyboards/onnenon/hotdog_pad/readme.md | 24 +++++++++ 5 files changed, 104 insertions(+) create mode 100644 keyboards/onnenon/hotdog_pad/hotdog_pad.c create mode 100644 keyboards/onnenon/hotdog_pad/keyboard.json create mode 100644 keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c create mode 100644 keyboards/onnenon/hotdog_pad/keymaps/default/rules.mk create mode 100644 keyboards/onnenon/hotdog_pad/readme.md diff --git a/keyboards/onnenon/hotdog_pad/hotdog_pad.c b/keyboards/onnenon/hotdog_pad/hotdog_pad.c new file mode 100644 index 0000000000..c48274fb55 --- /dev/null +++ b/keyboards/onnenon/hotdog_pad/hotdog_pad.c @@ -0,0 +1,12 @@ +// Copyright 2024 Stephen Onnen (@onnenon) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Enable the power pin for the Xiao Seeed rp2040 onboard NeoPixel + gpio_set_pin_output(GP11); + gpio_write_pin_high(GP11); + + keyboard_pre_init_user(); +} diff --git a/keyboards/onnenon/hotdog_pad/keyboard.json b/keyboards/onnenon/hotdog_pad/keyboard.json new file mode 100644 index 0000000000..3831e7afed --- /dev/null +++ b/keyboards/onnenon/hotdog_pad/keyboard.json @@ -0,0 +1,53 @@ +{ + "manufacturer": "onnenon", + "keyboard_name": "Hotdog Pad", + "maintainer": "onnenon", + "processor": "RP2040", + "bootloader": "rp2040", + "matrix_pins": { + "direct": [["GP1", "GP2", "GP4", "GP6", "GP0"]] + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x4F4E" + }, + "features": { + "encoder": true, + "rgblight": true, + "extrakey": true, + "mousekey": true + }, + "encoder": { + "rotary": [{ "pin_a": "GP29", "pin_b": "GP28" }] + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "x": 0, "y": 0, "matrix": [0, 0] }, + { "x": 1, "y": 0, "matrix": [0, 1] }, + { "x": 2, "y": 0, "matrix": [0, 2] }, + { "x": 3, "y": 0, "matrix": [0, 3] }, + { "x": 4, "y": 0, "matrix": [0, 4] } + ] + } + }, + "ws2812": { + "pin": "GP12", + "driver": "vendor" + }, + "rgblight": { + "led_count": 1, + "max_brightness": 185, + "animations": { + "breathing": true, + "rainbow_mood": true, + "knight": true, + "christmas": true, + "static_gradient": true, + "rgb_test": true, + "alternating": true, + "twinkle": true + } + } +} diff --git a/keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c b/keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c new file mode 100644 index 0000000000..9370249098 --- /dev/null +++ b/keyboards/onnenon/hotdog_pad/keymaps/default/keymap.c @@ -0,0 +1,14 @@ +// Copyright 2024 Stephen Onnen (@onnenon) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT(KC_A, KC_B, KC_C, KC_D, KC_MUTE) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, +}; +#endif diff --git a/keyboards/onnenon/hotdog_pad/keymaps/default/rules.mk b/keyboards/onnenon/hotdog_pad/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/onnenon/hotdog_pad/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/onnenon/hotdog_pad/readme.md b/keyboards/onnenon/hotdog_pad/readme.md new file mode 100644 index 0000000000..c3b0699c21 --- /dev/null +++ b/keyboards/onnenon/hotdog_pad/readme.md @@ -0,0 +1,24 @@ +# Hotdog Pad + +* Keyboard Maintainer: [Stephen Onnen](https://github.com/onnenon) +* Hardware Supported: Seeed Studio XIAO RP2040 +* Hardware Availability: https://github.com/onnenon/hotdog_pad + +Make example for this keyboard (after setting up your build environment): + + make onnenon/hotdog_pad:default + +Flashing example for this keyboard: + + make onnenon/hotdog_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 + From e592a7da0017a57a476debee2355f8dbb5d81349 Mon Sep 17 00:00:00 2001 From: Nibell Date: Mon, 2 Dec 2024 16:00:29 +0100 Subject: [PATCH 033/592] [Keyboard] Added nibell micropad4x4 (#24662) * feat: added nibell micropad4x4 * chore: updated readme * chore: updated keymap * feat: added layers * chore: added bootloader doc * Added layers * changed RSHIFT and RCTRL * Update keyboards/nibell/micropad4x4/keyboard.json Co-authored-by: Duncan Sutherland * Update keyboards/nibell/micropad4x4/readme.md --------- Co-authored-by: Duncan Sutherland Co-authored-by: jack --- keyboards/nibell/micropad4x4/keyboard.json | 50 +++++++++++ .../micropad4x4/keymaps/default/keymap.c | 90 +++++++++++++++++++ keyboards/nibell/micropad4x4/readme.md | 26 ++++++ 3 files changed, 166 insertions(+) create mode 100644 keyboards/nibell/micropad4x4/keyboard.json create mode 100644 keyboards/nibell/micropad4x4/keymaps/default/keymap.c create mode 100644 keyboards/nibell/micropad4x4/readme.md diff --git a/keyboards/nibell/micropad4x4/keyboard.json b/keyboards/nibell/micropad4x4/keyboard.json new file mode 100644 index 0000000000..b992f501cf --- /dev/null +++ b/keyboards/nibell/micropad4x4/keyboard.json @@ -0,0 +1,50 @@ +{ + "manufacturer": "nibell", + "keyboard_name": "nibell/micropad4x4", + "maintainer": "Linus Nibell", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP2", "GP3", "GP4", "GP5"], + "rows": ["GP10", "GP11", "GP12", "GP13"] + }, + "processor": "RP2040", + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0xFEED", + "vid": "0x4C4E" + }, + "community_layouts": ["ortho_4x4"], + "layouts": { + "LAYOUT_ortho_4x4": { + "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}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3} + ] + } + } +} diff --git a/keyboards/nibell/micropad4x4/keymaps/default/keymap.c b/keyboards/nibell/micropad4x4/keymaps/default/keymap.c new file mode 100644 index 0000000000..1da79514ed --- /dev/null +++ b/keyboards/nibell/micropad4x4/keymaps/default/keymap.c @@ -0,0 +1,90 @@ +/* + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Base + * ┌──────┬─────┬──────┬───────┐ + * │NUMLK │ │ │QK_BOOT│ + * ├──────┼─────├──────┼───────┤ + * │NUMPAD│MINI │ FN │ │ + * ├──────┼─────┼──────┼───────┤ + * │ 1 │ 2 │ 3 │ 4 │ + * ├──────┼─────┼──────┼───────┤ + * │ │ │RSHIFT│ RCTRL │ + * └──────┴─────┴──────┴───────┘ + */ + [0] = LAYOUT_ortho_4x4( + KC_NUM, KC_NO, KC_NO, QK_BOOT, + TO(1), TO(2), TO(3), KC_NO, + KC_1, KC_2, KC_3, KC_4, + KC_NO, KC_NO, KC_RSFT, KC_RCTL + ), + + /* Numpad + * ┌─────┬─────┬─────┬─────┐ + * │ 7 │ 8 │ 9 │ * │ + * ├─────┼─────├─────┼─────┤ + * │ 4 │ 5 │ 6 │ - │ + * ├─────┼─────┼─────┼─────┤ + * │ 1 │ 2 │ 3 │ + │ + * ├─────┼─────┼─────┼─────┤ + * │ 0 │ . │ / │ = │ + * └─────┴─────┴─────┴─────┘ + */ + [1] = LAYOUT_ortho_4x4( + KC_P7, KC_P8, KC_P9, KC_PAST, + KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_P0, KC_PDOT, KC_PSLS, LT(3, KC_PENT) + ), + + /* Mini KeyBoard + * ┌─────┬─────┬─────┬─────┐ + * │ ESC │ 1 │ 2 │ 3 │ + * ├─────┼─────┼─────┼─────┤ + * │ TAB │ Q │ W │ E │ + * ├─────┼─────┼─────┼─────┤ + * │SHIFT│ A │ S │ D │ + * ├─────┼─────┼─────┼─────┤ + * │CTRL │ C │ R │SPACE│ + * └─────┴─────┴─────┴─────┘ + */ + [2] = LAYOUT_ortho_4x4( + LT(3, KC_ESC), KC_1, KC_2, KC_3, + KC_TAB, KC_Q, KC_W, KC_E, + KC_LSFT, KC_A, KC_S, KC_D, + KC_LCTL, KC_C, KC_R, KC_SPC + ), + + /* FN Keyboard + * ┌─────┬─────┬─────┬─────┐ + * │ F1 │ F2 │ F3 │ F4 │ + * ├─────┼─────┼─────┼─────┤ + * │ F5 │ F6 │ F7 │ F8 │ + * ├─────┼─────┼─────┼─────┤ + * │ F9 │ F10 │ F11 │ F12 │ + * ├─────┼─────┼─────┼─────┤ + * │BASE │ │ │ │ + * └─────┴─────┴─────┴─────┘ + */ + [3] = LAYOUT_ortho_4x4( + KC_F1, KC_F2, KC_F3, KC_F4, + KC_F5, KC_F6, KC_F7, KC_F8, + KC_F9, KC_F10, KC_F11, KC_F12, + TO(0), KC_NO, KC_NO, KC_NO + ), +}; diff --git a/keyboards/nibell/micropad4x4/readme.md b/keyboards/nibell/micropad4x4/readme.md new file mode 100644 index 0000000000..6fec293b65 --- /dev/null +++ b/keyboards/nibell/micropad4x4/readme.md @@ -0,0 +1,26 @@ +# Micropad 4x4 + +![Micropad 4x4](https://imgur.com/ugfJLXJ.jpg) + +A budget-friendly 4x4 Macropad + +* Keyboard Maintainer: [nibell](https://github.com/Nibell) +* Hardware Supported: Raspberry Pi Pico +* Hardware Availability: [GitHub](https://github.com/Nibell/Keyboards/tree/main/micropad4x4) + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Physical reset button**: Hold the button down on the raspberry pi pico while plugging it in. There is no reset button on the pcb. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available + +Make example for this keyboard (after setting up your build environment): + + make nibell/micropad4x4:default + +Flashing example for this keyboard: + + make nibell/macropad4x4:default + +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). From fa3be8a3fb6bc45ed60674b6a7c7bc80d8d00594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=E1=BA=AFn?= <59417802+MaiTheSan@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:02:29 -0800 Subject: [PATCH 034/592] sawnsprojects/bunnygirl65: Fix typo in name (#24668) --- keyboards/sawnsprojects/bunnygirl65/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/sawnsprojects/bunnygirl65/keyboard.json b/keyboards/sawnsprojects/bunnygirl65/keyboard.json index 810d481b5d..92dca8693d 100644 --- a/keyboards/sawnsprojects/bunnygirl65/keyboard.json +++ b/keyboards/sawnsprojects/bunnygirl65/keyboard.json @@ -1,5 +1,5 @@ { - "manufacturer": "auaera", + "manufacturer": "auaena", "keyboard_name": "Bunnygirl65", "maintainer": "MaiTheSan", "bootloader": "stm32-dfu", From 0ad3ffdfbce15406acf318d8db335c4bf612bc7a Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:20:48 +0700 Subject: [PATCH 035/592] [Keyboard] Add support E8ghty (#24632) 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 for E8ghty * remove rgb test mode * Update community layout * Update fix pipeline build ci * 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/e8ghty/config.h | 23 + keyboards/trnthsn/e8ghty/halconf.h | 21 + keyboards/trnthsn/e8ghty/info.json | 577 ++++++++++++++++++ .../trnthsn/e8ghty/keymaps/default/keymap.c | 39 ++ keyboards/trnthsn/e8ghty/mcuconf.h | 22 + keyboards/trnthsn/e8ghty/readme.md | 27 + keyboards/trnthsn/e8ghty/rules.mk | 1 + .../trnthsn/e8ghty/stm32f072/keyboard.json | 4 + .../trnthsn/e8ghty/stm32f103/keyboard.json | 4 + 9 files changed, 718 insertions(+) create mode 100644 keyboards/trnthsn/e8ghty/config.h create mode 100644 keyboards/trnthsn/e8ghty/halconf.h create mode 100644 keyboards/trnthsn/e8ghty/info.json create mode 100644 keyboards/trnthsn/e8ghty/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/e8ghty/mcuconf.h create mode 100644 keyboards/trnthsn/e8ghty/readme.md create mode 100644 keyboards/trnthsn/e8ghty/rules.mk create mode 100644 keyboards/trnthsn/e8ghty/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/e8ghty/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/e8ghty/config.h b/keyboards/trnthsn/e8ghty/config.h new file mode 100644 index 0000000000..ae9f251eb6 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/config.h @@ -0,0 +1,23 @@ +/* +Copyright 2024 ThanhSon.Mech + +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/e8ghty/halconf.h b/keyboards/trnthsn/e8ghty/halconf.h new file mode 100644 index 0000000000..b8f0a217c4 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024 ThanhSon.Mech + * + * 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/e8ghty/info.json b/keyboards/trnthsn/e8ghty/info.json new file mode 100644 index 0000000000..ec4e724878 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/info.json @@ -0,0 +1,577 @@ +{ + "manufacturer": "ThanhSon.Mech", + "keyboard_name": "E8ghty", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["A8", "B14", "B12", "B11", "B10", "B1", "B0", "A7", "A6", "A5", "A3", "A2", "A1", "A0", "C14", "C13", "B5"], + "rows": ["A15", "A10", "A9", "A4", "C15", "B9"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "led_count": 26, + "sleep": true + }, + "ws2812": { + "pin": "B15", + "driver": "spi" + }, + "indicators": { + "caps_lock": "B4" + }, + "url": "", + "usb": { + "vid": "0x5453", + "pid": "0x3830", + "device_version": "0.0.1" + }, + "community_layouts": ["tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift", "tkl_f13_ansi_tsangan", "tkl_f13_ansi_tsangan_split_bs_rshift"], + "layouts": { + "LAYOUT_all": { + "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": "Play/Pause", "matrix": [0, 13], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [3, 12], "x": 13, "y": 1.25}, + {"label": "Backspace", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "Shift", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "Up", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "Left", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "Down", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "Right", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_tsangan": { + "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": "Play/Pause", "matrix": [0, 13], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "PgUp", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "Up", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "Left", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "Down", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "Right", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift": { + "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": "Play/Pause", "matrix": [0, 13], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [3, 12], "x": 13, "y": 1.25}, + {"label": "Backspace", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "Up", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "Left", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "Down", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "Right", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 5], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 7], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 8], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 10], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 11], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 12], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 13], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Fn", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 5], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 7], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 8], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 10], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 11], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 12], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 13], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [3, 12], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Fn", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/trnthsn/e8ghty/keymaps/default/keymap.c b/keyboards/trnthsn/e8ghty/keymaps/default/keymap.c new file mode 100644 index 0000000000..f16b0d5eb4 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ + // │Esc││F1 │F2 │F3 │F4 ││F5 │F6 │F7 │F8 ││F9 │F10│F11│F12││F13│ │Prs│Srk│Ps │ + // └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ + // ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ + // │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ ` │Bsp│ │Ins│Hm │PgU│ + // ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤ + // │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + // ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤ └───┴───┴───┘ + // │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │Ent │ + // ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ ┌───┐ + // │Sft │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │Shift │Fn │ │ ↑ │ + // ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐ + // │Ctrl │Win│Alt │ │Alt │Win│Ctrl │ │ ← │ ↓ │ → │ + // └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ + + [0] = LAYOUT_all( + 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_MPLY, KC_PSCR, KC_SCRL, KC_PAUS, + 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_GRV, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT_all( + _______, _______, _______, _______, _______, UG_TOGG, _______, _______, _______, _______, UG_NEXT, UG_VALD, UG_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_VOLD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/trnthsn/e8ghty/mcuconf.h b/keyboards/trnthsn/e8ghty/mcuconf.h new file mode 100644 index 0000000000..3bf940e0be --- /dev/null +++ b/keyboards/trnthsn/e8ghty/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 ThanhSon.Mech + * + * 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/e8ghty/readme.md b/keyboards/trnthsn/e8ghty/readme.md new file mode 100644 index 0000000000..7a46bf2c4c --- /dev/null +++ b/keyboards/trnthsn/e8ghty/readme.md @@ -0,0 +1,27 @@ +# E8ghty + +![trnthsn/e8ghty](https://imgur.com/M4Oudco.png) + +A TKL keyboard PCB compatible with various keyboard cases. Supports both right USB Type-C connector and bottom USB Type-C connector, 1 FPC header, and 3 JST SH positions for a daughter board. + +* Keyboard Maintainer: [ThanhSon.Mech](https://github.com/trnthsn) +* Hardware Supported: STM32F103/STM32F072, Geon F1 xx, TKD Cycle 8, Keycult, ... +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/e8ghty:default + +Flashing example for this keyboard: + + make trnthsn/e8ghty: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/e8ghty/rules.mk b/keyboards/trnthsn/e8ghty/rules.mk new file mode 100644 index 0000000000..e06e8fe182 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/rules.mk @@ -0,0 +1 @@ +DEFAULT_FOLDER = trnthsn/e8ghty/stm32f103 diff --git a/keyboards/trnthsn/e8ghty/stm32f072/keyboard.json b/keyboards/trnthsn/e8ghty/stm32f072/keyboard.json new file mode 100644 index 0000000000..b5d728b1cd --- /dev/null +++ b/keyboards/trnthsn/e8ghty/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu", +} diff --git a/keyboards/trnthsn/e8ghty/stm32f103/keyboard.json b/keyboards/trnthsn/e8ghty/stm32f103/keyboard.json new file mode 100644 index 0000000000..5b2b6bc7d9 --- /dev/null +++ b/keyboards/trnthsn/e8ghty/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot", +} From cd286e4b9db186b3a42b918ff043986ab9504ca3 Mon Sep 17 00:00:00 2001 From: suikagiken <115451678+suikagiken@users.noreply.github.com> Date: Tue, 3 Dec 2024 00:30:02 +0900 Subject: [PATCH 036/592] [Keyboard] Add suika27melo (#24616) * add keyboard suika27melo * Update keyboards/suikagiken/suika27melo/keyboard.json Co-authored-by: jack * Update keyboards/suikagiken/suika27melo/keyboard.json Co-authored-by: jack * Update keyboards/suikagiken/suika27melo/readme.md Co-authored-by: jack * Update keyboards/suikagiken/suika27melo/readme.md Co-authored-by: jack * change to imgur link --------- Co-authored-by: jack --- keyboards/suikagiken/suika27melo/config.h | 5 ++ .../suikagiken/suika27melo/keyboard.json | 64 +++++++++++++++++++ .../suika27melo/keymaps/default/keymap.json | 12 ++++ .../suika27melo/keymaps/midi/keymap.json | 12 ++++ keyboards/suikagiken/suika27melo/readme.md | 44 +++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 keyboards/suikagiken/suika27melo/config.h create mode 100644 keyboards/suikagiken/suika27melo/keyboard.json create mode 100644 keyboards/suikagiken/suika27melo/keymaps/default/keymap.json create mode 100644 keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json create mode 100644 keyboards/suikagiken/suika27melo/readme.md diff --git a/keyboards/suikagiken/suika27melo/config.h b/keyboards/suikagiken/suika27melo/config.h new file mode 100644 index 0000000000..7d35e3c436 --- /dev/null +++ b/keyboards/suikagiken/suika27melo/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 @suikagiken +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#define MIDI_ADVANCED diff --git a/keyboards/suikagiken/suika27melo/keyboard.json b/keyboards/suikagiken/suika27melo/keyboard.json new file mode 100644 index 0000000000..cba2561129 --- /dev/null +++ b/keyboards/suikagiken/suika27melo/keyboard.json @@ -0,0 +1,64 @@ +{ + "manufacturer": "suikagiken", + "keyboard_name": "suika27melo", + "maintainer": "suikagiken", + "processor": "atmega32u4", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "midi": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["F0", "B4", "B5", "D7", "B6", "D6", "C6", "C7", "D0"], + "rows": ["F1", "F4", "D1", "D2"] + }, + "url": "https://github.com/suikagiken/suika27melo", + "usb": { + "device_version": "1.1.0", + "vid": "0x4B48", + "pid": "0x0201" + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 50, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix":[0, 0], "x":0, "y":0}, + {"matrix":[0, 1], "x":2, "y":0}, + {"matrix":[0, 2], "x":3, "y":0}, + {"matrix":[0, 4], "x":5, "y":0}, + {"matrix":[0, 5], "x":6, "y":0}, + {"matrix":[0, 6], "x":7, "y":0}, + {"matrix":[2, 1], "x":9, "y":0}, + {"matrix":[2, 2], "x":10, "y":0}, + {"matrix":[2, 4], "x":12, "y":0}, + {"matrix":[2, 5], "x":13, "y":0}, + {"matrix":[2, 6], "x":14, "y":0}, + {"matrix":[1, 0], "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":[3, 1], "x":8.5, "y":1}, + {"matrix":[3, 2], "x":9.5, "y":1}, + {"matrix":[3, 3], "x":10.5, "y":1}, + {"matrix":[3, 4], "x":11.5, "y":1}, + {"matrix":[3, 5], "x":12.5, "y":1}, + {"matrix":[3, 6], "x":13.5, "y":1}, + {"matrix":[3, 7], "x":14.5, "y":1}, + {"matrix":[3, 8], "x":15.5, "y":1} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json b/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json new file mode 100644 index 0000000000..dadd846e48 --- /dev/null +++ b/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json @@ -0,0 +1,12 @@ +{ + "author": "@suikagiken", + "keyboard": "suikagiken/suika85ergo", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_A", "KC_D", "KC_F", "KC_I", "KC_K", "KC_M", "KC_P", "KC_R", "KC_U", "KC_W", "KC_Y", + "KC_B", "KC_C", "KC_E", "KC_G", "KC_H", "KC_J", "KC_L", "KC_N", "KC_O", "KC_Q", "KC_S", "KC_T", "KC_V", "KC_X", "KC_Z", "KC_SPC" + ] + ] +} diff --git a/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json b/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json new file mode 100644 index 0000000000..189665ddbf --- /dev/null +++ b/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json @@ -0,0 +1,12 @@ +{ + "author": "@suikagiken", + "keyboard": "suikagiken/suika85ergo", + "keymap": "midi", + "layout": "LAYOUT", + "layers": [ + [ + "MI_OCTU", "MI_Cs1", "MI_Ds1", "MI_Fs1", "MI_Gs1", "MI_As1", "MI_Cs2", "MI_Ds2", "MI_Fs2", "MI_Gs2", "MI_As2", + "MI_OCTD", "MI_C1", "MI_D1", "MI_E1", "MI_F1", "MI_G1", "MI_A1", "MI_B1", "MI_C2", "MI_D2", "MI_E2", "MI_F2", "MI_G2", "MI_A2", "MI_B2", "MI_C2" + ] + ] +} diff --git a/keyboards/suikagiken/suika27melo/readme.md b/keyboards/suikagiken/suika27melo/readme.md new file mode 100644 index 0000000000..1aa46565f0 --- /dev/null +++ b/keyboards/suikagiken/suika27melo/readme.md @@ -0,0 +1,44 @@ +# suika27melo +(English Follows Japanese) + +## 概要 +![suika27melo1](https://i.imgur.com/iFz3c1U.jpg) +![suika27melo2](https://i.imgur.com/xR7KpVR.jpg) + +suika27meloは2オクターブのピアノ鍵盤型マクロキーパッドです。 +通常のマクロキーパッドとしても使えるほか、MIDIキーボードとしてDAWソフトの入力や演奏に使用できます。 + +* 制作 : すいか技研 (Website: https://suikagiken.net GitHub: [suikagiken](https://github.com/suikagiken) ) +* 販売 : すいか技研の[booth](https://suikagiken.booth.pm/)にて販売予定です + +## ビルドガイド + +[こちら](https://github.com/suikagiken/suika27melo/blob/main/buildguide_1.1.md)からご覧下さい。 + +--- + +## Overview + +suika27melo is a 2-octave piano shaped macro keypad. +You can use it as a normal macro keypad, or use it as a MIDI keyboard for DAW software input and musical performance. + +* Keyboard Maintainer: [suikagiken](https://github.com/suikagiken) +* Hardware Availability: Available at [booth](https://suikagiken.booth.pm/) soon. + +Make example for this keyboard (after setting up your build environment): + + make suikagiken/suika27melo:default + +Flashing example for this keyboard: + + make suikagiken/suika27melo: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 top left 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 28320f0cb5e42a9178c0f0b71da057b87060b358 Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:37:02 +0700 Subject: [PATCH 037/592] [Keyboard] Add support S6xty5Neo Rev.2 (#24631) 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 * Add support for S6xty5Neo Rev.2 * Remove deprecated s6xty5 * Update layout * Apply suggestions from code review Co-authored-by: Duncan Sutherland * Move mcuconf and config to outer folder --------- Co-authored-by: Trần Thanh Sơn Co-authored-by: Duncan Sutherland --- keyboards/trnthsn/s6xty5neor2/config.h | 23 ++ keyboards/trnthsn/s6xty5neor2/halconf.h | 22 ++ keyboards/trnthsn/s6xty5neor2/info.json | 255 ++++++++++++++++++ .../s6xty5neor2/keymaps/default/keymap.c | 41 +++ keyboards/trnthsn/s6xty5neor2/mcuconf.h | 22 ++ keyboards/trnthsn/s6xty5neor2/readme.md | 27 ++ keyboards/trnthsn/s6xty5neor2/rules.mk | 1 + .../s6xty5neor2/stm32f072/keyboard.json | 4 + .../s6xty5neor2/stm32f103/keyboard.json | 4 + 9 files changed, 399 insertions(+) create mode 100644 keyboards/trnthsn/s6xty5neor2/config.h create mode 100644 keyboards/trnthsn/s6xty5neor2/halconf.h create mode 100644 keyboards/trnthsn/s6xty5neor2/info.json create mode 100644 keyboards/trnthsn/s6xty5neor2/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/s6xty5neor2/mcuconf.h create mode 100644 keyboards/trnthsn/s6xty5neor2/readme.md create mode 100644 keyboards/trnthsn/s6xty5neor2/rules.mk create mode 100644 keyboards/trnthsn/s6xty5neor2/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/s6xty5neor2/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/s6xty5neor2/config.h b/keyboards/trnthsn/s6xty5neor2/config.h new file mode 100644 index 0000000000..ae9f251eb6 --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/config.h @@ -0,0 +1,23 @@ +/* +Copyright 2024 ThanhSon.Mech + +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/s6xty5neor2/halconf.h b/keyboards/trnthsn/s6xty5neor2/halconf.h new file mode 100644 index 0000000000..337ed5da18 --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 ThanhSon.Mech + * + * 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 +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD +#include_next diff --git a/keyboards/trnthsn/s6xty5neor2/info.json b/keyboards/trnthsn/s6xty5neor2/info.json new file mode 100644 index 0000000000..ba20dbc2ba --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/info.json @@ -0,0 +1,255 @@ +{ + "manufacturer": "ThanhSon.Mech", + "keyboard_name": "S6xty5Neo Rev.2", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["A4", "A3", "A2", "A1", "A0", "A5", "A8", "B14", "B12", "B11", "B10", "B1", "B0", "A7", "A6"], + "rows": ["B4", "A10", "A9", "B7", "B9"] + }, + "indicators": { + "caps_lock": "C13" + }, + "url": "", + "usb": { + "vid": "0x5453", + "pid": "0x4E45", + "device_version": "0.0.1" + }, + "community_layouts": ["65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs"], + "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": [0, 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": [1, 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": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan_split_bs": { + "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": [0, 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": [1, 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": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"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/trnthsn/s6xty5neor2/keymaps/default/keymap.c b/keyboards/trnthsn/s6xty5neor2/keymaps/default/keymap.c new file mode 100644 index 0000000000..bc6c2e3271 --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/keymaps/default/keymap.c @@ -0,0 +1,41 @@ +// Copyright 2024 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│Del│ + // ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + // │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│ + // ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + // │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│ + // ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + // │Shf │Shf│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│ + // ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤ + // │Ctrl │GUI│ Alt │ │ Fn │ │ ← │ ↓ │ → │ + // └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ + + + [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_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_ENT, KC_PGDN, + 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, KC_UP, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + [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, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + MO(2) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/trnthsn/s6xty5neor2/mcuconf.h b/keyboards/trnthsn/s6xty5neor2/mcuconf.h new file mode 100644 index 0000000000..3bf940e0be --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 ThanhSon.Mech + * + * 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/s6xty5neor2/readme.md b/keyboards/trnthsn/s6xty5neor2/readme.md new file mode 100644 index 0000000000..6c7e595abe --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/readme.md @@ -0,0 +1,27 @@ +# S6xty5Neo Rev.2 + +![S6xty5Neo Rev.2](https://imgur.com/C6X3fCI.png) + +A 65% keyboard PCB compatible with Neo65. Supports Neo65 keyboard like an out-of-the-box PCB without any modification. + +* Keyboard Maintainer: [Trnthsn](https://github.com/trnthsn) +* Hardware Supported: STM32, S6xty5Neo Rev.2, Neo65 +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/s6xty5neor2:default + +Flashing example for this keyboard: + + make trnthsn/s6xty5neor2: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/s6xty5neor2/rules.mk b/keyboards/trnthsn/s6xty5neor2/rules.mk new file mode 100644 index 0000000000..1fc77fba72 --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/rules.mk @@ -0,0 +1 @@ +DEFAULT_FOLDER = trnthsn/s6xty5neor2/stm32f103 diff --git a/keyboards/trnthsn/s6xty5neor2/stm32f072/keyboard.json b/keyboards/trnthsn/s6xty5neor2/stm32f072/keyboard.json new file mode 100644 index 0000000000..b5d728b1cd --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu", +} diff --git a/keyboards/trnthsn/s6xty5neor2/stm32f103/keyboard.json b/keyboards/trnthsn/s6xty5neor2/stm32f103/keyboard.json new file mode 100644 index 0000000000..5b2b6bc7d9 --- /dev/null +++ b/keyboards/trnthsn/s6xty5neor2/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot", +} From e4e66c61ad9278124699dd452c7f7e5518e772a3 Mon Sep 17 00:00:00 2001 From: Thomas Queste Date: Mon, 2 Dec 2024 17:48:26 +0100 Subject: [PATCH 038/592] [murcielago] Enable split watchdog (#24463) --- keyboards/murcielago/rev1/config.h | 1 + .../murcielago/rev1/keymaps/default/keymap.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/keyboards/murcielago/rev1/config.h b/keyboards/murcielago/rev1/config.h index 17f316d6af..0d61c034de 100644 --- a/keyboards/murcielago/rev1/config.h +++ b/keyboards/murcielago/rev1/config.h @@ -20,6 +20,7 @@ along with this program. If not, see . /* split options, use EEPROM for side detection */ #define EE_HANDS #define SPLIT_USB_DETECT +#define SPLIT_WATCHDOG_ENABLE /* * Feature disable options diff --git a/keyboards/murcielago/rev1/keymaps/default/keymap.c b/keyboards/murcielago/rev1/keymaps/default/keymap.c index 63fbb04f7b..8dc5e21074 100644 --- a/keyboards/murcielago/rev1/keymaps/default/keymap.c +++ b/keyboards/murcielago/rev1/keymaps/default/keymap.c @@ -1,3 +1,19 @@ +/* +Copyright 2020 elagil + +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 enum layers { From 09dfbf8efe5655947b92361a6bdbf8aa2adc0b88 Mon Sep 17 00:00:00 2001 From: Josh Hinnebusch Date: Mon, 2 Dec 2024 11:49:11 -0500 Subject: [PATCH 039/592] [Keyboard] Add h88 gen2 (#24454) * initial commit * small updates * matrix fix * fix rgb lighting * updates * fix rgb pin * pin fixes * readme update * json formatting * Update keyboards/hineybush/h88_g2/config.h Co-authored-by: Drashna Jaelre --------- Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Drashna Jaelre --- keyboards/hineybush/h88_g2/config.h | 19 + keyboards/hineybush/h88_g2/halconf.h | 20 + keyboards/hineybush/h88_g2/keyboard.json | 1174 +++++++++++++++++ .../hineybush/h88_g2/keymaps/default/keymap.c | 42 + keyboards/hineybush/h88_g2/mcuconf.h | 21 + keyboards/hineybush/h88_g2/readme.md | 27 + 6 files changed, 1303 insertions(+) create mode 100644 keyboards/hineybush/h88_g2/config.h create mode 100644 keyboards/hineybush/h88_g2/halconf.h create mode 100644 keyboards/hineybush/h88_g2/keyboard.json create mode 100644 keyboards/hineybush/h88_g2/keymaps/default/keymap.c create mode 100644 keyboards/hineybush/h88_g2/mcuconf.h create mode 100644 keyboards/hineybush/h88_g2/readme.md diff --git a/keyboards/hineybush/h88_g2/config.h b/keyboards/hineybush/h88_g2/config.h new file mode 100644 index 0000000000..ccde4ac624 --- /dev/null +++ b/keyboards/hineybush/h88_g2/config.h @@ -0,0 +1,19 @@ +/* + * 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 BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL 1 +#define BACKLIGHT_PAL_MODE 1 diff --git a/keyboards/hineybush/h88_g2/halconf.h b/keyboards/hineybush/h88_g2/halconf.h new file mode 100644 index 0000000000..976d17d891 --- /dev/null +++ b/keyboards/hineybush/h88_g2/halconf.h @@ -0,0 +1,20 @@ +/* Copyright 2024 Josh Hinnebusch + * + * 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/hineybush/h88_g2/keyboard.json b/keyboards/hineybush/h88_g2/keyboard.json new file mode 100644 index 0000000000..983cbcc1f5 --- /dev/null +++ b/keyboards/hineybush/h88_g2/keyboard.json @@ -0,0 +1,1174 @@ +{ + "manufacturer": "Hiney LLC", + "keyboard_name": "h88_g2", + "maintainer": "hineybush", + "backlight": { + "pin": "A6" + }, + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "backlight": true, + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "B12", + "scroll_lock": "B14" + }, + "matrix_pins": { + "cols": ["B11", "B10", "B2", "B1", "B0", "A7", "A5", "A4", "A3", "F1", "C15", "C14", "F0", "C13", "B9", "B8", "B5"], + "rows": ["A15", "B3", "B4", "A0", "B6", "B7"] + }, + "processor": "STM32F072", + "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 + }, + "brightness_steps": 8, + "default": { + "val": 128 + }, + "led_count": 24, + "max_brightness": 200, + "saturation_steps": 8, + "sleep": true + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0002", + "vid": "0x4069" + }, + "ws2812": { + "pin": "B15" + }, + "community_layouts": ["tkl_f13_ansi", "tkl_f13_ansi_split_bs_rshift", "tkl_f13_ansi_tsangan", "tkl_f13_ansi_tsangan_split_bs_rshift", "tkl_f13_iso", "tkl_f13_iso_split_bs_rshift", "tkl_f13_iso_tsangan", "tkl_f13_iso_tsangan_split_bs_rshift", "tkl_f13_iso_wkl", "tkl_f13_iso_wkl_split_bs_rshift"], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_wkl": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_wkl": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [2, 16], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [4, 16], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 10], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/hineybush/h88_g2/keymaps/default/keymap.c b/keyboards/hineybush/h88_g2/keymaps/default/keymap.c new file mode 100644 index 0000000000..d9dbaf08e7 --- /dev/null +++ b/keyboards/hineybush/h88_g2/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +// Copyright 2023 Josh Hinnebusch +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ + * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│ + * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───────┼───┴┬────┬────┤ ┌───┼───┼───┐ + * │Ctrl│GUI │Alt │ │ Fn │ GUI│Ctrl│ │ ← │ ↓ │ → │ + * └────┴────┴────┴─────────────────────────────┴────┴────┴────┘ └───┴───┴───┘ + */ + [0] = LAYOUT_all( + 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_0, KC_PSCR, KC_SCRL, KC_PAUS, + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_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_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_NEXT, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, KC_TRNS, BL_TOGG, BL_DOWN, BL_UP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + +}; diff --git a/keyboards/hineybush/h88_g2/mcuconf.h b/keyboards/hineybush/h88_g2/mcuconf.h new file mode 100644 index 0000000000..7e226e4371 --- /dev/null +++ b/keyboards/hineybush/h88_g2/mcuconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024 Josh Hinnebusch + * + * 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_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/hineybush/h88_g2/readme.md b/keyboards/hineybush/h88_g2/readme.md new file mode 100644 index 0000000000..e5cd60b432 --- /dev/null +++ b/keyboards/hineybush/h88_g2/readme.md @@ -0,0 +1,27 @@ +# h88_g2 + +[h88_g2](https://i.imgur.com/t7chDf8h.png) + +New generation of the h88 keyboard PCB platform with an STM32 microcontroller. + +* Keyboard Maintainer: [Josh Hinnebusch](https://github.com/hineybush) +* Hardware Supported: H88 G2 PCB w/ STM32F072 MCU +* Hardware Availability: [hineybush.com](https://hineybush.com) + +Make example for this keyboard (after setting up your build environment): + + make hineybush/h88_g2:default + +Flashing example for this keyboard: + + make hineybush/h88_g2: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 Escape and plug in the keyboard. +* **Physical reset button**: Press the button on the back of the PCB for a minumum of 3 seconds, then release. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. From 50966934b2d7fd30514068cf262caf2213630159 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Tue, 3 Dec 2024 02:10:01 +0900 Subject: [PATCH 040/592] Add new keyboard "Jourkey" (#24409) * jourkey * rotary encoder * fix keymap * jourkey * format json * Update keyboards/takashicompany/jourkey/readme.md Co-authored-by: Joel Challis * fix layout * Update readme.md --------- Co-authored-by: Joel Challis --- .../takashicompany/jourkey/keyboard.json | 51 +++++++++++++++++++ .../jourkey/keymaps/default/keymap.c | 18 +++++++ .../jourkey/keymaps/default/rules.mk | 1 + keyboards/takashicompany/jourkey/readme.md | 41 +++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 keyboards/takashicompany/jourkey/keyboard.json create mode 100644 keyboards/takashicompany/jourkey/keymaps/default/keymap.c create mode 100644 keyboards/takashicompany/jourkey/keymaps/default/rules.mk create mode 100644 keyboards/takashicompany/jourkey/readme.md diff --git a/keyboards/takashicompany/jourkey/keyboard.json b/keyboards/takashicompany/jourkey/keyboard.json new file mode 100644 index 0000000000..01847cfa53 --- /dev/null +++ b/keyboards/takashicompany/jourkey/keyboard.json @@ -0,0 +1,51 @@ +{ + "manufacturer": "takashicompany", + "keyboard_name": "Jourkey", + "maintainer": "takashicompany", + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "D1", "pin_b": "D0"} + ] + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "direct": [ + ["D4", "C6", "D7", "E6", "B4", "F5", "F6", "F7", "B5", "B1", "B3", "B2", "B6"] + ] + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0062", + "vid": "0x7463" + }, + "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}, + {"matrix": [0, 5], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [0, 6], "x": 1.5, "y": 1}, + {"matrix": [0, 7], "x": 2.5, "y": 1}, + {"matrix": [0, 8], "x": 3.5, "y": 1, "w": 1.5}, + {"matrix": [0, 9], "x": 0, "y": 2, "w":1.75}, + {"matrix": [0, 10], "x": 1.75, "y": 2}, + {"matrix": [0, 11], "x": 2.75, "y": 2}, + {"matrix": [0, 12], "x": 3.75, "y": 2, "w":1.25} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/takashicompany/jourkey/keymaps/default/keymap.c b/keyboards/takashicompany/jourkey/keymaps/default/keymap.c new file mode 100644 index 0000000000..fa642bc6e2 --- /dev/null +++ b/keyboards/takashicompany/jourkey/keymaps/default/keymap.c @@ -0,0 +1,18 @@ +// 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_ESC, KC_1, KC_2, KC_3, KC_4, + KC_TAB, KC_Q, KC_W, KC_ENT, + KC_LCTL, KC_A, KC_S, KC_RSFT + ) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) } +}; +#endif diff --git a/keyboards/takashicompany/jourkey/keymaps/default/rules.mk b/keyboards/takashicompany/jourkey/keymaps/default/rules.mk new file mode 100644 index 0000000000..a40474b4d5 --- /dev/null +++ b/keyboards/takashicompany/jourkey/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/takashicompany/jourkey/readme.md b/keyboards/takashicompany/jourkey/readme.md new file mode 100644 index 0000000000..b76dd7cbb8 --- /dev/null +++ b/keyboards/takashicompany/jourkey/readme.md @@ -0,0 +1,41 @@ +# Joukey + +![takashicompany/jourkey](https://i.imgur.com/pCrTbKn.jpeg) + +Jourkey was designed as “a keyboard for taking pictures with scenery while traveling. + +The layout is like a smaller version of a traditional keyboard. +Decorate it with your favorite keycaps and case to make it your travel companion. + +Of course, it can also be used as a macro pad. + +--- + +Jourkeyは「旅先で景色と写真を撮るためのキーボード」としてデザインされました。 + +従来のキーボードを小さくしたようなレイアウトです。 +お気に入りのキーキャップやケースでデコレーションして貴方の旅のお供になります。 + +もちろん、マクロパッドとして使用することも可能です。 + +* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany) +* Hardware Supported: Jourkey PCB, Pro Micro +* Hardware Availability: https://github.com/takashicompany/jourkey + +Make example for this keyboard (after setting up your build environment): + + make takashicompany/jourkey:default + +Flashing example for this keyboard: + + make takashicompany/jourkey: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 c8fe565ee6528942cfc71187e32237b39ab7320a Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:26:10 +0100 Subject: [PATCH 041/592] [Keyboard] Add splitkb.com's Halcyon Kyria rev4 (#24512) * Add Halcyon Kyria Rev4 * Remove bootmagic and unused features * Fix encoderindex * Update readme.md * Remove rgblight * Implement requested changes * Add encoder update user * Remove rules.mk and add VIK configuration * Move options to config.h * Update RGB keycodes (qmk#24484) * implement changes --------- Co-authored-by: harvey-splitkb <126267034+harvey-splitkb@users.noreply.github.com> --- keyboards/splitkb/halcyon/kyria/info.json | 68 +++++ .../halcyon/kyria/keymaps/default/keymap.c | 206 +++++++++++++++ .../halcyon/kyria/keymaps/default/readme.md | 242 ++++++++++++++++++ keyboards/splitkb/halcyon/kyria/readme.md | 31 +++ keyboards/splitkb/halcyon/kyria/rev4/config.h | 32 +++ .../splitkb/halcyon/kyria/rev4/halconf.h | 14 + .../splitkb/halcyon/kyria/rev4/keyboard.json | 168 ++++++++++++ .../splitkb/halcyon/kyria/rev4/mcuconf.h | 14 + keyboards/splitkb/halcyon/kyria/rev4/rev4.c | 28 ++ 9 files changed, 803 insertions(+) create mode 100755 keyboards/splitkb/halcyon/kyria/info.json create mode 100755 keyboards/splitkb/halcyon/kyria/keymaps/default/keymap.c create mode 100755 keyboards/splitkb/halcyon/kyria/keymaps/default/readme.md create mode 100755 keyboards/splitkb/halcyon/kyria/readme.md create mode 100755 keyboards/splitkb/halcyon/kyria/rev4/config.h create mode 100644 keyboards/splitkb/halcyon/kyria/rev4/halconf.h create mode 100755 keyboards/splitkb/halcyon/kyria/rev4/keyboard.json create mode 100644 keyboards/splitkb/halcyon/kyria/rev4/mcuconf.h create mode 100644 keyboards/splitkb/halcyon/kyria/rev4/rev4.c diff --git a/keyboards/splitkb/halcyon/kyria/info.json b/keyboards/splitkb/halcyon/kyria/info.json new file mode 100755 index 0000000000..8e49bb12f3 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/info.json @@ -0,0 +1,68 @@ +{ + "manufacturer": "splitkb.com", + "maintainer": "splitkb.com", + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x6_5" + }, + "layouts": { + "LAYOUT_split_3x6_5": { + "layout": [ + {"label": "L06", "matrix": [0, 6], "x": 0, "y": 0.75}, + {"label": "L05", "matrix": [0, 5], "x": 1, "y": 0.75}, + {"label": "L04", "matrix": [0, 4], "x": 2, "y": 0.25}, + {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "L02", "matrix": [0, 2], "x": 4, "y": 0.25}, + {"label": "L01", "matrix": [0, 1], "x": 5, "y": 0.5}, + {"label": "R01", "matrix": [4, 1], "x": 10.5, "y": 0.5}, + {"label": "R02", "matrix": [4, 2], "x": 11.5, "y": 0.25}, + {"label": "R03", "matrix": [4, 3], "x": 12.5, "y": 0}, + {"label": "R04", "matrix": [4, 4], "x": 13.5, "y": 0.25}, + {"label": "R05", "matrix": [4, 5], "x": 14.5, "y": 0.75}, + {"label": "R06", "matrix": [4, 6], "x": 15.5, "y": 0.75}, + {"label": "L12", "matrix": [1, 6], "x": 0, "y": 1.75}, + {"label": "L11", "matrix": [1, 5], "x": 1, "y": 1.75}, + {"label": "L10", "matrix": [1, 4], "x": 2, "y": 1.25}, + {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "L08", "matrix": [1, 2], "x": 4, "y": 1.25}, + {"label": "L07", "matrix": [1, 1], "x": 5, "y": 1.5}, + {"label": "R07", "matrix": [5, 1], "x": 10.5, "y": 1.5}, + {"label": "R08", "matrix": [5, 2], "x": 11.5, "y": 1.25}, + {"label": "R09", "matrix": [5, 3], "x": 12.5, "y": 1}, + {"label": "R10", "matrix": [5, 4], "x": 13.5, "y": 1.25}, + {"label": "R11", "matrix": [5, 5], "x": 14.5, "y": 1.75}, + {"label": "R12", "matrix": [5, 6], "x": 15.5, "y": 1.75}, + {"label": "L20", "matrix": [2, 6], "x": 0, "y": 2.75}, + {"label": "L19", "matrix": [2, 5], "x": 1, "y": 2.75}, + {"label": "L18", "matrix": [2, 4], "x": 2, "y": 2.25}, + {"label": "L17", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "L16", "matrix": [2, 2], "x": 4, "y": 2.25}, + {"label": "L15", "matrix": [2, 1], "x": 5, "y": 2.5}, + {"label": "L14", "matrix": [3, 3], "x": 6, "y": 3}, + {"label": "L13", "matrix": [2, 0], "x": 7, "y": 3.25}, + {"label": "R13", "matrix": [6, 0], "x": 8.5, "y": 3.25}, + {"label": "R14", "matrix": [7, 3], "x": 9.5, "y": 3}, + {"label": "R15", "matrix": [6, 1], "x": 10.5, "y": 2.5}, + {"label": "R16", "matrix": [6, 2], "x": 11.5, "y": 2.25}, + {"label": "R17", "matrix": [6, 3], "x": 12.5, "y": 2}, + {"label": "R18", "matrix": [6, 4], "x": 13.5, "y": 2.25}, + {"label": "R19", "matrix": [6, 5], "x": 14.5, "y": 2.75}, + {"label": "R20", "matrix": [6, 6], "x": 15.5, "y": 2.75}, + {"label": "L25", "matrix": [3, 4], "x": 2.5, "y": 3.25}, + {"label": "L24", "matrix": [3, 2], "x": 3.5, "y": 3.25}, + {"label": "L23", "matrix": [3, 1], "x": 4.5, "y": 3.5}, + {"label": "L22", "matrix": [3, 5], "x": 5.5, "y": 4}, + {"label": "L21", "matrix": [3, 0], "x": 6.5, "y": 4.25}, + {"label": "R21", "matrix": [7, 0], "x": 9, "y": 4.25}, + {"label": "R22", "matrix": [7, 5], "x": 10, "y": 4}, + {"label": "R23", "matrix": [7, 1], "x": 11, "y": 3.5}, + {"label": "R24", "matrix": [7, 2], "x": 12, "y": 3.25}, + {"label": "R25", "matrix": [7, 4], "x": 13, "y": 3.25} + ] + } + } +} diff --git a/keyboards/splitkb/halcyon/kyria/keymaps/default/keymap.c b/keyboards/splitkb/halcyon/kyria/keymaps/default/keymap.c new file mode 100755 index 0000000000..78fd8d4fab --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/keymaps/default/keymap.c @@ -0,0 +1,206 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + _QWERTY = 0, + _DVORAK, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST, +}; + + +// Aliases for readability +#define QWERTY DF(_QWERTY) +#define COLEMAK DF(_COLEMAK_DH) +#define DVORAK DF(_DVORAK) + +#define SYM MO(_SYM) +#define NAV MO(_NAV) +#define FKEYS MO(_FUNCTION) +#define ADJUST MO(_ADJUST) + +#define CTL_ESC MT(MOD_LCTL, KC_ESC) +#define CTL_QUOT MT(MOD_RCTL, KC_QUOTE) +#define CTL_MINS MT(MOD_RCTL, KC_MINUS) +#define ALT_ENT MT(MOD_LALT, KC_ENT) + +// Note: LAlt/Enter (ALT_ENT) is not the same thing as the keyboard shortcut Alt+Enter. +// The notation `mod/tap` denotes a key that activates the modifier `mod` when held down, and +// produces the key `tap` when tapped (i.e. pressed and released). + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * Base Layer: QWERTY + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_QWERTY] = LAYOUT( + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC, + CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Base Layer: Dvorak + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | ' " | , < | . > | P | Y | | F | G | C | R | L | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | O | E | U | I | | D | H | T | N | S |Ctrl/- _| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | ; : | Q | J | K | X | [ { |CapsLk| |F-keys| ] } | B | M | W | V | Z | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_DVORAK] = LAYOUT( + KC_TAB ,KC_QUOTE,KC_COMM, KC_DOT, KC_P , KC_Y , KC_F, KC_G , KC_C , KC_R , KC_L , KC_BSPC, + CTL_ESC , KC_A , KC_O , KC_E , KC_U , KC_I , KC_D, KC_H , KC_T , KC_N , KC_S , CTL_MINS, + KC_LSFT ,KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_B, KC_M , KC_W , KC_V , KC_Z , KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Base Layer: Colemak DH + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Tab | Q | W | F | P | B | | J | L | U | Y | ; : | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | R | S | T | G | | M | N | E | I | O |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | [ { |CapsLk| |F-keys| ] } | K | H | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_COLEMAK_DH] = LAYOUT( + KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC, + CTL_ESC , KC_A , KC_R , KC_S , KC_T , KC_G , KC_M, KC_N , KC_E , KC_I , KC_O , CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_D , KC_V , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_K, KC_H ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Nav Layer: Media, navigation + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_NAV] = LAYOUT( + _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL, + _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS, + _______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Sym Layer: Numbers and symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SYM] = LAYOUT( + KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL , + KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, + KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, KC_LCBR, _______, _______, KC_RCBR, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Function Layer: Function keys + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | F9 | F10 | F11 | F12 | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_FUNCTION] = LAYOUT( + _______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______, + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Adjust Layer: Default layer settings, RGB + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | |QWERTY| | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_ADJUST] = LAYOUT( + _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, DVORAK , _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______, + _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______, + _______, _______, _______,_______, _______, _______, _______, _______, _______, _______ + ), + +// /* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +// +}; \ No newline at end of file diff --git a/keyboards/splitkb/halcyon/kyria/keymaps/default/readme.md b/keyboards/splitkb/halcyon/kyria/keymaps/default/readme.md new file mode 100755 index 0000000000..e56bbbb773 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/keymaps/default/readme.md @@ -0,0 +1,242 @@ +# Halcyon Kyria's Default Keymap + +![KLE render of the default Halcyon Kyria keymap with QWERTY as the base layer. Layers are shown in sublegends.](https://i.ibb.co/RQZx2dY/default-kyria2.jpg) + + +The default keymap contains 5 layers which allows it to include all keys found on an ANSI layout TKL keyboard plus media keys. + +The five different layers are the following: +1. Base layer (QWERTY, Colemak-DH or Dvorak) +2. Navigation layer +3. Symbols/Numbers layer +4. Function layer +5. Adjust layer + +## Base layer(s) +``` +Base Layer: - + +,-------------------------------------------. ,-------------------------------------------. +| Tab | - | - | - | - | - | | - | - | - | - | - | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| - | - | - | - | - | | - | - | - | - | - |Ctrl/ - | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | - | - | - | - | - | [ { |CapsLk| |F-Keys| ] } | - | - | - | - | - | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` +Three different well-known keyboard layouts are provided to fill in the placeholder `-` keys: QWERTY, Colemak-DH, and Dvorak. The default layer can be changed at runtime, more info on that in the section on the [adjust layer](#adjust-layer). + +For the rest of this write-up, the base layer will be assumed to be QWERTY and will be used as a reference to describe physical keys, e.g. “B key” vs, the much more verbose, “lower inner index key”. + +``` +Base Layer: QWERTY + +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Aside from variations in the alpha cluster, the rest of the base keys remain the same and are designed to feel familiar. + +![Step-by-step animation of the transformation of an ortholinear TKL to a Kyria](https://i.imgur.com/uVDCOek.gif) + +
+After making transformations to the classic ANSI US QWERTY TKL 60% to arrive to the layout of the Kyria, as illustrated in the animation above, the result looks like this: + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Cap Lk | A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | | | | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | LCtrl| LGUI | LAlt | Space| | | | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +First thing to notice is the presence of blank keys. To fill in the blank keys above the Space keys, we can take inspiration from other split keyboards featuring an extra inner index column on each half. A common mapping for those kind of keys are the bracket keys that got removed in the fourth step of the animated transformation. The thumb keys besides Spaces is prime real estate for dedicated layer-switching keys. It doesn't matter on which side is assigned the sym-layer-switch key but it helps to keep the nav-layer-switch on the left in order to keep the arrow keys on the right side like on a classic keyboard, so we'll put nav on the left and sym on the right. We'll address the remaining blank thumb keys later. + +The base layer is starting to form but there remains some flaws. One glaring issue is the position of Control. Control is a very commonly used function but the key on which it sits right now is way too tucked in under the hand to be able to press it comfortably with either the thumb or the pinky from resting position. In fact, installing a rotary encoder there is a common move among Kyria users and I guarantee you that activating Control by holding down a rotary encoder does not spark joy. Instead, let's employ a popular trick that involves remapping the current Caps Lock key, which is positioned at a comfortable position on the keyboard, to Control. + +We can go further though; a variant of this trick makes the Control key produce Escape when tapped. This is called a “modtap”. There is no use to tapping Control by itself without chording it with another key and there is no use to holding down the Esc key so why not combine the two into a single key? + +All of this leaves us with three blank keys. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { | | | | ] } | N | M | , < | . > | / ? | RShift | +`--------+-------------+--------------------+------+------| |------+------+--------------------+------+---------------' + | | LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +These keys are not easily reachable while touch typing (that is, not reachable without picking up your hand) and should thus be associated with functions that you are not likely to be typed within a stream of text. The idea is that if you have to pick up your hand to hit a key, you want it to be at a time when you are likely to be pausing your interaction with the machine, rather than in the midst of a flurry of typing. They're thus well suited for accessing the adjust layer and the function layer. We can also toss in Caps Lock even though it is an editing-type function that gets used within a stream of text because shouting in ALL-CAPS should be a deliberate action. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +The next glaring issue is the absence of an Enter key on the current base layer this far. Enter is a very frequently used key so it deserves to be placed at a good spot in the keymap. The best way to insert it in the keymap with minimal changes to the current layout is to use modtaps. A tempting solution is to turn the RShift key into a RShift/Enter modtap but that can result in chat messages sent too frustratingly early when you're not used to it. Using GUI is also sub-optimal because tapping the GUI modifier actually has a use as opposed to taps of the Control or the Shift key. Pressing and releasing the GUI key by itself opens the App menu in many desktop environments. The natural choice is thus LAlt/Enter. That way, Enter is 1u away from resting thumb position and is unlikely to get accidentally activated because Alt is very rarely used in the midst of prose. + +Finally, we're one Quality-Of-Life update away from the actual base layer. Ctrl/' " not only preserves symmetry in the keymap with Ctrl/Esc but also helps balance the load between your pinkies and invites you to use both hands instead of contortions. Perhaps more importantly, it also frees you from the necessity of picking up your hand, breaking touch typing position and pressing a pinky key with your ring finger in order to execute Ctrl+A or Ctrl+Z. That becomes even more important on a board with such an aggressive pinky columnar stagger like the Kyria. + + +``` +,-------------------------------------------. ,-------------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +
+ +## Navigation layer + +``` +Nav Layer: Media, navigation + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +This is where you'll find all the keys that are generally between the main block of a classic keyboard and the numpad in addition to media controls and modifiers on easy access on the home row for fast and comfortable chording with navigation keys. + +Useful mnemonics: +- “GACS” to remember the order of the modifiers on the left-hand home row +- Scroll Lock is on the same key as Caps Lock because they're both locks +- Delete is on the same key as Backspace because they both erase characters +- Home is the leftmost position on the current line so it is above ←. Same logic applies for End. +- Media Previous = ⏮, Media Next = ⏭ +- Page Up, Page Down and Volume Up, Volume Down are positioned like the main Up and Down keys. + +## Sym layer +``` +Sym Layer: Numbers, symbols + +,-------------------------------------------. ,-------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +The top row is the unshifted num row, the home row of the layer is the shifted num row and the bottom row contains the hyphen `-` and the underscore `_` on the best lower row spot because of how frequent they are as well as redundant symbols that are already present on the base layer but are reproduced here to avoid juggling back and forth between base, shift, and sym when typing a string of symbols. + +The layout of the first two rows needs no introduction, you're already used to them but it's worth looking into the structure of the bottom row. + +The two halves are mirrored in a sense. On the right, you can find , . / at their usual spots with the addition of Shift+/=? to the right of the / key to remove the need to press simultaneously Sym and a Shift key to access `?`. + +Now, if you look at the left side, you'll notice that the mirror of , is ;, the mirror of . is : and the mirror of / is \\. The same logic used for Shift+/=? also applies to Shift+\\=|. + +In case you wish to combine Shift with a symbol key anyways, you can hold down Shift on the base layer with your pinky, activate Sym with your right thumb and while still holding down the Shift key, tap your desired symbol key. Same thing if you need Ctrl+Digit. + +## Function layer +``` +Function Layer: Function keys + +,-------------------------------------------. ,-------------------------------------------. +| | F9 | F10 | F11 | F12 | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | F1 | F2 | F3 | F4 | | | | | | | | | | | | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +In a similar fashion to the nav layer, pressing down `FKEYS` with the right thumb enables a numpad of function keys on the opposite hand and modifiers on the right-hand home row. Once again, mirror symmetry is leveraged in this keymap for the order of the right-hand modifiers. + +The Alt modifier, despite being situated on the right half of the keyboard is *not* `KC_RALT`, it is `KC_LALT`. `KC_RALT` is actually the AltGr key which generally acts very differently to the left Alt key. Keyboard shortcuts involving AltGr+F# are rare and infrequent as opposed to the much more common Alt+F# shortcuts. Consequently, `KC_LALT` was chosen for the function layer. + +Since there are more than 10 function keys, the cluster of F-keys does not follow the usual 3×3+1 numpad arrangement. + + +## Adjust layer +``` +Adjust Layer: Default layer settings, RGB + +,-------------------------------------------. ,-------------------------------------------. +| | | |QWERTY| | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Default layer settings on the left and various RGB underglow controls on the right. + +The default layer settings are lined up on the middle finger column because the home middle finger key is D on QWERTY (like the “D” in “Dvorak”) and the lower middle finger key is C on QWERTY (like the “C” in “Colemak”). I can hear you say that “QWERTY” doesn't start with “E” but Dvorak and Colemak were already aligned in a column so the QWERTY may as well join the formation. + +NOTE: The default layer settings set by those keys are *NOT* stored in EEPROM and thus do not persist through boots. If you wish to change the default layer in a non-volatile manner, either change the order of the layers in the firmware, for example like so if you want to set Dvorak as the new default: +```c +enum layers { + _DVORAK = 0, + _QWERTY, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST +}; +``` +or re-define the `QWERTY`, `COLEMAK` and `DVORAK` keys to point to custom keycodes starting on `SAFE_RANGE` and calling the `set_single_persistent_default_layer` function inside of `process_record_user`. + +## Hardware Features + +### Rotary Encoder +The left rotary encoder is programmed to control the volume whereas the right encoder sends PgUp or PgDn on every turn. + +## Going further… + +This default keymap can be used as is, unchanged, as a daily driver for your Kyria but you're invited to treat your keymap like a bonsai. At the beginning, it's just like the default keymap but from time to time, you can tweak it a little. Cut a little key here, let another combo grow there. Slowly but surely it will be a unique keymap that will fit you like a glove. + +Check out the #keymap-ideas channel on the official SplitKB Discord server for inspiration. diff --git a/keyboards/splitkb/halcyon/kyria/readme.md b/keyboards/splitkb/halcyon/kyria/readme.md new file mode 100755 index 0000000000..62689d35b0 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/readme.md @@ -0,0 +1,31 @@ +# Halcyon Kyria + +![splitkb/halcyon/kyria](https://i.imgur.com/n7WuUs9.jpg) + +The Halcyon Kyria rev4 is the fourth Kyria revision and the first keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights: + +- Halcyon keyboards come preassembled! You won't need a soldering iron. +- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules. +- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases. +- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C. +- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO! +- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing. + +* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com) +* Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/halcyon/kyria/rev4:default + +The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive. + +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: + +* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port. +* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. diff --git a/keyboards/splitkb/halcyon/kyria/rev4/config.h b/keyboards/splitkb/halcyon/kyria/rev4/config.h new file mode 100755 index 0000000000..c09744f923 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/rev4/config.h @@ -0,0 +1,32 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP28 // USART TX pin +#define SERIAL_USART_RX_PIN GP29 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + +// VBUS detection +#define USB_VBUS_PIN GP1 + +//// VIK + +// GPIO1 = GP27 +// GPIO2 = GP26 +// CS = GP13 + +#define I2C_DRIVER I2C0 +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP14 +#define SPI_MOSI_PIN GP15 +#define SPI_MISO_PIN GP12 \ No newline at end of file diff --git a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h new file mode 100644 index 0000000000..1050ebf313 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h @@ -0,0 +1,14 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//// VIK + +#define HAL_USE_I2C TRUE + +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + +#include_next \ No newline at end of file diff --git a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json new file mode 100755 index 0000000000..c9e891964b --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json @@ -0,0 +1,168 @@ +{ + "keyboard_name": "Halcyon Kyria rev4", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP23", "pin_b": "GP22", "resolution": 2} + ] + }, + "features": { + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP19", "GP20", "GP25", "GP4", "GP9", "GP10", "GP5"], + "rows": ["GP8", "GP11", "GP7", "GP6"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "solid_color": 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, + "typing_heatmap": true + }, + "default": { + "animation": "cycle_left_right" + }, + "driver": "ws2812", + "layout": [ + {"x": 75, "y": 2, "flags": 2}, + {"x": 50, "y": 1, "flags": 2}, + {"x": 14, "y": 4, "flags": 2}, + {"x": 25, "y": 45, "flags": 2}, + {"x": 58, "y": 49, "flags": 2}, + {"x": 94, "y": 53, "flags": 2}, + {"matrix": [3, 0], "x": 94, "y": 64, "flags": 4}, + {"matrix": [3, 5], "x": 79, "y": 60, "flags": 4}, + {"matrix": [3, 1], "x": 65, "y": 53, "flags": 4}, + {"matrix": [3, 2], "x": 51, "y": 49, "flags": 4}, + {"matrix": [3, 4], "x": 36, "y": 49, "flags": 4}, + {"matrix": [2, 0], "x": 101, "y": 49, "flags": 4}, + {"matrix": [3, 3], "x": 87, "y": 45, "flags": 4}, + {"matrix": [2, 1], "x": 72, "y": 38, "flags": 4}, + {"matrix": [2, 2], "x": 58, "y": 34, "flags": 4}, + {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4}, + {"matrix": [2, 4], "x": 29, "y": 34, "flags": 4}, + {"matrix": [2, 5], "x": 14, "y": 41, "flags": 4}, + {"matrix": [2, 6], "x": 0, "y": 41, "flags": 4}, + {"matrix": [1, 1], "x": 72, "y": 23, "flags": 4}, + {"matrix": [1, 2], "x": 58, "y": 19, "flags": 4}, + {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 29, "y": 19, "flags": 4}, + {"matrix": [1, 5], "x": 14, "y": 26, "flags": 4}, + {"matrix": [1, 6], "x": 0, "y": 26, "flags": 4}, + {"matrix": [0, 1], "x": 72, "y": 8, "flags": 4}, + {"matrix": [0, 2], "x": 58, "y": 4, "flags": 4}, + {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 29, "y": 4, "flags": 4}, + {"matrix": [0, 5], "x": 14, "y": 11, "flags": 4}, + {"matrix": [0, 6], "x": 0, "y": 11, "flags": 4}, + {"x": 149, "y": 2, "flags": 2}, + {"x": 174, "y": 1, "flags": 2}, + {"x": 210, "y": 4, "flags": 2}, + {"x": 199, "y": 45, "flags": 2}, + {"x": 166, "y": 49, "flags": 2}, + {"x": 130, "y": 53, "flags": 2}, + {"matrix": [7, 0], "x": 130, "y": 64, "flags": 4}, + {"matrix": [7, 5], "x": 145, "y": 60, "flags": 4}, + {"matrix": [7, 1], "x": 159, "y": 53, "flags": 4}, + {"matrix": [7, 2], "x": 173, "y": 49, "flags": 4}, + {"matrix": [7, 4], "x": 188, "y": 49, "flags": 4}, + {"matrix": [6, 0], "x": 123, "y": 49, "flags": 4}, + {"matrix": [7, 3], "x": 137, "y": 45, "flags": 4}, + {"matrix": [6, 1], "x": 152, "y": 38, "flags": 4}, + {"matrix": [6, 2], "x": 166, "y": 34, "flags": 4}, + {"matrix": [6, 3], "x": 181, "y": 30, "flags": 4}, + {"matrix": [6, 4], "x": 195, "y": 34, "flags": 4}, + {"matrix": [6, 5], "x": 210, "y": 41, "flags": 4}, + {"matrix": [6, 6], "x": 224, "y": 41, "flags": 4}, + {"matrix": [5, 1], "x": 152, "y": 23, "flags": 4}, + {"matrix": [5, 2], "x": 166, "y": 19, "flags": 4}, + {"matrix": [5, 3], "x": 181, "y": 15, "flags": 4}, + {"matrix": [5, 4], "x": 195, "y": 19, "flags": 4}, + {"matrix": [5, 5], "x": 210, "y": 26, "flags": 4}, + {"matrix": [5, 6], "x": 224, "y": 26, "flags": 4}, + {"matrix": [4, 1], "x": 152, "y": 8, "flags": 4}, + {"matrix": [4, 2], "x": 166, "y": 4, "flags": 4}, + {"matrix": [4, 3], "x": 181, "y": 0, "flags": 4}, + {"matrix": [4, 4], "x": 195, "y": 4, "flags": 4}, + {"matrix": [4, 5], "x": 210, "y": 11, "flags": 4}, + {"matrix": [4, 6], "x": 224, "y": 11, "flags": 4} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [31, 31] + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP24" + }, + "matrix_pins": { + "right": { + "cols": ["GP5", "GP10", "GP9", "GP4", "GP25", "GP20", "GP19"], + "rows": ["GP8", "GP11", "GP7", "GP6"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "pid": "0x7FCE" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP3" + } +} diff --git a/keyboards/splitkb/halcyon/kyria/rev4/mcuconf.h b/keyboards/splitkb/halcyon/kyria/rev4/mcuconf.h new file mode 100644 index 0000000000..6792b923f1 --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/rev4/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +//// VIK + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE \ No newline at end of file diff --git a/keyboards/splitkb/halcyon/kyria/rev4/rev4.c b/keyboards/splitkb/halcyon/kyria/rev4/rev4.c new file mode 100644 index 0000000000..27671b9d7c --- /dev/null +++ b/keyboards/splitkb/halcyon/kyria/rev4/rev4.c @@ -0,0 +1,28 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + if (index == 0) { + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} +#endif From 191172aa4e03081ec36cc918a6ac7ffe289162d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=E1=BA=AFn?= <59417802+MaiTheSan@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:35:24 -0800 Subject: [PATCH 042/592] [Keyboard] Add NCR80 ALPS SKFL/FR (#24625) * ADD NCR80 ALPS SKFL/FR * fix * Update config.h * Update config.h * Update keyboards/salane/ncr80alpsskfl/keyboard.json Co-authored-by: Duncan Sutherland * Update keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c Co-authored-by: Duncan Sutherland * Update keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c Co-authored-by: Duncan Sutherland * Update keyboards/salane/ncr80alpsskfl/keyboard.json Co-authored-by: jack * Update keyboards/salane/ncr80alpsskfl/readme.md Co-authored-by: jack --------- Co-authored-by: Duncan Sutherland Co-authored-by: jack --- keyboards/salane/ncr80alpsskfl/config.h | 17 +++ keyboards/salane/ncr80alpsskfl/keyboard.json | 124 ++++++++++++++++++ .../ncr80alpsskfl/keymaps/default/keymap.c | 28 ++++ keyboards/salane/ncr80alpsskfl/readme.md | 29 ++++ 4 files changed, 198 insertions(+) create mode 100644 keyboards/salane/ncr80alpsskfl/config.h create mode 100644 keyboards/salane/ncr80alpsskfl/keyboard.json create mode 100644 keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c create mode 100644 keyboards/salane/ncr80alpsskfl/readme.md diff --git a/keyboards/salane/ncr80alpsskfl/config.h b/keyboards/salane/ncr80alpsskfl/config.h new file mode 100644 index 0000000000..cc6fb298f4 --- /dev/null +++ b/keyboards/salane/ncr80alpsskfl/config.h @@ -0,0 +1,17 @@ +/* +Copyright 2024 Salane +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 RP2040_FLASH_GENERIC_03H diff --git a/keyboards/salane/ncr80alpsskfl/keyboard.json b/keyboards/salane/ncr80alpsskfl/keyboard.json new file mode 100644 index 0000000000..512593d351 --- /dev/null +++ b/keyboards/salane/ncr80alpsskfl/keyboard.json @@ -0,0 +1,124 @@ +{ + "keyboard_name": "NCR80 ALPS SKFL", + "manufacturer": "Salane", + "url": "", + "maintainer": "Mai The San", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0x534C", + "pid": "0x087A", + "device_version": "0.0.1" + }, + "matrix_pins": { + "rows": ["GP24", "GP9", "GP10", "GP13", "GP12", "GP11"], + "cols": ["GP16", "GP17", "GP18", "GP19", "GP20", "GP21", "GP22", "GP23", "GP25", "GP26", "GP27", "GP28", "GP29", "GP6", "GP5", "GP4", "GP3"] + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true + }, + "indicators": { + "num_lock": "GP0", + "caps_lock": "GP1", + "scroll_lock": "GP2" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "K01", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "K02", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "K03", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "K04", "matrix": [0, 4], "x": 5, "y": 0}, + {"label": "K05", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "K06", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "K07", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "K08", "matrix": [0, 8], "x": 9.5, "y": 0}, + {"label": "K09", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "K0A", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "K0B", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "K0C", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "K10", "matrix": [1, 0], "x": 0, "y": 2}, + {"label": "K11", "matrix": [1, 1], "x": 1, "y": 2}, + {"label": "K12", "matrix": [1, 2], "x": 2, "y": 2}, + {"label": "K13", "matrix": [1, 3], "x": 3, "y": 2}, + {"label": "K14", "matrix": [1, 4], "x": 4, "y": 2}, + {"label": "K15", "matrix": [1, 5], "x": 5, "y": 2}, + {"label": "K16", "matrix": [1, 6], "x": 6, "y": 2}, + {"label": "K17", "matrix": [1, 7], "x": 7, "y": 2}, + {"label": "K18", "matrix": [1, 8], "x": 8, "y": 2}, + {"label": "K19", "matrix": [1, 9], "x": 9, "y": 2}, + {"label": "K1A", "matrix": [1, 10], "x": 10, "y": 2}, + {"label": "K1B", "matrix": [1, 11], "x": 11, "y": 2}, + {"label": "K1C", "matrix": [1, 12], "x": 12, "y": 2}, + {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2}, + {"label": "K1D", "matrix": [1, 13], "x": 14, "y": 2}, + {"label": "K1E", "matrix": [1, 14], "x": 15.25, "y": 2}, + {"label": "K1F", "matrix": [1, 15], "x": 16.25, "y": 2}, + {"label": "K1G", "matrix": [1, 16], "x": 17.25, "y": 2}, + + {"label": "K20", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.5}, + {"label": "K21", "matrix": [2, 1], "x": 1.5, "y": 3}, + {"label": "K22", "matrix": [2, 2], "x": 2.5, "y": 3}, + {"label": "K23", "matrix": [2, 3], "x": 3.5, "y": 3}, + {"label": "K24", "matrix": [2, 4], "x": 4.5, "y": 3}, + {"label": "K25", "matrix": [2, 5], "x": 5.5, "y": 3}, + {"label": "K26", "matrix": [2, 6], "x": 6.5, "y": 3}, + {"label": "K27", "matrix": [2, 7], "x": 7.5, "y": 3}, + {"label": "K28", "matrix": [2, 8], "x": 8.5, "y": 3}, + {"label": "K29", "matrix": [2, 9], "x": 9.5, "y": 3}, + {"label": "K2A", "matrix": [2, 10], "x": 10.5, "y": 3}, + {"label": "K2B", "matrix": [2, 11], "x": 11.5, "y": 3}, + {"label": "K2C", "matrix": [2, 12], "x": 12.5, "y": 3}, + {"label": "K2D", "matrix": [2, 13], "x": 13.5, "y": 3, "w": 1.5}, + {"label": "K2E", "matrix": [2, 14], "x": 15.25, "y": 3}, + {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 3}, + {"label": "K2G", "matrix": [2, 16], "x": 17.25, "y": 3}, + + {"label": "K30", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.75}, + {"label": "K31", "matrix": [3, 1], "x": 1.75, "y": 4}, + {"label": "K32", "matrix": [3, 2], "x": 2.75, "y": 4}, + {"label": "K33", "matrix": [3, 3], "x": 3.75, "y": 4}, + {"label": "K34", "matrix": [3, 4], "x": 4.75, "y": 4}, + {"label": "K35", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "K36", "matrix": [3, 6], "x": 6.75, "y": 4}, + {"label": "K37", "matrix": [3, 7], "x": 7.75, "y": 4}, + {"label": "K38", "matrix": [3, 8], "x": 8.75, "y": 4}, + {"label": "K39", "matrix": [3, 9], "x": 9.75, "y": 4}, + {"label": "K3A", "matrix": [3, 10], "x": 10.75, "y": 4}, + {"label": "K3B", "matrix": [3, 11], "x": 11.75, "y": 4}, + {"label": "K3D", "matrix": [3, 13], "x": 12.75, "y": 4, "w": 2.25}, + + {"label": "K40", "matrix": [4, 0], "x": 0, "y": 5, "w": 2.25}, + {"label": "K42", "matrix": [4, 2], "x": 2.25, "y": 5}, + {"label": "K43", "matrix": [4, 3], "x": 3.25, "y": 5}, + {"label": "K44", "matrix": [4, 4], "x": 4.25, "y": 5}, + {"label": "K45", "matrix": [4, 5], "x": 5.25, "y": 5}, + {"label": "K46", "matrix": [4, 6], "x": 6.25, "y": 5}, + {"label": "K47", "matrix": [4, 7], "x": 7.25, "y": 5}, + {"label": "K48", "matrix": [4, 8], "x": 8.25, "y": 5}, + {"label": "K49", "matrix": [4, 9], "x": 9.25, "y": 5}, + {"label": "K4A", "matrix": [4, 10], "x": 10.25, "y": 5}, + {"label": "K4B", "matrix": [4, 11], "x": 11.25, "y": 5}, + {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 5, "w": 1.75}, + {"label": "K4D", "matrix": [4, 13], "x": 14, "y": 5}, + {"label": "K4F", "matrix": [4, 15], "x": 16.25, "y": 5}, + + {"label": "K50", "matrix": [5, 0], "x": 0, "y": 6, "w": 1.5}, + {"label": "K51", "matrix": [5, 1], "x": 1.5, "y": 6}, + {"label": "K52", "matrix": [5, 2], "x": 2.5, "y": 6, "w": 1.5}, + {"label": "K57", "matrix": [5, 7], "x": 4, "y": 6, "w": 7}, + {"label": "K5B", "matrix": [5, 11], "x": 11, "y": 6, "w": 1.5}, + {"label": "K5C", "matrix": [5, 12], "x": 12.5, "y": 6}, + {"label": "K5D", "matrix": [5, 13], "x": 13.5, "y": 6, "w": 1.5}, + {"label": "K5E", "matrix": [5, 14], "x": 15.25, "y": 6}, + {"label": "K5F", "matrix": [5, 15], "x": 16.25, "y": 6}, + {"label": "K5G", "matrix": [5, 16], "x": 17.25, "y": 6} + ] + } + } +} diff --git a/keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c b/keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c new file mode 100644 index 0000000000..e0db926341 --- /dev/null +++ b/keyboards/salane/ncr80alpsskfl/keymaps/default/keymap.c @@ -0,0 +1,28 @@ +/* Copyright 2023 SawnsProjects + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( + 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_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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_LSFT, KC_SLSH, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/salane/ncr80alpsskfl/readme.md b/keyboards/salane/ncr80alpsskfl/readme.md new file mode 100644 index 0000000000..a8e0c0725a --- /dev/null +++ b/keyboards/salane/ncr80alpsskfl/readme.md @@ -0,0 +1,29 @@ +# NCR80 ALPS SKFL + +![NCR80 ALPS SKFL](https://i.imgur.com/X964J2P.jpeg) + + PCB Replace for NCR80 with ALPS SKFL switch. + + **Firmware files are SPECIFIC to each board. Firmware files from one, will not work on the other.** Please use the `.hex` or `.bin` appropriate for your board. + +* Keyboard Maintainer: [Mai The San](https://github.com/MaiTheSan) +* Hardware Supported: NCR80 +* Hardware Availability: [Github](https://github.com/MaiTheSan/NCR80-ALPS-SKFL) + +Make examples for this keyboard (after setting up your build environment): + + make salane/ncr80alpsskfl:default + +Flashing example for this keyboard: + + make salane/ncr80alpsskfl:default:flash + +## 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**: short 2 pin in the back of pcb and plug the usb in +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available + +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). \ No newline at end of file From c5eeac9686b9ff163c91546adc569eb6d433359b Mon Sep 17 00:00:00 2001 From: gtips <51393966+gtips@users.noreply.github.com> Date: Tue, 3 Dec 2024 16:46:37 +0900 Subject: [PATCH 043/592] [Keyboard] Add keyboard reviung46 (#24245) * add keyboard reviung46 * modified keyboards/reviung/reviung46/readme.md * modified keyboards/reviung/reviung46/keyboard.json * modified keyboards/reviung/reviung46/readme.md * fix keyboards/reviung/reviung46/keyboard.json * fix keyboards/reviung/reviung46/keymaps/default/keymap.c fix keyboards/reviung/reviung46/keymaps/via/keymap.c * fix keyboards/reviung/reviung46/keymaps/via/keymap.c * fix keyboards/reviung/reviung46/keyboard.json * fix keyboards/reviung/reviung46/keyboard.json * modified reviung/reviung46/readme.md * fixed keyboards/reviung/reviung46/keyboard.json * fixed keyboards/reviung/reviung46/keymaps/default/keymap.c deleted keyboards/reviung/reviung46/keymaps/via/keymap.c deleted keyboards/reviung/reviung46/keymaps/via/rules.mk * fix keyboards/reviung/reviung46/keyboard.json and keyboards/reviung/reviung46/keymaps/default/keymap.c * Update keyboards/reviung/reviung46/readme.md --------- Co-authored-by: jack --- keyboards/reviung/reviung46/keyboard.json | 463 ++++++++++++++++++ .../reviung46/keymaps/default/keymap.c | 47 ++ keyboards/reviung/reviung46/readme.md | 27 + 3 files changed, 537 insertions(+) create mode 100644 keyboards/reviung/reviung46/keyboard.json create mode 100644 keyboards/reviung/reviung46/keymaps/default/keymap.c create mode 100644 keyboards/reviung/reviung46/readme.md diff --git a/keyboards/reviung/reviung46/keyboard.json b/keyboards/reviung/reviung46/keyboard.json new file mode 100644 index 0000000000..cdf9a24e17 --- /dev/null +++ b/keyboards/reviung/reviung46/keyboard.json @@ -0,0 +1,463 @@ +{ + "keyboard_name": "reviung46", + "manufacturer": "gtips", + "url": "https://github.com/gtips/reviung/tree/master/reviung46/", + "maintainer": "gtips", + "usb": { + "vid": "0x4E95", + "pid": "0x4E19", + "device_version": "0.0.1" + }, + "rgblight": { + "hue_steps": 16, + "saturation_steps": 16, + "brightness_steps": 16, + "led_count": 10, + "sleep": true, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "knight": true, + "christmas": true, + "static_gradient": true, + "alternating": true, + "twinkle": true + } + }, + "ws2812": { + "pin": "D3" + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "matrix_pins": { + "cols": ["B5", "C6", "D4", "D0", "D1", "D2"], + "rows": ["B6", "B2", "B3", "B1", "F7", "F6", "F5", "F4"] + }, + "diode_direction": "COL2ROW", + "development_board": "promicro", + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 4], "x": 12.75, "y": 1}, + {"matrix": [5, 5], "x": 13.75, "y": 1, "w": 1.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 4], "x": 12.25, "y": 2}, + {"matrix": [6, 5], "x": 13.25, "y": 2, "w": 1.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 6, "y": 3, "w": 2.25}, + {"matrix": [7, 0], "x": 8.25, "y": 3, "w": 2.75}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_225u_enter": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 5], "x": 12.75, "y": 1, "w": 2.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 4], "x": 12.25, "y": 2}, + {"matrix": [6, 5], "x": 13.25, "y": 2, "w": 1.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 6, "y": 3, "w": 2.25}, + {"matrix": [7, 0], "x": 8.25, "y": 3, "w": 2.75}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_275u_r_shift": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 4], "x": 12.75, "y": 1}, + {"matrix": [5, 5], "x": 13.75, "y": 1, "w": 1.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 5], "x": 12.25, "y": 2, "w": 2.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 6, "y": 3, "w": 2.25}, + {"matrix": [7, 0], "x": 8.25, "y": 3, "w": 2.75}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_625u_space": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 4], "x": 12.75, "y": 1}, + {"matrix": [5, 5], "x": 13.75, "y": 1, "w": 1.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 4], "x": 12.25, "y": 2}, + {"matrix": [6, 5], "x": 13.25, "y": 2, "w": 1.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 4.75, "y": 3, "w": 6.25}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_225u_enter_275u_r_shift": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 5], "x": 12.75, "y": 1, "w": 2.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 5], "x": 12.25, "y": 2, "w": 2.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 6, "y": 3, "w": 2.25}, + {"matrix": [7, 0], "x": 8.25, "y": 3, "w": 2.75}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_225u_enter_625u_space": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 5], "x": 12.75, "y": 1, "w": 2.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 4], "x": 12.25, "y": 2}, + {"matrix": [6, 5], "x": 13.25, "y": 2, "w": 1.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 4.75, "y": 3, "w": 6.25}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_275u_r_shift_625u_space": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 4], "x": 12.75, "y": 1}, + {"matrix": [5, 5], "x": 13.75, "y": 1, "w": 1.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 5], "x": 12.25, "y": 2, "w": 2.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 4.75, "y": 3, "w": 6.25}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + }, + "LAYOUT_225u_enter_275u_r_shift_625u_space": { + "layout": [ + {"matrix": [0, 0], "x": 2, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [0, 3], "x": 5.5, "y": 0}, + {"matrix": [0, 4], "x": 6.5, "y": 0}, + {"matrix": [0, 5], "x": 7.5, "y": 0}, + {"matrix": [4, 0], "x": 8.5, "y": 0}, + {"matrix": [4, 1], "x": 9.5, "y": 0}, + {"matrix": [4, 2], "x": 10.5, "y": 0}, + {"matrix": [4, 3], "x": 11.5, "y": 0}, + {"matrix": [4, 4], "x": 12.5, "y": 0}, + {"matrix": [4, 5], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 2, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 3.75, "y": 1}, + {"matrix": [1, 2], "x": 4.75, "y": 1}, + {"matrix": [1, 3], "x": 5.75, "y": 1}, + {"matrix": [1, 4], "x": 6.75, "y": 1}, + {"matrix": [1, 5], "x": 7.75, "y": 1}, + {"matrix": [5, 0], "x": 8.75, "y": 1}, + {"matrix": [5, 1], "x": 9.75, "y": 1}, + {"matrix": [5, 2], "x": 10.75, "y": 1}, + {"matrix": [5, 3], "x": 11.75, "y": 1}, + {"matrix": [5, 5], "x": 12.75, "y": 1, "w": 2.25}, + + {"matrix": [2, 0], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2, "w": 2}, + {"matrix": [2, 2], "x": 4.25, "y": 2}, + {"matrix": [2, 3], "x": 5.25, "y": 2}, + {"matrix": [2, 4], "x": 6.25, "y": 2}, + {"matrix": [2, 5], "x": 7.25, "y": 2}, + {"matrix": [6, 0], "x": 8.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [6, 2], "x": 10.25, "y": 2}, + {"matrix": [6, 3], "x": 11.25, "y": 2}, + {"matrix": [6, 5], "x": 12.25, "y": 2, "w": 2.75}, + + {"matrix": [3, 0], "x": 0, "y": 3.25}, + {"matrix": [3, 1], "x": 1, "y": 3.25}, + {"matrix": [3, 2], "x": 2, "y": 3.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.5}, + {"matrix": [3, 5], "x": 4.75, "y": 3, "w": 6.25}, + {"matrix": [7, 1], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [7, 2], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [7, 3], "x": 13.5, "y": 3, "w": 1.5} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/reviung/reviung46/keymaps/default/keymap.c b/keyboards/reviung/reviung46/keymaps/default/keymap.c new file mode 100644 index 0000000000..60f1d32a70 --- /dev/null +++ b/keyboards/reviung/reviung46/keymaps/default/keymap.c @@ -0,0 +1,47 @@ +// Copyright 2024 gtips (@gtips) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE, + _LOWER, + _RAISE, + _ADJUST, +}; + +#define SF_SS RSFT_T(KC_SLSH) +#define SP_LO LT(_LOWER, KC_SPC) +#define SP_RA LT(_RAISE, KC_SPC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SF_SS, + KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LALT, SP_LO, SP_RA, KC_LALT, KC_RGUI, KC_RCTL + ), + [_LOWER] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, KC_QUOT, + _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLSH, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [_RAISE] = LAYOUT( + 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_LBRC, KC_RBRC, KC_BSLS, KC_HOME, KC_END, KC_PGUP, KC_PGDN, XXXXXXX, KC_DQUO, + _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [_ADJUST] = LAYOUT( + UG_VALU, UG_SATU, UG_HUEU, UG_NEXT, XXXXXXX, UG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + UG_VALD, UG_SATD, UG_HUED, UG_PREV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_VOLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_MUTE, KC_VOLD, KC_MPLY, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX + ), +}; + +layer_state_t layer_state_set_user(layer_state_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/reviung/reviung46/readme.md b/keyboards/reviung/reviung46/readme.md new file mode 100644 index 0000000000..0914155d14 --- /dev/null +++ b/keyboards/reviung/reviung46/readme.md @@ -0,0 +1,27 @@ +# reviung46 + +![reviung46](https://i.imgur.com/hAanqOQ.jpeg) + +The REVIUNG46 is 42-46 key keyboard. + +* Keyboard Maintainer: [gtips](https://github.com/gtips) +* Hardware Supported: REVIUNG46 PCB. +* Hardware Availability: [PCB & Case Data](https://github.com/gtips/reviung/tree/master/reviung46) + +Make example for this keyboard (after setting up your build environment): + + make reviung46:default + +Flashing example for this keyboard: + + make reviung46: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 93765bb0ef9206517ef4c1d98d5b00ccec7bde28 Mon Sep 17 00:00:00 2001 From: russell-myers1 <124931768+russell-myers1@users.noreply.github.com> Date: Tue, 3 Dec 2024 10:35:39 -0800 Subject: [PATCH 044/592] Update hardware_keyboard_guidelines.md to Fix Typos (#24671) Corrected a typo in the phrase "iOS device need lessthan 100" to "iOS devices need less than 100." This was to improve clarity and professionalism of the doc. --- docs/hardware_keyboard_guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md index de67fa3bc3..7f17c46748 100644 --- a/docs/hardware_keyboard_guidelines.md +++ b/docs/hardware_keyboard_guidelines.md @@ -111,7 +111,7 @@ The `post_config.h` file can be used for additional post-processing, depending o #define USB_MAX_POWER_CONSUMPTION 400 #else // fix iPhone and iPad power adapter issue - // iOS device need lessthan 100 + // iOS devices need less than 100 #define USB_MAX_POWER_CONSUMPTION 100 #endif From f0eb2460d9e5b6e71ff76da3f341795ac53e1ec2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 19:31:16 +0000 Subject: [PATCH 045/592] Bump JamesIves/github-pages-deploy-action from 4.7.1 to 4.7.2 (#24672) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.1 to 4.7.2. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.1...v4.7.2) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 95a2cfa3af..edce1a6e5c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,7 +56,7 @@ jobs: - name: Deploy if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }} - uses: JamesIves/github-pages-deploy-action@v4.7.1 + uses: JamesIves/github-pages-deploy-action@v4.7.2 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages From e7f138831727aa0aecb0eb3b5959bfdd3a714567 Mon Sep 17 00:00:00 2001 From: Vaarai Date: Tue, 3 Dec 2024 23:40:07 +0100 Subject: [PATCH 046/592] Add cornia keyboard (#24442) * Add cornia keyboard * Update Fire keymap * [Cornia/Doc] Host image on imgur * [Cornia/config] Remove unnecessary defines * [Cornia] Move I2C stuff to keyboard level * [Cornia/config] Remove unnecessary defines & move all callbacks to keymap.c * [Cornia] Use tri-layer in default keymap * [Cornia/makefiles] remove license headers & root makefile * [Cornia] Put common configuration to top keyboard level * [Cornia] Remove unecessary custom keycodes * [Cornia] Fix readme * [Cornia] Fix RGB keycodes * [Cornia] Fix config files * [Cornia] Fix readme * [Cornia] Fix mcuconf.h license --- keyboards/cornia/config.h | 30 +++ keyboards/cornia/cornia.c | 44 ++++ keyboards/cornia/cornia.h | 21 ++ keyboards/cornia/info.json | 139 +++++++++++++ keyboards/cornia/keymaps/default/keymap.c | 75 +++++++ keyboards/cornia/keymaps/default/rules.mk | 1 + keyboards/cornia/keymaps/fire/config.h | 33 +++ keyboards/cornia/keymaps/fire/keymap.c | 226 +++++++++++++++++++++ keyboards/cornia/keymaps/fire/keymap.h | 55 +++++ keyboards/cornia/keymaps/fire/rules.mk | 8 + keyboards/cornia/keymaps/fire/tap_dances.c | 154 ++++++++++++++ keyboards/cornia/keymaps/fire/tap_dances.h | 47 +++++ keyboards/cornia/mcuconf.h | 25 +++ keyboards/cornia/readme.md | 46 +++++ keyboards/cornia/v0_6/keyboard.json | 12 ++ keyboards/cornia/v1/keyboard.json | 21 ++ 16 files changed, 937 insertions(+) create mode 100644 keyboards/cornia/config.h create mode 100644 keyboards/cornia/cornia.c create mode 100644 keyboards/cornia/cornia.h create mode 100644 keyboards/cornia/info.json create mode 100644 keyboards/cornia/keymaps/default/keymap.c create mode 100644 keyboards/cornia/keymaps/default/rules.mk create mode 100644 keyboards/cornia/keymaps/fire/config.h create mode 100644 keyboards/cornia/keymaps/fire/keymap.c create mode 100644 keyboards/cornia/keymaps/fire/keymap.h create mode 100644 keyboards/cornia/keymaps/fire/rules.mk create mode 100644 keyboards/cornia/keymaps/fire/tap_dances.c create mode 100644 keyboards/cornia/keymaps/fire/tap_dances.h create mode 100644 keyboards/cornia/mcuconf.h create mode 100644 keyboards/cornia/readme.md create mode 100644 keyboards/cornia/v0_6/keyboard.json create mode 100644 keyboards/cornia/v1/keyboard.json diff --git a/keyboards/cornia/config.h b/keyboards/cornia/config.h new file mode 100644 index 0000000000..dbf7031b62 --- /dev/null +++ b/keyboards/cornia/config.h @@ -0,0 +1,30 @@ +/* Copyright 2024 Vaarai + * + * 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 + +/* Select hand configuration */ +// #define MASTER_LEFT +#define MASTER_RIGHT +// #define EE_HANDS + +/* I²C config */ +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP10 +#define I2C1_SCL_PIN GP11 + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur. \ No newline at end of file diff --git a/keyboards/cornia/cornia.c b/keyboards/cornia/cornia.c new file mode 100644 index 0000000000..9a09047333 --- /dev/null +++ b/keyboards/cornia/cornia.c @@ -0,0 +1,44 @@ +/* Copyright 2024 Vaarai + * + * 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 "cornia.h" + +// 'Cornia', 32x32px +#define OLED_LOGO_CORNIA {\ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, \ + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf8, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0xe1, \ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, \ + 0x00, 0x00, 0xc0, 0xf8, 0xff, 0xff, 0xff, 0x3f, 0x07, 0x00, 0x00, 0x00, 0x07, 0x3f, 0xff, 0xff, \ + 0xff, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x1e, 0x1f, 0x1f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, \ + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x00 \ + } + +void cornia_render_logo(void) { +#ifdef OLED_ENABLE + static const char PROGMEM logo[] = OLED_LOGO_CORNIA; + oled_write_raw_P(logo, sizeof(logo)); +#endif +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + cornia_render_logo(); + return true; +} diff --git a/keyboards/cornia/cornia.h b/keyboards/cornia/cornia.h new file mode 100644 index 0000000000..2cee8d4a68 --- /dev/null +++ b/keyboards/cornia/cornia.h @@ -0,0 +1,21 @@ +/* Copyright 2024 Vaarai + * + * 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 "quantum.h" + +void cornia_render_logo(void); diff --git a/keyboards/cornia/info.json b/keyboards/cornia/info.json new file mode 100644 index 0000000000..7c0b5aabf2 --- /dev/null +++ b/keyboards/cornia/info.json @@ -0,0 +1,139 @@ +{ + "manufacturer": "Vaarai", + "maintainer": "Vaarai", + "url": "https://github.com/Vaarai/Cornia", + "usb": { + "vid": "0xFEED" + }, + "processor": "RP2040", + "bootloader": "rp2040", + "split": { + "enabled": true, + "serial": { + "driver": "vendor", + "pin": "GP1" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "features": { + "extrakey": true, + "mousekey": true, + "bootmagic": true, + "nkro": true, + "oled": true, + "rgb_matrix": true + }, + "community_layouts": [ "split_3x6_3" ], + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x6_3" + }, + "layouts": { + "LAYOUT_split_3x6_3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.3}, + {"matrix": [0, 1], "x": 1, "y": 0.3}, + {"matrix": [0, 2], "x": 2, "y": 0.1}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.1}, + {"matrix": [0, 5], "x": 5, "y": 0.2}, + {"matrix": [4, 5], "x": 9, "y": 0.2}, + {"matrix": [4, 4], "x": 10, "y": 0.1}, + {"matrix": [4, 3], "x": 11, "y": 0}, + {"matrix": [4, 2], "x": 12, "y": 0.1}, + {"matrix": [4, 1], "x": 13, "y": 0.3}, + {"matrix": [4, 0], "x": 14, "y": 0.3}, + {"matrix": [1, 0], "x": 0, "y": 1.3}, + {"matrix": [1, 1], "x": 1, "y": 1.3}, + {"matrix": [1, 2], "x": 2, "y": 1.1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.1}, + {"matrix": [1, 5], "x": 5, "y": 1.2}, + {"matrix": [5, 5], "x": 9, "y": 1.2}, + {"matrix": [5, 4], "x": 10, "y": 1.1}, + {"matrix": [5, 3], "x": 11, "y": 1}, + {"matrix": [5, 2], "x": 12, "y": 1.1}, + {"matrix": [5, 1], "x": 13, "y": 1.3}, + {"matrix": [5, 0], "x": 14, "y": 1.3}, + {"matrix": [2, 0], "x": 0, "y": 2.3}, + {"matrix": [2, 1], "x": 1, "y": 2.3}, + {"matrix": [2, 2], "x": 2, "y": 2.1}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.1}, + {"matrix": [2, 5], "x": 5, "y": 2.2}, + {"matrix": [6, 5], "x": 9, "y": 2.2}, + {"matrix": [6, 4], "x": 10, "y": 2.1}, + {"matrix": [6, 3], "x": 11, "y": 2}, + {"matrix": [6, 2], "x": 12, "y": 2.1}, + {"matrix": [6, 1], "x": 13, "y": 2.3}, + {"matrix": [6, 0], "x": 14, "y": 2.3}, + {"matrix": [3, 3], "x": 4, "y": 3.7}, + {"matrix": [3, 4], "x": 5, "y": 3.7}, + {"matrix": [3, 5], "x": 6, "y": 3.2}, + {"matrix": [7, 5], "x": 8, "y": 3.2}, + {"matrix": [7, 4], "x": 9, "y": 3.7}, + {"matrix": [7, 3], "x": 10, "y": 3.7} + ] + } + }, + "ws2812": { + "driver": "vendor", + "pin": "GP0" + }, + "rgb_matrix": { + "driver": "ws2812", + "sleep": true, + "split_count": [21, 21], + "animations": { + "static_gradient": true, + "breathing": true + }, + "layout": [ + {"matrix": [3, 5], "x": 95, "y": 63, "flags": 1}, + {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4}, + {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4}, + {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4}, + {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4}, + {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4}, + {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4}, + {"matrix": [3, 4], "x": 80, "y": 58, "flags": 1}, + {"matrix": [3, 3], "x": 60, "y": 55, "flags": 1}, + {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4}, + {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4}, + {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4}, + {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 7, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 24, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 41, "flags": 1}, + {"matrix": [7, 5], "x": 129, "y": 63, "flags": 1}, + {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4}, + {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4}, + {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4}, + {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4}, + {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4}, + {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4}, + {"matrix": [7, 4], "x": 144, "y": 58, "flags": 1}, + {"matrix": [7, 3], "x": 164, "y": 55, "flags": 1}, + {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4}, + {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4}, + {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4}, + {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4}, + {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 7, "flags": 1}, + {"matrix": [5, 0], "x": 224, "y": 24, "flags": 1}, + {"matrix": [6, 0], "x": 224, "y": 41, "flags": 1} + ] + } +} \ No newline at end of file diff --git a/keyboards/cornia/keymaps/default/keymap.c b/keyboards/cornia/keymaps/default/keymap.c new file mode 100644 index 0000000000..1aa48d471f --- /dev/null +++ b/keyboards/cornia/keymaps/default/keymap.c @@ -0,0 +1,75 @@ +/* Copyright 2024 Vaarai + * + * 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 + +/* Layers definitions */ +enum layers { + _ALPHA, + _LOWER, + _UPPER, + _ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_ALPHA] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTL, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_LSFT, TL_LOWR, KC_SPC, KC_ENT, TL_UPPR, KC_RSFT + //`--------------------------' `--------------------------' + ), + + [_LOWER] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_RALT, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_LGUI, _______, _______, _______, _______, _______ + //`--------------------------' `--------------------------' + ), + + [_UPPER] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_SLSH, KC_LCBR, KC_LPRN, KC_LBRC, KC_MINS, KC_UNDS, KC_RBRC, KC_RPRN, KC_RCBR, KC_BSLS, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, KC_GRV, KC_QUES, KC_EQL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, KC_RGUI + //`--------------------------' `--------------------------' + ), + + [_ADJUST] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, RM_TOGG, RM_HUEU, RM_VALU, XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + //|--------+--------+--------+--------+--------|--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, RM_NEXT, RM_HUED, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______ + //`--------------------------' `--------------------------' + ), +}; \ No newline at end of file diff --git a/keyboards/cornia/keymaps/default/rules.mk b/keyboards/cornia/keymaps/default/rules.mk new file mode 100644 index 0000000000..7c9bf212a6 --- /dev/null +++ b/keyboards/cornia/keymaps/default/rules.mk @@ -0,0 +1 @@ +TRI_LAYER_ENABLE = yes diff --git a/keyboards/cornia/keymaps/fire/config.h b/keyboards/cornia/keymaps/fire/config.h new file mode 100644 index 0000000000..a40a881bf5 --- /dev/null +++ b/keyboards/cornia/keymaps/fire/config.h @@ -0,0 +1,33 @@ +/* Copyright 2024 Vaarai + * + * 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 + +/* Split */ +#define SPLIT_ACTIVITY_ENABLE +#define SPLIT_LAYER_STATE_ENABLE +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_MODS_ENABLE + +/* Trackpad */ +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_RIGHT +#define POINTING_DEVICE_ROTATION_90 +#define CIRQUE_PINNACLE_DIAMETER_MM 40 +#define CIRQUE_PINNACLE_TAP_ENABLE +#define CIRQUE_PINNACLE_CURVED_OVERLAY +#define CIRQUE_PINNACLE_POSITION_MODE CIRQUE_PINNACLE_RELATIVE_MODE +#define CIRQUE_PINNACLE_ATTENUATION EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_2X diff --git a/keyboards/cornia/keymaps/fire/keymap.c b/keyboards/cornia/keymaps/fire/keymap.c new file mode 100644 index 0000000000..9215c61f9c --- /dev/null +++ b/keyboards/cornia/keymaps/fire/keymap.c @@ -0,0 +1,226 @@ +/* Copyright 2024 Vaarai + * + * 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 + +#include "./keymap.h" +#include "./tap_dances.h" + +/* Flag to enable/disable trackpad scroll */ +bool set_scrolling = false; + +/* Variables to store accumulated scroll values */ +float scroll_accumulated_h = 0; +float scroll_accumulated_v = 0; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_ALPHA] = LAYOUT_split_3x6_3( /* Fire (Oxey) : https://bit.ly/layout-doc-v2 */ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_ESC, KC_P, KC_L, KC_D, KC_G, KC_V, KC_Q, KC_F, KC_O, KC_U, KC_COMM, KC_BSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_TAB, KC_N, KC_R, KC_T, KC_S, KC_Y, KC_J, KC_H, KC_A, KC_E, KC_I, KC_LALT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LCTL, KC_X, KC_K, KC_C, KC_W, KC_Z, KC_B, KC_M, KC_QUOT, KC_SCLN, KC_DOT, KC_RCTL, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + TD(TD_SFT_CAPSW), TD(TD_NAV_ACCENT), KC_SPC, KC_ENT, TD(TD_NUM_ACCENT), TD(TD_SFT_CAPSW) + //`--------------------------' `--------------------------' + ), + + [_NAV] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, G(KC_L), XXXXXXX, CK_SCRL, C(KC_A), XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN3, XXXXXXX, XXXXXXX, KC_DEL, + //|--------+--------+ GUI V +--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, C(KC_X), G(KC_V), C(KC_V), C(KC_C), C(KC_Z), KC_WH_U, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, + //|ALT LEFT+--------+ ALT SFT+scrnshot+--------+--------| |--------+--------+--------+--------+--------+--------| + A(KC_LEFT),C(KC_S),S(KC_LALT), CK_SSHT,C(KC_F), C(KC_Y), KC_WH_D, KC_HOME, CK_SELL, CK_SELR, KC_END, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_LGUI, _______, _______, _______,MO(_ADJUST),_______ + //`--------------------------' `--------------------------' + ), + + [_NUM] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + //|--------+-- / ---+-- { ---+-- ( ---+-- [ ---+-- - ---| |--- _ --+--- ] --+-- ) ---+-- } ---+-- \ ---+--------| + _______, KC_SLSH, KC_LCBR, KC_LPRN, KC_LBRC, KC_MINS, KC_UNDS, KC_RBRC, KC_RPRN, KC_RCBR, KC_BSLS, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, KC_GRV, KC_QUES, KC_EQL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______,MO(_ADJUST),_______, _______, _______, KC_RGUI + //`--------------------------' `--------------------------' + ), + + [_ADJUST] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, RM_TOGG, RM_HUEU, RM_VALU, CK_DPII, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + //|--------+--------+--------+--------+--------|--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, RM_NEXT, RM_HUED, RM_VALD, CK_DPID, XXXXXXX, TO(_G0), TO(_G1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______ + //`--------------------------' `--------------------------' + ), + + /* Generic game */ + [_G0] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + XXXXXXX, KC_LSFT, KC_A, KC_S, KC_D, KC_F, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LGUI, KC_LCTL, KC_Z, KC_X, KC_C, KC_V, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_SPC, KC_SPC, XXXXXXX, XXXXXXX, TG(_G0), XXXXXXX + //`--------------------------' `--------------------------' + ), + + /* Warframe */ + [_G1] = LAYOUT_split_3x6_3( + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_TAB, KC_ESC, KC_Q, KC_W, KC_1, KC_2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F, KC_LSFT, KC_A, KC_S, KC_D, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LGUI, KC_LCTL, KC_M, KC_Y, KC_X, KC_4, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_SPC,CK_RKJMP, KC_5, XXXXXXX, TG(_G1), XXXXXXX + //`--------------------------' `--------------------------' + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case CK_RKJMP: /* Warframe rocket jump */ + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_C)); + } else { + SEND_STRING(SS_DOWN(X_SPC) SS_DELAY(50) SS_UP(X_C) SS_DELAY(50) SS_UP(X_SPC)); + } + return false; + case CK_DPII: /* Increase trackpad DPI */ + if (record->event.pressed) { + pointing_device_set_cpi(pointing_device_get_cpi()+100); + } + return false; + case CK_DPID: /* Decrease trackpad DPI */ + if (record->event.pressed) { + pointing_device_set_cpi(pointing_device_get_cpi()-100); + } + return false; + case CK_SCRL: /* Toggle set_scrolling when CK_SCRL key is pressed or released */ + set_scrolling = record->event.pressed; + return false; + } + /* Accented letters */ + if (accent_state != ACCENT_NONE && record->event.pressed) + { + switch (keycode) { + case KC_A: + SEND_STRING(SS_ACCENT_A_GRAVE); + break; + case KC_C: + SEND_STRING(SS_ACCENT_C_CEDIL); + break; + case KC_E: + switch (accent_state) { + case ACCENT_LEFT: + SEND_STRING(SS_ACCENT_E_ACUTE); break; + case ACCENT_RIGHT: + SEND_STRING(SS_ACCENT_E_GRAVE); break; + case ACCENT_NONE: + break; + } + break; + case KC_O: + SEND_STRING(SS_ACCENT_O_CIRCU); + break; + case KC_U: + SEND_STRING(SS_ACCENT_U_GRAVE); + break; + } + accent_state = ACCENT_NONE; + return false; + } + return true; +} + +bool shutdown_user(bool jump_to_bootloader) { + oled_clear(); + oled_set_cursor(0, 2); + if (jump_to_bootloader) { + oled_write_P(PSTR("FLASH"), false); + } else { + oled_write_P(PSTR("RESET"), false); + } + oled_render_dirty(true); + return false; +} + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_270; +} + +bool oled_task_user(void) { + /* Print cornia logo */ + cornia_render_logo(); + + /* Print layer status */ + oled_set_cursor(0, 7); + switch (get_highest_layer(layer_state)) { + case _ALPHA: + oled_write_ln("ALPHA", 0); + break; + case _NAV: + oled_write_ln("NAV", 0); + break; + case _NUM: + oled_write_ln("NUM", 0); + break; + case _ADJUST: + oled_write_ln("ADJUS", 0); + break; + case _G0: + oled_write_ln("GAME0", 0); + break; + case _G1: + oled_write_ln("GAME1", 0); + break; + } + return false; +} + +report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { + /* Check if drag scrolling is active */ + if (set_scrolling) { + /* Calculate and accumulate scroll values based on mouse movement and divisors */ + scroll_accumulated_h += (float)mouse_report.x / SCROLL_DIVISOR_H; + scroll_accumulated_v += (float)mouse_report.y / SCROLL_DIVISOR_V; + + /* Assign integer parts of accumulated scroll values to the mouse report */ + mouse_report.h = (int8_t)scroll_accumulated_h; + mouse_report.v = (int8_t)scroll_accumulated_v; + + /* Update accumulated scroll values by subtracting the integer parts */ + scroll_accumulated_h -= (int8_t)scroll_accumulated_h; + scroll_accumulated_v -= (int8_t)scroll_accumulated_v; + + /* Clear the X and Y values of the mouse report */ + mouse_report.x = 0; + mouse_report.y = 0; + } + return mouse_report; +} \ No newline at end of file diff --git a/keyboards/cornia/keymaps/fire/keymap.h b/keyboards/cornia/keymaps/fire/keymap.h new file mode 100644 index 0000000000..719c2b97a8 --- /dev/null +++ b/keyboards/cornia/keymaps/fire/keymap.h @@ -0,0 +1,55 @@ +/* Copyright 2024 Vaarai + * + * 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 QMK_KEYBOARD_H + +/* Trackpad srolling speed adjustment */ +#define SCROLL_DIVISOR_H 8.0 +#define SCROLL_DIVISOR_V 8.0 + +/* Trackpad srolling enablement flag */ +extern bool set_scrolling; + +/* Layers definitions */ +enum layers { + _ALPHA, + _NAV, + _NUM, + _ADJUST, + _G0, + _G1 +}; + +/* Custom Keycodes (CK_xxx) */ +#define CK_SSHT LSG(KC_S) +#define CK_SELL LSFT(LCTL(KC_LEFT)) +#define CK_SELR LSFT(LCTL(KC_RIGHT)) + +typedef enum { + CK_RKJMP = SAFE_RANGE, /* Warframe rocket/bullet jump */ + CK_DPII, + CK_DPID, + CK_SCRL, +} cornia_custom_keycodes_t; + +#define SS_ACCENT_A_GRAVE SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P3) SS_UP(X_LALT) /* à */ +#define SS_ACCENT_C_CEDIL SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P5) SS_UP(X_LALT) /* ç */ +#define SS_ACCENT_E_ACUTE SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P0) SS_UP(X_LALT) /* é */ +#define SS_ACCENT_E_GRAVE SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P8) SS_UP(X_LALT) /* è */ +#define SS_ACCENT_O_CIRCU SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P4) SS_TAP(X_P7) SS_UP(X_LALT) /* ô */ +#define SS_ACCENT_U_GRAVE SS_DOWN(X_LALT) SS_TAP(X_P0) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P9) SS_UP(X_LALT) /* ù */ diff --git a/keyboards/cornia/keymaps/fire/rules.mk b/keyboards/cornia/keymaps/fire/rules.mk new file mode 100644 index 0000000000..221d810975 --- /dev/null +++ b/keyboards/cornia/keymaps/fire/rules.mk @@ -0,0 +1,8 @@ +SRC += tap_dances.c + +CAPS_WORD_ENABLE = yes +TAP_DANCE_ENABLE = yes + +# Cirque Trackpad I²C configuration +POINTING_DEVICE_ENABLE = yes +POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c diff --git a/keyboards/cornia/keymaps/fire/tap_dances.c b/keyboards/cornia/keymaps/fire/tap_dances.c new file mode 100644 index 0000000000..63f9911549 --- /dev/null +++ b/keyboards/cornia/keymaps/fire/tap_dances.c @@ -0,0 +1,154 @@ +/* Copyright 2024 Vaarai + * + * 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 + +#include "./tap_dances.h" +#include "./keymap.h" + +/* define a type containing as many tapdance states as you need */ +typedef enum { + SINGLE_TAP, + SINGLE_HOLD, + DOUBLE_TAP, + DOUBLE_HOLD, + OTHER_TAP +} td_state_t; + +/* Create a global instance of the tapdance state type */ +static td_state_t td_state; +accent_state_t accent_state = ACCENT_NONE; + +tap_dance_action_t tap_dance_actions[TAP_DANCE_ACTIONS_COUNT] = { + [TD_SFT_CAPSW] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_shift_capsword_finished, dance_shift_capsword_reset), + [TD_NAV_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_nav_accent_finished, dance_nav_accent_reset), + [TD_NUM_ACCENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_num_accent_finished, dance_num_accent_reset) +}; + +int cur_dance (tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) + { + return SINGLE_TAP; + } else { + return SINGLE_HOLD; + } + } + if (state->count == 2) + { + if (state->interrupted || !state->pressed) + { + return DOUBLE_TAP; + } else { + return DOUBLE_HOLD; + } + } else { + return OTHER_TAP; + } +} + +void dance_shift_capsword_finished (tap_dance_state_t *state, void *user_data) +{ + td_state = cur_dance(state); + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + register_code(KC_LSFT); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + caps_word_on(); + break; + case OTHER_TAP: + break; + } +} + +void dance_shift_capsword_reset (tap_dance_state_t *state, void *user_data) +{ + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + unregister_code(KC_LSFT); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + case OTHER_TAP: + break; + } +} + +void dance_nav_accent_finished (tap_dance_state_t *state, void *user_data) +{ + td_state = cur_dance(state); + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + layer_on(_NAV); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + accent_state = ACCENT_LEFT; + break; + case OTHER_TAP: + break; + } +} + +void dance_nav_accent_reset (tap_dance_state_t *state, void *user_data) +{ + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + layer_off(_NAV); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + case OTHER_TAP: + break; + } +} + +void dance_num_accent_finished (tap_dance_state_t *state, void *user_data) +{ + td_state = cur_dance(state); + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + layer_on(_NUM); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + accent_state = ACCENT_RIGHT; + break; + case OTHER_TAP: + break; + } +} + +void dance_num_accent_reset (tap_dance_state_t *state, void *user_data) +{ + switch (td_state) { + case SINGLE_TAP: + case SINGLE_HOLD: + layer_off(_NUM); + break; + case DOUBLE_TAP: + case DOUBLE_HOLD: + case OTHER_TAP: + break; + } +} \ No newline at end of file diff --git a/keyboards/cornia/keymaps/fire/tap_dances.h b/keyboards/cornia/keymaps/fire/tap_dances.h new file mode 100644 index 0000000000..082e81f3ce --- /dev/null +++ b/keyboards/cornia/keymaps/fire/tap_dances.h @@ -0,0 +1,47 @@ +/* Copyright 2024 Vaarai + * + * 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 QMK_KEYBOARD_H + +/* Tap dances definitions */ +enum tap_dances { + TD_SFT_CAPSW, + TD_NAV_ACCENT, + TD_NUM_ACCENT, + TAP_DANCE_ACTIONS_COUNT /* Utility to get TD_xxx count */ +}; + +/* Accented letters */ +typedef enum { + ACCENT_NONE, + ACCENT_LEFT, + ACCENT_RIGHT +} accent_state_t; + +extern accent_state_t accent_state; + +extern tap_dance_action_t tap_dance_actions[TAP_DANCE_ACTIONS_COUNT]; + +void dance_shift_capsword_finished (tap_dance_state_t *state, void *user_data); +void dance_shift_capsword_reset (tap_dance_state_t *state, void *user_data); + +void dance_nav_accent_finished (tap_dance_state_t *state, void *user_data); +void dance_nav_accent_reset (tap_dance_state_t *state, void *user_data); + +void dance_num_accent_finished (tap_dance_state_t *state, void *user_data); +void dance_num_accent_reset (tap_dance_state_t *state, void *user_data); diff --git a/keyboards/cornia/mcuconf.h b/keyboards/cornia/mcuconf.h new file mode 100644 index 0000000000..9c018283f8 --- /dev/null +++ b/keyboards/cornia/mcuconf.h @@ -0,0 +1,25 @@ +/* Copyright 2024 Vaarai + * + * 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 RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 FALSE + +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 TRUE \ No newline at end of file diff --git a/keyboards/cornia/readme.md b/keyboards/cornia/readme.md new file mode 100644 index 0000000000..3051d010a9 --- /dev/null +++ b/keyboards/cornia/readme.md @@ -0,0 +1,46 @@ +# Cornia Keyboard + +![Cornia v1](https://i.imgur.com/3vRlvi3.jpeg) + +A split keyboard with 3x6 column strongly staggered keys and 3 thumb keys + +* Keyboard Maintainer: [Vaarai](https://github.com/Vaarai) +* Hardware Supported: Cornia PCB, RP2040 / 0xCB-Helios +* Hardware Availability: [PCB Data](https://github.com/Vaarai/Cornia) + +Make example for this keyboard (after setting up your build environment): + + make cornia/v1:default + +Flashing example for this keyboard: + + make cornia/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 + +The Cornia PCBs have a reset button on the bottom side near to the TRRS jack. + +To enter in to the bootloader you can either: +- Hold reset when plugging in that half of the keyboard. +- Double press reset if firmware was already flashed and if RP2040 is used +- Press NAV+NUM+ESC if firmware was already flashed no matter what controller is used + +## Keymaps + +Two keymaps are available for now, below are their [KLE](https://www.keyboard-layout-editor.com/) views: +- [Default QWERTY layout for Cornia keyboard](https://www.keyboard-layout-editor.com/#/gists/5af136790cefe4b35cdf02ca52c1fccc) +- [Fire layout for Cornia keyboard](https://www.keyboard-layout-editor.com/#/gists/a40345c92e1f3f326426ef890ebf4d1c) (Based on [Fire (Oxey)](https://docs.google.com/document/d/1Ic-h8UxGe5-Q0bPuYNgE3NoWiI8ekeadvSQ5YysrwII) layout) + +## OLED Display & Cirque Trackpad + +The Cornia Keyboard also support OLED Display and Cirque Trackpad through I²C, an implementation is available in `fire` keymap. + +To use it please make with the following command: + + make cornia/v1:fire + +And flash with: + + make cornia/v1:fire:flash \ No newline at end of file diff --git a/keyboards/cornia/v0_6/keyboard.json b/keyboards/cornia/v0_6/keyboard.json new file mode 100644 index 0000000000..5e4b96da21 --- /dev/null +++ b/keyboards/cornia/v0_6/keyboard.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Cornia v0.6", + "usb": { + "pid": "0x0600", + "device_version": "0.6.0" + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": [ "GP29", "GP28", "GP27", "GP26", "GP22", "GP20" ], + "rows": [ "GP4", "GP5", "GP6", "GP7" ] + } +} diff --git a/keyboards/cornia/v1/keyboard.json b/keyboards/cornia/v1/keyboard.json new file mode 100644 index 0000000000..90a54f288e --- /dev/null +++ b/keyboards/cornia/v1/keyboard.json @@ -0,0 +1,21 @@ +{ + "keyboard_name": "Cornia v1", + "usb": { + "pid": "0x1000", + "device_version": "1.0.0" + }, + "split": { + + "handedness": { + "pin": "GP25" + } + }, + "matrix_pins": { + "direct":[ + ["GP27", "GP4", "GP28", "GP3", "GP29", "GP2"], + ["GP5", "GP26", "GP6", "GP22", "GP7", "GP20"], + ["GP8", "GP15", "GP9", "GP14", "GP12", "GP13"], + [ null, null, null, "GP16", "GP23", "GP21"] + ] + } +} From 85222dfd8caaec4c914e74720718f4288f530b0f Mon Sep 17 00:00:00 2001 From: Stephen Edwards Date: Tue, 3 Dec 2024 16:43:14 -0600 Subject: [PATCH 047/592] Add a keyboard entry for yacobo model m replacement control boards (#23827) * add the keyboard * Update keyboards/ibm/model_m/yacobo/keyboard.json Co-authored-by: jack <0x6a73@protonmail.com> * remove dead file * PR Comments * standardize comments * PR Comments --------- Co-authored-by: Stephen Edwards Co-authored-by: jack --- keyboards/ibm/model_m/yacobo/config.h | 22 ++ keyboards/ibm/model_m/yacobo/keyboard.json | 285 ++++++++++++++++++ .../model_m/yacobo/keymaps/default/keymap.c | 30 ++ keyboards/ibm/model_m/yacobo/readme.md | 28 ++ keyboards/ibm/model_m/yacobo/yacobo.c | 26 ++ 5 files changed, 391 insertions(+) create mode 100644 keyboards/ibm/model_m/yacobo/config.h create mode 100644 keyboards/ibm/model_m/yacobo/keyboard.json create mode 100644 keyboards/ibm/model_m/yacobo/keymaps/default/keymap.c create mode 100644 keyboards/ibm/model_m/yacobo/readme.md create mode 100644 keyboards/ibm/model_m/yacobo/yacobo.c diff --git a/keyboards/ibm/model_m/yacobo/config.h b/keyboards/ibm/model_m/yacobo/config.h new file mode 100644 index 0000000000..f8e96c8d6e --- /dev/null +++ b/keyboards/ibm/model_m/yacobo/config.h @@ -0,0 +1,22 @@ +/* Copyright 2024 Stephen Edwards + * + * 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 . + * + * Adapted from the Model H Project by Jonathan Hawthorn. + */ + +#pragma once + +/* The status LED on the Blue Pill. */ +#define BLUE_PILL_STATUS_LED C13 diff --git a/keyboards/ibm/model_m/yacobo/keyboard.json b/keyboards/ibm/model_m/yacobo/keyboard.json new file mode 100644 index 0000000000..7ea9c6a621 --- /dev/null +++ b/keyboards/ibm/model_m/yacobo/keyboard.json @@ -0,0 +1,285 @@ +{ + "manufacturer": "IBM", + "keyboard_name": "Model M (Yacobo)", + "maintainer": "sje-mse", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "indicators": { + "num_lock": "B11", + "caps_lock": "B10", + "scroll_lock": "B1", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A10", "A9", "A8", "B15", "B14", "B13", "B12", "A0"], + "rows": ["A1", "A2", "A3", "A4", "A5", "A6", "A7","B0"], + "ghost": true + }, + "development_board": "bluepill", + "url": "https://github.com/sje-mse/yacobo", + "usb": { + "device_version": "1.0.0", + "max_power": 100, + "pid": "0xB155", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT_fullsize_ansi_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0}, + {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0}, + {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0}, + {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0}, + {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [3, 15], "x": 15.5, "y": 0}, + {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.5, "y": 0}, + {"label": "Pause", "matrix": [6, 14], "x": 17.5, "y": 0}, + + {"label": "`", "matrix": [2, 2], "x": 0, "y": 1.5}, + {"label": "1", "matrix": [3, 2], "x": 1, "y": 1.5}, + {"label": "2", "matrix": [3, 3], "x": 2, "y": 1.5}, + {"label": "3", "matrix": [3, 4], "x": 3, "y": 1.5}, + {"label": "4", "matrix": [3, 5], "x": 4, "y": 1.5}, + {"label": "5", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "6", "matrix": [2, 7], "x": 6, "y": 1.5}, + {"label": "7", "matrix": [3, 7], "x": 7, "y": 1.5}, + {"label": "8", "matrix": [3, 8], "x": 8, "y": 1.5}, + {"label": "9", "matrix": [3, 9], "x": 9, "y": 1.5}, + {"label": "0", "matrix": [3, 10], "x": 10, "y": 1.5}, + {"label": "-", "matrix": [2, 10], "x": 11, "y": 1.5}, + {"label": "=", "matrix": [2, 8], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2}, + + {"label": "Insert", "matrix": [2, 12], "x": 15.5, "y": 1.5}, + {"label": "Home", "matrix": [2, 14], "x": 16.5, "y": 1.5}, + {"label": "Page Up", "matrix": [2, 13], "x": 17.5, "y": 1.5}, + + {"label": "Num Lock", "matrix": [6, 11], "x": 19, "y": 1.5}, + {"label": "/", "matrix": [6, 12], "x": 20, "y": 1.5}, + {"label": "*", "matrix": [6, 13], "x": 21, "y": 1.5}, + {"label": "-", "matrix": [7, 13], "x": 22, "y": 1.5}, + + {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5}, + {"label": "[", "matrix": [1, 10], "x": 11.5, "y": 2.5}, + {"label": "]", "matrix": [1, 8], "x": 12.5, "y": 2.5}, + {"label": "\\", "matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5}, + + {"label": "Delete", "matrix": [2, 11], "x": 15.5, "y": 2.5}, + {"label": "End", "matrix": [3, 14], "x": 16.5, "y": 2.5}, + {"label": "Page Down", "matrix": [3, 13], "x": 17.5, "y": 2.5}, + + {"label": "7", "matrix": [4, 11], "x": 19, "y": 2.5}, + {"label": "8", "matrix": [4, 12], "x": 20, "y": 2.5}, + {"label": "9", "matrix": [4, 13], "x": 21, "y": 2.5}, + {"label": "+", "matrix": [4, 14], "x": 22, "y": 2.5, "h": 2}, + + {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.25}, + {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5}, + {"label": ";", "matrix": [5, 10], "x": 10.75, "y": 3.5}, + {"label": "'", "matrix": [0, 10], "x": 11.75, "y": 3.5}, + {"label": "Enter", "matrix": [6, 6], "x": 12.75, "y": 3.5, "w": 2.25}, + + {"label": "4", "matrix": [1, 11], "x": 19, "y": 3.5}, + {"label": "5", "matrix": [1, 12], "x": 20, "y": 3.5}, + {"label": "6", "matrix": [1, 13], "x": 21, "y": 3.5}, + + {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 2.25}, + {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5}, + {"label": ",", "matrix": [6, 8], "x": 9.25, "y": 4.5}, + {"label": ".", "matrix": [6, 9], "x": 10.25, "y": 4.5}, + {"label": "/", "matrix": [7, 10], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75}, + + {"label": "\u2191", "matrix": [0, 14], "x": 16.5, "y": 4.5}, + + {"label": "1", "matrix": [5, 11], "x": 19, "y": 4.5}, + {"label": "2", "matrix": [5, 12], "x": 20, "y": 4.5}, + {"label": "3", "matrix": [5, 13], "x": 21, "y": 4.5}, + {"label": "Enter", "matrix": [5, 14], "x": 22, "y": 4.5, "h": 2}, + + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5}, + {"label": "Space", "matrix": [7, 6], "x": 4, "y": 5.5, "w": 7}, + {"label": "Alt Gr", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5}, + {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5}, + + {"label": "\u2190", "matrix": [7, 14], "x": 15.5, "y": 5.5}, + {"label": "\u2193", "matrix": [7, 11], "x": 16.5, "y": 5.5}, + {"label": "\u2192", "matrix": [7, 12], "x": 17.5, "y": 5.5}, + + {"label": "0", "matrix": [0, 11], "x": 19, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [0, 13], "x": 21, "y": 5.5} + ] + }, + "LAYOUT_fullsize_iso_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0}, + {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0}, + {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0}, + {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0}, + {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [3, 15], "x": 15.5, "y": 0}, + {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.5, "y": 0}, + {"label": "Pause", "matrix": [6, 14], "x": 17.5, "y": 0}, + + {"label": "`", "matrix": [2, 2], "x": 0, "y": 1.5}, + {"label": "1", "matrix": [3, 2], "x": 1, "y": 1.5}, + {"label": "2", "matrix": [3, 3], "x": 2, "y": 1.5}, + {"label": "3", "matrix": [3, 4], "x": 3, "y": 1.5}, + {"label": "4", "matrix": [3, 5], "x": 4, "y": 1.5}, + {"label": "5", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "6", "matrix": [2, 7], "x": 6, "y": 1.5}, + {"label": "7", "matrix": [3, 7], "x": 7, "y": 1.5}, + {"label": "8", "matrix": [3, 8], "x": 8, "y": 1.5}, + {"label": "9", "matrix": [3, 9], "x": 9, "y": 1.5}, + {"label": "0", "matrix": [3, 10], "x": 10, "y": 1.5}, + {"label": "-", "matrix": [2, 10], "x": 11, "y": 1.5}, + {"label": "=", "matrix": [2, 8], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2}, + + {"label": "Insert", "matrix": [2, 12], "x": 15.5, "y": 1.5}, + {"label": "Home", "matrix": [2, 14], "x": 16.5, "y": 1.5}, + {"label": "Page Up", "matrix": [2, 13], "x": 17.5, "y": 1.5}, + + {"label": "Num Lock", "matrix": [6, 11], "x": 19, "y": 1.5}, + {"label": "/", "matrix": [6, 12], "x": 20, "y": 1.5}, + {"label": "*", "matrix": [6, 13], "x": 21, "y": 1.5}, + {"label": "-", "matrix": [7, 13], "x": 22, "y": 1.5}, + + {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5}, + {"label": "[", "matrix": [1, 10], "x": 11.5, "y": 2.5}, + {"label": "]", "matrix": [1, 8], "x": 12.5, "y": 2.5}, + + {"label": "Delete", "matrix": [2, 11], "x": 15.5, "y": 2.5}, + {"label": "End", "matrix": [3, 14], "x": 16.5, "y": 2.5}, + {"label": "Page Down", "matrix": [3, 13], "x": 17.5, "y": 2.5}, + + {"label": "7", "matrix": [4, 11], "x": 19, "y": 2.5}, + {"label": "8", "matrix": [4, 12], "x": 20, "y": 2.5}, + {"label": "9", "matrix": [4, 13], "x": 21, "y": 2.5}, + {"label": "+", "matrix": [4, 14], "x": 22, "y": 2.5, "h": 2}, + + {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.25}, + {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5}, + {"label": ";", "matrix": [5, 10], "x": 10.75, "y": 3.5}, + {"label": "'", "matrix": [0, 10], "x": 11.75, "y": 3.5}, + {"label": "#", "matrix": [6, 10], "x": 12.75, "y": 3.5}, + {"label": "Enter", "matrix": [6, 6], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2}, + + {"label": "4", "matrix": [1, 11], "x": 19, "y": 3.5}, + {"label": "5", "matrix": [1, 12], "x": 20, "y": 3.5}, + {"label": "6", "matrix": [1, 13], "x": 21, "y": 3.5}, + + {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25}, + {"label": "\\", "matrix": [0, 3], "x": 1.25, "y": 4.5}, + {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5}, + {"label": ",", "matrix": [6, 8], "x": 9.25, "y": 4.5}, + {"label": ".", "matrix": [6, 9], "x": 10.25, "y": 4.5}, + {"label": "/", "matrix": [7, 10], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75}, + + {"label": "\u2191", "matrix": [0, 14], "x": 16.5, "y": 4.5}, + + {"label": "1", "matrix": [5, 11], "x": 19, "y": 4.5}, + {"label": "2", "matrix": [5, 12], "x": 20, "y": 4.5}, + {"label": "3", "matrix": [5, 13], "x": 21, "y": 4.5}, + {"label": "Enter", "matrix": [5, 14], "x": 22, "y": 4.5, "h": 2}, + + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5}, + {"label": "Space", "matrix": [7, 6], "x": 4, "y": 5.5, "w": 7}, + {"label": "Alt Gr", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5}, + {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5}, + + {"label": "\u2190", "matrix": [7, 14], "x": 15.5, "y": 5.5}, + {"label": "\u2193", "matrix": [7, 11], "x": 16.5, "y": 5.5}, + {"label": "\u2192", "matrix": [7, 12], "x": 17.5, "y": 5.5}, + + {"label": "0", "matrix": [0, 11], "x": 19, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [0, 13], "x": 21, "y": 5.5} + ] + } + } +} diff --git a/keyboards/ibm/model_m/yacobo/keymaps/default/keymap.c b/keyboards/ibm/model_m/yacobo/keymaps/default/keymap.c new file mode 100644 index 0000000000..27647d4ed3 --- /dev/null +++ b/keyboards/ibm/model_m/yacobo/keymaps/default/keymap.c @@ -0,0 +1,30 @@ +/* Copyright 2021 Stephen Edwards + * + * 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 . + * + * Adapted from the Model H Project by Jonathan Hawthorn. + */ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_fullsize_ansi_wkl( /* Base layer */ + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT + ), +}; diff --git a/keyboards/ibm/model_m/yacobo/readme.md b/keyboards/ibm/model_m/yacobo/readme.md new file mode 100644 index 0000000000..d0cafa1d44 --- /dev/null +++ b/keyboards/ibm/model_m/yacobo/readme.md @@ -0,0 +1,28 @@ +# yacobo + +![yacobo](https://i.imgur.com/1nfuWoa.jpeg) + +*A replacement qmk-compatible control board for the 101-key Model M keyboards. +Inspired by and based on the ModelH by jhawthorn, in comparison this design uses 100% through-hole components, including the widely available STM32F103C8T6 "Blue Pill" development board, for ease of assembly.* + +* Keyboard Maintainer: [Stephen Edwards](https://github.com/sje-mse) +* Hardware Supported: IBM 101-key Model M with Yacobo replacement control boards. +* Hardware Availability: [Yacobo PCB](https://github.com/sje-mse/yacobo). + +Make example for this keyboard (after setting up your build environment): + + make yacobo:default + +Flashing example for this keyboard: + + make yacobo: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**: Press the "Reset" button on the Blue Pill daughterboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/ibm/model_m/yacobo/yacobo.c b/keyboards/ibm/model_m/yacobo/yacobo.c new file mode 100644 index 0000000000..7664facacc --- /dev/null +++ b/keyboards/ibm/model_m/yacobo/yacobo.c @@ -0,0 +1,26 @@ +/* Copyright 2024 Stephen Edwards + * + * 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 . + * + * Adapted from the Model H Project by Jonathan Hawthorn. + */ + +#include "quantum.h" + + +void keyboard_pre_init_kb(void) { + gpio_set_pin_output(BLUE_PILL_STATUS_LED); + gpio_write_pin(BLUE_PILL_STATUS_LED, 0); + keyboard_pre_init_user(); +} From a794ceeb5168cf82bdbe6d10690596b9cda6fcc3 Mon Sep 17 00:00:00 2001 From: GustawXYZ <129527844+GustawXYZ@users.noreply.github.com> Date: Wed, 4 Dec 2024 00:09:24 +0100 Subject: [PATCH 048/592] [Keyboard] Add dactyl_manuform_pi_pico (#23891) Adds new keyboard under handwired/dactyl_manuform_pi_pico It is a dactyl_manuform(5x6) running on Pi Pico micro controller --- .../dactyl_manuform_pi_pico/config.h | 9 ++ .../dactyl_manuform_pi_pico/keyboard.json | 123 ++++++++++++++++++ .../keymaps/default/keymap.c | 65 +++++++++ .../dactyl_manuform_pi_pico/readme.md | 32 +++++ 4 files changed, 229 insertions(+) create mode 100644 keyboards/handwired/dactyl_manuform_pi_pico/config.h create mode 100644 keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json create mode 100644 keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform_pi_pico/readme.md diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/config.h b/keyboards/handwired/dactyl_manuform_pi_pico/config.h new file mode 100644 index 0000000000..c622149a4a --- /dev/null +++ b/keyboards/handwired/dactyl_manuform_pi_pico/config.h @@ -0,0 +1,9 @@ +// Copyright 2023 Gustaw.xyz (@Gustaw.xyz) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP9 +#define SERIAL_USART_RX_PIN GP8 diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json new file mode 100644 index 0000000000..57202c802a --- /dev/null +++ b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json @@ -0,0 +1,123 @@ +{ + "manufacturer": "GustawXYZ", + "keyboard_name": "dactyl_manuform_pi_pico", + "maintainer": "GustawXYZ", + "bootloader": "rp2040", + "processor": "RP2040", + "url": "https://github.com/GustawXYZ/dactyl_manuform_pi_pico", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP22" + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "watchdog": true + } + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP10", "GP11", "GP12", "GP13", "GP14", "GP15"], + "rows": ["GP21", "GP20", "GP19", "GP18", "GP17", "GP16"] + }, + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + + {"matrix": [6, 0], "x": 11, "y": 0}, + {"matrix": [6, 1], "x": 12, "y": 0}, + {"matrix": [6, 2], "x": 13, "y": 0}, + {"matrix": [6, 3], "x": 14, "y": 0}, + {"matrix": [6, 4], "x": 15, "y": 0}, + {"matrix": [6, 5], "x": 16, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [7, 0], "x": 11, "y": 1}, + {"matrix": [7, 1], "x": 12, "y": 1}, + {"matrix": [7, 2], "x": 13, "y": 1}, + {"matrix": [7, 3], "x": 14, "y": 1}, + {"matrix": [7, 4], "x": 15, "y": 1}, + {"matrix": [7, 5], "x": 16, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [8, 0], "x": 11, "y": 2}, + {"matrix": [8, 1], "x": 12, "y": 2}, + {"matrix": [8, 2], "x": 13, "y": 2}, + {"matrix": [8, 3], "x": 14, "y": 2}, + {"matrix": [8, 4], "x": 15, "y": 2}, + {"matrix": [8, 5], "x": 16, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + + {"matrix": [9, 0], "x": 11, "y": 3}, + {"matrix": [9, 1], "x": 12, "y": 3}, + {"matrix": [9, 2], "x": 13, "y": 3}, + {"matrix": [9, 3], "x": 14, "y": 3}, + {"matrix": [9, 4], "x": 15, "y": 3}, + {"matrix": [9, 5], "x": 16, "y": 3}, + + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + + {"matrix": [10, 2], "x": 13, "y": 4}, + {"matrix": [10, 3], "x": 14, "y": 4}, + + {"matrix": [4, 4], "x": 4, "y": 5}, + {"matrix": [4, 5], "x": 5, "y": 5}, + + {"matrix": [10, 0], "x": 11, "y": 5}, + {"matrix": [10, 1], "x": 12, "y": 5}, + + {"matrix": [5, 4], "x": 6, "y": 6}, + {"matrix": [5, 5], "x": 7, "y": 6}, + + {"matrix": [11, 0], "x": 9, "y": 6}, + {"matrix": [11, 1], "x": 10, "y": 6}, + + {"matrix": [5, 2], "x": 6, "y": 7}, + {"matrix": [5, 3], "x": 7, "y": 7}, + + {"matrix": [11, 2], "x": 9, "y": 7}, + {"matrix": [11, 3], "x": 10, "y": 7} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c new file mode 100644 index 0000000000..cd78aef7a9 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + _QWERTY, + _SYMBOLS, + _GAMING, + _ARROWS, + _WINMGR, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, 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, + LALT(KC_LSFT), LALT(KC_SPC), LALT(KC_SPC), LGUI(KC_LALT), + KC_SPC, TT(_SYMBOLS), TT(_ARROWS), LALT(KC_ENTER), + KC_LCTL, KC_LGUI, KC_LGUI, KC_RCTL, + KC_LALT, TT(_WINMGR), TT(_GAMING), KC_LALT), + + [_SYMBOLS] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS_LOCK, LSFT(KC_BSLS), KC_BSLS, LSFT(KC_LBRC), LSFT(KC_RBRC), KC_TRNS, KC_TRNS, LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LCTL(KC_EQUAL), LGUI(KC_EQUAL), + TO(_QWERTY), LSFT(KC_EQUAL), KC_MINUS, LSFT(KC_9), LSFT(KC_0), KC_GRAVE, KC_BSLS, LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LCTL(KC_MINUS), LGUI(KC_MINUS), + KC_TRNS, KC_EQUAL, LSFT(KC_MINUS), KC_LBRC, KC_RBRC, LSFT(KC_GRAVE), LSFT(KC_BSLS), LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), KC_COMMA, KC_CALC, + KC_TRNS, KC_TRNS, LSFT(KC_0), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, LSFT(KC_0), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + QK_RBT, KC_TRNS, KC_TRNS, KC_TRNS), + + [_GAMING] = LAYOUT( + KC_6, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_7, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_ESC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, + KC_8, KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_9, KC_0, KC_TRNS, KC_TRNS, + KC_SPC, MO(_ARROWS), KC_TRNS, KC_ENTER, + KC_G, KC_M, KC_TRNS, KC_TRNS, + KC_LALT, TO(_QWERTY), TO(_QWERTY), KC_TRNS), + + [_ARROWS] = LAYOUT( + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_NUM, KC_KP_SLASH, KC_P7, KC_P8, KC_P9, KC_MINUS, LCTL(KC_LEFT), LCTL(KC_DOWN), LCTL(KC_UP), LCTL(KC_RGHT), KC_TRNS, KC_DELETE, + TO(_QWERTY), KC_KP_PLUS, KC_P4, KC_P5, KC_P6, KC_DOT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_PSCR, + KC_UNDS, KC_KP_MINUS, KC_P1, KC_P2, KC_P3, KC_COMMA, KC_HOME, KC_MPLY, KC_MPRV, KC_MNXT, KC_MUTE, KC_INS, + KC_KP_DOT, KC_P0, KC_VOLD, KC_VOLU, + KC_P0, TO(_WINMGR), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, QK_RBT), + + [_WINMGR] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_F1, LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), KC_F4, KC_F7, SGUI(KC_7), SGUI(KC_8), SGUI(KC_9), KC_F10, KC_TRNS, + TO(_QWERTY), KC_F2, LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), KC_F5, KC_F8, SGUI(KC_4), SGUI(KC_5), SGUI(KC_6), KC_F11, KC_TRNS, + KC_TRNS, KC_F3, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), KC_F6, KC_F9, SGUI(KC_1), SGUI(KC_2), SGUI(KC_3), KC_F12, KC_TRNS, + KC_TRNS, LGUI(KC_0), SGUI(KC_0), KC_TRNS, + LGUI(KC_0), KC_TRNS, KC_TRNS, SGUI(KC_0), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + LCTL(LGUI(KC_Q)), KC_TRNS, KC_TRNS, KC_TRNS) +}; + diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/readme.md b/keyboards/handwired/dactyl_manuform_pi_pico/readme.md new file mode 100644 index 0000000000..808f030fb0 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform_pi_pico/readme.md @@ -0,0 +1,32 @@ +# dactyl_manuform_pi_pico + +![dactyl_manuform_pi_pico](https://i.imgur.com/T9b74bI.jpg) + +This is a dactyl_manuform 5x6 running Rasrberry Pi Pico. +It's based on alcor_dactyl but with more reasonable GPIO layout for Pi Pico +and clasic dactyl_manuform layout (pinkies have only 4 rows). + +Build instructions: https://github.com/GustawXYZ/dactyl_manuform_pi_pico/ + +* Keyboard Maintainer: [Gustaw.xyz](https://github.com/Gustaw.xyz) +* Hardware Supported: Raspberry Pi Pico and other RP2040 +* Hardware Availability: https://www.raspberrypi.com/products/raspberry-pi-pico/ +* 3D Print model: https://github.com/abstracthat/dactyl-manuform + +Make example for this keyboard (after setting up your build environment): + + make handwired/dactyl_manuform_pi_pico:default + +Flashing example for this keyboard: + + make handwired/dactyl_manuform_pi_pico: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 c2bc6e2b3c4edd20587b881b480232734f966212 Mon Sep 17 00:00:00 2001 From: Can Baytok Date: Wed, 4 Dec 2024 17:37:02 +0100 Subject: [PATCH 049/592] [Keyboard] Add cans12erv2 (#24628) Co-authored-by: jack Co-authored-by: Duncan Sutherland Co-authored-by: Drashna Jaelre Co-authored-by: Can Baytok --- keyboards/handwired/cans12erv2/keyboard.json | 49 +++++++++++++++++++ .../cans12erv2/keymaps/default/keymap.c | 17 +++++++ .../cans12erv2/keymaps/default/rules.mk | 1 + keyboards/handwired/cans12erv2/readme.md | 27 ++++++++++ 4 files changed, 94 insertions(+) create mode 100644 keyboards/handwired/cans12erv2/keyboard.json create mode 100644 keyboards/handwired/cans12erv2/keymaps/default/keymap.c create mode 100644 keyboards/handwired/cans12erv2/keymaps/default/rules.mk create mode 100644 keyboards/handwired/cans12erv2/readme.md diff --git a/keyboards/handwired/cans12erv2/keyboard.json b/keyboards/handwired/cans12erv2/keyboard.json new file mode 100644 index 0000000000..ed0e78cd94 --- /dev/null +++ b/keyboards/handwired/cans12erv2/keyboard.json @@ -0,0 +1,49 @@ +{ + "manufacturer": "Can Baytok", + "keyboard_name": "Cans12erV2", + "maintainer": "canbaytok", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP14", "pin_b": "GP15"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP9", "GP10", "GP11", "GP12"], + "rows": ["GP13", "GP7", "GP8"] + }, + "host_language": "german", + "processor": "RP2040", + "url": "https://github.com/canbaytok/Cans12erV2", + "usb": { + "device_version": "1.0.0", + "pid": "0xABC0", + "vid": "0x4342" + }, + "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, "encoder": 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}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + } +} diff --git a/keyboards/handwired/cans12erv2/keymaps/default/keymap.c b/keyboards/handwired/cans12erv2/keymaps/default/keymap.c new file mode 100644 index 0000000000..0619369bb2 --- /dev/null +++ b/keyboards/handwired/cans12erv2/keymaps/default/keymap.c @@ -0,0 +1,17 @@ +// Copyright 2024 Can Baytok (https://github.com/canbaytok) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_A, KC_B, KC_C, KC_D, + KC_E, KC_F, KC_G, KC_H, + KC_I, KC_J, KC_K, KC_L + ) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } +}; +#endif diff --git a/keyboards/handwired/cans12erv2/keymaps/default/rules.mk b/keyboards/handwired/cans12erv2/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/handwired/cans12erv2/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/handwired/cans12erv2/readme.md b/keyboards/handwired/cans12erv2/readme.md new file mode 100644 index 0000000000..fa08efacc7 --- /dev/null +++ b/keyboards/handwired/cans12erv2/readme.md @@ -0,0 +1,27 @@ +# Cans12erV2 +![Cans12erV2](https://i.imgur.com/3fkbydJ.png) + +New version of my 12-key orthogonal macro keypad with hot swappable keyswitch support and an encoder knob. + +* Keyboard Maintainer: [Can Baytok](https://github.com/canbaytok) +* Build Instructions: [Github](https://github.com/canbaytok/Cans12erV2) +* Hardware Supported: RP2040 Zero +* Hardware Availability: amazon, aliexpress (RP2040 Zero clones work too) + +Make example for this keyboard (after setting up your build environment): + + make handwired/cans12erv2:default + +Flashing example for this keyboard: + + make handwired/cans12erv2: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**: Quickly double press the reset button on the PCB to make the RP2040 boot into its uf2 mode +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 88d4462e528a64a50942b718e9b7705b4d6dd3dd Mon Sep 17 00:00:00 2001 From: Marco Pelegrini Date: Wed, 4 Dec 2024 08:51:40 -0800 Subject: [PATCH 050/592] [Keyboard] Add Marcopad (#24636) * Marcopad debut * Applying core review suggestions * Optional layout with backlit * Line feeds and replacing dev board configs * Function to toggle backlight * Move to RGB Matrix * Fixing capitalization * Review comments --------- Co-authored-by: Marco Pelegrini --- keyboards/marcopad/keyboard.json | 80 +++++++++++++++++++++ keyboards/marcopad/keymaps/backlit/keymap.c | 44 ++++++++++++ keyboards/marcopad/keymaps/backlit/rules.mk | 4 ++ keyboards/marcopad/keymaps/default/keymap.c | 21 ++++++ keyboards/marcopad/readme.md | 27 +++++++ 5 files changed, 176 insertions(+) create mode 100644 keyboards/marcopad/keyboard.json create mode 100644 keyboards/marcopad/keymaps/backlit/keymap.c create mode 100644 keyboards/marcopad/keymaps/backlit/rules.mk create mode 100644 keyboards/marcopad/keymaps/default/keymap.c create mode 100644 keyboards/marcopad/readme.md diff --git a/keyboards/marcopad/keyboard.json b/keyboards/marcopad/keyboard.json new file mode 100644 index 0000000000..c0a8ca37c0 --- /dev/null +++ b/keyboards/marcopad/keyboard.json @@ -0,0 +1,80 @@ +{ + "manufacturer": "pelegrini.ca", + "keyboard_name": "MarcoPad", + "maintainer": "Marco Pelegrini", + "bootloader": "rp2040", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP4", "GP26", "GP27"], + "rows": ["GP15", "GP14", "GP29"] + }, + "processor": "RP2040", + "rgb_matrix": { + "animations": { + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "dual_beacon": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive": true, + "solid_reactive_multicross": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "splash": true, + "typing_heatmap": true + }, + "default": { + "animation": "splash", + "hue": 132, + "sat": 102, + "speed": 80, + "val": 255 + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 0, "y": 32, "flags": 4}, + {"matrix": [0, 2], "x": 0, "y": 64, "flags": 4}, + {"matrix": [1, 0], "x": 112, "y": 0, "flags": 4}, + {"matrix": [1, 1], "x": 112, "y": 32, "flags": 4}, + {"matrix": [1, 2], "x": 112, "y": 64, "flags": 4}, + {"matrix": [2, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [2, 1], "x": 224, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 224, "y": 64, "flags": 4} + ], + "sleep": true + }, + "url": "https://pelegrini.ca/marcopad", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP28" + }, + "community_layouts": ["ortho_3x3"], + "layouts": { + "LAYOUT_ortho_3x3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 0, "y": 1}, + {"matrix": [0, 2], "x": 0, "y": 2}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 1, "y": 2}, + {"matrix": [2, 0], "x": 2, "y": 0}, + {"matrix": [2, 1], "x": 2, "y": 1}, + {"matrix": [2, 2], "x": 2, "y": 2} + ] + } + } +} diff --git a/keyboards/marcopad/keymaps/backlit/keymap.c b/keyboards/marcopad/keymaps/backlit/keymap.c new file mode 100644 index 0000000000..d70df8e6f7 --- /dev/null +++ b/keyboards/marcopad/keymaps/backlit/keymap.c @@ -0,0 +1,44 @@ +// Copyright (c) 2022 Marco Pelegrini +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┐ + * │ 7 │ 8 │ 9 │ + * ├───┼───┼───┤ + * │ 4 │ 5 │ 6 │ + * ├───┼───┼───┤ + * │ 1 │ 2 │ 3 │ + * └───┴───┴───┘ + */ + [0] = LAYOUT_ortho_3x3( + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, + KC_P1, KC_P2, KC_P3 + ) +}; + +const uint16_t PROGMEM backlight_next[] = {KC_P7, KC_P8, COMBO_END}; +const uint16_t PROGMEM backlight_toggle[] = {KC_P7, KC_P9, COMBO_END}; +const uint16_t PROGMEM hue_up[] = {KC_P7, KC_P4, COMBO_END}; +const uint16_t PROGMEM hue_down[] = {KC_P7, KC_P1, COMBO_END}; +const uint16_t PROGMEM sat_up[] = {KC_P7, KC_P5, COMBO_END}; +const uint16_t PROGMEM sat_down[] = {KC_P7, KC_P2, COMBO_END}; +const uint16_t PROGMEM value_up[] = {KC_P7, KC_P6, COMBO_END}; +const uint16_t PROGMEM value_down[] = {KC_P7, KC_P3, COMBO_END}; +const uint16_t PROGMEM speed_up[] = {KC_P8, KC_P4, COMBO_END}; +const uint16_t PROGMEM speed_down[] = {KC_P8, KC_P1, COMBO_END}; +combo_t key_combos[] = { + COMBO(backlight_next, RGB_MODE_FORWARD), + COMBO(backlight_toggle, RGB_TOG), + COMBO(hue_up, RGB_HUI), + COMBO(hue_down, RGB_HUD), + COMBO(sat_up, RGB_SAI), + COMBO(sat_down, RGB_SAD), + COMBO(value_up, RGB_VAI), + COMBO(value_down, RGB_VAD), + COMBO(speed_up, RGB_SPI), + COMBO(speed_down, RGB_SPD) +}; diff --git a/keyboards/marcopad/keymaps/backlit/rules.mk b/keyboards/marcopad/keymaps/backlit/rules.mk new file mode 100644 index 0000000000..c358f54605 --- /dev/null +++ b/keyboards/marcopad/keymaps/backlit/rules.mk @@ -0,0 +1,4 @@ +# Copyright (c) 2022 Marco Pelegrini +# SPDX-License-Identifier: GPL-2.0-or-later + +COMBO_ENABLE = yes diff --git a/keyboards/marcopad/keymaps/default/keymap.c b/keyboards/marcopad/keymaps/default/keymap.c new file mode 100644 index 0000000000..b892c0e80c --- /dev/null +++ b/keyboards/marcopad/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// Copyright (c) 2022 Marco Pelegrini +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┐ + * │ 7 │ 8 │ 9 │ + * ├───┼───┼───┤ + * │ 4 │ 5 │ 6 │ + * ├───┼───┼───┤ + * │ 1 │ 2 │ 3 │ + * └───┴───┴───┘ + */ + [0] = LAYOUT_ortho_3x3( + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, + KC_P1, KC_P2, KC_P3 + ) +}; diff --git a/keyboards/marcopad/readme.md b/keyboards/marcopad/readme.md new file mode 100644 index 0000000000..6bc1733f30 --- /dev/null +++ b/keyboards/marcopad/readme.md @@ -0,0 +1,27 @@ +# MarcoPad + +![marcopad](https://i.imgur.com/AnC9SeW.png) + +*A compact 3x3 keys macropad built with RP-2040 Zero* + +* Keyboard Maintainer: [pelegrini.ca](https://pelegrini.ca/marcopad) +* Hardware Supported: [MarcoPad](https://pelegrini.ca/marcopad) +* Hardware Availability: [MarcoPad](https://pelegrini.ca/marcopad) + +Make example for this keyboard (after setting up your build environment): + + make marcopad:default + +Flashing example for this keyboard: + + make marcopad: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 (top left key) and plug in the keyboard +* **Physical reset button**: Using 2 paperclips, press and hold the BOOT button, then short press the RESET button on the back of the MarcoPad +* **Physical reset button + plug in**: Using a paperclip, press and hold the BOOT button, then plug in the MarcoPad From 8094a1d182a64f1188ff9d952d71c8f6c267d823 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:55:08 +0100 Subject: [PATCH 051/592] Addition of EC Constellation (#24644) * Addition of EC Constellation * Fix layout macro name --- keyboards/cipulot/ec_constellation/config.h | 63 ++++++ keyboards/cipulot/ec_constellation/halconf.h | 21 ++ .../cipulot/ec_constellation/keyboard.json | 185 ++++++++++++++++++ .../keymaps/65_ansi_rwkl/keymap.c | 43 ++++ .../ec_constellation/keymaps/default/keymap.c | 43 ++++ keyboards/cipulot/ec_constellation/mcuconf.h | 22 +++ .../cipulot/ec_constellation/post_rules.mk | 1 + keyboards/cipulot/ec_constellation/readme.md | 26 +++ keyboards/cipulot/ec_constellation/rules.mk | 1 + 9 files changed, 405 insertions(+) create mode 100644 keyboards/cipulot/ec_constellation/config.h create mode 100644 keyboards/cipulot/ec_constellation/halconf.h create mode 100644 keyboards/cipulot/ec_constellation/keyboard.json create mode 100644 keyboards/cipulot/ec_constellation/keymaps/65_ansi_rwkl/keymap.c create mode 100644 keyboards/cipulot/ec_constellation/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/ec_constellation/mcuconf.h create mode 100644 keyboards/cipulot/ec_constellation/post_rules.mk create mode 100644 keyboards/cipulot/ec_constellation/readme.md create mode 100644 keyboards/cipulot/ec_constellation/rules.mk diff --git a/keyboards/cipulot/ec_constellation/config.h b/keyboards/cipulot/ec_constellation/config.h new file mode 100644 index 0000000000..1a2ecf54a0 --- /dev/null +++ b/keyboards/cipulot/ec_constellation/config.h @@ -0,0 +1,63 @@ +/* Copyright 2024 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 MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +#define UNUSED_POSITIONS_LIST { {3, 1}, {4, 3}, {4, 4}, {4, 5}, {4, 7}, {4, 8}, {4, 9} } + +#define MATRIX_ROW_PINS \ + { A8, A15, B12, B8, B9 } + +#define AMUX_COUNT 1 +#define AMUX_MAX_COLS_COUNT 15 + +#define AMUX_EN_PINS \ + { B5 } + +#define AMUX_SEL_PINS \ + { B6, B7, B4, B3 } + +#define AMUX_COL_CHANNELS_SIZES \ + { 15 } + +#define AMUX_0_COL_CHANNELS \ + { 7, 6, 5, 4, 3, 2, 1, 0, 9, 15, 14, 13, 10, 11, 12} + +#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS + +#define DISCHARGE_PIN A2 +#define ANALOG_PORT A3 + +#define DEFAULT_ACTUATION_MODE 0 +#define DEFAULT_MODE_0_ACTUATION_LEVEL 550 +#define DEFAULT_MODE_0_RELEASE_LEVEL 500 +#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL +#define DEFAULT_MODE_1_ACTUATION_OFFSET 70 +#define DEFAULT_MODE_1_RELEASE_OFFSET 70 +#define DEFAULT_EXTREMUM 1023 +#define EXPECTED_NOISE_FLOOR 0 +#define NOISE_FLOOR_THRESHOLD 50 +#define BOTTOMING_CALIBRATION_THRESHOLD 50 +#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30 +#define DEFAULT_BOTTOMING_READING 1023 +#define DEFAULT_CALIBRATION_STARTER true + +#define DISCHARGE_TIME 10 + +#define EECONFIG_KB_DATA_SIZE 159 diff --git a/keyboards/cipulot/ec_constellation/halconf.h b/keyboards/cipulot/ec_constellation/halconf.h new file mode 100644 index 0000000000..6b63cb5af9 --- /dev/null +++ b/keyboards/cipulot/ec_constellation/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024 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_ADC TRUE + +#include_next diff --git a/keyboards/cipulot/ec_constellation/keyboard.json b/keyboards/cipulot/ec_constellation/keyboard.json new file mode 100644 index 0000000000..15187c472f --- /dev/null +++ b/keyboards/cipulot/ec_constellation/keyboard.json @@ -0,0 +1,185 @@ +{ + "manufacturer": "Cipulot", + "keyboard_name": "Constellation EC", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "processor": "STM32F411", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x6BC9", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "layout_aliases": { + "LAYOUT_all": "LAYOUT_65_ansi_rwkl_split_bs" + }, + "layouts": { + "LAYOUT_65_ansi_rwkl": { + "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, 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, "w": 2.25}, + {"matrix": [2, 13], "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": [3, 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": 6.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_rwkl_split_bs": { + "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, "w": 2.25}, + {"matrix": [2, 13], "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": [3, 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": 6.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.25}, + {"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/cipulot/ec_constellation/keymaps/65_ansi_rwkl/keymap.c b/keyboards/cipulot/ec_constellation/keymaps/65_ansi_rwkl/keymap.c new file mode 100644 index 0000000000..acc4c91e4c --- /dev/null +++ b/keyboards/cipulot/ec_constellation/keymaps/65_ansi_rwkl/keymap.c @@ -0,0 +1,43 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_65_ansi_rwkl( + 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_HOME, + 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_ENT, 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, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_65_ansi_rwkl( + 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, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT_65_ansi_rwkl( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_constellation/keymaps/default/keymap.c b/keyboards/cipulot/ec_constellation/keymaps/default/keymap.c new file mode 100644 index 0000000000..18d1418be2 --- /dev/null +++ b/keyboards/cipulot/ec_constellation/keymaps/default/keymap.c @@ -0,0 +1,43 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_65_ansi_rwkl_split_bs( + 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_HOME, + 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_ENT, 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, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_65_ansi_rwkl_split_bs( + 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, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT_65_ansi_rwkl_split_bs( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_constellation/mcuconf.h b/keyboards/cipulot/ec_constellation/mcuconf.h new file mode 100644 index 0000000000..1679d3fbc0 --- /dev/null +++ b/keyboards/cipulot/ec_constellation/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 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_ADC_USE_ADC1 +#define STM32_ADC_USE_ADC1 TRUE diff --git a/keyboards/cipulot/ec_constellation/post_rules.mk b/keyboards/cipulot/ec_constellation/post_rules.mk new file mode 100644 index 0000000000..5dba48cc5f --- /dev/null +++ b/keyboards/cipulot/ec_constellation/post_rules.mk @@ -0,0 +1 @@ +include keyboards/cipulot/common/common_cipulot.mk diff --git a/keyboards/cipulot/ec_constellation/readme.md b/keyboards/cipulot/ec_constellation/readme.md new file mode 100644 index 0000000000..16bbdcdf6f --- /dev/null +++ b/keyboards/cipulot/ec_constellation/readme.md @@ -0,0 +1,26 @@ +# Constellation EC + +![Constellation EC](https://i.imgur.com/ndgUV63.jpeg) + +EC version of the Constellation keyboard. + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: Constellation EC PCB +* Hardware Availability: [Keyboard Treehouse](https://keyboardtreehouse.com/collections/constellation) + +Make example for this keyboard (after setting up your build environment): + + make cipulot/ec_constellation:default + +Flashing example for this keyboard: + + make cipulot/ec_constellation: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: + +* **Physical reset**: Long short the exposed pins on the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cipulot/ec_constellation/rules.mk b/keyboards/cipulot/ec_constellation/rules.mk new file mode 100644 index 0000000000..1716098b3e --- /dev/null +++ b/keyboards/cipulot/ec_constellation/rules.mk @@ -0,0 +1 @@ +OPT = 3 From 5dc92edf11946dca663c6723d8039e734126ccb0 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Wed, 4 Dec 2024 17:57:16 +0100 Subject: [PATCH 052/592] Addition of EC1-AT (#24645) --- keyboards/cipulot/ec1_at/config.h | 61 ++++++++ keyboards/cipulot/ec1_at/halconf.h | 21 +++ keyboards/cipulot/ec1_at/keyboard.json | 142 ++++++++++++++++++ .../cipulot/ec1_at/keymaps/default/keymap.c | 42 ++++++ keyboards/cipulot/ec1_at/mcuconf.h | 22 +++ keyboards/cipulot/ec1_at/post_rules.mk | 1 + keyboards/cipulot/ec1_at/readme.md | 26 ++++ keyboards/cipulot/ec1_at/rules.mk | 1 + 8 files changed, 316 insertions(+) create mode 100644 keyboards/cipulot/ec1_at/config.h create mode 100644 keyboards/cipulot/ec1_at/halconf.h create mode 100644 keyboards/cipulot/ec1_at/keyboard.json create mode 100644 keyboards/cipulot/ec1_at/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/ec1_at/mcuconf.h create mode 100644 keyboards/cipulot/ec1_at/post_rules.mk create mode 100644 keyboards/cipulot/ec1_at/readme.md create mode 100644 keyboards/cipulot/ec1_at/rules.mk diff --git a/keyboards/cipulot/ec1_at/config.h b/keyboards/cipulot/ec1_at/config.h new file mode 100644 index 0000000000..5e7af3fac5 --- /dev/null +++ b/keyboards/cipulot/ec1_at/config.h @@ -0,0 +1,61 @@ +/* Copyright 2024 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 MATRIX_ROWS 5 +#define MATRIX_COLS 21 + +#define UNUSED_POSITIONS_LIST { {2, 16}, {4, 5}, {4, 7}, {4, 9}, {4, 12}, {4, 16} } + +#define MATRIX_ROW_PINS {A8, B15, B14, B12, B13} + +#define AMUX_COUNT 2 +#define AMUX_MAX_COLS_COUNT 16 + +#define AMUX_EN_PINS {B5, A15} + +#define AMUX_SEL_PINS {B6, B7, B4, B3} + +#define AMUX_COL_CHANNELS_SIZES {16, 5} + +#define AMUX_0_COL_CHANNELS {5, 6, 7, 4, 3, 2, 1, 0, 8, 15, 14, 13, 12, 10, 9, 11} + +#define AMUX_1_COL_CHANNELS {4, 2, 1, 0, 3} + +#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS + +#define DISCHARGE_PIN A2 +#define ANALOG_PORT A3 + +#define DEFAULT_ACTUATION_MODE 0 +#define DEFAULT_MODE_0_ACTUATION_LEVEL 550 +#define DEFAULT_MODE_0_RELEASE_LEVEL 500 +#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL +#define DEFAULT_MODE_1_ACTUATION_OFFSET 70 +#define DEFAULT_MODE_1_RELEASE_OFFSET 70 +#define DEFAULT_EXTREMUM 1023 +#define EXPECTED_NOISE_FLOOR 0 +#define NOISE_FLOOR_THRESHOLD 50 +#define BOTTOMING_CALIBRATION_THRESHOLD 50 +#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30 +#define DEFAULT_BOTTOMING_READING 1023 +#define DEFAULT_CALIBRATION_STARTER true + +#define DISCHARGE_TIME 10 + +#define EECONFIG_KB_DATA_SIZE 219 +#define DYNAMIC_KEYMAP_MACRO_COUNT 30 diff --git a/keyboards/cipulot/ec1_at/halconf.h b/keyboards/cipulot/ec1_at/halconf.h new file mode 100644 index 0000000000..6b63cb5af9 --- /dev/null +++ b/keyboards/cipulot/ec1_at/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024 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_ADC TRUE + +#include_next diff --git a/keyboards/cipulot/ec1_at/keyboard.json b/keyboards/cipulot/ec1_at/keyboard.json new file mode 100644 index 0000000000..9a7a0ae04e --- /dev/null +++ b/keyboards/cipulot/ec1_at/keyboard.json @@ -0,0 +1,142 @@ +{ + "manufacturer": "Cipulot", + "keyboard_name": "EC1-AT", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 16384 + } + }, + "features": { + "bootmagic": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "processor": "STM32F411", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x6BCE", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.25, "y": 0}, + {"matrix": [0, 6], "x": 6.25, "y": 0}, + {"matrix": [0, 7], "x": 7.25, "y": 0}, + {"matrix": [0, 8], "x": 8.25, "y": 0}, + {"matrix": [0, 9], "x": 9.25, "y": 0}, + {"matrix": [0, 10], "x": 10.25, "y": 0}, + {"matrix": [0, 11], "x": 11.25, "y": 0}, + {"matrix": [0, 12], "x": 12.25, "y": 0}, + {"matrix": [0, 13], "x": 13.25, "y": 0}, + {"matrix": [0, 14], "x": 14.25, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.5, "y": 0}, + {"matrix": [0, 18], "x": 18.5, "y": 0}, + {"matrix": [0, 19], "x": 19.5, "y": 0}, + {"matrix": [0, 20], "x": 20.5, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2.25, "y": 1, "w": 1.5}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 10], "x": 10.75, "y": 1}, + {"matrix": [1, 11], "x": 11.75, "y": 1}, + {"matrix": [1, 12], "x": 12.75, "y": 1}, + {"matrix": [1, 13], "x": 13.75, "y": 1}, + {"matrix": [1, 14], "x": 14.75, "y": 1}, + {"matrix": [1, 15], "x": 15.75, "y": 1, "w": 0.75}, + {"matrix": [1, 16], "x": 16.5, "y": 1, "w": 0.75}, + {"matrix": [1, 17], "x": 17.5, "y": 1}, + {"matrix": [1, 18], "x": 18.5, "y": 1}, + {"matrix": [1, 19], "x": 19.5, "y": 1}, + {"matrix": [1, 20], "x": 20.5, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2.25, "y": 2, "w": 1.75}, + {"matrix": [2, 3], "x": 4, "y": 2}, + {"matrix": [2, 4], "x": 5, "y": 2}, + {"matrix": [2, 5], "x": 6, "y": 2}, + {"matrix": [2, 6], "x": 7, "y": 2}, + {"matrix": [2, 7], "x": 8, "y": 2}, + {"matrix": [2, 8], "x": 9, "y": 2}, + {"matrix": [2, 9], "x": 10, "y": 2}, + {"matrix": [2, 10], "x": 11, "y": 2}, + {"matrix": [2, 11], "x": 12, "y": 2}, + {"matrix": [2, 12], "x": 13, "y": 2}, + {"matrix": [2, 13], "x": 14, "y": 2}, + {"matrix": [2, 14], "x": 15, "y": 2}, + {"matrix": [2, 15], "x": 16, "y": 2, "w": 1.25}, + {"matrix": [2, 17], "x": 17.5, "y": 2}, + {"matrix": [2, 18], "x": 18.5, "y": 2}, + {"matrix": [2, 19], "x": 19.5, "y": 2}, + {"matrix": [2, 20], "x": 20.5, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3, "w": 1.25}, + {"matrix": [3, 3], "x": 3.5, "y": 3}, + {"matrix": [3, 4], "x": 4.5, "y": 3}, + {"matrix": [3, 5], "x": 5.5, "y": 3}, + {"matrix": [3, 6], "x": 6.5, "y": 3}, + {"matrix": [3, 7], "x": 7.5, "y": 3}, + {"matrix": [3, 8], "x": 8.5, "y": 3}, + {"matrix": [3, 9], "x": 9.5, "y": 3}, + {"matrix": [3, 10], "x": 10.5, "y": 3}, + {"matrix": [3, 11], "x": 11.5, "y": 3}, + {"matrix": [3, 12], "x": 12.5, "y": 3}, + {"matrix": [3, 13], "x": 13.5, "y": 3}, + {"matrix": [3, 14], "x": 14.5, "y": 3}, + {"matrix": [3, 15], "x": 15.5, "y": 3, "w": 0.75}, + {"matrix": [3, 16], "x": 16.25, "y": 3}, + {"matrix": [3, 17], "x": 17.5, "y": 3}, + {"matrix": [3, 18], "x": 18.5, "y": 3}, + {"matrix": [3, 19], "x": 19.5, "y": 3}, + {"matrix": [3, 20], "x": 20.5, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.5}, + {"matrix": [4, 3], "x": 3.75, "y": 4}, + {"matrix": [4, 4], "x": 4.75, "y": 4, "w": 1.5}, + {"matrix": [4, 6], "x": 6.25, "y": 4, "w": 1.5}, + {"matrix": [4, 8], "x": 7.75, "y": 4, "w": 2.5}, + {"matrix": [4, 10], "x": 10.25, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 11.75, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 13.25, "y": 4, "w": 1.5}, + {"matrix": [4, 14], "x": 14.75, "y": 4}, + {"matrix": [4, 15], "x": 15.75, "y": 4, "w": 1.5}, + {"matrix": [4, 17], "x": 17.5, "y": 4}, + {"matrix": [4, 18], "x": 18.5, "y": 4}, + {"matrix": [4, 19], "x": 19.5, "y": 4}, + {"matrix": [4, 20], "x": 20.5, "y": 4} + ] + } + } +} diff --git a/keyboards/cipulot/ec1_at/keymaps/default/keymap.c b/keyboards/cipulot/ec1_at/keymaps/default/keymap.c new file mode 100644 index 0000000000..b0e5e3aac3 --- /dev/null +++ b/keyboards/cipulot/ec1_at/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT( + _______, _______, 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_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_ENTER, KC_P7, KC_P8, KC_P9, KC_PMNS, + _______, _______, 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_P4, KC_P5, KC_P6, KC_PPLS, + _______, _______, 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_RSFT, MO(1), KC_P1, KC_P2, KC_P3, KC_PENT, + _______, _______, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RALT, MO(1), KC_RCTL, KC_P0, KC_P0, KC_PDOT, KC_PENT), + + [1] = LAYOUT( + _______, _______, _______, 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_UP, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RIGHT, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec1_at/mcuconf.h b/keyboards/cipulot/ec1_at/mcuconf.h new file mode 100644 index 0000000000..1679d3fbc0 --- /dev/null +++ b/keyboards/cipulot/ec1_at/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 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_ADC_USE_ADC1 +#define STM32_ADC_USE_ADC1 TRUE diff --git a/keyboards/cipulot/ec1_at/post_rules.mk b/keyboards/cipulot/ec1_at/post_rules.mk new file mode 100644 index 0000000000..5dba48cc5f --- /dev/null +++ b/keyboards/cipulot/ec1_at/post_rules.mk @@ -0,0 +1 @@ +include keyboards/cipulot/common/common_cipulot.mk diff --git a/keyboards/cipulot/ec1_at/readme.md b/keyboards/cipulot/ec1_at/readme.md new file mode 100644 index 0000000000..8e2081dae7 --- /dev/null +++ b/keyboards/cipulot/ec1_at/readme.md @@ -0,0 +1,26 @@ +# EC1-AT + +![EC1-AT](https://i.imgur.com/69OrQsh.png) + +EC version of the W1-AT keyboard. + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: EC1-AT +* Hardware Availability: TBD + +Make example for this keyboard (after setting up your build environment): + + make cipulot/ec1_at:default + +Flashing example for this keyboard: + + make cipulot/ec1_at: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: + +* **Physical reset**: Long press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cipulot/ec1_at/rules.mk b/keyboards/cipulot/ec1_at/rules.mk new file mode 100644 index 0000000000..1716098b3e --- /dev/null +++ b/keyboards/cipulot/ec1_at/rules.mk @@ -0,0 +1 @@ +OPT = 3 From d01303c060a9c9d33fa79ba0372ea7403ae18a3c Mon Sep 17 00:00:00 2001 From: kbd0 <108237598+kbd0@users.noreply.github.com> Date: Wed, 4 Dec 2024 12:07:26 -0500 Subject: [PATCH 053/592] [Keyboard] add kbd0 Curve0 60 ANSI (#24609) * add kbd0/curve0/60_ansi keyboard * Apply suggestions from code review Co-authored-by: jack * Apply suggestions from code review Co-authored-by: Duncan Sutherland --------- Co-authored-by: unknown Co-authored-by: jack Co-authored-by: Duncan Sutherland --- keyboards/kbd0/curve0/60_ansi/keyboard.json | 228 ++++++++++++++++++ .../60_ansi/keymaps/default/keymap.json | 22 ++ keyboards/kbd0/curve0/60_ansi/readme.md | 27 +++ 3 files changed, 277 insertions(+) create mode 100644 keyboards/kbd0/curve0/60_ansi/keyboard.json create mode 100644 keyboards/kbd0/curve0/60_ansi/keymaps/default/keymap.json create mode 100644 keyboards/kbd0/curve0/60_ansi/readme.md diff --git a/keyboards/kbd0/curve0/60_ansi/keyboard.json b/keyboards/kbd0/curve0/60_ansi/keyboard.json new file mode 100644 index 0000000000..64c39cd24e --- /dev/null +++ b/keyboards/kbd0/curve0/60_ansi/keyboard.json @@ -0,0 +1,228 @@ +{ + "manufacturer": "kbd0", + "keyboard_name": "kbd0/curve0/60_ansi", + "maintainer": "kbd0", + "bootloader": "rp2040", + "bootloader_instructions": "Hold the top left key of the keyboard while plugging in the keyboard", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP6", "GP5", "GP4", "GP7", "GP10", "GP9", "GP11", "GP12", "GP13", "GP14", "GP25", "GP20", "GP19", "GP18", "GP16"], + "rows": ["GP23", "GP22", "GP21", "GP24", "GP17"] + }, + "processor": "RP2040", + "url": "https://kbd0.com/item/curve0", + "usb": { + "device_version": "1.0.0", + "pid": "0xC000", + "vid": "0xCBD0" + }, + "community_layouts": ["60_ansi", "60_ansi_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": [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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 14], "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, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_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": [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, 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, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/kbd0/curve0/60_ansi/keymaps/default/keymap.json b/keyboards/kbd0/curve0/60_ansi/keymaps/default/keymap.json new file mode 100644 index 0000000000..d84bfd2bf4 --- /dev/null +++ b/keyboards/kbd0/curve0/60_ansi/keymaps/default/keymap.json @@ -0,0 +1,22 @@ +{ + "author": "kbd0", + "keyboard": "kbd0/curve0/60_ansi", + "keymap": "default", + "layout": "LAYOUT_all", + "layers": [ + [ + "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_BSLS", "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_NUBS", "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_APP", "KC_RCTL" + ], + [ + "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_UP", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "KC_LEFT", "KC_DOWN", "KC_RGHT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/kbd0/curve0/60_ansi/readme.md b/keyboards/kbd0/curve0/60_ansi/readme.md new file mode 100644 index 0000000000..f97ec67312 --- /dev/null +++ b/keyboards/kbd0/curve0/60_ansi/readme.md @@ -0,0 +1,27 @@ +# kbd0/curve0/60_ansi + +![Curve0](https://i.imgur.com/y5ZIbWI.jpeg) + +Curve0 - Curved stainless steel keyboard by kbd0 + +* Keyboard Maintainer: [kbd0](https://github.com/kbd0) +* Hardware Supported: Curve0 PCB +* Hardware Availability: [kbd0.com](https://kbd0.com/item/curve0) + +Make example for this keyboard (after setting up your build environment): + + make kbd0/curve0/60_ansi:default + +Flashing example for this keyboard: + + make kbd0/curve0/60_ansi: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 the top left key of the keyboard while plugging in the keyboard +* **Physical reset button**: Hold the button on the main PCB (inside the keyboard) while plugging in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 3c324cb5e6989713c050a959ef7854427d8bca0f Mon Sep 17 00:00:00 2001 From: Vino Rodrigues <366673+vinorodrigues@users.noreply.github.com> Date: Thu, 5 Dec 2024 04:10:11 +1100 Subject: [PATCH 054/592] [Keyboard] Add Binepad BNK8 keyboard (#24598) * Add Binepad BNK8 keyboard * Moved keymap.c to keymap.json * Fix product page URL * RGB_ -> RM_ keycodes after this round of breaking changes Co-authored-by: Ryan --------- Co-authored-by: Ryan --- keyboards/binepad/bnk8/config.h | 7 ++ keyboards/binepad/bnk8/keyboard.json | 88 +++++++++++++++++++ .../binepad/bnk8/keymaps/default/keymap.json | 40 +++++++++ keyboards/binepad/bnk8/readme.md | 26 ++++++ 4 files changed, 161 insertions(+) create mode 100644 keyboards/binepad/bnk8/config.h create mode 100755 keyboards/binepad/bnk8/keyboard.json create mode 100644 keyboards/binepad/bnk8/keymaps/default/keymap.json create mode 100755 keyboards/binepad/bnk8/readme.md diff --git a/keyboards/binepad/bnk8/config.h b/keyboards/binepad/bnk8/config.h new file mode 100644 index 0000000000..40eea2db81 --- /dev/null +++ b/keyboards/binepad/bnk8/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 binepad (@binepad) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Timing for SK6812 +#define WS2812_T1H 650 diff --git a/keyboards/binepad/bnk8/keyboard.json b/keyboards/binepad/bnk8/keyboard.json new file mode 100755 index 0000000000..550aa77961 --- /dev/null +++ b/keyboards/binepad/bnk8/keyboard.json @@ -0,0 +1,88 @@ +{ + "manufacturer": "binepad", + "keyboard_name": "BNK8", + "maintainer": "binepad", + "bootloader": "stm32duino", + "bootloader_instructions": "Hold down the key at (0x0) in the matrix (the top left key) and plug in the keyboard.", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A7", "pin_b": "A0", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["B3", "B4", "C13"], + "rows": ["C14", "B13", "B12"] + }, + "processor": "STM32F103", + "rgb_matrix": { + "animations": { + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_pinwheel": true, + "cycle_up_down": true, + "jellybean_raindrops": true, + "riverflow": true, + "solid_reactive": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "starlight": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 112, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 80, "y": 32, "flags": 4}, + {"matrix": [1, 1], "x": 112, "y": 32, "flags": 4}, + {"matrix": [1, 2], "x": 144, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 80, "y": 64, "flags": 4}, + {"matrix": [2, 1], "x": 112, "y": 64, "flags": 4}, + {"matrix": [2, 2], "x": 144, "y": 64, "flags": 4} + ], + "led_process_limit": 9, + "max_brightness": 180, + "sleep": true + }, + "url": "https://www.binepad.com/product-page/bnk8", + "usb": { + "device_version": "1.0.0", + "vid": "0x4249", + "pid": "0x4E41" + }, + "eeprom": { + "wear_leveling": { + "backing_size": 1024 + } + }, + "ws2812": { + "pin": "C15" + }, + "community_layouts": ["ortho_3x3"], + "layouts": { + "LAYOUT_ortho_3x3": { + "layout": [ + {"label": "1", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "2", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "Knob", "matrix": [0, 2], "x": 2, "y": 0, "encoder": 0}, + {"label": "3", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "4", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "5", "matrix": [1, 2], "x": 2, "y": 1}, + {"label": "6", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "7", "matrix": [2, 1], "x": 1, "y": 2}, + {"label": "8", "matrix": [2, 2], "x": 2, "y": 2} + ] + } + } +} diff --git a/keyboards/binepad/bnk8/keymaps/default/keymap.json b/keyboards/binepad/bnk8/keymaps/default/keymap.json new file mode 100644 index 0000000000..51b5e06619 --- /dev/null +++ b/keyboards/binepad/bnk8/keymaps/default/keymap.json @@ -0,0 +1,40 @@ +{ + "keyboard": "binepad/bnk8", + "version": 1, + "author": "binepad", + "notes": "Copyright 2024 Binepad (@binepad) \n SPDX-License-Identifier: GPL-2.0-or-later \n This file is a keymap.json file for binepad/bnk8", + "keymap": "default", + "layout": "LAYOUT_ortho_3x3", + "layers": [ + [ + "KC_P1", "KC_P2", "KC_MUTE", + "KC_P3", "KC_P4", "KC_P5", + "KC_P6", "KC_P7", "LT(1, KC_P8)" + ], + [ + "RM_HUEU", "RM_SATU", "RM_SPDU", + "RM_HUED", "RM_SATD", "RM_SPDD", + "RM_TOGG", "RM_NEXT", "_______" + + ] + ], + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [ + { + "ccw": "KC_VOLD", + "cw": "KC_VOLU" + } + ], + [ + { + "ccw": "RM_VALD", + "cw": "RM_VALU" + } + ] + ] +} diff --git a/keyboards/binepad/bnk8/readme.md b/keyboards/binepad/bnk8/readme.md new file mode 100755 index 0000000000..89ceb863a1 --- /dev/null +++ b/keyboards/binepad/bnk8/readme.md @@ -0,0 +1,26 @@ +# BINEPAD BNK8 + +![BINEPAD BNK8](https://i.imgur.com/HFIZg48h.jpeg) + +A compact 8-key 3x3 macropad with a rotary encoder at the top right. + +* Keyboard Maintainer: [binepad](https://github.com/binepad) +* Hardware Supported: BINPAD BNK8 +* Hardware Availability: [binepad.com](https://binepad.com/products/bnk8) + +Make example for this keyboard (after setting up your build environment): + + make binepad/bnk8:default + +Flashing example for this keyboard: + + make binepad/bnk8: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 key at (0,0) in the matrix (usually the top left key) and plug in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From d76f7bfac3bffdfbcc664a677db3e13100ad2879 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Thu, 5 Dec 2024 13:18:25 -0500 Subject: [PATCH 055/592] Add Cerberus to QMK (#24226) * Add Cerberus to QMK * Update readme to add hotswap callouts * Update readme formatting * Use format json to update keyboard.json formatting * Split Cerberus HS and Solderable into separate folders * Update JSON formatting * make solderable keymaps a bit more useful * Backlight fix on solderable * Update keyboards/cannonkeys/cerberus/hotswap/keyboard.json Co-authored-by: jack * Remove cerberus VIA keymaps * Apply suggestions from code review Change some whitespace Co-authored-by: Drashna Jaelre * Add RGB control keycodes to cerberus keymap * Add backlight controls to default keymap on solderable version * Update keyboards/cannonkeys/cerberus/readme.md --------- Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/cannonkeys/cerberus/config.h | 9 + keyboards/cannonkeys/cerberus/halconf.h | 9 + .../cannonkeys/cerberus/hotswap/keyboard.json | 311 ++++++++ .../cerberus/hotswap/keymaps/default/keymap.c | 26 + .../cannonkeys/cerberus/hotswap/rules.mk | 2 + keyboards/cannonkeys/cerberus/info.json | 50 ++ keyboards/cannonkeys/cerberus/mcuconf.h | 9 + keyboards/cannonkeys/cerberus/readme.md | 28 + .../cannonkeys/cerberus/solderable/config.h | 8 + .../cannonkeys/cerberus/solderable/halconf.h | 10 + .../cerberus/solderable/keyboard.json | 711 ++++++++++++++++++ .../solderable/keymaps/default/keymap.c | 25 + .../cerberus/solderable/matrix_diagram.md | 24 + .../cannonkeys/cerberus/solderable/mcuconf.h | 9 + .../cannonkeys/cerberus/solderable/rules.mk | 2 + 15 files changed, 1233 insertions(+) create mode 100644 keyboards/cannonkeys/cerberus/config.h create mode 100644 keyboards/cannonkeys/cerberus/halconf.h create mode 100644 keyboards/cannonkeys/cerberus/hotswap/keyboard.json create mode 100644 keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/cerberus/hotswap/rules.mk create mode 100644 keyboards/cannonkeys/cerberus/info.json create mode 100644 keyboards/cannonkeys/cerberus/mcuconf.h create mode 100644 keyboards/cannonkeys/cerberus/readme.md create mode 100644 keyboards/cannonkeys/cerberus/solderable/config.h create mode 100644 keyboards/cannonkeys/cerberus/solderable/halconf.h create mode 100644 keyboards/cannonkeys/cerberus/solderable/keyboard.json create mode 100644 keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/cerberus/solderable/matrix_diagram.md create mode 100644 keyboards/cannonkeys/cerberus/solderable/mcuconf.h create mode 100644 keyboards/cannonkeys/cerberus/solderable/rules.mk diff --git a/keyboards/cannonkeys/cerberus/config.h b/keyboards/cannonkeys/cerberus/config.h new file mode 100644 index 0000000000..84ea5d9acd --- /dev/null +++ b/keyboards/cannonkeys/cerberus/config.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#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/cannonkeys/cerberus/halconf.h b/keyboards/cannonkeys/cerberus/halconf.h new file mode 100644 index 0000000000..d0f34b102c --- /dev/null +++ b/keyboards/cannonkeys/cerberus/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE + +#include_next + diff --git a/keyboards/cannonkeys/cerberus/hotswap/keyboard.json b/keyboards/cannonkeys/cerberus/hotswap/keyboard.json new file mode 100644 index 0000000000..78890d942e --- /dev/null +++ b/keyboards/cannonkeys/cerberus/hotswap/keyboard.json @@ -0,0 +1,311 @@ +{ + "keyboard_name": "Cerberus HS", + "usb": { + "pid": "0x0034" + }, + "community_layouts": ["tkl_nofrow_ansi"], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + } + } +} diff --git a/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c b/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..865dbff400 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c @@ -0,0 +1,26 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H +enum layer_names { + _BASE, + _FN1, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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_GRV, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_LSFT, MO(1), KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(1), KC_LGUI, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FN1] = 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_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, UG_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, UG_HUED, UG_SATD, UG_VALD, UG_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, UG_PREV, UG_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; diff --git a/keyboards/cannonkeys/cerberus/hotswap/rules.mk b/keyboards/cannonkeys/cerberus/hotswap/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/hotswap/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/cannonkeys/cerberus/info.json b/keyboards/cannonkeys/cerberus/info.json new file mode 100644 index 0000000000..c260c2fcd5 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/info.json @@ -0,0 +1,50 @@ +{ + "manufacturer": "CannonKeys", + "maintainer": "awkannan", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": true, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["B0", "C15", "C14", "A7", "A5", "C13", "A4", "A2", "A1", "A0", "B9", "B8", "B7", "A3", "B6", "B4", "B3", "A15"], + "rows": ["B11", "B10", "B2", "F0", "B5"] + }, + "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": 4 + }, + "url": "https://cannonkeys.com", + "usb": { + "device_version": "0.0.1", + "vid": "0xCA04" + }, + "ws2812": { + "driver": "spi", + "pin": "B15" + } +} diff --git a/keyboards/cannonkeys/cerberus/mcuconf.h b/keyboards/cannonkeys/cerberus/mcuconf.h new file mode 100644 index 0000000000..32f9fbd6db --- /dev/null +++ b/keyboards/cannonkeys/cerberus/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/cannonkeys/cerberus/readme.md b/keyboards/cannonkeys/cerberus/readme.md new file mode 100644 index 0000000000..848d746594 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/readme.md @@ -0,0 +1,28 @@ +# Cerberus Keyboard by CannonKeys + +This folder contains firmware for both the Solderable and Hotswap version of Cerberus + +The hotswap PCB does not support per-key LEDs and has reduced layout support (no ISO) + +* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan) +* Hardware Supported: STM32F072CBT6 + +Make example for this keyboard (after setting up your build environment): + + make cannonkeys/cerberus/hotswap:default + make cannonkeys/cerberus/solderable:default + +Flashing example for this keyboard: + + make cannonkeys/cerberus/hotswap:default:flash + make cannonkeys/cerberus/solderable: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**: Toggle the switch on the back of the pcb to "1" and briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cannonkeys/cerberus/solderable/config.h b/keyboards/cannonkeys/cerberus/solderable/config.h new file mode 100644 index 0000000000..9e5e637de4 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/config.h @@ -0,0 +1,8 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL 1 +#define BACKLIGHT_PAL_MODE 1 diff --git a/keyboards/cannonkeys/cerberus/solderable/halconf.h b/keyboards/cannonkeys/cerberus/solderable/halconf.h new file mode 100644 index 0000000000..fc641ca42f --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next + diff --git a/keyboards/cannonkeys/cerberus/solderable/keyboard.json b/keyboards/cannonkeys/cerberus/solderable/keyboard.json new file mode 100644 index 0000000000..3797df3851 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/keyboard.json @@ -0,0 +1,711 @@ +{ + "keyboard_name": "Cerberus", + "backlight": { + "breathing": true, + "levels": 6, + "pin": "A6" + }, + "features": { + "backlight": true + }, + "indicators": { + "caps_lock": "F1", + "on_state": 0 + }, + "usb": { + "pid": "0x0031" + }, + "community_layouts": ["tkl_nofrow_ansi", "tkl_nofrow_iso"], + "layout_aliases": { + "LAYOUT_all": "LAYOUT" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "-", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "=", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "`", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "Page Up", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "[", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "]", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "\\", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "Page Down", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ";", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "'", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "#", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "\\", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "/", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_iso": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "\"", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "\u00a3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "@", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "~", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "|", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_iso_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "\"", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "\u00a3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "\u00ac", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "@", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "~", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "|", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_iso_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "\"", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "\u00a3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "@", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "~", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "|", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + }, + "LAYOUT_tkl_nofrow_iso_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "\"", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "\u00a3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Bksp", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "\u00ac", "matrix": [0, 14], "x": 14, "y": 0}, + {"label": "Insert", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "Home", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "PgUp", "matrix": [0, 17], "x": 17.25, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Delete", "matrix": [1, 15], "x": 15.25, "y": 1}, + {"label": "End", "matrix": [1, 16], "x": 16.25, "y": 1}, + {"label": "PgDn", "matrix": [1, 17], "x": 17.25, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "@", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "~", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [2, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "|", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "\u2191", "matrix": [3, 16], "x": 16.25, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Menu", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 14], "x": 13.5, "y": 4, "w": 1.5}, + {"label": "\u2190", "matrix": [4, 15], "x": 15.25, "y": 4}, + {"label": "\u2193", "matrix": [4, 16], "x": 16.25, "y": 4}, + {"label": "\u2192", "matrix": [4, 17], "x": 17.25, "y": 4} + ] + } + } +} diff --git a/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c b/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c new file mode 100644 index 0000000000..2b87af0e99 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c @@ -0,0 +1,25 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H +enum layer_names { + _BASE, + _FN1, +}; +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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_GRV, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(1), KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(1), KC_LGUI, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FN1] = 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_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, UG_SPDU, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, UG_HUED, UG_SATD, UG_VALD, UG_SPDD, BL_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, UG_PREV, UG_NEXT, KC_TRNS, BL_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; diff --git a/keyboards/cannonkeys/cerberus/solderable/matrix_diagram.md b/keyboards/cannonkeys/cerberus/solderable/matrix_diagram.md new file mode 100644 index 0000000000..5beb866f72 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/matrix_diagram.md @@ -0,0 +1,24 @@ +# Matrix Diagram for Cerberus + +``` + ┌───────┐ + 2u Backspace │0D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │ │0F │0G │0H │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤ ┌─────┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1E │ │1F │1G │1H │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ┌──┴┐2E │ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2E │ │2C │ │ +├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐ └───┴────┘ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3E │ │3G │ ISO Enter +├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐ +│40 │41 │42 │45 │4A │4B │4C │4E │ │4F │4G │4H │ +└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ +┌────────┐ ┌──────────┐ +│30 │ 2.25u LShift 2.75u RShift │3C │ +└────────┘ └──────────┘ +┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐ +│40 │41 │42 │45 │4B │4C │4E │ Tsangan/WKL +└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +``` diff --git a/keyboards/cannonkeys/cerberus/solderable/mcuconf.h b/keyboards/cannonkeys/cerberus/solderable/mcuconf.h new file mode 100644 index 0000000000..931e93d66f --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/cannonkeys/cerberus/solderable/rules.mk b/keyboards/cannonkeys/cerberus/solderable/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/cannonkeys/cerberus/solderable/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From 09fdabf37c5004b1a580d32f61dd093625e62f8a Mon Sep 17 00:00:00 2001 From: suikagiken <115451678+suikagiken@users.noreply.github.com> Date: Fri, 6 Dec 2024 03:58:28 +0900 Subject: [PATCH 056/592] Fix keymap.json error of keyboard/suikagiken/suika27melo (#24677) --- keyboards/suikagiken/suika27melo/keymaps/default/keymap.json | 4 ++-- keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json b/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json index dadd846e48..48807b2b86 100644 --- a/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json +++ b/keyboards/suikagiken/suika27melo/keymaps/default/keymap.json @@ -1,6 +1,6 @@ { - "author": "@suikagiken", - "keyboard": "suikagiken/suika85ergo", + "author": "suikagiken", + "keyboard": "suikagiken/suika27melo", "keymap": "default", "layout": "LAYOUT", "layers": [ diff --git a/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json b/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json index 189665ddbf..5caad45979 100644 --- a/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json +++ b/keyboards/suikagiken/suika27melo/keymaps/midi/keymap.json @@ -1,6 +1,6 @@ { - "author": "@suikagiken", - "keyboard": "suikagiken/suika85ergo", + "author": "suikagiken", + "keyboard": "suikagiken/suika27melo", "keymap": "midi", "layout": "LAYOUT", "layers": [ From 03937e0c86109b7a488794bb8568d53d48d4ed16 Mon Sep 17 00:00:00 2001 From: Patrickemm Date: Fri, 6 Dec 2024 00:43:35 -0500 Subject: [PATCH 057/592] Add Macroflow Original macropad firmware (#24538) * Adding Macroflow Macropad * Macroflow_Macropad * Macroflow_Macropad * Adding My Macropad * Adding Macroflow Macropad * Adding Macroflow Macropad * Adding Macroflow Macropad * Adding Macroflow Macropad * Adding Macroflow Macropad * Added License Headers * Updated code for merge * Added License Header * Added Encoder Map * Updated Files * Fixed Matrix * Update keyboards/macroflow_original/keyboard.json Co-authored-by: Drashna Jaelre * Update keyboards/macroflow_original/keymaps/default/keymap.c Co-authored-by: Drashna Jaelre * Update keyboards/macroflow_original/keymaps/default/keymap.c Co-authored-by: Drashna Jaelre * Update keyboards/macroflow_original/keymaps/default/rules.mk Co-authored-by: Drashna Jaelre * Update keyboards/macroflow_original/macroflow_original.c Co-authored-by: Drashna Jaelre --------- Co-authored-by: Drashna Jaelre --- keyboards/macroflow_original/keyboard.json | 52 +++++ .../keymaps/default/keymap.c | 101 +++++++++ .../keymaps/default/rules.mk | 1 + .../macroflow_original/macroflow_original.c | 200 ++++++++++++++++++ keyboards/macroflow_original/readme.md | 27 +++ 5 files changed, 381 insertions(+) create mode 100644 keyboards/macroflow_original/keyboard.json create mode 100644 keyboards/macroflow_original/keymaps/default/keymap.c create mode 100644 keyboards/macroflow_original/keymaps/default/rules.mk create mode 100644 keyboards/macroflow_original/macroflow_original.c create mode 100644 keyboards/macroflow_original/readme.md diff --git a/keyboards/macroflow_original/keyboard.json b/keyboards/macroflow_original/keyboard.json new file mode 100644 index 0000000000..58cabba08e --- /dev/null +++ b/keyboards/macroflow_original/keyboard.json @@ -0,0 +1,52 @@ +{ + "manufacturer": "Customacros", + "keyboard_name": "Macroflow Original", + "maintainer": "Patrickemm", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "encoder": true, + "oled": true + }, + "matrix_pins": { + "cols": ["B1", "B3", "B2", "F7"], + "rows": ["E6", "B4", "B5"] + }, + "development_board": "promicro", + "url": "https://github.com/Patrickemm", + "usb": { + "device_version": "1.0.0", + "pid": "0x0002", + "vid": "0x504D" + }, + "dynamic_keymap": { + "layer_count": 8 + }, + "layouts": { + "LAYOUT": { + "layout": [ + + {"matrix": [0, 0], "x": 0, "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}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + }, + "encoder": { + "rotary": [ + {"pin_b": "F5", "pin_a": "F4"} + ] + } +} diff --git a/keyboards/macroflow_original/keymaps/default/keymap.c b/keyboards/macroflow_original/keymaps/default/keymap.c new file mode 100644 index 0000000000..76ef39bf5a --- /dev/null +++ b/keyboards/macroflow_original/keymaps/default/keymap.c @@ -0,0 +1,101 @@ +// Copyright 2024 Patrick Mathern (@Patrickemm) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Define the keycode, `QK_USER` avoids collisions with existing keycodes +enum keycodes { + KC_CYCLE_LAYERS = QK_USER, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + KC_0, KC_CYCLE_LAYERS, + KC_1, KC_2, KC_3, KC_4, + KC_5, KC_6, KC_7, KC_8 + ), + [1] = LAYOUT( + KC_9, KC_CYCLE_LAYERS, + KC_A, KC_B, KC_C, KC_D, + KC_E, KC_F, KC_G, KC_H + ), + [2] = LAYOUT( + KC_I, KC_CYCLE_LAYERS, + KC_J, KC_K, KC_L, KC_M, + KC_N, KC_O, KC_P, KC_Q + ), + [3] = LAYOUT( + KC_R, KC_CYCLE_LAYERS, + KC_S, KC_T, KC_U, KC_V, + KC_W, KC_X, KC_Y, KC_Z + ), + [4] = LAYOUT( + KC_TRNS, KC_CYCLE_LAYERS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [5] = LAYOUT( + KC_TRNS, KC_CYCLE_LAYERS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [6] = LAYOUT( + KC_TRNS, KC_CYCLE_LAYERS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [7] = LAYOUT( + KC_TRNS, KC_CYCLE_LAYERS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +// 1st layer on the cycle +#define LAYER_CYCLE_START 0 +// Last layer on the cycle +#define LAYER_CYCLE_END 7 + +// Add the behaviour of this new keycode +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_CYCLE_LAYERS: + // Our logic will happen on presses, nothing is done on releases + if (!record->event.pressed) { + // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily + return false; + } + + uint8_t current_layer = get_highest_layer(layer_state); + + // Check if we are within the range, if not quit + if (current_layer > LAYER_CYCLE_END || current_layer < LAYER_CYCLE_START) { + return false; + } + + uint8_t next_layer = current_layer + 1; + if (next_layer > LAYER_CYCLE_END) { + next_layer = LAYER_CYCLE_START; + } + layer_move(next_layer); + return false; + + // Process other keycodes normally + default: + return true; + } +} + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) }, + [3] = { ENCODER_CCW_CW(_______, _______) }, + [4] = { ENCODER_CCW_CW(_______, _______) }, + [5] = { ENCODER_CCW_CW(_______, _______) }, + [6] = { ENCODER_CCW_CW(_______, _______) }, + [7] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif diff --git a/keyboards/macroflow_original/keymaps/default/rules.mk b/keyboards/macroflow_original/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/macroflow_original/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/macroflow_original/macroflow_original.c b/keyboards/macroflow_original/macroflow_original.c new file mode 100644 index 0000000000..fd91fd510e --- /dev/null +++ b/keyboards/macroflow_original/macroflow_original.c @@ -0,0 +1,200 @@ +// Copyright 2024 Patrick Mathern (@Patrickemm) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +static uint16_t oled_logo_timer = 0; +static bool has_startup_ran = false; + +#ifndef SHOW_LOGO +# define SHOW_LOGO 2500 +#endif + +enum layer_names { + one, + two, + three, + four, + five, + six, + seven, + eight +}; + +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (!has_startup_ran) { + static const char startUp [] PROGMEM = { + // 'startUp', 128x32px + 0, 0, 0,128,192,192,128,128, 0, 0,192,192, 0, 0, 0,192,192, 0, 0,128,128,192,192,128, 0, 0,192,192,192,192,192,192,192, 0, 0,128,128,192,192,128, 0, 0, 0,192,192,128, 0, 0, 0, 0,192,192,128, 0, 0, 0,128,192,192, 0, 0, 0, 0, 0,128,128,192,192,128, 0, 0,128,192,192,192,192,128,128, 0, 0, 0,128,192,192,192,128, 0, 0, 0,128,128,192,192,128, 0, 0, 0, 0, 0, 0, 0,128,192,192,128, 0, 0, 0, 0,128,192,192,128,128, 0, 0,192,192,192, 0, 0, 0, 0,128,192,192, 0,0, + 0, 0,255,255, 1, 1, 1, 31, 30, 0,255,255, 0, 0, 0,255,255, 0, 30,127,241,193,129, 7, 15, 0, 1, 1, 1,255,255, 1, 1, 0,254,255, 1, 1, 1,255,255, 0, 0,255, 63,255,224, 0,128,254, 63,255,255, 0, 0,224,255, 15,127,255,192, 0, 0,254,255, 1, 1, 1, 31, 31, 0,255,255,129,129,129,255,127, 0, 0,255,255, 1, 1, 1,255,255, 0, 30,127,241,193,129, 7, 15, 0, 0, 0, 0,252,255, 3, 1, 1, 3, 31, 30, 0,255,255, 1, 1, 1,255,254, 0,255,255,127,252, 0, 0,240,255,255,255, 0, 0, 0, 0,255,255,128,128,192,252, 60, 0,127,255,128,128,128,255,127, 0,120,248,128,129,131,255,254, 0, 0, 0, 0,255,255, 0, 0, 0,127,255,128,128,128,255,255, 0, 0,255, 0, 3,255,248,255, 15, 0,255,255, 0,248,255, 27, 24, 24, 63,255,224, 0,127,255,128,128,128,252,124, 0,255,255, 3, 1, 3,127,254,240, 0,127,255,128,128,128,255,127, 0,120,248,128,129,131,255,254, 0,128,128, 0, 63,255,192,128,128,224,252, 60, 0,255,255,128,128,128,255,127, 0,255,255, 0, 31,255,252,127, 1,255,255, 0, 0,0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 + }; + oled_write_raw_P(startUp, sizeof(startUp)); + if (timer_elapsed(oled_logo_timer) >= SHOW_LOGO) { + has_startup_ran = true; + oled_clear(); + } + } else { + static const char PROGMEM layerImage[4][67+1] = { + { 224,224,224,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,224,224,224,224, 0, 0, 0, 0, 0,224,224,224,128, 0, 0, 0, 0,128,224,224,224, 0, 0, 0,224,224,224,224,224,224,224,224,224,224,224, 0, 0,224,224,224,224,224,224,224,224,224,192,128, 0 }, + { 255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,255,255,127, 15,127,255,255,240, 0, 0, 0, 0, 3, 15,127,252,240,240,252,127, 15, 3, 0, 0, 0, 0,255,255,255,255,192,192,192,192,192, 0, 0, 0, 0,255,255,255,255,192,192,192,225,255,255,255,127 }, + { 255,255,255,255,192,192,192,192,192,192,192, 0, 0,192,254,255,255,127, 28, 28, 28,127,255,255,254,192, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,129,129,129,129,129,128,128, 0, 0,255,255,255,255, 1, 1, 7,127,255,255,248,192 }, + { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 3 }, + }; + + static const char PROGMEM layer1[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,248,120,120, 56, 56, 24, 24, 24,248,248,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,255,252,252,252, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 31, 31, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer2[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,120, 56, 24, 24, 24, 24, 24, 24, 56,120,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,248,248,248,254,255, 63, 6, 0,128,224,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255, 63, 15, 7, 1, 64,112,120,126,127,127,255,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer3[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,120, 56, 24, 24, 24, 24, 24, 24, 56,120,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,248,248,248, 62, 63, 63, 30, 0,128,192,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255, 31, 31, 31,126,254,254,124, 0, 0, 1,255,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 30, 28, 24, 24, 24, 24, 24, 24, 28, 30, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer4[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,248,248,248,248,120, 24, 24, 24, 24,248,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,255, 63, 7, 1,192,240, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,192,192,192,194,195,195, 0, 0, 0,195,195,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 31, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer5[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0,143,143,143, 15, 15, 31,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,142, 14, 14, 30,127,127,127, 0, 0, 0,224,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 30, 28, 28, 28, 28, 28, 28, 30, 31, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer6[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,248, 56, 24, 24, 24, 24, 24, 24, 24, 56,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, 31, 31, 31, 24, 24, 56,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,128, 0, 0, 0,127,127,127, 0, 0, 0,128,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 30, 28, 28, 28, 28, 28, 28, 28, 30, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer7[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 31, 3, 0,128,248,255,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,255,255,127, 15, 1, 0,192,252,255,255,255,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + static const char PROGMEM layer8[4][30+1] = { + { 128,224,240,240,248,248,248,248,248,248,248, 56, 24, 24, 24, 24, 24, 24, 24, 56,248,248,248,248,248,248,240,240,224,128 }, + { 255,255,255,255,255,255,255,255,255,255,224,128, 0, 0, 31, 31, 31, 0, 0,128,224,255,255,255,255,255,255,255,255,255 }, + { 255,255,255,255,255,255,255,255,255,255,129, 0, 0, 0,126,126,126, 0, 0, 0,129,255,255,255,255,255,255,255,255,255 }, + { 1, 7, 15, 15, 31, 31, 31, 31, 31, 31, 31, 30, 28, 28, 28, 28, 28, 28, 28, 30, 31, 31, 31, 31, 31, 31, 15, 15, 7, 1 } + }; + + oled_set_cursor(1, 0); // start pos + oled_write_raw_P(layerImage[0], sizeof(layerImage[0])); + oled_set_cursor(1, 1); // move to next line + oled_write_raw_P(layerImage[1], sizeof(layerImage[1])); + oled_set_cursor(1, 2); // move to next line + oled_write_raw_P(layerImage[2], sizeof(layerImage[2])); + oled_set_cursor(1, 3); // move to next line + oled_write_raw_P(layerImage[3], sizeof(layerImage[3])); + + switch (get_highest_layer(layer_state)) { + case one : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer1[0], sizeof(layer1[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer1[1], sizeof(layer1[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer1[2], sizeof(layer1[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer1[3], sizeof(layer1[3])); + break; + case two : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer2[0], sizeof(layer2[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer2[1], sizeof(layer2[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer2[2], sizeof(layer2[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer2[3], sizeof(layer2[3])); + break; + case three : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer3[0], sizeof(layer3[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer3[1], sizeof(layer3[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer3[2], sizeof(layer3[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer3[3], sizeof(layer3[3])); + break; + case four : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer4[0], sizeof(layer4[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer4[1], sizeof(layer4[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer4[2], sizeof(layer4[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer4[3], sizeof(layer4[3])); + break; + case five : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer5[0], sizeof(layer5[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer5[1], sizeof(layer5[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer5[2], sizeof(layer5[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer5[3], sizeof(layer5[3])); + break; + case six : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer6[0], sizeof(layer6[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer6[1], sizeof(layer6[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer6[2], sizeof(layer6[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer6[3], sizeof(layer6[3])); + break; + case seven : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer7[0], sizeof(layer7[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer7[1], sizeof(layer7[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer7[2], sizeof(layer7[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer7[3], sizeof(layer7[3])); + break; + case eight : + oled_set_cursor(16, 0); // move 20 columns out + oled_write_raw_P(layer8[0], sizeof(layer8[0])); + oled_set_cursor(16, 1); // move 20 columns out + oled_write_raw_P(layer8[1], sizeof(layer8[1])); + oled_set_cursor(16, 2); // move 20 columns out + oled_write_raw_P(layer8[2], sizeof(layer8[2])); + oled_set_cursor(16, 3); // move 20 columns out + oled_write_raw_P(layer8[3], sizeof(layer8[3])); + break; + } + } + return false; +} diff --git a/keyboards/macroflow_original/readme.md b/keyboards/macroflow_original/readme.md new file mode 100644 index 0000000000..a38fefa866 --- /dev/null +++ b/keyboards/macroflow_original/readme.md @@ -0,0 +1,27 @@ +# macroflow_original + +![Imgur](https://i.imgur.com/hIytJTl.png) + +*A 2x4 macropad with a built in encoder and OLED screen* + +* Keyboard Maintainer: [Patrickemm](https://github.com/Patrickemm) +* Hardware Supported: *Pro Micro compatible development board* +* Hardware Availability: *https://www.ebay.com/usr/handycache* + +Make example for this keyboard (after setting up your build environment): + + make macroflow_original:default + +Flashing example for this keyboard: + + make macroflow_original: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 a12ff287eed88d928430b63f4f7faff3b6fb5ebc Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 7 Dec 2024 09:05:40 +1100 Subject: [PATCH 058/592] Organise default community layouts summary (#24500) * Organise default community layouts summary * Remove erroneous layout --- layouts/default/readme.md | 565 ++++++++++++++++++++++++++++++-------- 1 file changed, 450 insertions(+), 115 deletions(-) diff --git a/layouts/default/readme.md b/layouts/default/readme.md index e535008822..3c6da941fb 100644 --- a/layouts/default/readme.md +++ b/layouts/default/readme.md @@ -2,10 +2,14 @@ ## Summary of Layouts -### 60% Form Factor +
+60% Form Factor + +### `LAYOUT_60_abnt2` + +60% ABNT2 layout ``` -LAYOUT_60_abnt2 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -19,8 +23,11 @@ LAYOUT_60_abnt2 └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ``` +### `LAYOUT_60_ansi` + +60% ANSI layout + ``` -LAYOUT_60_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -34,8 +41,11 @@ LAYOUT_60_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ``` +### `LAYOUT_60_ansi_arrow` + +60% ANSI layout with arrow cluster + ``` -LAYOUT_60_ansi_arrow ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -49,8 +59,11 @@ LAYOUT_60_ansi_arrow └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_60_ansi_arrow_split_bs` + +60% ANSI layout with arrow cluster and split backspace + ``` -LAYOUT_60_ansi_arrow_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -64,8 +77,11 @@ LAYOUT_60_ansi_arrow_split_bs └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_60_ansi_split_bs_rshift` + +60% ANSI layout with split backspace and split right shift + ``` -LAYOUT_60_ansi_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -79,8 +95,11 @@ LAYOUT_60_ansi_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ``` +### `LAYOUT_60_ansi_tsangan` + +60% ANSI layout with Tsangan bottom row + ``` -LAYOUT_60_ansi_tsangan ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -94,8 +113,11 @@ LAYOUT_60_ansi_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ ``` +### `LAYOUT_60_ansi_tsangan_split_bs_rshift` + +60% ANSI layout with Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_60_ansi_tsangan_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -109,8 +131,11 @@ LAYOUT_60_ansi_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ ``` +### `LAYOUT_60_ansi_wkl` + +60% ANSI layout with no Windows (GUI) keys + ``` -LAYOUT_60_ansi_wkl ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -124,8 +149,11 @@ LAYOUT_60_ansi_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ ``` +### `LAYOUT_60_ansi_wkl_split_bs_rshift` + +60% ANSI layout with no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_60_ansi_wkl_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -139,8 +167,11 @@ LAYOUT_60_ansi_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ ``` +### `LAYOUT_60_hhkb` + +60% ANSI layout with HHKB bottom row, split backspace, and split right shift + ``` -LAYOUT_60_hhkb ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -154,8 +185,11 @@ LAYOUT_60_hhkb └───┴─────┴───────────────────────────┴─────┴───┘ ``` +### `LAYOUT_60_iso` + +60% ISO layout + ``` -LAYOUT_60_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -169,8 +203,11 @@ LAYOUT_60_iso └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ``` +### `LAYOUT_60_iso_arrow` + +60% ISO layout with arrow cluster + ``` -LAYOUT_60_iso_arrow ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -184,8 +221,11 @@ LAYOUT_60_iso_arrow └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_60_iso_arrow_split_bs` + +60% ISO layout with arrow cluster and split backspace + ``` -LAYOUT_60_iso_arrow_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -199,8 +239,11 @@ LAYOUT_60_iso_arrow_split_bs └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_60_iso_split_bs_rshift` + +60% ISO layout with split backspace and split right shift + ``` -LAYOUT_60_iso_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -214,8 +257,11 @@ LAYOUT_60_iso_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ``` +### `LAYOUT_60_iso_tsangan` + +60% ISO layout with Tsangan bottom row + ``` -LAYOUT_60_iso_tsangan ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -229,8 +275,11 @@ LAYOUT_60_iso_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ ``` +### `LAYOUT_60_iso_tsangan_split_bs_rshift` + +60% ISO layout with Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_60_iso_tsangan_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -244,8 +293,11 @@ LAYOUT_60_iso_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ ``` +### `LAYOUT_60_iso_wkl` + +60% ISO layout with no Windows (GUI) keys + ``` -LAYOUT_60_iso_wkl ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -259,8 +311,11 @@ LAYOUT_60_iso_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ ``` +### `LAYOUT_60_iso_wkl_split_bs_rshift` + +60% ISO layout with no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_60_iso_wkl_split_bs_rshift ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -274,8 +329,11 @@ LAYOUT_60_iso_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ ``` +### `LAYOUT_60_jis` + +60% JIS layout + ``` -LAYOUT_60_jis ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ @@ -289,8 +347,11 @@ LAYOUT_60_jis └────┴────┴────┴────┴──────────────┴────┴────┴────┴────┴────┘ ``` +### `LAYOUT_64_ansi` + +64% ANSI layout + ``` -LAYOUT_64_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -304,8 +365,11 @@ LAYOUT_64_ansi └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_64_iso` + +64% ISO layout + ``` -LAYOUT_64_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ @@ -318,11 +382,16 @@ LAYOUT_64_iso │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ``` +
-### 65%+ Form Factor +
+65%+ Form Factor + +### `LAYOUT_65_ansi` + +65% ANSI layout ``` -LAYOUT_65_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -336,8 +405,11 @@ LAYOUT_65_ansi └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_65_ansi_blocker` + +65% ANSI layout with blocker + ``` -LAYOUT_65_ansi_blocker ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -351,8 +423,11 @@ LAYOUT_65_ansi_blocker └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_ansi_blocker_split_bs` + +65% ANSI layout with blocker and split backspace + ``` -LAYOUT_65_ansi_blocker_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -366,8 +441,11 @@ LAYOUT_65_ansi_blocker_split_bs └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_ansi_blocker_tsangan` + +65% ANSI layout with blocker and Tsangan bottom row + ``` -LAYOUT_65_ansi_blocker_tsangan ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -381,8 +459,11 @@ LAYOUT_65_ansi_blocker_tsangan └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_ansi_blocker_tsangan_split_bs` + +65% ANSI layout with blocker, Tsangan bottom row, and split backspace + ``` -LAYOUT_65_ansi_blocker_tsangan_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -396,8 +477,11 @@ LAYOUT_65_ansi_blocker_tsangan_split_bs └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_ansi_split_bs` + +65% ANSI layout with split backspace + ``` -LAYOUT_65_ansi_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -411,8 +495,11 @@ LAYOUT_65_ansi_split_bs └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_65_iso` + +65% ISO layout + ``` -LAYOUT_65_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -426,8 +513,11 @@ LAYOUT_65_iso └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_65_iso_blocker` + +65% ISO layout with blocker + ``` -LAYOUT_65_iso_blocker ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -441,8 +531,11 @@ LAYOUT_65_iso_blocker └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_iso_blocker_split_bs` + +65% ISO layout with blocker and split backspace + ``` -LAYOUT_65_iso_blocker_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -456,8 +549,11 @@ LAYOUT_65_iso_blocker_split_bs └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_iso_blocker_tsangan` + +65% ISO layout with blocker and Tsangan bottom row + ``` -LAYOUT_65_iso_blocker_tsangan ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤ @@ -471,8 +567,11 @@ LAYOUT_65_iso_blocker_tsangan └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_iso_blocker_tsangan_split_bs` + +65% ISO layout with blocker, Tsangan bottom row, and split backspace + ``` -LAYOUT_65_iso_blocker_tsangan_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -486,8 +585,11 @@ LAYOUT_65_iso_blocker_tsangan_split_bs └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_65_iso_split_bs` + +65% ISO layout with split backspace + ``` -LAYOUT_65_iso_split_bs ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ @@ -501,8 +603,11 @@ LAYOUT_65_iso_split_bs └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_66_ansi` + +66% ANSI layout + ``` -LAYOUT_66_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┤ @@ -516,8 +621,11 @@ LAYOUT_66_ansi └────┴───┴────┴────────────────────────┴────┴────┴────┴───┴───┴───┘ ``` +### `LAYOUT_66_iso` + +66% ISO layout + ``` -LAYOUT_66_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┤ @@ -531,8 +639,11 @@ LAYOUT_66_iso └────┴───┴────┴────────────────────────┴────┴────┴────┴───┴───┴───┘ ``` +### `LAYOUT_68_ansi` + +68% ANSI layout + ``` -LAYOUT_68_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐┌───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤├───┼───┤ @@ -546,8 +657,11 @@ LAYOUT_68_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_68_iso` + +68% ISO layout + ``` -LAYOUT_68_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐┌───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ││ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤├───┼───┤ @@ -560,11 +674,16 @@ LAYOUT_68_iso │ │ │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────────────────────────┴────┴────┴────┘ └───┴───┴───┘ ``` +
-### 75% Form Factor +
+75% Form Factor + +### `LAYOUT_75_ansi` + +75% ANSI layout ``` -LAYOUT_75_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┼───┤ @@ -580,8 +699,11 @@ LAYOUT_75_ansi └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_75_iso` + +75% ISO layout + ``` -LAYOUT_75_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┼───┤ @@ -596,11 +718,16 @@ LAYOUT_75_iso │ │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ ``` +
-### Tenkeyless Layouts +
+Tenkeyless (TKL) Form Factor + +### `LAYOUT_tkl_ansi` + +TKL ANSI layout ``` -LAYOUT_tkl_ansi ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -617,8 +744,11 @@ LAYOUT_tkl_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_ansi_split_bs_rshift` + +TKL ANSI layout with split backspace and split right shift + ``` -LAYOUT_tkl_ansi_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -635,8 +765,11 @@ LAYOUT_tkl_ansi_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_ansi_tsangan` + +TKL ANSI layout with Tsangan bottom row + ``` -LAYOUT_tkl_ansi_tsangan ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -653,8 +786,11 @@ LAYOUT_tkl_ansi_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_ansi_tsangan_split_bs_rshift` + +TKL ANSI layout with Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_tkl_ansi_tsangan_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -671,8 +807,11 @@ LAYOUT_tkl_ansi_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_ansi_wkl` + +TKL ANSI layout with no Windows (GUI) keys + ``` -LAYOUT_tkl_ansi_wkl ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -689,8 +828,11 @@ LAYOUT_tkl_ansi_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_ansi_wkl_split_bs_rshift` + +TKL ANSI layout with no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_tkl_ansi_wkl_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -707,8 +849,11 @@ LAYOUT_tkl_ansi_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso` + +TKL ISO layout + ``` -LAYOUT_tkl_iso ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -725,8 +870,11 @@ LAYOUT_tkl_iso └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso_split_bs_rshift` + +TKL ISO layout with split backspace and split right shift + ``` -LAYOUT_tkl_iso_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -743,8 +891,11 @@ LAYOUT_tkl_iso_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso_tsangan` + +TKL ISO layout with Tsangan bottom row + ``` -LAYOUT_tkl_iso_tsangan ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -761,8 +912,11 @@ LAYOUT_tkl_iso_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso_tsangan_split_bs_rshift` + +TKL ISO layout with Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_tkl_iso_tsangan_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -779,8 +933,11 @@ LAYOUT_tkl_iso_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso_wkl` + +TKL ISO layout with no Windows (GUI) keys + ``` -LAYOUT_tkl_iso_wkl ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -797,8 +954,11 @@ LAYOUT_tkl_iso_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_iso_wkl_split_bs_rshift` + +TKL ISO layout with no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_tkl_iso_wkl_split_bs_rshift ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -815,8 +975,11 @@ LAYOUT_tkl_iso_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_jis` + +TKL JIS layout + ``` -LAYOUT_tkl_jis ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -833,8 +996,11 @@ LAYOUT_tkl_jis └────┴────┴────┴────┴──────────────┴────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi` + +TKL ANSI layout with F13 key + ``` -LAYOUT_tkl_f13_ansi ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -851,8 +1017,11 @@ LAYOUT_tkl_f13_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi_split_bs_rshift` + +TKL ANSI layout with F13 key, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_ansi_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -869,8 +1038,11 @@ LAYOUT_tkl_f13_ansi_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi_tsangan` + +TKL ANSI layout with F13 key and Tsangan bottom row + ``` -LAYOUT_tkl_f13_ansi_tsangan ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -887,8 +1059,11 @@ LAYOUT_tkl_f13_ansi_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift` + +TKL ANSI layout with F13 key, Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -905,8 +1080,11 @@ LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi_wkl` + +TKL ANSI layout with F13 key and no Windows (GUI) keys + ``` -LAYOUT_tkl_f13_ansi_wkl ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -923,8 +1101,11 @@ LAYOUT_tkl_f13_ansi_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift` + +TKL ANSI layout with F13 key, no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -941,8 +1122,11 @@ LAYOUT_tkl_f13_ansi_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso` + +TKL ISO layout with F13 key + ``` -LAYOUT_tkl_f13_iso ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -959,8 +1143,11 @@ LAYOUT_tkl_f13_iso └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso_split_bs_rshift` + +TKL ISO layout with F13 key, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_iso_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -977,8 +1164,11 @@ LAYOUT_tkl_f13_iso_split_bs_rshift └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso_tsangan` + +TKL ISO layout with F13 key and Tsangan bottom row + ``` -LAYOUT_tkl_f13_iso_tsangan ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -995,8 +1185,11 @@ LAYOUT_tkl_f13_iso_tsangan └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift` + +TKL ISO layout with F13 key, Tsangan bottom row, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -1013,8 +1206,11 @@ LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso_wkl` + +TKL ISO layout with F13 key and no Windows (GUI) keys + ``` -LAYOUT_tkl_f13_iso_wkl ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -1031,8 +1227,11 @@ LAYOUT_tkl_f13_iso_wkl └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_iso_wkl_split_bs_rshift` + +TKL ISO layout with F13 key, no Windows (GUI) keys, split backspace, and split right shift + ``` -LAYOUT_tkl_f13_iso_wkl_split_bs_rshift ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -1049,8 +1248,11 @@ LAYOUT_tkl_f13_iso_wkl_split_bs_rshift └─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_f13_jis` + +TKL JIS layout with F13 key + ``` -LAYOUT_tkl_f13_jis ┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐ ┌───┬───┬───┐ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ ││ │ │ │ │ │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘ └───┴───┴───┘ @@ -1067,8 +1269,11 @@ LAYOUT_tkl_f13_jis └────┴────┴────┴────┴──────────────┴────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_nofrow_ansi` + +TKL ANSI layout with no function row + ``` -LAYOUT_tkl_nofrow_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ @@ -1082,8 +1287,11 @@ LAYOUT_tkl_nofrow_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +### `LAYOUT_tkl_nofrow_iso` + +TKL ISO layout with no function row + ``` -LAYOUT_tkl_nofrow_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ @@ -1096,11 +1304,16 @@ LAYOUT_tkl_nofrow_iso │ │ │ │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ ``` +
-### 96% Form Factor +
+96% Form Factor + +### `LAYOUT_96_ansi` + +96% ANSI layout ``` -LAYOUT_96_ansi ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┼───┼───┼───┼───┤ @@ -1116,8 +1329,11 @@ LAYOUT_96_ansi └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_96_iso` + +96% ISO layout + ``` -LAYOUT_96_iso ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┴───┼───┼───┼───┼───┤ @@ -1132,12 +1348,16 @@ LAYOUT_96_iso │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +
+
+Fullsize (100%+) Form Factor -### Fullsize Form Factor +### `LAYOUT_fullsize_ansi` + +Fullsize ANSI layout ``` -LAYOUT_fullsize_ansi ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -1154,8 +1374,11 @@ LAYOUT_fullsize_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +### `LAYOUT_fullsize_iso` + +Fullsize ISO layout + ``` -LAYOUT_fullsize_iso ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -1172,8 +1395,11 @@ LAYOUT_fullsize_iso └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +### `LAYOUT_fullsize_jis` + +Fullsize JIS layout + ``` -LAYOUT_fullsize_jis ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ @@ -1190,8 +1416,11 @@ LAYOUT_fullsize_jis └────┴────┴────┴────┴────────────┴────┴────┴───┴───┴───┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +### `LAYOUT_fullsize_extended_ansi` + +Fullsize ANSI layout with additional keys above numpad + ``` -LAYOUT_fullsize_extended_ansi ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┴───┘ @@ -1208,8 +1437,11 @@ LAYOUT_fullsize_extended_ansi └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +### `LAYOUT_fullsize_extended_iso` + +Fullsize ISO layout with additional keys above numpad + ``` -LAYOUT_fullsize_extended_iso ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┴───┘ @@ -1226,8 +1458,11 @@ LAYOUT_fullsize_extended_iso └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +### `LAYOUT_fullsize_extended_jis` + +Fullsize JIS layout with additional keys above numpad + ``` -LAYOUT_fullsize_extended_jis ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┴───┘ @@ -1243,11 +1478,16 @@ LAYOUT_fullsize_extended_jis │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────┴────┴────┴────┴────────────┴────┴────┴───┴───┴───┴────┘ └───┴───┴───┘ └───────┴───┴───┘ ``` +
-### Split Layouts +
+Split Layouts + +### `LAYOUT_alice` + +Alice-style split layout ``` -LAYOUT_alice ┌───┐ ┌───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌┴──┬┘ ┌┴───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┘ ┌─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┴┐ @@ -1261,8 +1501,11 @@ LAYOUT_alice └─────┘ └─────┴───────┴─────┘ └──────────┴─────┘ └─────┘ ``` +### `LAYOUT_alice_split_bs` + +Alice-style split layout with split backspace + ``` -LAYOUT_alice_split_bs ┌───┐ ┌───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌┴──┬┘ ┌┴───┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┘ ┌─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┐ @@ -1276,8 +1519,11 @@ LAYOUT_alice_split_bs └─────┘ └─────┴───────┴─────┘ └──────────┴─────┘ └─────┘ ``` +### `LAYOUT_ergodox` + +Ergodox-style split layout + ``` -LAYOUT_ergodox ┌─────┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬─────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─────┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼─────┤ @@ -1296,8 +1542,11 @@ LAYOUT_ergodox └───┴───┴───┘ └───┴───┴───┘ ``` +### `LAYOUT_split_3x5_2` + +3x5 split layout with two thumb keys + ``` -LAYOUT_split_3x5_2 ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ @@ -1310,8 +1559,11 @@ LAYOUT_split_3x5_2 └───┴───┘ └───┴───┘ ``` +### `LAYOUT_split_3x5_3` + +3x5 split layout with three thumb keys + ``` -LAYOUT_split_3x5_3 ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ @@ -1324,8 +1576,11 @@ LAYOUT_split_3x5_3 └───┴───┴───┘ └───┴───┴───┘ ``` +### `LAYOUT_split_3x6_3` + +3x6 split layout with three thumb keys + ``` -LAYOUT_split_3x6_3 ┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤ @@ -1337,11 +1592,16 @@ LAYOUT_split_3x6_3 │ │ │ │ │ │ │ │ └───┴───┴───┘ └───┴───┴───┘ ``` +
-### Numpads +
+Number Pads + +### `LAYOUT_numpad_4x4` + +4x4 number pad ``` -LAYOUT_numpad_4x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┤ │ @@ -1353,8 +1613,11 @@ LAYOUT_numpad_4x4 └───────┴───┴───┘ ``` +### `LAYOUT_numpad_5x4` + +5x4 number pad + ``` -LAYOUT_numpad_5x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┼───┤ @@ -1368,8 +1631,11 @@ LAYOUT_numpad_5x4 └───────┴───┴───┘ ``` +### `LAYOUT_numpad_5x6` + +5x6 number pad + ``` -LAYOUT_numpad_5x6 ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ @@ -1383,8 +1649,11 @@ LAYOUT_numpad_5x6 └───┴───┴───────┴───┴───┘ ``` +### `LAYOUT_numpad_6x4` + +6x4 number pad + ``` -LAYOUT_numpad_6x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┼───┤ @@ -1400,8 +1669,11 @@ LAYOUT_numpad_6x4 └───────┴───┴───┘ ``` +### `LAYOUT_numpad_6x5` + +6x5 number pad + ``` -LAYOUT_numpad_6x5 ┌───┬───┬───┬───┬───┐ │ │ │ │ │ │ ├───┼───┼───┼───┼───┤ @@ -1416,18 +1688,26 @@ LAYOUT_numpad_6x5 │ │ │ │ │ └───┴───────┴───┴───┘ ``` +
-### Ortholinear Layouts +
+Ortholinear Layouts + +### `LAYOUT_ortho_1x1` + +1x1 ortholinear layout ``` -LAYOUT_ortho_1x1 ┌───┐ │ │ └───┘ ``` +### `LAYOUT_ortho_2x3` + +2x3 ortholinear layout + ``` -LAYOUT_ortho_2x3 ┌───┬───┬───┐ │ │ │ │ ├───┼───┼───┤ @@ -1435,8 +1715,11 @@ LAYOUT_ortho_2x3 └───┴───┴───┘ ``` +### `LAYOUT_ortho_2x6` + +2x6 ortholinear layout + ``` -LAYOUT_ortho_2x6 ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ @@ -1444,8 +1727,11 @@ LAYOUT_ortho_2x6 └───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_3x3` + +3x3 ortholinear layout + ``` -LAYOUT_ortho_3x3 ┌───┬───┬───┐ │ │ │ │ ├───┼───┼───┤ @@ -1455,8 +1741,11 @@ LAYOUT_ortho_3x3 └───┴───┴───┘ ``` +### `LAYOUT_ortho_3x10` + +3x10 ortholinear layout + ``` -LAYOUT_ortho_3x10 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1466,8 +1755,11 @@ LAYOUT_ortho_3x10 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_4x10` + +4x10 ortholinear layout + ``` -LAYOUT_ortho_4x10 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1479,8 +1771,11 @@ LAYOUT_ortho_4x10 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_4x12` + +4x12 ortholinear layout + ``` -LAYOUT_ortho_4x12 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1492,8 +1787,11 @@ LAYOUT_ortho_4x12 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_4x16` + +4x16 ortholinear layout + ``` -LAYOUT_ortho_4x16 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1505,8 +1803,11 @@ LAYOUT_ortho_4x16 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_4x4` + +4x4 ortholinear layout + ``` -LAYOUT_ortho_4x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┼───┤ @@ -1518,8 +1819,11 @@ LAYOUT_ortho_4x4 └───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_4x6` + +4x6 ortholinear layout + ``` -LAYOUT_ortho_4x6 ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ @@ -1531,8 +1835,11 @@ LAYOUT_ortho_4x6 └───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x5` + +5x5 ortholinear layout + ``` -LAYOUT_ortho_5x5 ┌───┬───┬───┬───┬───┐ │ │ │ │ │ │ ├───┼───┼───┼───┼───┤ @@ -1546,8 +1853,11 @@ LAYOUT_ortho_5x5 └───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x10` + +5x10 ortholinear layout + ``` -LAYOUT_ortho_5x10 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1561,8 +1871,11 @@ LAYOUT_ortho_5x10 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x12` + +5x12 ortholinear layout + ``` -LAYOUT_ortho_5x12 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1576,8 +1889,11 @@ LAYOUT_ortho_5x12 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x13` + +5x13 ortholinear layout + ``` -LAYOUT_ortho_5x13 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1591,8 +1907,11 @@ LAYOUT_ortho_5x13 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x14` + +5x14 ortholinear layout + ``` -LAYOUT_ortho_5x14 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1606,8 +1925,11 @@ LAYOUT_ortho_5x14 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x15` + +5x15 ortholinear layout + ``` -LAYOUT_ortho_5x15 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1621,8 +1943,11 @@ LAYOUT_ortho_5x15 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_5x4` + +5x4 ortholinear layout + ``` -LAYOUT_ortho_5x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┼───┤ @@ -1636,8 +1961,11 @@ LAYOUT_ortho_5x4 └───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_6x4` + +6x4 ortholinear layout + ``` -LAYOUT_ortho_6x4 ┌───┬───┬───┬───┐ │ │ │ │ │ ├───┼───┼───┼───┤ @@ -1653,8 +1981,11 @@ LAYOUT_ortho_6x4 └───┴───┴───┴───┘ ``` +### `LAYOUT_ortho_6x13` + +6x13 ortholinear layout + ``` -LAYOUT_ortho_6x13 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1670,8 +2001,11 @@ LAYOUT_ortho_6x13 └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ ``` +### `LAYOUT_planck_mit` + +4x12 ortholinear layout with center 2u space + ``` -LAYOUT_planck_mit ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1682,3 +2016,4 @@ LAYOUT_planck_mit │ │ │ │ │ │ │ │ │ │ │ │ └───┴───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┘ ``` +
From 782f91a73a0f6d4128f9454509b4a207af269f8b Mon Sep 17 00:00:00 2001 From: era <73109780+eerraa@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:06:03 +0900 Subject: [PATCH 059/592] [Keyboard] Add SIRIND Tomak79S (#24684) * Add Tomak79S Add Tomak79S * Update keyboards/era/sirind/tomak79s/keymaps/default/keymap.c Co-authored-by: jack <0x6a73@protonmail.com> --------- Co-authored-by: jack --- keyboards/era/sirind/tomak79s/config.h | 15 + keyboards/era/sirind/tomak79s/keyboard.json | 675 ++++++++++++++++++ .../sirind/tomak79s/keymaps/default/keymap.c | 24 + keyboards/era/sirind/tomak79s/readme.md | 27 + keyboards/era/sirind/tomak79s/tomak79s.c | 16 + 5 files changed, 757 insertions(+) create mode 100644 keyboards/era/sirind/tomak79s/config.h create mode 100644 keyboards/era/sirind/tomak79s/keyboard.json create mode 100644 keyboards/era/sirind/tomak79s/keymaps/default/keymap.c create mode 100644 keyboards/era/sirind/tomak79s/readme.md create mode 100644 keyboards/era/sirind/tomak79s/tomak79s.c diff --git a/keyboards/era/sirind/tomak79s/config.h b/keyboards/era/sirind/tomak79s/config.h new file mode 100644 index 0000000000..f04429bcd8 --- /dev/null +++ b/keyboards/era/sirind/tomak79s/config.h @@ -0,0 +1,15 @@ +// Copyright 2024 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Split configuration */ +#define USB_VBUS_PIN GP19 +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP0 +#define SERIAL_USART_RX_PIN GP1 +#define SERIAL_USART_PIN_SWAP + +/* Reset */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U \ No newline at end of file diff --git a/keyboards/era/sirind/tomak79s/keyboard.json b/keyboards/era/sirind/tomak79s/keyboard.json new file mode 100644 index 0000000000..9011a359ad --- /dev/null +++ b/keyboards/era/sirind/tomak79s/keyboard.json @@ -0,0 +1,675 @@ +{ + "manufacturer": "SIRIND", + "keyboard_name": "Tomak79S", + "maintainer": "eerraa", + "bootloader": "rp2040", + "build": { + "debounce_type": "sym_defer_pk" + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP29", "GP22", "GP5", "GP6", "GP7", "GP4", "GP3", "GP2", null], + "rows": ["GP28", "GP23", "GP24", "GP25", "GP26", "GP27"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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 + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 33, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 47, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 60, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 93, "y": 0, "flags": 4}, + {"matrix": [1, 7], "x": 95, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 81, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 68, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 54, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 41, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 27, "y": 15, "flags": 4}, + {"matrix": [1, 1], "x": 14, "y": 15, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 4}, + {"matrix": [2, 0], "x": 3, "y": 26, "flags": 1}, + {"matrix": [2, 1], "x": 20, "y": 26, "flags": 4}, + {"matrix": [2, 2], "x": 34, "y": 26, "flags": 4}, + {"matrix": [2, 3], "x": 47, "y": 26, "flags": 4}, + {"matrix": [2, 4], "x": 61, "y": 26, "flags": 4}, + {"matrix": [2, 5], "x": 75, "y": 26, "flags": 4}, + {"matrix": [2, 6], "x": 88, "y": 26, "flags": 4}, + {"matrix": [3, 6], "x": 92, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 78, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 51, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 37, "y": 38, "flags": 4}, + {"matrix": [3, 1], "x": 24, "y": 38, "flags": 4}, + {"matrix": [3, 0], "x": 5, "y": 38, "flags": 1}, + {"matrix": [3, 0], "x": 2, "y": 38, "flags": 1}, + {"matrix": [4, 0], "x": 2, "y": 49, "flags": 1}, + {"matrix": [4, 0], "x": 8, "y": 49, "flags": 1}, + {"matrix": [4, 1], "x": 17, "y": 49, "flags": 4}, + {"matrix": [4, 2], "x": 31, "y": 49, "flags": 4}, + {"matrix": [4, 3], "x": 44, "y": 49, "flags": 4}, + {"matrix": [4, 4], "x": 58, "y": 49, "flags": 4}, + {"matrix": [4, 5], "x": 71, "y": 49, "flags": 4}, + {"matrix": [4, 6], "x": 85, "y": 49, "flags": 4}, + {"matrix": [5, 6], "x": 93, "y": 64, "flags": 1}, + {"matrix": [5, 5], "x": 71, "y": 64, "flags": 4}, + {"matrix": [5, 2], "x": 37, "y": 61, "flags": 1}, + {"matrix": [5, 1], "x": 20, "y": 61, "flags": 1}, + {"matrix": [5, 0], "x": 3, "y": 61, "flags": 1}, + {"matrix": [6, 8], "x": 221, "y": 0, "flags": 4}, + {"matrix": [6, 7], "x": 205, "y": 0, "flags": 4}, + {"matrix": [6, 5], "x": 185, "y": 0, "flags": 4}, + {"matrix": [6, 4], "x": 171, "y": 0, "flags": 4}, + {"matrix": [6, 3], "x": 158, "y": 0, "flags": 4}, + {"matrix": [6, 2], "x": 144, "y": 0, "flags": 4}, + {"matrix": [6, 1], "x": 124, "y": 0, "flags": 4}, + {"matrix": [6, 0], "x": 111, "y": 0, "flags": 4}, + {"matrix": [7, 0], "x": 109, "y": 15, "flags": 4}, + {"matrix": [7, 1], "x": 123, "y": 15, "flags": 4}, + {"matrix": [7, 2], "x": 136, "y": 15, "flags": 4}, + {"matrix": [7, 3], "x": 150, "y": 15, "flags": 4}, + {"matrix": [7, 4], "x": 163, "y": 15, "flags": 4}, + {"matrix": [7, 5], "x": 177, "y": 15, "flags": 4}, + {"matrix": [7, 6], "x": 191, "y": 15, "flags": 1}, + {"matrix": [7, 7], "x": 197, "y": 15, "flags": 1}, + {"matrix": [7, 7], "x": 204, "y": 15, "flags": 1}, + {"matrix": [7, 8], "x": 221, "y": 15, "flags": 1}, + {"matrix": [8, 8], "x": 221, "y": 26, "flags": 4}, + {"matrix": [8, 7], "x": 200, "y": 26, "flags": 4}, + {"matrix": [8, 6], "x": 184, "y": 26, "flags": 4}, + {"matrix": [8, 5], "x": 170, "y": 26, "flags": 4}, + {"matrix": [8, 4], "x": 157, "y": 26, "flags": 4}, + {"matrix": [8, 3], "x": 143, "y": 26, "flags": 4}, + {"matrix": [8, 2], "x": 130, "y": 26, "flags": 4}, + {"matrix": [8, 1], "x": 116, "y": 26, "flags": 4}, + {"matrix": [8, 0], "x": 102, "y": 26, "flags": 4}, + {"matrix": [9, 0], "x": 106, "y": 38, "flags": 4}, + {"matrix": [9, 1], "x": 119, "y": 38, "flags": 4}, + {"matrix": [9, 2], "x": 133, "y": 38, "flags": 4}, + {"matrix": [9, 3], "x": 147, "y": 38, "flags": 4}, + {"matrix": [9, 4], "x": 160, "y": 38, "flags": 4}, + {"matrix": [9, 5], "x": 174, "y": 38, "flags": 4}, + {"matrix": [9, 6], "x": 187, "y": 38, "flags": 4}, + {"matrix": [9, 7], "x": 200, "y": 38, "flags": 1}, + {"matrix": [9, 7], "x": 202, "y": 34, "flags": 1}, + {"matrix": [10, 7], "x": 208, "y": 52, "flags": 4}, + {"matrix": [10, 6], "x": 186, "y": 49, "flags": 1}, + {"matrix": [10, 5], "x": 167, "y": 49, "flags": 4}, + {"matrix": [10, 4], "x": 153, "y": 49, "flags": 4}, + {"matrix": [10, 3], "x": 140, "y": 49, "flags": 4}, + {"matrix": [10, 2], "x": 126, "y": 49, "flags": 4}, + {"matrix": [10, 1], "x": 113, "y": 49, "flags": 4}, + {"matrix": [10, 0], "x": 99, "y": 49, "flags": 4}, + {"matrix": [11, 2], "x": 123, "y": 64, "flags": 4}, + {"matrix": [11, 4], "x": 160, "y": 61, "flags": 1}, + {"matrix": [11, 5], "x": 177, "y": 61, "flags": 1}, + {"matrix": [11, 6], "x": 194, "y": 64, "flags": 4}, + {"matrix": [11, 7], "x": 208, "y": 64, "flags": 4}, + {"matrix": [11, 8], "x": 221, "y": 64, "flags": 4}, + {"x": 224, "y": 53, "flags": 2}, + {"x": 224, "y": 51, "flags": 2}, + {"x": 224, "y": 49, "flags": 2}, + {"x": 224, "y": 48, "flags": 2}, + {"x": 224, "y": 46, "flags": 2}, + {"x": 224, "y": 44, "flags": 2}, + {"x": 224, "y": 43, "flags": 2}, + {"x": 224, "y": 41, "flags": 2}, + {"x": 224, "y": 39, "flags": 2} + ], + "sleep": true, + "split_count": [43, 59] + }, + "split": { + "bootmagic": { + "matrix": [6, 0] + }, + "enabled": true, + "handedness": { + "pin": "GP20" + }, + "matrix_pins": { + "right": { + "cols": ["GP25", "GP24", "GP23", "GP22", "GP7", "GP6", "GP5", "GP4", "GP2"], + "rows": ["GP29", "GP28", "GP27", "GP26", "GP11", "GP3"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "indicators": true, + "layer_state": true, + "matrix_state": true + } + } + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0013", + "vid": "0x4552" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP17" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.5, "y": 0}, + {"matrix": [0, 3], "x": 2.5, "y": 0}, + {"matrix": [0, 4], "x": 3.5, "y": 0}, + {"matrix": [0, 5], "x": 4.5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [6, 0], "x": 9.5, "y": 0}, + {"matrix": [6, 1], "x": 10.5, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 5], "x": 15, "y": 0}, + {"matrix": [6, 7], "x": 16.5, "y": 0}, + {"matrix": [6, 8], "x": 17.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [7, 0], "x": 9.5, "y": 1.25}, + {"matrix": [7, 1], "x": 10.5, "y": 1.25}, + {"matrix": [7, 2], "x": 11.5, "y": 1.25}, + {"matrix": [7, 3], "x": 12.5, "y": 1.25}, + {"matrix": [7, 4], "x": 13.5, "y": 1.25}, + {"matrix": [7, 5], "x": 14.5, "y": 1.25}, + {"matrix": [7, 6], "x": 15.5, "y": 1.25}, + {"matrix": [7, 7], "x": 16.5, "y": 1.25}, + {"matrix": [7, 8], "x": 17.75, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [8, 0], "x": 9, "y": 2.25}, + {"matrix": [8, 1], "x": 10, "y": 2.25}, + {"matrix": [8, 2], "x": 11, "y": 2.25}, + {"matrix": [8, 3], "x": 12, "y": 2.25}, + {"matrix": [8, 4], "x": 13, "y": 2.25}, + {"matrix": [8, 5], "x": 14, "y": 2.25}, + {"matrix": [8, 6], "x": 15, "y": 2.25}, + {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5}, + {"matrix": [8, 8], "x": 17.75, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [9, 0], "x": 9.25, "y": 3.25}, + {"matrix": [9, 1], "x": 10.25, "y": 3.25}, + {"matrix": [9, 2], "x": 11.25, "y": 3.25}, + {"matrix": [9, 3], "x": 12.25, "y": 3.25}, + {"matrix": [9, 4], "x": 13.25, "y": 3.25}, + {"matrix": [9, 5], "x": 14.25, "y": 3.25}, + {"matrix": [9, 6], "x": 15.25, "y": 3.25}, + {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [10, 0], "x": 8.75, "y": 4.25}, + {"matrix": [10, 1], "x": 9.75, "y": 4.25}, + {"matrix": [10, 2], "x": 10.75, "y": 4.25}, + {"matrix": [10, 3], "x": 11.75, "y": 4.25}, + {"matrix": [10, 4], "x": 12.75, "y": 4.25}, + {"matrix": [10, 5], "x": 13.75, "y": 4.25}, + {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75}, + {"matrix": [10, 7], "x": 16.75, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25}, + {"matrix": [5, 6], "x": 7, "y": 5.5}, + {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75}, + {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5}, + {"matrix": [11, 5], "x": 14.5, "y": 5.25}, + {"matrix": [11, 6], "x": 15.75, "y": 5.5}, + {"matrix": [11, 7], "x": 16.75, "y": 5.5}, + {"matrix": [11, 8], "x": 17.75, "y": 5.5} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.5, "y": 0}, + {"matrix": [0, 3], "x": 2.5, "y": 0}, + {"matrix": [0, 4], "x": 3.5, "y": 0}, + {"matrix": [0, 5], "x": 4.5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [6, 0], "x": 9.5, "y": 0}, + {"matrix": [6, 1], "x": 10.5, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 5], "x": 15, "y": 0}, + {"matrix": [6, 7], "x": 16.5, "y": 0}, + {"matrix": [6, 8], "x": 17.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [7, 0], "x": 9.5, "y": 1.25}, + {"matrix": [7, 1], "x": 10.5, "y": 1.25}, + {"matrix": [7, 2], "x": 11.5, "y": 1.25}, + {"matrix": [7, 3], "x": 12.5, "y": 1.25}, + {"matrix": [7, 4], "x": 13.5, "y": 1.25}, + {"matrix": [7, 5], "x": 14.5, "y": 1.25}, + {"matrix": [7, 7], "x": 15.5, "y": 1.25, "w": 2}, + {"matrix": [7, 8], "x": 17.75, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [8, 0], "x": 9, "y": 2.25}, + {"matrix": [8, 1], "x": 10, "y": 2.25}, + {"matrix": [8, 2], "x": 11, "y": 2.25}, + {"matrix": [8, 3], "x": 12, "y": 2.25}, + {"matrix": [8, 4], "x": 13, "y": 2.25}, + {"matrix": [8, 5], "x": 14, "y": 2.25}, + {"matrix": [8, 6], "x": 15, "y": 2.25}, + {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5}, + {"matrix": [8, 8], "x": 17.75, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [9, 0], "x": 9.25, "y": 3.25}, + {"matrix": [9, 1], "x": 10.25, "y": 3.25}, + {"matrix": [9, 2], "x": 11.25, "y": 3.25}, + {"matrix": [9, 3], "x": 12.25, "y": 3.25}, + {"matrix": [9, 4], "x": 13.25, "y": 3.25}, + {"matrix": [9, 5], "x": 14.25, "y": 3.25}, + {"matrix": [9, 7], "x": 15.25, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [10, 0], "x": 8.75, "y": 4.25}, + {"matrix": [10, 1], "x": 9.75, "y": 4.25}, + {"matrix": [10, 2], "x": 10.75, "y": 4.25}, + {"matrix": [10, 3], "x": 11.75, "y": 4.25}, + {"matrix": [10, 4], "x": 12.75, "y": 4.25}, + {"matrix": [10, 5], "x": 13.75, "y": 4.25}, + {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75}, + {"matrix": [10, 7], "x": 16.75, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25}, + {"matrix": [5, 6], "x": 7, "y": 5.5}, + {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75}, + {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5}, + {"matrix": [11, 5], "x": 14.5, "y": 5.25}, + {"matrix": [11, 6], "x": 15.75, "y": 5.5}, + {"matrix": [11, 7], "x": 16.75, "y": 5.5}, + {"matrix": [11, 8], "x": 17.75, "y": 5.5} + ] + }, + "LAYOUT_ansi_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.5, "y": 0}, + {"matrix": [0, 3], "x": 2.5, "y": 0}, + {"matrix": [0, 4], "x": 3.5, "y": 0}, + {"matrix": [0, 5], "x": 4.5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [6, 0], "x": 9.5, "y": 0}, + {"matrix": [6, 1], "x": 10.5, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 5], "x": 15, "y": 0}, + {"matrix": [6, 7], "x": 16.5, "y": 0}, + {"matrix": [6, 8], "x": 17.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [7, 0], "x": 9.5, "y": 1.25}, + {"matrix": [7, 1], "x": 10.5, "y": 1.25}, + {"matrix": [7, 2], "x": 11.5, "y": 1.25}, + {"matrix": [7, 3], "x": 12.5, "y": 1.25}, + {"matrix": [7, 4], "x": 13.5, "y": 1.25}, + {"matrix": [7, 5], "x": 14.5, "y": 1.25}, + {"matrix": [7, 6], "x": 15.5, "y": 1.25}, + {"matrix": [7, 7], "x": 16.5, "y": 1.25}, + {"matrix": [7, 8], "x": 17.75, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [8, 0], "x": 9, "y": 2.25}, + {"matrix": [8, 1], "x": 10, "y": 2.25}, + {"matrix": [8, 2], "x": 11, "y": 2.25}, + {"matrix": [8, 3], "x": 12, "y": 2.25}, + {"matrix": [8, 4], "x": 13, "y": 2.25}, + {"matrix": [8, 5], "x": 14, "y": 2.25}, + {"matrix": [8, 6], "x": 15, "y": 2.25}, + {"matrix": [8, 7], "x": 16, "y": 2.25, "w": 1.5}, + {"matrix": [8, 8], "x": 17.75, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [9, 0], "x": 9.25, "y": 3.25}, + {"matrix": [9, 1], "x": 10.25, "y": 3.25}, + {"matrix": [9, 2], "x": 11.25, "y": 3.25}, + {"matrix": [9, 3], "x": 12.25, "y": 3.25}, + {"matrix": [9, 4], "x": 13.25, "y": 3.25}, + {"matrix": [9, 5], "x": 14.25, "y": 3.25}, + {"matrix": [9, 7], "x": 15.25, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [10, 0], "x": 8.75, "y": 4.25}, + {"matrix": [10, 1], "x": 9.75, "y": 4.25}, + {"matrix": [10, 2], "x": 10.75, "y": 4.25}, + {"matrix": [10, 3], "x": 11.75, "y": 4.25}, + {"matrix": [10, 4], "x": 12.75, "y": 4.25}, + {"matrix": [10, 5], "x": 13.75, "y": 4.25}, + {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75}, + {"matrix": [10, 7], "x": 16.75, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25}, + {"matrix": [5, 6], "x": 7, "y": 5.5}, + {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75}, + {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5}, + {"matrix": [11, 5], "x": 14.5, "y": 5.25}, + {"matrix": [11, 6], "x": 15.75, "y": 5.5}, + {"matrix": [11, 7], "x": 16.75, "y": 5.5}, + {"matrix": [11, 8], "x": 17.75, "y": 5.5} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.5, "y": 0}, + {"matrix": [0, 3], "x": 2.5, "y": 0}, + {"matrix": [0, 4], "x": 3.5, "y": 0}, + {"matrix": [0, 5], "x": 4.5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [6, 0], "x": 9.5, "y": 0}, + {"matrix": [6, 1], "x": 10.5, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 5], "x": 15, "y": 0}, + {"matrix": [6, 7], "x": 16.5, "y": 0}, + {"matrix": [6, 8], "x": 17.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [7, 0], "x": 9.5, "y": 1.25}, + {"matrix": [7, 1], "x": 10.5, "y": 1.25}, + {"matrix": [7, 2], "x": 11.5, "y": 1.25}, + {"matrix": [7, 3], "x": 12.5, "y": 1.25}, + {"matrix": [7, 4], "x": 13.5, "y": 1.25}, + {"matrix": [7, 5], "x": 14.5, "y": 1.25}, + {"matrix": [7, 7], "x": 15.5, "y": 1.25, "w": 2}, + {"matrix": [7, 8], "x": 17.75, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [8, 0], "x": 9, "y": 2.25}, + {"matrix": [8, 1], "x": 10, "y": 2.25}, + {"matrix": [8, 2], "x": 11, "y": 2.25}, + {"matrix": [8, 3], "x": 12, "y": 2.25}, + {"matrix": [8, 4], "x": 13, "y": 2.25}, + {"matrix": [8, 5], "x": 14, "y": 2.25}, + {"matrix": [8, 6], "x": 15, "y": 2.25}, + {"matrix": [8, 8], "x": 17.75, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [9, 0], "x": 9.25, "y": 3.25}, + {"matrix": [9, 1], "x": 10.25, "y": 3.25}, + {"matrix": [9, 2], "x": 11.25, "y": 3.25}, + {"matrix": [9, 3], "x": 12.25, "y": 3.25}, + {"matrix": [9, 4], "x": 13.25, "y": 3.25}, + {"matrix": [9, 5], "x": 14.25, "y": 3.25}, + {"matrix": [9, 6], "x": 15.25, "y": 3.25}, + {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25, "h": 2}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [10, 0], "x": 8.75, "y": 4.25}, + {"matrix": [10, 1], "x": 9.75, "y": 4.25}, + {"matrix": [10, 2], "x": 10.75, "y": 4.25}, + {"matrix": [10, 3], "x": 11.75, "y": 4.25}, + {"matrix": [10, 4], "x": 12.75, "y": 4.25}, + {"matrix": [10, 5], "x": 13.75, "y": 4.25}, + {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75}, + {"matrix": [10, 7], "x": 16.75, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25}, + {"matrix": [5, 6], "x": 7, "y": 5.5}, + {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75}, + {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5}, + {"matrix": [11, 5], "x": 14.5, "y": 5.25}, + {"matrix": [11, 6], "x": 15.75, "y": 5.5}, + {"matrix": [11, 7], "x": 16.75, "y": 5.5}, + {"matrix": [11, 8], "x": 17.75, "y": 5.5} + ] + }, + "LAYOUT_iso_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.5, "y": 0}, + {"matrix": [0, 3], "x": 2.5, "y": 0}, + {"matrix": [0, 4], "x": 3.5, "y": 0}, + {"matrix": [0, 5], "x": 4.5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [6, 0], "x": 9.5, "y": 0}, + {"matrix": [6, 1], "x": 10.5, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 5], "x": 15, "y": 0}, + {"matrix": [6, 7], "x": 16.5, "y": 0}, + {"matrix": [6, 8], "x": 17.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [7, 0], "x": 9.5, "y": 1.25}, + {"matrix": [7, 1], "x": 10.5, "y": 1.25}, + {"matrix": [7, 2], "x": 11.5, "y": 1.25}, + {"matrix": [7, 3], "x": 12.5, "y": 1.25}, + {"matrix": [7, 4], "x": 13.5, "y": 1.25}, + {"matrix": [7, 5], "x": 14.5, "y": 1.25}, + {"matrix": [7, 6], "x": 15.5, "y": 1.25}, + {"matrix": [7, 7], "x": 16.5, "y": 1.25}, + {"matrix": [7, 8], "x": 17.75, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [8, 0], "x": 9, "y": 2.25}, + {"matrix": [8, 1], "x": 10, "y": 2.25}, + {"matrix": [8, 2], "x": 11, "y": 2.25}, + {"matrix": [8, 3], "x": 12, "y": 2.25}, + {"matrix": [8, 4], "x": 13, "y": 2.25}, + {"matrix": [8, 5], "x": 14, "y": 2.25}, + {"matrix": [8, 6], "x": 15, "y": 2.25}, + {"matrix": [8, 8], "x": 17.75, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [9, 0], "x": 9.25, "y": 3.25}, + {"matrix": [9, 1], "x": 10.25, "y": 3.25}, + {"matrix": [9, 2], "x": 11.25, "y": 3.25}, + {"matrix": [9, 3], "x": 12.25, "y": 3.25}, + {"matrix": [9, 4], "x": 13.25, "y": 3.25}, + {"matrix": [9, 5], "x": 14.25, "y": 3.25}, + {"matrix": [9, 6], "x": 15.25, "y": 3.25}, + {"matrix": [9, 7], "x": 16.25, "y": 3.25, "w": 1.25, "h": 2}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [10, 0], "x": 8.75, "y": 4.25}, + {"matrix": [10, 1], "x": 9.75, "y": 4.25}, + {"matrix": [10, 2], "x": 10.75, "y": 4.25}, + {"matrix": [10, 3], "x": 11.75, "y": 4.25}, + {"matrix": [10, 4], "x": 12.75, "y": 4.25}, + {"matrix": [10, 5], "x": 13.75, "y": 4.25}, + {"matrix": [10, 6], "x": 14.75, "y": 4.25, "w": 1.75}, + {"matrix": [10, 7], "x": 16.75, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 5], "x": 4.75, "y": 5.5, "w": 2.25}, + {"matrix": [5, 6], "x": 7, "y": 5.5}, + {"matrix": [11, 2], "x": 9.5, "y": 5.5, "w": 2.75}, + {"matrix": [11, 4], "x": 13, "y": 5.25, "w": 1.5}, + {"matrix": [11, 5], "x": 14.5, "y": 5.25}, + {"matrix": [11, 6], "x": 15.75, "y": 5.5}, + {"matrix": [11, 7], "x": 16.75, "y": 5.5}, + {"matrix": [11, 8], "x": 17.75, "y": 5.5} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c b/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c new file mode 100644 index 0000000000..9ac7334d48 --- /dev/null +++ b/keyboards/era/sirind/tomak79s/keymaps/default/keymap.c @@ -0,0 +1,24 @@ +// Copyright 2024 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + 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_F13, KC_PSCR, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_all( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RM_TOGG, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, RM_NEXT, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; \ No newline at end of file diff --git a/keyboards/era/sirind/tomak79s/readme.md b/keyboards/era/sirind/tomak79s/readme.md new file mode 100644 index 0000000000..5fc275bc65 --- /dev/null +++ b/keyboards/era/sirind/tomak79s/readme.md @@ -0,0 +1,27 @@ +# Tomak79S, Solder ver + +![Tomak79S](https://i.imgur.com/Pq2itWD.jpeg) + +Ergonomics Split Keyboard powered by RP2040. + +* Keyboard Maintainer: [ERA](https://github.com/eerraa) +* Hardware supported: SIRIND Tomak79 +* Hardware availability: [Syryan](https://srind.mysoho.com/) + +Make example for this keyboard (after setting up your build environment): + + make era/sirind/tomak79s:default + +Flashing example for this keyboard: + + make era/sirind/tomak79s: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 'top-left(ESC, F7)' key and plug in the keyboard. +* **Physical reset**: Short the 'RESET' and 'GND' holes twice within one second, or plug in the keyboard with the 'BOOT' and 'GND' holes shorted. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. \ No newline at end of file diff --git a/keyboards/era/sirind/tomak79s/tomak79s.c b/keyboards/era/sirind/tomak79s/tomak79s.c new file mode 100644 index 0000000000..f5f3165b64 --- /dev/null +++ b/keyboards/era/sirind/tomak79s/tomak79s.c @@ -0,0 +1,16 @@ +// Copyright 2023 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +bool rgb_matrix_indicators_kb(void) { + if (!rgb_matrix_indicators_user()) { + return false; + } + if (host_keyboard_led_state().caps_lock) { + for (uint8_t i = 93; i <= 101; i++) { + rgb_matrix_set_color(i, 0, 128, 128); + } + } + return true; +} \ No newline at end of file From 68f67e23aaab1585ea1190425f75e31179826eae Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 8 Dec 2024 14:35:12 +0000 Subject: [PATCH 060/592] skyloong/gk61: Remove overriding of core keycode behaviour (#24655) --- keyboards/skyloong/gk61/pro/config.h | 3 - keyboards/skyloong/gk61/pro/pro.c | 149 +++++------------------- keyboards/skyloong/gk61/pro_48/config.h | 4 - keyboards/skyloong/gk61/pro_48/pro_48.c | 93 +-------------- 4 files changed, 32 insertions(+), 217 deletions(-) diff --git a/keyboards/skyloong/gk61/pro/config.h b/keyboards/skyloong/gk61/pro/config.h index db02496f8b..aeea36e0bc 100644 --- a/keyboards/skyloong/gk61/pro/config.h +++ b/keyboards/skyloong/gk61/pro/config.h @@ -7,6 +7,3 @@ #define IS31FL3743A_SDB_PIN C1 #define CAPS_LOCK_INDEX 28 -#define WIN_MOD_INDEX 16 -#define MAC_MOD_INDEX 17 -#define WIN_LOCK_INDEX 54 diff --git a/keyboards/skyloong/gk61/pro/pro.c b/keyboards/skyloong/gk61/pro/pro.c index 2299977e0e..11411ba2b1 100644 --- a/keyboards/skyloong/gk61/pro/pro.c +++ b/keyboards/skyloong/gk61/pro/pro.c @@ -1,11 +1,8 @@ // Copyright 2023 linlin012 (@linlin012) // SPDX-License-Identifier: GPL-2.0-or-later #include "quantum.h" -int FN_WIN = 0; -int FN_MAC = 0; -int L_WIN = 0; -int L_MAC = 0; +#if defined(RGB_MATRIX_ENABLE) const is31fl3743a_led_t PROGMEM g_is31fl3743a_leds[IS31FL3743A_LED_COUNT] = { /* Refer to IS31 manual for these locations * driver @@ -83,7 +80,32 @@ const is31fl3743a_led_t PROGMEM g_is31fl3743a_leds[IS31FL3743A_LED_COUNT] = { {0, SW10_CS13, SW10_CS14, SW10_CS15} }; -#if defined(RGB_MATRIX_ENABLE) /*&& defined(CAPS_LOCK_INDEX)*/ +bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { + if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { + return false; + } + + if (host_keyboard_led_state().caps_lock) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_INDEX, 255, 255, 255); + } else { + if (!rgb_matrix_get_flags()) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_INDEX, 0, 0, 0); + } + } + + return false; +} + +void suspend_power_down_kb(void) { + gpio_write_pin_low(IS31FL3743A_SDB_PIN); + suspend_power_down_user(); +} + +void suspend_wakeup_init_kb(void) { + gpio_write_pin_high(IS31FL3743A_SDB_PIN); + suspend_wakeup_init_user(); +} +#endif bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (!process_record_user(keycode, record)) { @@ -105,124 +127,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { } return false; # endif - case TO(0): - if (record->event.pressed) { - L_WIN = 1; - set_single_persistent_default_layer(0); // Save default layer 0 to eeprom - } else { - L_WIN = 0; - } - return true; // continue all further processing of this key - - case MO(2): - if (record->event.pressed) { - FN_WIN = 1; - } else { - FN_WIN = 0; - } - return true; // continue all further processing of this key - - case TO(1): - if (record->event.pressed) { - L_MAC = 1; - set_single_persistent_default_layer(1); //Save default layer 1 to eeprom - } else { - L_MAC = 0; - } - return true; // continue all further processing of this key - - case MO(3): - if (record->event.pressed) { - FN_MAC = 1; - } else { - FN_MAC = 0; - } - return true; // continue all further processing of this key - default: - return true; - } - -} - -bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { - if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { - return false; } - if (host_keyboard_led_state().caps_lock) { - RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_INDEX, 255, 255, 255); - } else { - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_INDEX, 0, 0, 0); - } - } - - switch (get_highest_layer(layer_state)) { - case 0:{ - if (L_WIN) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - }else{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - } - } break; - - case 1:{ - if (L_MAC) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - }else{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } - } break; - - - case 2:{ - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } break; - - case 3:{ - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - } break; - - default:{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } - } - return false; -} - -#endif - -void suspend_power_down_kb() { -# ifdef RGB_MATRIX_ENABLE - gpio_write_pin_low(IS31FL3743A_SDB_PIN); -# endif - suspend_power_down_user(); -} - -void suspend_wakeup_init_kb() { -# ifdef RGB_MATRIX_ENABLE - gpio_write_pin_high(IS31FL3743A_SDB_PIN); -# endif - suspend_wakeup_init_user(); + return true; } void board_init(void) { diff --git a/keyboards/skyloong/gk61/pro_48/config.h b/keyboards/skyloong/gk61/pro_48/config.h index 5b4976e2da..7e45ac8354 100644 --- a/keyboards/skyloong/gk61/pro_48/config.h +++ b/keyboards/skyloong/gk61/pro_48/config.h @@ -7,7 +7,3 @@ #define IS31FL3743A_SDB_PIN A4 #define CAPS_LOCK_INDEX 28 -#define WIN_MOD_INDEX 16 -#define MAC_MOD_INDEX 17 - -#define g_suspend_state rgb_matrix_get_suspend_state() diff --git a/keyboards/skyloong/gk61/pro_48/pro_48.c b/keyboards/skyloong/gk61/pro_48/pro_48.c index 6da76a1767..11411ba2b1 100644 --- a/keyboards/skyloong/gk61/pro_48/pro_48.c +++ b/keyboards/skyloong/gk61/pro_48/pro_48.c @@ -1,12 +1,8 @@ // Copyright 2023 linlin012 (@linlin012) // SPDX-License-Identifier: GPL-2.0-or-later #include "quantum.h" -_Bool FN_WIN = 0; -_Bool FN_MAC = 0; -_Bool L_WIN = 0; -_Bool L_MAC = 0; -#if defined(RGB_MATRIX_ENABLE) /*&& defined(CAPS_LOCK_INDEX)*/ +#if defined(RGB_MATRIX_ENABLE) const is31fl3743a_led_t PROGMEM g_is31fl3743a_leds[IS31FL3743A_LED_COUNT] = { /* Refer to IS31 manual for these locations * driver @@ -97,57 +93,9 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { } } - switch (get_highest_layer(layer_state)) { - case 2:{ - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } break; - case 3:{ - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - } break; - - case 0:{ - if (L_WIN) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - }else{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - } - } break; - - case 1:{ - if (L_MAC) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 255, 255, 255); - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - } - }else{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } - } break; - - default:{ - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(WIN_MOD_INDEX, 0, 0, 0); - RGB_MATRIX_INDICATOR_SET_COLOR(MAC_MOD_INDEX, 0, 0, 0); - } - } - } return false; } - void suspend_power_down_kb(void) { gpio_write_pin_low(IS31FL3743A_SDB_PIN); suspend_power_down_user(); @@ -177,44 +125,11 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { } break; } } - return false; + return false; # endif - case TO(0): - if (record->event.pressed) { - L_WIN = 1; - set_single_persistent_default_layer(0); // Save default layer 0 to eeprom - } else { - L_WIN = 0; - } - return true; // continue all further processing of this key - - case MO(2): - if (record->event.pressed) { - FN_WIN = 1; - } else { - FN_WIN = 0; - } - return true; // continue all further processing of this key - - case TO(1): - if (record->event.pressed) { - L_MAC = 1; - set_single_persistent_default_layer(1); //Save default layer 1 to eeprom - } else { - L_MAC = 0; - } - return true; // continue all further processing of this key - - case MO(3): - if (record->event.pressed) { - FN_MAC = 1; - } else { - FN_MAC = 0; - } - return true; // continue all further processing of this key - default: - return true; } + + return true; } void board_init(void) { From 1c6d3d0cbc52eefce3c244ed958566204b9d65a7 Mon Sep 17 00:00:00 2001 From: Feags <41646528+Feags@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:30:26 -0500 Subject: [PATCH 061/592] Adding new keyboard Promenade RP24S (#24689) * adding keymaps for krado industries * Modified default keymap.c files to be the same as via. * Changing vendor ID for Krado Industries * Suggested changes made Making changes suggested by zvecr. Removed dynamic_layer indicator, updated copyright year, deleted unused layers in keymaps. Co-authored-by: Joel Challis * rgbpin for ws2812 changed in info.json * Added encoder mapping rule file for default keymaps; added Fn layer shortcuts to Promenade layouts * Added rules.mk with encoder mapping for encoder boards at keymaps level. * Deleted extra key in LAYOUT * Update keyboards/kradoindustries/kousa/rules.mk Move WS2812 Driver from rules.mk to info.json Co-authored-by: jack * Update keyboards/kradoindustries/kousa/info.json Move WS2812 Driver from rules.mk to info.json Co-authored-by: jack * Update keyboards/kradoindustries/kousa/keymaps/default/keymap.c Move WS2812 Driver from rules.mk to info.json Co-authored-by: jack * Reverting settings.json * Encoder map code change [2]>[NUM_DIRECTIONS] * Adding Promenade RP24S Adding Promenade RP24S keyboard.json, default keymap, and readme * Adding layer access to Promenade RP24S Adding layer access to layers 1 and 2 --------- Co-authored-by: Joel Challis Co-authored-by: jack --- .../promenade_rp24s/keyboard.json | 140 ++++++++++++++++++ .../promenade_rp24s/keymaps/default/keymap.c | 102 +++++++++++++ .../promenade_rp24s/keymaps/default/rules.mk | 1 + .../kradoindustries/promenade_rp24s/readme.md | 29 ++++ 4 files changed, 272 insertions(+) create mode 100644 keyboards/kradoindustries/promenade_rp24s/keyboard.json create mode 100644 keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c create mode 100644 keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk create mode 100644 keyboards/kradoindustries/promenade_rp24s/readme.md diff --git a/keyboards/kradoindustries/promenade_rp24s/keyboard.json b/keyboards/kradoindustries/promenade_rp24s/keyboard.json new file mode 100644 index 0000000000..c0d4a7f535 --- /dev/null +++ b/keyboards/kradoindustries/promenade_rp24s/keyboard.json @@ -0,0 +1,140 @@ +{ + "keyboard_name": "Promenade RP24S", + "manufacturer": "Krado Industries", + "url": "https://www.kradoindustries.com/", + "maintainer": "Krado Industries", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0x4B72", + "pid": "0x4B6D", + "device_version": "1.0.0" + }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "console": false, + "command": false, + "nkro": true, + "encoder": true, + "rgblight": true + }, + + "encoder": { + "rotary": [ + { "pin_a": "GP12", "pin_b": "GP15" }, + { "pin_a": "GP12", "pin_b": "GP16" }, + { "pin_a": "GP15", "pin_b": "GP18" }, + { "pin_a": "GP16", "pin_b": "GP18" }, + { "pin_a": "GP11", "pin_b": "GP15" }, + { "pin_a": "GP16", "pin_b": "GP11" }, + { "pin_a": "GP16", "pin_b": "GP15" }, + { "pin_a": "GP18", "pin_b": "GP12" } + ] + }, + + "ws2812": { + "pin": "GP26", + "driver": "vendor" + }, + "rgblight": { + "led_count": 14, + "sleep": true, + "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 + } + }, + + + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP20", "GP10", "GP9", "GP8", "GP7", "GP6", "GP14", "GP13", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"], + "rows": ["GP29", "GP28", "GP27", "GP19", "GP17"] + }, + + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x":0, "y":0, "w":1.5}, + {"matrix": [0, 1], "x":1.5, "y":0}, + {"matrix": [0, 2], "x":2.5, "y":0}, + {"matrix": [0, 3], "x":3.5, "y":0}, + {"matrix": [0, 4], "x":4.5, "y":0}, + {"matrix": [0, 5], "x":5.5, "y":0}, + {"matrix": [0, 6], "x":6.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0, 10], "x":10.5, "y":0}, + {"matrix": [0, 11], "x":11.5, "y":0}, + {"matrix": [0, 12], "x":12.5, "y":0}, + {"matrix": [0, 13], "x":13.5, "y":0, "w":1.5}, + {"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.5}, + {"matrix": [2, 1], "x":1.5, "y":2}, + {"matrix": [2, 2], "x":2.5, "y":2}, + {"matrix": [2, 3], "x":3.5, "y":2}, + {"matrix": [2, 4], "x":4.5, "y":2}, + {"matrix": [2, 5], "x":5.5, "y":2}, + {"matrix": [2, 6], "x":6.5, "y":2}, + {"matrix": [2, 7], "x":7.5, "y":2}, + {"matrix": [2, 8], "x":8.5, "y":2}, + {"matrix": [2, 9], "x":9.5, "y":2}, + {"matrix": [2, 10], "x":10.5, "y":2}, + {"matrix": [2, 11], "x":11.5, "y":2}, + {"matrix": [2, 12], "x":12.5, "y":2}, + {"matrix": [2, 13], "x":13.5, "y":2, "w":1.5}, + {"matrix": [3, 0], "x":0, "y":3, "w":1.5}, + {"matrix": [3, 1], "x":1.5, "y":3}, + {"matrix": [3, 2], "x":2.5, "y":3}, + {"matrix": [3, 3], "x":3.5, "y":3}, + {"matrix": [3, 4], "x":4.5, "y":3}, + {"matrix": [3, 5], "x":5.5, "y":3}, + {"matrix": [3, 6], "x":6.5, "y":3}, + {"matrix": [3, 7], "x":7.5, "y":3}, + {"matrix": [3, 8], "x":8.5, "y":3}, + {"matrix": [3, 9], "x":9.5, "y":3}, + {"matrix": [3, 10], "x":10.5, "y":3}, + {"matrix": [3, 11], "x":11.5, "y":3}, + {"matrix": [3, 12], "x":12.5, "y":3}, + {"matrix": [3, 13], "x":13.5, "y":3, "w":1.5}, + {"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}, + {"matrix": [4, 3], "x":3.5, "y":4}, + {"matrix": [4, 4], "x":4.5, "y":4}, + {"matrix": [4, 5], "x":5.5, "y":4}, + {"matrix": [4, 6], "x":6.5, "y":4}, + {"matrix": [4, 7], "x":7.5, "y":4}, + {"matrix": [4, 8], "x":8.5, "y":4}, + {"matrix": [4, 9], "x":9.5, "y":4}, + {"matrix": [4, 10], "x":10.5, "y":4}, + {"matrix": [4, 11], "x":11.5, "y":4}, + {"matrix": [4, 12], "x":12.5, "y":4}, + {"matrix": [4, 13], "x":13.5, "y":4, "w":1.5}] + } + } +} diff --git a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c new file mode 100644 index 0000000000..ed36cc85fb --- /dev/null +++ b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c @@ -0,0 +1,102 @@ +/* +Copyright 2024 Matt F + +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 + + +#define _FN MO(3) +#define FN_BACK LT(3, KC_BSPC) +#define ZOOMIN C(KC_EQL) +#define ZOOMOUT C(KC_MINS) +#define NTAB C(KC_TAB) +#define BTAB C(S(KC_TAB)) + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + + /* Base Layer + + + * .-----------------------------------------------------------------------------------------------------------------------------------. + * | Grave | 1 | 2 | 3 | 4 | 5 | - | = | 6 | 7 | 8 | 9 | 0 | Backspace | + * | | | | | | | | | | | | | | | + * |-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------| + * | Tab | Q | W | E | R | T | [ | ] | Y | U | I | O | P | Del | + * | | | | | | | | | | | | | | | + * |-----------+--------+--------+--------+--------+--------|--------+--------|--------+--------+--------+-----------------+-----------| + * | FN_BACK | A | S | D | F | G | [ | ] | H | J | K | L | " | Enter | + * | | | | | | | | | | | | | ' | | + * |-----------+--------+--------+--------+--------+--------|--------+--------|--------+--------+--------------------------+-----------| + * | LShift | Z | X | C | V | B | BTab | NTab | N | M | < | > | ? | RShift | + * | | | | | | | | | | | , | . | / | | + * |-----------+--------+--------+--------+--------+-----------------+--------+--------+--------+-----------------+--------+-----------| + * | LCTRL | LGUI | LALT | FN | Space | Space |Space |Space | Space | Space | Space | RALT | FN | RCTRL | + * | | | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------------------------------' + */ + + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, 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_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, + FN_BACK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + SC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, BTAB, NTAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SC_RSPC, + KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL + ), + + [1] = LAYOUT( /* Layer One */ + + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, 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_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL + ), + + + [2] = LAYOUT( /* Layer Two */ + + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, ZOOMIN, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, + FN_BACK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LBRC, KC_RBRC, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ZOOMOUT, KC_LBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, _FN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _FN, KC_RCTL + ), + + [3] = LAYOUT( /* Layer Three */ + + 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_HOME, KC_UP, KC_END, KC_PGUP, _______, DF(0) , DF(1) , _______, _______, _______, _______, KC_PSCR, KC_BSLS, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, KC_SCLN, KC_QUOT, + _______, _______, _______, _______, _______, _______, DF(2) , _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS, KC_CAPS, + _______, _______, _______, _______, _______, _______, KC_ENT, KC_ENT, _______, _______, _______, _______, _______, QK_BOOT + ) + +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_NEXT, UG_PREV), + ENCODER_CCW_CW(KC_LBRC, KC_RBRC), ENCODER_CCW_CW(C(KC_MINS), C(KC_EQL)), + ENCODER_CCW_CW(C(KC_Z), C(S(KC_Z))), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), + ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_UP, KC_DOWN)}, + [1 ... 3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), + ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), + ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), + ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______)} +}; +#endif \ No newline at end of file diff --git a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk new file mode 100644 index 0000000000..a40474b4d5 --- /dev/null +++ b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/kradoindustries/promenade_rp24s/readme.md b/keyboards/kradoindustries/promenade_rp24s/readme.md new file mode 100644 index 0000000000..9685cb8296 --- /dev/null +++ b/keyboards/kradoindustries/promenade_rp24s/readme.md @@ -0,0 +1,29 @@ +# Promenade RP24S + +![Promenade RP24S](https://i.imgur.com/uQOhmmJ.jpeg) + +The Promenade RP24S is the solder version of the [Promenade](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kradoindustries/promenade) pcb which is based on the [Boardwalk](https://github.com/qmk/qmk_firmware/tree/master/keyboards/boardwalk), a 60% ortholinear keyboard that uses 1.5u Ergodoxian modifier keys. The original Boardwalk's split hand and 65% layouts are supported, and a new 50% extended layout similar to [RGBKB's Pan](https://github.com/qmk/qmk_firmware/tree/master/keyboards/rgbkb/pan) with two right-side macro columns was also added. In addition to Pok3r-style 60% tray mounting points, the pcb also has edge cuts for use in gummy o-ring mount boards like the Bakeneko60. Some additional spacebar options including 3u, 6u, and triple 2u were added. The pcb has two footprint locations for a JST connector, many breakout pins, and 19 rotary encoder locations. The MCU has been upgraded to a RP2040 with 32M-bit of flash memory. + + +* Keyboard Maintainer: [Feags](https://github.com/Feags) / [Krado Industries](https://kradoindustries.com/) +* Hardware Supported: Promenade pcb. Many 60% cases. +* Hardware Availability: [Krado Industries](https://kradoindustries.com/) + +Make example for this keyboard (after setting up your build environment): + + make kradoindustries/promenade_rp24s:default + +Flashing example for this keyboard: + + make kradoindustries/promenade_rp24s: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 \ No newline at end of file From 379bb770057eb4d8c49fb748813fc1b589802acc Mon Sep 17 00:00:00 2001 From: Amund Tenstad Date: Mon, 9 Dec 2024 06:44:12 +0100 Subject: [PATCH 062/592] fix: KC_MEDIA_PLAY_PAUSE label (#24693) --- data/constants/keycodes/keycodes_0.0.1_basic.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/constants/keycodes/keycodes_0.0.1_basic.hjson b/data/constants/keycodes/keycodes_0.0.1_basic.hjson index 430211ecca..66aba7b1fc 100644 --- a/data/constants/keycodes/keycodes_0.0.1_basic.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_basic.hjson @@ -1140,7 +1140,7 @@ "0x00AE": { "group": "media", "key": "KC_MEDIA_PLAY_PAUSE", - "label": "Mute", + "label": "Play/Pause Track", "aliases": [ "KC_MPLY" ] From 3c359529445942eda9c9efc3e448f059a5d24cc0 Mon Sep 17 00:00:00 2001 From: nuess0r Date: Mon, 9 Dec 2024 07:21:49 +0100 Subject: [PATCH 063/592] Adding ctrl-M replacement controller for IBM Model M (#24375) * This is a configuration of QMK intended to be used with the [ctrl-M controller](https://github.com/nuess0r/ctrl-M). * Move USB_MAX_POWER_CONSUMPTION to data driven due to upstream change * Clean up according to PR checklist Check the keymaps/nuess0r how you can make better use of your Model M including Windows, multimedia keys etc. * Move CAPS_HOLD feature from default build to custom keymap * More data driven configuration Move layout definition from ctrl_m.h to info.json Move has_ghost to info.json -> this makes the config.h file obsolete * Implement changes suggested by review * Removing user keymap (nuess0r) to follow current guidelines The nuess0r keymap which is shipped with the ctrl-M controller is kept here: https://github.com/nuess0r/qmk_firmware/tree/nuess0r_keymap * Changed image hosting location to Github requested in review by drashna * Changed image hosting location to imgur * Settings removed from info.json that are disabled by default. * Change URL as suggested by @dunk2k Not pointing to the QMK firmware but to the replacement controller electronics project. * Migrate build target markers to keyboard.json * Adding tindie link and implement review suggestions * Removing via keymap to follow current guidelines Will be moved to the https://github.com/the-via/qmk_userspace_via repo. * Add LAYOUT_all to support ANSI and ISO keyboards with the same firmware Add a LAYOUT_all similar to other keyboards that defines all available keys. Change the default keymap to use the _all layout so both ANSI and ISO Model M variants work out of the box. * Remove unnecessary enum from default keymap Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> --------- Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> --- keyboards/ibm/model_m/ctrl_m/keyboard.json | 409 ++++++++++++++++++ .../model_m/ctrl_m/keymaps/default/keymap.c | 27 ++ keyboards/ibm/model_m/ctrl_m/readme.md | 27 ++ 3 files changed, 463 insertions(+) create mode 100644 keyboards/ibm/model_m/ctrl_m/keyboard.json create mode 100644 keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c create mode 100644 keyboards/ibm/model_m/ctrl_m/readme.md diff --git a/keyboards/ibm/model_m/ctrl_m/keyboard.json b/keyboards/ibm/model_m/ctrl_m/keyboard.json new file mode 100644 index 0000000000..41801215c1 --- /dev/null +++ b/keyboards/ibm/model_m/ctrl_m/keyboard.json @@ -0,0 +1,409 @@ +{ + "keyboard_name": "ctrl-M", + "manufacturer": "nuess0r", + "url": "https://github.com/nuess0r/ctrl-m", + "maintainer": "nuess0r", + "usb": { + "vid": "0x1D50", + "pid": "0x6180", + "device_version": "1.0.0", + "max_power": 100 + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "matrix_pins": { + "cols": ["A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "C13", "C14", "C15", "F0", "F1", "A0", "A1", "A2"], + "rows": ["A3", "A4", "A5", "A6", "A7", "B0", "B1", "B2"], + "ghost": true + }, + "diode_direction": "ROW2COL", + "indicators": { + "num_lock": "B10", + "caps_lock": "B12", + "scroll_lock": "B11", + "on_state": 0 + }, + "bootmagic": { + "matrix": [0, 2] + }, + "processor": "STM32F072", + "bootloader": "stm32-dfu", + "layouts": { + "LAYOUT_fullsize_ansi_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0}, + {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0}, + {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0}, + {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0}, + {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0}, + + {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0}, + + {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5}, + {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5}, + {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5}, + {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5}, + {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5}, + {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5}, + {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5}, + {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5}, + {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5}, + {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5}, + {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5}, + {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2}, + + {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5}, + {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5}, + {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5}, + + {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5}, + {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5}, + {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5}, + {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5}, + + {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5}, + {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5}, + {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5}, + {"label": "|", "matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5}, + + {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5}, + {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5}, + {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5}, + + {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5}, + {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5}, + {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5}, + {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2}, + + {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5}, + {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5}, + {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5}, + {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5}, + {"label": "Enter", "matrix": [6, 6], "x": 12.75, "y": 3.5, "w": 2.25}, + + {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5}, + {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5}, + {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5}, + + {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 2.25}, + {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5}, + {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5}, + {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5}, + {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75}, + + {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5}, + + {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5}, + {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5}, + {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5}, + {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2}, + + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5}, + {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7}, + {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5}, + {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5}, + + {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5}, + {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5}, + {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5}, + + {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5} + ] + }, + "LAYOUT_fullsize_iso_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0}, + {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0}, + {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0}, + {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0}, + {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0}, + + {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0}, + + {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5}, + {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5}, + {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5}, + {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5}, + {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5}, + {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5}, + {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5}, + {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5}, + {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5}, + {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5}, + {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5}, + {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2}, + + {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5}, + {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5}, + {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5}, + + {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5}, + {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5}, + {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5}, + {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5}, + + {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5}, + {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5}, + {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5}, + + {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5}, + {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5}, + {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5}, + + {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5}, + {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5}, + {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5}, + {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2}, + + {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5}, + {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5}, + {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5}, + {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5}, + {"label": "NUHS", "matrix": [6, 10], "x": 12.75, "y": 3.5}, + {"label": "Enter", "matrix": [6, 6], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2}, + + {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5}, + {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5}, + {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5}, + + {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25}, + {"label": "NUBS", "matrix": [0, 3], "x": 1.25, "y": 4.5}, + {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5}, + {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5}, + {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5}, + {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75}, + + {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5}, + + {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5}, + {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5}, + {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5}, + {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2}, + + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5}, + {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7}, + {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5}, + {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5}, + + {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5}, + {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5}, + {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5}, + + {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5} + ] + }, + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 2], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [2, 3], "x": 2, "y": 0}, + {"label": "F2", "matrix": [2, 4], "x": 3, "y": 0}, + {"label": "F3", "matrix": [1, 4], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 8], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [1, 9], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [2, 9], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [2, 6], "x": 11, "y": 0}, + {"label": "F10", "matrix": [3, 6], "x": 12, "y": 0}, + {"label": "F11", "matrix": [3, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [3, 12], "x": 14, "y": 0}, + + {"label": "PrtSc", "matrix": [3, 15], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [4, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [6, 14], "x": 17.25, "y": 0}, + + {"label": "~", "matrix": [2, 2], "x": 0, "y": 1.5}, + {"label": "!", "matrix": [3, 2], "x": 1, "y": 1.5}, + {"label": "@", "matrix": [3, 3], "x": 2, "y": 1.5}, + {"label": "#", "matrix": [3, 4], "x": 3, "y": 1.5}, + {"label": "$", "matrix": [3, 5], "x": 4, "y": 1.5}, + {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "^", "matrix": [2, 7], "x": 6, "y": 1.5}, + {"label": "&", "matrix": [3, 7], "x": 7, "y": 1.5}, + {"label": "*", "matrix": [3, 8], "x": 8, "y": 1.5}, + {"label": "(", "matrix": [3, 9], "x": 9, "y": 1.5}, + {"label": ")", "matrix": [3, 10], "x": 10, "y": 1.5}, + {"label": "_", "matrix": [2, 10], "x": 11, "y": 1.5}, + {"label": "+", "matrix": [2, 8], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [1, 6], "x": 13, "y": 1.5, "w": 2}, + + {"label": "Insert", "matrix": [2, 12], "x": 15.25, "y": 1.5}, + {"label": "Home", "matrix": [2, 14], "x": 16.25, "y": 1.5}, + {"label": "PgUp", "matrix": [2, 13], "x": 17.25, "y": 1.5}, + + {"label": "Num Lock", "matrix": [6, 11], "x": 18.5, "y": 1.5}, + {"label": "/", "matrix": [6, 12], "x": 19.5, "y": 1.5}, + {"label": "*", "matrix": [6, 13], "x": 20.5, "y": 1.5}, + {"label": "-", "matrix": [7, 13], "x": 21.5, "y": 1.5}, + + {"label": "Tab", "matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 2], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 3], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 4], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 5], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [1, 7], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [4, 10], "x": 10.5, "y": 2.5}, + {"label": "{", "matrix": [1, 10], "x": 11.5, "y": 2.5}, + {"label": "}", "matrix": [1, 8], "x": 12.5, "y": 2.5}, + {"label": "|", "matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5}, + + {"label": "Delete", "matrix": [2, 11], "x": 15.25, "y": 2.5}, + {"label": "End", "matrix": [3, 14], "x": 16.25, "y": 2.5}, + {"label": "PgDn", "matrix": [3, 13], "x": 17.25, "y": 2.5}, + + {"label": "7", "matrix": [4, 11], "x": 18.5, "y": 2.5}, + {"label": "8", "matrix": [4, 12], "x": 19.5, "y": 2.5}, + {"label": "9", "matrix": [4, 13], "x": 20.5, "y": 2.5}, + {"label": "+", "matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2}, + + {"label": "Caps Lock", "matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5}, + {"label": "A", "matrix": [5, 2], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [5, 3], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [5, 4], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [5, 5], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [0, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [0, 7], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [5, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [5, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [5, 9], "x": 9.75, "y": 3.5}, + {"label": ":", "matrix": [5, 10], "x": 10.75, "y": 3.5}, + {"label": "\"", "matrix": [0, 10], "x": 11.75, "y": 3.5}, + {"label": "NUHS", "matrix": [6, 10], "x": 12.75, "y": 3.5}, + {"label": "Enter", "matrix": [6, 6], "x": 13.75, "y": 3.5, "w": 1.25}, + + {"label": "4", "matrix": [1, 11], "x": 18.5, "y": 3.5}, + {"label": "5", "matrix": [1, 12], "x": 19.5, "y": 3.5}, + {"label": "6", "matrix": [1, 13], "x": 20.5, "y": 3.5}, + + {"label": "Shift", "matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25}, + {"label": "NUBS", "matrix": [0, 3], "x": 1.25, "y": 4.5}, + {"label": "Z", "matrix": [6, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [6, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [6, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [6, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [7, 5], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [7, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [6, 7], "x": 8.25, "y": 4.5}, + {"label": "<", "matrix": [6, 8], "x": 9.25, "y": 4.5}, + {"label": ">", "matrix": [6, 9], "x": 10.25, "y": 4.5}, + {"label": "?", "matrix": [7, 10], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75}, + + {"label": "\u2191", "matrix": [0, 14], "x": 16.25, "y": 4.5}, + + {"label": "1", "matrix": [5, 11], "x": 18.5, "y": 4.5}, + {"label": "2", "matrix": [5, 12], "x": 19.5, "y": 4.5}, + {"label": "3", "matrix": [5, 13], "x": 20.5, "y": 4.5}, + {"label": "Enter", "matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2}, + + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"label": "Alt", "matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5}, + {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7}, + {"label": "Alt", "matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5}, + {"label": "Ctrl", "matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5}, + + {"label": "\u2190", "matrix": [7, 14], "x": 15.25, "y": 5.5}, + {"label": "\u2193", "matrix": [7, 11], "x": 16.25, "y": 5.5}, + {"label": "\u2192", "matrix": [7, 12], "x": 17.25, "y": 5.5}, + + {"label": "0", "matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [0, 13], "x": 20.5, "y": 5.5} + ] + } + } +} diff --git a/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c b/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c new file mode 100644 index 0000000000..741cb1c4ba --- /dev/null +++ b/keyboards/ibm/model_m/ctrl_m/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +/* Copyright 2020 Michael Schwingen + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( /* Base layer - standard layout without any special functions */ + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS , KC_HOME, KC_PGUP, 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_DEL , KC_END , KC_PGDN, 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_NUHS, KC_ENT , KC_P4, KC_P5 , KC_P6 , + 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_P1, KC_P2 , KC_P3 , KC_PENT, + KC_LCTL, KC_LALT, KC_SPC , KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT + ) +}; diff --git a/keyboards/ibm/model_m/ctrl_m/readme.md b/keyboards/ibm/model_m/ctrl_m/readme.md new file mode 100644 index 0000000000..aab3a685f2 --- /dev/null +++ b/keyboards/ibm/model_m/ctrl_m/readme.md @@ -0,0 +1,27 @@ +# ctrl-M + +![ctrl-M PCB](https://i.imgur.com/wUqY8N3.jpeg) + +This is a configuration of QMK intended to be used with the [ctrl-M controller](https://github.com/nuess0r/ctrl-M). Many thanks to iw0rm3r, ashpil, mschwingen and all QMK contributors for working on similar projects and providing the foundation for this! + +* Keyboard Maintainer: [nuess0r](https://github.com/nuess0r) +* Hardware Supported: [ctrl-M](https://github.com/nuess0r/ctrl-m) +* Hardware Availability: [tindie shop](https://www.tindie.com/products/brain4free/ctrl-m/) + +Example how to compile for this keyboard (after setting up your build environment): + + make ibm/model_m/ctrl_m:default + +Flashing example for this keyboard: + + make ibm/model_m/ctrl_m: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 Escape key and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB and plug in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 39958fe85458ac9cc29694a0bb49c12e1b561d71 Mon Sep 17 00:00:00 2001 From: Lostdotfish Date: Mon, 9 Dec 2024 06:31:49 +0000 Subject: [PATCH 064/592] [Keyboard] Add Orbweaver (#24692) * Create README.md * Add files via upload * Create keymap.c * Update README.md * Update keyboards/lostdotfish/rp2040_orbweaver/README.md Co-authored-by: Drashna Jaelre * Update keyboards/lostdotfish/rp2040_orbweaver/keyboard.json Co-authored-by: Drashna Jaelre * Rename README.md to readme.md * Update readme.md * Update keyboards/lostdotfish/rp2040_orbweaver/keyboard.json Co-authored-by: Drashna Jaelre * Update keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h Co-authored-by: Drashna Jaelre * Update keyboard.json * Update keyboards/lostdotfish/rp2040_orbweaver/config.h Co-authored-by: Drashna Jaelre * Update keyboard.json * Update mcuconf.h * Update rp2040_orbweaver.c * Delete keyboards/lostdotfish/rp2040_orbweaver/halconf.h * Update config.h * Update readme.md * Update readme.md * Update readme.md * Update keyboards/lostdotfish/rp2040_orbweaver/keyboard.json --------- Co-authored-by: Drashna Jaelre Co-authored-by: jack --- .../lostdotfish/rp2040_orbweaver/config.h | 21 +++ .../rp2040_orbweaver/keyboard.json | 141 ++++++++++++++++++ .../rp2040_orbweaver/keymaps/default/keymap.c | 78 ++++++++++ .../lostdotfish/rp2040_orbweaver/mcuconf.h | 9 ++ .../lostdotfish/rp2040_orbweaver/readme.md | 51 +++++++ .../rp2040_orbweaver/rp2040_orbweaver.c | 64 ++++++++ 6 files changed, 364 insertions(+) create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/config.h create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/keyboard.json create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/readme.md create mode 100644 keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c diff --git a/keyboards/lostdotfish/rp2040_orbweaver/config.h b/keyboards/lostdotfish/rp2040_orbweaver/config.h new file mode 100644 index 0000000000..da2709dc5b --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/config.h @@ -0,0 +1,21 @@ +/* Copyright 2024 lostdotfish +* +* 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 <http://www.gnu.org/licenses/>. +*/ + +#pragma once +#define I2C_DRIVER I2CD0 +#define I2C1_SDA_PIN GP12 +#define I2C1_SCL_PIN GP13 +#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json new file mode 100644 index 0000000000..b711d9c4a8 --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json @@ -0,0 +1,141 @@ + +{ + "manufacturer": "Lostdotfish", + "keyboard_name": "rp2040_orbweaver", + "maintainer": "Lostdotfish", + "url": "https://geekhack.org/index.php?topic=124092.0", + "bootloader": "rp2040", + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "rgb_matrix": { + "driver": "is31fl3731", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 40, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 60, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 0, "y": 20, "flags": 4}, + {"matrix": [1, 0], "x": 20, "y": 20, "flags": 4}, + {"matrix": [1, 1], "x": 40, "y": 20, "flags": 4}, + {"matrix": [1, 2], "x": 60, "y": 20, "flags": 4}, + {"matrix": [1, 3], "x": 80, "y": 20, "flags": 4}, + {"matrix": [1, 4], "x": 0, "y": 40, "flags": 4}, + {"matrix": [2, 0], "x": 20, "y": 40, "flags": 4}, + {"matrix": [2, 1], "x": 40, "y": 40, "flags": 4}, + {"matrix": [2, 2], "x": 60, "y": 40, "flags": 4}, + {"matrix": [2, 3], "x": 80, "y": 40, "flags": 4}, + {"matrix": [2, 4], "x": 0, "y": 60, "flags": 4}, + {"matrix": [3, 0], "x": 20, "y": 60, "flags": 4}, + {"matrix": [3, 1], "x": 40, "y": 60, "flags": 4}, + {"matrix": [3, 2], "x": 60, "y": 60, "flags": 4}, + {"matrix": [3, 4], "x": 80, "y": 60, "flags": 4} + ], + "led_flush_limit": 26, + "led_process_limit": 5, + "max_brightness": 220, + "sleep": true, + "center_point": [40, 30], + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "flower_blooming": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true, + "starlight": true, + "starlight_dual_sat": true, + "starlight_dual_hue": true, + "riverflow": true + } +}, + "matrix_pins": { + "rows": ["GP0", "GP1", "GP2", "GP3", "GP10", "GP9"], + "cols": ["GP4", "GP5", "GP8", "GP7", "GP6"] + }, + + "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}, + {"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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [5, 0], "x": 0, "y": 5}, + ] + } + } +} diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c new file mode 100644 index 0000000000..f98f656bc9 --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c @@ -0,0 +1,78 @@ +/* Copyright 2024 lostdotfish +* +* 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 <http://www.gnu.org/licenses/>. +*/ + +#include QMK_KEYBOARD_H + + +enum orbweaver_layers { + _DEFAULT, + _LETTERS, + _CONTROL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +//generic default keymap with Razor defaults (+ 20 shifts layer) + + [_DEFAULT] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, + KC_LSFT, KC_Z, KC_X, KC_C, TO(1), + KC_LALT, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT, + KC_SPACE + ), + +//Second example keymap with all modifier keys replaced with numbers or letters + + [_LETTERS] = LAYOUT( + KC_0, KC_1, KC_2, KC_3, KC_4, + KC_I, KC_Q, KC_W, KC_E, KC_R, + KC_J, KC_A, KC_S, KC_D, KC_F, + KC_K, KC_Z, KC_X, KC_C, TO(2), + KC_L, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT, + KC_SPACE + ), + +//, RGB Contol Keymap + [_CONTROL] = LAYOUT( + RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, + RM_PREV, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, + RM_TOGG, KC_A, KC_S, KC_D, KC_F, + KC_K, KC_Z, KC_X, KC_C, TO(0), + KC_L, KC_UP, KC_DOWN, KC_RIGHT, KC_LEFT, + KC_SPACE + ) + +}; + +layer_state_t layer_state_set_user(layer_state_t state) { + gpio_write_pin_high(GP23); + gpio_write_pin_high(GP24); + gpio_write_pin_high(GP25); + switch (get_highest_layer(state)) { + case _DEFAULT: + gpio_write_pin_low(GP23); + break; + case _LETTERS: + gpio_write_pin_low(GP25); + break; + case _CONTROL: + gpio_write_pin_low(GP24); + break; + } + return state; +} diff --git a/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h b/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h new file mode 100644 index 0000000000..f9b642b1f4 --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2023 zzeneg (@zzeneg) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE diff --git a/keyboards/lostdotfish/rp2040_orbweaver/readme.md b/keyboards/lostdotfish/rp2040_orbweaver/readme.md new file mode 100644 index 0000000000..0a4a64d7d6 --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/readme.md @@ -0,0 +1,51 @@ +# rp2040_orbweaver +QMK firmware for RP2040 based MCU replacement PCB for the Razer Orbweaver gaming keypad + +![RP2040 Orbweaver](https://i.imgur.com/GCPRUbs.png) + + +This firmware is for the Razer Orbweaver Chroma keypad with a custom, plug and play, RP2040 MCU PCB. For installation instructions and board availability see [geekhack](https://geekhack.org/index.php?topic=124092.0). + +The firmware controls a 6x5 key matrix (4x5 keypad + 6 additional keys on the thumb pad and up to 4 additional keys added by user). It also controls a IS31FL3731 RGB Matrix controller (on the Chroma model) via I2C interface. This requires a single I2C Driver with 20 common anode RGB LEDs. + +Key 20 (bottom right) is used to switch layers. + +The default key map provides 3 preset layers. + +(layer 0) is a generic layer based on the original Razer defaults. +(layer 1) replaces modifier keys with letter keys. +(layer 2) replaces the 2 top rows with RGB control keys. + +The three LEDs on the thumb pad indicate the active layer. + +Blue = layer 0 +Green = layer 1 +Yellow = layer 3 + +All LEDs will be off when any other (user added) layout is activated + +A set of RGB animations are included in confg.h. These are controlled by activating the Yellow layer and using keys 01 - 11 (11 toggles the lighting on and off - see /keymaps/default/keymap.c for more information) + +Many thanks to a_marmot. Without his original handwired project, this board would not have been possible. His original work can be found here. [geekhack](https://geekhack.org/index.php?topic=119396.0). + +* Keyboard Maintainer: [Lostdotfish](https://github.com/Lostdotfish) +* Hardware Supported: RP2040 + IS31FL3731 +* Hardware Availability: [https://geekhack.org/index.php?topic=124092.0](https://geekhack.org/index.php?topic=124092.0) + +Make example for this keyboard (after setting up your build environment): + + make lostdotfish/rp2040_orbweaver:default + +Flashing example for this keyboard: + + make lostdotfish/rp2040_orbweaver: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: + +* Press and hold the upper left hand key on the main keyboard while you plug in the USB. +* Press and release the boot button on the top of the RP2040_Orbweaver v2.0 inside the modded unit. diff --git a/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c b/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c new file mode 100644 index 0000000000..a1ba7c8d1f --- /dev/null +++ b/keyboards/lostdotfish/rp2040_orbweaver/rp2040_orbweaver.c @@ -0,0 +1,64 @@ +/* Copyright 2024 lostdotfish +* +* 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 <http://www.gnu.org/licenses/>. +*/ + +#include "rgb_matrix.h" +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Initialize Reset pins + + gpio_set_pin_output(GP23); + gpio_set_pin_output(GP24); + gpio_set_pin_output(GP25); + + gpio_write_pin_high(GP23); + gpio_write_pin_high(GP24); + gpio_write_pin_high(GP25); + + keyboard_pre_init_user(); +} + + + +const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C9_1, C8_1, C7_1}, //top left key. + {0, C9_2, C8_2, C7_2}, + {0, C9_3, C8_3, C7_3}, + {0, C9_4, C8_4, C7_4}, + {0, C9_5, C8_5, C7_5}, //top right key. + {0, C9_6, C8_6, C7_6}, + {0, C9_7, C8_7, C6_6}, + {0, C9_8, C7_7, C6_7}, + {0, C1_8, C2_8, C3_8}, + {0, C1_7, C2_7, C3_7}, + {0, C1_6, C2_6, C3_6}, + {0, C1_5, C2_5, C3_5}, + {0, C1_4, C2_4, C3_4}, + {0, C1_3, C2_3, C3_3}, + {0, C1_2, C2_2, C4_3}, + {0, C1_1, C3_2, C4_2}, //lower left key + {0, C9_9, C8_9, C7_9}, + {0, C9_10, C8_10, C7_10}, + {0, C9_11, C8_11, C7_11}, + {0, C9_12, C8_12, C7_12} //lower right key + +}; From 388c3c6d1256a2b66a3ac23d28d8f8937ffdc039 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:33:40 +0100 Subject: [PATCH 065/592] Addition of EC65X (#24648) --- keyboards/cipulot/ec_65x/config.h | 69 +++ keyboards/cipulot/ec_65x/halconf.h | 23 + keyboards/cipulot/ec_65x/keyboard.json | 420 ++++++++++++++++++ .../ec_65x/keymaps/65_ansi_blocker/keymap.c | 42 ++ .../keymaps/65_ansi_blocker_tsangan/keymap.c | 42 ++ .../ec_65x/keymaps/65_iso_blocker/keymap.c | 42 ++ .../keymaps/65_iso_blocker_tsangan/keymap.c | 42 ++ .../cipulot/ec_65x/keymaps/default/keymap.c | 42 ++ keyboards/cipulot/ec_65x/mcuconf.h | 25 ++ keyboards/cipulot/ec_65x/post_rules.mk | 1 + keyboards/cipulot/ec_65x/readme.md | 26 ++ keyboards/cipulot/ec_65x/rules.mk | 1 + 12 files changed, 775 insertions(+) create mode 100644 keyboards/cipulot/ec_65x/config.h create mode 100644 keyboards/cipulot/ec_65x/halconf.h create mode 100644 keyboards/cipulot/ec_65x/keyboard.json create mode 100644 keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c create mode 100644 keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c create mode 100644 keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_65x/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/ec_65x/mcuconf.h create mode 100644 keyboards/cipulot/ec_65x/post_rules.mk create mode 100644 keyboards/cipulot/ec_65x/readme.md create mode 100644 keyboards/cipulot/ec_65x/rules.mk diff --git a/keyboards/cipulot/ec_65x/config.h b/keyboards/cipulot/ec_65x/config.h new file mode 100644 index 0000000000..142f7a140e --- /dev/null +++ b/keyboards/cipulot/ec_65x/config.h @@ -0,0 +1,69 @@ +/* Copyright 2024 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 MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +#define MATRIX_ROW_PINS \ + { A8, A15, B13, B8, B9} + +#define AMUX_COUNT 1 +#define AMUX_MAX_COLS_COUNT 16 + +#define AMUX_EN_PINS \ + { B5 } + +#define AMUX_SEL_PINS \ + { B6, B7, B4, B3 } + +#define AMUX_COL_CHANNELS_SIZES \ + { 16 } + +#define AMUX_0_COL_CHANNELS \ + { 7, 6, 5, 4, 3, 2, 1, 0, 8, 15, 14, 12, 11, 13, 9, 10} + +#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS + +#define DISCHARGE_PIN A2 +#define ANALOG_PORT A3 + +#define DEFAULT_ACTUATION_MODE 0 +#define DEFAULT_MODE_0_ACTUATION_LEVEL 550 +#define DEFAULT_MODE_0_RELEASE_LEVEL 500 +#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL +#define DEFAULT_MODE_1_ACTUATION_OFFSET 70 +#define DEFAULT_MODE_1_RELEASE_OFFSET 70 +#define DEFAULT_EXTREMUM 1023 +#define EXPECTED_NOISE_FLOOR 0 +#define NOISE_FLOOR_THRESHOLD 50 +#define BOTTOMING_CALIBRATION_THRESHOLD 50 +#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30 +#define DEFAULT_BOTTOMING_READING 1023 +#define DEFAULT_CALIBRATION_STARTER true + +#define DISCHARGE_TIME 10 + +#define EECONFIG_KB_DATA_SIZE 169 + +// PWM driver with direct memory access (DMA) support +#define WS2812_PWM_COMPLEMENTARY_OUTPUT +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 1 +#define WS2812_DMA_STREAM STM32_DMA2_STREAM5 +#define WS2812_DMA_CHANNEL 6 diff --git a/keyboards/cipulot/ec_65x/halconf.h b/keyboards/cipulot/ec_65x/halconf.h new file mode 100644 index 0000000000..fb0f77d82f --- /dev/null +++ b/keyboards/cipulot/ec_65x/halconf.h @@ -0,0 +1,23 @@ +/* Copyright 2024 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_ADC TRUE +#define HAL_USE_PAL TRUE +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cipulot/ec_65x/keyboard.json b/keyboards/cipulot/ec_65x/keyboard.json new file mode 100644 index 0000000000..2baf3ea5f0 --- /dev/null +++ b/keyboards/cipulot/ec_65x/keyboard.json @@ -0,0 +1,420 @@ +{ + "manufacturer": "Cipulot", + "keyboard_name": "EC 65X", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "processor": "STM32F411", + "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": 19 + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x6BD1", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "ws2812": { + "driver": "pwm", + "pin": "B15" + }, + "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "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": [1, 15], "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": [2, 15], "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, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "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": [1, 15], "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": [2, 15], "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, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "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, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [1, 15], "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, 15], "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, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "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, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [1, 15], "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, 15], "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, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "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": [0, 15], "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": 0.75}, + {"matrix": [1, 14], "x": 14.25, "y": 1, "w": 0.75}, + {"matrix": [1, 15], "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": [2, 15], "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, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "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, 4], "x": 3.75, "y": 4, "w": 2.25}, + {"matrix": [4, 6], "x": 6, "y": 4, "w": 1.25}, + {"matrix": [4, 8], "x": 7.25, "y": 4, "w": 2.75}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c new file mode 100644 index 0000000000..9af029b2e3 --- /dev/null +++ b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_ansi_blocker( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c new file mode 100644 index 0000000000..69f17a0ae4 --- /dev/null +++ b/keyboards/cipulot/ec_65x/keymaps/65_ansi_blocker_tsangan/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_ansi_blocker_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c new file mode 100644 index 0000000000..0d695c2978 --- /dev/null +++ b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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_ENTER, 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_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, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_iso_blocker( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c new file mode 100644 index 0000000000..867167cdea --- /dev/null +++ b/keyboards/cipulot/ec_65x/keymaps/65_iso_blocker_tsangan/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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_ENTER, 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_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, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_iso_blocker_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_65x/keymaps/default/keymap.c b/keyboards/cipulot/ec_65x/keymaps/default/keymap.c new file mode 100644 index 0000000000..e7fb368b0c --- /dev/null +++ b/keyboards/cipulot/ec_65x/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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_ENTER, 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, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_all( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_65x/mcuconf.h b/keyboards/cipulot/ec_65x/mcuconf.h new file mode 100644 index 0000000000..88185d8e9d --- /dev/null +++ b/keyboards/cipulot/ec_65x/mcuconf.h @@ -0,0 +1,25 @@ +/* Copyright 2024 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_ADC_USE_ADC1 +#define STM32_ADC_USE_ADC1 TRUE + +#undef STM32_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/cipulot/ec_65x/post_rules.mk b/keyboards/cipulot/ec_65x/post_rules.mk new file mode 100644 index 0000000000..5dba48cc5f --- /dev/null +++ b/keyboards/cipulot/ec_65x/post_rules.mk @@ -0,0 +1 @@ +include keyboards/cipulot/common/common_cipulot.mk diff --git a/keyboards/cipulot/ec_65x/readme.md b/keyboards/cipulot/ec_65x/readme.md new file mode 100644 index 0000000000..786d2b4504 --- /dev/null +++ b/keyboards/cipulot/ec_65x/readme.md @@ -0,0 +1,26 @@ +# EC 65X + +![EC 65X PCB](https://i.imgur.com/8B86zsO.png) + +Universal 65% Electrostatic Capacitive PCB, with multi-layout support. + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: EC 65X +* Hardware Availability: TBD + +Make example for this keyboard (after setting up your build environment): + + make cipulot/ec_66x:default + +Flashing example for this keyboard: + + make cipulot/ec_66x: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: + +* **Physical button**: Long press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cipulot/ec_65x/rules.mk b/keyboards/cipulot/ec_65x/rules.mk new file mode 100644 index 0000000000..3aa0e2bf06 --- /dev/null +++ b/keyboards/cipulot/ec_65x/rules.mk @@ -0,0 +1 @@ +OPT = 2 From 847257c3c757c475eb9f47493252cc55b0e08f51 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:34:07 +0100 Subject: [PATCH 066/592] Addition of EC TKL X (#24647) --- keyboards/cipulot/ec_tkl_x/config.h | 68 ++ keyboards/cipulot/ec_tkl_x/halconf.h | 23 + keyboards/cipulot/ec_tkl_x/keyboard.json | 714 ++++++++++++++++++ .../cipulot/ec_tkl_x/keymaps/default/keymap.c | 45 ++ .../keymaps/tkl_ansi_tsangan/keymap.c | 45 ++ .../keymaps/tkl_f13_ansi_tsangan/keymap.c | 45 ++ .../keymaps/tkl_f13_iso_tsangan/keymap.c | 45 ++ .../ec_tkl_x/keymaps/tkl_f13_jis/keymap.c | 47 ++ .../ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c | 45 ++ .../cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c | 47 ++ keyboards/cipulot/ec_tkl_x/mcuconf.h | 25 + keyboards/cipulot/ec_tkl_x/post_rules.mk | 1 + keyboards/cipulot/ec_tkl_x/readme.md | 26 + keyboards/cipulot/ec_tkl_x/rules.mk | 1 + 14 files changed, 1177 insertions(+) create mode 100644 keyboards/cipulot/ec_tkl_x/config.h create mode 100644 keyboards/cipulot/ec_tkl_x/halconf.h create mode 100644 keyboards/cipulot/ec_tkl_x/keyboard.json create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c create mode 100644 keyboards/cipulot/ec_tkl_x/mcuconf.h create mode 100644 keyboards/cipulot/ec_tkl_x/post_rules.mk create mode 100644 keyboards/cipulot/ec_tkl_x/readme.md create mode 100644 keyboards/cipulot/ec_tkl_x/rules.mk diff --git a/keyboards/cipulot/ec_tkl_x/config.h b/keyboards/cipulot/ec_tkl_x/config.h new file mode 100644 index 0000000000..04d19a5f54 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/config.h @@ -0,0 +1,68 @@ +/* Copyright 2024 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 MATRIX_ROWS 6 +#define MATRIX_COLS 18 + +#define UNUSED_POSITIONS_LIST { {0, 13}, {3, 14}, {3, 15}, {3, 16}, {3, 17}, {4, 15}, {4, 17}, {5, 3}, {5, 5}, {5, 7}, {5, 10}, {5, 15} } + +#define MATRIX_ROW_PINS {A15, B5, B12, B10, B6, B7} + +#define AMUX_COUNT 2 +#define AMUX_MAX_COLS_COUNT 15 + +#define AMUX_EN_PINS {B13, A10} + +#define AMUX_SEL_PINS {A8, A9, B14, B15} + +#define AMUX_COL_CHANNELS_SIZES {15, 3} + +#define AMUX_0_COL_CHANNELS {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} + +#define AMUX_1_COL_CHANNELS {3, 0, 1} + +#define AMUX_COL_CHANNELS AMUX_0_COL_CHANNELS, AMUX_1_COL_CHANNELS + +#define DISCHARGE_PIN A4 +#define ANALOG_PORT A2 + +#define DEFAULT_ACTUATION_MODE 0 +#define DEFAULT_MODE_0_ACTUATION_LEVEL 550 +#define DEFAULT_MODE_0_RELEASE_LEVEL 500 +#define DEFAULT_MODE_1_INITIAL_DEADZONE_OFFSET DEFAULT_MODE_0_ACTUATION_LEVEL +#define DEFAULT_MODE_1_ACTUATION_OFFSET 70 +#define DEFAULT_MODE_1_RELEASE_OFFSET 70 +#define DEFAULT_EXTREMUM 1023 +#define EXPECTED_NOISE_FLOOR 0 +#define NOISE_FLOOR_THRESHOLD 50 +#define BOTTOMING_CALIBRATION_THRESHOLD 50 +#define DEFAULT_NOISE_FLOOR_SAMPLING_COUNT 30 +#define DEFAULT_BOTTOMING_READING 1023 +#define DEFAULT_CALIBRATION_STARTER true + +#define DISCHARGE_TIME 10 + +// #define DEBUG_MATRIX_SCAN_RATE +#define EECONFIG_KB_DATA_SIZE 225 + +// PWM driver with direct memory access (DMA) support +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 1 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_DMA_CHANNEL 5 diff --git a/keyboards/cipulot/ec_tkl_x/halconf.h b/keyboards/cipulot/ec_tkl_x/halconf.h new file mode 100644 index 0000000000..fb0f77d82f --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/halconf.h @@ -0,0 +1,23 @@ +/* Copyright 2024 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_ADC TRUE +#define HAL_USE_PAL TRUE +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cipulot/ec_tkl_x/keyboard.json b/keyboards/cipulot/ec_tkl_x/keyboard.json new file mode 100644 index 0000000000..9149fb1d3b --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keyboard.json @@ -0,0 +1,714 @@ +{ + "manufacturer": "Cipulot", + "keyboard_name": "EC TKL X", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 8192 + } + }, + "features": { + "bootmagic": false, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "processor": "STM32F411", + "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": 22 + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x6BC8", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "ws2812": { + "driver": "pwm", + "pin": "B4" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 0.75}, + {"matrix": [2, 14], "x": 14.25, "y": 2.25, "w": 0.75}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 0.75}, + {"matrix": [4, 14], "x": 14, "y": 4.25}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5}, + {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5}, + {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_iso_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_f13_jis": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.75, "y": 0}, + {"matrix": [0, 10], "x": 10.75, "y": 0}, + {"matrix": [0, 11], "x": 11.75, "y": 0}, + {"matrix": [0, 12], "x": 12.75, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5}, + {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5}, + {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_iso_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 14], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.25, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_jis": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "y": 0}, + {"matrix": [0, 16], "x": 16.25, "y": 0}, + {"matrix": [0, 17], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [1, 14], "x": 14, "y": 1.25}, + {"matrix": [1, 15], "x": 15.25, "y": 1.25}, + {"matrix": [1, 16], "x": 16.25, "y": 1.25}, + {"matrix": [1, 17], "x": 17.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 14], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"matrix": [2, 15], "x": 15.25, "y": 2.25}, + {"matrix": [2, 16], "x": 16.25, "y": 2.25}, + {"matrix": [2, 17], "x": 17.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 16], "x": 16.25, "y": 4.25}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 4], "x": 4, "y": 5.25, "w": 1.5}, + {"matrix": [5, 6], "x": 5.5, "y": 5.25, "w": 2.5}, + {"matrix": [5, 8], "x": 8, "y": 5.25, "w": 1.5}, + {"matrix": [5, 9], "x": 9.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 16], "x": 16.25, "y": 5.25}, + {"matrix": [5, 17], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c new file mode 100644 index 0000000000..9a357e2cf3 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_all( + 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_F13, KC_PSCR, KC_SCRL, KC_PAUS, + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_ENTER, KC_DEL, KC_END, KC_PGDN, + 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_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_RSFT, MO(1), KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_all( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c new file mode 100644 index 0000000000..86b0699986 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_ansi_tsangan/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_ansi_tsangan( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_ansi_tsangan( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_ansi_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c new file mode 100644 index 0000000000..eece893fe4 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_ansi_tsangan/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_f13_ansi_tsangan( + 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_F13, KC_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_f13_ansi_tsangan( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_f13_ansi_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c new file mode 100644 index 0000000000..9af7db9008 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_iso_tsangan/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_f13_ansi_tsangan( + 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_F13, KC_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_f13_ansi_tsangan( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_f13_ansi_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c new file mode 100644 index 0000000000..8e0fd18d0b --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_f13_jis/keymap.c @@ -0,0 +1,47 @@ +/* Copyright 2024 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 + +#include "keymap_japanese.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_f13_jis( + 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_F13, KC_PSCR, KC_SCRL, KC_PAUS, + JP_ZKHK, JP_1, JP_2, JP_3, JP_4, JP_5, JP_6, JP_7, JP_8, JP_9, JP_0, JP_MINS, JP_CIRC, JP_YEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, JP_Q, JP_W, JP_E, JP_R, JP_T, JP_Y, JP_U, JP_I, JP_O, JP_P, JP_AT, JP_LBRC, KC_ENTER, KC_DEL, KC_END, KC_PGDN, + JP_EISU, JP_A, JP_S, JP_D, JP_F, JP_G, JP_H, JP_J, JP_K, JP_L, JP_SCLN, JP_COLN, JP_RBRC, + KC_LSFT, JP_Z, JP_X, JP_C, JP_V, JP_B, JP_N, JP_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_HENK, JP_KANA, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_f13_jis( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_f13_jis( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c new file mode 100644 index 0000000000..bae33d072d --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_iso_tsangan/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2024 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_ansi_tsangan( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_ansi_tsangan( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_ansi_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c new file mode 100644 index 0000000000..f445d71d6e --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/keymaps/tkl_jis/keymap.c @@ -0,0 +1,47 @@ +/* Copyright 2024 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 + +#include "keymap_japanese.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_tkl_jis( + 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_PSCR, KC_SCRL, KC_PAUS, + JP_ZKHK, JP_1, JP_2, JP_3, JP_4, JP_5, JP_6, JP_7, JP_8, JP_9, JP_0, JP_MINS, JP_CIRC, JP_YEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, + KC_TAB, JP_Q, JP_W, JP_E, JP_R, JP_T, JP_Y, JP_U, JP_I, JP_O, JP_P, JP_AT, JP_LBRC, KC_ENTER, KC_DEL, KC_END, KC_PGDN, + JP_EISU, JP_A, JP_S, JP_D, JP_F, JP_G, JP_H, JP_J, JP_K, JP_L, JP_SCLN, JP_COLN, JP_RBRC, + KC_LSFT, JP_Z, JP_X, JP_C, JP_V, JP_B, JP_N, JP_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, JP_MHEN, KC_SPC, JP_HENK, JP_KANA, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_tkl_jis( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______), + + [2] = LAYOUT_tkl_jis( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) + // clang-format on +}; diff --git a/keyboards/cipulot/ec_tkl_x/mcuconf.h b/keyboards/cipulot/ec_tkl_x/mcuconf.h new file mode 100644 index 0000000000..99b613c493 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/mcuconf.h @@ -0,0 +1,25 @@ +/* Copyright 2024 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_ADC_USE_ADC1 +#define STM32_ADC_USE_ADC1 TRUE + +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/cipulot/ec_tkl_x/post_rules.mk b/keyboards/cipulot/ec_tkl_x/post_rules.mk new file mode 100644 index 0000000000..5dba48cc5f --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/post_rules.mk @@ -0,0 +1 @@ +include keyboards/cipulot/common/common_cipulot.mk diff --git a/keyboards/cipulot/ec_tkl_x/readme.md b/keyboards/cipulot/ec_tkl_x/readme.md new file mode 100644 index 0000000000..0e37c23762 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/readme.md @@ -0,0 +1,26 @@ +# EC TKL X + +![EC TKL X PCB](https://i.imgur.com/pdkT14y.png) + +Universal TKL Electrostatic Capacitive PCB, with multi-layout support (F12/F13 version). + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: EC TKL X PCB +* Hardware Availability: TBD + +Make example for this keyboard (after setting up your build environment): + + make cipulot/ec_tkl_x:default + +Flashing example for this keyboard: + + make cipulot/ec_tkl_x: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: + +* **Physical reset**: Long press the button on the bottom on the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cipulot/ec_tkl_x/rules.mk b/keyboards/cipulot/ec_tkl_x/rules.mk new file mode 100644 index 0000000000..3aa0e2bf06 --- /dev/null +++ b/keyboards/cipulot/ec_tkl_x/rules.mk @@ -0,0 +1 @@ +OPT = 2 From 0228806ae8d1f12fc2c254b310c73076cfbde0d5 Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 11 Dec 2024 13:28:30 -0700 Subject: [PATCH 067/592] Change `new-keymap` keymap name prompt (#24701) --- lib/python/qmk/cli/new/keymap.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index f1df05636c..8b7160f5f2 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -23,19 +23,17 @@ def validate_keymap_name(name): def prompt_keyboard(): prompt = """{fg_yellow}Select Keyboard{style_reset_all} -If you`re unsure you can view a full list of supported keyboards with {fg_yellow}qmk list-keyboards{style_reset_all}. +If you're unsure you can view a full list of supported keyboards with {fg_yellow}qmk list-keyboards{style_reset_all}. Keyboard Name? """ - return question(prompt) def prompt_user(): prompt = """ {fg_yellow}Name Your Keymap{style_reset_all} -Used for maintainer, copyright, etc -Your GitHub Username? """ +Keymap name? """ return question(prompt, default=git_get_username()) From d283e27bf870aaf24d35720c8eb7f8fc9979562c Mon Sep 17 00:00:00 2001 From: Lostdotfish Date: Wed, 11 Dec 2024 20:29:36 +0000 Subject: [PATCH 068/592] [Keymap] Update rp2040_orbweaver (#24704) * Update keymap.c enhancement - power down indicator LEDs when host sleeps * Update keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c Co-authored-by: jack * Update keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c Co-authored-by: jack --------- Co-authored-by: jack --- .../rp2040_orbweaver/keymaps/default/keymap.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c index f98f656bc9..df59752ce0 100644 --- a/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c +++ b/keyboards/lostdotfish/rp2040_orbweaver/keymaps/default/keymap.c @@ -76,3 +76,15 @@ layer_state_t layer_state_set_user(layer_state_t state) { } return state; } +void suspend_power_down_kb(void) { + // code will run multiple times while keyboard is suspended + gpio_write_pin_high(GP23); + gpio_write_pin_high(GP24); + gpio_write_pin_high(GP25); + suspend_power_down_user(); +} + +void suspend_wakeup_init_kb(void) { + layer_state_set_kb(layer_state); + suspend_wakeup_init_user(); +} From d589dbb05b31a318086cbf01588230831140d95f Mon Sep 17 00:00:00 2001 From: Guido Bartolucci Date: Thu, 12 Dec 2024 12:59:07 -0500 Subject: [PATCH 069/592] Added VT-40 keyboard (#24706) * Added VT-40 keyboard * Remove commented out code. Oops Co-authored-by: jack * Change name of planck_layers to layers. Co-authored-by: jack * Update keyboards/vt40/keymaps/default/keymap.c Co-authored-by: jack * Removed unused features that I stole from the contra config * Removed unused features that I stole from the contra config * fixed lower/raise keys * make adjust layer accessible * Added adjust key for real this time * Update keyboards/vt40/keyboard.json Co-authored-by: Duncan Sutherland --------- Co-authored-by: jack Co-authored-by: Duncan Sutherland --- keyboards/vt40/keyboard.json | 91 +++++++++++++++ keyboards/vt40/keymaps/default/keymap.c | 144 ++++++++++++++++++++++++ keyboards/vt40/keymaps/default/rules.mk | 1 + keyboards/vt40/readme.md | 24 ++++ 4 files changed, 260 insertions(+) create mode 100644 keyboards/vt40/keyboard.json create mode 100644 keyboards/vt40/keymaps/default/keymap.c create mode 100644 keyboards/vt40/keymaps/default/rules.mk create mode 100644 keyboards/vt40/readme.md diff --git a/keyboards/vt40/keyboard.json b/keyboards/vt40/keyboard.json new file mode 100644 index 0000000000..4a8178b8d5 --- /dev/null +++ b/keyboards/vt40/keyboard.json @@ -0,0 +1,91 @@ +{ + "manufacturer": "vladantrhlik", + "keyboard_name": "vt40", + "maintainer": "vladantrhlik", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP21", "GP20", "GP19", "GP18", "GP22"], + "rows": ["GP2", "GP3", "GP4", "GP5"] + }, + "encoder": { + "rotary": [ + {"pin_a": "GP26", "pin_b": "GP16"}, + {"pin_a": "GP27", "pin_b": "GP17"}, + ] + }, + "processor": "RP2040", + "url": "https://github.com/vladantrhlik/VT-40", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "community_layouts": ["ortho_4x12"], + "layouts": { + "LAYOUT_ortho_4x12": { + "layout": [ + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "Q", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "W", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "E", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "R", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "T", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "Y", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "U", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "I", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "O", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "P", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "BackSpace", "matrix": [0, 11], "x": 11, "y": 0}, + + {"label": "Esc", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "A", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "S", "matrix": [1, 2], "x": 2, "y": 1}, + {"label": "D", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "F", "matrix": [1, 4], "x": 4, "y": 1}, + {"label": "G", "matrix": [1, 5], "x": 5, "y": 1}, + {"label": "H", "matrix": [1, 6], "x": 6, "y": 1}, + {"label": "J", "matrix": [1, 7], "x": 7, "y": 1}, + {"label": "K", "matrix": [1, 8], "x": 8, "y": 1}, + {"label": "L", "matrix": [1, 9], "x": 9, "y": 1}, + {"label": ";", "matrix": [1, 10], "x": 10, "y": 1}, + {"label": "'", "matrix": [1, 11], "x": 11, "y": 1}, + + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "Z", "matrix": [2, 1], "x": 1, "y": 2}, + {"label": "X", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "C", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "V", "matrix": [2, 4], "x": 4, "y": 2}, + {"label": "B", "matrix": [2, 5], "x": 5, "y": 2}, + {"label": "N", "matrix": [2, 6], "x": 6, "y": 2}, + {"label": "M", "matrix": [2, 7], "x": 7, "y": 2}, + {"label": ",", "matrix": [2, 8], "x": 8, "y": 2}, + {"label": ".", "matrix": [2, 9], "x": 9, "y": 2}, + {"label": "/", "matrix": [2, 10], "x": 10, "y": 2}, + {"label": "Return", "matrix": [2, 11], "x": 11, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Ctrl", "matrix": [3, 1], "x": 1, "y": 3}, + {"label": "Alt", "matrix": [3, 2], "x": 2, "y": 3}, + {"label": "Super", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "⇓", "matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"label": "⇑", "matrix": [3, 7], "x": 7, "y": 3}, + {"label": "←", "matrix": [3, 8], "x": 8, "y": 3}, + {"label": "↓", "matrix": [3, 9], "x": 9, "y": 3}, + {"label": "↑", "matrix": [3, 10], "x": 10, "y": 3}, + {"label": "→", "matrix": [3, 11], "x": 11, "y": 3} + ] + } + } +} diff --git a/keyboards/vt40/keymaps/default/keymap.c b/keyboards/vt40/keymaps/default/keymap.c new file mode 100644 index 0000000000..95bd31083f --- /dev/null +++ b/keyboards/vt40/keymaps/default/keymap.c @@ -0,0 +1,144 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + + +enum layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define ADJUST MO(_ADJUST) +#define QWERTY PDF(_QWERTY) +#define COLEMAK PDF(_COLEMAK) +#define DVORAK PDF(_DVORAK) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, 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_ENT , + KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + /* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , + KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + /* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Caps | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x12( + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , + KC_CAPS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + /* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + + /* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |ADJUST| | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + ADJUST, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( + _______, QK_BOOT, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , + _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [4] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [5] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) } +}; +#endif diff --git a/keyboards/vt40/keymaps/default/rules.mk b/keyboards/vt40/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/vt40/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/vt40/readme.md b/keyboards/vt40/readme.md new file mode 100644 index 0000000000..0d87b01134 --- /dev/null +++ b/keyboards/vt40/readme.md @@ -0,0 +1,24 @@ +# VT-40 + +* Keyboard Maintainer: [Guido Bartolucci](https://github.com/guidoism) +* Hardware Supported: Raspberry Pi Pico (RP2040) +* Hardware Availability: https://github.com/vladantrhlik/VT-40 + +Make example for this keyboard (after setting up your build environment): + + make vt40:default + +Flashing example for this keyboard: + + make vt40: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 e1351b4f4b8168ca560d2ce090e02e3a50ca0c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Fri, 13 Dec 2024 02:01:50 +0800 Subject: [PATCH 070/592] Subscript alef correction (#24707) Output for U+0656 is AltGr + V --- data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson | 2 +- quantum/keymap_extras/keymap_farsi.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson index d59b6fab26..68d209a5f3 100644 --- a/data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson @@ -527,7 +527,7 @@ "key": "FA_PIPE", "label": "|", } - "ALGR(FA_RA)": { + "ALGR(FA_RE)": { "key": "FA_SUBA", "label": "ٖ", } diff --git a/quantum/keymap_extras/keymap_farsi.h b/quantum/keymap_extras/keymap_farsi.h index d268917513..9c72a6b42e 100644 --- a/quantum/keymap_extras/keymap_farsi.h +++ b/quantum/keymap_extras/keymap_farsi.h @@ -150,7 +150,7 @@ #define FA_DQT ALGR(FA_GAF) // " #define FA_MINA ALGR(FA_BSLS) // - #define FA_PIPE ALGR(FA_ZA) // | -#define FA_SUBA ALGR(FA_RA) // ٖ +#define FA_SUBA ALGR(FA_RE) // ٖ #define FA_HMZB ALGR(FA_DAL) // ء #define FA_ELLP ALGR(FA_PE) // … #define FA_COMM ALGR(FA_WAW) // , From 597bbcb56782d298a569cbf0bcfd69753ff1922e Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 13 Dec 2024 20:42:47 +1100 Subject: [PATCH 071/592] Add licensing violations page. (#24697) --- docs/_sidebar.json | 3 +- docs/license_violations.md | 96 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 docs/license_violations.md diff --git a/docs/_sidebar.json b/docs/_sidebar.json index a68516b5de..95601be7de 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -21,7 +21,8 @@ { "text": "Debugging QMK", "link": "/faq_debug" }, { "text": "Keymap FAQ", "link": "/faq_keymap" }, { "text": "Squeezing Space from AVR", "link": "/squeezing_avr" }, - { "text": "Glossary", "link": "/reference_glossary" } + { "text": "Glossary", "link": "/reference_glossary" }, + { "text": "License Violations", "link": "/license_violations" } ] }, { diff --git a/docs/license_violations.md b/docs/license_violations.md new file mode 100644 index 0000000000..b21bb286ac --- /dev/null +++ b/docs/license_violations.md @@ -0,0 +1,96 @@ +# License Violations + +QMK Firmware has seen its fair share of license violations, which hurts the community and frustrates the QMK maintainers. + +Typical non-compliance includes: + +* Not providing any source code +* Providing "crippled" source code, such as a wired-only firmware for a wireless-capable board + +Boards from vendors who don't provide source code are proving to be a significant time sink as the QMK team and other support helpers volunteer their time trying to determine which board someone has before they can help -- and in these cases they can't help. Occasionally this is followed by abuse; something that QMK and its volunteers should not be subjected to, rather redirected to the vendor in question. + +The QMK team now actively directs support requests back to each vendor - vendors must provide their own product support for their boards. The QMK team are volunteers, the vendor must not expect the team to act as their support staff. + +## Offending Vendors + +The QMK team cannot tell you which boards you should or should not purchase, but please consider the lack of license compliance from the following vendors before making your decision. If you wish to look at the boards upstream QMK Firmware currently supports, you can search [here](https://browse.qmk.fm/). + +If you own a board from one of the following vendors already, consider asking them for the equivalent QMK source code if it's not already available. With enough customers demanding corresponding source code, vendors may start to change their policies. + +| Vendor | Reason | +|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Chillkey | | +| CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | +| Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | +| Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | +| Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. | +| iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. | +| KiiBOOM | Seems to use the same OEM as Epomaker, same problems. | +| Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | +| Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | +| mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. | +| MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. | +| owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. | +| qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | +| Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. | +| Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. | +| Shortcut Studio | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | +| Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. | +| TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | +| Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | +| Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | + +::: danger Violations +Links are not provided above as the QMK team does not wish to inadvertently promote purchases of boards in violation of QMK's license. +::: + +## Licensing + +QMK Firmware's license requires full disclosure of source code for any firmware which is based on QMK. This includes any of the following scenarios: + +* Use of public QMK Firmware, but with "closed source" privately-held board definitions +* Vendor-customised QMK Firmware, which the vendor keeps private for building their own boards +* Any other non-QMK firmware which includes portions of QMK Firmware, such as adaptation of `via.c` into any other non-QMK firmware, even if used as a reference when translated to another programming language. + +As per the GPL license requirements, vendors must provide entire source code for the as-shipped firmware. + +QMK has traditionally been lenient with this clause -- providing source code to the QMK community is necessary but reproducing the exact build may not be possible. QMK has required functionally-equivalent source code to be made available. In rare cases exact code may be requested; vendors must keep copies regardless. + +At minimum, vendors must provide the source code through some distribution mechanism. This could potentially be an clearly available downloadable copy of the code online, a fork of QMK Firmware, or even a DVD accompanying the product in the box. + +If sources are unable to be provided in a timely fashion, QMK may revoke the vendor's license, effectively rendering them unable to leverage QMK. + +Vendors choosing to keep things closed-source because of a desire to have a "competitive edge" compared to other vendors is unacceptable to both QMK and the community, and is a breach of the QMK license. There's no reason to do so; any new or interesting vendor-specific feature will be quickly replicated by other vendors or the community anyway. + +## QMK PR Considerations + +Vendors who submit PRs to QMK Firmware whilst not providing full sources for all of their license-violating boards will be put on hold until source code for all violating boards is provided. Intentional deception may result in boards being removed from QMK and all future PRs for that manufacturer being denied outright. + +Submitting crippled source code in order to attain a merge into QMK Firmware to pave the way for VIA support is unacceptable. This includes submitting a wired-only firmware for a wireless-capable board, or any other PR which does not include key features as-advertised. + +Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired and wireless) is an unacceptable scenario as this creates confusion for support. Many customers have flashed boards with the wrong firmware, which could have been avoided if vendors were obvious about their board identification mechanisms. + +If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past. + +PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](https://docs.qmk.fm/pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation. + +## Detection + +If the QMK team identifies or is informed of a license violation from a vendor: + +* Any current and future PRs for that vendor will be indefinitely put on hold, preventing merge into QMK Firmware, thus preventing any out-of-the-box VIA support +* Any existing keyboards from the vendor may be removed from QMK Firmware +* Vendors will be added to the _offending vendors_ list above + +Repeated violations may result in that vendor being disallowed from contributing the QMK in its entirety. In the worst case, the QMK team may choose to revoke a vendor's license to use QMK Firmware outright. + +## Remediation + +Vendors must provide fully-featured source code for each of their identified violations, matching the feature capabilities of their as-shipped products. This will usually be in their own fork of QMK Firmware while awaiting a merge into upstream. + +Once all identified violations have been remediated, current and future PRs will no longer be on hold and the vendor will be removed from the offending vendors list above. From 2d33a209561537289ceb0af1e7cd7b0c522aa272 Mon Sep 17 00:00:00 2001 From: Xelus22 <17491233+Xelus22@users.noreply.github.com> Date: Sun, 15 Dec 2024 04:19:11 +1100 Subject: [PATCH 072/592] [Keyboard] add swagkeys eave (#24711) * add swagkeys eave * fix up * Update keyboards/swagkeys/eave/keyboard.json Co-authored-by: jack * Update keyboards/swagkeys/eave/keymaps/default/keymap.c Co-authored-by: jack --------- Co-authored-by: Xelus22 <> Co-authored-by: jack --- keyboards/swagkeys/eave/keyboard.json | 128 ++++++++++++++++++ .../swagkeys/eave/keymaps/default/keymap.c | 36 +++++ keyboards/swagkeys/eave/readme.md | 24 ++++ 3 files changed, 188 insertions(+) create mode 100644 keyboards/swagkeys/eave/keyboard.json create mode 100644 keyboards/swagkeys/eave/keymaps/default/keymap.c create mode 100644 keyboards/swagkeys/eave/readme.md diff --git a/keyboards/swagkeys/eave/keyboard.json b/keyboards/swagkeys/eave/keyboard.json new file mode 100644 index 0000000000..87945ed756 --- /dev/null +++ b/keyboards/swagkeys/eave/keyboard.json @@ -0,0 +1,128 @@ +{ + "manufacturer": "CZMAO", + "keyboard_name": "Swagkeys Eave", + "maintainer": "Swagkeys", + "bootloader": "stm32duino", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "B15", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["B7", "B6", "B5", "B4", "B3", "A15", "B1", "B8", "C14", "A6", "A5", "A4", "A3", "B14", "A1", "A0"], + "rows": ["B9", "C13", "B12", "B11", "C15"] + }, + "processor": "STM32F103", + "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, + "hue_steps": 10, + "led_count": 25, + "saturation_steps": 8, + "sleep": true + }, + "url": "NONE", + "usb": { + "device_version": "1.0.0", + "pid": "0x4A16", + "vid": "0x4A16" + }, + "ws2812": { + "pin": "B13" + }, + "layouts": { + "LAYOUT_65_ansi": { + "layout": [ + {"label": "GRV", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [0, 13], "x": 13.5, "y": 0}, + {"label": "BSLS", "matrix": [0, 14], "x": 13, "y": 0, "w": 2}, + {"label": "Backspace", "matrix": [0, 15], "x": 14, "y": 0}, + {"label": "Del", "matrix": [1, 14], "x": 15, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Home", "matrix": [1, 15], "x": 15, "y": 1}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "PGUP", "matrix": [2, 15], "x": 15, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 2], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 3], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 4], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 5], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 7], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 8], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 9], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 10], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "UP", "matrix": [3, 14], "x": 14, "y": 3}, + {"label": "PGDN", "matrix": [3, 15], "x": 15, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 10], "x": 11.5, "y": 4, "w": 1.25}, + {"label": "Left", "matrix": [4, 11], "x": 13, "y": 4}, + {"label": "Down", "matrix": [4, 14], "x": 14, "y": 4}, + {"label": "Right", "matrix": [4, 15], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/swagkeys/eave/keymaps/default/keymap.c b/keyboards/swagkeys/eave/keymaps/default/keymap.c new file mode 100644 index 0000000000..c0815a2400 --- /dev/null +++ b/keyboards/swagkeys/eave/keymaps/default/keymap.c @@ -0,0 +1,36 @@ +/* +Copyright 2024 Swagkeys + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_ansi( + 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_BSLS, 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, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + + [1] = LAYOUT_65_ansi( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, UG_TOGG, UG_NEXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + + + diff --git a/keyboards/swagkeys/eave/readme.md b/keyboards/swagkeys/eave/readme.md new file mode 100644 index 0000000000..b594fe0ce2 --- /dev/null +++ b/keyboards/swagkeys/eave/readme.md @@ -0,0 +1,24 @@ +# Swagkeys EAVE + +65% Hotswap PCB + +* Keyboard Maintainer: [Swagkeys](https://github.com/swagkey) +* Hardware Supported: Eave PCB +* Hardware Availability: [Swagkeys Store](https://swagkeys.com/) + +Make example for this keyboard (after setting up your build environment): + + make swagkeys/eave:default + +Flashing example for this keyboard: + + make swagkeys/eave: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 +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 296e4539f5bfa8a23af6c48526a42dbc827a82eb Mon Sep 17 00:00:00 2001 From: Xelus22 <17491233+Xelus22@users.noreply.github.com> Date: Sun, 15 Dec 2024 10:15:52 +1100 Subject: [PATCH 073/592] [Keyboard] swagkeys integral (#24712) swagkeys integral Co-authored-by: Xelus22 <> --- keyboards/swagkeys/integral/keyboard.json | 169 ++++++++++++++++++ .../integral/keymaps/default/keymap.c | 35 ++++ keyboards/swagkeys/integral/readme.md | 24 +++ 3 files changed, 228 insertions(+) create mode 100644 keyboards/swagkeys/integral/keyboard.json create mode 100644 keyboards/swagkeys/integral/keymaps/default/keymap.c create mode 100644 keyboards/swagkeys/integral/readme.md diff --git a/keyboards/swagkeys/integral/keyboard.json b/keyboards/swagkeys/integral/keyboard.json new file mode 100644 index 0000000000..3d49671100 --- /dev/null +++ b/keyboards/swagkeys/integral/keyboard.json @@ -0,0 +1,169 @@ +{ + "manufacturer": "CZMAO", + "keyboard_name": "Swagkeys Integral", + "maintainer": "Swagkeys", + "bootloader": "stm32duino", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "B15", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["B7", "B6", "B5", "B4", "B3", "A15", "B1", "B8", "C14", "A6", "A5", "A4", "A3", "B14", "A1", "A0"], + "rows": ["B9", "C13", "B12", "B11", "B10"] + }, + "processor": "STM32F103", + "url": "NONE", + "usb": { + "device_version": "1.0.0", + "pid": "0x4F21", + "vid": "0x4E21" + }, + "community_layouts": [ + "60_ansi_tsangan", + "60_ansi_tsangan_split_bs_rshift" + ], + "layouts": { + "LAYOUT_60_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "`~", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0)", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "-_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "=+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "BSLS", "matrix": [0, 14], "x": 13, "y": 0}, + {"label": "Backspace", "matrix": [0, 15], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "[{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "]}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "\\|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ";:", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "'\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 2], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 3], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 4], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 5], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 7], "x": 8.25, "y": 3}, + {"label": ",<", "matrix": [3, 8], "x": 9.25, "y": 3}, + {"label": ".>", "matrix": [3, 9], "x": 10.25, "y": 3}, + {"label": "/?", "matrix": [3, 10], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 11], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "MO", "matrix": [3, 12], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "FN", "matrix": [4, 10], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 11], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "-", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "=", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "[", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "]", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"label": "Caps", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ";", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "'", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"label": "LShift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 2], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 3], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 4], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 5], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 7], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [3, 8], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [3, 9], "x": 10.25, "y": 3}, + {"label": "/", "matrix": [3, 10], "x": 11.25, "y": 3}, + {"label": "RShift", "matrix": [3, 14], "x": 12.25, "y": 3, "w": 2.75}, + + {"label": "LCtrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "LGui", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5}, + {"label": "LAlt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 5], "x": 3.75, "y": 4, "w": 7}, + {"label": "RAlt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.5}, + {"label": "FN", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.5}, + {"label": "RCtrl", "matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/swagkeys/integral/keymaps/default/keymap.c b/keyboards/swagkeys/integral/keymaps/default/keymap.c new file mode 100644 index 0000000000..dd3b473fc2 --- /dev/null +++ b/keyboards/swagkeys/integral/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +/* +Copyright 2024 Swagkeys + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_ansi_tsangan( + 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_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, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL + ), + [1] = LAYOUT_60_ansi_tsangan( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_COMM, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) + +}; diff --git a/keyboards/swagkeys/integral/readme.md b/keyboards/swagkeys/integral/readme.md new file mode 100644 index 0000000000..e2fcd4c932 --- /dev/null +++ b/keyboards/swagkeys/integral/readme.md @@ -0,0 +1,24 @@ +# Swagkeys Integral + +60% Soldered PCB + +* Keyboard Maintainer: [Swagkeys](https://github.com/swagkey) +* Hardware Supported: Integral PCB +* Hardware Availability: [Swagkeys Store](https://swagkeys.com/) + +Make example for this keyboard (after setting up your build environment): + + make swagkeys/integral:default + +Flashing example for this keyboard: + + make swagkeys/integral: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 +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 767dfbbd3f94dcddb2061cd8338dd166d985df9d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 15 Dec 2024 04:00:18 +0000 Subject: [PATCH 074/592] Resolve `cli.log.warn` warnings (#24551) --- lib/python/qmk/cli/doctor/main.py | 6 +++--- lib/python/qmk/cli/import/kbfirmware.py | 2 +- lib/python/qmk/cli/userspace/list.py | 2 +- lib/python/qmk/git.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/python/qmk/cli/doctor/main.py b/lib/python/qmk/cli/doctor/main.py index 5215d3a7ee..391353ebbf 100755 --- a/lib/python/qmk/cli/doctor/main.py +++ b/lib/python/qmk/cli/doctor/main.py @@ -102,10 +102,10 @@ def userspace_tests(qmk_firmware): qmk_userspace_validate(path) cli.log.info(f'Testing userspace candidate: {{fg_cyan}}{path}{{fg_reset}} -- {{fg_green}}Valid `qmk.json`') except FileNotFoundError: - cli.log.warn(f'Testing userspace candidate: {{fg_cyan}}{path}{{fg_reset}} -- {{fg_red}}Missing `qmk.json`') + cli.log.warning(f'Testing userspace candidate: {{fg_cyan}}{path}{{fg_reset}} -- {{fg_red}}Missing `qmk.json`') except UserspaceValidationError as err: - cli.log.warn(f'Testing userspace candidate: {{fg_cyan}}{path}{{fg_reset}} -- {{fg_red}}Invalid `qmk.json`') - cli.log.warn(f' -- {{fg_cyan}}{path}/qmk.json{{fg_reset}} validation error: {err}') + cli.log.warning(f'Testing userspace candidate: {{fg_cyan}}{path}{{fg_reset}} -- {{fg_red}}Invalid `qmk.json`') + cli.log.warning(f' -- {{fg_cyan}}{path}/qmk.json{{fg_reset}} validation error: {err}') if QMK_USERSPACE is not None: cli.log.info(f'QMK userspace: {{fg_cyan}}{QMK_USERSPACE}') diff --git a/lib/python/qmk/cli/import/kbfirmware.py b/lib/python/qmk/cli/import/kbfirmware.py index 9c03737378..feccb3cfcc 100644 --- a/lib/python/qmk/cli/import/kbfirmware.py +++ b/lib/python/qmk/cli/import/kbfirmware.py @@ -15,7 +15,7 @@ def import_kbfirmware(cli): cli.log.info(f'{{style_bright}}Importing {filename.name}.{{style_normal}}') cli.echo('') - cli.log.warn("Support here is basic - Consider using 'qmk new-keyboard' instead") + cli.log.warning("Support here is basic - Consider using 'qmk new-keyboard' instead") kb_name = _import_kbfirmware(data) diff --git a/lib/python/qmk/cli/userspace/list.py b/lib/python/qmk/cli/userspace/list.py index 9f83a14a2a..e902483b6b 100644 --- a/lib/python/qmk/cli/userspace/list.py +++ b/lib/python/qmk/cli/userspace/list.py @@ -66,4 +66,4 @@ def userspace_list(cli): if is_all_keyboards(keyboard) or is_keymap_target(keyboard_folder(keyboard), keymap): cli.log.info(f'Keyboard: {{fg_cyan}}{keyboard}{{fg_reset}}, keymap: {{fg_cyan}}{keymap}{{fg_reset}}{extra_args_str}') else: - cli.log.warn(f'Keyboard: {{fg_cyan}}{keyboard}{{fg_reset}}, keymap: {{fg_cyan}}{keymap}{{fg_reset}}{extra_args_str} -- not found!') + cli.log.warning(f'Keyboard: {{fg_cyan}}{keyboard}{{fg_reset}}, keymap: {{fg_cyan}}{keymap}{{fg_reset}}{extra_args_str} -- not found!') diff --git a/lib/python/qmk/git.py b/lib/python/qmk/git.py index b6c11edbfe..9d567475d8 100644 --- a/lib/python/qmk/git.py +++ b/lib/python/qmk/git.py @@ -26,7 +26,7 @@ def git_get_version(repo_dir='.', check_dir='.'): return git_describe.stdout.strip() else: - cli.log.warn(f'"{" ".join(git_describe_cmd)}" returned error code {git_describe.returncode}') + cli.log.warning(f'"{" ".join(git_describe_cmd)}" returned error code {git_describe.returncode}') print(git_describe.stderr) return None From be6ff3af2bd878ac5d1c075aab539bf4e23e34a7 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 15 Dec 2024 23:44:12 +1100 Subject: [PATCH 075/592] Update ChibiOS `stable_21.11.x`. (#24714) --- lib/chibios | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios b/lib/chibios index 9dd6eaf669..2365f84429 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit 9dd6eaf669e83eb9d5aaabe736ecfdf2f790a9fd +Subproject commit 2365f844292513ea0ee9eea6ab778d56f9ccd3b9 From 8e6bfbfdc27b6ecb38f884b011ebca3ef95e33fc Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Sun, 15 Dec 2024 18:42:43 +0100 Subject: [PATCH 076/592] [Core] chibios: usb_main: remove OTG sof workaround (#24259) chibios: usb_main: remove OTG sof workaround With the update of ChibiOS and ChibiOS-Contrib containing fixes for the OTGv1 LLD the workaround is not necessarry anymore. Signed-off-by: Stefan Kerkmann --- tmk_core/protocol/chibios/usb_main.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 2a287e0d98..5a5354416f 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -325,18 +325,10 @@ static bool usb_requests_hook_cb(USBDriver *usbp) { return false; } -static __attribute__((unused)) void dummy_cb(USBDriver *usbp) { - (void)usbp; -} - static const USBConfig usbcfg = { usb_event_cb, /* USB events callback */ usb_get_descriptor_cb, /* Device GET_DESCRIPTOR request callback */ usb_requests_hook_cb, /* Requests hook callback */ -#if STM32_USB_USE_OTG1 == TRUE || STM32_USB_USE_OTG2 == TRUE - dummy_cb, /* Workaround for OTG Peripherals not servicing new interrupts - after resuming from suspend. */ -#endif }; void init_usb_driver(USBDriver *usbp) { From 0f3993b9a3cd3a50b2c9e5d920d6bdb40a9d78be Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 16 Dec 2024 06:06:05 +1100 Subject: [PATCH 077/592] default_keyboard.h generation tweaks (#24715) --- lib/python/qmk/cli/generate/keyboard_h.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py index 5863a0983a..cb9528d96b 100755 --- a/lib/python/qmk/cli/generate/keyboard_h.py +++ b/lib/python/qmk/cli/generate/keyboard_h.py @@ -22,6 +22,11 @@ def _generate_layouts(keyboard, kb_info_json): row_num = kb_info_json['matrix_size']['rows'] lines = [] + lines.append('') + lines.append('// Layout content') + lines.append('') + lines.append('#define XXX KC_NO') + for layout_name, layout_data in kb_info_json['layouts'].items(): if layout_data['c_macro']: continue @@ -31,7 +36,7 @@ def _generate_layouts(keyboard, kb_info_json): continue layout_keys = [] - layout_matrix = [['KC_NO'] * col_num for _ in range(row_num)] + layout_matrix = [['XXX'] * col_num for _ in range(row_num)] for key_data in layout_data['layout']: row, col = key_data['matrix'] @@ -46,7 +51,7 @@ def _generate_layouts(keyboard, kb_info_json): lines.append('') lines.append(f'#define {layout_name}({", ".join(layout_keys)}) {{ \\') - rows = ', \\\n'.join(['\t {' + ', '.join(row) + '}' for row in layout_matrix]) + rows = ', \\\n'.join([' { ' + ', '.join(row) + ' }' for row in layout_matrix]) rows += ' \\' lines.append(rows) lines.append('}') @@ -67,6 +72,9 @@ def _generate_keycodes(kb_info_json): return [] lines = [] + lines.append('') + lines.append('// Keycode content') + lines.append('') lines.append('enum keyboard_keycodes {') for index, item in enumerate(kb_info_json.get('keycodes')): @@ -103,17 +111,14 @@ def generate_keyboard_h(cli): valid_config = dd_layouts or keyboard_h # Build the layouts.h file. - keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '#include "quantum.h"'] + keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '', '#include "quantum.h"'] - keyboard_h_lines.append('') - keyboard_h_lines.append('// Layout content') if dd_layouts: keyboard_h_lines.extend(dd_layouts) + if keyboard_h: keyboard_h_lines.append(f'#include "{Path(keyboard_h).name}"') - keyboard_h_lines.append('') - keyboard_h_lines.append('// Keycode content') if dd_keycodes: keyboard_h_lines.extend(dd_keycodes) From d3c9dff9d27245168fe02c03462f0aeba10ba97a Mon Sep 17 00:00:00 2001 From: boessu Date: Mon, 16 Dec 2024 10:27:42 +0100 Subject: [PATCH 078/592] small refactoring of TIMER_DIFF (#24678) A small refactoring of the defines TIMER_DIFF_8, TIMER_DIFF_16, TIMER_DIFF_32, TIMER_DIFF_RAW. Removing obsolete TIMER_DIFF helper. Discussion: https://github.com/qmk/qmk_firmware/issues/24652 --- platforms/timer.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/platforms/timer.h b/platforms/timer.h index fb8ff6bc54..8a2ffd476b 100644 --- a/platforms/timer.h +++ b/platforms/timer.h @@ -24,10 +24,9 @@ along with this program. If not, see . #include -#define TIMER_DIFF(a, b, max) ((max == UINT8_MAX) ? ((uint8_t)((a) - (b))) : ((max == UINT16_MAX) ? ((uint16_t)((a) - (b))) : ((max == UINT32_MAX) ? ((uint32_t)((a) - (b))) : ((a) >= (b) ? (a) - (b) : (max) + 1 - (b) + (a))))) -#define TIMER_DIFF_8(a, b) TIMER_DIFF(a, b, UINT8_MAX) -#define TIMER_DIFF_16(a, b) TIMER_DIFF(a, b, UINT16_MAX) -#define TIMER_DIFF_32(a, b) TIMER_DIFF(a, b, UINT32_MAX) +#define TIMER_DIFF_8(a, b) (uint8_t)((a) - (b)) +#define TIMER_DIFF_16(a, b) (uint16_t)((a) - (b)) +#define TIMER_DIFF_32(a, b) (uint32_t)((a) - (b)) #define TIMER_DIFF_RAW(a, b) TIMER_DIFF_8(a, b) #ifdef __cplusplus From a7d12e4e8f984f472e5d8c87253bfad7ec181d75 Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Wed, 18 Dec 2024 00:02:05 -0500 Subject: [PATCH 079/592] [Keyboard] wilba_tech/wt45_h1 (#24717) --- keyboards/wilba_tech/wt45_h1/keyboard.json | 216 ++++++++++++++++++ .../wt45_h1/keymaps/default/keymap.json | 26 +++ keyboards/wilba_tech/wt45_h1/readme.md | 29 +++ 3 files changed, 271 insertions(+) create mode 100644 keyboards/wilba_tech/wt45_h1/keyboard.json create mode 100644 keyboards/wilba_tech/wt45_h1/keymaps/default/keymap.json create mode 100644 keyboards/wilba_tech/wt45_h1/readme.md diff --git a/keyboards/wilba_tech/wt45_h1/keyboard.json b/keyboards/wilba_tech/wt45_h1/keyboard.json new file mode 100644 index 0000000000..cfe1b3d3a4 --- /dev/null +++ b/keyboards/wilba_tech/wt45_h1/keyboard.json @@ -0,0 +1,216 @@ +{ + "manufacturer": "wilba.tech", + "keyboard_name": "WT45-H1", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "bootloader_instructions": "Press the button labeled S1 on the back of the PCB, near the MCU.", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "caps_word": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["F5", "D2", "D3", "D5", "D4", "D6", "D7", "C7", "C6", "B6", "B5", "B4"], + "rows": ["F1", "F4", "F6", "F7"] + }, + "processor": "atmega32u4", + "usb": { + "device_version": "0.0.1", + "pid": "0x0045", + "vid": "0x6582" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0, "w": 1.5}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 1.75, "y": 1}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 11], "x": 10.75, "y": 1, "w": 2.25}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.25}, + {"matrix": [2, 1], "x": 1.25, "y": 2}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [2, 8], "x": 8.25, "y": 2}, + {"matrix": [2, 9], "x": 9.25, "y": 2}, + {"matrix": [2, 10], "x": 10.25, "y": 2}, + {"matrix": [2, 11], "x": 11.25, "y": 2, "w": 1.75}, + {"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, "w": 1.25}, + {"matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.25}, + {"matrix": [3, 6], "x": 5.75, "y": 3}, + {"matrix": [3, 8], "x": 6.75, "y": 3, "w": 2.75}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3, "w": 1.25} + ] + }, + "LAYOUT_big_bar": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0, "w": 1.5}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 1.75, "y": 1}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 11], "x": 10.75, "y": 1, "w": 2.25}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.25}, + {"matrix": [2, 1], "x": 1.25, "y": 2}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [2, 8], "x": 8.25, "y": 2}, + {"matrix": [2, 9], "x": 9.25, "y": 2}, + {"matrix": [2, 10], "x": 10.25, "y": 2}, + {"matrix": [2, 11], "x": 11.25, "y": 2, "w": 1.75}, + {"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, "w": 1.25}, + {"matrix": [3, 6], "x": 3.5, "y": 3, "w": 6}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3, "w": 1.25} + ] + }, + "LAYOUT_big_lshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0, "w": 1.5}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 1.75, "y": 1}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 11], "x": 10.75, "y": 1, "w": 2.25}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 2.25}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [2, 8], "x": 8.25, "y": 2}, + {"matrix": [2, 9], "x": 9.25, "y": 2}, + {"matrix": [2, 10], "x": 10.25, "y": 2}, + {"matrix": [2, 11], "x": 11.25, "y": 2, "w": 1.75}, + {"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, "w": 1.25}, + {"matrix": [3, 4], "x": 3.5, "y": 3, "w": 2.25}, + {"matrix": [3, 6], "x": 5.75, "y": 3}, + {"matrix": [3, 8], "x": 6.75, "y": 3, "w": 2.75}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3, "w": 1.25} + ] + }, + "LAYOUT_big_lshift_big_bar": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0, "w": 1.5}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 1.75, "y": 1}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 11], "x": 10.75, "y": 1, "w": 2.25}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 2.25}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [2, 8], "x": 8.25, "y": 2}, + {"matrix": [2, 9], "x": 9.25, "y": 2}, + {"matrix": [2, 10], "x": 10.25, "y": 2}, + {"matrix": [2, 11], "x": 11.25, "y": 2, "w": 1.75}, + {"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, "w": 1.25}, + {"matrix": [3, 6], "x": 3.5, "y": 3, "w": 6}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3, "w": 1.25} + ] + } + } +} diff --git a/keyboards/wilba_tech/wt45_h1/keymaps/default/keymap.json b/keyboards/wilba_tech/wt45_h1/keymaps/default/keymap.json new file mode 100644 index 0000000000..11ae056820 --- /dev/null +++ b/keyboards/wilba_tech/wt45_h1/keymaps/default/keymap.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "keyboard": "wilba_tech/wt45_h1", + "keymap": "default", + "layout": "LAYOUT_all", + "layers": [ + [ +"LT(2,KC_ESC)", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", +"KC_TAB", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_ENT", +"KC_LSFT", "KC_NUBS", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_RSFT", +"KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "LT(1,KC_SPC)", "LT(1,KC_SPC)", "KC_RALT", "RGUI_T(KC_GRV)", "KC_RCTL" + ], + [ +"KC_GRV", "KC_TRNS", "KC_PGUP", "KC_TRNS", "KC_TRNS", "KC_LBRC", "KC_RBRC", "KC_TRNS", "KC_UP", "KC_TRNS", "KC_TRNS", "KC_DEL", +"KC_TRNS", "KC_HOME", "KC_PGDN", "KC_END", "KC_TRNS", "KC_BSLS", "KC_SLSH", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_TRNS", +"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_PSCR", "KC_ESC", "KC_QUOT", "KC_TRNS", "KC_DOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", +"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ], + [ +"KC_TRNS", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_TRNS", +"KC_TRNS", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", +"KC_TRNS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "CW_TOGG", +"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ] + ] +} diff --git a/keyboards/wilba_tech/wt45_h1/readme.md b/keyboards/wilba_tech/wt45_h1/readme.md new file mode 100644 index 0000000000..3a23ac36f0 --- /dev/null +++ b/keyboards/wilba_tech/wt45_h1/readme.md @@ -0,0 +1,29 @@ +# wilba.tech WT45-H1 + +![WT45-H1 PCB](https://i.imgur.com/33lWN3p.png) + +WT45-H1 is a mostly-base-kit-compatible hotswap 40% keyboard PCB with split left shift and split spacebar options. + +Initially designed for the [HIBI CHOPPER](https://hibi.mx/products/chopper) + +- Keyboard Maintainer: [wilba](https://github.com/wilba) +- Hardware Supported: wilba.tech WT45-H1 (atmega32u4, atmel-dfu) +- Hardware Availability: [HIBI](https://hibi.mx/products/chopper) + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt45_h1:default + +Flashing example for this keyboard: + + make wilba_tech/wt45_h1: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 top left key and plug in the keyboard. This will also clear EEPROM, so it is a good first step if the keyboard is misbehaving. +* **Physical reset button**: Press the button labeled S1 on the back of the PCB, near the MCU. +* **Keycode in layout**: There is no key mapped to `QK_BOOT` in the pre-created keymaps, but you may assign this key in any keymaps you create. From c988584fc181c2d59e71600ddbff73a99ba7be7f Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Wed, 18 Dec 2024 13:16:25 -0500 Subject: [PATCH 080/592] Add Reverie to QMK (#24227) * Add Reverie to QMK * Add backlight to reverie * Update reverie readme and copyright notices * Use format json to update keyboard.json formatting * Update to have solderable and hotswap variants split * Update copyright noticeS * JSON formatting updates * inherit config.h * fix broken keymap * Update reverie hs keyboard.json to be accurate * Update keyboards/cannonkeys/reverie/hotswap/keyboard.json Co-authored-by: jack * Remove VIA keymaps * Update keymap --------- Co-authored-by: jack --- keyboards/cannonkeys/reverie/config.h | 9 + .../cannonkeys/reverie/hotswap/keyboard.json | 296 ++++++++ .../reverie/hotswap/keymaps/default/keymap.c | 27 + keyboards/cannonkeys/reverie/info.json | 24 + keyboards/cannonkeys/reverie/readme.md | 30 + .../cannonkeys/reverie/solderable/config.h | 7 + .../cannonkeys/reverie/solderable/halconf.h | 8 + .../reverie/solderable/keyboard.json | 672 ++++++++++++++++++ .../solderable/keymaps/default/keymap.c | 27 + .../reverie/solderable/matrix_diagram.md | 27 + .../cannonkeys/reverie/solderable/mcuconf.h | 9 + 11 files changed, 1136 insertions(+) create mode 100644 keyboards/cannonkeys/reverie/config.h create mode 100644 keyboards/cannonkeys/reverie/hotswap/keyboard.json create mode 100644 keyboards/cannonkeys/reverie/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/reverie/info.json create mode 100644 keyboards/cannonkeys/reverie/readme.md create mode 100644 keyboards/cannonkeys/reverie/solderable/config.h create mode 100644 keyboards/cannonkeys/reverie/solderable/halconf.h create mode 100644 keyboards/cannonkeys/reverie/solderable/keyboard.json create mode 100644 keyboards/cannonkeys/reverie/solderable/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/reverie/solderable/matrix_diagram.md create mode 100644 keyboards/cannonkeys/reverie/solderable/mcuconf.h diff --git a/keyboards/cannonkeys/reverie/config.h b/keyboards/cannonkeys/reverie/config.h new file mode 100644 index 0000000000..ea5c26b6c7 --- /dev/null +++ b/keyboards/cannonkeys/reverie/config.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U + +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 \ No newline at end of file diff --git a/keyboards/cannonkeys/reverie/hotswap/keyboard.json b/keyboards/cannonkeys/reverie/hotswap/keyboard.json new file mode 100644 index 0000000000..4a2101f9de --- /dev/null +++ b/keyboards/cannonkeys/reverie/hotswap/keyboard.json @@ -0,0 +1,296 @@ +{ + "keyboard_name": "Reverie HS", + "usb": { + "pid": "0x0033" + }, + "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs"], + "layout_aliases": { + "LAYOUT_65_ansi_blocker_split_bs": "LAYOUT_all" + }, + "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan_split_bs": { + "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"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/cannonkeys/reverie/hotswap/keymaps/default/keymap.c b/keyboards/cannonkeys/reverie/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..e1081d169c --- /dev/null +++ b/keyboards/cannonkeys/reverie/hotswap/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _FN1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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_HOME, + 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_END, + 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, MO(_FN1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + + [_FN1] = LAYOUT_all( + QK_GESC, 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, _______, _______, _______, _______, _______, _______, _______, QK_BOOT + ) +}; diff --git a/keyboards/cannonkeys/reverie/info.json b/keyboards/cannonkeys/reverie/info.json new file mode 100644 index 0000000000..1e2a885781 --- /dev/null +++ b/keyboards/cannonkeys/reverie/info.json @@ -0,0 +1,24 @@ +{ + "manufacturer": "CannonKeys", + "maintainer": "awkannan", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP28", "GP8", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"], + "rows": ["GP26", "GP27", "GP15", "GP16", "GP17"] + }, + "processor": "RP2040", + "url": "https://cannonkeys.com", + "usb": { + "device_version": "0.0.1", + "vid": "0xCA04" + } +} diff --git a/keyboards/cannonkeys/reverie/readme.md b/keyboards/cannonkeys/reverie/readme.md new file mode 100644 index 0000000000..8647bc0dad --- /dev/null +++ b/keyboards/cannonkeys/reverie/readme.md @@ -0,0 +1,30 @@ +# Reverie PCBs + +Reverie PCBs from CannonKeys + +This folder is for both the solderable and hotswap versions of this PCB. + +The hotswap version does not support per-key LEDs and has reduced layout support (no ISO) + +* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan) +* Hardware Supported: RP2040 +* Hardware Availability: [CannonKeys](https://cannonkeys.com) + + +Make example for this keyboard (after setting up your build environment): + + make cannonkeys/reverie/solderable:default + +Flashing example for this keyboard: + + make cannonkeys/reverie/solderable: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**: Hold the "BOOTMODE" button on the back of the PCB and briefly press the "RESET" button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cannonkeys/reverie/solderable/config.h b/keyboards/cannonkeys/reverie/solderable/config.h new file mode 100644 index 0000000000..9a8669d7a8 --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_A diff --git a/keyboards/cannonkeys/reverie/solderable/halconf.h b/keyboards/cannonkeys/reverie/solderable/halconf.h new file mode 100644 index 0000000000..0536c37ff3 --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cannonkeys/reverie/solderable/keyboard.json b/keyboards/cannonkeys/reverie/solderable/keyboard.json new file mode 100644 index 0000000000..b1d909cb85 --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/keyboard.json @@ -0,0 +1,672 @@ +{ + "keyboard_name": "Reverie", + "backlight": { + "breathing": true, + "breathing_period": 5, + "levels": 15, + "pin": "GP22" + }, + "features": { + "backlight": true + }, + "indicators": { + "caps_lock": "GP29", + "on_state": 0 + }, + "usb": { + "pid": "0x0030" + }, + "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs", "65_iso_blocker", "65_iso_blocker_split_bs", "65_iso_blocker_tsangan", "65_iso_blocker_tsangan_split_bs"], + "layout_aliases": { + "LAYOUT": "LAYOUT_all" + }, + "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_split_bs": { + "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan_split_bs": { + "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_iso_blocker_split_bs": { + "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_iso_blocker_tsangan_split_bs": { + "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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": [2, 12], "x": 14, "y": 0}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 5], "x": 3.75, "y": 4, "w": 2.25}, + {"matrix": [4, 6], "x": 6, "y": 4, "w": 1.25}, + {"matrix": [4, 9], "x": 7.25, "y": 4, "w": 2.75}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"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/cannonkeys/reverie/solderable/keymaps/default/keymap.c b/keyboards/cannonkeys/reverie/solderable/keymaps/default/keymap.c new file mode 100644 index 0000000000..0a256ac406 --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _FN1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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_HOME, + 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_END, + 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_BSLS, 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_SPC, KC_SPC, KC_RALT, MO(_FN1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + + [_FN1] = LAYOUT_all( + QK_GESC, 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_UP, _______, BL_DOWN, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT + ) +}; diff --git a/keyboards/cannonkeys/reverie/solderable/matrix_diagram.md b/keyboards/cannonkeys/reverie/solderable/matrix_diagram.md new file mode 100644 index 0000000000..c74adfdb7c --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/matrix_diagram.md @@ -0,0 +1,27 @@ +# Matrix Diagram for CannonKeys Reverie + +``` + ┌───────┐ + 2u Backspace │0D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │2C │0E │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ ┌─────┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐2D │ ISO Enter +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │2E │ │1D │ │ +├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │3E │ +├────┴┬──┴┬──┴──┬┴───┴───┴──┬┴──┬┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤ +│40 │41 │42 │45 │46 │49 │4B │ │4C │4D │4E │ +└─────┴───┴─────┴───────────┴───┴───────────┴─────┘ └───┴───┴───┘ +┌────────┐ +│30 │ 2.25u LShift +└────────┘ +┌─────┬───┬─────┬───────────────────────────┬─────┐ +│40 │41 │42 │46 │4B │ Blocker Tsangan +└─────┴───┴─────┴───────────────────────────┴─────┘ +┌────┬────┬────┬────────────────────────┬────┬────┐ +│40 │41 │42 │46 │4A │4B │ Blocker +└────┴────┴────┴────────────────────────┴────┴────┘ +``` diff --git a/keyboards/cannonkeys/reverie/solderable/mcuconf.h b/keyboards/cannonkeys/reverie/solderable/mcuconf.h new file mode 100644 index 0000000000..200f75c11b --- /dev/null +++ b/keyboards/cannonkeys/reverie/solderable/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef RP_PWM_USE_PWM3 +#define RP_PWM_USE_PWM3 TRUE From f3fe59afe26a0796fe5ff9c3eb2a6551fb949a6e Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Sun, 22 Dec 2024 00:14:59 -0500 Subject: [PATCH 081/592] fix: mechwild/bb65 coordinate mix-up (#24738) --- keyboards/mechwild/bb65/info.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/mechwild/bb65/info.json b/keyboards/mechwild/bb65/info.json index a9d812d827..81856c5c7c 100644 --- a/keyboards/mechwild/bb65/info.json +++ b/keyboards/mechwild/bb65/info.json @@ -105,8 +105,8 @@ {"matrix": [7, 7], "x": 10.25, "y": 3}, {"matrix": [7, 6], "x": 11.25, "y": 3}, {"matrix": [7, 5], "x": 12.25, "y": 3, "w": 1.75}, - {"matrix": [7, 4], "x": 15.5, "y": 3}, - {"matrix": [7, 3], "x": 14.25, "y": 3.25}, + {"matrix": [7, 4], "x": 14.25, "y": 3.25}, + {"matrix": [7, 3], "x": 15.5, "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}, @@ -174,8 +174,8 @@ {"matrix": [7, 7], "x": 10.25, "y": 3}, {"matrix": [7, 6], "x": 11.25, "y": 3}, {"matrix": [7, 5], "x": 12.25, "y": 3, "w": 1.75}, - {"matrix": [7, 4], "x": 15.5, "y": 3}, - {"matrix": [7, 3], "x": 14.25, "y": 3.25}, + {"matrix": [7, 4], "x": 14.25, "y": 3.25}, + {"matrix": [7, 3], "x": 15.5, "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}, From 9877af9bf8967ade2a3d1ed752bb3faa52185ecb Mon Sep 17 00:00:00 2001 From: yiancar Date: Sun, 22 Dec 2024 21:57:25 +0200 Subject: [PATCH 082/592] [Keyboard] Add keycult 1800 (#24729) Co-authored-by: jack Co-authored-by: yiancar --- keyboards/keycult/keycult1800/keyboard.json | 132 ++++++++++++++++++ .../keycult1800/keymaps/default/keymap.c | 35 +++++ keyboards/keycult/keycult1800/readme.md | 32 +++++ keyboards/keycult/keycult1800/rules.mk | 2 + 4 files changed, 201 insertions(+) create mode 100644 keyboards/keycult/keycult1800/keyboard.json create mode 100644 keyboards/keycult/keycult1800/keymaps/default/keymap.c create mode 100644 keyboards/keycult/keycult1800/readme.md create mode 100644 keyboards/keycult/keycult1800/rules.mk diff --git a/keyboards/keycult/keycult1800/keyboard.json b/keyboards/keycult/keycult1800/keyboard.json new file mode 100644 index 0000000000..a50b77d104 --- /dev/null +++ b/keyboards/keycult/keycult1800/keyboard.json @@ -0,0 +1,132 @@ +{ + "manufacturer": "Yiancar-Designs", + "keyboard_name": "Keycult 1800", + "maintainer": "Yiancar-Designs", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["B12", "B13", "B14", "B15", "A8", "A10", "A14", "A15", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "A0", "A1", "A6"], + "rows": ["B11", "B10", "B2", "B1", "A9", "A5"] + }, + "processor": "STM32F072", + "url": "https://yiancar-designs.com", + "usb": { + "device_version": "0.0.1", + "pid": "0x6338", + "vid": "0x8968" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [0, 1], "x": 1.25, "y": 0 }, + { "matrix": [0, 2], "x": 2.25, "y": 0 }, + { "matrix": [0, 3], "x": 3.25, "y": 0 }, + { "matrix": [0, 4], "x": 4.25, "y": 0 }, + { "matrix": [0, 5], "x": 5.5, "y": 0 }, + { "matrix": [0, 6], "x": 6.5, "y": 0 }, + { "matrix": [0, 7], "x": 7.5, "y": 0 }, + { "matrix": [0, 8], "x": 8.5, "y": 0 }, + { "matrix": [0, 9], "x": 9.75, "y": 0 }, + { "matrix": [0, 10], "x": 10.75, "y": 0 }, + { "matrix": [0, 11], "x": 11.75, "y": 0 }, + { "matrix": [0, 12], "x": 12.75, "y": 0 }, + { "matrix": [0, 13], "x": 14, "y": 0 }, + { "matrix": [0, 14], "x": 15.5, "y": 0 }, + { "matrix": [0, 15], "x": 16.5, "y": 0 }, + { "matrix": [0, 16], "x": 17.5, "y": 0 }, + { "matrix": [0, 17], "x": 18.5, "y": 0 }, + { "matrix": [1, 0], "x": 0, "y": 1.5 }, + { "matrix": [1, 1], "x": 1, "y": 1.5 }, + { "matrix": [1, 2], "x": 2, "y": 1.5 }, + { "matrix": [1, 3], "x": 3, "y": 1.5 }, + { "matrix": [1, 4], "x": 4, "y": 1.5 }, + { "matrix": [1, 5], "x": 5, "y": 1.5 }, + { "matrix": [1, 6], "x": 6, "y": 1.5 }, + { "matrix": [1, 7], "x": 7, "y": 1.5 }, + { "matrix": [1, 8], "x": 8, "y": 1.5 }, + { "matrix": [1, 9], "x": 9, "y": 1.5 }, + { "matrix": [1, 10], "x": 10, "y": 1.5 }, + { "matrix": [1, 11], "x": 11, "y": 1.5 }, + { "matrix": [1, 12], "x": 12, "y": 1.5 }, + { "matrix": [1, 13], "x": 13, "y": 1.5 }, + { "matrix": [2, 13], "x": 14, "y": 1.5 }, + { "matrix": [1, 14], "x": 15.5, "y": 1.5 }, + { "matrix": [1, 15], "x": 16.5, "y": 1.5 }, + { "matrix": [1, 16], "x": 17.5, "y": 1.5 }, + { "matrix": [1, 17], "x": 18.5, "y": 1.5 }, + { "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2.5 }, + { "matrix": [2, 1], "x": 1.5, "y": 2.5 }, + { "matrix": [2, 2], "x": 2.5, "y": 2.5 }, + { "matrix": [2, 3], "x": 3.5, "y": 2.5 }, + { "matrix": [2, 4], "x": 4.5, "y": 2.5 }, + { "matrix": [2, 5], "x": 5.5, "y": 2.5 }, + { "matrix": [2, 6], "x": 6.5, "y": 2.5 }, + { "matrix": [2, 7], "x": 7.5, "y": 2.5 }, + { "matrix": [2, 8], "x": 8.5, "y": 2.5 }, + { "matrix": [2, 9], "x": 9.5, "y": 2.5 }, + { "matrix": [2, 10], "x": 10.5, "y": 2.5 }, + { "matrix": [2, 11], "x": 11.5, "y": 2.5 }, + { "matrix": [2, 12], "x": 12.5, "y": 2.5 }, + { "matrix": [3, 12], "w": 1.5, "x": 13.5, "y": 2.5 }, + { "matrix": [2, 14], "x": 15.5, "y": 2.5 }, + { "matrix": [2, 15], "x": 16.5, "y": 2.5 }, + { "matrix": [2, 16], "x": 17.5, "y": 2.5 }, + { "matrix": [2, 17], "x": 18.5, "y": 2.5 }, + { "matrix": [3, 0], "w": 1.75, "x": 0, "y": 3.5 }, + { "matrix": [3, 1], "x": 1.75, "y": 3.5 }, + { "matrix": [3, 2], "x": 2.75, "y": 3.5 }, + { "matrix": [3, 3], "x": 3.75, "y": 3.5 }, + { "matrix": [3, 4], "x": 4.75, "y": 3.5 }, + { "matrix": [3, 5], "x": 5.75, "y": 3.5 }, + { "matrix": [3, 6], "x": 6.75, "y": 3.5 }, + { "matrix": [3, 7], "x": 7.75, "y": 3.5 }, + { "matrix": [3, 8], "x": 8.75, "y": 3.5 }, + { "matrix": [3, 9], "x": 9.75, "y": 3.5 }, + { "matrix": [3, 10], "x": 10.75, "y": 3.5 }, + { "matrix": [3, 11], "x": 11.75, "y": 3.5 }, + { "matrix": [3, 13], "w": 2.25, "x": 12.75, "y": 3.5 }, + { "matrix": [3, 14], "x": 15.5, "y": 3.5 }, + { "matrix": [3, 15], "x": 16.5, "y": 3.5 }, + { "matrix": [3, 16], "x": 17.5, "y": 3.5 }, + { "matrix": [3, 17], "x": 18.5, "y": 3.5 }, + { "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 }, + { "matrix": [4, 2], "x": 2.25, "y": 4.5 }, + { "matrix": [4, 3], "x": 3.25, "y": 4.5 }, + { "matrix": [4, 4], "x": 4.25, "y": 4.5 }, + { "matrix": [4, 5], "x": 5.25, "y": 4.5 }, + { "matrix": [4, 6], "x": 6.25, "y": 4.5 }, + { "matrix": [4, 7], "x": 7.25, "y": 4.5 }, + { "matrix": [4, 8], "x": 8.25, "y": 4.5 }, + { "matrix": [4, 9], "x": 9.25, "y": 4.5 }, + { "matrix": [4, 10], "x": 10.25, "y": 4.5 }, + { "matrix": [4, 11], "x": 11.25, "y": 4.5 }, + { "matrix": [4, 12], "w": 1.75, "x": 12.25, "y": 4.5 }, + { "matrix": [4, 13], "x": 14.25, "y": 4.75 }, + { "matrix": [4, 14], "x": 15.5, "y": 4.5 }, + { "matrix": [4, 15], "x": 16.5, "y": 4.5 }, + { "matrix": [4, 16], "x": 17.5, "y": 4.5 }, + { "matrix": [4, 17], "x": 18.5, "y": 4.5 }, + { "matrix": [5, 0], "w": 1.25, "x": 0, "y": 5.5 }, + { "matrix": [5, 1], "w": 1.25, "x": 1.25, "y": 5.5 }, + { "matrix": [5, 2], "w": 1.25, "x": 2.5, "y": 5.5 }, + { "matrix": [5, 6], "w": 6.25, "x": 3.75, "y": 5.5 }, + { "matrix": [5, 9], "x": 10, "y": 5.5 }, + { "matrix": [5, 10], "x": 11, "y": 5.5 }, + { "matrix": [5, 11], "x": 12, "y": 5.5 }, + { "matrix": [5, 12], "x": 13.25, "y": 5.75 }, + { "matrix": [5, 13], "x": 14.25, "y": 5.75 }, + { "matrix": [5, 14], "x": 15.25, "y": 5.75 }, + { "matrix": [5, 15], "x": 16.5, "y": 5.5 }, + { "matrix": [5, 16], "x": 17.5, "y": 5.5 }, + { "matrix": [5, 17], "x": 18.5, "y": 5.5 } + ] + } + } +} diff --git a/keyboards/keycult/keycult1800/keymaps/default/keymap.c b/keyboards/keycult/keycult1800/keymaps/default/keymap.c new file mode 100644 index 0000000000..e596ff2db0 --- /dev/null +++ b/keyboards/keycult/keycult1800/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +/* Copyright 2024 Yiancar-Designs + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = 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_F13, 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_DEL, 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_PPLS, + 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(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + +[1] = LAYOUT( /* FN */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; diff --git a/keyboards/keycult/keycult1800/readme.md b/keyboards/keycult/keycult1800/readme.md new file mode 100644 index 0000000000..bc8574248c --- /dev/null +++ b/keyboards/keycult/keycult1800/readme.md @@ -0,0 +1,32 @@ +# Keycult 1800 + +This is a 1800 layout PCB + +* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) +* Hardware Supported: A 1800 keyboard with STM32F072CB or APM compatible +* Hardware Availability: https://keycult.com/ + +## Instructions + +### Build + +Make example for this keyboard (after setting up your build environment): + + make keycult/keycult1800:default + +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). + +### Reset + +- Unplug +- Hold Escape +- Plug In +- Unplug +- Release Escape + +### Flash + +- Unplug +- Hold Escape +- Plug In +- Flash using QMK Toolbox or dfu-util (`make keycult/keycult1800::dfu-util`) diff --git a/keyboards/keycult/keycult1800/rules.mk b/keyboards/keycult/keycult1800/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/keycult/keycult1800/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From 32ea7025fbae47fb824419aaba74f95880f34d57 Mon Sep 17 00:00:00 2001 From: Feags <41646528+Feags@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:58:57 -0600 Subject: [PATCH 083/592] [Keyboard] Promenade fixes (#24705) (Missing keys in matrix, other minor changes to keymap) Co-authored-by: Joel Challis Co-authored-by: jack <0x6a73@protonmail.com> --- .../kradoindustries/promenade/keyboard.json | 10 ++++++---- .../promenade/keymaps/default/keymap.c | 20 +++++++++---------- .../promenade/matrix_diagram.md | 8 ++++---- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/keyboards/kradoindustries/promenade/keyboard.json b/keyboards/kradoindustries/promenade/keyboard.json index 86330dbc2e..028ba1b24d 100644 --- a/keyboards/kradoindustries/promenade/keyboard.json +++ b/keyboards/kradoindustries/promenade/keyboard.json @@ -73,8 +73,8 @@ {"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, "h":1.5}, - {"matrix": [1, 7], "x":7.5, "y":1, "h":1.5}, + {"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}, @@ -88,6 +88,8 @@ {"matrix": [2, 3], "x":3.5, "y":2}, {"matrix": [2, 4], "x":4.5, "y":2}, {"matrix": [2, 5], "x":5.5, "y":2}, + {"matrix": [2, 6], "x":6.5, "y":2}, + {"matrix": [2, 7], "x":7.5, "y":2}, {"matrix": [2, 8], "x":8.5, "y":2}, {"matrix": [2, 9], "x":9.5, "y":2}, {"matrix": [2, 10], "x":10.5, "y":2}, @@ -101,8 +103,8 @@ {"matrix": [3, 3], "x":3.5, "y":3}, {"matrix": [3, 4], "x":4.5, "y":3}, {"matrix": [3, 5], "x":5.5, "y":3}, - {"matrix": [3, 6], "x":6.5, "y":2.5, "h":1.5}, - {"matrix": [3, 7], "x":7.5, "y":2.5, "h":1.5}, + {"matrix": [3, 6], "x":6.5, "y":3}, + {"matrix": [3, 7], "x":7.5, "y":3}, {"matrix": [3, 8], "x":8.5, "y":3}, {"matrix": [3, 9], "x":9.5, "y":3}, {"matrix": [3, 10], "x":10.5, "y":3}, diff --git a/keyboards/kradoindustries/promenade/keymaps/default/keymap.c b/keyboards/kradoindustries/promenade/keymaps/default/keymap.c index aef0f28161..be8401e608 100644 --- a/keyboards/kradoindustries/promenade/keymaps/default/keymap.c +++ b/keyboards/kradoindustries/promenade/keymaps/default/keymap.c @@ -26,19 +26,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .-----------------------------------------------------------------------------------------------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | - | = | 6 | 7 | 8 | 9 | 0 | BACKSP | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| - * | TAB | Q | W | E | R | T | [ | ] | Y | U | I | O | P | ' | + * | TAB | Q | W | E | R | T | [ | ] | Y | U | I | O | P | \ | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| - * | CAP LK | A | S | D | F | G | | | H | J | K | L | ; | ENTER | + * | CAP LK | A | S | D | F | G | HOME | PG UP | H | J | K | L | ; | ENTER | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | LSHIFT | Z | X | C | V | B | END | PG DN | N | M | , | . | / | RSHIFT | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | LGUI | FN | LALT | SPACE | SPACE | SPACE | SPACE | SPACE | LEFT | DOWN | UP | RIGHT | RCTRL | + * | LCTRL | LGUI | LALT | FN | SPACE | SPACE | SPACE | SPACE | LEFT | DOWN | UP | RIGHT | RCTRL | * '-----------------------------------------------------------------------------------------------------------------------------' */ [_BASE] = LAYOUT_all( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, 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_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, MO(_FN), KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RCTL ), @@ -47,20 +47,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .-----------------------------------------------------------------------------------------------------------------------------. * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| - * | | Home | Up | End | PgUp | | | | | | | | PRT SC | | + * | | HOME | UP | END | PG UP | | | | | | | | PRT SC | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| - * | | Left | Down | Right | PgDn | | | | | | | | | Reset | + * | | LEFT | DOWN | RIGHT | PG DN | | | | | | | | ' | RGB Off| * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | | | | | | | | | | MUTE | VOL DN | VOL UP | \ | | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+-----------------+--------+--------| - * | | | | | | | | | | | | | | Reset | + * | | | | | | ENTER | ENTER | BACKSP | | | | | Reset | * '-----------------------------------------------------------------------------------------------------------------------------' */ [_FN] = 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_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, - _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, _______, _______, QK_BOOT, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, UG_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT + _______, _______, _______, _______, _______, KC_ENT, KC_ENT, KC_BSPC, _______, _______, _______, _______, QK_BOOT ) }; diff --git a/keyboards/kradoindustries/promenade/matrix_diagram.md b/keyboards/kradoindustries/promenade/matrix_diagram.md index 086471b8b9..3c205c9a99 100644 --- a/keyboards/kradoindustries/promenade/matrix_diagram.md +++ b/keyboards/kradoindustries/promenade/matrix_diagram.md @@ -5,10 +5,10 @@ │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │ ├─────┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼─────┤ │10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │ -├─────┼───┼───┼───┼───┼───┤ │ ├───┼───┼───┼───┼───┼─────┤ -│20 │21 │22 │23 │24 │25 ├───┼───┤28 │29 │2A │2B │2C │2D │ -├─────┼───┼───┼───┼───┼───┤36 │37 ├───┼───┼───┼───┼───┼─────┤ -│30 │31 │32 │33 │34 │35 │ │ │38 │39 │3A │3B │3C │3D │ +├─────┼───┼───┼───┼───┼───├───┼───┼───┼───┼───┼───┼───┼─────┤ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D │ +├─────┼───┼───┼───┼───┼───├───┼───┼───┼───┼───┼───┼───┼─────┤ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │ ├─────┼───┼───┼───┼───┼───┼───┴───┼───┼───┼───┼───┼───┼─────┤ │40 │41 │42 │43 │44 │45 │46 │48 │49 │4A │4B │4C │4D │ └─────┴───┴───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┴─────┘ From 58807b02887c116a22f860cd80d5b94ddd77122b Mon Sep 17 00:00:00 2001 From: J <12501551+NBeing@users.noreply.github.com> Date: Sun, 22 Dec 2024 15:23:14 -0500 Subject: [PATCH 084/592] Clarify keymap location and format in newbs_building_firmware.md (#24663) --- docs/newbs_building_firmware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md index f3afd6a896..f5e529b9ce 100644 --- a/docs/newbs_building_firmware.md +++ b/docs/newbs_building_firmware.md @@ -42,7 +42,7 @@ Look at the output from that command, you should see something like this: Ψ Created a new keymap called in: /home/me/qmk_firmware/keyboards/clueboard/66/rev3/keymaps/. ``` -This is the location of your new `keymap.c` file. +This is the location of your new keymap file. Your keyboards default keymap file may be a `.json` file or a `.c` file. If your keymap is a `.json` file it can be converted to a `.c` file using QMK's [`json2c`](cli_commands#qmk-json2c) utility. ## Open `keymap.c` In Your Favorite Text Editor From b4ece24c7dfa741ddef70a92166cd21930df55fd Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Sun, 22 Dec 2024 16:03:03 -0500 Subject: [PATCH 085/592] move ymdk/id75 to revision (#24590) --- data/mappings/keyboard_aliases.hjson | 3 + keyboards/ymdk/id75/{ => f103}/board.h | 0 keyboards/ymdk/id75/{ => f103}/config.h | 0 keyboards/ymdk/id75/{ => f103}/halconf.h | 0 keyboards/ymdk/id75/f103/keyboard.json | 13 + keyboards/ymdk/id75/{ => f103}/mcuconf.h | 0 keyboards/ymdk/id75/{ => f103}/rules.mk | 0 .../ymdk/id75/{keyboard.json => info.json} | 231 +++++++++--------- keyboards/ymdk/id75/readme.md | 12 +- 9 files changed, 133 insertions(+), 126 deletions(-) rename keyboards/ymdk/id75/{ => f103}/board.h (100%) rename keyboards/ymdk/id75/{ => f103}/config.h (100%) rename keyboards/ymdk/id75/{ => f103}/halconf.h (100%) create mode 100644 keyboards/ymdk/id75/f103/keyboard.json rename keyboards/ymdk/id75/{ => f103}/mcuconf.h (100%) rename keyboards/ymdk/id75/{ => f103}/rules.mk (100%) rename keyboards/ymdk/id75/{keyboard.json => info.json} (56%) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 72f6994c09..098c299e58 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1515,6 +1515,9 @@ "ymd96": { "target": "ymdk/ymd96" }, + "ymdk/id75": { + "target": "ymdk/id75/f103" + }, "ymdk_np21": { "target": "ymdk/np21" }, diff --git a/keyboards/ymdk/id75/board.h b/keyboards/ymdk/id75/f103/board.h similarity index 100% rename from keyboards/ymdk/id75/board.h rename to keyboards/ymdk/id75/f103/board.h diff --git a/keyboards/ymdk/id75/config.h b/keyboards/ymdk/id75/f103/config.h similarity index 100% rename from keyboards/ymdk/id75/config.h rename to keyboards/ymdk/id75/f103/config.h diff --git a/keyboards/ymdk/id75/halconf.h b/keyboards/ymdk/id75/f103/halconf.h similarity index 100% rename from keyboards/ymdk/id75/halconf.h rename to keyboards/ymdk/id75/f103/halconf.h diff --git a/keyboards/ymdk/id75/f103/keyboard.json b/keyboards/ymdk/id75/f103/keyboard.json new file mode 100644 index 0000000000..5b1974b3f2 --- /dev/null +++ b/keyboards/ymdk/id75/f103/keyboard.json @@ -0,0 +1,13 @@ +{ + "manufacturer": "YMDK", + "bootloader": "uf2boot", + "matrix_pins": { + "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "A5", "A6", "A4", "A3", "A2", "A1", "A0", "A15"], + "rows": ["B2", "B1", "B0", "A7", "B10"] + }, + "processor": "STM32F103", + "ws2812": { + "driver": "pwm", + "pin": "B9" + } +} diff --git a/keyboards/ymdk/id75/mcuconf.h b/keyboards/ymdk/id75/f103/mcuconf.h similarity index 100% rename from keyboards/ymdk/id75/mcuconf.h rename to keyboards/ymdk/id75/f103/mcuconf.h diff --git a/keyboards/ymdk/id75/rules.mk b/keyboards/ymdk/id75/f103/rules.mk similarity index 100% rename from keyboards/ymdk/id75/rules.mk rename to keyboards/ymdk/id75/f103/rules.mk diff --git a/keyboards/ymdk/id75/keyboard.json b/keyboards/ymdk/id75/info.json similarity index 56% rename from keyboards/ymdk/id75/keyboard.json rename to keyboards/ymdk/id75/info.json index db0c108542..bbe4d1c73e 100644 --- a/keyboards/ymdk/id75/keyboard.json +++ b/keyboards/ymdk/id75/info.json @@ -1,8 +1,6 @@ { - "manufacturer": "YMDK", "keyboard_name": "Idobao x YMDK ID75", "maintainer": "qmk", - "bootloader": "uf2boot", "diode_direction": "ROW2COL", "features": { "bootmagic": true, @@ -11,152 +9,143 @@ "nkro": true, "rgb_matrix": true }, - "matrix_pins": { - "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "A5", "A6", "A4", "A3", "A2", "A1", "A0", "A15"], - "rows": ["B2", "B1", "B0", "A7", "B10"] - }, - "processor": "STM32F103", - "ws2812": { - "driver": "pwm", - "pin": "B9" - }, "rgb_matrix": { "animations": { "alphas_mods": true, - "gradient_up_down": true, - "gradient_left_right": true, - "breathing": true, - "band_sat": true, - "band_val": 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_up_down": true, - "rainbow_moving_chevron": 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, - "rainbow_beacon": true, - "rainbow_pinwheels": true, - "raindrops": true, - "jellybean_raindrops": true, + "gradient_left_right": true, + "gradient_up_down": true, "hue_breathing": true, "hue_pendulum": true, "hue_wave": true, - "pixel_rain": true, + "jellybean_raindrops": true, + "multisplash": true, "pixel_flow": true, "pixel_fractal": true, - "typing_heatmap": true, - "digital_rain": true, - "solid_reactive_simple": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": true, + "solid_multisplash": true, "solid_reactive": true, - "solid_reactive_wide": true, - "solid_reactive_multiwide": true, "solid_reactive_cross": true, "solid_reactive_multicross": true, - "solid_reactive_nexus": true, "solid_reactive_multinexus": true, - "splash": true, - "multisplash": true, + "solid_reactive_multiwide": true, + "solid_reactive_nexus": true, + "solid_reactive_simple": true, + "solid_reactive_wide": true, "solid_splash": true, - "solid_multisplash": true + "splash": true, + "typing_heatmap": true }, "driver": "ws2812", "layout": [ - {"flags": 4, "matrix": [4, 14], "x": 224, "y": 64}, - {"flags": 4, "matrix": [4, 13], "x": 208, "y": 64}, - {"flags": 4, "matrix": [4, 12], "x": 192, "y": 64}, - {"flags": 4, "matrix": [4, 11], "x": 176, "y": 64}, - {"flags": 4, "matrix": [4, 10], "x": 160, "y": 64}, - {"flags": 4, "matrix": [4, 9], "x": 144, "y": 64}, - {"flags": 4, "matrix": [4, 8], "x": 128, "y": 64}, - {"flags": 4, "matrix": [4, 7], "x": 112, "y": 64}, - {"flags": 4, "matrix": [4, 6], "x": 96, "y": 64}, - {"flags": 4, "matrix": [4, 5], "x": 80, "y": 64}, - {"flags": 4, "matrix": [4, 4], "x": 64, "y": 64}, - {"flags": 4, "matrix": [4, 3], "x": 48, "y": 64}, - {"flags": 4, "matrix": [4, 2], "x": 32, "y": 64}, - {"flags": 4, "matrix": [4, 1], "x": 16, "y": 64}, - {"flags": 4, "matrix": [4, 0], "x": 0, "y": 64}, - {"flags": 4, "matrix": [3, 14], "x": 224, "y": 48}, - {"flags": 4, "matrix": [3, 13], "x": 208, "y": 48}, - {"flags": 4, "matrix": [3, 12], "x": 192, "y": 48}, - {"flags": 4, "matrix": [3, 11], "x": 176, "y": 48}, - {"flags": 4, "matrix": [3, 10], "x": 160, "y": 48}, - {"flags": 4, "matrix": [3, 9], "x": 144, "y": 48}, - {"flags": 4, "matrix": [3, 8], "x": 128, "y": 48}, - {"flags": 4, "matrix": [3, 7], "x": 112, "y": 48}, - {"flags": 4, "matrix": [3, 6], "x": 96, "y": 48}, - {"flags": 4, "matrix": [3, 5], "x": 80, "y": 48}, - {"flags": 4, "matrix": [3, 4], "x": 64, "y": 48}, - {"flags": 4, "matrix": [3, 3], "x": 48, "y": 48}, - {"flags": 4, "matrix": [3, 2], "x": 32, "y": 48}, - {"flags": 4, "matrix": [3, 1], "x": 16, "y": 48}, - {"flags": 4, "matrix": [3, 0], "x": 0, "y": 48}, - {"flags": 4, "matrix": [2, 14], "x": 224, "y": 32}, - {"flags": 4, "matrix": [2, 13], "x": 208, "y": 32}, - {"flags": 4, "matrix": [2, 12], "x": 192, "y": 32}, - {"flags": 4, "matrix": [2, 11], "x": 176, "y": 32}, - {"flags": 4, "matrix": [2, 10], "x": 160, "y": 32}, - {"flags": 4, "matrix": [2, 9], "x": 144, "y": 32}, - {"flags": 4, "matrix": [2, 8], "x": 128, "y": 32}, - {"flags": 4, "matrix": [2, 7], "x": 112, "y": 32}, - {"flags": 4, "matrix": [2, 6], "x": 96, "y": 32}, - {"flags": 4, "matrix": [2, 5], "x": 80, "y": 32}, - {"flags": 4, "matrix": [2, 4], "x": 64, "y": 32}, - {"flags": 4, "matrix": [2, 3], "x": 48, "y": 32}, - {"flags": 4, "matrix": [2, 2], "x": 32, "y": 32}, - {"flags": 4, "matrix": [2, 1], "x": 16, "y": 32}, - {"flags": 4, "matrix": [2, 0], "x": 0, "y": 32}, - {"flags": 4, "matrix": [1, 14], "x": 224, "y": 16}, - {"flags": 4, "matrix": [1, 13], "x": 208, "y": 16}, - {"flags": 4, "matrix": [1, 12], "x": 192, "y": 16}, - {"flags": 4, "matrix": [1, 11], "x": 176, "y": 16}, - {"flags": 4, "matrix": [1, 10], "x": 160, "y": 16}, - {"flags": 4, "matrix": [1, 9], "x": 144, "y": 16}, - {"flags": 4, "matrix": [1, 8], "x": 128, "y": 16}, - {"flags": 4, "matrix": [1, 7], "x": 112, "y": 16}, - {"flags": 4, "matrix": [1, 6], "x": 96, "y": 16}, - {"flags": 4, "matrix": [1, 5], "x": 80, "y": 16}, - {"flags": 4, "matrix": [1, 4], "x": 64, "y": 16}, - {"flags": 4, "matrix": [1, 3], "x": 48, "y": 16}, - {"flags": 4, "matrix": [1, 2], "x": 32, "y": 16}, - {"flags": 4, "matrix": [1, 1], "x": 16, "y": 16}, - {"flags": 4, "matrix": [1, 0], "x": 0, "y": 16}, - {"flags": 4, "matrix": [0, 14], "x": 224, "y": 0}, - {"flags": 4, "matrix": [0, 13], "x": 208, "y": 0}, - {"flags": 4, "matrix": [0, 12], "x": 192, "y": 0}, - {"flags": 4, "matrix": [0, 11], "x": 176, "y": 0}, - {"flags": 4, "matrix": [0, 10], "x": 160, "y": 0}, - {"flags": 4, "matrix": [0, 9], "x": 144, "y": 0}, - {"flags": 4, "matrix": [0, 8], "x": 128, "y": 0}, - {"flags": 4, "matrix": [0, 7], "x": 112, "y": 0}, - {"flags": 4, "matrix": [0, 6], "x": 96, "y": 0}, - {"flags": 4, "matrix": [0, 5], "x": 80, "y": 0}, - {"flags": 4, "matrix": [0, 4], "x": 64, "y": 0}, - {"flags": 4, "matrix": [0, 3], "x": 48, "y": 0}, - {"flags": 4, "matrix": [0, 2], "x": 32, "y": 0}, - {"flags": 4, "matrix": [0, 1], "x": 16, "y": 0}, - {"flags": 4, "matrix": [0, 0], "x": 0, "y": 0}, - {"flags": 2, "x": 0, "y": 64}, - {"flags": 2, "x": 38, "y": 64}, - {"flags": 2, "x": 76, "y": 64}, - {"flags": 2, "x": 114, "y": 64}, - {"flags": 2, "x": 152, "y": 64}, - {"flags": 2, "x": 190, "y": 64}, - {"flags": 2, "x": 224, "y": 64}, - {"flags": 2, "x": 0, "y": 0}, - {"flags": 2, "x": 38, "y": 0}, - {"flags": 2, "x": 76, "y": 0}, - {"flags": 2, "x": 114, "y": 0}, - {"flags": 2, "x": 152, "y": 0}, - {"flags": 2, "x": 190, "y": 0}, - {"flags": 2, "x": 224, "y": 0} + {"matrix": [4, 14], "x": 224, "y": 64, "flags": 4}, + {"matrix": [4, 13], "x": 208, "y": 64, "flags": 4}, + {"matrix": [4, 12], "x": 192, "y": 64, "flags": 4}, + {"matrix": [4, 11], "x": 176, "y": 64, "flags": 4}, + {"matrix": [4, 10], "x": 160, "y": 64, "flags": 4}, + {"matrix": [4, 9], "x": 144, "y": 64, "flags": 4}, + {"matrix": [4, 8], "x": 128, "y": 64, "flags": 4}, + {"matrix": [4, 7], "x": 112, "y": 64, "flags": 4}, + {"matrix": [4, 6], "x": 96, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 80, "y": 64, "flags": 4}, + {"matrix": [4, 4], "x": 64, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 48, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 32, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 16, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [3, 14], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 208, "y": 48, "flags": 4}, + {"matrix": [3, 12], "x": 192, "y": 48, "flags": 4}, + {"matrix": [3, 11], "x": 176, "y": 48, "flags": 4}, + {"matrix": [3, 10], "x": 160, "y": 48, "flags": 4}, + {"matrix": [3, 9], "x": 144, "y": 48, "flags": 4}, + {"matrix": [3, 8], "x": 128, "y": 48, "flags": 4}, + {"matrix": [3, 7], "x": 112, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 96, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 48, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [2, 14], "x": 224, "y": 32, "flags": 4}, + {"matrix": [2, 13], "x": 208, "y": 32, "flags": 4}, + {"matrix": [2, 12], "x": 192, "y": 32, "flags": 4}, + {"matrix": [2, 11], "x": 176, "y": 32, "flags": 4}, + {"matrix": [2, 10], "x": 160, "y": 32, "flags": 4}, + {"matrix": [2, 9], "x": 144, "y": 32, "flags": 4}, + {"matrix": [2, 8], "x": 128, "y": 32, "flags": 4}, + {"matrix": [2, 7], "x": 112, "y": 32, "flags": 4}, + {"matrix": [2, 6], "x": 96, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [1, 14], "x": 224, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 208, "y": 16, "flags": 4}, + {"matrix": [1, 12], "x": 192, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 176, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 160, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 144, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 128, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 112, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 96, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 16, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, + {"matrix": [0, 14], "x": 224, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 208, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 192, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 176, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 160, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 144, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 128, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 96, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 38, "y": 64, "flags": 2}, + {"x": 76, "y": 64, "flags": 2}, + {"x": 114, "y": 64, "flags": 2}, + {"x": 152, "y": 64, "flags": 2}, + {"x": 190, "y": 64, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 0, "y": 0, "flags": 2}, + {"x": 38, "y": 0, "flags": 2}, + {"x": 76, "y": 0, "flags": 2}, + {"x": 114, "y": 0, "flags": 2}, + {"x": 152, "y": 0, "flags": 2}, + {"x": 190, "y": 0, "flags": 2}, + {"x": 224, "y": 0, "flags": 2} ], "max_brightness": 128, "sleep": true diff --git a/keyboards/ymdk/id75/readme.md b/keyboards/ymdk/id75/readme.md index 9315745f71..4f7e779458 100644 --- a/keyboards/ymdk/id75/readme.md +++ b/keyboards/ymdk/id75/readme.md @@ -5,17 +5,18 @@ A 75-key, 5-row ortholinear keyboard with per-key and underglow RGB LEDs. * Keyboard Maintainer: [The QMK Community](https://github.com/qmk) -* Hardware Supported: [Idobao x YMDK ID75 PCB (APM32F103CBT6)](https://www.aliexpress.com/item/3256804537842097.html) - * This PCB uses an ARM Cortex-M3 MCU with 128kb flash. **It is not the same as `idobao/id75` or `ymdk/ymd75`.** +* Hardware Supported: [Idobao x YMDK ID75](https://www.aliexpress.com/item/3256804537842097.html). **This is not the same PCB as `idobao/id75` or `ymdk/ymd75`.** + This keyboard has had multiple PCB revisions, some of which may not work with the firmware in this repository. **Check your PCB before flashing.** + * `f103`: (Geehy APM32F103CBT6, uf2boot) * Hardware Availability: [YMDK](https://ymdkey.com/products/id75-75-keys-ortholinear-layout-qmk-anodized-aluminum-case-plate-hot-swappable-hot-swap-type-c-pcb-mechanical-keyboard-kit), [AliExpress (YMDK Store)](https://www.aliexpress.com/item/2255800125183974.html), [Amazon](https://www.amazon.com/Ortholinear-Anodized-Aluminum-hot-swappable-Mechanical/dp/B07ZQ8CD88) Make example for this keyboard (after setting up your build environment): - make ymdk/id75:default + make ymdk/id75/f103:default Flashing example for this keyboard: - make ymdk/id75:default:flash + make ymdk/id75/f103: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). @@ -27,4 +28,5 @@ Enter the bootloader in 3 ways: * **Physical reset button**: Press the button on the back of the PCB twice in quick succession. * **Keycode in layout**: Press the key mapped to `QK_BOOT`. In the pre-supplied keymaps it is on the second layer, in the bottom-right corner. -After entering the bootloader through one of the three methods above, the keyboard will appear as a USB mass storage device named `MT.KEY`. If the CLI is unable to find this device, the compiled `.uf2` file can be manually copied to it. The keyboard will reboot on completion with the new firmware loaded. +After entering the bootloader through one of the three methods above, the keyboard will appear as a USB mass storage device. If the CLI is unable to find this device, the compiled `.uf2` file can be manually copied to it. The keyboard will reboot on completion with the new firmware loaded. +- `f103`: The volume name is `MT.KEY`. From 18cca2062e889a23933043ec5bdaf3c18cb060e1 Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Mon, 23 Dec 2024 22:25:37 -0800 Subject: [PATCH 086/592] DecenTKL main keyboard (#24702) --- keyboards/decent/tkl/atari-font.c | 231 ++++++++++++++ keyboards/decent/tkl/config.h | 9 + keyboards/decent/tkl/keyboard.json | 298 ++++++++++++++++++ keyboards/decent/tkl/keymaps/default/keymap.c | 57 ++++ keyboards/decent/tkl/readme.md | 79 +++++ keyboards/decent/tkl/tkl.c | 72 +++++ 6 files changed, 746 insertions(+) create mode 100644 keyboards/decent/tkl/atari-font.c create mode 100644 keyboards/decent/tkl/config.h create mode 100644 keyboards/decent/tkl/keyboard.json create mode 100644 keyboards/decent/tkl/keymaps/default/keymap.c create mode 100644 keyboards/decent/tkl/readme.md create mode 100644 keyboards/decent/tkl/tkl.c diff --git a/keyboards/decent/tkl/atari-font.c b/keyboards/decent/tkl/atari-font.c new file mode 100644 index 0000000000..635e711f52 --- /dev/null +++ b/keyboards/decent/tkl/atari-font.c @@ -0,0 +1,231 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "progmem.h" + +static const unsigned char PROGMEM font[] = { + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, + 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, + 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, + 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, + 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, + 0x80, 0xC0, 0xF0, 0xF8, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFE, 0xF8, 0xF0, 0xC0, 0x80, + 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, + 0x18, 0x58, 0x66, 0x66, 0x58, 0x18, + 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, + 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, + 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, + 0x1F, 0x15, 0x75, 0x50, 0x50, 0x00, + 0x08, 0x0C, 0x7E, 0x0C, 0x08, 0x00, + 0x10, 0x30, 0x7E, 0x30, 0x10, 0x00, + 0x10, 0x38, 0x54, 0x10, 0x10, 0x00, + 0x10, 0x10, 0x54, 0x38, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, + 0x24, 0x7E, 0x24, 0x7E, 0x24, 0x00, + 0x24, 0x2A, 0x6B, 0x2A, 0x12, 0x00, + 0x4C, 0x2C, 0x10, 0x68, 0x64, 0x00, + 0x30, 0x4A, 0x55, 0x32, 0x50, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, + 0x10, 0x54, 0x38, 0x54, 0x10, 0x00, + 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, + 0x00, 0x80, 0xE0, 0x60, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x3C, 0x52, 0x4A, 0x46, 0x3C, 0x00, + 0x00, 0x44, 0x7E, 0x40, 0x00, 0x00, + 0x44, 0x62, 0x52, 0x4A, 0x44, 0x00, + 0x22, 0x42, 0x4A, 0x56, 0x22, 0x00, + 0x30, 0x28, 0x24, 0x7E, 0x20, 0x00, + 0x2E, 0x4A, 0x4A, 0x4A, 0x32, 0x00, + 0x3C, 0x4A, 0x4A, 0x4A, 0x30, 0x00, + 0x62, 0x12, 0x0A, 0x06, 0x02, 0x00, + 0x34, 0x4A, 0x4A, 0x4A, 0x34, 0x00, + 0x04, 0x4A, 0x4A, 0x2A, 0x1C, 0x00, + 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x48, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, + 0x04, 0x02, 0x52, 0x0A, 0x04, 0x00, + 0x3C, 0x42, 0x5A, 0x5A, 0x5C, 0x00, + 0x78, 0x24, 0x22, 0x24, 0x78, 0x00, + 0x7E, 0x4A, 0x4A, 0x4A, 0x34, 0x00, + 0x3C, 0x42, 0x42, 0x42, 0x24, 0x00, + 0x7E, 0x42, 0x42, 0x24, 0x18, 0x00, + 0x7E, 0x4A, 0x4A, 0x4A, 0x42, 0x00, + 0x7E, 0x0A, 0x0A, 0x0A, 0x02, 0x00, + 0x3C, 0x42, 0x42, 0x52, 0x72, 0x00, + 0x7E, 0x08, 0x08, 0x08, 0x7E, 0x00, + 0x00, 0x42, 0x7E, 0x42, 0x00, 0x00, + 0x20, 0x40, 0x40, 0x3E, 0x00, 0x00, + 0x7E, 0x18, 0x24, 0x42, 0x00, 0x00, + 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x7E, 0x04, 0x08, 0x04, 0x7E, 0x00, + 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, + 0x3C, 0x42, 0x42, 0x42, 0x3C, 0x00, + 0x7E, 0x12, 0x12, 0x12, 0x0C, 0x00, + 0x3C, 0x42, 0x52, 0x22, 0x5C, 0x00, + 0x7E, 0x12, 0x12, 0x32, 0x4C, 0x00, + 0x04, 0x4A, 0x4A, 0x4A, 0x30, 0x00, + 0x02, 0x02, 0x7E, 0x02, 0x02, 0x00, + 0x7E, 0x40, 0x40, 0x40, 0x7E, 0x00, + 0x1E, 0x20, 0x40, 0x20, 0x1E, 0x00, + 0x7E, 0x20, 0x10, 0x20, 0x7E, 0x00, + 0x42, 0x24, 0x18, 0x24, 0x42, 0x00, + 0x06, 0x08, 0x70, 0x08, 0x06, 0x00, + 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00, + 0x00, 0x7E, 0x42, 0x42, 0x00, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x7E, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x18, 0x3C, 0x7E, 0x7E, 0x3C, 0x18, + 0x20, 0x54, 0x54, 0x54, 0x78, 0x00, + 0x7E, 0x48, 0x48, 0x48, 0x30, 0x00, + 0x00, 0x38, 0x44, 0x44, 0x44, 0x00, + 0x30, 0x48, 0x48, 0x48, 0x7E, 0x00, + 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, + 0x00, 0x08, 0x7C, 0x0A, 0x0A, 0x00, + 0x98, 0xA4, 0xA4, 0xA4, 0x7C, 0x00, + 0x7E, 0x08, 0x08, 0x08, 0x70, 0x00, + 0x00, 0x48, 0x7A, 0x40, 0x00, 0x00, + 0x00, 0x80, 0x80, 0x80, 0x7A, 0x00, + 0x00, 0x7E, 0x10, 0x28, 0x40, 0x00, + 0x00, 0x42, 0x7E, 0x40, 0x00, 0x00, + 0x7C, 0x0C, 0x18, 0x0C, 0x78, 0x00, + 0x7C, 0x04, 0x04, 0x04, 0x78, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, + 0x00, 0xFC, 0x24, 0x24, 0x18, 0x00, + 0x00, 0x18, 0x24, 0x24, 0xFC, 0x00, + 0x00, 0x7C, 0x04, 0x04, 0x08, 0x00, + 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, + 0x00, 0x04, 0x3E, 0x44, 0x44, 0x00, + 0x3C, 0x40, 0x40, 0x40, 0x7C, 0x00, + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, + 0x1C, 0x70, 0x38, 0x70, 0x1C, 0x00, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, + 0x8C, 0x90, 0x90, 0x50, 0x3C, 0x00, + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, + 0x18, 0x5C, 0x7E, 0x7E, 0x5C, 0x18, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x1E, 0x06, 0x0A, 0x72, 0x00, 0x00, + 0x00, 0x08, 0x1C, 0x3E, 0x7F, 0x00, + 0x00, 0x7F, 0x3E, 0x1C, 0x08, 0x00, + 0x7E, 0xD5, 0xD5, 0xD5, 0xD5, 0x7E, + 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, + 0xFE, 0xCF, 0x33, 0xE3, 0xC1, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, + 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x03, 0x01, 0x01, 0xF1, 0xF1, 0xF1, + 0xE1, 0x03, 0x03, 0x0F, 0xFF, 0x03, + 0x01, 0x01, 0x31, 0x31, 0x31, 0x31, + 0x31, 0xFF, 0x0F, 0x03, 0x03, 0xE1, + 0xF1, 0xF1, 0xF1, 0xF1, 0xF1, 0xFF, + 0x03, 0x01, 0x01, 0x31, 0x31, 0x31, + 0x31, 0x31, 0xFF, 0x03, 0x01, 0x01, + 0xC1, 0x03, 0x0F, 0x3F, 0xFF, 0x01, + 0x01, 0x01, 0xFF, 0xF1, 0xF1, 0xF1, + 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, + 0xF1, 0xFF, 0x01, 0x01, 0x01, 0x01, + 0x0F, 0x07, 0x03, 0xC1, 0xE1, 0xF1, + 0xF9, 0xFD, 0xFF, 0x01, 0x01, 0x01, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, + 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, + 0x00, 0x00, 0x4C, 0x5A, 0x32, 0x00, + 0x7E, 0x08, 0x70, 0x00, 0x7A, 0x00, + 0x7C, 0x0A, 0x00, 0x3E, 0x48, 0x00, + 0x00, 0x00, 0x7E, 0x0A, 0x0A, 0x00, + 0x78, 0x08, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, + 0xBA, 0xBA, 0xFE, 0x86, 0xEA, 0xEA, + 0x86, 0xFE, 0x82, 0xEA, 0xEA, 0xF6, + 0xFE, 0xB6, 0xAA, 0xDA, 0xFE, 0x7C, + 0x20, 0x30, 0x38, 0x3C, 0x3E, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x38, 0x27, 0x2F, + 0x20, 0x20, 0x20, 0x20, 0x30, 0x30, + 0x3C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x30, 0x20, 0xA0, 0x23, 0xA3, 0x23, + 0xA1, 0x30, 0x30, 0x3C, 0x3F, 0x30, + 0x20, 0x20, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x3F, 0x3C, 0x30, 0x20, 0x21, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x3F, + 0x30, 0x20, 0x20, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x3F, 0x20, 0x20, 0x20, + 0x3F, 0x3F, 0x3C, 0x30, 0x20, 0x20, + 0x20, 0x30, 0x3F, 0x3F, 0x3F, 0x3F, + 0x20, 0x20, 0x20, 0x20, 0x3F, 0x3F, + 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x38, 0x30, 0x20, 0x21, 0x23, + 0x27, 0x2F, 0x3F, 0x30, 0x20, 0x20, + 0x20, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, + 0xBF, 0x9F, 0xCF, 0xE1, 0xFF, 0x81, + 0xFF, 0xE1, 0xCF, 0x9F, 0xBF, 0xFF, + 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7E, 0xFF, 0xB3, 0xA5, 0xCD, 0xFF, + 0x81, 0xF7, 0x8F, 0xFF, 0x85, 0xFF, + 0x83, 0xF5, 0xFF, 0xC1, 0xB7, 0x7E, + 0x7E, 0xFF, 0x81, 0xF5, 0xF5, 0xFF, + 0x87, 0xF7, 0x8F, 0xFF, 0x7E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x44, 0x44, 0x00, 0x78, 0x14, 0x14, + 0x78, 0x00, 0x7C, 0x14, 0x14, 0x08, + 0x00, 0x48, 0x54, 0x24, 0x00, 0x00, + 0x7E, 0xFF, 0xC3, 0xBD, 0xBD, 0xFF, + 0xC1, 0xB7, 0xFF, 0x8F, 0xF7, 0xF7, + 0xFF, 0x81, 0xFF, 0x7E, 0x00, 0x00, + 0x7E, 0xFF, 0x83, 0xF5, 0xF5, 0x83, + 0xFF, 0x81, 0xFF, 0xC1, 0xB7, 0x7E, + 0x2A, 0x7F, 0xF1, 0x6F, 0xC1, 0x6F, + 0xF1, 0x7F, 0x2A, 0x00, 0x00, 0x3E, + 0x7F, 0x41, 0x61, 0xFF, 0xBE, 0x00, + 0x7F, 0x7E, 0x0C, 0x18, 0x0C, 0x7E, + 0x7F, 0x00, 0x7F, 0x7F, 0x1C, 0x36, + 0x63, 0x41, 0x00, 0x00, 0x00, 0x7F, + 0x7F, 0x1B, 0x1B, 0x03, 0x00, 0x7B, + 0x7B, 0x00, 0x7C, 0x78, 0x0C, 0x0C, + 0x00, 0x7C, 0x78, 0x0C, 0x7C, 0x78, + 0x0C, 0x7C, 0x78, 0x00, 0x1C, 0x38, + 0x60, 0x38, 0x60, 0x38, 0x1C, 0x00, + 0x20, 0x74, 0x54, 0x54, 0x3C, 0x78, + 0x00, 0x7C, 0x78, 0x0C, 0x0C, 0x00, + 0x38, 0x7C, 0x54, 0x54, 0x5C, 0x58, + 0x00, 0x2A, 0x2A, 0x2A, 0x2A, 0x00, + 0x40, 0x60, 0x30, 0x1E, 0x00, 0x7E, + 0x00, 0x1E, 0x30, 0x60, 0x40, 0x00, + 0x40, 0x60, 0x70, 0x78, 0x7C, 0x7E, + 0x7F, 0x73, 0x65, 0x49, 0x51, 0x63, + 0x7F, 0x7F, 0x41, 0x5D, 0x63, 0x7F, + 0x41, 0x55, 0x5D, 0x7F, 0x63, 0x5D, + 0x5D, 0x7F, 0x41, 0x55, 0x5D, 0x7F, + 0x41, 0x73, 0x67, 0x41, 0x7F, 0x79, + 0x79, 0x41, 0x41, 0x79, 0x79, 0x7F, + 0x41, 0x41, 0x63, 0x41, 0x49, 0x5D, + 0x7F, 0x41, 0x41, 0x4F, 0x4F, 0x7F, + 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, +}; diff --git a/keyboards/decent/tkl/config.h b/keyboards/decent/tkl/config.h new file mode 100644 index 0000000000..772d6f4a27 --- /dev/null +++ b/keyboards/decent/tkl/config.h @@ -0,0 +1,9 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define I2C1_SDA_PIN GP26 +#define I2C1_SCL_PIN GP27 + +#define OLED_FONT_H "atari-font.c" \ No newline at end of file diff --git a/keyboards/decent/tkl/keyboard.json b/keyboards/decent/tkl/keyboard.json new file mode 100644 index 0000000000..96b472c6fc --- /dev/null +++ b/keyboards/decent/tkl/keyboard.json @@ -0,0 +1,298 @@ +{ + "manufacturer": "Bertrand Le roy", + "keyboard_name": "DecenTKL", + "maintainer": "bleroy", + "url": "https://github.com/bleroy/3d-junkyard/blob/main/DecenTKL/", + "tags": ["ansi", "tkl", "rgb", "oled", "encoder", "atari"], + "bootloader": "rp2040", + "processor": "RP2040", + "features": { + "encoder": true, + "bootmagic": true, + "rgb_matrix": true, + "oled": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": false, + "nkro": true + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9"], + "rows": ["GP11", "GP12", "GP13", "GP14", "GP15", "GP16", "GP17", "GP18", "GP19", "GP20"] + }, + "bootmagic": { + "matrix": [0, 6] + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "encoder": { + "rotary": [ + { + "pin_a": "GP21", + "pin_b": "GP22", + "resolution": 1 + } + ] + }, + "ws2812": { + "pin": "GP0", + "driver": "vendor" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 6], "x": 0.5, "y": 0, "label": "Esc"}, + {"matrix": [0, 5], "x": 3.5, "y": 0, "label": "F1"}, + {"matrix": [0, 4], "x": 5, "y": 0, "label": "F2"}, + {"matrix": [0, 3], "x": 6.5, "y": 0, "label": "F3"}, + {"matrix": [0, 2], "x": 8, "y": 0, "label": "F4"}, + {"matrix": [0, 1], "x": 9.5, "y": 0, "label": "F5"}, + {"matrix": [0, 0], "x": 11, "y": 0, "label": "F6"}, + {"matrix": [1, 0], "x": 12.5, "y": 0, "label": "F7"}, + {"matrix": [1, 1], "x": 14, "y": 0, "label": "F8"}, + {"matrix": [1, 2], "x": 15.5, "y": 0, "label": "F9"}, + {"matrix": [1, 3], "x": 17, "y": 0, "label": "F10"}, + + {"matrix": [2, 6], "x": 0, "y": 1.5, "label": "`"}, + {"matrix": [2, 5], "x": 1, "y": 1.5, "label": "1"}, + {"matrix": [2, 4], "x": 2, "y": 1.5, "label": "2"}, + {"matrix": [2, 3], "x": 3, "y": 1.5, "label": "3"}, + {"matrix": [2, 2], "x": 4, "y": 1.5, "label": "4"}, + {"matrix": [2, 1], "x": 5, "y": 1.5, "label": "5"}, + {"matrix": [2, 0], "x": 6, "y": 1.5, "label": "6"}, + {"matrix": [3, 0], "x": 7, "y": 1.5, "label": "7"}, + {"matrix": [3, 1], "x": 8, "y": 1.5, "label": "8"}, + {"matrix": [3, 2], "x": 9, "y": 1.5, "label": "9"}, + {"matrix": [3, 3], "x": 10, "y": 1.5, "label": "0"}, + {"matrix": [3, 4], "x": 11, "y": 1.5, "label": "-"}, + {"matrix": [3, 5], "x": 12, "y": 1.5, "label": "="}, + {"matrix": [3, 6], "x": 13, "y": 1.5, "w": 2, "label": "Backspace"}, + {"matrix": [1, 4], "x": 15.5, "y": 1.5, "label": "Insert"}, + {"matrix": [1, 5], "x": 16.5, "y": 1.5, "label": "Home"}, + {"matrix": [1, 6], "x": 17.5, "y": 1.5, "label": "PgUp"}, + + {"matrix": [4, 6], "x": 0, "y": 2.5, "w": 1.5, "label": "Tab"}, + {"matrix": [4, 5], "x": 1.5, "y": 2.5, "label": "Q"}, + {"matrix": [4, 4], "x": 2.5, "y": 2.5, "label": "W"}, + {"matrix": [4, 3], "x": 3.5, "y": 2.5, "label": "E"}, + {"matrix": [4, 2], "x": 4.5, "y": 2.5, "label": "R"}, + {"matrix": [4, 1], "x": 5.5, "y": 2.5, "label": "T"}, + {"matrix": [4, 0], "x": 6.5, "y": 2.5, "label": "Y"}, + {"matrix": [5, 0], "x": 7.5, "y": 2.5, "label": "U"}, + {"matrix": [5, 1], "x": 8.5, "y": 2.5, "label": "I"}, + {"matrix": [5, 2], "x": 9.5, "y": 2.5, "label": "O"}, + {"matrix": [5, 3], "x": 10.5, "y": 2.5, "label": "P"}, + {"matrix": [5, 4], "x": 11.5, "y": 2.5, "label": "["}, + {"matrix": [5, 5], "x": 12.5, "y": 2.5, "label": "]"}, + {"matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5, "label": "\\"}, + {"matrix": [9, 5], "x": 15.5, "y": 2.5, "label": "Del"}, + {"matrix": [9, 6], "x": 16.5, "y": 2.5, "label": "End"}, + {"matrix": [7, 6], "x": 17.5, "y": 2.5, "label": "PgDn"}, + + {"matrix": [6, 6], "x": 0, "y": 3.5, "w": 1.75, "label": "Caps"}, + {"matrix": [6, 5], "x": 1.75, "y": 3.5, "label": "A"}, + {"matrix": [6, 4], "x": 2.75, "y": 3.5, "label": "S"}, + {"matrix": [6, 3], "x": 3.75, "y": 3.5, "label": "D"}, + {"matrix": [6, 2], "x": 4.75, "y": 3.5, "label": "F"}, + {"matrix": [6, 1], "x": 5.75, "y": 3.5, "label": "G"}, + {"matrix": [6, 0], "x": 6.75, "y": 3.5, "label": "H"}, + {"matrix": [7, 0], "x": 7.75, "y": 3.5, "label": "J"}, + {"matrix": [7, 1], "x": 8.75, "y": 3.5, "label": "K"}, + {"matrix": [7, 2], "x": 9.75, "y": 3.5, "label": "L"}, + {"matrix": [7, 3], "x": 10.75, "y": 3.5, "label": ";"}, + {"matrix": [7, 4], "x": 11.75, "y": 3.5, "label": "'"}, + {"matrix": [7, 5], "x": 12.75, "y": 3.5, "w": 2.25, "label": "Return"}, + + {"matrix": [8, 6], "x": 0, "y": 4.5, "w": 2.25, "label": "Shift"}, + {"matrix": [8, 5], "x": 2.25, "y": 4.5, "label": "Z"}, + {"matrix": [8, 4], "x": 3.25, "y": 4.5, "label": "X"}, + {"matrix": [8, 3], "x": 4.25, "y": 4.5, "label": "C"}, + {"matrix": [8, 2], "x": 5.25, "y": 4.5, "label": "V"}, + {"matrix": [8, 1], "x": 6.25, "y": 4.5, "label": "B"}, + {"matrix": [8, 0], "x": 7.25, "y": 4.5, "label": "N"}, + {"matrix": [9, 0], "x": 8.25, "y": 4.5, "label": "M"}, + {"matrix": [9, 1], "x": 9.25, "y": 4.5, "label": ","}, + {"matrix": [9, 2], "x": 10.25, "y": 4.5, "label": "."}, + {"matrix": [9, 3], "x": 11.25, "y": 4.5, "label": "/"}, + {"matrix": [9, 4], "x": 12.25, "y": 4.5, "w": 2.75, "label": "Shift"}, + {"matrix": [4, 7], "x": 16.5, "y": 4.5, "label": "Up"}, + + {"matrix": [0, 8], "x": 0, "y": 5.5, "w": 1.25, "label": "Ctrl"}, + {"matrix": [1, 8], "x": 1.25, "y": 5.5, "w": 1.25, "label": "Atari"}, + {"matrix": [2, 8], "x": 2.5, "y": 5.5, "w": 1.25, "label": "Alt"}, + {"matrix": [3, 8], "x": 3.75, "y": 5.5, "w": 6.25, "label": "Space"}, + {"matrix": [2, 7], "x": 10, "y": 5.5, "w": 1.25, "label": "Alt"}, + {"matrix": [1, 7], "x": 11.25, "y": 5.5, "w": 1.25, "label": "Fn"}, + {"matrix": [3, 7], "x": 12.5, "y": 5.5, "w": 1.25, "label": "Menu"}, + {"matrix": [0, 7], "x": 13.75, "y": 5.5, "w": 1.25, "label": "Ctrl"}, + {"matrix": [4, 8], "x": 15.25, "y": 5.5, "label": "Left"}, + {"matrix": [5, 7], "x": 16.25, "y": 5.5, "label": "Down"}, + {"matrix": [5, 8], "x": 17.25, "y": 5.5, "label": "Right"} + ] + } + }, + "rgb_matrix": { + "max_brightness": 125, + "sleep": true, + "center_point": [77, 32], + "default": { + "animation": "typing_heatmap" + }, + "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": [0, 6], "x": 8, "y": 0, "flags": 4}, + {"matrix": [2, 6], "x": 0, "y": 16, "flags": 4}, + {"matrix": [4, 6], "x": 3, "y": 26, "flags": 4}, + {"matrix": [6, 6], "x": 4, "y": 36, "flags": 4}, + {"matrix": [8, 6], "x": 6, "y": 46, "flags": 1}, + {"matrix": [0, 8], "x": 1, "y": 56, "flags": 1}, + + {"matrix": [0, 5], "x": 40, "y": 0, "flags": 4}, + {"matrix": [2, 5], "x": 10, "y": 16, "flags": 4}, + {"matrix": [4, 5], "x": 15, "y": 26, "flags": 4}, + {"matrix": [6, 5], "x": 17, "y": 36, "flags": 4}, + {"matrix": [8, 5], "x": 22, "y": 46, "flags": 4}, + {"matrix": [1, 8], "x": 14, "y": 56, "flags": 1}, + + {"matrix": [0, 4], "x": 55, "y": 0, "flags": 4}, + {"matrix": [2, 4], "x": 20, "y": 16, "flags": 4}, + {"matrix": [4, 4], "x": 25, "y": 26, "flags": 4}, + {"matrix": [6, 4], "x": 27, "y": 36, "flags": 4}, + {"matrix": [8, 4], "x": 32, "y": 46, "flags": 4}, + {"matrix": [2, 8], "x": 26, "y": 56, "flags": 1}, + + {"matrix": [0, 3], "x": 70, "y": 0, "flags": 4}, + {"matrix": [2, 3], "x": 30, "y": 16, "flags": 4}, + {"matrix": [4, 3], "x": 35, "y": 26, "flags": 4}, + {"matrix": [6, 3], "x": 37, "y": 36, "flags": 4}, + {"matrix": [8, 3], "x": 42, "y": 46, "flags": 4}, + + {"matrix": [0, 2], "x": 85, "y": 0, "flags": 4}, + {"matrix": [2, 2], "x": 40, "y": 16, "flags": 4}, + {"matrix": [4, 2], "x": 45, "y": 26, "flags": 4}, + {"matrix": [6, 2], "x": 47, "y": 36, "flags": 4}, + {"matrix": [8, 2], "x": 52, "y": 46, "flags": 4}, + + {"matrix": [0, 1], "x": 100, "y": 0, "flags": 4}, + {"matrix": [2, 1], "x": 50, "y": 16, "flags": 4}, + {"matrix": [4, 1], "x": 55, "y": 26, "flags": 4}, + {"matrix": [6, 1], "x": 57, "y": 36, "flags": 4}, + {"matrix": [8, 1], "x": 62, "y": 46, "flags": 4}, + {"matrix": [3, 8], "x": 63, "y": 56, "flags": 4}, + + {"matrix": [0, 0], "x": 115, "y": 0, "flags": 4}, + {"matrix": [2, 0], "x": 60, "y": 16, "flags": 4}, + {"matrix": [4, 0], "x": 65, "y": 26, "flags": 4}, + {"matrix": [6, 0], "x": 67, "y": 36, "flags": 4}, + {"matrix": [8, 0], "x": 72, "y": 46, "flags": 4}, + + {"matrix": [1, 0], "x": 130, "y": 0, "flags": 4}, + {"matrix": [3, 0], "x": 70, "y": 16, "flags": 4}, + {"matrix": [5, 0], "x": 75, "y": 26, "flags": 4}, + {"matrix": [7, 0], "x": 77, "y": 36, "flags": 4}, + {"matrix": [9, 0], "x": 82, "y": 46, "flags": 4}, + + {"matrix": [1, 1], "x": 145, "y": 0, "flags": 4}, + {"matrix": [3, 1], "x": 80, "y": 16, "flags": 4}, + {"matrix": [5, 1], "x": 85, "y": 26, "flags": 4}, + {"matrix": [7, 1], "x": 87, "y": 36, "flags": 4}, + {"matrix": [9, 1], "x": 92, "y": 46, "flags": 4}, + + {"matrix": [1, 2], "x": 160, "y": 0, "flags": 4}, + {"matrix": [3, 2], "x": 90, "y": 16, "flags": 4}, + {"matrix": [5, 2], "x": 95, "y": 26, "flags": 4}, + {"matrix": [7, 2], "x": 97, "y": 36, "flags": 4}, + {"matrix": [9, 2], "x": 102, "y": 46, "flags": 4}, + + {"matrix": [1, 3], "x": 175, "y": 0, "flags": 4}, + {"matrix": [3, 3], "x": 100, "y": 16, "flags": 4}, + {"matrix": [5, 3], "x": 105, "y": 26, "flags": 4}, + {"matrix": [7, 3], "x": 107, "y": 36, "flags": 4}, + {"matrix": [9, 3], "x": 112, "y": 46, "flags": 4}, + {"matrix": [2, 7], "x": 100, "y": 56, "flags": 1}, + + {"matrix": [3, 4], "x": 110, "y": 16, "flags": 4}, + {"matrix": [5, 4], "x": 115, "y": 26, "flags": 4}, + {"matrix": [7, 4], "x": 117, "y": 36, "flags": 4}, + {"matrix": [9, 4], "x": 130, "y": 46, "flags": 1}, + {"matrix": [1, 7], "x": 112, "y": 56, "flags": 1}, + + {"matrix": [3, 5], "x": 120, "y": 16, "flags": 4}, + {"matrix": [5, 5], "x": 125, "y": 26, "flags": 4}, + {"matrix": [7, 5], "x": 132, "y": 36, "flags": 4}, + {"matrix": [3, 7], "x": 125, "y": 56, "flags": 1}, + + {"matrix": [3, 6], "x": 140, "y": 16, "flags": 4}, + {"matrix": [5, 6], "x": 135, "y": 26, "flags": 4}, + {"matrix": [0, 7], "x": 137, "y": 56, "flags": 1}, + + {"matrix": [1, 4], "x": 150, "y": 16, "flags": 4}, + {"matrix": [9, 5], "x": 150, "y": 26, "flags": 4}, + {"matrix": [4, 8], "x": 150, "y": 56, "flags": 4}, + + {"matrix": [1, 5], "x": 160, "y": 16, "flags": 4}, + {"matrix": [9, 6], "x": 160, "y": 26, "flags": 4}, + {"matrix": [4, 7], "x": 160, "y": 46, "flags": 4}, + {"matrix": [5, 7], "x": 160, "y": 56, "flags": 4}, + + {"matrix": [1, 6], "x": 170, "y": 16, "flags": 4}, + {"matrix": [7, 6], "x": 170, "y": 26, "flags": 4}, + {"matrix": [5, 8], "x": 170, "y": 56, "flags": 4} + ], + "driver": "ws2812" + } +} \ No newline at end of file diff --git a/keyboards/decent/tkl/keymaps/default/keymap.c b/keyboards/decent/tkl/keymaps/default/keymap.c new file mode 100644 index 0000000000..cd842cdec3 --- /dev/null +++ b/keyboards/decent/tkl/keymaps/default/keymap.c @@ -0,0 +1,57 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * /─────/ /─────/─────/─────/─────/─────/─────/─────/─────/─────/─────/ + * /Esc / /F1 /F2 /F3 /F4 /F5 /F6 /F7 /F8 /F9 /F10 / + * /─────/ /─────/─────/─────/─────/─────/─────/─────/─────/─────/─────/ + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ + * │Ctrl│GUI │Alt │ │ Alt│ Fn │Menu│Ctrl│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ + */ + [0] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, + + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + /* + * / / /MyCmp/HomeP/Calc /Media/ ⏮ / ⏭ / ⏯ / ⏹ /Mute / / + * + * │ │💡│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │V+ │ + * │ │ │🔆│ │ │ │ │ │ │ │ │ │ │BootL│ │ │ │V- │ + * │ │ │🔅│ │ │ │ │ │ │ │ │ │ │ + * │ │ │🎨│ │ │ │ │ │ │ │ │ │ │🗘 │ + * │ │ │ │ │ │ │ │ │ │㉈ │🗘 │㉏ │ + */ + [1] = LAYOUT( + _______, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, _______, + + _______, RM_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, + _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, KC_VOLD, + _______, _______, RM_VALD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_NEXT, + _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_PREV, RM_SPDU + ), +}; + +#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(RM_VALD, RM_VALU) } +}; +#endif diff --git a/keyboards/decent/tkl/readme.md b/keyboards/decent/tkl/readme.md new file mode 100644 index 0000000000..2069268bfc --- /dev/null +++ b/keyboards/decent/tkl/readme.md @@ -0,0 +1,79 @@ +# DecenTKL + +*A TKL keyboard inspired by the language design of Atari XE and ST computers* + +* Keyboard Maintainer: [Bertrand Le roy](https://github.com/bleroy/3d-junkyard/blob/main/DecenTKL/) +* Hardware Supported: DecenTKL (Pi Pico based) +* Hardware Availability: Custom built but open-source + +Make example for this keyboard (after setting up your build environment): + + make decent/tkl:default + +Flashing example for this keyboard: + + make decent/tkl: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 + +Press the escape key or the button on the back of the Pi while connecting the keyboard. + +## Special commands + +Fn + F1: Open my computer +Fn + F2: Browser home +Fn + F3: Open calculator +Fn + F4: Open media player +Fn + F5: Previous media +Fn + F6: Next media +Fn + F7: Play media +Fn + F8: Stop media +Fn + F9: Mute +Fn + PgUp: Volume up +Fn + PgDn: Volume down +Fn + 1: Toggle RGB lighting +Fn + Up: Next RGB effect +Fn + Down: Previous RGB effect +Fn + X: Change RGB hue +Fn + S: Lower RGB brightness +Fn + W: Raise RGB brightness +Fn + Left: Lower RGB animation speed +Fn + Right: Raise RGB animation speed + +Fn + \: go into bootloader mode without unplugging the keyboard + +## Layout +```C +/* + * /─────/ /─────/─────/─────/─────/─────/─────/─────/─────/─────/─────/ + * /Esc / /F1 /F2 /F3 /F4 /F5 /F6 /F7 /F8 /F9 /F10 / + * /─────/ /─────/─────/─────/─────/─────/─────/─────/─────/─────/─────/ + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ + * │Ctrl│GUI │Alt │ │ Alt│ Fn │Menu│Ctrl│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ +*/ +``` + +When holding Fn down: + +```C +/* + * / / /MyCmp/HomeP/Calc /Media/ ⏮ / ⏭ / ⏯ / ⏹ /Mute / / + * + * │ │💡│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │V+ │ + * │ │ │🔆│ │ │ │ │ │ │ │ │ │ │BootL│ │ │ │V- │ + * │ │ │🔅│ │ │ │ │ │ │ │ │ │ │ + * │ │ │🎨│ │ │ │ │ │ │ │ │ │ │🗘 │ + * │ │ │ │ │ │ │ │ │ │㉈ │🗘 │㉏ │ +*/ +``` \ No newline at end of file diff --git a/keyboards/decent/tkl/tkl.c b/keyboards/decent/tkl/tkl.c new file mode 100644 index 0000000000..96f8a9dd5a --- /dev/null +++ b/keyboards/decent/tkl/tkl.c @@ -0,0 +1,72 @@ +// Copyright 2024 B. Le Roy +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + 0x20, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xBC, 0xBD, 0xBE, 0xBF, + 0x00 + }; + + oled_write_P(qmk_logo, false); + oled_write_pixel(126, 0, 1); + oled_write_pixel(127, 0, 1); + oled_write_pixel(126, 1, 1); +} + +static const char PROGMEM caps_on[] = { 0x9C, 0x9D, 0x9E, 0x9F }; +static const char PROGMEM caps_off[] = { 0xBC, 0xBD, 0xBE, 0xBF }; + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + + render_logo(); + + bool caps = host_keyboard_led_state().caps_lock; + + if (caps) { + oled_set_cursor(17, 3); + oled_write_P(caps ? caps_on : caps_off, false); + } + return false; +} + +bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { + if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { + return false; + } + + bool caps = host_keyboard_led_state().caps_lock; + + if (caps) { + for (uint8_t i = led_min; i < led_max; i++) { + if (g_led_config.flags[i] & LED_FLAG_KEYLIGHT) { + rgb_matrix_set_color(i, RGB_RED); + } + } + } + + if (get_highest_layer(layer_state) > 0) { + uint8_t layer = get_highest_layer(layer_state); + + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + + if (index >= led_min && index < led_max && index != NO_LED && + keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS) { + rgb_matrix_set_color(index, RGB_GREEN); + } + } + } + } + + return false; +} From e6fa351d3bb40bc5023850a55f9e47c72f40bdb5 Mon Sep 17 00:00:00 2001 From: Bertrand Le Roy Date: Mon, 23 Dec 2024 22:26:44 -0800 Subject: [PATCH 087/592] DecenTKL numpad (#24696) --- keyboards/decent/numpad/config.h | 8 + keyboards/decent/numpad/keyboard.json | 148 ++++++++++++++++++ .../decent/numpad/keymaps/default/keymap.c | 41 +++++ keyboards/decent/numpad/numpad.c | 111 +++++++++++++ keyboards/decent/numpad/readme.md | 71 +++++++++ 5 files changed, 379 insertions(+) create mode 100644 keyboards/decent/numpad/config.h create mode 100644 keyboards/decent/numpad/keyboard.json create mode 100644 keyboards/decent/numpad/keymaps/default/keymap.c create mode 100644 keyboards/decent/numpad/numpad.c create mode 100644 keyboards/decent/numpad/readme.md diff --git a/keyboards/decent/numpad/config.h b/keyboards/decent/numpad/config.h new file mode 100644 index 0000000000..f5114d3ce0 --- /dev/null +++ b/keyboards/decent/numpad/config.h @@ -0,0 +1,8 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define JOYSTICK_AXIS_COUNT 4 +#define JOYSTICK_BUTTON_COUNT 10 +#define JOYSTICK_HAS_HAT diff --git a/keyboards/decent/numpad/keyboard.json b/keyboards/decent/numpad/keyboard.json new file mode 100644 index 0000000000..eb45c72232 --- /dev/null +++ b/keyboards/decent/numpad/keyboard.json @@ -0,0 +1,148 @@ +{ + "manufacturer": "Bertrand Le roy", + "keyboard_name": "DecenTKL NumPad", + "maintainer": "bleroy", + "url": "https://github.com/bleroy/3d-junkyard/blob/main/DecenTKL/", + "tags": ["ansi", "numpad", "rgb", "atari", "joystick"], + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "rgb_matrix": true, + "extrakey": true, + "mousekey": true, + "joystick": true + }, + "matrix_pins": { + "cols": ["GP0", "GP1", "GP2", "GP3"], + "rows": ["GP4", "GP5", "GP6", "GP7", "GP8", "GP9"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "ws2812": { + "pin": "GP20", + "driver": "vendor" + }, + "bootmagic": { + "matrix": [1, 0] + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0.75, "y": 0, "label": "F11"}, + {"matrix": [0, 1], "x": 2.25, "y": 0, "label": "F12"}, + + {"matrix": [1, 0], "x": 0, "y": 1, "label": "Num"}, + {"matrix": [1, 1], "x": 1, "y": 1, "label": "/"}, + {"matrix": [1, 2], "x": 2, "y": 1, "label": "*"}, + {"matrix": [1, 3], "x": 3, "y": 1, "label": "-"}, + + {"matrix": [2, 0], "x": 0, "y": 2, "label": "7"}, + {"matrix": [2, 1], "x": 1, "y": 2, "label": "8"}, + {"matrix": [2, 2], "x": 2, "y": 2, "label": "9"}, + {"matrix": [2, 3], "x": 3, "y": 2, "h": 2, "label": "+"}, + + {"matrix": [3, 0], "x": 0, "y": 3, "label": "4"}, + {"matrix": [3, 1], "x": 1, "y": 3, "label": "5"}, + {"matrix": [3, 2], "x": 2, "y": 3, "label": "6"}, + + {"matrix": [4, 0], "x": 0, "y": 4, "label": "1"}, + {"matrix": [4, 1], "x": 1, "y": 4, "label": "2"}, + {"matrix": [4, 2], "x": 2, "y": 4, "label": "3"}, + {"matrix": [4, 3], "x": 3, "y": 4, "h": 2, "label": "Enter"}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 2, "label": "0"}, + {"matrix": [5, 2], "x": 2, "y": 5, "label": "."} + ] + } + }, + "rgb_matrix": { + "center_point": [37, 42], + "max_brightness": 125, + "sleep": true, + "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": [0, 0], "x": 56, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 169, "y": 0, "flags": 4}, + + {"matrix": [1, 0], "x": 0, "y": 20, "flags": 4}, + {"matrix": [1, 1], "x": 75, "y": 20, "flags": 4}, + {"matrix": [1, 2], "x": 150, "y": 20, "flags": 4}, + {"matrix": [1, 3], "x": 224, "y": 20, "flags": 4}, + + {"matrix": [2, 0], "x": 0, "y": 31, "flags": 4}, + {"matrix": [2, 1], "x": 75, "y": 31, "flags": 4}, + {"matrix": [2, 2], "x": 150, "y": 31, "flags": 4}, + {"x": 224, "y": 31, "flags": 2}, + + {"matrix": [3, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [3, 1], "x": 75, "y": 42, "flags": 4}, + {"matrix": [3, 2], "x": 150, "y": 42, "flags": 4}, + {"matrix": [3, 3], "x": 224, "y": 42, "flags": 4}, + + {"matrix": [4, 0], "x": 0, "y": 53, "flags": 4}, + {"matrix": [4, 1], "x": 75, "y": 53, "flags": 4}, + {"matrix": [4, 2], "x": 150, "y": 53, "flags": 4}, + {"x": 224, "y": 53, "flags": 2}, + + {"matrix": [5, 0], "x": 0, "y": 64, "flags": 4}, + {"x": 85, "y": 75, "flags": 2}, + {"matrix": [5, 2], "x": 150, "y": 64, "flags": 4}, + {"matrix": [5, 3], "x": 224, "y": 64, "flags": 4} + ], + "driver": "ws2812" + } +} diff --git a/keyboards/decent/numpad/keymaps/default/keymap.c b/keyboards/decent/numpad/keymaps/default/keymap.c new file mode 100644 index 0000000000..c450b186d9 --- /dev/null +++ b/keyboards/decent/numpad/keymaps/default/keymap.c @@ -0,0 +1,41 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * /─────/─────/ + * /F11 /F12 / + * /─────/─────/ + * ┌───┬───┬───┬───┐ + * │Num│ / │ * │ - │ + * ├───┼───┼───┼───┤ + * │ 7 │ 8 │ 9 │ + │ + * ├───┼───┼───┤ │ + * │ 4 │ 5 │ 6 │ │ + * ├───┼───┼───┼───┤ + * │ 1 │ 2 │ 3 │Ent│ + * ├───┴───┼───┤ er│ + * │ 0 │ . │ │ + * └───────┴───┴───┘ + */ + [0] = LAYOUT( + KC_F11, KC_F12, + + MO(1), KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, + KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, + KC_KP_0, KC_KP_DOT + ), + [1] = LAYOUT( + S(KC_F11), S(KC_F12), + + _______, _______, _______, RM_VALD, + _______, RM_HUEU, _______, RM_VALU, + RM_SPDD, _______, RM_SPDU, + RM_PREV, RM_HUED, RM_NEXT, QK_BOOT, + RM_TOGG, _______ + ), +}; diff --git a/keyboards/decent/numpad/numpad.c b/keyboards/decent/numpad/numpad.c new file mode 100644 index 0000000000..5a8b032746 --- /dev/null +++ b/keyboards/decent/numpad/numpad.c @@ -0,0 +1,111 @@ +// Copyright 2024 B. Le Roy +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" +#include "analog.h" + +joystick_config_t joystick_axes[JOYSTICK_AXIS_COUNT] = { + [0] = JOYSTICK_AXIS_VIRTUAL, + [1] = JOYSTICK_AXIS_VIRTUAL, + [2] = JOYSTICK_AXIS_VIRTUAL, + [3] = JOYSTICK_AXIS_VIRTUAL +}; + +void keyboard_post_init_kb(void) { + gpio_set_pin_input_high(GP10); // Up1 + gpio_set_pin_input_high(GP11); // Down1 + gpio_set_pin_input_high(GP12); // Left1 + gpio_set_pin_input_high(GP13); // Right1 + gpio_set_pin_input_high(GP14); // Fire1 + gpio_set_pin_input_high(GP15); + gpio_set_pin_input_high(GP16); + gpio_set_pin_input_high(GP17); + gpio_set_pin_input_high(GP18); + gpio_set_pin_input_high(GP19); + + keyboard_post_init_user(); +} + +void set_button_state(int btn, bool state) { + if (state) { + unregister_joystick_button(btn); + } + else { + register_joystick_button(btn); + } +} + +void housekeeping_task_kb(void) { + set_button_state(0, gpio_read_pin(GP16)); + set_button_state(1, gpio_read_pin(GP18)); + set_button_state(2, gpio_read_pin(GP17)); + set_button_state(3, gpio_read_pin(GP15)); + set_button_state(4, gpio_read_pin(GP14)); + set_button_state(5, gpio_read_pin(GP19)); + bool up = !gpio_read_pin(10); + bool down = !gpio_read_pin(11); + bool left = !gpio_read_pin(12); + bool right = !gpio_read_pin(13); + if (up) { + if (left) { + joystick_set_hat(7); + } + else if (right) { + joystick_set_hat(1); + } + else { + joystick_set_hat(0); + } + } + else if (down) { + if (left) { + joystick_set_hat(5); + } + else if (right) { + joystick_set_hat(3); + } + else { + joystick_set_hat(4); + } + } + else if (left) { + joystick_set_hat(6); + } + else if (right) { + joystick_set_hat(2); + } + else { + joystick_set_hat(-1); + } + int16_t analog = analogReadPin(GP26); + joystick_set_axis(0, analog); + analog = analogReadPin(GP27); + joystick_set_axis(1, analog); + analog = analogReadPin(GP28); + joystick_set_axis(2, analog); + analog = analogReadPin(GP29); + joystick_set_axis(3, analog); +} + +bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { + if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { + return false; + } + + if (get_highest_layer(layer_state) > 0) { + uint8_t layer = get_highest_layer(layer_state); + + for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { + for (uint8_t col = 0; col < MATRIX_COLS; ++col) { + uint8_t index = g_led_config.matrix_co[row][col]; + + if (index >= led_min && index < led_max && index != NO_LED && + keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS) { + rgb_matrix_set_color(index, RGB_GREEN); + } + } + } + } + + return false; +} diff --git a/keyboards/decent/numpad/readme.md b/keyboards/decent/numpad/readme.md new file mode 100644 index 0000000000..83436bf8c0 --- /dev/null +++ b/keyboards/decent/numpad/readme.md @@ -0,0 +1,71 @@ +# DecenTKL NumPad + +*A numeric pad to go with the DecenTKL keyboard* + +This numeric pad also includes a 3-port USB hub, enabling the connection of the TKL +keyboard on the back of the pad. + +The pad also has two Atari joystick ports. + +* Keyboard Maintainer: [Bertrand Le roy](https://github.com/bleroy/3d-junkyard/blob/main/DecenTKL/) +* Hardware Supported: DecenTKL (RP2040-based) +* Hardware Availability: Custom built but open-source + +Make example for this keyboard (after setting up your build environment): + + make decent/numpad:default + +Flashing example for this keyboard: + + make decent/numpad: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 + +Press the Num key or the button on the back of the board while connecting the pad. + +## Special commands + +Num + Enter: go into bootloader mode without unplugging the keyboard + +## Layout +```C +/* + * /─────/─────/ + * /F11 /F12 / + * /─────/─────/ + * ┌───┬───┬───┬───┐ + * │Num│ / │ * │ - │ + * ├───┼───┼───┼───┤ + * │ 7 │ 8 │ 9 │ + │ + * ├───┼───┼───┤ │ + * │ 4 │ 5 │ 6 │ │ + * ├───┼───┼───┼───┤ + * │ 1 │ 2 │ 3 │Ent│ + * ├───┴───┼───┤ er│ + * │ 0 │ . │ │ + * └───────┴───┴───┘ + */ +``` + +While holding the Num key: + +```C +/* + * /─────────/─────────/ + * /Shift+F11/Shift+F12/ + * /─────────/─────────/ + * ┌───────┬───────┬───────┬───────┐ + * │ │ │ │Bright-│ + * ├───────┼───────┼───────┼───────┤ + * │ │ Hue + │ │Bright+│ + * ├───────┼───────┼───────┤ │ + * │Speed -│ Swirl │Speed +│ │ + * ├───────┼───────┼───────┼───────┤ + * │Mode - │ Hue - │Mode + │ │ + * ├───────┴───────┼───────┤BootSel│ + * │ on / off │ │ │ + * └───────────────┴───────┴───────┘ + */ +``` From 18f0d11737d0a327255cca52a07ed81116b70920 Mon Sep 17 00:00:00 2001 From: era <73109780+eerraa@users.noreply.github.com> Date: Tue, 24 Dec 2024 16:12:54 +0900 Subject: [PATCH 088/592] [Keyboard] Add SIRIND Brick65S (#24315) Co-authored-by: Joel Challis --- keyboards/era/sirind/brick65s/brick65s.c | 24 ++ keyboards/era/sirind/brick65s/config.h | 8 + keyboards/era/sirind/brick65s/keyboard.json | 251 ++++++++++++++++++ .../sirind/brick65s/keymaps/default/keymap.c | 21 ++ keyboards/era/sirind/brick65s/readme.md | 23 ++ 5 files changed, 327 insertions(+) create mode 100644 keyboards/era/sirind/brick65s/brick65s.c create mode 100644 keyboards/era/sirind/brick65s/config.h create mode 100644 keyboards/era/sirind/brick65s/keyboard.json create mode 100644 keyboards/era/sirind/brick65s/keymaps/default/keymap.c create mode 100644 keyboards/era/sirind/brick65s/readme.md diff --git a/keyboards/era/sirind/brick65s/brick65s.c b/keyboards/era/sirind/brick65s/brick65s.c new file mode 100644 index 0000000000..ae76a3968c --- /dev/null +++ b/keyboards/era/sirind/brick65s/brick65s.c @@ -0,0 +1,24 @@ +// Copyright 2024 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +bool rgb_matrix_indicators_kb(void) { + if (!rgb_matrix_indicators_user()) { + return false; + } + + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color(0, 200, 0, 0); + } else { + rgb_matrix_set_color(0, 0, 0, 0); + } + + if (host_keyboard_led_state().scroll_lock) { + rgb_matrix_set_color(1, 200, 0, 0); + } else { + rgb_matrix_set_color(1, 0, 0, 0); + } + + return true; +} \ No newline at end of file diff --git a/keyboards/era/sirind/brick65s/config.h b/keyboards/era/sirind/brick65s/config.h new file mode 100644 index 0000000000..6bcd581290 --- /dev/null +++ b/keyboards/era/sirind/brick65s/config.h @@ -0,0 +1,8 @@ +// Copyright 2024 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Reset */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/era/sirind/brick65s/keyboard.json b/keyboards/era/sirind/brick65s/keyboard.json new file mode 100644 index 0000000000..5d6768a93c --- /dev/null +++ b/keyboards/era/sirind/brick65s/keyboard.json @@ -0,0 +1,251 @@ +{ + "manufacturer": "SIRIND", + "keyboard_name": "Brick65S", + "maintainer": "eerraa", + "bootloader": "rp2040", + "build": { + "debounce_type": "sym_defer_pk" + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP28", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP14", "GP0", "GP13", "GP12"], + "rows": ["GP27", "GP29", "GP23", "GP24", "GP25"] + }, + "processor": "RP2040", + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 8}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 8} + ], + "sleep": true + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0012", + "vid": "0x4552" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP26" + }, + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15.25, "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, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [1, 15], "x": 15.25, "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, 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, 14], "x": 14.25, "y": 3.25}, + {"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": 4, "y": 4.25, "w": 6.25}, + {"matrix": [4, 11], "x": 10.5, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 11.75, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25}, + {"matrix": [4, 14], "x": 14.25, "y": 4.25}, + {"matrix": [4, 15], "x": 15.25, "y": 4.25} + ] + }, + "LAYOUT_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, 14], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 15], "x": 15.25, "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, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [1, 15], "x": 15.25, "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, 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, 14], "x": 14.25, "y": 3.25}, + {"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": 4, "y": 4.25, "w": 6.25}, + {"matrix": [4, 11], "x": 10.5, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 11.75, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25}, + {"matrix": [4, 14], "x": 14.25, "y": 4.25}, + {"matrix": [4, 15], "x": 15.25, "y": 4.25} + ] + }, + "LAYOUT_ansi_split_bs": { + "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": [0, 15], "x": 15.25, "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, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [1, 15], "x": 15.25, "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, 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, 14], "x": 14.25, "y": 3.25}, + {"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": 4, "y": 4.25, "w": 6.25}, + {"matrix": [4, 11], "x": 10.5, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 11.75, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.25, "y": 4.25}, + {"matrix": [4, 14], "x": 14.25, "y": 4.25}, + {"matrix": [4, 15], "x": 15.25, "y": 4.25} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/era/sirind/brick65s/keymaps/default/keymap.c b/keyboards/era/sirind/brick65s/keymaps/default/keymap.c new file mode 100644 index 0000000000..3798c980db --- /dev/null +++ b/keyboards/era/sirind/brick65s/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// Copyright 2023 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [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_BSLS, KC_BSPC, KC_INS, + 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_DEL, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_all( + KC_TILD, 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_TRNS, KC_TRNS, KC_PGUP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_TRNS, KC_PGDN, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLU, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/era/sirind/brick65s/readme.md b/keyboards/era/sirind/brick65s/readme.md new file mode 100644 index 0000000000..e173ba4e73 --- /dev/null +++ b/keyboards/era/sirind/brick65s/readme.md @@ -0,0 +1,23 @@ +# Brick65S, Solder ver + +* Keyboard Maintainer: [ERA](https://github.com/eerraa) +* Hardware supported: SIRIND Brick65 +* Hardware availability: [Syryan](https://srind.mysoho.com/) + +Make example for this keyboard (after setting up your build environment): + + make era/sirind/brick65s:default + +Flashing example for this keyboard: + + make era/sirind/brick65s: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 ESC(0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly short the `RESET` and `GND` pads on the SWD header twice, or short the `BOOT` header and plug in keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 0b5e7052f91c1216a4122339337182c96da8f3f6 Mon Sep 17 00:00:00 2001 From: dztech Date: Tue, 24 Dec 2024 15:13:41 +0800 Subject: [PATCH 089/592] add mellow keyboard (#24319) Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/dztech/mellow/keyboard.json | 298 ++++++++++++++++++ keyboards/dztech/mellow/keymaps/ansi/keymap.c | 39 +++ .../dztech/mellow/keymaps/default/keymap.c | 39 +++ keyboards/dztech/mellow/keymaps/hhkb/keymap.c | 60 ++++ keyboards/dztech/mellow/keymaps/iso/keymap.c | 39 +++ keyboards/dztech/mellow/readme.md | 25 ++ 6 files changed, 500 insertions(+) create mode 100644 keyboards/dztech/mellow/keyboard.json create mode 100644 keyboards/dztech/mellow/keymaps/ansi/keymap.c create mode 100644 keyboards/dztech/mellow/keymaps/default/keymap.c create mode 100644 keyboards/dztech/mellow/keymaps/hhkb/keymap.c create mode 100644 keyboards/dztech/mellow/keymaps/iso/keymap.c create mode 100644 keyboards/dztech/mellow/readme.md diff --git a/keyboards/dztech/mellow/keyboard.json b/keyboards/dztech/mellow/keyboard.json new file mode 100644 index 0000000000..24cd11028c --- /dev/null +++ b/keyboards/dztech/mellow/keyboard.json @@ -0,0 +1,298 @@ +{ + "manufacturer": "dztech", + "keyboard_name": "mellow", + "maintainer": "moyi4681", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "GP25" + }, + "matrix_pins": { + "cols": ["GP29", "GP28", "GP27", "GP26", "GP0", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5"], + "rows": ["GP1", "GP2", "GP3", "GP4", "GP24"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0007", + "vid": "0x445A" + }, + "community_layouts": [ + "60_ansi", + "60_hhkb", + "60_iso" + ], + "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], "w": 2, "x": 13, "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": [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": [3, 0], "w": 2.25, "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], "w": 2.75, "x": 12.25, "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, 7], "w": 6.25, "x": 3.75, "y": 4 }, + { "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 }, + { "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 }, + { "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 }, + { "matrix": [4, 13], "w": 1.25, "x": 13.75, "y": 4 } + ] + }, + "LAYOUT_60_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": [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": [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": [1, 13], "x": 12.75, "y": 2 }, + { "h": 2, "matrix": [2, 13], "w": 1.25, "x": 13.75, "y": 1 }, + { "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": 2.75, "x": 12.25, "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, 7], "w": 6.25, "x": 3.75, "y": 4 }, + { "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 }, + { "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 }, + { "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 }, + { "matrix": [4, 13], "w": 1.25, "x": 13.75, "y": 4 } + ] + }, + "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": [2, 12], "x": 14, "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": [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": [3, 0], "w": 2.25, "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], "w": 1.75, "x": 12.25, "y": 3 }, + { "matrix": [3, 13], "x": 14, "y": 3 }, + { "matrix": [4, 1], "x": 1.5, "y": 4 }, + { "matrix": [4, 2], "w": 1.5, "x": 2.5, "y": 4 }, + { "matrix": [4, 7], "w": 7, "x": 4, "y": 4 }, + { "matrix": [4, 10], "w": 1.5, "x": 11, "y": 4 }, + { "matrix": [4, 11], "x": 12.5, "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": [2, 12], "x": 14, "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": [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": [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": [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, 7], "w": 6.25, "x": 3.75, "y": 4 }, + { "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 }, + { "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 }, + { "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 }, + { "matrix": [4, 13], "w": 1.25, "x": 13.75, "y": 4 } + ] + } + } +} diff --git a/keyboards/dztech/mellow/keymaps/ansi/keymap.c b/keyboards/dztech/mellow/keymaps/ansi/keymap.c new file mode 100644 index 0000000000..867dda96db --- /dev/null +++ b/keyboards/dztech/mellow/keymaps/ansi/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2024 DZTECH + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + [0] = LAYOUT_60_ansi( + 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_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, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ) +}; diff --git a/keyboards/dztech/mellow/keymaps/default/keymap.c b/keyboards/dztech/mellow/keymaps/default/keymap.c new file mode 100644 index 0000000000..a2f0f15665 --- /dev/null +++ b/keyboards/dztech/mellow/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2024 DZTECH + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│MO1│ + * ├────┼───┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘ + * │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + [0] = LAYOUT_all( + 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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, _______, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ) +}; diff --git a/keyboards/dztech/mellow/keymaps/hhkb/keymap.c b/keyboards/dztech/mellow/keymaps/hhkb/keymap.c new file mode 100644 index 0000000000..3dfa568b18 --- /dev/null +++ b/keyboards/dztech/mellow/keymaps/hhkb/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2024 DZTECH + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ Bspc│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│MO1│ + * └─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘ + * │Alt│ GUI │ │ GUI │Alt│ + * └───┴─────┴───────────────────────────┴─────┴───┘ + */ + [0] = LAYOUT_60_hhkb( + 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_BSLS, KC_GRV, + 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_BSPC, + 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_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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT + ), + + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Pwr│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Ins│Del│ + * ├───┴─┬─┴───┴───┴───┴───┴───┴───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴───┘ + * │Caps │ Q │ W │ E │ R │ T │ Y │ U │PSc│Scr│Pse│ ↑ │ ] │ Bspc│ + * └─────┘┌───┬───┬───┐──┴┬──┴┌───┬──┴┬──┴┬──┴┬──┴┬──┴┬────────┐ + * │ Ctrl │Vl-│Vl+│Mut│ F │ G │ * │ / │Hom│PgU│ ← │ → │ Enter │ + * ├──────└───┴───┴───┘─┬─┴─┬─└─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┘ + * │ Shift │ Z │ X │ C │ V │ B │ + │ - │End│PgD│ ↓ │ Shift│MO1│ + * └─────┬──┴┬──┴──┬┴───┴───┴───└───┴───┴───┴───┴───┘┬───┬─┴───┘ + * │Alt│ GUI │ │ GUI │Alt│ + * └───┴─────┴───────────────────────────┴─────┴───┘ + */ + [1] = LAYOUT_60_hhkb( + KC_PWR, 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, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/dztech/mellow/keymaps/iso/keymap.c b/keyboards/dztech/mellow/keymaps/iso/keymap.c new file mode 100644 index 0000000000..45b9b27465 --- /dev/null +++ b/keyboards/dztech/mellow/keymaps/iso/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2024 DZTECH + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + [0] = LAYOUT_60_iso( + 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_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_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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ) +}; diff --git a/keyboards/dztech/mellow/readme.md b/keyboards/dztech/mellow/readme.md new file mode 100644 index 0000000000..e8dfa6a26c --- /dev/null +++ b/keyboards/dztech/mellow/readme.md @@ -0,0 +1,25 @@ +# dztech/mellow + +A customizable 60% keyboard. + +* Keyboard Maintainer: [dztech](https://github.com/moyi4681) +* Hardware Supported: mellow +* Hardware Availability: [KBDfans](https://kbdfans.com/) + +Make example for this keyboard (after setting up your build environment): + + make dztech/mellow:default + +Flashing example for this keyboard: + + make dztech/mellow: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 276f84a9a804ce4980f81dc2527c32d00575628f Mon Sep 17 00:00:00 2001 From: chalex <68408520+gaclee3b@users.noreply.github.com> Date: Tue, 24 Dec 2024 02:22:22 -0500 Subject: [PATCH 090/592] add chlx piche (#24252) Co-authored-by: Joel Challis Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: chalex --- keyboards/chlx/piche60/keyboard.json | 128 ++++++++++++++++++ .../chlx/piche60/keymaps/default/keymap.c | 34 +++++ keyboards/chlx/piche60/readme.md | 31 +++++ 3 files changed, 193 insertions(+) create mode 100644 keyboards/chlx/piche60/keyboard.json create mode 100644 keyboards/chlx/piche60/keymaps/default/keymap.c create mode 100644 keyboards/chlx/piche60/readme.md diff --git a/keyboards/chlx/piche60/keyboard.json b/keyboards/chlx/piche60/keyboard.json new file mode 100644 index 0000000000..7eafe4f84f --- /dev/null +++ b/keyboards/chlx/piche60/keyboard.json @@ -0,0 +1,128 @@ +{ + "manufacturer": "chlx bsmt", + "keyboard_name": "piche60", + "maintainer": "gaclee4b", + "bootloader": "atmel-dfu", + "bootmagic": { + "matrix": [1, 1] + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "indicators": { + "caps_lock": "C7", + "compose": "B5", + "num_lock": "B6", + "scroll_lock": "C6", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["D0", "F5", "F7", "E6", "F0", "D4", "D5", "D7", "D3", "D2", "D1", "B7", "B3", "B2", "B1", "B0"], + "rows": ["F4", "F1", "F6", "D6", "B4"] + }, + "processor": "atmega32u4", + "url": "www.github.com/gaclee3b", + "usb": { + "device_version": "1.1.0", + "pid": "0x0611", + "vid": "0x4358" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [1, 1], "x": 0.5, "y": 0}, + + {"matrix": [0, 1], "x": 1.75, "y": 0.25}, + {"matrix": [0, 2], "x": 2.75, "y": 0.25}, + {"matrix": [0, 3], "x": 3.75, "y": 0}, + {"matrix": [0, 4], "x": 4.75, "y": 0.25}, + {"matrix": [0, 5], "x": 5.75, "y": 0.25}, + {"matrix": [0, 6], "x": 6.75, "y": 0.25}, + {"matrix": [0, 7], "x": 7.75, "y": 0.25}, + + {"matrix": [0, 8], "x": 11, "y": 0.25}, + {"matrix": [0, 9], "x": 12, "y": 0.25}, + {"matrix": [0, 10], "x": 13, "y": 0.25}, + {"matrix": [0, 11], "x": 14, "y": 0.25}, + {"matrix": [0, 12], "x": 15, "y": 0}, + {"matrix": [0, 13], "x": 16, "y": 0.25}, + {"matrix": [0, 14], "x": 17, "y": 0.25}, + {"matrix": [0, 15], "x": 18, "y": 0.25}, + + {"matrix": [2, 1], "x": 0.25, "y": 1}, + + {"matrix": [1, 2], "x": 1.5, "y": 1.25, "w": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4.25, "y": 1.25}, + {"matrix": [1, 5], "x": 5.25, "y": 1.25}, + {"matrix": [1, 6], "x": 6.25, "y": 1.25}, + {"matrix": [1, 7], "x": 7.25, "y": 1.25}, + + {"matrix": [1, 8], "x": 10.5, "y": 1.25}, + {"matrix": [1, 9], "x": 11.5, "y": 1.25}, + {"matrix": [1, 10], "x": 12.5, "y": 1.25}, + {"matrix": [1, 11], "x": 13.5, "y": 1.25}, + {"matrix": [1, 12], "x": 14.75, "y": 1.25}, + {"matrix": [1, 13], "x": 15.75, "y": 1.25}, + {"matrix": [1, 14], "x": 16.75, "y": 1.25}, + {"matrix": [1, 15], "x": 17.75, "y": 1.25, "w": 1.5}, + + {"matrix": [3, 1], "x": 0, "y": 2}, + + {"matrix": [2, 2], "x": 1.5, "y": 2.25, "w": 1.75}, + {"matrix": [2, 3], "x": 3.25, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + + {"matrix": [2, 8], "x": 10.75, "y": 2.25}, + {"matrix": [2, 9], "x": 11.75, "y": 2.25}, + {"matrix": [2, 10], "x": 12.75, "y": 2.25}, + {"matrix": [2, 11], "x": 13.75, "y": 2.25}, + {"matrix": [2, 12], "x": 15.25, "y": 2.25}, + {"matrix": [2, 13], "x": 16.25, "y": 2.25}, + {"matrix": [2, 14], "x": 17.25, "y": 2.25, "w": 2.25}, + + {"matrix": [3, 2], "x": 1.5, "y": 3.25, "w": 2.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 5, "y": 3.25}, + {"matrix": [3, 5], "x": 6, "y": 3.25}, + {"matrix": [3, 6], "x": 7, "y": 3.25}, + {"matrix": [3, 7], "x": 8, "y": 3.25}, + + {"matrix": [3, 8], "x": 10.25, "y": 3.25}, + {"matrix": [3, 9], "x": 11.25, "y": 3.25}, + {"matrix": [3, 10], "x": 12.25, "y": 3.25}, + {"matrix": [3, 11], "x": 13.25, "y": 3.25}, + {"matrix": [3, 12], "x": 15, "y": 3.25}, + {"matrix": [3, 13], "x": 16, "y": 3.25}, + {"matrix": [3, 14], "x": 17, "y": 3.25, "w": 1.75}, + {"matrix": [3, 15], "x": 18.75, "y": 3.25}, + + {"matrix": [4, 2], "x": 1.5, "y": 4.25, "w": 1.5}, + {"matrix": [4, 3], "x": 3, "y": 4.25, "w": 1.25}, + {"matrix": [4, 4], "x": 5, "y": 4.25, "w": 1.5}, + {"matrix": [4, 6], "x": 6.5, "y": 4.25, "w": 2}, + {"matrix": [4, 7], "x": 8.5, "y": 4.25}, + {"matrix": [4, 9], "x": 10.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 11], "x": 13, "y": 4.25, "w": 1.5}, + {"matrix": [4, 13], "x": 15.5, "y": 4.25, "w": 1.25}, + {"matrix": [4, 14], "x": 16.75, "y": 4.25, "w": 1.25}, + {"matrix": [4, 15], "x": 18, "y": 4.25, "w": 1.5} + ] + } + } +} diff --git a/keyboards/chlx/piche60/keymaps/default/keymap.c b/keyboards/chlx/piche60/keymaps/default/keymap.c new file mode 100644 index 0000000000..dfd3426a90 --- /dev/null +++ b/keyboards/chlx/piche60/keymaps/default/keymap.c @@ -0,0 +1,34 @@ +/* +Copyright 2024 Alexander Lee + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + KC_ESC, 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_DEL, KC_BSPC, + KC_PGUP, 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_PGDN, 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_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL), + [1] = LAYOUT( + KC_TRNS, KC_TRNS, 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_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_END, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; diff --git a/keyboards/chlx/piche60/readme.md b/keyboards/chlx/piche60/readme.md new file mode 100644 index 0000000000..de659b0ff7 --- /dev/null +++ b/keyboards/chlx/piche60/readme.md @@ -0,0 +1,31 @@ +# piche60 + +![piche60 PCB](https://i.imgur.com/CBeJSUy.jpeg) + +- 60% alice format keyboard pcb with USB-C and unified daughterboard compatibility. +- Layout adds 3 additional keys in the palm area voids of traditional alice format. +- USB-C can be snapped off and converted into an ai03 C3 compatible daughterboard. +- Left and right halves can be snapped off and connected through 14-pin JST-SH interfaces. +- PCB can be manufactured with top-side USB-C for compatibility with legacy alice PCBs. + +Keyboard Maintainer: [Alexander Lee](https://github.com/gaclee3b) +Hardware Supported: chlx PCB piche60.x.x.x; top-side USB version compatible with most keyboard cases using legacy alice format PCBs (i.e. lubrigante) +Hardware Availability: sales are typically done in-stock as bulk listings on reddit's mechanical keyboard market (r/mechmarket) + +Make example for this keyboard (after setting up your build environment): + + make chlx/piche60:default + +Flashing example for this keyboard: + + make chlx/piche60: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 bootloader mode by any of the following options - +- When unplugged, holding the top-left key (typically ESC) while plugging in the keyboard +- When already plugged in, pressing and releasing the reset button on the pcb bottom behind the CAPSLOCK / A-key region +- When already plugged in, shorting out the two reset metal contacts near the 'z' key (accessible through the switch LED slot) + From 38eb643a82070ebb7f730eca5c840503d5c3c92a Mon Sep 17 00:00:00 2001 From: j-hap <50018017+j-hap@users.noreply.github.com> Date: Tue, 24 Dec 2024 08:23:51 +0100 Subject: [PATCH 091/592] Add keymap-extras for EurKEY layout (#24241) Co-authored-by: Ryan Co-authored-by: Stefan Kerkmann --- .../extras/keycodes_eurkey_0.0.1.hjson | 596 ++++++++++++++++++ docs/reference_keymap_extras.md | 1 + quantum/keymap_extras/keymap_eurkey.h | 166 +++++ 3 files changed, 763 insertions(+) create mode 100644 data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson create mode 100644 quantum/keymap_extras/keymap_eurkey.h diff --git a/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson new file mode 100644 index 0000000000..9ff217cff2 --- /dev/null +++ b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson @@ -0,0 +1,596 @@ +{ + "aliases": { +/* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + "KC_GRV": { + "key": "EU_GRV", + "label": "`", + } + "KC_1": { + "key": "EU_1", + "label": "1", + } + "KC_2": { + "key": "EU_2", + "label": "2", + } + "KC_3": { + "key": "EU_3", + "label": "3", + } + "KC_4": { + "key": "EU_4", + "label": "4", + } + "KC_5": { + "key": "EU_5", + "label": "5", + } + "KC_6": { + "key": "EU_6", + "label": "6", + } + "KC_7": { + "key": "EU_7", + "label": "7", + } + "KC_8": { + "key": "EU_8", + "label": "8", + } + "KC_9": { + "key": "EU_9", + "label": "9", + } + "KC_0": { + "key": "EU_0", + "label": "0", + } + "KC_MINS": { + "key": "EU_MINS", + "label": "-", + } + "KC_EQL": { + "key": "EU_EQL", + "label": "=", + } + "KC_Q": { + "key": "EU_Q", + "label": "Q", + } + "KC_W": { + "key": "EU_W", + "label": "W", + } + "KC_E": { + "key": "EU_E", + "label": "E", + } + "KC_R": { + "key": "EU_R", + "label": "R", + } + "KC_T": { + "key": "EU_T", + "label": "T", + } + "KC_Y": { + "key": "EU_Y", + "label": "Y", + } + "KC_U": { + "key": "EU_U", + "label": "U", + } + "KC_I": { + "key": "EU_I", + "label": "I", + } + "KC_O": { + "key": "EU_O", + "label": "O", + } + "KC_P": { + "key": "EU_P", + "label": "P", + } + "KC_LBRC": { + "key": "EU_LBRC", + "label": "[", + } + "KC_RBRC": { + "key": "EU_RBRC", + "label": "]", + } + "KC_BSLS": { + "key": "EU_BSLS", + "label": "\\", + } + "KC_A": { + "key": "EU_A", + "label": "A", + } + "KC_S": { + "key": "EU_S", + "label": "S", + } + "KC_D": { + "key": "EU_D", + "label": "D", + } + "KC_F": { + "key": "EU_F", + "label": "F", + } + "KC_G": { + "key": "EU_G", + "label": "G", + } + "KC_H": { + "key": "EU_H", + "label": "H", + } + "KC_J": { + "key": "EU_J", + "label": "J", + } + "KC_K": { + "key": "EU_K", + "label": "K", + } + "KC_L": { + "key": "EU_L", + "label": "L", + } + "KC_SCLN": { + "key": "EU_SCLN", + "label": ";", + } + "KC_QUOT": { + "key": "EU_QUOT", + "label": "'", + } + "KC_Z": { + "key": "EU_Z", + "label": "Z", + } + "KC_X": { + "key": "EU_X", + "label": "X", + } + "KC_C": { + "key": "EU_C", + "label": "C", + } + "KC_V": { + "key": "EU_V", + "label": "V", + } + "KC_B": { + "key": "EU_B", + "label": "B", + } + "KC_N": { + "key": "EU_N", + "label": "N", + } + "KC_M": { + "key": "EU_M", + "label": "M", + } + "KC_COMM": { + "key": "EU_COMM", + "label": ",", + } + "KC_DOT": { + "key": "EU_DOT", + "label": ".", + } + "KC_SLSH": { + "key": "EU_SLSH", + "label": "/", + } +/* Shifted symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ │ │ │ │ │ │ │ │ │ │ : │ " │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + "S(EU_GRV)": { + "key": "EU_TILD", + "label": "~", + } + "S(EU_1)": { + "key": "EU_EXLM", + "label": "!", + } + "S(EU_2)": { + "key": "EU_AT", + "label": "@", + } + "S(EU_3)": { + "key": "EU_HASH", + "label": "#", + } + "S(EU_4)": { + "key": "EU_DLR", + "label": "$", + } + "S(EU_5)": { + "key": "EU_PERC", + "label": "%", + } + "S(EU_6)": { + "key": "EU_CIRC", + "label": "^", + } + "S(EU_7)": { + "key": "EU_AMPR", + "label": "&", + } + "S(EU_8)": { + "key": "EU_ASTR", + "label": "*", + } + "S(EU_9)": { + "key": "EU_LPRN", + "label": "(", + } + "S(EU_0)": { + "key": "EU_RPRN", + "label": ")", + } + "S(EU_MINS)": { + "key": "EU_UNDS", + "label": "_", + } + "S(EU_EQL)": { + "key": "EU_PLUS", + "label": "+", + } + "S(EU_LBRC)": { + "key": "EU_LCBR", + "label": "{", + } + "S(EU_RBRC)": { + "key": "EU_RCBR", + "label": "}", + } + "S(EU_BSLS)": { + "key": "EU_PIPE", + "label": "|", + } + "S(EU_SCLN)": { + "key": "EU_COLN", + "label": ":", + } + "S(EU_QUOT)": { + "key": "EU_DQUO", + "label": "\"", + } + "S(EU_COMM)": { + "key": "EU_LABK", + "label": "<", + } + "S(EU_DOT)": { + "key": "EU_RABK", + "label": ">", + } + "S(EU_SLSH)": { + "key": "EU_QUES", + "label": "?", + } +/* AltGr symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ` │ ¡ │ ª │ º │ £ │ € │ ^ │ ˚ │ „ │ “ │ ” │ – │ × │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ æ │ å │ ë │ ý │ þ │ ÿ │ ü │ ï │ ö │ œ │ « │ » │ ¬ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ │ ä │ ß │ ð │ è │ é │ ù │ ú │ ij │ ø │ ° │ ´ │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ │ à │ á │ ç │ ì │ í │ ñ │ μ │ ò │ ó │ ¿ │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + "ALGR(EU_GRV)": { + "key": "EU_DGRV", + "label": "` (dead)", + } + "ALGR(EU_1)": { + "key": "EU_IEXL", + "label": "¡", + } + "ALGR(EU_2)": { + "key": "EU_FORD", + "label": "ª", + } + "ALGR(EU_3)": { + "key": "EU_MORD", + "label": "º", + } + "ALGR(EU_4)": { + "key": "EU_PND", + "label": "£", + } + "ALGR(EU_5)": { + "key": "EU_EURO", + "label": "€", + } + "ALGR(EU_6)": { + "key": "EU_DCIR", + "label": "^ (dead)", + } + "ALGR(EU_7)": { + "key": "EU_RNGA", + "label": "˚ (dead)", + } + "ALGR(EU_8)": { + "key": "EU_DLQU", + "label": "„", + } + "ALGR(EU_9)": { + "key": "EU_LDQU", + "label": "“", + } + "ALGR(EU_0)": { + "key": "EU_RDQU", + "label": "”", + } + "ALGR(EU_MINS)": { + "key": "EU_NDSH", + "label": "–", + } + "ALGR(EU_EQL)": { + "key": "EU_MUL", + "label": "×", + } + "ALGR(EU_Q)": { + "key": "EU_AE", + "label": "æ", + } + "ALGR(EU_W)": { + "key": "EU_ARNG", + "label": "Å", + } + "ALGR(EU_E)": { + "key": "EU_EDIA", + "label": "Ë", + } + "ALGR(EU_R)": { + "key": "EU_YACU", + "label": "Ý", + } + "ALGR(EU_T)": { + "key": "EU_THRN", + "label": "Þ", + } + "ALGR(EU_Y)": { + "key": "EU_YDIA", + "label": "Ÿ", + } + "ALGR(EU_U)": { + "key": "EU_UDIA", + "label": "Ü", + } + "ALGR(EU_I)": { + "key": "EU_IDIA", + "label": "Ï", + } + "ALGR(EU_O)": { + "key": "EU_ODIA", + "label": "Ö", + } + "ALGR(EU_P)": { + "key": "EU_OE", + "label": "Œ", + } + "ALGR(EU_LBRC)": { + "key": "EU_LDAQ", + "label": "«", + } + "ALGR(EU_RBRC)": { + "key": "EU_RDAQ", + "label": "»", + } + "ALGR(EU_BSLS)": { + "key": "EU_NOT", + "label": "¬", + } + "ALGR(EU_A)": { + "key": "EU_ADIA", + "label": "Ä", + } + "ALGR(EU_S)": { + "key": "EU_SS", + "label": "ß", + } + "ALGR(EU_D)": { + "key": "EU_ETH", + "label": "Ð", + } + "ALGR(EU_F)": { + "key": "EU_EGRV", + "label": "È", + } + "ALGR(EU_G)": { + "key": "EU_EACU", + "label": "É", + } + "ALGR(EU_H)": { + "key": "EU_UGRV", + "label": "Ù", + } + "ALGR(EU_J)": { + "key": "EU_UACU", + "label": "Ú", + } + "ALGR(EU_K)": { + "key": "EU_IJ", + "label": "IJ", + } + "ALGR(EU_L)": { + "key": "EU_OSTR", + "label": "Ø", + } + "ALGR(EU_SCLN)": { + "key": "EU_DEG", + "label": "°", + } + "ALGR(EU_QUOT)": { + "key": "EU_ACUT", + "label": "´ (dead)", + } + "ALGR(EU_Z)": { + "key": "EU_AGRV", + "label": "À", + } + "ALGR(EU_X)": { + "key": "EU_AACU", + "label": "Á", + } + "ALGR(EU_C)": { + "key": "EU_CCED", + "label": "Ç", + } + "ALGR(EU_V)": { + "key": "EU_IGRV", + "label": "Ì", + } + "ALGR(EU_B)": { + "key": "EU_IACU", + "label": "Í", + } + "ALGR(EU_N)": { + "key": "EU_NTIL", + "label": "Ñ", + } + "ALGR(EU_M)": { + "key": "EU_DGRK", + "label": "μ (dead Greek key)", + } + "ALGR(EU_COMM)": { + "key": "EU_OGRV", + "label": "Ò", + } + "ALGR(EU_DOT)": { + "key": "EU_OACU", + "label": "Ó", + } + "ALGR(EU_SLSH)": { + "key": "EU_IQUE", + "label": "¿", + } +/* Shift+AltGr symbols + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ~ │ ¹ │ ² │ ³ │ ¥ │ ¢ │ ˇ │ ¯ │ ‚ │ ‘ │ ’ │ — │ ÷ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ │ │ │ │ │ │ │ │ │ │ │ ‹ │ › │ ¦ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ │ │ § │ │ │ │ │ │ │ │ · │ ¨ │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ │ │ │ │ │ │ │ │ │ │ … │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + "ALGR(EU_TILD)": { + "key": "EU_DTIL", + "label": "~ (dead)", + } + "S(ALGR(EU_1))": { + "key": "EU_SUP1", + "label": "¹", + } + "S(ALGR(EU_2))": { + "key": "EU_SUP2", + "label": "²", + } + "S(ALGR(EU_3))": { + "key": "EU_SUP3", + "label": "³", + } + "ALGR(EU_DLR)": { + "key": "EU_YEN", + "label": "¥", + } + "S(EU_EURO)": { + "key": "EU_CENT", + "label": "¢", + } + "S(EU_DCIR)": { + "key": "EU_CARN", + "label": "ˇ (dead)", + } + "S(ALGR(EU_7))": { + "key": "EU_MACR", + "label": "¯ (dead)", + } + "S(EU_DLQU)": { + "key": "EU_SLQU", + "label": "‚", + } + "S(EU_LDQU)": { + "key": "EU_LSQU", + "label": "‘", + } + "S(EU_RDQU)": { + "key": "EU_RSQU", + "label": "’", + } + "S(EU_NDSH)": { + "key": "EU_MDSH", + "label": "—", + } + "S(EU_MUL)": { + "key": "EU_DIV", + "label": "÷", + } + "S(EU_LDAQ)": { + "key": "EU_LSAQ", + "label": "‹", + } + "S(EU_RDAQ)": { + "key": "EU_RSAQ", + "label": "›", + } + "S(ALGR(EU_BSLS))": { + "key": "EU_BRKP", + "label": "¦", + } + "S(ALGR(EU_S))": { + "key": "EU_SECT", + "label": "§", + } + "S(ALGR(EU_SCLN))": { + "key": "EU_MDDT", + "label": "·", + } + "ALGR(EU_DQUO)": { + "key": "EU_DIAE", + "label": "¨ (dead)", + } + "ALGR(EU_QUES)": { + "key": "EU_ELLP", + "label": "…", + } + } +} \ No newline at end of file diff --git a/docs/reference_keymap_extras.md b/docs/reference_keymap_extras.md index f6b4b8faf6..c871773651 100644 --- a/docs/reference_keymap_extras.md +++ b/docs/reference_keymap_extras.md @@ -55,6 +55,7 @@ These headers are located in [`quantum/keymap_extras/`](https://github.com/qmk/q |English (US International) |`keymap_us_international.h` |`sendstring_us_international.h` | |English (US International, Linux)|`keymap_us_international_linux.h`| | |Estonian |`keymap_estonian.h` |`sendstring_estonian.h` | +|EurKEY |`keymap_eurkey.h` | | |Farsi |`keymap_farsi.h` | | |Finnish |`keymap_finnish.h` |`sendstring_finnish.h` | |French |`keymap_french.h` |`sendstring_french.h` | diff --git a/quantum/keymap_extras/keymap_eurkey.h b/quantum/keymap_extras/keymap_eurkey.h new file mode 100644 index 0000000000..80e0113fa6 --- /dev/null +++ b/quantum/keymap_extras/keymap_eurkey.h @@ -0,0 +1,166 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +/******************************************************************************* + 88888888888 888 d8b .d888 d8b 888 d8b + 888 888 Y8P d88P" Y8P 888 Y8P + 888 888 888 888 + 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b + 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K + 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b. + 888 888 888 888 X88 888 888 888 Y8b. 888 X88 + 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P' + 888 888 + 888 888 + 888 888 + .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888 + d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888 + 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888 + Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888 + "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888 + 888 + Y8b d88P + "Y88P" +*******************************************************************************/ + +#pragma once +#include "keycodes.h" +// clang-format off + +// Aliases +#define EU_GRV KC_GRV // ` +#define EU_1 KC_1 // 1 +#define EU_2 KC_2 // 2 +#define EU_3 KC_3 // 3 +#define EU_4 KC_4 // 4 +#define EU_5 KC_5 // 5 +#define EU_6 KC_6 // 6 +#define EU_7 KC_7 // 7 +#define EU_8 KC_8 // 8 +#define EU_9 KC_9 // 9 +#define EU_0 KC_0 // 0 +#define EU_MINS KC_MINS // - +#define EU_EQL KC_EQL // = +#define EU_Q KC_Q // Q +#define EU_W KC_W // W +#define EU_E KC_E // E +#define EU_R KC_R // R +#define EU_T KC_T // T +#define EU_Y KC_Y // Y +#define EU_U KC_U // U +#define EU_I KC_I // I +#define EU_O KC_O // O +#define EU_P KC_P // P +#define EU_LBRC KC_LBRC // [ +#define EU_RBRC KC_RBRC // ] +#define EU_BSLS KC_BSLS // (backslash) +#define EU_A KC_A // A +#define EU_S KC_S // S +#define EU_D KC_D // D +#define EU_F KC_F // F +#define EU_G KC_G // G +#define EU_H KC_H // H +#define EU_J KC_J // J +#define EU_K KC_K // K +#define EU_L KC_L // L +#define EU_SCLN KC_SCLN // ; +#define EU_QUOT KC_QUOT // ' +#define EU_Z KC_Z // Z +#define EU_X KC_X // X +#define EU_C KC_C // C +#define EU_V KC_V // V +#define EU_B KC_B // B +#define EU_N KC_N // N +#define EU_M KC_M // M +#define EU_COMM KC_COMM // , +#define EU_DOT KC_DOT // . +#define EU_SLSH KC_SLSH // / +#define EU_TILD S(EU_GRV) // ~ +#define EU_EXLM S(EU_1) // ! +#define EU_AT S(EU_2) // @ +#define EU_HASH S(EU_3) // # +#define EU_DLR S(EU_4) // $ +#define EU_PERC S(EU_5) // % +#define EU_CIRC S(EU_6) // ^ +#define EU_AMPR S(EU_7) // & +#define EU_ASTR S(EU_8) // * +#define EU_LPRN S(EU_9) // ( +#define EU_RPRN S(EU_0) // ) +#define EU_UNDS S(EU_MINS) // _ +#define EU_PLUS S(EU_EQL) // + +#define EU_LCBR S(EU_LBRC) // { +#define EU_RCBR S(EU_RBRC) // } +#define EU_PIPE S(EU_BSLS) // | +#define EU_COLN S(EU_SCLN) // : +#define EU_DQUO S(EU_QUOT) // " +#define EU_LABK S(EU_COMM) // < +#define EU_RABK S(EU_DOT) // > +#define EU_QUES S(EU_SLSH) // ? +#define EU_DGRV ALGR(EU_GRV) // ` (dead) +#define EU_IEXL ALGR(EU_1) // ¡ +#define EU_FORD ALGR(EU_2) // ª +#define EU_MORD ALGR(EU_3) // º +#define EU_PND ALGR(EU_4) // £ +#define EU_EURO ALGR(EU_5) // € +#define EU_DCIR ALGR(EU_6) // ^ (dead) +#define EU_RNGA ALGR(EU_7) // ˚ (dead) +#define EU_DLQU ALGR(EU_8) // „ +#define EU_LDQU ALGR(EU_9) // “ +#define EU_RDQU ALGR(EU_0) // ” +#define EU_NDSH ALGR(EU_MINS) // – +#define EU_MUL ALGR(EU_EQL) // × +#define EU_AE ALGR(EU_Q) // æ +#define EU_ARNG ALGR(EU_W) // Å +#define EU_EDIA ALGR(EU_E) // Ë +#define EU_YACU ALGR(EU_R) // Ý +#define EU_THRN ALGR(EU_T) // Þ +#define EU_YDIA ALGR(EU_Y) // Ÿ +#define EU_UDIA ALGR(EU_U) // Ü +#define EU_IDIA ALGR(EU_I) // Ï +#define EU_ODIA ALGR(EU_O) // Ö +#define EU_OE ALGR(EU_P) // Œ +#define EU_LDAQ ALGR(EU_LBRC) // « +#define EU_RDAQ ALGR(EU_RBRC) // » +#define EU_NOT ALGR(EU_BSLS) // ¬ +#define EU_ADIA ALGR(EU_A) // Ä +#define EU_SS ALGR(EU_S) // ß +#define EU_ETH ALGR(EU_D) // Ð +#define EU_EGRV ALGR(EU_F) // È +#define EU_EACU ALGR(EU_G) // É +#define EU_UGRV ALGR(EU_H) // Ù +#define EU_UACU ALGR(EU_J) // Ú +#define EU_IJ ALGR(EU_K) // IJ +#define EU_OSTR ALGR(EU_L) // Ø +#define EU_DEG ALGR(EU_SCLN) // ° +#define EU_ACUT ALGR(EU_QUOT) // ´ (dead) +#define EU_AGRV ALGR(EU_Z) // À +#define EU_AACU ALGR(EU_X) // Á +#define EU_CCED ALGR(EU_C) // Ç +#define EU_IGRV ALGR(EU_V) // Ì +#define EU_IACU ALGR(EU_B) // Í +#define EU_NTIL ALGR(EU_N) // Ñ +#define EU_DGRK ALGR(EU_M) // μ (dead Greek key) +#define EU_OGRV ALGR(EU_COMM) // Ò +#define EU_OACU ALGR(EU_DOT) // Ó +#define EU_IQUE ALGR(EU_SLSH) // ¿ +#define EU_DTIL ALGR(EU_TILD) // ~ (dead) +#define EU_SUP1 S(ALGR(EU_1)) // ¹ +#define EU_SUP2 S(ALGR(EU_2)) // ² +#define EU_SUP3 S(ALGR(EU_3)) // ³ +#define EU_YEN ALGR(EU_DLR) // ¥ +#define EU_CENT S(EU_EURO) // ¢ +#define EU_CARN S(EU_DCIR) // ˇ (dead) +#define EU_MACR S(ALGR(EU_7)) // ¯ (dead) +#define EU_SLQU S(EU_DLQU) // ‚ +#define EU_LSQU S(EU_LDQU) // ‘ +#define EU_RSQU S(EU_RDQU) // ’ +#define EU_MDSH S(EU_NDSH) // — +#define EU_DIV S(EU_MUL) // ÷ +#define EU_LSAQ S(EU_LDAQ) // ‹ +#define EU_RSAQ S(EU_RDAQ) // › +#define EU_BRKP S(ALGR(EU_BSLS)) // ¦ +#define EU_SECT S(ALGR(EU_S)) // § +#define EU_MDDT S(ALGR(EU_SCLN)) // · +#define EU_DIAE ALGR(EU_DQUO) // ¨ (dead) +#define EU_ELLP ALGR(EU_QUES) // … + From 40c93bcdc6fc8bd5326db341395c95430d2b05c7 Mon Sep 17 00:00:00 2001 From: James Gzowski Date: Tue, 24 Dec 2024 18:05:43 +0000 Subject: [PATCH 092/592] [Keyboard] Add Somei70 (#24444) * Somei70 addition * Changes made, added VIA keymap, cleaned formatting * keymap via * Create rules.mk * Add files via upload * Delete keyboards/somei70/keymaps/via directory * Fixed RGB and matrix * Layout corrections and LED positions * removal of rules.mk * Moved OLED Settings to somei70.c, formatted C removed TABs, removed _LAYERC * Forgot to include license header * Further changes as per suggestions, replaced _user for _kb within somei70.c * Updated keymap 'changes in Nov24' * Requested changes --- keyboards/somei70/config.h | 5 + keyboards/somei70/keyboard.json | 148 +++++++++++++++++++++ keyboards/somei70/keymaps/default/keymap.c | 19 +++ keyboards/somei70/readme.md | 23 ++++ keyboards/somei70/somei70.c | 87 ++++++++++++ 5 files changed, 282 insertions(+) create mode 100644 keyboards/somei70/config.h create mode 100644 keyboards/somei70/keyboard.json create mode 100644 keyboards/somei70/keymaps/default/keymap.c create mode 100644 keyboards/somei70/readme.md create mode 100644 keyboards/somei70/somei70.c diff --git a/keyboards/somei70/config.h b/keyboards/somei70/config.h new file mode 100644 index 0000000000..1336a1f28b --- /dev/null +++ b/keyboards/somei70/config.h @@ -0,0 +1,5 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define OLED_BRIGHTNESS 100 diff --git a/keyboards/somei70/keyboard.json b/keyboards/somei70/keyboard.json new file mode 100644 index 0000000000..70f57d5ff5 --- /dev/null +++ b/keyboards/somei70/keyboard.json @@ -0,0 +1,148 @@ +{ + "manufacturer": "gzowski", + "keyboard_name": "Somei70", + "maintainer": "gzowski", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true, + "rgb_matrix": true, + "wpm": true + }, + "matrix_pins": { + "cols": ["GP28", "GP27", "GP26", "GP22", "GP20", "GP23", "GP21", "GP16", "GP15", "GP14", "GP13", "GP12", "GP9", "GP8", "GP7"], + "rows": ["GP1", "GP29", "GP6", "GP5", "GP4"] + }, + "processor": "RP2040", + "rgb_matrix": { + "animations": { + "band_sat": true, + "band_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "dual_beacon": true, + "gradient_left_right": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "jellybean_raindrops": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "raindrops": true + }, + "driver": "ws2812", + "layout": [ + {"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": 212, "y": 0, "flags": 4} + ], + "led_flush_limit": 14, + "led_process_limit": 5, + "max_brightness": 200, + "sleep": true + }, + "url": "https://github.com/gzowski/somei70", + "usb": { + "device_version": "1.0.0", + "pid": "0x6F64", + "vid": "0x73CA" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP0" + }, + "layouts": { + "LAYOUT_5x15": { + "layout": [ + {"label": "ESC", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "MINS", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "EQL", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "BSPC", "matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"label": "TAB", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "LBRC", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "RBRC", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "BSLS", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "CAPS", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": "SCLN", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "QLOT", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "GRV", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "DEL", "matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25}, + {"label": "PGUP", "matrix": [2, 14], "x": 15, "y": 2}, + {"label": "LSFT", "matrix": [3, 0], "x": 0, "y": 3, "w": 2}, + {"label": "Z", "matrix": [3, 1], "x": 2, "y": 3}, + {"label": "X", "matrix": [3, 2], "x": 3, "y": 3}, + {"label": "C", "matrix": [3, 3], "x": 4, "y": 3}, + {"label": "V", "matrix": [3, 4], "x": 5, "y": 3}, + {"label": "B", "matrix": [3, 5], "x": 6, "y": 3}, + {"label": "N", "matrix": [3, 6], "x": 7, "y": 3}, + {"label": "M", "matrix": [3, 7], "x": 8, "y": 3}, + {"label": "COMM", "matrix": [3, 8], "x": 9, "y": 3}, + {"label": "DOT", "matrix": [3, 9], "x": 10, "y": 3}, + {"label": "SLSH", "matrix": [3, 10], "x": 11, "y": 3}, + {"label": "RSFT", "matrix": [3, 11], "x": 12, "y": 3}, + {"label": "INS", "matrix": [3, 12], "x": 13, "y": 3}, + {"label": "UP", "matrix": [3, 13], "x": 14, "y": 3}, + {"label": "PGDN", "matrix": [3, 14], "x": 15, "y": 3}, + {"label": "RCTL", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "LGUI", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "LALT", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "SPC", "matrix": [4, 3], "x": 3.75, "y": 4, "w": 2.25}, + {"label": "MUTE", "matrix": [4, 4], "x": 6, "y": 4, "w": 1.75}, + {"label": "ENT", "matrix": [4, 5], "x": 7.75, "y": 4, "w": 2.25}, + {"label": "RALT", "matrix": [4, 6], "x": 10, "y": 4}, + {"label": "MO(1)", "matrix": [4, 7], "x": 11, "y": 4}, + {"label": "RCTL", "matrix": [4, 8], "x": 12, "y": 4}, + {"label": "LEFT", "matrix": [4, 9], "x": 13, "y": 4}, + {"label": "DOWN", "matrix": [4, 10], "x": 14, "y": 4}, + {"label": "RGHT", "matrix": [4, 11], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/somei70/keymaps/default/keymap.c b/keyboards/somei70/keymaps/default/keymap.c new file mode 100644 index 0000000000..2569b8b207 --- /dev/null +++ b/keyboards/somei70/keymaps/default/keymap.c @@ -0,0 +1,19 @@ +// Copyright 2024 James Gzowski +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H +enum custom_layer { _LAYERA, _LAYERB }; +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_LAYERA] = LAYOUT_5x15( + 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_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_GRV , KC_DEL , 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_INS , KC_UP , KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_MUTE, KC_ENT, KC_RALT, MO(_LAYERB), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT +), +[_LAYERB] = LAYOUT_5x15( + 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_PSCR, + KC_TAB , RM_NEXT, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, 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_GRV , KC_DEL , 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_INS , KC_UP , KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , RM_TOGG, KC_ENT , KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT +)}; diff --git a/keyboards/somei70/readme.md b/keyboards/somei70/readme.md new file mode 100644 index 0000000000..21b80a8411 --- /dev/null +++ b/keyboards/somei70/readme.md @@ -0,0 +1,23 @@ +# Somei70 + +70 key alternative layout + +* Keyboard Maintainer: [James Gzowski](https://github.com/gzowski) +* Hardware Supported: Elite-Pi, Frood, 0xB2 Splinky or similar, requires D9-D15 pins +* Build Guide: [Somei70](https://github.com/gzowski/somei70) + +Make example for this keyboard (after setting up your build environment): + + make somei70:default + +Flashing example for this keyboard: + + make somei70: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 + +* **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 PCB, if using a RP2040 press repeatidly to enter boot mode. +* **Hold down boot loader button on MCU** Hold down the boot loader button on the MCU while plugging in the keyboard diff --git a/keyboards/somei70/somei70.c b/keyboards/somei70/somei70.c new file mode 100644 index 0000000000..5521a67384 --- /dev/null +++ b/keyboards/somei70/somei70.c @@ -0,0 +1,87 @@ +// Copyright 2024 James Gzowski +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H +#ifdef OLED_ENABLE +static uint8_t oled_mode = 0; +static uint8_t esc_press_count = 0; +static uint16_t esc_timer = 0; +// Stats display +void render_stats(void) { + oled_write_P(PSTR("WPM: "), false); + oled_write_ln(get_u8_str(get_current_wpm(), '0'), false); + if (host_keyboard_led_state().caps_lock) { + oled_write_P(PSTR("CAPS: On "), false); + } else { + oled_write_P(PSTR("CAPS: Off "), false); + } + if (keymap_config.nkro) { + oled_write_ln("NKRO: On", false); + } else { + oled_write_ln("NKRO: Off", false); + } + oled_write_P(PSTR("LED Brightness: "), false); + oled_write_ln(get_u8_str(rgblight_get_val(), '0'), false); + oled_write_ln(PSTR("P: 0x6F64 V: 0x73CA"), false); +} +// Static images +static void render_caps(void) { + static const char PROGMEM my_caps[] = { + 0, 128, 192, 192, 248, 120, 8, 8, 24, 24, 48, 96, 96, 176, 24, 12, 4, 6, 6, 30, 60, 48, 48, 240, 240, 16, 16, 16, 16, 16, 16, 16, 16, 16, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 16, 16, 16, 144, 208, 208, 248, 120, 24, 24, 24, 24, 48, 96, 96, 176, 24, 12, 4, 6, 6, 30, 60, 48, 48, 240, 224, 0, 0, 0, 0, 0, 0, 0, 0, 7, 31, 56, 64, 128, 128, 128, 192, 192, 192, 224, 192, 225, 255, 240, 240, 128, 128, 64, 64, 48, 24, 7, 7, 6, 4, 140, 216, 120, 48, 0, 0, 0, 128, 128, 128, 128, 128, 0, 0, 0, 240, + 248, 12, 12, 12, 12, 12, 28, 56, 0, 0, 240, 248, 156, 12, 12, 12, 12, 156, 248, 240, 0, 0, 248, 252, 156, 12, 12, 12, 12, 152, 240, 0, 0, 32, 112, 216, 140, 140, 140, 12, 12, 4, 0, 0, 0, 0, 128, 128, 128, 128, 128, 0, 0, 0, 7, 31, 56, 64, 128, 128, 128, 192, 192, 192, 224, 192, 225, 255, 240, 240, 128, 128, 64, 64, 48, 24, 7, 7, 6, 4, 140, 216, 120, 48, 0, 0, 224, 240, 24, 4, 3, 1, 0, 0, 0, 0, 6, 255, 135, 7, 15, 31, 17, 49, 32, 32, 32, 96, 224, 224, 32, 48, 17, 27, 14, 4, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 15, 31, 48, 48, 48, 48, 48, 56, 28, 0, 0, 63, 63, 3, 1, 1, 1, 1, 3, 63, 63, 0, 0, 63, 63, 3, 3, 3, 3, 3, 1, 0, 0, 0, 16, 48, 48, 49, 49, 49, 27, 14, 4, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 224, 240, 24, 4, 3, 1, 0, 0, 0, 0, 6, 255, 135, 7, 15, 31, 17, 49, 32, 32, 32, 96, 224, 224, 32, 48, 17, 27, 14, 4, 0, 0, 3, 7, 6, 30, 60, 48, 32, 48, 48, 24, 12, 7, 7, 12, 16, 32, 96, 96, 120, 124, 60, 12, 15, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 11, 15, 14, 30, 60, 48, 32, 48, 48, 24, 12, 7, 7, 12, 16, 32, 96, 96, 120, 124, 60, 12, 15, 7, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(my_caps, sizeof(my_caps)); +} +static void render_logo(void) { + static const char PROGMEM my_logo[] = { + 0, 128, 192, 192, 248, 120, 8, 8, 24, 24, 48, 96, 96, 176, 24, 12, 4, 6, 6, 30, 60, 48, 48, 240, 240, 16, 16, 16, 16, 16, 16, 16, 16, 16, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 16, 16, 16, 144, 208, 208, 248, 120, 24, 24, 24, 24, 48, 96, 96, 176, 24, 12, 4, 6, 6, 30, 60, 48, 48, 240, 224, 0, 0, 0, 0, 0, 0, 0, 0, 7, 31, 56, 64, 128, 128, 128, 192, 192, 192, 224, 192, 225, 255, 240, 240, 128, 128, 64, 64, 48, 24, 7, 7, 6, 4, 140, 216, 120, 48, 0, 48, 120, 204, 204, 204, 204, 204, 140, 8, 0, 0, + 240, 248, 12, 12, 12, 12, 12, 248, 240, 0, 0, 248, 252, 24, 48, 96, 96, 48, 24, 252, 248, 0, 0, 248, 252, 140, 140, 140, 12, 8, 0, 0, 252, 252, 0, 0, 8, 12, 12, 12, 12, 252, 248, 0, 0, 240, 248, 12, 12, 140, 76, 248, 240, 0, 7, 31, 56, 64, 128, 128, 128, 192, 192, 192, 224, 192, 225, 255, 240, 240, 128, 128, 64, 64, 48, 24, 7, 7, 6, 4, 140, 216, 120, 48, 0, 0, 224, 240, 24, 4, 3, 1, 0, 0, 0, 0, 6, 255, 135, 7, 15, 31, 17, 49, 32, 32, 32, 96, 224, 224, 32, 48, 17, 27, 14, 4, 0, 16, 48, 48, 48, 48, 48, 48, 63, 15, 0, 0, 15, 31, 48, 48, 48, 48, 48, 31, 15, 0, 0, 63, 31, 0, 0, 0, 0, 0, 0, 31, 63, 0, 0, 31, 63, 49, 49, 49, 48, 16, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 63, 63, + 0, 0, 15, 31, 50, 49, 48, 48, 31, 15, 0, 224, 240, 24, 4, 3, 1, 0, 0, 0, 0, 6, 255, 135, 7, 15, 31, 17, 49, 32, 32, 32, 96, 224, 224, 32, 48, 17, 27, 14, 4, 0, 0, 3, 7, 6, 30, 60, 48, 32, 48, 48, 24, 12, 7, 7, 12, 16, 32, 96, 96, 120, 124, 60, 12, 15, 15, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 11, 15, 14, 30, 60, 48, 32, 48, 48, 24, 12, 7, 7, 12, 16, 32, 96, 96, 120, 124, 60, 12, 15, 7, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(my_logo, sizeof(my_logo)); +} +// Render chosen display +void render_oled_display(void) { + if (oled_mode == 0) { + if (host_keyboard_led_state().caps_lock) { + render_caps(); + } else { + render_logo(); + } + } else if (oled_mode == 1) { + render_stats(); + } +} +// Rotate 180 degrees +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + render_oled_display(); + return false; +} +// Record keypress +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_ESC: + if (record->event.pressed) { + if (timer_elapsed(esc_timer) > 250) { + esc_press_count = 0; + } + esc_press_count++; + esc_timer = timer_read(); + + if (esc_press_count == 3) { + oled_clear(); + oled_mode = (oled_mode == 0) ? 1 : 0; + esc_press_count = 0; + } + } + break; + } + return process_record_user(keycode, record); +} +#endif From a822545da07f9561e231df15feb68d829c7b507f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 24 Dec 2024 18:26:08 +0000 Subject: [PATCH 093/592] Set custom effect defines for LED Matrix (#24745) --- builddefs/common_features.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 7bfd1436e7..bb272099a6 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -433,6 +433,13 @@ ifeq ($(strip $(LED_MATRIX_ENABLE)), yes) SRC += snled27351-mono.c endif + ifeq ($(strip $(LED_MATRIX_CUSTOM_KB)), yes) + OPT_DEFS += -DLED_MATRIX_CUSTOM_KB + endif + + ifeq ($(strip $(LED_MATRIX_CUSTOM_USER)), yes) + OPT_DEFS += -DLED_MATRIX_CUSTOM_USER + endif endif # Deprecated driver names - do not use From 58323017ffe62e91200a0e1c814fc960a7605f08 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 24 Dec 2024 18:57:30 -0800 Subject: [PATCH 094/592] Add ArteryTek AT32 dfu to udev rules (#24747) --- util/udev/50-qmk.rules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/udev/50-qmk.rules b/util/udev/50-qmk.rules index 1cc19b4142..338b4fdbe0 100644 --- a/util/udev/50-qmk.rules +++ b/util/udev/50-qmk.rules @@ -84,3 +84,6 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", TAG+="uacc # WB32 DFU SUBSYSTEMS=="usb", ATTRS{idVendor}=="342d", ATTRS{idProduct}=="dfa0", TAG+="uaccess" + +# AT32 DFU +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2e3c", ATTRS{idProduct}=="df11", TAG+="uaccess" From 93de5335803242f1df93600602ef5725d4df3a4c Mon Sep 17 00:00:00 2001 From: muge <221161+muge@users.noreply.github.com> Date: Thu, 26 Dec 2024 08:58:26 +0000 Subject: [PATCH 095/592] Move cxt_studio keyboard to own folder (#24748) --- data/mappings/keyboard_aliases.hjson | 3 +++ keyboards/cxt_studio/12e4/config.h | 6 +++++ keyboards/cxt_studio/{ => 12e4}/cxt_studio.c | 20 +++++------------ keyboards/cxt_studio/{ => 12e4}/keyboard.json | 2 +- .../{ => 12e4}/keymaps/default/keymap.json | 2 +- keyboards/cxt_studio/{ => 12e4}/readme.md | 10 ++++----- keyboards/cxt_studio/config.h | 22 ------------------- 7 files changed, 22 insertions(+), 43 deletions(-) create mode 100644 keyboards/cxt_studio/12e4/config.h rename keyboards/cxt_studio/{ => 12e4}/cxt_studio.c (68%) rename keyboards/cxt_studio/{ => 12e4}/keyboard.json (98%) rename keyboards/cxt_studio/{ => 12e4}/keymaps/default/keymap.json (90%) rename keyboards/cxt_studio/{ => 12e4}/readme.md (83%) delete mode 100644 keyboards/cxt_studio/config.h diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 098c299e58..4fd959c4eb 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -140,6 +140,9 @@ "custommk/genesis": { "target": "custommk/genesis/rev1" }, + "cxt_studio":{ + "target":"cxt_studio/12e4" + }, "daisy": { "target": "ktec/daisy" }, diff --git a/keyboards/cxt_studio/12e4/config.h b/keyboards/cxt_studio/12e4/config.h new file mode 100644 index 0000000000..de0fbad7ec --- /dev/null +++ b/keyboards/cxt_studio/12e4/config.h @@ -0,0 +1,6 @@ +// Copyright 2023 Colin Kinloch (@ColinKinloch) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RGB_MATRIX_TYPING_HEATMAP_SPREAD 9 diff --git a/keyboards/cxt_studio/cxt_studio.c b/keyboards/cxt_studio/12e4/cxt_studio.c similarity index 68% rename from keyboards/cxt_studio/cxt_studio.c rename to keyboards/cxt_studio/12e4/cxt_studio.c index 2b36905340..03a15e4d48 100644 --- a/keyboards/cxt_studio/cxt_studio.c +++ b/keyboards/cxt_studio/12e4/cxt_studio.c @@ -3,8 +3,6 @@ #include "quantum.h" -static uint8_t anim = 0; - #ifdef ENCODER_ENABLE bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { @@ -21,32 +19,26 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; case 1: { if (clockwise) { - rgblight_increase_hue(); + rgb_matrix_increase_hue(); } else { - rgblight_decrease_hue(); + rgb_matrix_decrease_hue(); } } break; case 2: { if (clockwise) { - rgblight_increase_val(); + rgb_matrix_increase_val(); } else { - rgblight_decrease_val(); + rgb_matrix_decrease_val(); } } break; case 3: { if (clockwise) { - anim++; + rgb_matrix_step(); } else { - anim--; + rgb_matrix_step_reverse(); } - if (anim >= RGB_MATRIX_EFFECT_MAX) { - anim = 0; - } else if (anim < 0) { - anim = RGB_MATRIX_EFFECT_MAX - 1; - } - rgblight_mode(anim); } break; } diff --git a/keyboards/cxt_studio/keyboard.json b/keyboards/cxt_studio/12e4/keyboard.json similarity index 98% rename from keyboards/cxt_studio/keyboard.json rename to keyboards/cxt_studio/12e4/keyboard.json index 7ee7b52d50..b48e75f4ca 100644 --- a/keyboards/cxt_studio/keyboard.json +++ b/keyboards/cxt_studio/12e4/keyboard.json @@ -1,6 +1,6 @@ { "manufacturer": "CXT", - "keyboard_name": "cxt_studio", + "keyboard_name": "cxt_studio 12E4", "maintainer": "ColinKinloch", "bootloader": "atmel-dfu", "diode_direction": "ROW2COL", diff --git a/keyboards/cxt_studio/keymaps/default/keymap.json b/keyboards/cxt_studio/12e4/keymaps/default/keymap.json similarity index 90% rename from keyboards/cxt_studio/keymaps/default/keymap.json rename to keyboards/cxt_studio/12e4/keymaps/default/keymap.json index 9e31833520..b05d3ba179 100644 --- a/keyboards/cxt_studio/keymaps/default/keymap.json +++ b/keyboards/cxt_studio/12e4/keymaps/default/keymap.json @@ -1,5 +1,5 @@ { - "keyboard": "cxt_studio", + "keyboard": "cxt_studio/12e4", "keymap": "default", "layout": "LAYOUT", "layers": [ diff --git a/keyboards/cxt_studio/readme.md b/keyboards/cxt_studio/12e4/readme.md similarity index 83% rename from keyboards/cxt_studio/readme.md rename to keyboards/cxt_studio/12e4/readme.md index 6397a3fdfd..760c3544b4 100644 --- a/keyboards/cxt_studio/readme.md +++ b/keyboards/cxt_studio/12e4/readme.md @@ -1,20 +1,20 @@ -# cxt_studio +# cxt_studio/12e4 -![cxt_studio](https://i.imgur.com/AMCTioSh.jpeg) +![cxt_studio/12e4](https://i.imgur.com/AMCTioSh.jpeg) 3x4 ortho rgb lighting 4 knobs. * Keyboard Maintainer: [Colin Kinloch](https://github.com/ColinKinloch) -* Hardware Supported: CXT-Studio +* Hardware Supported: CXT-Studio/12E4 * Hardware Availability: AliExpress. I think the manufacturer is on Taobao. Make example for this keyboard (after setting up your build environment): - make cxt_studio:default + make cxt_studio/12e4:default Flashing example for this keyboard: - make cxt_studio:default:flash + make cxt_studio/12e4: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). diff --git a/keyboards/cxt_studio/config.h b/keyboards/cxt_studio/config.h deleted file mode 100644 index e56e07a254..0000000000 --- a/keyboards/cxt_studio/config.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2023 Colin Kinloch (@ColinKinloch) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#define RGB_MATRIX_TYPING_HEATMAP_SPREAD 9 - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -//#define NO_DEBUG - -/* disable print */ -//#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT From 5593e73ba71fa31155cdb81bc7c477f6501065e6 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 28 Dec 2024 06:24:53 +1100 Subject: [PATCH 096/592] [bug] Djinn theme fix. (#24754) Theme fix. --- keyboards/tzarc/djinn/graphics/theme_djinn_default.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c index f321308ac5..c651cd660d 100644 --- a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c +++ b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c @@ -43,13 +43,13 @@ static painter_font_handle_t thintel; enum { RGB_MATRIX_EFFECT_NONE, # include "rgb_matrix_effects.inc" -# undef RGB_MATRIX_EFFECT # ifdef RGB_MATRIX_CUSTOM_KB # include "rgb_matrix_kb.inc" # endif # ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" # endif +# undef RGB_MATRIX_EFFECT }; # define RGB_MATRIX_EFFECT(x) \ @@ -60,13 +60,13 @@ const char *rgb_matrix_name(uint8_t effect) { case RGB_MATRIX_EFFECT_NONE: return "NONE"; # include "rgb_matrix_effects.inc" -# undef RGB_MATRIX_EFFECT # ifdef RGB_MATRIX_CUSTOM_KB # include "rgb_matrix_kb.inc" # endif # ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" # endif +# undef RGB_MATRIX_EFFECT default: return "UNKNOWN"; } From f549948bbd2a2026875faab1f67ba7b8d21bb5a6 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 27 Dec 2024 19:42:54 +0000 Subject: [PATCH 097/592] Skip parsing g_led_config when matrix_size is missing (#24739) --- lib/python/qmk/info.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 74a62721a3..acf8da984f 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -773,23 +773,24 @@ def find_keyboard_c(keyboard): def _extract_led_config(info_data, keyboard): """Scan all .c files for led config """ - cols = info_data['matrix_size']['cols'] - rows = info_data['matrix_size']['rows'] - for feature in ['rgb_matrix', 'led_matrix']: if info_data.get('features', {}).get(feature, False) or feature in info_data: - # Only attempt search if dd led config is missing if 'layout' not in info_data.get(feature, {}): - # Process - for file in find_keyboard_c(keyboard): - try: - ret = find_led_config(file, cols, rows) - if ret: - info_data[feature] = info_data.get(feature, {}) - info_data[feature]['layout'] = ret - except Exception as e: - _log_warning(info_data, f'led_config: {file.name}: {e}') + cols = info_data.get('matrix_size', {}).get('cols') + rows = info_data.get('matrix_size', {}).get('rows') + if cols and rows: + # Process + for file in find_keyboard_c(keyboard): + try: + ret = find_led_config(file, cols, rows) + if ret: + info_data[feature] = info_data.get(feature, {}) + info_data[feature]['layout'] = ret + except Exception as e: + _log_warning(info_data, f'led_config: {file.name}: {e}') + else: + _log_warning(info_data, 'led_config: matrix size required to parse g_led_config') if info_data[feature].get('layout', None) and not info_data[feature].get('led_count', None): info_data[feature]['led_count'] = len(info_data[feature]['layout']) From fd0a552fc1ed3b5799456dae4f0fc9b039575a2f Mon Sep 17 00:00:00 2001 From: chillKB <107592205+chillKB@users.noreply.github.com> Date: Mon, 30 Dec 2024 13:44:51 -0800 Subject: [PATCH 098/592] [Keyboard] Ghoul TKL (#24762) Co-authored-by: jack --- keyboards/chill/ghoul/chconf.h | 8 + keyboards/chill/ghoul/config.h | 7 + keyboards/chill/ghoul/halconf.h | 7 + keyboards/chill/ghoul/keyboard.json | 408 ++++++++++++++++++ .../chill/ghoul/keymaps/default/keymap.c | 24 ++ keyboards/chill/ghoul/mcuconf.h | 11 + keyboards/chill/ghoul/readme.md | 27 ++ 7 files changed, 492 insertions(+) create mode 100644 keyboards/chill/ghoul/chconf.h create mode 100644 keyboards/chill/ghoul/config.h create mode 100644 keyboards/chill/ghoul/halconf.h create mode 100644 keyboards/chill/ghoul/keyboard.json create mode 100644 keyboards/chill/ghoul/keymaps/default/keymap.c create mode 100644 keyboards/chill/ghoul/mcuconf.h create mode 100644 keyboards/chill/ghoul/readme.md diff --git a/keyboards/chill/ghoul/chconf.h b/keyboards/chill/ghoul/chconf.h new file mode 100644 index 0000000000..54014b32f5 --- /dev/null +++ b/keyboards/chill/ghoul/chconf.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#define CH_CFG_ST_RESOLUTION 16 +#define CH_CFG_ST_FREQUENCY 10000 + +#include_next diff --git a/keyboards/chill/ghoul/config.h b/keyboards/chill/ghoul/config.h new file mode 100644 index 0000000000..9d5024d876 --- /dev/null +++ b/keyboards/chill/ghoul/config.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#define BACKLIGHT_PWM_DRIVER PWMD2 +#define BACKLIGHT_PWM_CHANNEL 2 +#define BACKLIGHT_PAL_MODE 2 diff --git a/keyboards/chill/ghoul/halconf.h b/keyboards/chill/ghoul/halconf.h new file mode 100644 index 0000000000..cb37633eb6 --- /dev/null +++ b/keyboards/chill/ghoul/halconf.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/chill/ghoul/keyboard.json b/keyboards/chill/ghoul/keyboard.json new file mode 100644 index 0000000000..ff7435959c --- /dev/null +++ b/keyboards/chill/ghoul/keyboard.json @@ -0,0 +1,408 @@ +{ + "manufacturer": "Chill", + "keyboard_name": "Ghoul", + "maintainer": "chillKB", + "url": "https://github.com/chillKB/ghoulTKL", + "backlight": { + "driver": "pwm", + "pin": "B3" + }, + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "backlight": true, + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "B4", + "on_state": 0, + "scroll_lock": "B6" + }, + "matrix_pins": { + "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B11", "B10", "B2", "B1", "B0", "A6", "A5", "A15", "A1", "A0"], + "rows": ["B7", "B9", "B8", "A7", "A4", "A3"] + }, + "processor": "STM32F072", + "usb": { + "device_version": "1.0.0", + "pid": "0xFC87", + "vid": "0xC01D" + }, + "community_layouts": ["tkl_ansi", "tkl_ansi_split_bs_rshift", "tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift"], + "layout_aliases": { + "LAYOUT_all": "LAYOUT_tkl_ansi_split_bs_rshift" + }, + "layouts": { + "LAYOUT_tkl_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.5}, + {"matrix": [1, 4], "x": 4, "y": 1.5}, + {"matrix": [1, 5], "x": 5, "y": 1.5}, + {"matrix": [1, 6], "x": 6, "y": 1.5}, + {"matrix": [1, 7], "x": 7, "y": 1.5}, + {"matrix": [1, 8], "x": 8, "y": 1.5}, + {"matrix": [1, 9], "x": 9, "y": 1.5}, + {"matrix": [1, 10], "x": 10, "y": 1.5}, + {"matrix": [1, 11], "x": 11, "y": 1.5}, + {"matrix": [1, 12], "x": 12, "y": 1.5}, + {"matrix": [1, 13], "x": 13, "y": 1.5, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.5}, + {"matrix": [1, 15], "x": 16.25, "y": 1.5}, + {"matrix": [1, 16], "x": 17.25, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"matrix": [2, 2], "x": 2.5, "y": 2.5}, + {"matrix": [2, 3], "x": 3.5, "y": 2.5}, + {"matrix": [2, 4], "x": 4.5, "y": 2.5}, + {"matrix": [2, 5], "x": 5.5, "y": 2.5}, + {"matrix": [2, 6], "x": 6.5, "y": 2.5}, + {"matrix": [2, 7], "x": 7.5, "y": 2.5}, + {"matrix": [2, 8], "x": 8.5, "y": 2.5}, + {"matrix": [2, 9], "x": 9.5, "y": 2.5}, + {"matrix": [2, 10], "x": 10.5, "y": 2.5}, + {"matrix": [2, 11], "x": 11.5, "y": 2.5}, + {"matrix": [2, 12], "x": 12.5, "y": 2.5}, + {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.5}, + {"matrix": [2, 15], "x": 16.25, "y": 2.5}, + {"matrix": [2, 16], "x": 17.25, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.5}, + {"matrix": [3, 2], "x": 2.75, "y": 3.5}, + {"matrix": [3, 3], "x": 3.75, "y": 3.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3.5}, + {"matrix": [3, 5], "x": 5.75, "y": 3.5}, + {"matrix": [3, 6], "x": 6.75, "y": 3.5}, + {"matrix": [3, 7], "x": 7.75, "y": 3.5}, + {"matrix": [3, 8], "x": 8.75, "y": 3.5}, + {"matrix": [3, 9], "x": 9.75, "y": 3.5}, + {"matrix": [3, 10], "x": 10.75, "y": 3.5}, + {"matrix": [3, 11], "x": 11.75, "y": 3.5}, + {"matrix": [3, 12], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.5}, + {"matrix": [4, 3], "x": 3.25, "y": 4.5}, + {"matrix": [4, 4], "x": 4.25, "y": 4.5}, + {"matrix": [4, 5], "x": 5.25, "y": 4.5}, + {"matrix": [4, 6], "x": 6.25, "y": 4.5}, + {"matrix": [4, 7], "x": 7.25, "y": 4.5}, + {"matrix": [4, 8], "x": 8.25, "y": 4.5}, + {"matrix": [4, 9], "x": 9.25, "y": 4.5}, + {"matrix": [4, 10], "x": 10.25, "y": 4.5}, + {"matrix": [4, 11], "x": 11.25, "y": 4.5}, + {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.5, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.5, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.5, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.5, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.5}, + {"matrix": [5, 15], "x": 16.25, "y": 5.5}, + {"matrix": [5, 16], "x": 17.25, "y": 5.5} + ] + }, + "LAYOUT_tkl_ansi_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.5}, + {"matrix": [1, 4], "x": 4, "y": 1.5}, + {"matrix": [1, 5], "x": 5, "y": 1.5}, + {"matrix": [1, 6], "x": 6, "y": 1.5}, + {"matrix": [1, 7], "x": 7, "y": 1.5}, + {"matrix": [1, 8], "x": 8, "y": 1.5}, + {"matrix": [1, 9], "x": 9, "y": 1.5}, + {"matrix": [1, 10], "x": 10, "y": 1.5}, + {"matrix": [1, 11], "x": 11, "y": 1.5}, + {"matrix": [1, 12], "x": 12, "y": 1.5}, + {"matrix": [1, 13], "x": 13, "y": 1.5}, + {"matrix": [3, 13], "x": 14, "y": 1.5}, + {"matrix": [1, 14], "x": 15.25, "y": 1.5}, + {"matrix": [1, 15], "x": 16.25, "y": 1.5}, + {"matrix": [1, 16], "x": 17.25, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"matrix": [2, 2], "x": 2.5, "y": 2.5}, + {"matrix": [2, 3], "x": 3.5, "y": 2.5}, + {"matrix": [2, 4], "x": 4.5, "y": 2.5}, + {"matrix": [2, 5], "x": 5.5, "y": 2.5}, + {"matrix": [2, 6], "x": 6.5, "y": 2.5}, + {"matrix": [2, 7], "x": 7.5, "y": 2.5}, + {"matrix": [2, 8], "x": 8.5, "y": 2.5}, + {"matrix": [2, 9], "x": 9.5, "y": 2.5}, + {"matrix": [2, 10], "x": 10.5, "y": 2.5}, + {"matrix": [2, 11], "x": 11.5, "y": 2.5}, + {"matrix": [2, 12], "x": 12.5, "y": 2.5}, + {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.5}, + {"matrix": [2, 15], "x": 16.25, "y": 2.5}, + {"matrix": [2, 16], "x": 17.25, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.5}, + {"matrix": [3, 2], "x": 2.75, "y": 3.5}, + {"matrix": [3, 3], "x": 3.75, "y": 3.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3.5}, + {"matrix": [3, 5], "x": 5.75, "y": 3.5}, + {"matrix": [3, 6], "x": 6.75, "y": 3.5}, + {"matrix": [3, 7], "x": 7.75, "y": 3.5}, + {"matrix": [3, 8], "x": 8.75, "y": 3.5}, + {"matrix": [3, 9], "x": 9.75, "y": 3.5}, + {"matrix": [3, 10], "x": 10.75, "y": 3.5}, + {"matrix": [3, 11], "x": 11.75, "y": 3.5}, + {"matrix": [3, 12], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.5}, + {"matrix": [4, 3], "x": 3.25, "y": 4.5}, + {"matrix": [4, 4], "x": 4.25, "y": 4.5}, + {"matrix": [4, 5], "x": 5.25, "y": 4.5}, + {"matrix": [4, 6], "x": 6.25, "y": 4.5}, + {"matrix": [4, 7], "x": 7.25, "y": 4.5}, + {"matrix": [4, 8], "x": 8.25, "y": 4.5}, + {"matrix": [4, 9], "x": 9.25, "y": 4.5}, + {"matrix": [4, 10], "x": 10.25, "y": 4.5}, + {"matrix": [4, 11], "x": 11.25, "y": 4.5}, + {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.5}, + {"matrix": [4, 15], "x": 16.25, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.5, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.5, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.5, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.5, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.5}, + {"matrix": [5, 15], "x": 16.25, "y": 5.5}, + {"matrix": [5, 16], "x": 17.25, "y": 5.5} + ] + }, + "LAYOUT_tkl_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.5}, + {"matrix": [1, 4], "x": 4, "y": 1.5}, + {"matrix": [1, 5], "x": 5, "y": 1.5}, + {"matrix": [1, 6], "x": 6, "y": 1.5}, + {"matrix": [1, 7], "x": 7, "y": 1.5}, + {"matrix": [1, 8], "x": 8, "y": 1.5}, + {"matrix": [1, 9], "x": 9, "y": 1.5}, + {"matrix": [1, 10], "x": 10, "y": 1.5}, + {"matrix": [1, 11], "x": 11, "y": 1.5}, + {"matrix": [1, 12], "x": 12, "y": 1.5}, + {"matrix": [1, 13], "x": 13, "y": 1.5, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.5}, + {"matrix": [1, 15], "x": 16.25, "y": 1.5}, + {"matrix": [1, 16], "x": 17.25, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"matrix": [2, 2], "x": 2.5, "y": 2.5}, + {"matrix": [2, 3], "x": 3.5, "y": 2.5}, + {"matrix": [2, 4], "x": 4.5, "y": 2.5}, + {"matrix": [2, 5], "x": 5.5, "y": 2.5}, + {"matrix": [2, 6], "x": 6.5, "y": 2.5}, + {"matrix": [2, 7], "x": 7.5, "y": 2.5}, + {"matrix": [2, 8], "x": 8.5, "y": 2.5}, + {"matrix": [2, 9], "x": 9.5, "y": 2.5}, + {"matrix": [2, 10], "x": 10.5, "y": 2.5}, + {"matrix": [2, 11], "x": 11.5, "y": 2.5}, + {"matrix": [2, 12], "x": 12.5, "y": 2.5}, + {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.5}, + {"matrix": [2, 15], "x": 16.25, "y": 2.5}, + {"matrix": [2, 16], "x": 17.25, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.5}, + {"matrix": [3, 2], "x": 2.75, "y": 3.5}, + {"matrix": [3, 3], "x": 3.75, "y": 3.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3.5}, + {"matrix": [3, 5], "x": 5.75, "y": 3.5}, + {"matrix": [3, 6], "x": 6.75, "y": 3.5}, + {"matrix": [3, 7], "x": 7.75, "y": 3.5}, + {"matrix": [3, 8], "x": 8.75, "y": 3.5}, + {"matrix": [3, 9], "x": 9.75, "y": 3.5}, + {"matrix": [3, 10], "x": 10.75, "y": 3.5}, + {"matrix": [3, 11], "x": 11.75, "y": 3.5}, + {"matrix": [3, 12], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.5}, + {"matrix": [4, 3], "x": 3.25, "y": 4.5}, + {"matrix": [4, 4], "x": 4.25, "y": 4.5}, + {"matrix": [4, 5], "x": 5.25, "y": 4.5}, + {"matrix": [4, 6], "x": 6.25, "y": 4.5}, + {"matrix": [4, 7], "x": 7.25, "y": 4.5}, + {"matrix": [4, 8], "x": 8.25, "y": 4.5}, + {"matrix": [4, 9], "x": 9.25, "y": 4.5}, + {"matrix": [4, 10], "x": 10.25, "y": 4.5}, + {"matrix": [4, 11], "x": 11.25, "y": 4.5}, + {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.5}, + {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.5, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.5, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.5}, + {"matrix": [5, 13], "x": 13.5, "y": 5.5, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.5}, + {"matrix": [5, 15], "x": 16.25, "y": 5.5}, + {"matrix": [5, 16], "x": 17.25, "y": 5.5} + ] + }, + "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.5}, + {"matrix": [1, 4], "x": 4, "y": 1.5}, + {"matrix": [1, 5], "x": 5, "y": 1.5}, + {"matrix": [1, 6], "x": 6, "y": 1.5}, + {"matrix": [1, 7], "x": 7, "y": 1.5}, + {"matrix": [1, 8], "x": 8, "y": 1.5}, + {"matrix": [1, 9], "x": 9, "y": 1.5}, + {"matrix": [1, 10], "x": 10, "y": 1.5}, + {"matrix": [1, 11], "x": 11, "y": 1.5}, + {"matrix": [1, 12], "x": 12, "y": 1.5}, + {"matrix": [1, 13], "x": 13, "y": 1.5}, + {"matrix": [3, 13], "x": 14, "y": 1.5}, + {"matrix": [1, 14], "x": 15.25, "y": 1.5}, + {"matrix": [1, 15], "x": 16.25, "y": 1.5}, + {"matrix": [1, 16], "x": 17.25, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"matrix": [2, 2], "x": 2.5, "y": 2.5}, + {"matrix": [2, 3], "x": 3.5, "y": 2.5}, + {"matrix": [2, 4], "x": 4.5, "y": 2.5}, + {"matrix": [2, 5], "x": 5.5, "y": 2.5}, + {"matrix": [2, 6], "x": 6.5, "y": 2.5}, + {"matrix": [2, 7], "x": 7.5, "y": 2.5}, + {"matrix": [2, 8], "x": 8.5, "y": 2.5}, + {"matrix": [2, 9], "x": 9.5, "y": 2.5}, + {"matrix": [2, 10], "x": 10.5, "y": 2.5}, + {"matrix": [2, 11], "x": 11.5, "y": 2.5}, + {"matrix": [2, 12], "x": 12.5, "y": 2.5}, + {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.5}, + {"matrix": [2, 15], "x": 16.25, "y": 2.5}, + {"matrix": [2, 16], "x": 17.25, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.5}, + {"matrix": [3, 2], "x": 2.75, "y": 3.5}, + {"matrix": [3, 3], "x": 3.75, "y": 3.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3.5}, + {"matrix": [3, 5], "x": 5.75, "y": 3.5}, + {"matrix": [3, 6], "x": 6.75, "y": 3.5}, + {"matrix": [3, 7], "x": 7.75, "y": 3.5}, + {"matrix": [3, 8], "x": 8.75, "y": 3.5}, + {"matrix": [3, 9], "x": 9.75, "y": 3.5}, + {"matrix": [3, 10], "x": 10.75, "y": 3.5}, + {"matrix": [3, 11], "x": 11.75, "y": 3.5}, + {"matrix": [3, 12], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.5}, + {"matrix": [4, 3], "x": 3.25, "y": 4.5}, + {"matrix": [4, 4], "x": 4.25, "y": 4.5}, + {"matrix": [4, 5], "x": 5.25, "y": 4.5}, + {"matrix": [4, 6], "x": 6.25, "y": 4.5}, + {"matrix": [4, 7], "x": 7.25, "y": 4.5}, + {"matrix": [4, 8], "x": 8.25, "y": 4.5}, + {"matrix": [4, 9], "x": 9.25, "y": 4.5}, + {"matrix": [4, 10], "x": 10.25, "y": 4.5}, + {"matrix": [4, 11], "x": 11.25, "y": 4.5}, + {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.5}, + {"matrix": [4, 15], "x": 16.25, "y": 4.5}, + {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5.5}, + {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.5}, + {"matrix": [5, 6], "x": 4, "y": 5.5, "w": 7}, + {"matrix": [5, 11], "x": 11, "y": 5.5, "w": 1.5}, + {"matrix": [5, 12], "x": 12.5, "y": 5.5}, + {"matrix": [5, 13], "x": 13.5, "y": 5.5, "w": 1.5}, + {"matrix": [5, 14], "x": 15.25, "y": 5.5}, + {"matrix": [5, 15], "x": 16.25, "y": 5.5}, + {"matrix": [5, 16], "x": 17.25, "y": 5.5} + ] + } + } +} diff --git a/keyboards/chill/ghoul/keymaps/default/keymap.c b/keyboards/chill/ghoul/keymaps/default/keymap.c new file mode 100644 index 0000000000..9fb9329eb1 --- /dev/null +++ b/keyboards/chill/ghoul/keymaps/default/keymap.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT_all( + _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, _______, _______, _______, KC_SLEP, _______, _______, _______, + BL_TOGG, BL_UP, BL_DOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/chill/ghoul/mcuconf.h b/keyboards/chill/ghoul/mcuconf.h new file mode 100644 index 0000000000..75267add9b --- /dev/null +++ b/keyboards/chill/ghoul/mcuconf.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM2 +#define STM32_PWM_USE_TIM2 TRUE + +#undef STM32_ST_USE_TIMER +#define STM32_ST_USE_TIMER 14 diff --git a/keyboards/chill/ghoul/readme.md b/keyboards/chill/ghoul/readme.md new file mode 100644 index 0000000000..4dc2b544b8 --- /dev/null +++ b/keyboards/chill/ghoul/readme.md @@ -0,0 +1,27 @@ +# Ghoul TKL + +![image](https://i.imgur.com/Y39mNA4.jpeg) + +A modern replacement PCB for Filco TKLs, adding support for PCB-mount stabilizers and popular alternate layouts. In-switch backlight LEDs are also supported. + +* Keyboard Maintainer: [chillKB](https://github.com/chillKB) +* Hardware Supported: Ghoul TKL PCB +* Hardware Availability: [Open source on GitHub](https://github.com/chillKB/ghoulTKL) + +Make example for this keyboard (after setting up your build environment): + + make chill/ghoul:default + +Flashing example for this keyboard: + + make chill/ghoul: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 top left key (usually Escape) and plug in the keyboard +* **Physical reset button**: Hold the boot button and tap the reset button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From fe2200f73aa5cd96ab4a1914c0b2ad9178d9862f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 31 Dec 2024 12:36:24 +0000 Subject: [PATCH 099/592] Remove invalid "effect_max" animation from keyboards (#24767) --- keyboards/keychron/c1_pro/ansi/white/keyboard.json | 3 +-- keyboards/keychron/c2_pro/ansi/white/keyboard.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keyboards/keychron/c1_pro/ansi/white/keyboard.json b/keyboards/keychron/c1_pro/ansi/white/keyboard.json index 466de1d6e3..806dc25bb5 100644 --- a/keyboards/keychron/c1_pro/ansi/white/keyboard.json +++ b/keyboards/keychron/c1_pro/ansi/white/keyboard.json @@ -119,8 +119,7 @@ "solid_reactive_multinexus": true, "solid_splash": true, "wave_left_right": true, - "wave_up_down": true, - "effect_max": true + "wave_up_down": true }, "layout": [ {"matrix":[0, 0], "flags":1, "x":0, "y":0}, diff --git a/keyboards/keychron/c2_pro/ansi/white/keyboard.json b/keyboards/keychron/c2_pro/ansi/white/keyboard.json index cd05e77aa2..d6e5c745ce 100644 --- a/keyboards/keychron/c2_pro/ansi/white/keyboard.json +++ b/keyboards/keychron/c2_pro/ansi/white/keyboard.json @@ -136,8 +136,7 @@ "solid_reactive_multinexus": true, "solid_splash": true, "wave_left_right": true, - "wave_up_down": true, - "effect_max": true + "wave_up_down": true }, "layout": [ {"matrix":[0, 0], "flags":1, "x":0, "y":0}, From 53680fa6dafb1a82d7e3fecfdc758570f1d3cd61 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 1 Jan 2025 01:58:41 +0000 Subject: [PATCH 100/592] Fix g_led_config parse warning (#24769) --- lib/python/qmk/info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index acf8da984f..38ca89697c 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -789,8 +789,8 @@ def _extract_led_config(info_data, keyboard): info_data[feature]['layout'] = ret except Exception as e: _log_warning(info_data, f'led_config: {file.name}: {e}') - else: - _log_warning(info_data, 'led_config: matrix size required to parse g_led_config') + else: + _log_warning(info_data, 'led_config: matrix size required to parse g_led_config') if info_data[feature].get('layout', None) and not info_data[feature].get('led_count', None): info_data[feature]['led_count'] = len(info_data[feature]['layout']) From 57f89e5388f0f79e27d0e634c9d4621e5a9c214f Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Wed, 1 Jan 2025 13:02:16 +1100 Subject: [PATCH 101/592] [CI] Regenerate Files (#24770) Regenerate Files --- quantum/keycodes.h | 2 +- quantum/keymap_extras/keymap_belgian.h | 2 +- quantum/keymap_extras/keymap_bepo.h | 2 +- quantum/keymap_extras/keymap_brazilian_abnt2.h | 2 +- quantum/keymap_extras/keymap_canadian_french.h | 2 +- quantum/keymap_extras/keymap_canadian_multilingual.h | 2 +- quantum/keymap_extras/keymap_colemak.h | 2 +- quantum/keymap_extras/keymap_croatian.h | 2 +- quantum/keymap_extras/keymap_czech.h | 2 +- quantum/keymap_extras/keymap_czech_mac_ansi.h | 2 +- quantum/keymap_extras/keymap_czech_mac_iso.h | 2 +- quantum/keymap_extras/keymap_danish.h | 2 +- quantum/keymap_extras/keymap_dvorak.h | 2 +- quantum/keymap_extras/keymap_dvorak_fr.h | 2 +- quantum/keymap_extras/keymap_dvorak_programmer.h | 2 +- quantum/keymap_extras/keymap_estonian.h | 2 +- quantum/keymap_extras/keymap_farsi.h | 2 +- quantum/keymap_extras/keymap_finnish.h | 2 +- quantum/keymap_extras/keymap_french.h | 2 +- quantum/keymap_extras/keymap_french_afnor.h | 2 +- quantum/keymap_extras/keymap_french_mac_iso.h | 2 +- quantum/keymap_extras/keymap_german.h | 2 +- quantum/keymap_extras/keymap_german_mac_iso.h | 2 +- quantum/keymap_extras/keymap_greek.h | 2 +- quantum/keymap_extras/keymap_hebrew.h | 2 +- quantum/keymap_extras/keymap_hungarian.h | 2 +- quantum/keymap_extras/keymap_icelandic.h | 2 +- quantum/keymap_extras/keymap_irish.h | 2 +- quantum/keymap_extras/keymap_italian.h | 2 +- quantum/keymap_extras/keymap_italian_mac_ansi.h | 2 +- quantum/keymap_extras/keymap_italian_mac_iso.h | 2 +- quantum/keymap_extras/keymap_japanese.h | 2 +- quantum/keymap_extras/keymap_korean.h | 2 +- quantum/keymap_extras/keymap_latvian.h | 2 +- quantum/keymap_extras/keymap_lithuanian_azerty.h | 2 +- quantum/keymap_extras/keymap_lithuanian_qwerty.h | 2 +- quantum/keymap_extras/keymap_neo2.h | 2 +- quantum/keymap_extras/keymap_nordic.h | 2 +- quantum/keymap_extras/keymap_norman.h | 2 +- quantum/keymap_extras/keymap_norwegian.h | 2 +- quantum/keymap_extras/keymap_plover.h | 2 +- quantum/keymap_extras/keymap_plover_dvorak.h | 2 +- quantum/keymap_extras/keymap_polish.h | 2 +- quantum/keymap_extras/keymap_portuguese.h | 2 +- quantum/keymap_extras/keymap_portuguese_mac_iso.h | 2 +- quantum/keymap_extras/keymap_romanian.h | 2 +- quantum/keymap_extras/keymap_russian.h | 2 +- quantum/keymap_extras/keymap_russian_typewriter.h | 2 +- quantum/keymap_extras/keymap_serbian.h | 2 +- quantum/keymap_extras/keymap_serbian_latin.h | 2 +- quantum/keymap_extras/keymap_slovak.h | 2 +- quantum/keymap_extras/keymap_slovenian.h | 2 +- quantum/keymap_extras/keymap_spanish.h | 2 +- quantum/keymap_extras/keymap_spanish_dvorak.h | 2 +- quantum/keymap_extras/keymap_spanish_latin_america.h | 2 +- quantum/keymap_extras/keymap_swedish.h | 2 +- quantum/keymap_extras/keymap_swedish_mac_ansi.h | 2 +- quantum/keymap_extras/keymap_swedish_mac_iso.h | 2 +- quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h | 2 +- quantum/keymap_extras/keymap_swedish_pro_mac_iso.h | 2 +- quantum/keymap_extras/keymap_swiss_de.h | 2 +- quantum/keymap_extras/keymap_swiss_fr.h | 2 +- quantum/keymap_extras/keymap_turkish_f.h | 2 +- quantum/keymap_extras/keymap_turkish_q.h | 2 +- quantum/keymap_extras/keymap_uk.h | 2 +- quantum/keymap_extras/keymap_ukrainian.h | 2 +- quantum/keymap_extras/keymap_us.h | 2 +- quantum/keymap_extras/keymap_us_extended.h | 2 +- quantum/keymap_extras/keymap_us_international.h | 2 +- quantum/keymap_extras/keymap_us_international_linux.h | 2 +- quantum/keymap_extras/keymap_workman.h | 2 +- quantum/keymap_extras/keymap_workman_zxcvm.h | 2 +- quantum/rgblight/rgblight_breathe_table.h | 2 +- tests/test_common/keycode_table.cpp | 2 +- 74 files changed, 74 insertions(+), 74 deletions(-) diff --git a/quantum/keycodes.h b/quantum/keycodes.h index 921dc7199f..5929e35687 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h index e553894b52..1869e66d9a 100644 --- a/quantum/keymap_extras/keymap_belgian.h +++ b/quantum/keymap_extras/keymap_belgian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index d1886efb10..f2ddb99180 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_brazilian_abnt2.h b/quantum/keymap_extras/keymap_brazilian_abnt2.h index 7dfc2cbb3d..730fe5069f 100644 --- a/quantum/keymap_extras/keymap_brazilian_abnt2.h +++ b/quantum/keymap_extras/keymap_brazilian_abnt2.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_canadian_french.h b/quantum/keymap_extras/keymap_canadian_french.h index 63c9166a31..5771cf6193 100644 --- a/quantum/keymap_extras/keymap_canadian_french.h +++ b/quantum/keymap_extras/keymap_canadian_french.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index baeafa4077..2a4326b406 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h index b1b2fdcf80..0170339aad 100644 --- a/quantum/keymap_extras/keymap_colemak.h +++ b/quantum/keymap_extras/keymap_colemak.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_croatian.h b/quantum/keymap_extras/keymap_croatian.h index 3ed6e29dfb..7e11a85710 100644 --- a/quantum/keymap_extras/keymap_croatian.h +++ b/quantum/keymap_extras/keymap_croatian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_czech.h b/quantum/keymap_extras/keymap_czech.h index ab00f83820..8e65a4ed0a 100644 --- a/quantum/keymap_extras/keymap_czech.h +++ b/quantum/keymap_extras/keymap_czech.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_czech_mac_ansi.h b/quantum/keymap_extras/keymap_czech_mac_ansi.h index ac2f078d98..ed46a78f1c 100644 --- a/quantum/keymap_extras/keymap_czech_mac_ansi.h +++ b/quantum/keymap_extras/keymap_czech_mac_ansi.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_czech_mac_iso.h b/quantum/keymap_extras/keymap_czech_mac_iso.h index 4b56e15df1..08285b7952 100644 --- a/quantum/keymap_extras/keymap_czech_mac_iso.h +++ b/quantum/keymap_extras/keymap_czech_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_danish.h b/quantum/keymap_extras/keymap_danish.h index 9e397af135..a84923007c 100644 --- a/quantum/keymap_extras/keymap_danish.h +++ b/quantum/keymap_extras/keymap_danish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_dvorak.h b/quantum/keymap_extras/keymap_dvorak.h index d83f311e2a..a926e48295 100644 --- a/quantum/keymap_extras/keymap_dvorak.h +++ b/quantum/keymap_extras/keymap_dvorak.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_dvorak_fr.h b/quantum/keymap_extras/keymap_dvorak_fr.h index 6c9ca139d6..6e6498e598 100644 --- a/quantum/keymap_extras/keymap_dvorak_fr.h +++ b/quantum/keymap_extras/keymap_dvorak_fr.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_dvorak_programmer.h b/quantum/keymap_extras/keymap_dvorak_programmer.h index 80f39f56d4..43d9a702bb 100644 --- a/quantum/keymap_extras/keymap_dvorak_programmer.h +++ b/quantum/keymap_extras/keymap_dvorak_programmer.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_estonian.h b/quantum/keymap_extras/keymap_estonian.h index 3b6bf66c5c..3e87bbc5f8 100644 --- a/quantum/keymap_extras/keymap_estonian.h +++ b/quantum/keymap_extras/keymap_estonian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_farsi.h b/quantum/keymap_extras/keymap_farsi.h index d268917513..8e16188a8f 100644 --- a/quantum/keymap_extras/keymap_farsi.h +++ b/quantum/keymap_extras/keymap_farsi.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_finnish.h b/quantum/keymap_extras/keymap_finnish.h index 4c0b78ff60..045f7295a0 100644 --- a/quantum/keymap_extras/keymap_finnish.h +++ b/quantum/keymap_extras/keymap_finnish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index db5a7ac2ff..9ff3694a73 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_french_afnor.h b/quantum/keymap_extras/keymap_french_afnor.h index 894ff4305b..07506e0f6e 100644 --- a/quantum/keymap_extras/keymap_french_afnor.h +++ b/quantum/keymap_extras/keymap_french_afnor.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_french_mac_iso.h b/quantum/keymap_extras/keymap_french_mac_iso.h index 89b16478bc..b036ca2009 100644 --- a/quantum/keymap_extras/keymap_french_mac_iso.h +++ b/quantum/keymap_extras/keymap_french_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index 074f0d321b..7ac807934b 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_german_mac_iso.h b/quantum/keymap_extras/keymap_german_mac_iso.h index 1a50fabf1a..56d077c36c 100644 --- a/quantum/keymap_extras/keymap_german_mac_iso.h +++ b/quantum/keymap_extras/keymap_german_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_greek.h b/quantum/keymap_extras/keymap_greek.h index e21022abbc..0d2e15dfd8 100644 --- a/quantum/keymap_extras/keymap_greek.h +++ b/quantum/keymap_extras/keymap_greek.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_hebrew.h b/quantum/keymap_extras/keymap_hebrew.h index b122eb09ea..a927364737 100644 --- a/quantum/keymap_extras/keymap_hebrew.h +++ b/quantum/keymap_extras/keymap_hebrew.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_hungarian.h b/quantum/keymap_extras/keymap_hungarian.h index 22ae74538c..81a842a0fe 100644 --- a/quantum/keymap_extras/keymap_hungarian.h +++ b/quantum/keymap_extras/keymap_hungarian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_icelandic.h b/quantum/keymap_extras/keymap_icelandic.h index c58e48b22d..8e4e04b0f1 100644 --- a/quantum/keymap_extras/keymap_icelandic.h +++ b/quantum/keymap_extras/keymap_icelandic.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_irish.h b/quantum/keymap_extras/keymap_irish.h index ba23cddc95..6cb85dc7a7 100644 --- a/quantum/keymap_extras/keymap_irish.h +++ b/quantum/keymap_extras/keymap_irish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h index 0317cc5e78..57c12ba9b6 100644 --- a/quantum/keymap_extras/keymap_italian.h +++ b/quantum/keymap_extras/keymap_italian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_italian_mac_ansi.h b/quantum/keymap_extras/keymap_italian_mac_ansi.h index ebf2e1e709..4774c2d5ee 100644 --- a/quantum/keymap_extras/keymap_italian_mac_ansi.h +++ b/quantum/keymap_extras/keymap_italian_mac_ansi.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_italian_mac_iso.h b/quantum/keymap_extras/keymap_italian_mac_iso.h index 327777dd8a..35ec978ef9 100644 --- a/quantum/keymap_extras/keymap_italian_mac_iso.h +++ b/quantum/keymap_extras/keymap_italian_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_japanese.h b/quantum/keymap_extras/keymap_japanese.h index 68a91be18b..3ad9495353 100644 --- a/quantum/keymap_extras/keymap_japanese.h +++ b/quantum/keymap_extras/keymap_japanese.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_korean.h b/quantum/keymap_extras/keymap_korean.h index f759e136bd..644837734e 100644 --- a/quantum/keymap_extras/keymap_korean.h +++ b/quantum/keymap_extras/keymap_korean.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_latvian.h b/quantum/keymap_extras/keymap_latvian.h index 3444e744be..b1750ed759 100644 --- a/quantum/keymap_extras/keymap_latvian.h +++ b/quantum/keymap_extras/keymap_latvian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_lithuanian_azerty.h b/quantum/keymap_extras/keymap_lithuanian_azerty.h index 235989e67b..9d6c1b92f0 100644 --- a/quantum/keymap_extras/keymap_lithuanian_azerty.h +++ b/quantum/keymap_extras/keymap_lithuanian_azerty.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_lithuanian_qwerty.h b/quantum/keymap_extras/keymap_lithuanian_qwerty.h index 58f4381420..84df4c8bd2 100644 --- a/quantum/keymap_extras/keymap_lithuanian_qwerty.h +++ b/quantum/keymap_extras/keymap_lithuanian_qwerty.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index dbeef8d544..ad285f7d18 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index bb66fcf12f..ff952e6c43 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_norman.h b/quantum/keymap_extras/keymap_norman.h index 9938e53efe..166a2f22a1 100644 --- a/quantum/keymap_extras/keymap_norman.h +++ b/quantum/keymap_extras/keymap_norman.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_norwegian.h b/quantum/keymap_extras/keymap_norwegian.h index e50e1ab3bb..0b0cf65813 100644 --- a/quantum/keymap_extras/keymap_norwegian.h +++ b/quantum/keymap_extras/keymap_norwegian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_plover.h b/quantum/keymap_extras/keymap_plover.h index 285eaa0741..a01a23c8a3 100644 --- a/quantum/keymap_extras/keymap_plover.h +++ b/quantum/keymap_extras/keymap_plover.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_plover_dvorak.h b/quantum/keymap_extras/keymap_plover_dvorak.h index 8347b2b20c..0ec7b9acd3 100644 --- a/quantum/keymap_extras/keymap_plover_dvorak.h +++ b/quantum/keymap_extras/keymap_plover_dvorak.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_polish.h b/quantum/keymap_extras/keymap_polish.h index 422c58c1e3..2448ef1fef 100644 --- a/quantum/keymap_extras/keymap_polish.h +++ b/quantum/keymap_extras/keymap_polish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_portuguese.h b/quantum/keymap_extras/keymap_portuguese.h index 6a896de529..9f79862679 100644 --- a/quantum/keymap_extras/keymap_portuguese.h +++ b/quantum/keymap_extras/keymap_portuguese.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_portuguese_mac_iso.h b/quantum/keymap_extras/keymap_portuguese_mac_iso.h index 1a11cfa5ab..5381956b4c 100644 --- a/quantum/keymap_extras/keymap_portuguese_mac_iso.h +++ b/quantum/keymap_extras/keymap_portuguese_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_romanian.h b/quantum/keymap_extras/keymap_romanian.h index 8f90988855..6410fbbe48 100644 --- a/quantum/keymap_extras/keymap_romanian.h +++ b/quantum/keymap_extras/keymap_romanian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_russian.h b/quantum/keymap_extras/keymap_russian.h index 440692345e..364e7aba5c 100644 --- a/quantum/keymap_extras/keymap_russian.h +++ b/quantum/keymap_extras/keymap_russian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_russian_typewriter.h b/quantum/keymap_extras/keymap_russian_typewriter.h index 833311076f..18157726ad 100644 --- a/quantum/keymap_extras/keymap_russian_typewriter.h +++ b/quantum/keymap_extras/keymap_russian_typewriter.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_serbian.h b/quantum/keymap_extras/keymap_serbian.h index fa0e474df8..6421577c22 100644 --- a/quantum/keymap_extras/keymap_serbian.h +++ b/quantum/keymap_extras/keymap_serbian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_serbian_latin.h b/quantum/keymap_extras/keymap_serbian_latin.h index a2038b6df8..358c6c76ed 100644 --- a/quantum/keymap_extras/keymap_serbian_latin.h +++ b/quantum/keymap_extras/keymap_serbian_latin.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_slovak.h b/quantum/keymap_extras/keymap_slovak.h index 08666ef060..a777fce16f 100644 --- a/quantum/keymap_extras/keymap_slovak.h +++ b/quantum/keymap_extras/keymap_slovak.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 31a8c5f9a5..402a53cd44 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index f87eb6b027..714c8cbb7c 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_spanish_dvorak.h b/quantum/keymap_extras/keymap_spanish_dvorak.h index 782f23a5be..b5a6463452 100644 --- a/quantum/keymap_extras/keymap_spanish_dvorak.h +++ b/quantum/keymap_extras/keymap_spanish_dvorak.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_spanish_latin_america.h b/quantum/keymap_extras/keymap_spanish_latin_america.h index 2f11743061..651212d4bf 100644 --- a/quantum/keymap_extras/keymap_spanish_latin_america.h +++ b/quantum/keymap_extras/keymap_spanish_latin_america.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h index a9d015b22e..23ec4102d8 100644 --- a/quantum/keymap_extras/keymap_swedish.h +++ b/quantum/keymap_extras/keymap_swedish.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swedish_mac_ansi.h b/quantum/keymap_extras/keymap_swedish_mac_ansi.h index 36a31220a1..18061f0be9 100644 --- a/quantum/keymap_extras/keymap_swedish_mac_ansi.h +++ b/quantum/keymap_extras/keymap_swedish_mac_ansi.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swedish_mac_iso.h b/quantum/keymap_extras/keymap_swedish_mac_iso.h index 7f085dc16b..0c68ffcbd4 100644 --- a/quantum/keymap_extras/keymap_swedish_mac_iso.h +++ b/quantum/keymap_extras/keymap_swedish_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h b/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h index 20781b2e53..043a7c9fc2 100644 --- a/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h +++ b/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h b/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h index dbbc24ed02..1d691feef1 100644 --- a/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h +++ b/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swiss_de.h b/quantum/keymap_extras/keymap_swiss_de.h index 2cedf23788..5411353a5f 100644 --- a/quantum/keymap_extras/keymap_swiss_de.h +++ b/quantum/keymap_extras/keymap_swiss_de.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_swiss_fr.h b/quantum/keymap_extras/keymap_swiss_fr.h index 347815504b..a9a9cab162 100644 --- a/quantum/keymap_extras/keymap_swiss_fr.h +++ b/quantum/keymap_extras/keymap_swiss_fr.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_turkish_f.h b/quantum/keymap_extras/keymap_turkish_f.h index d9d08adae5..dcf9e815d7 100644 --- a/quantum/keymap_extras/keymap_turkish_f.h +++ b/quantum/keymap_extras/keymap_turkish_f.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_turkish_q.h b/quantum/keymap_extras/keymap_turkish_q.h index 781c406347..a86af180cd 100644 --- a/quantum/keymap_extras/keymap_turkish_q.h +++ b/quantum/keymap_extras/keymap_turkish_q.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index 49237768d4..30f9b972db 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_ukrainian.h b/quantum/keymap_extras/keymap_ukrainian.h index 760cc265ea..d3f82a2194 100644 --- a/quantum/keymap_extras/keymap_ukrainian.h +++ b/quantum/keymap_extras/keymap_ukrainian.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_us.h b/quantum/keymap_extras/keymap_us.h index 9d1c7ad628..74c9b8e7f8 100644 --- a/quantum/keymap_extras/keymap_us.h +++ b/quantum/keymap_extras/keymap_us.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_us_extended.h b/quantum/keymap_extras/keymap_us_extended.h index c8e56cc5a8..d17d3e603e 100644 --- a/quantum/keymap_extras/keymap_us_extended.h +++ b/quantum/keymap_extras/keymap_us_extended.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_us_international.h b/quantum/keymap_extras/keymap_us_international.h index 1b211bd4a6..a9617494a8 100644 --- a/quantum/keymap_extras/keymap_us_international.h +++ b/quantum/keymap_extras/keymap_us_international.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_us_international_linux.h b/quantum/keymap_extras/keymap_us_international_linux.h index 778ab4c899..b13039be05 100644 --- a/quantum/keymap_extras/keymap_us_international_linux.h +++ b/quantum/keymap_extras/keymap_us_international_linux.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_workman.h b/quantum/keymap_extras/keymap_workman.h index 31bd953d7f..29396fdec1 100644 --- a/quantum/keymap_extras/keymap_workman.h +++ b/quantum/keymap_extras/keymap_workman.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/keymap_extras/keymap_workman_zxcvm.h b/quantum/keymap_extras/keymap_workman_zxcvm.h index f05c89adb8..f7a5689f0f 100644 --- a/quantum/keymap_extras/keymap_workman_zxcvm.h +++ b/quantum/keymap_extras/keymap_workman_zxcvm.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/quantum/rgblight/rgblight_breathe_table.h b/quantum/rgblight/rgblight_breathe_table.h index 147b1bf09a..5a8181c7d4 100644 --- a/quantum/rgblight/rgblight_breathe_table.h +++ b/quantum/rgblight/rgblight_breathe_table.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* diff --git a/tests/test_common/keycode_table.cpp b/tests/test_common/keycode_table.cpp index ae1a9edcd0..26d0919619 100644 --- a/tests/test_common/keycode_table.cpp +++ b/tests/test_common/keycode_table.cpp @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* From d5a042498770050a3d2f002540413ba14dfaf8d1 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Wed, 1 Jan 2025 13:22:28 +1100 Subject: [PATCH 102/592] [CI] Regenerate Files (#24772) Regenerate Files --- quantum/keymap_extras/keymap_eurkey.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/keymap_extras/keymap_eurkey.h b/quantum/keymap_extras/keymap_eurkey.h index 80e0113fa6..20f7f58683 100644 --- a/quantum/keymap_extras/keymap_eurkey.h +++ b/quantum/keymap_extras/keymap_eurkey.h @@ -1,4 +1,4 @@ -// Copyright 2024 QMK +// Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* From 8157b374387171d97f4eb03cae6e6c3e07613d61 Mon Sep 17 00:00:00 2001 From: David Hoelscher Date: Thu, 2 Jan 2025 01:10:07 -0600 Subject: [PATCH 103/592] always return audio pin to 0 on ARM (#24503) --- platforms/chibios/drivers/audio_pwm_hardware.c | 18 +++++++++++------- quantum/audio/audio.c | 5 ++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/platforms/chibios/drivers/audio_pwm_hardware.c b/platforms/chibios/drivers/audio_pwm_hardware.c index 1ba7ec13bc..afa341abb6 100644 --- a/platforms/chibios/drivers/audio_pwm_hardware.c +++ b/platforms/chibios/drivers/audio_pwm_hardware.c @@ -41,18 +41,19 @@ static float channel_1_frequency = 0.0f; void channel_1_set_frequency(float freq) { channel_1_frequency = freq; + pwmcnt_t period; + pwmcnt_t width; if (freq <= 0.0) { - // a pause/rest has freq=0 - return; + period = 2; + width = 0; + } else { + period = (pwmCFG.frequency / freq); + width = (pwmcnt_t)(((period) * (pwmcnt_t)((100 - note_timbre) * 100)) / (pwmcnt_t)(10000)); } - - pwmcnt_t period = (pwmCFG.frequency / freq); chSysLockFromISR(); pwmChangePeriodI(&AUDIO_PWM_DRIVER, period); - pwmEnableChannelI(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1, - // adjust the duty-cycle so that the output is for 'note_timbre' duration HIGH - PWM_PERCENTAGE_TO_WIDTH(&AUDIO_PWM_DRIVER, (100 - note_timbre) * 100)); + pwmEnableChannelI(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1, width); chSysUnlockFromISR(); } @@ -67,6 +68,9 @@ void channel_1_start(void) { void channel_1_stop(void) { pwmStop(&AUDIO_PWM_DRIVER); + pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG); + pwmEnableChannel(&AUDIO_PWM_DRIVER, AUDIO_PWM_CHANNEL - 1, 0); + pwmStop(&AUDIO_PWM_DRIVER); } static virtual_timer_t audio_vt; diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index b2611c5f09..2cc3c2d661 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -258,11 +258,10 @@ void audio_stop_tone(float pitch) { for (int i = AUDIO_TONE_STACKSIZE - 1; i >= 0; i--) { found = (tones[i].pitch == pitch); if (found) { - tones[i] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0}; for (int j = i; (j < AUDIO_TONE_STACKSIZE - 1); j++) { - tones[j] = tones[j + 1]; - tones[j + 1] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0}; + tones[j] = tones[j + 1]; } + tones[AUDIO_TONE_STACKSIZE - 1] = (musical_tone_t){.time_started = 0, .pitch = -1.0f, .duration = 0}; break; } } From cf975e2bfa9fc5315cff1eb82498e7184a87feb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:10:34 +0800 Subject: [PATCH 104/592] Update Starlight matrix effects (#24521) --- .../rgb_matrix/animations/starlight_anim.h | 29 ++++++++++------- .../animations/starlight_dual_hue_anim.h | 31 ++++++++++++------- .../animations/starlight_dual_sat_anim.h | 31 ++++++++++++------- 3 files changed, 56 insertions(+), 35 deletions(-) diff --git a/quantum/rgb_matrix/animations/starlight_anim.h b/quantum/rgb_matrix/animations/starlight_anim.h index 742e843b57..c4f943c5ce 100644 --- a/quantum/rgb_matrix/animations/starlight_anim.h +++ b/quantum/rgb_matrix/animations/starlight_anim.h @@ -2,7 +2,9 @@ RGB_MATRIX_EFFECT(STARLIGHT) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS -void set_starlight_color(uint8_t i, effect_params_t* params) { +static void set_starlight_color(uint8_t i, effect_params_t* params) { + if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; + uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8); hsv_t hsv = rgb_matrix_config.hsv; hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); @@ -11,21 +13,26 @@ void set_starlight_color(uint8_t i, effect_params_t* params) { } bool STARLIGHT(effect_params_t* params) { - if (!params->init) { - if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) { - uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT); - set_starlight_color(rand_led, params); - } - return false; + static uint16_t index = RGB_MATRIX_LED_COUNT + 1; + + // Periodic trigger for LED change + if ((params->iter == 0) && (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0)) { + index = random8_max(RGB_MATRIX_LED_COUNT); } RGB_MATRIX_USE_LIMITS(led_min, led_max); - for (uint8_t i = led_min; i < led_max; i++) { - RGB_MATRIX_TEST_LED_FLAGS(); - set_starlight_color(i, params); + if (params->init) { + for (uint8_t i = led_min; i < led_max; i++) { + set_starlight_color(i, params); + } + } + // Change LED once and set index out of range till next trigger + else if (led_min <= index && index < led_max) { + set_starlight_color(index, params); + index = RGB_MATRIX_LED_COUNT + 1; } return rgb_matrix_check_finished_leds(led_max); } # endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS -#endif // ENABLE_RGB_MATRIX_STARLIGHT \ No newline at end of file +#endif // ENABLE_RGB_MATRIX_STARLIGHT diff --git a/quantum/rgb_matrix/animations/starlight_dual_hue_anim.h b/quantum/rgb_matrix/animations/starlight_dual_hue_anim.h index 50ce5d6ab4..276b8c3fdf 100644 --- a/quantum/rgb_matrix/animations/starlight_dual_hue_anim.h +++ b/quantum/rgb_matrix/animations/starlight_dual_hue_anim.h @@ -2,31 +2,38 @@ RGB_MATRIX_EFFECT(STARLIGHT_DUAL_HUE) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS -void set_starlight_dual_hue_color(uint8_t i, effect_params_t* params) { +static void set_starlight_dual_hue_color(uint8_t i, effect_params_t* params) { + if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; + uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8); hsv_t hsv = rgb_matrix_config.hsv; hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); - hsv.h = hsv.h + random8_max((30 + 1 - -30) + -30); + hsv.h = hsv.h + random8_max(31); rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); } bool STARLIGHT_DUAL_HUE(effect_params_t* params) { - if (!params->init) { - if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) { - uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT); - set_starlight_dual_hue_color(rand_led, params); - } - return false; + static uint16_t index = RGB_MATRIX_LED_COUNT + 1; + + // Periodic trigger for LED change + if ((params->iter == 0) && (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0)) { + index = random8_max(RGB_MATRIX_LED_COUNT); } RGB_MATRIX_USE_LIMITS(led_min, led_max); - for (uint8_t i = led_min; i < led_max; i++) { - RGB_MATRIX_TEST_LED_FLAGS(); - set_starlight_dual_hue_color(i, params); + if (params->init) { + for (uint8_t i = led_min; i < led_max; i++) { + set_starlight_dual_hue_color(i, params); + } + } + // Change LED once and set index out of range till next trigger + else if (led_min <= index && index < led_max) { + set_starlight_dual_hue_color(index, params); + index = RGB_MATRIX_LED_COUNT + 1; } return rgb_matrix_check_finished_leds(led_max); } # endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS -#endif // ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE \ No newline at end of file +#endif // ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE diff --git a/quantum/rgb_matrix/animations/starlight_dual_sat_anim.h b/quantum/rgb_matrix/animations/starlight_dual_sat_anim.h index 6def4eea09..e063658982 100644 --- a/quantum/rgb_matrix/animations/starlight_dual_sat_anim.h +++ b/quantum/rgb_matrix/animations/starlight_dual_sat_anim.h @@ -2,31 +2,38 @@ RGB_MATRIX_EFFECT(STARLIGHT_DUAL_SAT) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS -void set_starlight_dual_sat_color(uint8_t i, effect_params_t* params) { +static void set_starlight_dual_sat_color(uint8_t i, effect_params_t* params) { + if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; + uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8); hsv_t hsv = rgb_matrix_config.hsv; hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v); - hsv.s = hsv.s + random8_max((30 + 1 - -30) + -30); + hsv.s = hsv.s + random8_max(31); rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); } bool STARLIGHT_DUAL_SAT(effect_params_t* params) { - if (!params->init) { - if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0) { - uint8_t rand_led = random8_max(RGB_MATRIX_LED_COUNT); - set_starlight_dual_sat_color(rand_led, params); - } - return false; + static uint16_t index = RGB_MATRIX_LED_COUNT + 1; + + // Periodic trigger for LED change + if ((params->iter == 0) && (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 5)) % 5 == 0)) { + index = random8_max(RGB_MATRIX_LED_COUNT); } RGB_MATRIX_USE_LIMITS(led_min, led_max); - for (uint8_t i = led_min; i < led_max; i++) { - RGB_MATRIX_TEST_LED_FLAGS(); - set_starlight_dual_sat_color(i, params); + if (params->init) { + for (uint8_t i = led_min; i < led_max; i++) { + set_starlight_dual_sat_color(i, params); + } + } + // Change LED once and set index out of range till next trigger + else if (led_min <= index && index < led_max) { + set_starlight_dual_sat_color(index, params); + index = RGB_MATRIX_LED_COUNT + 1; } return rgb_matrix_check_finished_leds(led_max); } # endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS -#endif // ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT \ No newline at end of file +#endif // ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT From c53d02d511ef9c3b42097123749895a91536bcdd Mon Sep 17 00:00:00 2001 From: David Hoelscher Date: Thu, 2 Jan 2025 01:11:10 -0600 Subject: [PATCH 105/592] Ensure timer_read() is safe to call from interrupt handlers on ARM (#24529) --- platforms/chibios/timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/chibios/timer.c b/platforms/chibios/timer.c index 4a347b445d..a07cf5714f 100644 --- a/platforms/chibios/timer.c +++ b/platforms/chibios/timer.c @@ -99,7 +99,7 @@ uint16_t timer_read(void) { } uint32_t timer_read32(void) { - chSysLock(); + syssts_t sts = chSysGetStatusAndLockX(); uint32_t ticks = get_system_time_ticks() - ticks_offset; if (ticks < last_ticks) { // The 32-bit tick counter overflowed and wrapped around. We cannot just extend the counter to 64 bits here, @@ -114,7 +114,7 @@ uint32_t timer_read32(void) { } last_ticks = ticks; uint32_t ms_offset_copy = ms_offset; // read while still holding the lock to ensure a consistent value - chSysUnlock(); + chSysRestoreStatusX(sts); return (uint32_t)TIME_I2MS(ticks) + ms_offset_copy; } From e016b9b4c5c28b4a0a7ae2fbb7cbe7e090169438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:11:28 +0800 Subject: [PATCH 106/592] Update Raindrops effect to respect LED range limits (#24531) --- .../rgb_matrix/animations/raindrops_anim.h | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/quantum/rgb_matrix/animations/raindrops_anim.h b/quantum/rgb_matrix/animations/raindrops_anim.h index a682156da2..d4f79adb56 100644 --- a/quantum/rgb_matrix/animations/raindrops_anim.h +++ b/quantum/rgb_matrix/animations/raindrops_anim.h @@ -2,35 +2,42 @@ RGB_MATRIX_EFFECT(RAINDROPS) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS -static void raindrops_set_color(int i, effect_params_t* params) { +static void raindrops_set_color(uint8_t i, effect_params_t* params) { if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return; - hsv_t hsv = {0, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v}; + hsv_t hsv = rgb_matrix_config.hsv; // Take the shortest path between hues - int16_t deltaH = ((rgb_matrix_config.hsv.h + 180) % 360 - rgb_matrix_config.hsv.h) / 4; + int16_t deltaH = ((hsv.h + 180) % 360 - hsv.h) / 4; if (deltaH > 127) { deltaH -= 256; } else if (deltaH < -127) { deltaH += 256; } - hsv.h = rgb_matrix_config.hsv.h + (deltaH * (random8() & 0x03)); + hsv.h += (deltaH * random8_max(3)); rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); } bool RAINDROPS(effect_params_t* params) { + static uint16_t index = RGB_MATRIX_LED_COUNT + 1; + + // Periodic trigger for LED change + if ((params->iter == 0) && (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0)) { + index = random8_max(RGB_MATRIX_LED_COUNT); + } + RGB_MATRIX_USE_LIMITS(led_min, led_max); - if (!params->init) { - // Change one LED every tick, make sure speed is not 0 - if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0) { - raindrops_set_color(random8_max(RGB_MATRIX_LED_COUNT), params); - } - } else { - for (int i = led_min; i < led_max; i++) { + if (params->init) { + for (uint8_t i = led_min; i < led_max; i++) { raindrops_set_color(i, params); } } + // Change LED once and set index out of range till next trigger + else if (led_min <= index && index < led_max) { + raindrops_set_color(index, params); + index = RGB_MATRIX_LED_COUNT + 1; + } return rgb_matrix_check_finished_leds(led_max); } From b603094995fad1498204cbabdb47b85e76780446 Mon Sep 17 00:00:00 2001 From: Will Spooner <106878670+willbsp@users.noreply.github.com> Date: Thu, 2 Jan 2025 07:12:58 +0000 Subject: [PATCH 107/592] Add leader_add_user callback (#24266) --- docs/features/leader_key.md | 15 +++++++++++++++ quantum/leader.c | 7 +++++++ quantum/leader.h | 9 +++++++++ 3 files changed, 31 insertions(+) diff --git a/docs/features/leader_key.md b/docs/features/leader_key.md index a36e630a36..9f9086e1ae 100644 --- a/docs/features/leader_key.md +++ b/docs/features/leader_key.md @@ -154,6 +154,21 @@ User callback, invoked when the leader sequence ends. --- +### `bool leader_add_user(uint16_t keycode)` {#api-leader-add-user} + +User callback, invoked when a keycode is added to the leader sequence. + +#### Arguments {#api-leader-add-user-arguments} + + - `uint16_t keycode` + The keycode to added to the leader sequence. + +#### Return Value {#api-leader-add-user-return} + +`true` to finish the key sequence, `false` to continue. + +--- + ### `void leader_start(void)` {#api-leader-start} Begin the leader sequence, resetting the buffer and timer. diff --git a/quantum/leader.c b/quantum/leader.c index 272609ad0c..23e5e8cd6d 100644 --- a/quantum/leader.c +++ b/quantum/leader.c @@ -21,6 +21,10 @@ __attribute__((weak)) void leader_start_user(void) {} __attribute__((weak)) void leader_end_user(void) {} +__attribute__((weak)) bool leader_add_user(uint16_t keycode) { + return false; +} + void leader_start(void) { if (leading) { return; @@ -61,6 +65,9 @@ bool leader_sequence_add(uint16_t keycode) { leader_sequence[leader_sequence_size] = keycode; leader_sequence_size++; + if (leader_add_user(keycode)) { + leader_end(); + } return true; } diff --git a/quantum/leader.h b/quantum/leader.h index 3177fcd196..fba6b287ba 100644 --- a/quantum/leader.h +++ b/quantum/leader.h @@ -21,6 +21,15 @@ void leader_start_user(void); */ void leader_end_user(void); +/** + * \brief User callback, invoked when a keycode is added to the leader sequence. + * + * \param keycode The keycode added to the leader sequence. + * + * \return `true` to finish the key sequence, `false` to continue. + */ +bool leader_add_user(uint16_t keycode); + /** * Begin the leader sequence, resetting the buffer and timer. */ From c23e64f551cc561a6590ab0c193ca11a5cd24d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:23:41 +0800 Subject: [PATCH 108/592] Refactor Hue Breathing matrix effect with runner (#24525) --- .../animations/hue_breathing_anim.h | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/quantum/rgb_matrix/animations/hue_breathing_anim.h b/quantum/rgb_matrix/animations/hue_breathing_anim.h index 5316e92dbd..60d7426cfc 100644 --- a/quantum/rgb_matrix/animations/hue_breathing_anim.h +++ b/quantum/rgb_matrix/animations/hue_breathing_anim.h @@ -2,21 +2,17 @@ RGB_MATRIX_EFFECT(HUE_BREATHING) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS -// Change huedelta to adjust range of hue change. 0-255. // Hue Breathing - All LED's light up +hsv_t HUE_BREATHING_math(hsv_t hsv, uint8_t i, uint8_t time) { + // Adjust delta between 0-255 to change hue range + uint8_t delta = 12; + hsv.h = hsv.h + scale8(abs8(sin8(time / 2) - 128) * 2, delta); + return hsv; +} + bool HUE_BREATHING(effect_params_t* params) { - RGB_MATRIX_USE_LIMITS(led_min, led_max); - uint8_t huedelta = 12; - hsv_t hsv = rgb_matrix_config.hsv; - uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8); - hsv.h = hsv.h + scale8(abs8(sin8(time) - 128) * 2, huedelta); - rgb_t rgb = hsv_to_rgb(hsv); - for (uint8_t i = led_min; i < led_max; i++) { - RGB_MATRIX_TEST_LED_FLAGS(); - rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); - } - return rgb_matrix_check_finished_leds(led_max); + return effect_runner_i(params, &HUE_BREATHING_math); } # endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS -#endif // DISABLE_RGB_HUE_BREATHING +#endif // ENABLE_RGB_MATRIX_HUE_BREATHING From ac140e563c422787f846a0ff6d9ca211213a41a2 Mon Sep 17 00:00:00 2001 From: Tocho Tochev Date: Thu, 2 Jan 2025 11:45:26 +0000 Subject: [PATCH 109/592] Fix link to TMK magic commands (#24773) --- docs/faq_debug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq_debug.md b/docs/faq_debug.md index 36374974df..35a4160e27 100644 --- a/docs/faq_debug.md +++ b/docs/faq_debug.md @@ -129,7 +129,7 @@ needed for older distros. ## Can't Get Message on Console Check: - *hid_listen* finds your device. See above. -- Enable debug by pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard#magic-commands). +- Enable debug by pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard/wiki#magic-commands-for-debug). - Set `debug_enable=true`. See [Debugging](#debugging) - Try using `print` function instead of debug print. See **common/print.h**. - Disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97). From 172c3496756fb5468c778c2536b4334f25eb883b Mon Sep 17 00:00:00 2001 From: Philip <68480429+iliorik@users.noreply.github.com> Date: Thu, 2 Jan 2025 14:50:43 +0300 Subject: [PATCH 110/592] [Keyboard] Add handwired/dactyl_manuform/5x8 (#24726) * add handwired/dactyl_manuform/5x8 config * add keymap scheme * Update keymap.c * Update keyboard.json * Update keyboard.json * fix and compile worked configs * Update readme.md * Update readme.md * Update readme.md * add dynamic macros support * change key sets on first workday/add right2left layer * Update keyboard.json * Update keymap.c * move license header to top keymap.c * Update keyboard.json * I rewrote the layout so that the halves are not stacked. * I rewrote the layout so that the halves are not stacked (keymap.c) * change "serial pin" syntactic change "soft_serial_pin": "D0" to "serial": { "pin": "D0" } * fix KC_BSPC and KC_SPC on right keyboard * Update readme.md * Update keymap.c Co-authored-by: Drashna Jaelre * Update keymap.c Co-authored-by: Drashna Jaelre --------- Co-authored-by: skandiPC Co-authored-by: iliorik-ph <140731596+iliorik-ph@users.noreply.github.com> Co-authored-by: Drashna Jaelre --- .../dactyl_manuform/5x8/keyboard.json | 137 ++++++++++++++++++ .../5x8/keymaps/default/keymap.c | 84 +++++++++++ .../5x8/keymaps/default/rules.mk | 1 + .../handwired/dactyl_manuform/5x8/readme.md | 25 ++++ 4 files changed, 247 insertions(+) create mode 100644 keyboards/handwired/dactyl_manuform/5x8/keyboard.json create mode 100644 keyboards/handwired/dactyl_manuform/5x8/keymaps/default/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform/5x8/keymaps/default/rules.mk create mode 100644 keyboards/handwired/dactyl_manuform/5x8/readme.md diff --git a/keyboards/handwired/dactyl_manuform/5x8/keyboard.json b/keyboards/handwired/dactyl_manuform/5x8/keyboard.json new file mode 100644 index 0000000000..24ac4924ac --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x8/keyboard.json @@ -0,0 +1,137 @@ +{ + "keyboard_name": "Dactyl-Manuform (5x8)", + "manufacturer": "tshort", + "url": "", + "maintainer": "qmk", + "usb": { + "vid": "0x444D", + "pid": "0x3537", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "matrix_pins": { + "cols": ["B6", "B2", "B3", "B1", "F7", "F6", "F5", "F4"], + "rows": ["D4", "C6", "D7", "E6", "B4", "B5"] + }, + "diode_direction": "COL2ROW", + "split": { + "enabled": true, + "serial": { + "pin": "D0" + } + }, + "development_board": "promicro", + "layouts": { + "LAYOUT_5x8": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.5}, + {"matrix": [0, 1], "x": 1, "y": 0.5}, + {"matrix": [0, 2], "x": 2, "y": 0.5}, + {"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": [6, 7], "x": 17, "y": 0.5}, + {"matrix": [6, 6], "x": 16, "y": 0.5}, + {"matrix": [6, 5], "x": 15, "y": 0.5}, + {"matrix": [6, 4], "x": 14, "y": 0}, + {"matrix": [6, 3], "x": 13, "y": 0}, + {"matrix": [6, 2], "x": 12, "y": 0}, + {"matrix": [6, 1], "x": 11, "y": 0}, + {"matrix": [6, 0], "x": 10, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + + {"matrix": [7, 7], "x": 17, "y": 1.5}, + {"matrix": [7, 6], "x": 16, "y": 1.5}, + {"matrix": [7, 5], "x": 15, "y": 1.5}, + {"matrix": [7, 4], "x": 14, "y": 1}, + {"matrix": [7, 3], "x": 13, "y": 1}, + {"matrix": [7, 2], "x": 12, "y": 1}, + {"matrix": [7, 1], "x": 11, "y": 1}, + {"matrix": [7, 0], "x": 10, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2.5}, + {"matrix": [2, 1], "x": 1, "y": 2.5}, + {"matrix": [2, 2], "x": 2, "y": 2.5}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + + {"matrix": [8, 7], "x": 17, "y": 2.5}, + {"matrix": [8, 6], "x": 16, "y": 2.5}, + {"matrix": [8, 5], "x": 15, "y": 2.5}, + {"matrix": [8, 4], "x": 14, "y": 2}, + {"matrix": [8, 3], "x": 13, "y": 2}, + {"matrix": [8, 2], "x": 12, "y": 2}, + {"matrix": [8, 1], "x": 11, "y": 2}, + {"matrix": [8, 0], "x": 10, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3.5}, + {"matrix": [3, 1], "x": 1, "y": 3.5}, + {"matrix": [3, 2], "x": 2, "y": 3.5}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + + {"matrix": [9, 6], "x": 17, "y": 3.5}, + {"matrix": [9, 5], "x": 16, "y": 3.5}, + {"matrix": [9, 4], "x": 15, "y": 3.5}, + {"matrix": [9, 3], "x": 14, "y": 3}, + {"matrix": [9, 2], "x": 13, "y": 3}, + {"matrix": [9, 1], "x": 12, "y": 3}, + {"matrix": [9, 0], "x": 11, "y": 3}, + + {"matrix": [4, 1], "x": 1, "y": 4.5}, + {"matrix": [4, 2], "x": 2, "y": 4.5}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + + {"matrix": [10, 4], "x": 14, "y": 4}, + {"matrix": [10, 3], "x": 13, "y": 4}, + {"matrix": [10, 2], "x": 12, "y": 5}, + {"matrix": [10, 1], "x": 11, "y": 5}, + + {"matrix": [4, 5], "x": 4.5, "y": 5}, + {"matrix": [4, 6], "x": 5.5, "y": 5}, + + {"matrix": [10, 6], "x": 14.5, "y": 4.5}, + {"matrix": [10, 5], "x": 15.5, "y": 4.5}, + + {"matrix": [5, 5], "x": 5, "y": 6}, + {"matrix": [5, 6], "x": 6, "y": 6}, + + {"matrix": [11, 6], "x": 12, "y": 6}, + {"matrix": [11, 5], "x": 11, "y": 6}, + + {"matrix": [5, 3], "x": 5, "y": 7}, + {"matrix": [5, 4], "x": 6, "y": 7}, + + {"matrix": [11, 4], "x": 12, "y": 7}, + {"matrix": [11, 3], "x": 11, "y": 7} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/keymap.c new file mode 100644 index 0000000000..d038173db0 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/keymap.c @@ -0,0 +1,84 @@ +/* Copyright 2024 Philip Slinkin (s.philya@gmail.com) + * + * 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 + +enum layers { + _QWERTY, + _RIGHT2LEFT +}; + +/* Base (qwerty) + * ,-------------------------------------------------------, ,-------------------------------------------------------, + * | Esc | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | \ | BS | + * |------+------+------+------+------+------+------+------| |------+------+------+------+------+------+------+------| + * |M_RSTP| Tab | q | w | e | r | t |QKBOOT| | F8 | y | u | i | o | p | [ | ] | + * |------+------+------+------+------+------+------+------| |------+------+------+------+------+------+------+------| + * |M_REC1| Caps | a | s | d | f | g | F7 | | F9 | h | j | k | l | ; | " |ENTER | + * |------+------+------+------+------+------+------+------' '------+------+------+------+------+------+------+------| + * |M_REC2| Shift| z | x | c | v | b | | n | m | , | . | / |Shift | Ctrl | + * '------+------+------+------+------+------+------' '------+------+------+------+------+------+------' + * | Ctrl | Wint | Alt | INS | | Up | Down | Left | Right| + * '------+------+------+------+------, ,------+------+------+------+------' + * | TT(1)|SPACE | | SPACE| BS | + * '------+------+------' ,------+------+------' + * | ESC |ENTER | | HOME | END | + * '------+------' '------+------' + * | DEL | F2 | | PGUP | PGDN | + * '------+------' '------+------' + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_5x8( + KC_ESC, 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_BSLS, KC_BSPC, + DM_RSTP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, QK_BOOT, KC_F8, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, + DM_REC1, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F7, KC_F9, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + DM_REC2, 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_RCTL, + KC_LCTL, KC_LGUI, KC_LALT, KC_INS, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT, + TT(1), KC_SPC, KC_SPC, KC_BSPC, + KC_ESC, KC_ENT, KC_HOME, KC_END, + KC_DEL, KC_F2, KC_PGUP, KC_PGDN + ), +/* Base (right to left on hold button) + * ,-------------------------------------------------------, ,-------------------------------------------------------, + * | BS | \ | = | - | 0 | 9 | 8 | 7 | | | | | | | | | | + * |------+------+------+------+------+------+------+------| |------+------+------+------+------+------+------+------| + * | [ | ] | p | o | i | u | y |QKBOOT| | | | | | | | | | + * |------+------+------+------+------+------+------+------| |------+------+------+------+------+------+------+------| + * |M_PLY1| " | ; | l | k | j | h |PRSCRN| | | | Left | Down | Up | Right| |ENTER | + * |------+------+------+------+------+------+------+------' '------+------+------+------+------+------+------+------| + * |M_PLY2|MShift| / | . | , | m | n | | | | | | | | | + * |------+------+------+------+------+------+------' '------+------+------+------+------+------+------' + * |MCtrl | MAlt | DEL | BS | | | | | | + * '------+------+------+------+------, ,------+------+------+------+------' + * | |SPACE | | SPACE| BS | + * '------+------+------' ,------+------+------' + * | END |ENTER | | HOME | END | + * '------+------' '------+------' + * | PGDN | PGUP | | PGUP | PGDN | + * '------+------' '------+------' + */ + + [_RIGHT2LEFT] = LAYOUT_5x8( + KC_BSPC, KC_BSLS, KC_EQL, KC_MINS, KC_0, KC_9, KC_8, KC_7, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSPC, + KC_RBRC, KC_LBRC, KC_P, KC_O, KC_I, KC_U, KC_Y, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + DM_PLY1, KC_QUOT, KC_SCLN, KC_L, KC_K, KC_J, KC_H, KC_PSCR, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCLN, KC_NO, KC_ENT, + DM_PLY2, OSM(MOD_LSFT), KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + OSM(MOD_LCTL), OSM(MOD_LALT), KC_DEL, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_SPC, KC_SPC, KC_BSPC, + KC_ESC, KC_ENT, KC_HOME, KC_END, + KC_DEL, KC_F2, KC_PGUP, KC_PGDN + ), +}; diff --git a/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/rules.mk b/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/rules.mk new file mode 100644 index 0000000000..9e6797ed30 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x8/keymaps/default/rules.mk @@ -0,0 +1 @@ +DYNAMIC_MACRO_ENABLE = yes diff --git a/keyboards/handwired/dactyl_manuform/5x8/readme.md b/keyboards/handwired/dactyl_manuform/5x8/readme.md new file mode 100644 index 0000000000..0ada7e92b6 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x8/readme.md @@ -0,0 +1,25 @@ +# handwired/dactyl_manuform/5x8 + +![Dactyl_manuform 5x8](https://i.imgur.com/DtawD9r.jpeg) + +* Keyboard Maintainer: [iliorik](https://github.com/iliorik) + +I made this keyboard so that the buttons on the right side of the right half would replicate the standard keyboard. +I put macros on the left buttons of the left side keyboard for rec and play keypresses + +Make example for this keyboard (after setting up your build environment): + + make handwired/dactyl_manuform/5x8:default + +Flashing example for this keyboard: + + make handwired/dactyl_manuform/5x8: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: + +* **Keycode in layout**: Press the key mapped to `QK_BOOT` +* **Reset pro micro**: Connect RST and GND pins on plate From 43800d79341d45e8ca5d5deb00e9825263b7e57b Mon Sep 17 00:00:00 2001 From: "Juho T." Date: Thu, 2 Jan 2025 14:07:38 +0200 Subject: [PATCH 111/592] Add Silakka54 keyboard (#24757) * Added new keyboard Silakka54 * Update keyboards/silakka54/config.h Co-authored-by: jack * Update keyboards/silakka54/keyboard.json Co-authored-by: jack * Delete keyboards/silakka54/rules.mk * Update keyboards/silakka54/keyboard.json Co-authored-by: Drashna Jaelre * Update keyboards/silakka54/config.h Co-authored-by: Drashna Jaelre * Update readme.md Fixed small typo, "inpired" to "inspired" --------- Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/silakka54/config.h | 25 +++++ keyboards/silakka54/keyboard.json | 102 +++++++++++++++++++ keyboards/silakka54/keymaps/default/keymap.c | 22 ++++ keyboards/silakka54/readme.md | 26 +++++ 4 files changed, 175 insertions(+) create mode 100644 keyboards/silakka54/config.h create mode 100644 keyboards/silakka54/keyboard.json create mode 100644 keyboards/silakka54/keymaps/default/keymap.c create mode 100644 keyboards/silakka54/readme.md diff --git a/keyboards/silakka54/config.h b/keyboards/silakka54/config.h new file mode 100644 index 0000000000..220b85cd08 --- /dev/null +++ b/keyboards/silakka54/config.h @@ -0,0 +1,25 @@ +/* Copyright 2024 Juho T. (@Squalius-cephalus) + * + * 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 SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP0 +#define SERIAL_USART_RX_PIN GP1 + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 diff --git a/keyboards/silakka54/keyboard.json b/keyboards/silakka54/keyboard.json new file mode 100644 index 0000000000..e1ad9aac9e --- /dev/null +++ b/keyboards/silakka54/keyboard.json @@ -0,0 +1,102 @@ +{ + "manufacturer": "Squalius-cephalus", + "keyboard_name": "silakka54", + "maintainer": "Squalius-cephalus", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "split": { + "enabled": true, + "serial": { + "driver": "vendor" + } + }, + "matrix_pins": { + "cols": ["GP7", "GP8", "GP9", "GP10", "GP11", "GP12"], + "rows": ["GP2", "GP3", "GP4", "GP5","GP6"] + }, + "processor": "RP2040", + "url": "https://github.com/Squalius-cephalus/silakka54", + "usb": { + "device_version": "1.0.0", + "pid": "0x1212", + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + + {"matrix": [5, 5], "x": 0, "y": 5}, + {"matrix": [5, 4], "x": 1, "y": 5}, + {"matrix": [5, 3], "x": 2, "y": 5}, + {"matrix": [5, 2], "x": 3, "y": 5}, + {"matrix": [5, 1], "x": 4, "y": 5}, + {"matrix": [5, 0], "x": 5, "y": 5}, + + + {"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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [6, 5], "x": 0, "y": 6}, + {"matrix": [6, 4], "x": 1, "y": 6}, + {"matrix": [6, 3], "x": 2, "y": 6}, + {"matrix": [6, 2], "x": 3, "y": 6}, + {"matrix": [6, 1], "x": 4, "y": 6}, + {"matrix": [6, 0], "x": 5, "y": 6}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [7, 5], "x": 0, "y": 7}, + {"matrix": [7, 4], "x": 1, "y": 7}, + {"matrix": [7, 3], "x": 2, "y": 7}, + {"matrix": [7, 2], "x": 3, "y": 7}, + {"matrix": [7, 1], "x": 4, "y": 7}, + {"matrix": [7, 0], "x": 5, "y": 7}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + + {"matrix": [8, 5], "x": 0, "y": 9}, + {"matrix": [8, 4], "x": 1, "y": 9}, + {"matrix": [8, 3], "x": 2, "y": 9}, + {"matrix": [8, 2], "x": 3, "y": 9}, + {"matrix": [8, 1], "x": 4, "y": 9}, + {"matrix": [8, 0], "x": 5, "y": 9}, + + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4}, + + {"matrix": [9, 5], "x": 3, "y": 9}, + {"matrix": [9, 4], "x": 4, "y": 9}, + {"matrix": [9, 3], "x": 5, "y": 9} + + + ] + } + } +} diff --git a/keyboards/silakka54/keymaps/default/keymap.c b/keyboards/silakka54/keymaps/default/keymap.c new file mode 100644 index 0000000000..aa5e64efa3 --- /dev/null +++ b/keyboards/silakka54/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +// 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + 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_LGUI, MO(1), KC_SPC, KC_ENT, KC_RCTL, KC_RALT + ), + [1] = LAYOUT( + 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGDN, KC_HOME, KC_END, KC_DEL, KC_F12, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_LBRC, KC_RBRC, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/silakka54/readme.md b/keyboards/silakka54/readme.md new file mode 100644 index 0000000000..08a38aa473 --- /dev/null +++ b/keyboards/silakka54/readme.md @@ -0,0 +1,26 @@ +# Silakka54 + +![Silakka54](https://i.imgur.com/JrsS0kY.png) + +Silakka54 is a RP2040 Zero based 54-key column staggered split keyboard. PCB uses hotswap sockets. Design is inspired from REVIUNG41 and Corne keyboards. + +* Keyboard Maintainer: [Squalius-cephalus](https://github.com/Squalius-cephalus) +* Hardware Supported: Silakka54 PCB +* Hardware Availability: https://github.com/Squalius-cephalus/silakka54 + +Make example for this keyboard (after setting up your build environment): + + make silakka54:default + +Flashing example for this keyboard: + + make silakka54: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: + +* **Physical boot button**: Hold BOOT button down and connect MCU to the PC +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 9a0f4e586a5ac06241dc05ec13df3f07e4d0392d Mon Sep 17 00:00:00 2001 From: Sylvain Huguet Date: Fri, 3 Jan 2025 07:18:38 +0100 Subject: [PATCH 112/592] Add shuguet shu89 (#24758) Co-authored-by: Drashna Jaelre Co-authored-by: Joel Challis Co-authored-by: jack --- keyboards/shuguet/shu89/keyboard.json | 315 ++++++++++++++++++ .../shuguet/shu89/keymaps/default/keymap.json | 23 ++ keyboards/shuguet/shu89/readme.md | 20 ++ 3 files changed, 358 insertions(+) create mode 100644 keyboards/shuguet/shu89/keyboard.json create mode 100644 keyboards/shuguet/shu89/keymaps/default/keymap.json create mode 100644 keyboards/shuguet/shu89/readme.md diff --git a/keyboards/shuguet/shu89/keyboard.json b/keyboards/shuguet/shu89/keyboard.json new file mode 100644 index 0000000000..072734b544 --- /dev/null +++ b/keyboards/shuguet/shu89/keyboard.json @@ -0,0 +1,315 @@ +{ + "keyboard_name": "shu89", + "manufacturer": "shuguet", + "url": "https://github.com/shuguet/split89", + "maintainer": "shuguet", + "usb": { + "vid": "0x5348", + "pid": "0x0001", + "device_version": "0.0.1" + }, + "features": { + "rgb_matrix": true, + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP19", "GP20", "GP18", "GP17", "GP15", "GP14", "GP13", "GP12", "GP11", "GP10"], + "rows": ["GP1", "GP2", "GP3", "GP4", "GP5", "GP6"] + }, + "ws2812": { + "driver": "vendor", + "pin": "GP7" + }, + "diode_direction": "COL2ROW", + "split": { + "enabled": true, + "serial": { + "driver": "vendor", + "pin": "GP9" + }, + "handedness": { + "pin": "GP0" + }, + "matrix_pins": { + "right": { + "cols": ["GP19", "GP20", "GP18", "GP17", "GP15", "GP14", "GP13", "GP12", "GP11", "GP10"], + "rows": ["GP6", "GP5", "GP4", "GP3", "GP2", "GP1"] + } + } + }, + "processor": "RP2040", + "bootloader": "rp2040", + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Esc", "matrix": [0, 4], "x": 0, "y": 0}, + {"label": "F1", "matrix": [0, 5], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 6], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 7], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 8], "x": 5, "y": 0}, + {"label": "F5", "matrix": [0, 9], "x": 6, "y": 0}, + + {"label": "F6", "matrix": [6, 0], "x": 10, "y": 0}, + {"label": "F7", "matrix": [6, 1], "x": 11, "y": 0}, + {"label": "F8", "matrix": [6, 2], "x": 12, "y": 0}, + {"label": "F9", "matrix": [6, 3], "x": 13.5, "y": 0}, + {"label": "F10", "matrix": [6, 4], "x": 14.5, "y": 0}, + {"label": "F11", "matrix": [6, 5], "x": 15.5, "y": 0}, + {"label": "F12", "matrix": [6, 6], "x": 16.5, "y": 0}, + {"label": "PrtSc", "matrix": [6, 7], "x": 17.75, "y": 0}, + {"label": "Scroll Lock", "matrix": [6, 8], "x": 18.75, "y": 0}, + {"label": "Pause", "matrix": [6, 9], "x": 19.75, "y": 0}, + + + {"label": "~", "matrix": [2, 4], "x": 0, "y": 1.5}, + {"label": "1!", "matrix": [1, 4], "x": 1, "y": 1.5}, + {"label": "2@", "matrix": [1, 5], "x": 2, "y": 1.5}, + {"label": "3#", "matrix": [1, 6], "x": 3, "y": 1.5}, + {"label": "4$", "matrix": [1, 7], "x": 4, "y": 1.5}, + {"label": "5%", "matrix": [1, 8], "x": 5, "y": 1.5}, + {"label": "6^", "matrix": [1, 9], "x": 6, "y": 1.5}, + + {"label": "7&", "matrix": [7, 0], "x": 9.5, "y": 1.5}, + {"label": "8*", "matrix": [7, 1], "x": 10.5, "y": 1.5}, + {"label": "9(", "matrix": [7, 2], "x": 11.5, "y": 1.5}, + {"label": "0)", "matrix": [7, 3], "x": 12.5, "y": 1.5}, + {"label": "-_", "matrix": [7, 4], "x": 13.5, "y": 1.5}, + {"label": "=+", "matrix": [7, 5], "x": 14.5, "y": 1.5}, + {"label": "Backspace", "matrix": [7, 6], "x": 15.5, "y": 1.5, "w": 2}, + {"label": "Insert", "matrix": [7, 7], "x": 17.75, "y": 1.5}, + {"label": "Home", "matrix": [7, 8], "x": 18.75, "y": 1.5}, + {"label": "PgUp", "matrix": [7, 9], "x": 19.75, "y": 1.5}, + + + {"label": "Tab", "matrix": [3, 4], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [2, 5], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [2, 6], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [2, 7], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [2, 8], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [2, 9], "x": 5.5, "y": 2.5}, + + {"label": "Y", "matrix": [9, 0], "x": 9, "y": 2.5}, + {"label": "U", "matrix": [8, 0], "x": 10, "y": 2.5}, + {"label": "I", "matrix": [8, 1], "x": 11, "y": 2.5}, + {"label": "O", "matrix": [8, 2], "x": 12, "y": 2.5}, + {"label": "P", "matrix": [8, 3], "x": 13, "y": 2.5}, + {"label": "{", "matrix": [8, 4], "x": 14, "y": 2.5}, + {"label": "}", "matrix": [8, 5], "x": 15, "y": 2.5}, + {"label": "|", "matrix": [8, 6], "x": 16, "y": 2.5, "w": 1.5}, + {"label": "Delete", "matrix": [8, 7], "x": 17.75, "y": 2.5}, + {"label": "End", "matrix": [8, 8], "x": 18.75, "y": 2.5}, + {"label": "PgDn", "matrix": [8, 9], "x": 19.75, "y": 2.5}, + + + {"label": "Caps Lock", "matrix": [4, 4], "x": 0, "y": 3.5, "w": 1.75}, + {"label": "A", "matrix": [3, 5], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [3, 6], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [3, 7], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [3, 8], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [3, 9], "x": 5.75, "y": 3.5}, + + {"label": "H", "matrix": [10, 0], "x": 9.25, "y": 3.5}, + {"label": "J", "matrix": [9, 1], "x": 10.25, "y": 3.5}, + {"label": "K", "matrix": [9, 2], "x": 11.25, "y": 3.5}, + {"label": "L", "matrix": [9, 3], "x": 12.25, "y": 3.5}, + {"label": ":", "matrix": [9, 4], "x": 13.25, "y": 3.5}, + {"label": "\"", "matrix": [9, 5], "x": 14.25, "y": 3.5}, + {"label": "Enter", "matrix": [9, 6], "x": 15.25, "y": 3.5, "w": 2.25}, + + + {"label": "Left Shift", "matrix": [5, 4], "x": 0, "y": 4.5, "w": 2.25}, + {"label": "Z", "matrix": [4, 5], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [4, 6], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [4, 7], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [4, 8], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [4, 9], "x": 6.25, "y": 4.5}, + + {"label": "N", "matrix": [11, 0], "x": 9.75, "y": 4.5}, + {"label": "M", "matrix": [10, 1], "x": 10.75, "y": 4.5}, + {"label": "<", "matrix": [10, 2], "x": 11.75, "y": 4.5}, + {"label": ">", "matrix": [10, 3], "x": 12.75, "y": 4.5}, + {"label": "?", "matrix": [10, 4], "x": 13.75, "y": 4.5}, + {"label": "Right Shift", "matrix": [10, 6], "x": 14.75, "y": 4.5, "w": 2.75}, + {"label": "Up", "matrix": [10, 8], "x": 18.75, "y": 4.5}, + + {"label": "Left Ctrl", "matrix": [5, 5], "x": 0, "y": 5.5, "w": 1.25}, + {"label": "Fn", "matrix": [5, 6], "x": 1.25, "y": 5.5, "w": 1.25}, + {"label": "Left Alt", "matrix": [5, 7], "x": 2.5, "y": 5.5, "w": 1.25}, + {"label": "Left Win", "matrix": [5, 8], "x": 3.75, "y": 5.5, "w": 1.25}, + {"label": "Left Space", "matrix": [5, 9], "x": 5, "y": 5.5, "w": 2.25}, + + {"label": "Right Space", "matrix": [11, 1], "x": 9.75, "y": 5.5, "w": 2.75}, + {"label": "Right Alt", "matrix": [11, 3], "x": 12.5, "y": 5.5, "w": 1.25}, + {"label": "Right Win", "matrix": [11, 4], "x": 13.75, "y": 5.5, "w": 1.25}, + {"label": "Menu", "matrix": [11, 5], "x": 15, "y": 5.5, "w": 1.25}, + {"label": "Right Ctrl", "matrix": [11, 6], "x": 16.25, "y": 5.5, "w": 1.25}, + {"label": "Left", "matrix": [11, 7], "x": 17.75, "y": 5.5}, + {"label": "Down", "matrix": [11, 8], "x": 18.75, "y": 5.5}, + {"label": "Right", "matrix": [11, 9], "x": 19.75, "y": 5.5} + ] + } + }, + "rgb_matrix": { + "driver": "ws2812", + "split_count": [ 36, 53 ], + "default": { + "hue": 85, + "val": 128 + }, + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "flower_blooming": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true, + "starlight": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "riverflow": true + }, + "layout": [ + {"matrix": [0, 4], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 104, "y": 0, "flags": 4}, + + {"matrix": [1, 4], "x": 16, "y": 13, "flags": 4}, + {"matrix": [1, 5], "x": 32, "y": 13, "flags": 4}, + {"matrix": [1, 6], "x": 48, "y": 13, "flags": 4}, + {"matrix": [1, 7], "x": 64, "y": 13, "flags": 4}, + {"matrix": [1, 8], "x": 80, "y": 13, "flags": 4}, + {"matrix": [1, 9], "x": 96, "y": 13, "flags": 4}, + {"matrix": [2, 4], "x": 0, "y": 13, "flags": 4}, + + {"matrix": [2, 5], "x": 20, "y": 26, "flags": 4}, + {"matrix": [2, 6], "x": 36, "y": 26, "flags": 4}, + {"matrix": [2, 7], "x": 52, "y": 26, "flags": 4}, + {"matrix": [2, 8], "x": 68, "y": 26, "flags": 4}, + {"matrix": [2, 9], "x": 84, "y": 26, "flags": 4}, + {"matrix": [3, 4], "x": 0, "y": 26, "flags": 4}, + + {"matrix": [3, 5], "x": 24, "y": 39, "flags": 4}, + {"matrix": [3, 6], "x": 40, "y": 39, "flags": 4}, + {"matrix": [3, 7], "x": 56, "y": 39, "flags": 4}, + {"matrix": [3, 8], "x": 72, "y": 39, "flags": 4}, + {"matrix": [3, 9], "x": 88, "y": 39, "flags": 4}, + {"matrix": [4, 4], "x": 0, "y": 39, "flags": 5}, + + {"matrix": [4, 5], "x": 28, "y": 51, "flags": 4}, + {"matrix": [4, 6], "x": 44, "y": 51, "flags": 4}, + {"matrix": [4, 7], "x": 60, "y": 51, "flags": 4}, + {"matrix": [4, 8], "x": 76, "y": 51, "flags": 4}, + {"matrix": [4, 9], "x": 92, "y": 51, "flags": 4}, + {"matrix": [5, 4], "x": 0, "y": 51, "flags": 5}, + + {"matrix": [5, 5], "x": 0, "y": 64, "flags": 5}, + {"matrix": [5, 6], "x": 20, "y": 64, "flags": 5}, + {"matrix": [5, 7], "x": 40, "y": 64, "flags": 5}, + {"matrix": [5, 8], "x": 60, "y": 64, "flags": 5}, + {"matrix": [5, 9], "x": 92, "y": 64, "flags": 4}, + + {"matrix": [6, 0], "x": 120, "y": 0, "flags": 4}, + {"matrix": [6, 1], "x": 136, "y": 0, "flags": 4}, + {"matrix": [6, 2], "x": 152, "y": 0, "flags": 4}, + {"matrix": [6, 3], "x": 168, "y": 0, "flags": 4}, + {"matrix": [6, 4], "x": 184, "y": 0, "flags": 4}, + {"matrix": [6, 5], "x": 200, "y": 0, "flags": 4}, + {"matrix": [6, 6], "x": 208, "y": 0, "flags": 4}, + {"matrix": [6, 7], "x": 216, "y": 0, "flags": 4}, + {"matrix": [6, 8], "x": 220, "y": 0, "flags": 4}, + {"matrix": [6, 9], "x": 224, "y": 0, "flags": 4}, + + {"matrix": [7, 0], "x": 112, "y": 13, "flags": 4}, + {"matrix": [7, 1], "x": 128, "y": 13, "flags": 4}, + {"matrix": [7, 2], "x": 144, "y": 13, "flags": 4}, + {"matrix": [7, 3], "x": 160, "y": 13, "flags": 4}, + {"matrix": [7, 4], "x": 176, "y": 13, "flags": 4}, + {"matrix": [7, 5], "x": 192, "y": 13, "flags": 4}, + {"matrix": [7, 6], "x": 208, "y": 13, "flags": 4}, + {"matrix": [7, 7], "x": 216, "y": 13, "flags": 4}, + {"matrix": [7, 8], "x": 220, "y": 13, "flags": 4}, + {"matrix": [7, 9], "x": 224, "y": 13, "flags": 4}, + + {"matrix": [8, 0], "x": 116, "y": 26, "flags": 4}, + {"matrix": [8, 1], "x": 132, "y": 26, "flags": 4}, + {"matrix": [8, 2], "x": 148, "y": 26, "flags": 4}, + {"matrix": [8, 3], "x": 164, "y": 26, "flags": 4}, + {"matrix": [8, 4], "x": 180, "y": 26, "flags": 4}, + {"matrix": [8, 5], "x": 196, "y": 26, "flags": 4}, + {"matrix": [8, 6], "x": 208, "y": 26, "flags": 4}, + {"matrix": [8, 7], "x": 216, "y": 26, "flags": 4}, + {"matrix": [8, 8], "x": 220, "y": 26, "flags": 4}, + {"matrix": [8, 9], "x": 224, "y": 26, "flags": 4}, + {"matrix": [9, 0], "x": 100, "y": 26, "flags": 4}, + + {"matrix": [9, 1], "x": 120, "y": 39, "flags": 4}, + {"matrix": [9, 2], "x": 136, "y": 39, "flags": 4}, + {"matrix": [9, 3], "x": 152, "y": 39, "flags": 4}, + {"matrix": [9, 4], "x": 168, "y": 39, "flags": 4}, + {"matrix": [9, 5], "x": 184, "y": 39, "flags": 4}, + {"matrix": [9, 6], "x": 200, "y": 39, "flags": 4}, + {"matrix": [10, 0], "x": 104, "y": 39, "flags": 4}, + + {"matrix": [10, 1], "x": 124, "y": 51, "flags": 4}, + {"matrix": [10, 2], "x": 140, "y": 51, "flags": 4}, + {"matrix": [10, 3], "x": 156, "y": 51, "flags": 4}, + {"matrix": [10, 4], "x": 172, "y": 51, "flags": 4}, + {"matrix": [10, 6], "x": 188, "y": 51, "flags": 5}, + {"matrix": [10, 8], "x": 216, "y": 51, "flags": 4}, + {"matrix": [11, 0], "x": 108, "y": 51, "flags": 4}, + + {"matrix": [11, 1], "x": 118, "y": 64, "flags": 4}, + {"matrix": [11, 3], "x": 144, "y": 64, "flags": 5}, + {"matrix": [11, 4], "x": 164, "y": 64, "flags": 5}, + {"matrix": [11, 5], "x": 184, "y": 64, "flags": 5}, + {"matrix": [11, 6], "x": 204, "y": 64, "flags": 5}, + {"matrix": [11, 7], "x": 216, "y": 64, "flags": 4}, + {"matrix": [11, 8], "x": 220, "y": 64, "flags": 4}, + {"matrix": [11, 9], "x": 224, "y": 64, "flags": 4} + ] + } +} diff --git a/keyboards/shuguet/shu89/keymaps/default/keymap.json b/keyboards/shuguet/shu89/keymaps/default/keymap.json new file mode 100644 index 0000000000..1725f3438e --- /dev/null +++ b/keyboards/shuguet/shu89/keymaps/default/keymap.json @@ -0,0 +1,23 @@ +{ + "keyboard": "shuguet/shu89", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "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_PSCR", "KC_SCRL", "KC_PAUS", + "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_INS" , "KC_HOME", "KC_PGUP", + "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_DEL" , "KC_END" , "KC_PGDN", + "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", "KC_UP" , + "KC_LCTL", "MO(1)" , "KC_LALT", "KC_LGUI", "KC_SPACE" , "KC_SPACE" , "KC_RALT", "KC_RGUI", "KC_APP" , "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT" + ], + [ + "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "RGB_VAI", "RGB_VAD", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_VOLU", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MPLY", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPRV", "KC_VOLD", "KC_MNXT" + ] + ] +} diff --git a/keyboards/shuguet/shu89/readme.md b/keyboards/shuguet/shu89/readme.md new file mode 100644 index 0000000000..ad1da4e5ab --- /dev/null +++ b/keyboards/shuguet/shu89/readme.md @@ -0,0 +1,20 @@ +# SHU98 + +An 89-key split TKL with PCBs, 3D printed cases, powered by a pair of RP2040. + +* Keyboard Maintainer: [shuguet](https://github.com/shuguet) +* Based on handwiewd original Keyboard from [jurassic73](https://github.com/jurassic73/split89) +* Hardware Supported: RP2040 + +Make example for this keyboard (after setting up your build environment): + + make shuguet/shu89:default + +Flashing example for this keyboard: + + make shuguet/shu89: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). From cc3823f767a704cc465fbfdfef5d272aab018bd0 Mon Sep 17 00:00:00 2001 From: HorrorTroll Date: Sat, 4 Jan 2025 03:33:22 +0700 Subject: [PATCH 113/592] Update some changes for AT32F415 (#24766) * Fixed SPI can't compiled issue * Added solenoid support and use 256KB ldscript for Onekey board --- keyboards/handwired/onekey/at_start_f415/config.h | 4 ++++ keyboards/handwired/onekey/at_start_f415/rules.mk | 1 + platforms/chibios/drivers/spi_master.c | 4 ++-- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 keyboards/handwired/onekey/at_start_f415/rules.mk diff --git a/keyboards/handwired/onekey/at_start_f415/config.h b/keyboards/handwired/onekey/at_start_f415/config.h index 266e45dd00..0e47e813c5 100644 --- a/keyboards/handwired/onekey/at_start_f415/config.h +++ b/keyboards/handwired/onekey/at_start_f415/config.h @@ -8,3 +8,7 @@ #define BACKLIGHT_PWM_DRIVER PWMD5 #define BACKLIGHT_PWM_CHANNEL 1 + +#define SOLENOID_PIN B12 +#define SOLENOID_PINS { B12, B13, B14, B15 } +#define SOLENOID_PINS_ACTIVE_STATE { high, high, low } diff --git a/keyboards/handwired/onekey/at_start_f415/rules.mk b/keyboards/handwired/onekey/at_start_f415/rules.mk new file mode 100644 index 0000000000..7f2fa62b32 --- /dev/null +++ b/keyboards/handwired/onekey/at_start_f415/rules.mk @@ -0,0 +1 @@ +MCU_LDSCRIPT = AT32F415xC diff --git a/platforms/chibios/drivers/spi_master.c b/platforms/chibios/drivers/spi_master.c index 6417b7077f..414e5b10a3 100644 --- a/platforms/chibios/drivers/spi_master.c +++ b/platforms/chibios/drivers/spi_master.c @@ -249,11 +249,11 @@ bool spi_start_extended(spi_start_config_t *start_config) { #elif defined(AT32F415) spiConfig.ctrl1 = 0; - if (lsbFirst) { + if (start_config->lsb_first) { spiConfig.ctrl1 |= SPI_CTRL1_LTF; } - switch (mode) { + switch (start_config->mode) { case 0: break; case 1: From 4da260a49aa3e6b698d826b2f435ec74a2c389a3 Mon Sep 17 00:00:00 2001 From: Leo Lou Date: Sat, 4 Jan 2025 08:23:42 +0800 Subject: [PATCH 114/592] [Keyboard] Add 3W6HS (#22539) Co-authored-by: Duncan Sutherland Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Drashna Jaelre Co-authored-by: Ryan Co-authored-by: Joel Challis --- keyboards/beekeeb/3w6hs/config.h | 22 ++ keyboards/beekeeb/3w6hs/halconf.h | 22 ++ keyboards/beekeeb/3w6hs/info.json | 69 +++++ .../beekeeb/3w6hs/keymaps/default/keymap.c | 68 +++++ keyboards/beekeeb/3w6hs/matrix.c | 248 ++++++++++++++++++ keyboards/beekeeb/3w6hs/mcuconf.h | 24 ++ keyboards/beekeeb/3w6hs/readme.md | 26 ++ keyboards/beekeeb/3w6hs/rules.mk | 3 + 8 files changed, 482 insertions(+) create mode 100644 keyboards/beekeeb/3w6hs/config.h create mode 100644 keyboards/beekeeb/3w6hs/halconf.h create mode 100644 keyboards/beekeeb/3w6hs/info.json create mode 100644 keyboards/beekeeb/3w6hs/keymaps/default/keymap.c create mode 100644 keyboards/beekeeb/3w6hs/matrix.c create mode 100644 keyboards/beekeeb/3w6hs/mcuconf.h create mode 100644 keyboards/beekeeb/3w6hs/readme.md create mode 100644 keyboards/beekeeb/3w6hs/rules.mk diff --git a/keyboards/beekeeb/3w6hs/config.h b/keyboards/beekeeb/3w6hs/config.h new file mode 100644 index 0000000000..fb3b16960d --- /dev/null +++ b/keyboards/beekeeb/3w6hs/config.h @@ -0,0 +1,22 @@ +// Copyright 2023 beekeeb +// Copyright 2021 weteor +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 10 + +#define MATRIX_ROWS_PER_SIDE (MATRIX_ROWS / 2) +#define MATRIX_COLS_PER_SIDE (MATRIX_COLS / 2) + +#define MATRIX_ROW_PINS_L { GP7, GP8, GP9, GP10} +#define MATRIX_COL_PINS_L { GP11, GP12, GP13, GP14, GP15 } + +#define MATRIX_ROW_PINS_R { P10, P11, P12, P05 } +#define MATRIX_COL_PINS_R { P06, P13, P14, P01, P00 } + +#define I2C_DRIVER I2CD0 +#define I2C1_SDA_PIN GP0 +#define I2C1_SCL_PIN GP1 diff --git a/keyboards/beekeeb/3w6hs/halconf.h b/keyboards/beekeeb/3w6hs/halconf.h new file mode 100644 index 0000000000..9419229b61 --- /dev/null +++ b/keyboards/beekeeb/3w6hs/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2023 QMK + * + * 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_I2C TRUE + +#include_next + diff --git a/keyboards/beekeeb/3w6hs/info.json b/keyboards/beekeeb/3w6hs/info.json new file mode 100644 index 0000000000..74f1f1f245 --- /dev/null +++ b/keyboards/beekeeb/3w6hs/info.json @@ -0,0 +1,69 @@ +{ + "manufacturer": "beekeeb", + "keyboard_name": "3w6hs", + "maintainer": "beekeeb", + "diode_direction": "COL2ROW", + "usb": { + "device_version": "1.0.0", + "pid": "0x0003", + "vid": "0xBEEB", + "no_startup_check": true + }, + "processor": "RP2040", + "bootloader": "rp2040", + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true + }, + "community_layouts": ["split_3x5_3"], + "layouts": { + "LAYOUT_split_3x5_3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.8}, + {"matrix": [0, 1], "x": 1, "y": 0.2}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0.2}, + {"matrix": [0, 4], "x": 4, "y": 0.4}, + + {"matrix": [4, 0], "x": 8, "y": 0.4}, + {"matrix": [4, 1], "x": 9, "y": 0.2}, + {"matrix": [4, 2], "x": 10, "y": 0}, + {"matrix": [4, 3], "x": 11, "y": 0.2}, + {"matrix": [4, 4], "x": 12, "y": 0.8}, + + {"matrix": [1, 0], "x": 0, "y": 1.8}, + {"matrix": [1, 1], "x": 1, "y": 1.2}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1.2}, + {"matrix": [1, 4], "x": 4, "y": 1.4}, + + {"matrix": [5, 0], "x": 8, "y": 1.4}, + {"matrix": [5, 1], "x": 9, "y": 1.2}, + {"matrix": [5, 2], "x": 10, "y": 1}, + {"matrix": [5, 3], "x": 11, "y": 1.2}, + {"matrix": [5, 4], "x": 12, "y": 1.8}, + + {"matrix": [2, 0], "x": 0, "y": 2.8}, + {"matrix": [2, 1], "x": 1, "y": 2.2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2.2}, + {"matrix": [2, 4], "x": 4, "y": 2.4}, + + {"matrix": [6, 0], "x": 8, "y": 2.4}, + {"matrix": [6, 1], "x": 9, "y": 2.2}, + {"matrix": [6, 2], "x": 10, "y": 2}, + {"matrix": [6, 3], "x": 11, "y": 2.2}, + {"matrix": [6, 4], "x": 12, "y": 2.8}, + + {"matrix": [3, 2], "x": 3.2, "y": 3.6}, + {"matrix": [3, 3], "x": 4.2, "y": 3.6}, + {"matrix": [3, 4], "x": 5.2, "y": 3.8}, + + {"matrix": [7, 0], "x": 6.8, "y": 3.8}, + {"matrix": [7, 1], "x": 7.8, "y": 3.6}, + {"matrix": [7, 2], "x": 8.8, "y": 3.6} + ] + } + } +} diff --git a/keyboards/beekeeb/3w6hs/keymaps/default/keymap.c b/keyboards/beekeeb/3w6hs/keymaps/default/keymap.c new file mode 100644 index 0000000000..8a9a90175f --- /dev/null +++ b/keyboards/beekeeb/3w6hs/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2021 weteor + * + * 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 + +enum layers { + _ALPHA_QWERTY, + _ALPHA_COLEMAK, + _SYM, + _NAV, + _NUM, + _CFG, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + + [_ALPHA_QWERTY] = LAYOUT_split_3x5_3( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SLSH), + + LCTL_T(KC_ESC), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL) + ), + [_ALPHA_COLEMAK] = LAYOUT_split_3x5_3( + KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, + KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, + LSFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, RSFT_T(KC_SCLN), + LCTL_T(KC_ENT), LT(_NUM,KC_SPC), LT(_NAV, KC_TAB), LT(_SYM, KC_BSPC), KC_ENT, LALT_T(KC_DEL) + ), + [_SYM] = LAYOUT_split_3x5_3( + KC_GRV , KC_CIRC, KC_AT, KC_DLR, KC_TILD, KC_AMPR, KC_EXLM, KC_PIPE, KC_UNDS, KC_HASH, + KC_SLSH, KC_LBRC, KC_LCBR, KC_LPRN, KC_EQL, KC_ASTR, KC_RPRN, KC_RCBR, KC_RBRC, KC_BSLS, + _______, KC_QUES, KC_PLUS, KC_PERC, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, XXXXXXX, _______, + XXXXXXX, MO(_CFG), XXXXXXX, _______, XXXXXXX, XXXXXXX + ), + [_NAV] = LAYOUT_split_3x5_3( + XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, KC_PGDN, KC_UP, KC_PGUP, KC_DEL, + KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, XXXXXXX, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, _______, XXXXXXX, MO(_CFG), XXXXXXX + ), + [_NUM] = LAYOUT_split_3x5_3( + XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PSLS, + XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_P0, KC_P4, KC_P5, KC_P6, KC_PDOT, + XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_PMNS, KC_P1, KC_P2, KC_P3, KC_PAST, + XXXXXXX, _______, XXXXXXX, KC_PEQL, KC_PENT, XXXXXXX + ), + [_CFG] = LAYOUT_split_3x5_3( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,DF(_ALPHA_QWERTY), DF(_ALPHA_COLEMAK), + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX + ), +}; diff --git a/keyboards/beekeeb/3w6hs/matrix.c b/keyboards/beekeeb/3w6hs/matrix.c new file mode 100644 index 0000000000..8bddc62842 --- /dev/null +++ b/keyboards/beekeeb/3w6hs/matrix.c @@ -0,0 +1,248 @@ +/* +Copyright 2013 Oleg Kostyuk + 2020 Pierre Chevalier + 2021 weteor + 2023 beekeeb +*/ + +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * This code was heavily inspired by the ergodox_ez keymap, and modernized + * to take advantage of the quantum.h microcontroller agnostics gpio control + * abstractions and use the macros defined in config.h for the wiring as opposed + * to repeating that information all over the place. + */ + +#include "matrix.h" +#include "debug.h" +#include "wait.h" +#include "i2c_master.h" + +extern i2c_status_t tca9555_status; +//#define I2C_TIMEOUT 1000 + +// I2C address: +// All address pins of the tca9555 are connected to the ground +// | 0 | 1 | 0 | 0 | A2 | A1 | A0 | +// | 0 | 1 | 0 | 0 | 0 | 0 | 0 | +#define I2C_ADDR (0b0100000 << 1) + +// Register addresses +#define IODIRA 0x06 // i/o direction register +#define IODIRB 0x07 +#define IREGP0 0x00 // GPIO pull-up resistor register +#define IREGP1 0x01 +#define OREGP0 0x02 // general purpose i/o port register (write modifies OLAT) +#define OREGP1 0x03 + +bool i2c_initialized = 0; +i2c_status_t tca9555_status = I2C_ADDR; + +uint8_t init_tca9555(void) { + dprint("starting init\n"); + tca9555_status = I2C_ADDR; + + // I2C subsystem + if (i2c_initialized == 0) { + i2c_init(); // on pins D(1,0) + i2c_initialized = true; + wait_ms(I2C_TIMEOUT); + } + + // set pin direction + // - unused : input : 1 + // - input : input : 1 + // - driving : output : 0 + uint8_t conf[2] = { + // This means: read all pins of port 0 + 0b11111111, + // This means: we will write on pins 0 to 3 on port 1. read rest + 0b11110000, + }; + tca9555_status = i2c_write_register(I2C_ADDR, IODIRA, conf, 2, I2C_TIMEOUT); + + return tca9555_status; +} + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; // debounced values + +static matrix_row_t read_cols(uint8_t row); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); + +static uint8_t tca9555_reset_loop; + +void matrix_init_custom(void) { + // initialize row and col + + tca9555_status = init_tca9555(); + + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + } +} + +void matrix_power_up(void) { + tca9555_status = init_tca9555(); + + unselect_rows(); + init_cols(); + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + } +} + +// Reads and stores a row, returning +// whether a change occurred. +static inline bool store_matrix_row(matrix_row_t current_matrix[], uint8_t index) { + matrix_row_t temp = read_cols(index); + if (current_matrix[index] != temp) { + current_matrix[index] = temp; + return true; + } + return false; +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + if (tca9555_status) { // if there was an error + if (++tca9555_reset_loop == 0) { + // since tca9555_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans + // this will be approx bit more frequent than once per second + dprint("trying to reset tca9555\n"); + tca9555_status = init_tca9555(); + if (tca9555_status) { + dprint("right side not responding\n"); + } else { + dprint("right side attached\n"); + } + } + } + + bool changed = false; + for (uint8_t i = 0; i < MATRIX_ROWS_PER_SIDE; i++) { + // select rows from left and right hands + uint8_t left_index = i; + uint8_t right_index = i + MATRIX_ROWS_PER_SIDE; + select_row(left_index); + select_row(right_index); + + // we don't need a 30us delay anymore, because selecting a + // left-hand row requires more than 30us for i2c. + + changed |= store_matrix_row(current_matrix, left_index); + changed |= store_matrix_row(current_matrix, right_index); + + unselect_rows(); + } + + return changed; +} + +static void init_cols(void) { + // init on tca9555 + // not needed, already done as part of init_tca9555() + + // init on mcu + pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; + for (int pin_index = 0; pin_index < MATRIX_COLS_PER_SIDE; pin_index++) { + pin_t pin = matrix_col_pins_mcu[pin_index]; + gpio_set_pin_input_high(pin); + gpio_write_pin_high(pin); + } +} + +static matrix_row_t read_cols(uint8_t row) { + if (row < MATRIX_ROWS_PER_SIDE) { + pin_t matrix_col_pins_mcu[MATRIX_COLS_PER_SIDE] = MATRIX_COL_PINS_L; + matrix_row_t current_row_value = 0; + // For each col... + for (uint8_t col_index = 0; col_index < MATRIX_COLS_PER_SIDE; col_index++) { + // Select the col pin to read (active low) + uint8_t pin_state = gpio_read_pin(matrix_col_pins_mcu[col_index]); + + // Populate the matrix row with the state of the col pin + current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); + } + return current_row_value; + } else { + if (tca9555_status) { // if there was an error + return 0; + } else { + uint8_t data = 0; + uint8_t port0 = 0; + tca9555_status = i2c_read_register(I2C_ADDR, IREGP0, &port0, 1, I2C_TIMEOUT); + if (tca9555_status) { // if there was an error + // do nothing + return 0; + } else { + port0 = ~port0; + // We read all the pins on GPIOA. + // The initial state was all ones and any depressed key at a given column for the currently selected row will have its bit flipped to zero. + // The return value is a row as represented in the generic matrix code were the rightmost bits represent the lower columns and zeroes represent non-depressed keys while ones represent depressed keys. + // the pins connected to eact columns are sequential, but in reverse order, and counting from zero down (col 5 -> GPIO04, col6 -> GPIO03 and so on). + data |= (port0 & 0x01) << 4; + data |= (port0 & 0x02) << 2; + data |= (port0 & 0x04); + data |= (port0 & 0x08) >> 2; + data |= (port0 & 0x10) >> 4; + + tca9555_status = I2C_STATUS_SUCCESS; + return data; + } + } + } +} + +static void unselect_rows(void) { + // no need to unselect on tca9555, because the select step sets all + // the other row bits high, and it's not changing to a different + // direction + + // unselect rows on microcontroller + pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; + for (int pin_index = 0; pin_index < MATRIX_ROWS_PER_SIDE; pin_index++) { + pin_t pin = matrix_row_pins_mcu[pin_index]; + gpio_set_pin_input_high(pin); + gpio_write_pin_low(pin); + } +} + +static void select_row(uint8_t row) { + uint8_t port1 = 0xff; + + if (row < MATRIX_ROWS_PER_SIDE) { + // select on atmega32u4 + pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_L; + pin_t pin = matrix_row_pins_mcu[row]; + gpio_set_pin_output(pin); + gpio_write_pin_low(pin); + } else { + // select on tca9555 + if (tca9555_status) { // if there was an error + // do nothing + } else { + switch(row) { + case 4: port1 &= ~(1 << 0); break; + case 5: port1 &= ~(1 << 1); break; + case 6: port1 &= ~(1 << 2); break; + case 7: + port1 &= ~(1 << 3); + break; + default: break; + } + + tca9555_status = i2c_write_register(I2C_ADDR, OREGP1, &port1, 1, I2C_TIMEOUT); + // Select the desired row by writing a byte for the entire GPIOB bus where only the bit representing the row we want to select is a zero (write instruction) and every other bit is a one. + // Note that the row - MATRIX_ROWS_PER_SIDE reflects the fact that being on the right hand, the columns are numbered from MATRIX_ROWS_PER_SIDE to MATRIX_ROWS, but the pins we want to write to are indexed from zero up on the GPIOB bus. + } + } +} diff --git a/keyboards/beekeeb/3w6hs/mcuconf.h b/keyboards/beekeeb/3w6hs/mcuconf.h new file mode 100644 index 0000000000..dd927436df --- /dev/null +++ b/keyboards/beekeeb/3w6hs/mcuconf.h @@ -0,0 +1,24 @@ +/* Copyright 2023 QMK + * + * 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 RP_I2C_USE_I2C0 +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C0 TRUE +#define RP_I2C_USE_I2C1 FALSE diff --git a/keyboards/beekeeb/3w6hs/readme.md b/keyboards/beekeeb/3w6hs/readme.md new file mode 100644 index 0000000000..e0dde6eb0b --- /dev/null +++ b/keyboards/beekeeb/3w6hs/readme.md @@ -0,0 +1,26 @@ +# 3W6HS + +![3W6HS](https://i.imgur.com/CPxwGSt.jpeg) + +The 3W6HS is a hotswap, RP2040, low profile, split keyboard with 36 keys, modified from 3W6 by weteor. + +* Keyboard Maintainer: [beekeeb](https://github.com/beekeeb) +* Hardware Supported: RP2040 +* Hardware Availability: [https://shop.beekeeb.com/](https://shop.beekeeb.com) + +Make example for this keyboard (after setting up your build environment): + + make beekeeb/3w6hs:default + +Flashing example for this keyboard: + + make beekeeb/3w6hs: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 + +To enter the bootloader, follow these steps: +* Disconnect the keyboard from the computer. +* Locate the BOOT button, which is the top button on the left side of the keyboard. +* While holding down the BOOT button, connect the keyboard back to the computer. diff --git a/keyboards/beekeeb/3w6hs/rules.mk b/keyboards/beekeeb/3w6hs/rules.mk new file mode 100644 index 0000000000..cea39bb5c9 --- /dev/null +++ b/keyboards/beekeeb/3w6hs/rules.mk @@ -0,0 +1,3 @@ +CUSTOM_MATRIX = lite +SRC += matrix.c +I2C_DRIVER_REQUIRED = yes From 9dba024d76119b4185b971110805e76cdcc120f9 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Sat, 4 Jan 2025 17:41:32 +0900 Subject: [PATCH 115/592] Add EE_HANDS for KLEC-02 (#24777) Add #define EE_HANDS --- keyboards/takashicompany/klec_02/config.h | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 keyboards/takashicompany/klec_02/config.h diff --git a/keyboards/takashicompany/klec_02/config.h b/keyboards/takashicompany/klec_02/config.h new file mode 100644 index 0000000000..8828e2ad72 --- /dev/null +++ b/keyboards/takashicompany/klec_02/config.h @@ -0,0 +1,6 @@ +// Copyright 2024 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define EE_HANDS \ No newline at end of file From c9f94752430209516717522cfbbe59042b952e5f Mon Sep 17 00:00:00 2001 From: Tocho Tochev Date: Sat, 4 Jan 2025 11:08:26 +0000 Subject: [PATCH 116/592] Fix durgod k3x0 docs (#24774) --- keyboards/durgod/k310/readme.md | 2 +- keyboards/durgod/k320/readme.md | 6 +++--- keyboards/durgod/k3x0/readme.md | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/keyboards/durgod/k310/readme.md b/keyboards/durgod/k310/readme.md index 1f39f79513..7483dc5ddf 100644 --- a/keyboards/durgod/k310/readme.md +++ b/keyboards/durgod/k310/readme.md @@ -6,7 +6,7 @@ This is a standard off-the-shelf Durgod Taurus K310 full-sized 104/105-key keyboard without backlight. This supports both the ANSI and ISO variants. * Keyboard Maintainers: [dkjer](https://github.com/dkjer) and [tylert](https://github.com/tylert) -* Hardware Supported: [Durgod Taurus K310 board with STM32F070RBT6](https://www.durgod.com/page9?product_id=53&_l=en "Durgod.com Product Page") +* Hardware Supported: [Durgod Taurus K310 board with STM32F070RBT6](https://www.durgod.com/product/k310-space-gray/) * Hardware Availability: [Amazon.com](https://www.amazon.com/Durgod-Taurus-K310-Mechanical-Keyboard/dp/B07TXB4XF3) ## Instructions diff --git a/keyboards/durgod/k320/readme.md b/keyboards/durgod/k320/readme.md index ce5ae3211d..fd4752c184 100644 --- a/keyboards/durgod/k320/readme.md +++ b/keyboards/durgod/k320/readme.md @@ -6,7 +6,7 @@ This is a standard off-the-shelf Durgod Taurus K320 TKL (87/88-key) keyboard without backlight. This supports both the ANSI and ISO variants. * Keyboard Maintainers: [dkjer](https://github.com/dkjer) and [tylert](https://github.com/tylert) -* Hardware Supported: [Durgod Taurus K320 board with STM32F070RBT6](https://www.durgod.com/page9?product_id=47&_l=en "Durgod.com Product Page") +* Hardware Supported: [Durgod Taurus K320 board with STM32F070RBT6](https://www.durgod.com/product/k320-space-gray/) * Hardware Availability: [Amazon.com](https://www.amazon.com/Durgod-Taurus-Corona-Mechanical-Keyboard/dp/B078H3WPHM) ## Instructions @@ -15,11 +15,11 @@ keyboard without backlight. This supports both the ANSI and ISO variants. Make command example for this keyboard (after setting up your build environment): - make durgod/k3x0/k320/base:default + make durgod/k320/base:default Flashing example for this keyboard: - make durgod/k3x0/k320/base:default:flash + make durgod/k320/base: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). diff --git a/keyboards/durgod/k3x0/readme.md b/keyboards/durgod/k3x0/readme.md index 90e9602e71..e4fa680781 100644 --- a/keyboards/durgod/k3x0/readme.md +++ b/keyboards/durgod/k3x0/readme.md @@ -5,8 +5,8 @@ K310 full-sized 104/105-key and K320 TKL 87/88-key keyboards. * Keyboard Maintainers: [dkjer](https://github.com/dkjer) and [tylert](https://github.com/tylert) * Hardware Supported: - * [Durgod Taurus K310 with STM32F070RBT6](https://www.durgod.com/page9?product_id=53&_l=en "Taurus K310 Product Page | Durgod.com") - * [Durgod Taurus K320 with STM32F070RBT6](https://www.durgod.com/page9?product_id=47&_l=en "Taurus K320 Product Page | Durgod.com") + * [Durgod Taurus K310 with STM32F070RBT6](https://www.durgod.com/product/k310-space-gray/) + * [Durgod Taurus K320 with STM32F070RBT6](https://www.durgod.com/product/k320-space-gray/) * Hardware Availability: * [K310 on Amazon.com](https://www.amazon.com/Durgod-Taurus-K310-Mechanical-Keyboard/dp/B07TXB4XF3) * [K320 on Amazon.com](https://www.amazon.com/Durgod-Taurus-Corona-Mechanical-Keyboard/dp/B078H3WPHM) @@ -16,8 +16,8 @@ K310 full-sized 104/105-key and K320 TKL 87/88-key keyboards. ### Build Instructions for building the K310 and K320 firmware can be found here: -* [K310](k310/readme.md) -* [K320](k320/readme.md) +* [K310](../k310/readme.md) +* [K320](../k320/readme.md) ### Initial Flash @@ -67,10 +67,10 @@ dfu-util -a 0 -d 0483:DF11 -s 0x08000000 -U k3x0_original.bin ```bash # k310 -qmk flash -kb durgod/k3x0/k310 -km default +qmk flash -kb durgod/k310 -km default # k320 -qmk flash -kb durgod/k3x0/k320 -km default +qmk flash -kb durgod/k320 -km default ``` ### Subsequent Flashing From 9339e3c35d971c9415acff8a63b2c5e6eaa7b555 Mon Sep 17 00:00:00 2001 From: Clocks <38189170+Doomsdayrs@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:46:58 -0500 Subject: [PATCH 117/592] Add watchdog service to RGBKB Sol 3 (#24786) Due to power demands, the Sol 3 might get initially ignored or something by the attached device. The solution is the enable watchdog, which would have the keyboard repoll the system to connect again. I have been using watchdog for awhile, but given that the RGBKB developer never progressed #24279, I made this to add in the essential feature. --- keyboards/rgbkb/sol3/rev1/keyboard.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/rgbkb/sol3/rev1/keyboard.json b/keyboards/rgbkb/sol3/rev1/keyboard.json index a81ea7bc21..775e3f8629 100644 --- a/keyboards/rgbkb/sol3/rev1/keyboard.json +++ b/keyboards/rgbkb/sol3/rev1/keyboard.json @@ -153,6 +153,8 @@ "pin": "A9" }, "transport": { + "watchdog": true, + "watchdog_timeout": 20000, "sync": { "indicators": true, "layer_state": true, From a336c04a6a1f21a5b4a84b848f4037841f2bf5d6 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 6 Jan 2025 13:19:45 +1100 Subject: [PATCH 118/592] macOS install: remove bad ARM toolchains (#24637) --- util/install/macos.sh | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/util/install/macos.sh b/util/install/macos.sh index a1b79fe868..4db2f9be6b 100755 --- a/util/install/macos.sh +++ b/util/install/macos.sh @@ -9,23 +9,24 @@ _qmk_install_prepare() { return 1 fi + # Conflicts with arm-none-eabi toolchain from osx-cross + brew uninstall --ignore-dependencies --cask gcc-arm-embedded >/dev/null 2>&1 + brew uninstall --ignore-dependencies homebrew/core/arm-none-eabi-gcc >/dev/null 2>&1 + brew uninstall --ignore-dependencies homebrew/core/arm-none-eabi-binutils >/dev/null 2>&1 + brew uninstall --ignore-dependencies osx-cross/arm/arm-gcc-bin@8 >/dev/null 2>&1 + brew update && brew upgrade --formulae } _qmk_install() { echo "Installing dependencies" - # All macOS dependencies are managed in the Homebrew package: - # https://github.com/qmk/homebrew-qmk + # All macOS & Python dependencies are managed in the Homebrew package: + # https://github.com/qmk/homebrew-qmk brew install qmk/qmk/qmk - # Conflicts with new toolchain formulae - brew uninstall --ignore-dependencies arm-gcc-bin@8 >/dev/null 2>&1 - # Keg-only, so need to be manually linked brew link --force avr-gcc@8 brew link --force arm-none-eabi-binutils brew link --force arm-none-eabi-gcc@8 - - python3 -m pip install -r $QMK_FIRMWARE_DIR/requirements.txt } From bcee1d2f2e17f85f75d67e32c809ae76bd3803ef Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 7 Jan 2025 08:48:28 +1100 Subject: [PATCH 119/592] Remove preprocessor sanity check for STM32L0/L1 now that it relies on types in C. (#24793) --- platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.h b/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.h index c1d801f225..1e6b4e4e42 100644 --- a/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.h +++ b/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.h @@ -27,7 +27,3 @@ # define STM32_ONBOARD_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO and EEPROM page sizing # endif #endif - -#if STM32_ONBOARD_EEPROM_SIZE > 128 -# pragma message("Please note: resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.") -#endif From 6facb7a079740f975c41c9ae8d95f0735097933e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 8 Jan 2025 03:12:54 +0000 Subject: [PATCH 120/592] Convert stray legacy warn/info docs panels (#24799) --- docs/feature_macros.md | 4 +++- docs/feature_userspace.md | 5 +++-- docs/features/mouse_keys.md | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/feature_macros.md b/docs/feature_macros.md index b4e37a1ba9..404eb4b38d 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -117,7 +117,9 @@ If yes, we send the string `"QMK is the best thing ever!"` to the computer via t We return `true` to indicate to the caller that the key press we just processed should continue to be processed as normal (as we didn't replace or alter the functionality). Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button. -?>It is recommended to use the SAFE_RANGE macro as per [Customizing Functionality](custom_quantum_functions). +::: tip +It is recommended to use the SAFE_RANGE macro as per [Customizing Functionality](custom_quantum_functions). +::: You might want to add more than one macro. You can do that by adding another keycode and adding another case to the switch statement, like so: diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index 1e7c3b37cd..d19b86cb46 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -74,8 +74,9 @@ Additionally, `config.h` here will be processed like the same file in your keyma The reason for this, is that `.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `` file in any `config.h` files will result in compile issues. -!>You should use the `config.h` for [configuration options](config_options), and the `.h` file for user or keymap specific settings (such as the enum for layer or keycodes) - +::: warning +You should use the `config.h` for [configuration options](config_options), and the `.h` file for user or keymap specific settings (such as the enum for layer or keycodes) +::: ## Readme (`readme.md`) diff --git a/docs/features/mouse_keys.md b/docs/features/mouse_keys.md index d755084f8e..86b50fa9c8 100644 --- a/docs/features/mouse_keys.md +++ b/docs/features/mouse_keys.md @@ -214,7 +214,9 @@ When additional overlapping mouse key is pressed, the mouse cursor will continue |`MOUSEKEY_OVERLAP_WHEEL_DELTA`|`MOUSEKEY_WHEEL_DELTA`|Step size of reset mouse wheel acceleration | |`MOUSEKEY_OVERLAP_INTERVAL` |`MOUSEKEY_INTERVAL` |Reset time between cursor movements in milliseconds (Kinetic mode only)| -?> This feature will not be applied on Inertial mode +::: tip +This feature will not be applied on Inertial mode +::: ## Use with PS/2 Mouse and Pointing Device From 95c74b6276c95fab5e04e22b1f1cd30aedead6fa Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 8 Jan 2025 04:13:04 +0100 Subject: [PATCH 121/592] [Docs] Fix wording in Mod Tap documentation (#24796) --- docs/mod_tap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/mod_tap.md b/docs/mod_tap.md index 37c2ba3473..da2ecc9a85 100644 --- a/docs/mod_tap.md +++ b/docs/mod_tap.md @@ -2,7 +2,7 @@ The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down. -The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`: +The modifiers (`mod`) argument to the `MT()` macro are prefixed with `MOD_`, not `KC_`: |Modifier |Description | |----------|----------------------------------------| From 80c90a6952f412defa6b3709a59507b2c76f3863 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 8 Jan 2025 08:50:54 -0800 Subject: [PATCH 122/592] [Bug] Fix Underglow keycode processing (#24798) Co-authored-by: Ryan --- quantum/process_keycode/process_underglow.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quantum/process_keycode/process_underglow.c b/quantum/process_keycode/process_underglow.c index 6104cd02c6..b8d8989ef3 100644 --- a/quantum/process_keycode/process_underglow.c +++ b/quantum/process_keycode/process_underglow.c @@ -16,7 +16,10 @@ bool process_underglow(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { - uint8_t shifted = get_mods() & MOD_MASK_SHIFT; +#if defined(RGBLIGHT_ENABLE) || (defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_SHARED_KEYCODES)) + const uint8_t shifted = get_mods() & MOD_MASK_SHIFT; +#endif + switch (keycode) { case QK_UNDERGLOW_TOGGLE: #if defined(RGBLIGHT_ENABLE) From c1565bebcef26c400801caa4447012c2b9fa0a62 Mon Sep 17 00:00:00 2001 From: HorrorTroll Date: Wed, 8 Jan 2025 23:51:28 +0700 Subject: [PATCH 123/592] Patch up issue when compile with APA102 driver (#24800) --- drivers/led/apa102.c | 2 +- drivers/led/apa102.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/led/apa102.c b/drivers/led/apa102.c index 050609263d..6e87d48b96 100644 --- a/drivers/led/apa102.c +++ b/drivers/led/apa102.c @@ -122,7 +122,7 @@ void apa102_init(void) { gpio_set_pin_output(APA102_CI_PIN); } -void apa102_set_color(uint16_t index, uint8_t red, uint8_t green, uint8_t blue) { +void apa102_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) { apa102_leds[index].r = red; apa102_leds[index].g = green; apa102_leds[index].b = blue; diff --git a/drivers/led/apa102.h b/drivers/led/apa102.h index 42f1344f0c..6fa3521a3a 100644 --- a/drivers/led/apa102.h +++ b/drivers/led/apa102.h @@ -32,7 +32,7 @@ #define APA102_MAX_BRIGHTNESS 31 void apa102_init(void); -void apa102_set_color(uint16_t index, uint8_t red, uint8_t green, uint8_t blue); +void apa102_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); void apa102_set_color_all(uint8_t red, uint8_t green, uint8_t blue); void apa102_flush(void); From 9d2b416fe17cbeb3753e2c3dfc782b12df3a4270 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 9 Jan 2025 17:53:44 +1100 Subject: [PATCH 124/592] Update ChibiOS-Contrib. (#24803) --- lib/chibios-contrib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios-contrib b/lib/chibios-contrib index b643aad980..3ac181e4ca 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit b643aad980d061021565c55745925c2cde4a3c6f +Subproject commit 3ac181e4ca5cafddaf8b472baa1d09c2b24c77b6 From d90b6e4689ab7d74585774621adccc6faf021d38 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 11 Jan 2025 02:04:17 +1100 Subject: [PATCH 125/592] Fix a build warning and tidy up a keymap (#24805) --- .../3w6hs/{info.json => keyboard.json} | 0 .../keyprez/bison/keymaps/default/keymap.c | 32 ++----------------- 2 files changed, 3 insertions(+), 29 deletions(-) rename keyboards/beekeeb/3w6hs/{info.json => keyboard.json} (100%) diff --git a/keyboards/beekeeb/3w6hs/info.json b/keyboards/beekeeb/3w6hs/keyboard.json similarity index 100% rename from keyboards/beekeeb/3w6hs/info.json rename to keyboards/beekeeb/3w6hs/keyboard.json diff --git a/keyboards/keyprez/bison/keymaps/default/keymap.c b/keyboards/keyprez/bison/keymaps/default/keymap.c index d66b1a487b..17c5f2ecd7 100644 --- a/keyboards/keyprez/bison/keymaps/default/keymap.c +++ b/keyboards/keyprez/bison/keymaps/default/keymap.c @@ -25,11 +25,6 @@ enum layer_names { _FN, }; -enum custom_keycodes { - KC_PRVWD = SAFE_RANGE, - KC_NXTWD -}; - #define LOWER MO(_LOWER) #define RAISE MO(_RAISE) #define FN MO(_FN) @@ -47,6 +42,9 @@ enum custom_keycodes { #define KC_COLMK PDF(_COLEMAK) #define KC_HRM PDF(_HRM) +#define KC_PRVWD LCTL(KC_LEFT) +#define KC_NXTWD LCTL(KC_RGHT) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * QWERTY @@ -186,27 +184,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,_______, _______, _______, _______, _______, _______, _______ ), }; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_PRVWD: - if (record->event.pressed) { - register_mods(mod_config(MOD_LCTL)); - register_code(KC_LEFT); - } else { - unregister_mods(mod_config(MOD_LCTL)); - unregister_code(KC_LEFT); - } - break; - case KC_NXTWD: - if (record->event.pressed) { - register_mods(mod_config(MOD_LCTL)); - register_code(KC_RIGHT); - } else { - unregister_mods(mod_config(MOD_LCTL)); - unregister_code(KC_RIGHT); - } - break; - } - return true; -} From f9430e530b1ba61891990d7c23c78c78e6656a6c Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 10 Jan 2025 16:21:07 +0000 Subject: [PATCH 126/592] Ensure `qmk flash` rejects invalid files for uf2 compatible bootloaders (#24802) Ensure 'qmk flash' rejects invalid files for uf2 compatible bootloaders --- lib/python/qmk/flashers.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/flashers.py b/lib/python/qmk/flashers.py index 7ee1bc8de7..2cca4941d3 100644 --- a/lib/python/qmk/flashers.py +++ b/lib/python/qmk/flashers.py @@ -202,6 +202,10 @@ def _flash_mdloader(file): def _flash_uf2(file): + output = cli.run(['util/uf2conv.py', '--info', file]).stdout + if 'UF2 File' not in output: + return True + cli.run(['util/uf2conv.py', '--deploy', file], capture_output=False) @@ -235,7 +239,8 @@ def flasher(mcu, file): elif bl == 'md-boot': _flash_mdloader(file) elif bl == '_uf2_compatible_': - _flash_uf2(file) + if _flash_uf2(file): + return (True, "Flashing only supports uf2 format files.") else: return (True, "Known bootloader found but flashing not currently supported!") From 35c652056073af84577d5a1cb6729ea262f2075e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2025 20:59:33 +0000 Subject: [PATCH 127/592] Bump nanoid from 3.3.7 to 3.3.8 in /builddefs/docsgen (#24713) Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index 3b5f68035f..057e89d073 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -663,9 +663,9 @@ mitt@^3.0.1: integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== perfect-debounce@^1.0.0: version "1.0.0" From 62e98327d2b7f82f96d5fd8eafacf02cf1f76dbb Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Sat, 11 Jan 2025 01:29:58 +0000 Subject: [PATCH 128/592] Azoteq - improve I2C behaviour while polling. (#24611) Co-authored-by: Stefan Kerkmann --- drivers/sensors/azoteq_iqs5xx.c | 55 ++++++++++++++------------------- drivers/sensors/azoteq_iqs5xx.h | 3 +- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/drivers/sensors/azoteq_iqs5xx.c b/drivers/sensors/azoteq_iqs5xx.c index 1bb64f1984..ae26ee60cf 100644 --- a/drivers/sensors/azoteq_iqs5xx.c +++ b/drivers/sensors/azoteq_iqs5xx.c @@ -17,6 +17,7 @@ #define AZOTEQ_IQS5XX_REG_PREVIOUS_CYCLE_TIME 0x000C #define AZOTEQ_IQS5XX_REG_SYSTEM_CONTROL_1 0x0432 #define AZOTEQ_IQS5XX_REG_REPORT_RATE_ACTIVE 0x057A +#define AZOTEQ_IQS5XX_REG_IDLE_MODE_TIMEOUT 0x0586 #define AZOTEQ_IQS5XX_REG_SYSTEM_CONFIG_0 0x058E #define AZOTEQ_IQS5XX_REG_SYSTEM_CONFIG_1 0x058F #define AZOTEQ_IQS5XX_REG_X_RESOLUTION 0x066E @@ -77,6 +78,10 @@ #ifndef AZOTEQ_IQS5XX_ZOOM_CONSECUTIVE_DISTANCE # define AZOTEQ_IQS5XX_ZOOM_CONSECUTIVE_DISTANCE 0x19 #endif +#ifndef AZOTEQ_IQS5XX_EVENT_MODE +// Event mode can't be used until the pointing code has changed (stuck buttons) +# define AZOTEQ_IQS5XX_EVENT_MODE false +#endif #if defined(AZOTEQ_IQS5XX_TPS43) # define AZOTEQ_IQS5XX_WIDTH_MM 43 @@ -112,12 +117,6 @@ static struct { uint16_t resolution_y; } azoteq_iqs5xx_device_resolution_t; -i2c_status_t azoteq_iqs5xx_wake(void) { - uint8_t data = 0; - i2c_status_t status = i2c_read_register16(AZOTEQ_IQS5XX_ADDRESS, AZOTEQ_IQS5XX_REG_PREVIOUS_CYCLE_TIME, (uint8_t *)&data, sizeof(data), 1); - wait_us(150); - return status; -} i2c_status_t azoteq_iqs5xx_end_session(void) { const uint8_t END_BYTE = 1; // any data return i2c_write_register16(AZOTEQ_IQS5XX_ADDRESS, AZOTEQ_IQS5XX_REG_END_COMMS, &END_BYTE, 1, AZOTEQ_IQS5XX_TIMEOUT_MS); @@ -324,14 +323,19 @@ static i2c_status_t azoteq_iqs5xx_init_status = 1; void azoteq_iqs5xx_init(void) { i2c_init(); - azoteq_iqs5xx_wake(); + i2c_ping_address(AZOTEQ_IQS5XX_ADDRESS, 1); // wake azoteq_iqs5xx_reset_suspend(true, false, true); wait_ms(100); - azoteq_iqs5xx_wake(); + i2c_ping_address(AZOTEQ_IQS5XX_ADDRESS, 1); // wake if (azoteq_iqs5xx_get_product() != AZOTEQ_IQS5XX_UNKNOWN) { azoteq_iqs5xx_setup_resolution(); azoteq_iqs5xx_init_status = azoteq_iqs5xx_set_report_rate(AZOTEQ_IQS5XX_REPORT_RATE, AZOTEQ_IQS5XX_ACTIVE, false); - azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_event_mode(false, false); + azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_report_rate(AZOTEQ_IQS5XX_REPORT_RATE, AZOTEQ_IQS5XX_IDLE, false); + azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_report_rate(AZOTEQ_IQS5XX_REPORT_RATE, AZOTEQ_IQS5XX_IDLE_TOUCH, false); + + uint8_t no_timeout = 255; + azoteq_iqs5xx_init_status |= i2c_write_register16(AZOTEQ_IQS5XX_ADDRESS, AZOTEQ_IQS5XX_REG_IDLE_MODE_TIMEOUT, &no_timeout, 1, AZOTEQ_IQS5XX_TIMEOUT_MS); // Don't enter LP1, LP2 states + azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_event_mode(AZOTEQ_IQS5XX_EVENT_MODE, false); azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_reati(true, false); #if defined(AZOTEQ_IQS5XX_ROTATION_90) azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_xy_config(false, true, true, true, false); @@ -348,21 +352,19 @@ void azoteq_iqs5xx_init(void) { }; report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) { - report_mouse_t temp_report = {0}; - static uint8_t previous_button_state = 0; - static uint8_t read_error_count = 0; + report_mouse_t temp_report = {0}; if (azoteq_iqs5xx_init_status == I2C_STATUS_SUCCESS) { - azoteq_iqs5xx_base_data_t base_data = {0}; -#if !defined(POINTING_DEVICE_MOTION_PIN) - azoteq_iqs5xx_wake(); -#endif - i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data); - bool ignore_movement = false; + azoteq_iqs5xx_base_data_t base_data = {0}; + i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data); + bool ignore_movement = false; if (status == I2C_STATUS_SUCCESS) { - // pd_dprintf("IQS5XX - previous cycle time: %d \n", base_data.previous_cycle_time); - read_error_count = 0; +#ifdef POINTING_DEVICE_DEBUG + if (base_data.previous_cycle_time > AZOTEQ_IQS5XX_REPORT_RATE) { + pd_dprintf("IQS5XX - previous cycle time missed, took: %dms\n", base_data.previous_cycle_time); + } +#endif if (base_data.gesture_events_0.single_tap || base_data.gesture_events_0.press_and_hold) { pd_dprintf("IQS5XX - Single tap/hold.\n"); temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON1); @@ -403,20 +405,11 @@ report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) { temp_report.y = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l)); } - previous_button_state = temp_report.buttons; - } else { - if (read_error_count > 10) { - read_error_count = 0; - previous_button_state = 0; - } else { - read_error_count++; - } - temp_report.buttons = previous_button_state; - pd_dprintf("IQS5XX - get report failed: %d \n", status); + pd_dprintf("IQS5XX - get report failed, i2c status: %d \n", status); } } else { - pd_dprintf("IQS5XX - Init failed: %d \n", azoteq_iqs5xx_init_status); + pd_dprintf("IQS5XX - Init failed, i2c status: %d \n", azoteq_iqs5xx_init_status); } return temp_report; diff --git a/drivers/sensors/azoteq_iqs5xx.h b/drivers/sensors/azoteq_iqs5xx.h index 4190fe470c..e1e8b67b31 100644 --- a/drivers/sensors/azoteq_iqs5xx.h +++ b/drivers/sensors/azoteq_iqs5xx.h @@ -173,7 +173,8 @@ typedef struct { # define AZOTEQ_IQS5XX_REPORT_RATE 10 #endif #if !defined(POINTING_DEVICE_TASK_THROTTLE_MS) && !defined(POINTING_DEVICE_MOTION_PIN) -# define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE +// Polling the Azoteq isn't recommended, ensuring we only poll after the report is ready stops any unexpected NACKs +# define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE + 1 #endif const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver; From 26f898c8a538b808cf506f558a9454f7f50e3ba6 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 13 Jan 2025 11:39:40 +1100 Subject: [PATCH 129/592] `salane/ncr80alpsskfl`: add additional layouts (#24809) --- keyboards/salane/ncr80alpsskfl/keyboard.json | 315 +++++++++++++++++- .../salane/ncr80alpsskfl/matrix_diagram.md | 25 ++ 2 files changed, 337 insertions(+), 3 deletions(-) create mode 100644 keyboards/salane/ncr80alpsskfl/matrix_diagram.md diff --git a/keyboards/salane/ncr80alpsskfl/keyboard.json b/keyboards/salane/ncr80alpsskfl/keyboard.json index 512593d351..ce3f10c685 100644 --- a/keyboards/salane/ncr80alpsskfl/keyboard.json +++ b/keyboards/salane/ncr80alpsskfl/keyboard.json @@ -25,18 +25,24 @@ "caps_lock": "GP1", "scroll_lock": "GP2" }, + "layout_aliases": { + "LAYOUT_all": "LAYOUT_ansi_tsangan_split_bs_rshift" + }, "layouts": { - "LAYOUT_all": { + "LAYOUT_ansi_tsangan": { "layout": [ {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "K01", "matrix": [0, 1], "x": 2, "y": 0}, {"label": "K02", "matrix": [0, 2], "x": 3, "y": 0}, {"label": "K03", "matrix": [0, 3], "x": 4, "y": 0}, {"label": "K04", "matrix": [0, 4], "x": 5, "y": 0}, + {"label": "K05", "matrix": [0, 5], "x": 6.5, "y": 0}, {"label": "K06", "matrix": [0, 6], "x": 7.5, "y": 0}, {"label": "K07", "matrix": [0, 7], "x": 8.5, "y": 0}, {"label": "K08", "matrix": [0, 8], "x": 9.5, "y": 0}, + {"label": "K09", "matrix": [0, 9], "x": 11, "y": 0}, {"label": "K0A", "matrix": [0, 10], "x": 12, "y": 0}, {"label": "K0B", "matrix": [0, 11], "x": 13, "y": 0}, @@ -55,8 +61,8 @@ {"label": "K1A", "matrix": [1, 10], "x": 10, "y": 2}, {"label": "K1B", "matrix": [1, 11], "x": 11, "y": 2}, {"label": "K1C", "matrix": [1, 12], "x": 12, "y": 2}, - {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2}, - {"label": "K1D", "matrix": [1, 13], "x": 14, "y": 2}, + {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2, "w": 2}, + {"label": "K1E", "matrix": [1, 14], "x": 15.25, "y": 2}, {"label": "K1F", "matrix": [1, 15], "x": 16.25, "y": 2}, {"label": "K1G", "matrix": [1, 16], "x": 17.25, "y": 2}, @@ -75,6 +81,106 @@ {"label": "K2B", "matrix": [2, 11], "x": 11.5, "y": 3}, {"label": "K2C", "matrix": [2, 12], "x": 12.5, "y": 3}, {"label": "K2D", "matrix": [2, 13], "x": 13.5, "y": 3, "w": 1.5}, + + {"label": "K2E", "matrix": [2, 14], "x": 15.25, "y": 3}, + {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 3}, + {"label": "K2G", "matrix": [2, 16], "x": 17.25, "y": 3}, + + {"label": "K30", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.75}, + {"label": "K31", "matrix": [3, 1], "x": 1.75, "y": 4}, + {"label": "K32", "matrix": [3, 2], "x": 2.75, "y": 4}, + {"label": "K33", "matrix": [3, 3], "x": 3.75, "y": 4}, + {"label": "K34", "matrix": [3, 4], "x": 4.75, "y": 4}, + {"label": "K35", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "K36", "matrix": [3, 6], "x": 6.75, "y": 4}, + {"label": "K37", "matrix": [3, 7], "x": 7.75, "y": 4}, + {"label": "K38", "matrix": [3, 8], "x": 8.75, "y": 4}, + {"label": "K39", "matrix": [3, 9], "x": 9.75, "y": 4}, + {"label": "K3A", "matrix": [3, 10], "x": 10.75, "y": 4}, + {"label": "K3B", "matrix": [3, 11], "x": 11.75, "y": 4}, + {"label": "K3D", "matrix": [3, 13], "x": 12.75, "y": 4, "w": 2.25}, + + {"label": "K40", "matrix": [4, 0], "x": 0, "y": 5, "w": 2.25}, + {"label": "K42", "matrix": [4, 2], "x": 2.25, "y": 5}, + {"label": "K43", "matrix": [4, 3], "x": 3.25, "y": 5}, + {"label": "K44", "matrix": [4, 4], "x": 4.25, "y": 5}, + {"label": "K45", "matrix": [4, 5], "x": 5.25, "y": 5}, + {"label": "K46", "matrix": [4, 6], "x": 6.25, "y": 5}, + {"label": "K47", "matrix": [4, 7], "x": 7.25, "y": 5}, + {"label": "K48", "matrix": [4, 8], "x": 8.25, "y": 5}, + {"label": "K49", "matrix": [4, 9], "x": 9.25, "y": 5}, + {"label": "K4A", "matrix": [4, 10], "x": 10.25, "y": 5}, + {"label": "K4B", "matrix": [4, 11], "x": 11.25, "y": 5}, + {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 5, "w": 2.75}, + + {"label": "K4F", "matrix": [4, 15], "x": 16.25, "y": 5}, + + {"label": "K50", "matrix": [5, 0], "x": 0, "y": 6, "w": 1.5}, + {"label": "K51", "matrix": [5, 1], "x": 1.5, "y": 6}, + {"label": "K52", "matrix": [5, 2], "x": 2.5, "y": 6, "w": 1.5}, + {"label": "K57", "matrix": [5, 7], "x": 4, "y": 6, "w": 7}, + {"label": "K5B", "matrix": [5, 11], "x": 11, "y": 6, "w": 1.5}, + {"label": "K5C", "matrix": [5, 12], "x": 12.5, "y": 6}, + {"label": "K5D", "matrix": [5, 13], "x": 13.5, "y": 6, "w": 1.5}, + + {"label": "K5E", "matrix": [5, 14], "x": 15.25, "y": 6}, + {"label": "K5F", "matrix": [5, 15], "x": 16.25, "y": 6}, + {"label": "K5G", "matrix": [5, 16], "x": 17.25, "y": 6} + ] + }, + "LAYOUT_ansi_tsangan_split_rshift": { + "layout": [ + {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "K01", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "K02", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "K03", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "K04", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "K05", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "K06", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "K07", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "K08", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "K09", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "K0A", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "K0B", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "K0C", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "K10", "matrix": [1, 0], "x": 0, "y": 2}, + {"label": "K11", "matrix": [1, 1], "x": 1, "y": 2}, + {"label": "K12", "matrix": [1, 2], "x": 2, "y": 2}, + {"label": "K13", "matrix": [1, 3], "x": 3, "y": 2}, + {"label": "K14", "matrix": [1, 4], "x": 4, "y": 2}, + {"label": "K15", "matrix": [1, 5], "x": 5, "y": 2}, + {"label": "K16", "matrix": [1, 6], "x": 6, "y": 2}, + {"label": "K17", "matrix": [1, 7], "x": 7, "y": 2}, + {"label": "K18", "matrix": [1, 8], "x": 8, "y": 2}, + {"label": "K19", "matrix": [1, 9], "x": 9, "y": 2}, + {"label": "K1A", "matrix": [1, 10], "x": 10, "y": 2}, + {"label": "K1B", "matrix": [1, 11], "x": 11, "y": 2}, + {"label": "K1C", "matrix": [1, 12], "x": 12, "y": 2}, + {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2, "w": 2}, + + {"label": "K1E", "matrix": [1, 14], "x": 15.25, "y": 2}, + {"label": "K1F", "matrix": [1, 15], "x": 16.25, "y": 2}, + {"label": "K1G", "matrix": [1, 16], "x": 17.25, "y": 2}, + + {"label": "K20", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.5}, + {"label": "K21", "matrix": [2, 1], "x": 1.5, "y": 3}, + {"label": "K22", "matrix": [2, 2], "x": 2.5, "y": 3}, + {"label": "K23", "matrix": [2, 3], "x": 3.5, "y": 3}, + {"label": "K24", "matrix": [2, 4], "x": 4.5, "y": 3}, + {"label": "K25", "matrix": [2, 5], "x": 5.5, "y": 3}, + {"label": "K26", "matrix": [2, 6], "x": 6.5, "y": 3}, + {"label": "K27", "matrix": [2, 7], "x": 7.5, "y": 3}, + {"label": "K28", "matrix": [2, 8], "x": 8.5, "y": 3}, + {"label": "K29", "matrix": [2, 9], "x": 9.5, "y": 3}, + {"label": "K2A", "matrix": [2, 10], "x": 10.5, "y": 3}, + {"label": "K2B", "matrix": [2, 11], "x": 11.5, "y": 3}, + {"label": "K2C", "matrix": [2, 12], "x": 12.5, "y": 3}, + {"label": "K2D", "matrix": [2, 13], "x": 13.5, "y": 3, "w": 1.5}, + {"label": "K2E", "matrix": [2, 14], "x": 15.25, "y": 3}, {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 3}, {"label": "K2G", "matrix": [2, 16], "x": 17.25, "y": 3}, @@ -106,6 +212,7 @@ {"label": "K4B", "matrix": [4, 11], "x": 11.25, "y": 5}, {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 5, "w": 1.75}, {"label": "K4D", "matrix": [4, 13], "x": 14, "y": 5}, + {"label": "K4F", "matrix": [4, 15], "x": 16.25, "y": 5}, {"label": "K50", "matrix": [5, 0], "x": 0, "y": 6, "w": 1.5}, @@ -115,6 +222,208 @@ {"label": "K5B", "matrix": [5, 11], "x": 11, "y": 6, "w": 1.5}, {"label": "K5C", "matrix": [5, 12], "x": 12.5, "y": 6}, {"label": "K5D", "matrix": [5, 13], "x": 13.5, "y": 6, "w": 1.5}, + + {"label": "K5E", "matrix": [5, 14], "x": 15.25, "y": 6}, + {"label": "K5F", "matrix": [5, 15], "x": 16.25, "y": 6}, + {"label": "K5G", "matrix": [5, 16], "x": 17.25, "y": 6} + ] + }, + "LAYOUT_ansi_tsangan_split_bs": { + "layout": [ + {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "K01", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "K02", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "K03", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "K04", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "K05", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "K06", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "K07", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "K08", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "K09", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "K0A", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "K0B", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "K0C", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "K10", "matrix": [1, 0], "x": 0, "y": 2}, + {"label": "K11", "matrix": [1, 1], "x": 1, "y": 2}, + {"label": "K12", "matrix": [1, 2], "x": 2, "y": 2}, + {"label": "K13", "matrix": [1, 3], "x": 3, "y": 2}, + {"label": "K14", "matrix": [1, 4], "x": 4, "y": 2}, + {"label": "K15", "matrix": [1, 5], "x": 5, "y": 2}, + {"label": "K16", "matrix": [1, 6], "x": 6, "y": 2}, + {"label": "K17", "matrix": [1, 7], "x": 7, "y": 2}, + {"label": "K18", "matrix": [1, 8], "x": 8, "y": 2}, + {"label": "K19", "matrix": [1, 9], "x": 9, "y": 2}, + {"label": "K1A", "matrix": [1, 10], "x": 10, "y": 2}, + {"label": "K1B", "matrix": [1, 11], "x": 11, "y": 2}, + {"label": "K1C", "matrix": [1, 12], "x": 12, "y": 2}, + {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2}, + {"label": "K1D", "matrix": [1, 13], "x": 14, "y": 2}, + + {"label": "K1E", "matrix": [1, 14], "x": 15.25, "y": 2}, + {"label": "K1F", "matrix": [1, 15], "x": 16.25, "y": 2}, + {"label": "K1G", "matrix": [1, 16], "x": 17.25, "y": 2}, + + {"label": "K20", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.5}, + {"label": "K21", "matrix": [2, 1], "x": 1.5, "y": 3}, + {"label": "K22", "matrix": [2, 2], "x": 2.5, "y": 3}, + {"label": "K23", "matrix": [2, 3], "x": 3.5, "y": 3}, + {"label": "K24", "matrix": [2, 4], "x": 4.5, "y": 3}, + {"label": "K25", "matrix": [2, 5], "x": 5.5, "y": 3}, + {"label": "K26", "matrix": [2, 6], "x": 6.5, "y": 3}, + {"label": "K27", "matrix": [2, 7], "x": 7.5, "y": 3}, + {"label": "K28", "matrix": [2, 8], "x": 8.5, "y": 3}, + {"label": "K29", "matrix": [2, 9], "x": 9.5, "y": 3}, + {"label": "K2A", "matrix": [2, 10], "x": 10.5, "y": 3}, + {"label": "K2B", "matrix": [2, 11], "x": 11.5, "y": 3}, + {"label": "K2C", "matrix": [2, 12], "x": 12.5, "y": 3}, + {"label": "K2D", "matrix": [2, 13], "x": 13.5, "y": 3, "w": 1.5}, + + {"label": "K2E", "matrix": [2, 14], "x": 15.25, "y": 3}, + {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 3}, + {"label": "K2G", "matrix": [2, 16], "x": 17.25, "y": 3}, + + {"label": "K30", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.75}, + {"label": "K31", "matrix": [3, 1], "x": 1.75, "y": 4}, + {"label": "K32", "matrix": [3, 2], "x": 2.75, "y": 4}, + {"label": "K33", "matrix": [3, 3], "x": 3.75, "y": 4}, + {"label": "K34", "matrix": [3, 4], "x": 4.75, "y": 4}, + {"label": "K35", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "K36", "matrix": [3, 6], "x": 6.75, "y": 4}, + {"label": "K37", "matrix": [3, 7], "x": 7.75, "y": 4}, + {"label": "K38", "matrix": [3, 8], "x": 8.75, "y": 4}, + {"label": "K39", "matrix": [3, 9], "x": 9.75, "y": 4}, + {"label": "K3A", "matrix": [3, 10], "x": 10.75, "y": 4}, + {"label": "K3B", "matrix": [3, 11], "x": 11.75, "y": 4}, + {"label": "K3D", "matrix": [3, 13], "x": 12.75, "y": 4, "w": 2.25}, + + {"label": "K40", "matrix": [4, 0], "x": 0, "y": 5, "w": 2.25}, + {"label": "K42", "matrix": [4, 2], "x": 2.25, "y": 5}, + {"label": "K43", "matrix": [4, 3], "x": 3.25, "y": 5}, + {"label": "K44", "matrix": [4, 4], "x": 4.25, "y": 5}, + {"label": "K45", "matrix": [4, 5], "x": 5.25, "y": 5}, + {"label": "K46", "matrix": [4, 6], "x": 6.25, "y": 5}, + {"label": "K47", "matrix": [4, 7], "x": 7.25, "y": 5}, + {"label": "K48", "matrix": [4, 8], "x": 8.25, "y": 5}, + {"label": "K49", "matrix": [4, 9], "x": 9.25, "y": 5}, + {"label": "K4A", "matrix": [4, 10], "x": 10.25, "y": 5}, + {"label": "K4B", "matrix": [4, 11], "x": 11.25, "y": 5}, + {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 5, "w": 2.75}, + + {"label": "K4F", "matrix": [4, 15], "x": 16.25, "y": 5}, + + {"label": "K50", "matrix": [5, 0], "x": 0, "y": 6, "w": 1.5}, + {"label": "K51", "matrix": [5, 1], "x": 1.5, "y": 6}, + {"label": "K52", "matrix": [5, 2], "x": 2.5, "y": 6, "w": 1.5}, + {"label": "K57", "matrix": [5, 7], "x": 4, "y": 6, "w": 7}, + {"label": "K5B", "matrix": [5, 11], "x": 11, "y": 6, "w": 1.5}, + {"label": "K5C", "matrix": [5, 12], "x": 12.5, "y": 6}, + {"label": "K5D", "matrix": [5, 13], "x": 13.5, "y": 6, "w": 1.5}, + + {"label": "K5E", "matrix": [5, 14], "x": 15.25, "y": 6}, + {"label": "K5F", "matrix": [5, 15], "x": 16.25, "y": 6}, + {"label": "K5G", "matrix": [5, 16], "x": 17.25, "y": 6} + ] + }, + "LAYOUT_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "K01", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "K02", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "K03", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "K04", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "K05", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "K06", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "K07", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "K08", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "K09", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "K0A", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "K0B", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "K0C", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "K10", "matrix": [1, 0], "x": 0, "y": 2}, + {"label": "K11", "matrix": [1, 1], "x": 1, "y": 2}, + {"label": "K12", "matrix": [1, 2], "x": 2, "y": 2}, + {"label": "K13", "matrix": [1, 3], "x": 3, "y": 2}, + {"label": "K14", "matrix": [1, 4], "x": 4, "y": 2}, + {"label": "K15", "matrix": [1, 5], "x": 5, "y": 2}, + {"label": "K16", "matrix": [1, 6], "x": 6, "y": 2}, + {"label": "K17", "matrix": [1, 7], "x": 7, "y": 2}, + {"label": "K18", "matrix": [1, 8], "x": 8, "y": 2}, + {"label": "K19", "matrix": [1, 9], "x": 9, "y": 2}, + {"label": "K1A", "matrix": [1, 10], "x": 10, "y": 2}, + {"label": "K1B", "matrix": [1, 11], "x": 11, "y": 2}, + {"label": "K1C", "matrix": [1, 12], "x": 12, "y": 2}, + {"label": "K0D", "matrix": [0, 13], "x": 13, "y": 2}, + {"label": "K1D", "matrix": [1, 13], "x": 14, "y": 2}, + + {"label": "K1E", "matrix": [1, 14], "x": 15.25, "y": 2}, + {"label": "K1F", "matrix": [1, 15], "x": 16.25, "y": 2}, + {"label": "K1G", "matrix": [1, 16], "x": 17.25, "y": 2}, + + {"label": "K20", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.5}, + {"label": "K21", "matrix": [2, 1], "x": 1.5, "y": 3}, + {"label": "K22", "matrix": [2, 2], "x": 2.5, "y": 3}, + {"label": "K23", "matrix": [2, 3], "x": 3.5, "y": 3}, + {"label": "K24", "matrix": [2, 4], "x": 4.5, "y": 3}, + {"label": "K25", "matrix": [2, 5], "x": 5.5, "y": 3}, + {"label": "K26", "matrix": [2, 6], "x": 6.5, "y": 3}, + {"label": "K27", "matrix": [2, 7], "x": 7.5, "y": 3}, + {"label": "K28", "matrix": [2, 8], "x": 8.5, "y": 3}, + {"label": "K29", "matrix": [2, 9], "x": 9.5, "y": 3}, + {"label": "K2A", "matrix": [2, 10], "x": 10.5, "y": 3}, + {"label": "K2B", "matrix": [2, 11], "x": 11.5, "y": 3}, + {"label": "K2C", "matrix": [2, 12], "x": 12.5, "y": 3}, + {"label": "K2D", "matrix": [2, 13], "x": 13.5, "y": 3, "w": 1.5}, + + {"label": "K2E", "matrix": [2, 14], "x": 15.25, "y": 3}, + {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 3}, + {"label": "K2G", "matrix": [2, 16], "x": 17.25, "y": 3}, + + {"label": "K30", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.75}, + {"label": "K31", "matrix": [3, 1], "x": 1.75, "y": 4}, + {"label": "K32", "matrix": [3, 2], "x": 2.75, "y": 4}, + {"label": "K33", "matrix": [3, 3], "x": 3.75, "y": 4}, + {"label": "K34", "matrix": [3, 4], "x": 4.75, "y": 4}, + {"label": "K35", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "K36", "matrix": [3, 6], "x": 6.75, "y": 4}, + {"label": "K37", "matrix": [3, 7], "x": 7.75, "y": 4}, + {"label": "K38", "matrix": [3, 8], "x": 8.75, "y": 4}, + {"label": "K39", "matrix": [3, 9], "x": 9.75, "y": 4}, + {"label": "K3A", "matrix": [3, 10], "x": 10.75, "y": 4}, + {"label": "K3B", "matrix": [3, 11], "x": 11.75, "y": 4}, + {"label": "K3D", "matrix": [3, 13], "x": 12.75, "y": 4, "w": 2.25}, + + {"label": "K40", "matrix": [4, 0], "x": 0, "y": 5, "w": 2.25}, + {"label": "K42", "matrix": [4, 2], "x": 2.25, "y": 5}, + {"label": "K43", "matrix": [4, 3], "x": 3.25, "y": 5}, + {"label": "K44", "matrix": [4, 4], "x": 4.25, "y": 5}, + {"label": "K45", "matrix": [4, 5], "x": 5.25, "y": 5}, + {"label": "K46", "matrix": [4, 6], "x": 6.25, "y": 5}, + {"label": "K47", "matrix": [4, 7], "x": 7.25, "y": 5}, + {"label": "K48", "matrix": [4, 8], "x": 8.25, "y": 5}, + {"label": "K49", "matrix": [4, 9], "x": 9.25, "y": 5}, + {"label": "K4A", "matrix": [4, 10], "x": 10.25, "y": 5}, + {"label": "K4B", "matrix": [4, 11], "x": 11.25, "y": 5}, + {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 5, "w": 1.75}, + {"label": "K4D", "matrix": [4, 13], "x": 14, "y": 5}, + + {"label": "K4F", "matrix": [4, 15], "x": 16.25, "y": 5}, + + {"label": "K50", "matrix": [5, 0], "x": 0, "y": 6, "w": 1.5}, + {"label": "K51", "matrix": [5, 1], "x": 1.5, "y": 6}, + {"label": "K52", "matrix": [5, 2], "x": 2.5, "y": 6, "w": 1.5}, + {"label": "K57", "matrix": [5, 7], "x": 4, "y": 6, "w": 7}, + {"label": "K5B", "matrix": [5, 11], "x": 11, "y": 6, "w": 1.5}, + {"label": "K5C", "matrix": [5, 12], "x": 12.5, "y": 6}, + {"label": "K5D", "matrix": [5, 13], "x": 13.5, "y": 6, "w": 1.5}, + {"label": "K5E", "matrix": [5, 14], "x": 15.25, "y": 6}, {"label": "K5F", "matrix": [5, 15], "x": 16.25, "y": 6}, {"label": "K5G", "matrix": [5, 16], "x": 17.25, "y": 6} diff --git a/keyboards/salane/ncr80alpsskfl/matrix_diagram.md b/keyboards/salane/ncr80alpsskfl/matrix_diagram.md new file mode 100644 index 0000000000..5e0f9d7eb5 --- /dev/null +++ b/keyboards/salane/ncr80alpsskfl/matrix_diagram.md @@ -0,0 +1,25 @@ +# Matrix Diagram for Salane NCR80 ALPS SKFL + +``` + ┌───────┐ + 2u Backspace │0D │ + └───────┘ +┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ +│00 │ │01 │02 │03 │04 │ │05 │06 │07 │08 │ │09 │0A │0B │0C │ +└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ + +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │0D │1D │ │1E │1F │1G │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D │ │2E │2F │2G │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │ +├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐ +│40 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4D │ │4F │ +├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐ +│50 │51 │52 │57 │5B │5C │5D │ │5E │5F │5G │ +└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘ + ┌──────────┐ + 2.75u RShift│4C │ + └──────────┘ +``` From 7f1c236c75b0a92b952882c6f211f78157978f63 Mon Sep 17 00:00:00 2001 From: HorrorTroll Date: Tue, 14 Jan 2025 12:20:36 +0700 Subject: [PATCH 130/592] Bugfix and update for AT32F415 (#24807) --- drivers/led/apa102.c | 2 +- .../handwired/onekey/at_start_f415/board.h | 4 +-- .../handwired/onekey/at_start_f415/config.h | 4 +-- .../handwired/onekey/at_start_f415/halconf.h | 4 +-- .../onekey/at_start_f415/keyboard.json | 4 +++ .../handwired/onekey/at_start_f415/mcuconf.h | 4 +-- .../boards/GENERIC_AT32_F415XX/board/board.c | 4 +-- .../boards/GENERIC_AT32_F415XX/board/board.h | 28 ++++++++++++------- .../GENERIC_AT32_F415XX/configs/config.h | 4 +-- .../GENERIC_AT32_F415XX/configs/mcuconf.h | 16 ++++++----- platforms/chibios/chibios_config.h | 4 +-- 11 files changed, 46 insertions(+), 32 deletions(-) diff --git a/drivers/led/apa102.c b/drivers/led/apa102.c index 6e87d48b96..6a13153374 100644 --- a/drivers/led/apa102.c +++ b/drivers/led/apa102.c @@ -24,7 +24,7 @@ # elif defined(PROTOCOL_CHIBIOS) # include "hal.h" # include "chibios_config.h" -# if defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F3XX) || defined(STM32F4XX) || defined(STM32L0XX) || defined(GD32VF103) || defined(MCU_RP) +# if defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F3XX) || defined(STM32F4XX) || defined(STM32L0XX) || defined(AT32F415) || defined(GD32VF103) || defined(MCU_RP) # define APA102_NOPS (100 / (1000000000L / (CPU_CLOCK / 4))) // This calculates how many loops of 4 nops to run to delay 100 ns # else # error APA102_NOPS configuration required diff --git a/keyboards/handwired/onekey/at_start_f415/board.h b/keyboards/handwired/onekey/at_start_f415/board.h index f4adc2d418..a31d8f8e37 100644 --- a/keyboards/handwired/onekey/at_start_f415/board.h +++ b/keyboards/handwired/onekey/at_start_f415/board.h @@ -1,5 +1,5 @@ -// Copyright 2023-2024 HorrorTroll -// Copyright 2023-2024 Zhaqian +// Copyright 2023-2025 HorrorTroll +// Copyright 2023-2025 Zhaqian // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keyboards/handwired/onekey/at_start_f415/config.h b/keyboards/handwired/onekey/at_start_f415/config.h index 0e47e813c5..41aece900c 100644 --- a/keyboards/handwired/onekey/at_start_f415/config.h +++ b/keyboards/handwired/onekey/at_start_f415/config.h @@ -1,5 +1,5 @@ -// Copyright 2023-2024 HorrorTroll -// Copyright 2023-2024 Zhaqian +// Copyright 2023-2025 HorrorTroll +// Copyright 2023-2025 Zhaqian // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keyboards/handwired/onekey/at_start_f415/halconf.h b/keyboards/handwired/onekey/at_start_f415/halconf.h index 1423633d15..e3c075936d 100644 --- a/keyboards/handwired/onekey/at_start_f415/halconf.h +++ b/keyboards/handwired/onekey/at_start_f415/halconf.h @@ -1,5 +1,5 @@ -// Copyright 2023-2024 HorrorTroll -// Copyright 2023-2024 Zhaqian +// Copyright 2023-2025 HorrorTroll +// Copyright 2023-2025 Zhaqian // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keyboards/handwired/onekey/at_start_f415/keyboard.json b/keyboards/handwired/onekey/at_start_f415/keyboard.json index f598923a6a..6e5683a474 100644 --- a/keyboards/handwired/onekey/at_start_f415/keyboard.json +++ b/keyboards/handwired/onekey/at_start_f415/keyboard.json @@ -17,4 +17,8 @@ "ws2812": { "pin": "B0" } + "apa102": { + "data_pin": "B0", + "clock_pin": "B1" + } } diff --git a/keyboards/handwired/onekey/at_start_f415/mcuconf.h b/keyboards/handwired/onekey/at_start_f415/mcuconf.h index 9bc11d507c..246f6762d3 100644 --- a/keyboards/handwired/onekey/at_start_f415/mcuconf.h +++ b/keyboards/handwired/onekey/at_start_f415/mcuconf.h @@ -1,5 +1,5 @@ -// Copyright 2023-2024 HorrorTroll -// Copyright 2023-2024 Zhaqian +// Copyright 2023-2025 HorrorTroll +// Copyright 2023-2025 Zhaqian // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.c b/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.c index 28cf7c18e0..26b1974e4a 100644 --- a/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.c +++ b/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.c @@ -1,7 +1,7 @@ /* ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - ChibiOS - Copyright (C) 2023..2024 HorrorTroll - ChibiOS - Copyright (C) 2023..2024 Zhaqian + ChibiOS - Copyright (C) 2023..2025 HorrorTroll + ChibiOS - Copyright (C) 2023..2025 Zhaqian Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.h b/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.h index c3ade198ba..b4909b0a29 100644 --- a/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.h +++ b/platforms/chibios/boards/GENERIC_AT32_F415XX/board/board.h @@ -1,7 +1,7 @@ /* ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - ChibiOS - Copyright (C) 2023..2024 HorrorTroll - ChibiOS - Copyright (C) 2023..2024 Zhaqian + ChibiOS - Copyright (C) 2023..2025 HorrorTroll + ChibiOS - Copyright (C) 2023..2025 Zhaqian Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -49,6 +49,14 @@ */ #define AT32F415KB +/* + * GPIO settings, allow unused GPIO for smaller chip packages. + */ +#if defined(AT32F415KB) || defined(AT32F415KC) +#define AT32_HAS_GPIOC TRUE +#define AT32_HAS_GPIOF TRUE +#endif + /* * IO pins assignments. */ @@ -142,21 +150,21 @@ * 6 - Open Drain output 2MHz. * 7 - Open Drain output 50MHz. * 8 - Digital input with Pull-Up or Pull-Down resistor depending on ODT. - * 9 - Alternate Push Pull output 10MHz. - * A - Alternate Push Pull output 2MHz. - * B - Alternate Push Pull output 50MHz. + * 9 - Multiplexing Push Pull output 10MHz. + * A - Multiplexing Push Pull output 2MHz. + * B - Multiplexing Push Pull output 50MHz. * C - Reserved. - * D - Alternate Open Drain output 10MHz. - * E - Alternate Open Drain output 2MHz. - * F - Alternate Open Drain output 50MHz. + * D - Multiplexing Open Drain output 10MHz. + * E - Multiplexing Open Drain output 2MHz. + * F - Multiplexing Open Drain output 50MHz. * Please refer to the AT32 Reference Manual for details. */ /* * Port A setup. */ -#define VAL_GPIOACFGLR 0x88888B88 /* PA7...PA0 */ -#define VAL_GPIOACFGHR 0x888888B8 /* PA15...PA8 */ +#define VAL_GPIOACFGLR 0x88888888 /* PA7...PA0 */ +#define VAL_GPIOACFGHR 0x88888888 /* PA15...PA8 */ #define VAL_GPIOAODT 0xFFFFFFFF /* diff --git a/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/config.h b/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/config.h index da60447a0a..01d9a47aac 100644 --- a/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/config.h +++ b/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/config.h @@ -1,5 +1,5 @@ -// Copyright 2023-2024 HorrorTroll -// Copyright 2023-2024 Zhaqian +// Copyright 2023-2025 HorrorTroll +// Copyright 2023-2025 Zhaqian // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/mcuconf.h b/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/mcuconf.h index d148379fe1..e218e4791a 100644 --- a/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/mcuconf.h +++ b/platforms/chibios/boards/GENERIC_AT32_F415XX/configs/mcuconf.h @@ -1,7 +1,7 @@ /* ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio - ChibiOS - Copyright (C) 2023..2024 HorrorTroll - ChibiOS - Copyright (C) 2023..2024 Zhaqian + ChibiOS - Copyright (C) 2023..2025 HorrorTroll + ChibiOS - Copyright (C) 2023..2025 Zhaqian Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -63,7 +63,7 @@ #define AT32_USBDIV AT32_USBDIV_DIV3 #define AT32_CLKOUT_SEL AT32_CLKOUT_SEL_NOCLOCK #define AT32_CLKOUTDIV AT32_CLKOUTDIV_DIV1 -#define AT32_ERTCSEL AT32_ERTCSEL_HEXTDIV +#define AT32_ERTCSEL AT32_ERTCSEL_NOCLOCK #define AT32_PVM_ENABLE FALSE #define AT32_PVMSEL AT32_PVMSEL_LEV1 @@ -136,10 +136,10 @@ #define AT32_I2C_USE_I2C1 FALSE #define AT32_I2C_USE_I2C2 FALSE #define AT32_I2C_BUSY_TIMEOUT 50 -#define AT32_I2C_I2C1_IRQ_PRIORITY 5 -#define AT32_I2C_I2C2_IRQ_PRIORITY 5 #define AT32_I2C_I2C1_DMA_PRIORITY 3 #define AT32_I2C_I2C2_DMA_PRIORITY 3 +#define AT32_I2C_I2C1_IRQ_PRIORITY 5 +#define AT32_I2C_I2C2_IRQ_PRIORITY 5 #define AT32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") /* @@ -151,8 +151,6 @@ #define AT32_ICU_USE_TMR4 FALSE #define AT32_ICU_USE_TMR5 FALSE #define AT32_ICU_USE_TMR9 FALSE -#define AT32_ICU_USE_TMR10 FALSE -#define AT32_ICU_USE_TMR11 FALSE /* * PWM driver system settings. @@ -216,9 +214,13 @@ #define AT32_UART_USE_USART1 FALSE #define AT32_UART_USE_USART2 FALSE #define AT32_UART_USE_USART3 FALSE +#define AT32_UART_USE_UART4 FALSE +#define AT32_UART_USE_UART5 FALSE #define AT32_UART_USART1_DMA_PRIORITY 0 #define AT32_UART_USART2_DMA_PRIORITY 0 #define AT32_UART_USART3_DMA_PRIORITY 0 +#define AT32_UART_UART4_DMA_PRIORITY 0 +#define AT32_UART_UART5_DMA_PRIORITY 0 #define AT32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") /* diff --git a/platforms/chibios/chibios_config.h b/platforms/chibios/chibios_config.h index 95136baf30..9ef8e9b4fe 100644 --- a/platforms/chibios/chibios_config.h +++ b/platforms/chibios/chibios_config.h @@ -149,8 +149,8 @@ # if defined(AT32F415) # define USE_GPIOV1 # define USE_I2CV1 -# define PAL_MODE_ALTERNATE_OPENDRAIN PAL_MODE_AT32_ALTERNATE_OPENDRAIN -# define PAL_MODE_ALTERNATE_PUSHPULL PAL_MODE_AT32_ALTERNATE_PUSHPULL +# define PAL_MODE_ALTERNATE_OPENDRAIN PAL_MODE_AT32_MUX_OPENDRAIN +# define PAL_MODE_ALTERNATE_PUSHPULL PAL_MODE_AT32_MUX_PUSHPULL # define AUDIO_PWM_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL # endif #endif From 7b83bb9d267fc4f2909cb87965d873487a9a4e1d Mon Sep 17 00:00:00 2001 From: Haim Gelfenbeyn Date: Wed, 15 Jan 2025 14:36:20 -0500 Subject: [PATCH 131/592] Allow running Docker container on MacOS (without in-container USB support) (#24412) --- docs/getting_started_docker.md | 7 +++++++ util/docker_cmd.sh | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/getting_started_docker.md b/docs/getting_started_docker.md index 2d90d8566a..42322397b4 100644 --- a/docs/getting_started_docker.md +++ b/docs/getting_started_docker.md @@ -50,6 +50,13 @@ By default docker or podman are automatically detected and docker is preferred o RUNTIME="podman" util/docker_build.sh keyboard:keymap:target ``` +If flashing is not required, it's possible to run the container as unprivileged (on Linux), and without docker-machine (on Windows/macOS): + +``` +SKIP_FLASHING_SUPPORT=1 util/docker_build.sh keyboard:keymap:target +``` + + ## FAQ ### Why can't I flash on Windows/macOS diff --git a/util/docker_cmd.sh b/util/docker_cmd.sh index 18725db068..cb0c4f3281 100755 --- a/util/docker_cmd.sh +++ b/util/docker_cmd.sh @@ -34,15 +34,17 @@ if [ -z "$RUNTIME" ]; then fi fi - -# IF we are using docker on non Linux and docker-machine isn't working print an error -# ELSE set usb_args -if [ ! "$(uname)" = "Linux" ] && [ "$RUNTIME" = "docker" ] && ! docker-machine active >/dev/null 2>&1; then - errcho "Error: target requires docker-machine to work on your platform" - errcho "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" - exit 3 -else - usb_args="--privileged -v /dev:/dev" +# If SKIP_FLASHING_SUPPORT is defined, do not check for docker-machine and do not run a privileged container +if [ -z "$SKIP_FLASHING_SUPPORT" ]; then + # IF we are using docker on non Linux and docker-machine isn't working print an error + # ELSE set usb_args + if [ ! "$(uname)" = "Linux" ] && [ "$RUNTIME" = "docker" ] && ! docker-machine active >/dev/null 2>&1; then + errcho "Error: target requires docker-machine to work on your platform" + errcho "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" + exit 3 + else + usb_args="--privileged -v /dev:/dev" + fi fi qmk_firmware_dir=$(pwd -W 2>/dev/null) || qmk_firmware_dir=$PWD # Use Windows path if on Windows From 6b368f4ab23eceff46be7c1c064e0e25966f101f Mon Sep 17 00:00:00 2001 From: Patrick Fan <124469718+lighteningAB@users.noreply.github.com> Date: Sat, 18 Jan 2025 04:02:19 +0000 Subject: [PATCH 132/592] [Keyboard] Add ic45v2 (#24818) * adding in ic45 handwired * fix wrong title * Apply suggestions from code review Thank you @waffle87 Co-authored-by: jack * Update keyboards/handwired/ic45_v2/keyboard.json adding whitespace Co-authored-by: Drashna Jaelre --------- Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/handwired/ic45_v2/keyboard.json | 79 +++++++++++++++++++ .../ic45_v2/keymaps/default/keymap.c | 39 +++++++++ keyboards/handwired/ic45_v2/readme.md | 26 ++++++ 3 files changed, 144 insertions(+) create mode 100644 keyboards/handwired/ic45_v2/keyboard.json create mode 100644 keyboards/handwired/ic45_v2/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ic45_v2/readme.md diff --git a/keyboards/handwired/ic45_v2/keyboard.json b/keyboards/handwired/ic45_v2/keyboard.json new file mode 100644 index 0000000000..7d8692c9af --- /dev/null +++ b/keyboards/handwired/ic45_v2/keyboard.json @@ -0,0 +1,79 @@ +{ + "manufacturer": "PatrickFan", + "keyboard_name": "ic45_v2", + "maintainer": "PatrickFan", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["F0", "F1", "F4", "F5", "F6", "F7", "B0", "B1", "D5", "D4", "D6", "D7", "B4"], + "rows": ["B6", "C6", "C7", "B5"] + }, + "processor": "atmega32u4", + "url": "https://github.com/lighteningAB/45keyboard_v1", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0}, + {"matrix": [0, 12], "x": 12.5, "y": 0}, + {"matrix": [3, 12], "x": 13.5, "y": 0, "w": 1.5}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.75}, + {"matrix": [1, 1], "x": 1.75, "y": 1}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 7.75, "y": 1}, + {"matrix": [1, 8], "x": 8.75, "y": 1}, + {"matrix": [1, 9], "x": 9.75, "y": 1}, + {"matrix": [1, 10], "x": 10.75, "y": 1}, + {"matrix": [1, 11], "x": 11.75, "y": 1}, + {"matrix": [1, 12], "x": 12.75, "y": 1, "w": 2.25}, + + {"matrix": [2, 1], "x": 0, "y": 2, "w": 2.25}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [2, 8], "x": 8.25, "y": 2}, + {"matrix": [2, 9], "x": 9.25, "y": 2}, + {"matrix": [2, 10], "x": 10.25, "y": 2}, + {"matrix": [2, 11], "x": 11.25, "y": 2}, + {"matrix": [2, 12], "x": 12.25, "y": 2, "w": 2.75}, + + {"matrix": [3, 2], "x": 2, "y": 3, "w": 1.25}, + {"matrix": [3, 3], "x": 3.25, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 4.5, "y": 3, "w": 2.25}, + {"matrix": [3, 8], "x": 6.75, "y": 3, "w": 2.75}, + {"matrix": [3, 9], "x": 9.5, "y": 3, "w": 1.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3, "w": 1.25}, + {"matrix": [3, 11], "x": 12, "y": 3, "w": 1.25} + + ] + } + } +} diff --git a/keyboards/handwired/ic45_v2/keymaps/default/keymap.c b/keyboards/handwired/ic45_v2/keymaps/default/keymap.c new file mode 100644 index 0000000000..51357bce1f --- /dev/null +++ b/keyboards/handwired/ic45_v2/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* +Copyright 2025 Patrick Fan + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_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, + KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_RALT, KC_RGUI, MO(2), KC_BSLS + ), + [1] = LAYOUT( + 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 + ), + [2] = LAYOUT( + 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 + ) +}; diff --git a/keyboards/handwired/ic45_v2/readme.md b/keyboards/handwired/ic45_v2/readme.md new file mode 100644 index 0000000000..b4af92ae9a --- /dev/null +++ b/keyboards/handwired/ic45_v2/readme.md @@ -0,0 +1,26 @@ +# ic45_v2 + +![ic45_v2](https://i.imgur.com/a/FNxxXGd) + +*A 46-key keyboard ANSI keyboard with split spacebar. Files available here [here](https://github.com/lighteningAB/45keyboard_v1)* + +* Keyboard Maintainer: [PatrickFan](https://github.com/PatrickFan) +* Hardware Supported: Integrated ATmega32U4 +* Hardware Availability: [GitHub](https://github.com/lighteningAB/45keyboard_v1) + +Make example for this keyboard (after setting up your build environment): + + make handwired/ic45_v2:default + +Flashing example for this keyboard: + + make handwired/ic45_v2: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: + +* **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 d73c64e591864f8f8440086ac0e9acc434826527 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 18 Jan 2025 17:19:18 +1100 Subject: [PATCH 133/592] `kikoslab/kl90`: fix keymap (#24826) --- keyboards/kikoslab/kl90/keymaps/default/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/kikoslab/kl90/keymaps/default/keymap.c b/keyboards/kikoslab/kl90/keymaps/default/keymap.c index 4dbffe8f77..5cf7c75503 100644 --- a/keyboards/kikoslab/kl90/keymaps/default/keymap.c +++ b/keyboards/kikoslab/kl90/keymaps/default/keymap.c @@ -23,9 +23,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_DEL , 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_PSCR, KC_MPLY, KC_F13 , 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_INS , KC_F14 , 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_DEL , - KC_F15 , 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_PIPE, KC_ENT , KC_PGUP, - KC_F16 , 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_BSLS, KC_UP , KC_PGDN, - KC_F17 , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + KC_F15 , 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_F16 , 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_F17 , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), [2] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), }; bool encoder_update_user(uint8_t index, bool clockwise) { From 3c40e140138986fd58449cd31e2c5f790e2e4466 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Sat, 18 Jan 2025 18:52:33 +0100 Subject: [PATCH 134/592] Add Lily (#24813) Co-authored-by: Duncan Sutherland --- keyboards/ai03/lily/keyboard.json | 189 +++++++++++++++++++ keyboards/ai03/lily/keymaps/60_hhkb/keymap.c | 45 +++++ keyboards/ai03/lily/keymaps/default/keymap.c | 45 +++++ keyboards/ai03/lily/readme.md | 26 +++ 4 files changed, 305 insertions(+) create mode 100644 keyboards/ai03/lily/keyboard.json create mode 100644 keyboards/ai03/lily/keymaps/60_hhkb/keymap.c create mode 100644 keyboards/ai03/lily/keymaps/default/keymap.c create mode 100644 keyboards/ai03/lily/readme.md diff --git a/keyboards/ai03/lily/keyboard.json b/keyboards/ai03/lily/keyboard.json new file mode 100644 index 0000000000..ce482a674e --- /dev/null +++ b/keyboards/ai03/lily/keyboard.json @@ -0,0 +1,189 @@ +{ + "manufacturer": "ai03 Design Studio", + "keyboard_name": "Lily", + "maintainer": "ai03", + "bootloader": "atmel-dfu", + "build": { + "debounce_type": "asym_eager_defer_pk", + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "B0", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["F0", "F1", "F4", "F5", "F6", "F7", "C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4"], + "rows": ["B2", "B7", "D5", "B1", "D3"] + }, + "processor": "atmega32u4", + "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": 4 + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x0026", + "vid": "0xA103" + }, + "ws2812": { + "pin": "D2" + }, + "community_layouts": ["60_hhkb"], + "layouts": { + "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": [2, 12], "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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "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": [2, 12], "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, 5], "x": 4, "y": 4, "w": 3}, + {"matrix": [4, 7], "x": 7, "y": 4}, + {"matrix": [4, 9], "x": 8, "y": 4, "w": 3}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4} + ] + } + } +} diff --git a/keyboards/ai03/lily/keymaps/60_hhkb/keymap.c b/keyboards/ai03/lily/keymaps/60_hhkb/keymap.c new file mode 100644 index 0000000000..be9e2ee1a1 --- /dev/null +++ b/keyboards/ai03/lily/keymaps/60_hhkb/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2025 Cipulot & ai03 Design Studio + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_60_hhkb( + 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_BSLS, KC_GRV, + 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_BSPC, + 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_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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT + ), + + [1] = LAYOUT_60_hhkb( + _______, 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, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, _______, MO(2) + ), + + [2] = LAYOUT_60_hhkb( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______ + ) + // clang-format on +}; diff --git a/keyboards/ai03/lily/keymaps/default/keymap.c b/keyboards/ai03/lily/keymaps/default/keymap.c new file mode 100644 index 0000000000..ae1949810d --- /dev/null +++ b/keyboards/ai03/lily/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2025 Cipulot & ai03 Design Studio + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [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_BSLS, KC_GRV, + 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_BSPC, + 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_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_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT + ), + + [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, KC_INS, KC_DEL, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, + _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, _______, _______, _______, MO(2) + ), + + [2] = LAYOUT_all( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) + // clang-format on +}; diff --git a/keyboards/ai03/lily/readme.md b/keyboards/ai03/lily/readme.md new file mode 100644 index 0000000000..c8733629a2 --- /dev/null +++ b/keyboards/ai03/lily/readme.md @@ -0,0 +1,26 @@ +# Lily + +![Lily](https://i.imgur.com/nIhwT2V.png) + +PCB for Gok's Lily keyboard + +* Keyboard Maintainer: [ai03](https://github.com/ai03-2725) +* Hardware Supported: Lily PCB +* Hardware Availability: Through Lily group buy + +Make example for this keyboard (after setting up your build environment): + + make ai03/lily:default + +Flashing example for this keyboard: + + make ai03/liily: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: + +* **Physical reset**: Double tap the button on the bottom on the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From cedd49c59b5a822b6879485cdd412c7d803ae14a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 19 Jan 2025 17:07:11 +0000 Subject: [PATCH 135/592] Consolidate timer_elapsed implementations (#24830) --- platforms/avr/timer.c | 28 ---------------------------- platforms/chibios/timer.c | 8 -------- platforms/test/timer.c | 8 -------- platforms/timer.c | 8 ++++++++ quantum/debounce/tests/rules.mk | 1 + quantum/os_detection/tests/rules.mk | 1 + quantum/sequencer/tests/rules.mk | 1 + 7 files changed, 11 insertions(+), 44 deletions(-) diff --git a/platforms/avr/timer.c b/platforms/avr/timer.c index 26ba0e29fa..b2230ad84b 100644 --- a/platforms/avr/timer.c +++ b/platforms/avr/timer.c @@ -125,34 +125,6 @@ inline uint32_t timer_read32(void) { return t; } -/** \brief timer elapsed - * - * FIXME: needs doc - */ -inline uint16_t timer_elapsed(uint16_t last) { - uint32_t t; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - t = timer_count; - } - - return TIMER_DIFF_16((t & 0xFFFF), last); -} - -/** \brief timer elapsed32 - * - * FIXME: needs doc - */ -inline uint32_t timer_elapsed32(uint32_t last) { - uint32_t t; - - ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { - t = timer_count; - } - - return TIMER_DIFF_32(t, last); -} - // excecuted once per 1ms.(excess for just timer count?) #ifndef __AVR_ATmega32A__ # define TIMER_INTERRUPT_VECTOR TIMER0_COMPA_vect diff --git a/platforms/chibios/timer.c b/platforms/chibios/timer.c index a07cf5714f..9f7eade83f 100644 --- a/platforms/chibios/timer.c +++ b/platforms/chibios/timer.c @@ -118,11 +118,3 @@ uint32_t timer_read32(void) { return (uint32_t)TIME_I2MS(ticks) + ms_offset_copy; } - -uint16_t timer_elapsed(uint16_t last) { - return TIMER_DIFF_16(timer_read(), last); -} - -uint32_t timer_elapsed32(uint32_t last) { - return TIMER_DIFF_32(timer_read32(), last); -} diff --git a/platforms/test/timer.c b/platforms/test/timer.c index eb929d7dac..f5ee07fd57 100644 --- a/platforms/test/timer.c +++ b/platforms/test/timer.c @@ -60,14 +60,6 @@ uint32_t timer_read32(void) { return current_time; } -uint16_t timer_elapsed(uint16_t last) { - return TIMER_DIFF_16(timer_read(), last); -} - -uint32_t timer_elapsed32(uint32_t last) { - return TIMER_DIFF_32(timer_read32(), last); -} - void set_time(uint32_t t) { current_time = t; access_counter = 0; diff --git a/platforms/timer.c b/platforms/timer.c index 26038dcda3..ba2cf94d2b 100644 --- a/platforms/timer.c +++ b/platforms/timer.c @@ -6,3 +6,11 @@ // Generate out-of-line copies for inline functions defined in timer.h. extern inline fast_timer_t timer_read_fast(void); extern inline fast_timer_t timer_elapsed_fast(fast_timer_t last); + +uint16_t timer_elapsed(uint16_t last) { + return TIMER_DIFF_16(timer_read(), last); +} + +uint32_t timer_elapsed32(uint32_t last) { + return TIMER_DIFF_32(timer_read32(), last); +} diff --git a/quantum/debounce/tests/rules.mk b/quantum/debounce/tests/rules.mk index bbc362d4c7..d38b1cd342 100644 --- a/quantum/debounce/tests/rules.mk +++ b/quantum/debounce/tests/rules.mk @@ -16,6 +16,7 @@ DEBOUNCE_COMMON_DEFS := -DMATRIX_ROWS=4 -DMATRIX_COLS=10 -DDEBOUNCE=5 DEBOUNCE_COMMON_SRC := $(QUANTUM_PATH)/debounce/tests/debounce_test_common.cpp \ + $(PLATFORM_PATH)/timer.c \ $(PLATFORM_PATH)/$(PLATFORM_KEY)/timer.c debounce_none_DEFS := $(DEBOUNCE_COMMON_DEFS) diff --git a/quantum/os_detection/tests/rules.mk b/quantum/os_detection/tests/rules.mk index 1b69b71ba9..2f31f5e391 100644 --- a/quantum/os_detection/tests/rules.mk +++ b/quantum/os_detection/tests/rules.mk @@ -4,4 +4,5 @@ os_detection_DEFS += -DOS_DETECTION_DEBOUNCE=50 os_detection_SRC := \ $(QUANTUM_PATH)/os_detection/tests/os_detection.cpp \ $(QUANTUM_PATH)/os_detection.c \ + $(PLATFORM_PATH)/timer.c \ $(PLATFORM_PATH)/$(PLATFORM_KEY)/timer.c diff --git a/quantum/sequencer/tests/rules.mk b/quantum/sequencer/tests/rules.mk index 611459e060..74b680ae31 100644 --- a/quantum/sequencer/tests/rules.mk +++ b/quantum/sequencer/tests/rules.mk @@ -8,4 +8,5 @@ sequencer_SRC := \ $(QUANTUM_PATH)/sequencer/tests/midi_mock.c \ $(QUANTUM_PATH)/sequencer/tests/sequencer_tests.cpp \ $(QUANTUM_PATH)/sequencer/sequencer.c \ + $(PLATFORM_PATH)/timer.c \ $(PLATFORM_PATH)/$(PLATFORM_KEY)/timer.c From 58aea4b4795d81fcf3fdfd236b08903d1ffeeaca Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 20 Jan 2025 10:24:28 +1100 Subject: [PATCH 136/592] `i2c_master`: remove deprecated functions (#24832) --- platforms/avr/drivers/i2c_master.h | 7 ------- platforms/chibios/drivers/i2c_master.h | 7 ------- 2 files changed, 14 deletions(-) diff --git a/platforms/avr/drivers/i2c_master.h b/platforms/avr/drivers/i2c_master.h index b797997619..258bb2b9bf 100644 --- a/platforms/avr/drivers/i2c_master.h +++ b/platforms/avr/drivers/i2c_master.h @@ -21,13 +21,6 @@ #include -// ### DEPRECATED - DO NOT USE ### -#define i2c_writeReg(devaddr, regaddr, data, length, timeout) i2c_write_register(devaddr, regaddr, data, length, timeout) -#define i2c_writeReg16(devaddr, regaddr, data, length, timeout) i2c_write_register16(devaddr, regaddr, data, length, timeout) -#define i2c_readReg(devaddr, regaddr, data, length, timeout) i2c_read_register(devaddr, regaddr, data, length, timeout) -#define i2c_readReg16(devaddr, regaddr, data, length, timeout) i2c_read_register16(devaddr, regaddr, data, length, timeout) -// ############################### - #define I2C_READ 0x01 #define I2C_WRITE 0x00 diff --git a/platforms/chibios/drivers/i2c_master.h b/platforms/chibios/drivers/i2c_master.h index 132ffd14c0..2215f89ad2 100644 --- a/platforms/chibios/drivers/i2c_master.h +++ b/platforms/chibios/drivers/i2c_master.h @@ -26,13 +26,6 @@ #include -// ### DEPRECATED - DO NOT USE ### -#define i2c_writeReg(devaddr, regaddr, data, length, timeout) i2c_write_register(devaddr, regaddr, data, length, timeout) -#define i2c_writeReg16(devaddr, regaddr, data, length, timeout) i2c_write_register16(devaddr, regaddr, data, length, timeout) -#define i2c_readReg(devaddr, regaddr, data, length, timeout) i2c_read_register(devaddr, regaddr, data, length, timeout) -#define i2c_readReg16(devaddr, regaddr, data, length, timeout) i2c_read_register16(devaddr, regaddr, data, length, timeout) -// ############################### - typedef int16_t i2c_status_t; #define I2C_STATUS_SUCCESS (0) From d30cd87556e26f9b716d21a9bd799b271b96ebb4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 20 Jan 2025 03:45:47 +0000 Subject: [PATCH 137/592] Update via2json layout macro searching (#24640) --- lib/python/qmk/cli/via2json.py | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/python/qmk/cli/via2json.py b/lib/python/qmk/cli/via2json.py index 537e102640..0997e9ca9f 100755 --- a/lib/python/qmk/cli/via2json.py +++ b/lib/python/qmk/cli/via2json.py @@ -9,19 +9,15 @@ import qmk.keyboard import qmk.path from qmk.info import info_json from qmk.json_encoders import KeymapJSONEncoder -from qmk.commands import parse_configurator_json, dump_lines -from qmk.keymap import generate_json, list_keymaps, locate_keymap, parse_keymap_c +from qmk.commands import dump_lines +from qmk.keymap import generate_json -def _find_via_layout_macro(keyboard): - keymap_layout = None - if 'via' in list_keymaps(keyboard): - keymap_path = locate_keymap(keyboard, 'via') - if keymap_path.suffix == '.json': - keymap_layout = parse_configurator_json(keymap_path)['layout'] - else: - keymap_layout = parse_keymap_c(keymap_path)['layers'][0]['layout'] - return keymap_layout +def _find_via_layout_macro(keyboard_data): + """Assume layout macro when only 1 is available + """ + layouts = list(keyboard_data['layouts'].keys()) + return layouts[0] if len(layouts) == 1 else None def _convert_macros(via_macros): @@ -130,20 +126,16 @@ def via2json(cli): This command uses the `qmk.keymap` module to generate a keymap.json from a VIA backup json. The generated keymap is written to stdout, or to a file if -o is provided. """ - # Find appropriate layout macro - keymap_layout = cli.args.layout if cli.args.layout else _find_via_layout_macro(cli.args.keyboard) - if not keymap_layout: - cli.log.error(f"Couldn't find LAYOUT macro for keyboard {cli.args.keyboard}. Please specify it with the '-l' argument.") - return False - # Load the VIA backup json with cli.args.filename.open('r') as fd: via_backup = json.load(fd) - # Generate keyboard metadata keyboard_data = info_json(cli.args.keyboard) - if not keyboard_data: - cli.log.error(f'LAYOUT macro {keymap_layout} is not a valid one for keyboard {cli.args.keyboard}!') + + # Find appropriate layout macro + keymap_layout = cli.args.layout if cli.args.layout else _find_via_layout_macro(keyboard_data) + if not keymap_layout: + cli.log.error(f"Couldn't find LAYOUT macro for keyboard {cli.args.keyboard}. Please specify it with the '-l' argument.") return False # Get keycode array From 7a0dbe36f384e9c38120ab02f70d80f07193f53c Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 20 Jan 2025 04:55:01 +0000 Subject: [PATCH 138/592] Formally deprecate DEFAULT_FOLDER (#24836) --- data/mappings/info_rules.hjson | 1 + 1 file changed, 1 insertion(+) diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 64972af63b..00685b5b5f 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -55,5 +55,6 @@ // Items we want flagged in lint "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, + "DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true}, "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} } From 5c33ff8be4a61a3246df187486021b858fa7b55d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 20 Jan 2025 15:24:14 +0000 Subject: [PATCH 139/592] Remove DEFAULT_FOLDER where keyboard aliases already exists (#24838) --- keyboards/aeboards/constellation/rules.mk | 1 - keyboards/bpiphany/pegasushoof/rules.mk | 1 - keyboards/dp3000/rules.mk | 1 - keyboards/eek/rules.mk | 1 - keyboards/exclusive/e85/rules.mk | 1 - keyboards/keebio/dsp40/rules.mk | 1 - keyboards/keycapsss/plaid_pad/rules.mk | 1 - keyboards/kprepublic/jj40/rules.mk | 1 - keyboards/kprepublic/jj50/rules.mk | 1 - keyboards/lfkeyboards/lfk78/rules.mk | 1 - keyboards/lfkeyboards/smk65/rules.mk | 1 - keyboards/mechlovin/adelais/rgb_led/rules.mk | 1 - keyboards/mechlovin/adelais/standard_led/rules.mk | 1 - keyboards/mechlovin/delphine/rules.mk | 1 - keyboards/mechlovin/hannah60rgb/rules.mk | 1 - keyboards/mechlovin/hannah910/rules.mk | 1 - keyboards/mechlovin/hex4b/rules.mk | 1 - keyboards/melgeek/z70ultra/rules.mk | 1 - keyboards/montsinger/rebound/rules.mk | 1 - keyboards/polilla/rules.mk | 1 - keyboards/primekb/prime_l/rules.mk | 1 - keyboards/projectkb/alice/rules.mk | 1 - keyboards/rgbkb/pan/rev1/rules.mk | 2 -- keyboards/tkw/stoutgat/v2/rules.mk | 1 - keyboards/whale/sk/rules.mk | 1 - keyboards/ymdk/melody96/rules.mk | 1 - 26 files changed, 27 deletions(-) delete mode 100755 keyboards/aeboards/constellation/rules.mk delete mode 100644 keyboards/bpiphany/pegasushoof/rules.mk delete mode 100644 keyboards/dp3000/rules.mk delete mode 100644 keyboards/eek/rules.mk delete mode 100644 keyboards/exclusive/e85/rules.mk delete mode 100644 keyboards/keebio/dsp40/rules.mk delete mode 100644 keyboards/keycapsss/plaid_pad/rules.mk delete mode 100644 keyboards/kprepublic/jj40/rules.mk delete mode 100644 keyboards/kprepublic/jj50/rules.mk delete mode 100644 keyboards/lfkeyboards/lfk78/rules.mk delete mode 100644 keyboards/lfkeyboards/smk65/rules.mk delete mode 100644 keyboards/mechlovin/adelais/rgb_led/rules.mk delete mode 100644 keyboards/mechlovin/adelais/standard_led/rules.mk delete mode 100644 keyboards/mechlovin/delphine/rules.mk delete mode 100644 keyboards/mechlovin/hannah60rgb/rules.mk delete mode 100644 keyboards/mechlovin/hannah910/rules.mk delete mode 100644 keyboards/mechlovin/hex4b/rules.mk delete mode 100644 keyboards/melgeek/z70ultra/rules.mk delete mode 100644 keyboards/montsinger/rebound/rules.mk delete mode 100644 keyboards/polilla/rules.mk delete mode 100644 keyboards/primekb/prime_l/rules.mk delete mode 100644 keyboards/projectkb/alice/rules.mk delete mode 100644 keyboards/rgbkb/pan/rev1/rules.mk delete mode 100644 keyboards/tkw/stoutgat/v2/rules.mk delete mode 100644 keyboards/whale/sk/rules.mk delete mode 100644 keyboards/ymdk/melody96/rules.mk diff --git a/keyboards/aeboards/constellation/rules.mk b/keyboards/aeboards/constellation/rules.mk deleted file mode 100755 index bd2af5d22b..0000000000 --- a/keyboards/aeboards/constellation/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = aeboards/constellation/rev1 diff --git a/keyboards/bpiphany/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk deleted file mode 100644 index 20adecaa08..0000000000 --- a/keyboards/bpiphany/pegasushoof/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER=bpiphany/pegasushoof/2013 diff --git a/keyboards/dp3000/rules.mk b/keyboards/dp3000/rules.mk deleted file mode 100644 index 0f44aefd44..0000000000 --- a/keyboards/dp3000/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dp3000/rev1 diff --git a/keyboards/eek/rules.mk b/keyboards/eek/rules.mk deleted file mode 100644 index 65b8265b53..0000000000 --- a/keyboards/eek/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = eek/silk_down diff --git a/keyboards/exclusive/e85/rules.mk b/keyboards/exclusive/e85/rules.mk deleted file mode 100644 index 8eef46d0ab..0000000000 --- a/keyboards/exclusive/e85/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = exclusive/e85/hotswap diff --git a/keyboards/keebio/dsp40/rules.mk b/keyboards/keebio/dsp40/rules.mk deleted file mode 100644 index 3e8e9be18c..0000000000 --- a/keyboards/keebio/dsp40/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/dsp40/rev1 diff --git a/keyboards/keycapsss/plaid_pad/rules.mk b/keyboards/keycapsss/plaid_pad/rules.mk deleted file mode 100644 index 0ab7cc3141..0000000000 --- a/keyboards/keycapsss/plaid_pad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keycapsss/plaid_pad/rev1 diff --git a/keyboards/kprepublic/jj40/rules.mk b/keyboards/kprepublic/jj40/rules.mk deleted file mode 100644 index fa09523958..0000000000 --- a/keyboards/kprepublic/jj40/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kprepublic/jj40/rev1 diff --git a/keyboards/kprepublic/jj50/rules.mk b/keyboards/kprepublic/jj50/rules.mk deleted file mode 100644 index 8f77c68db2..0000000000 --- a/keyboards/kprepublic/jj50/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kprepublic/jj50/rev1 diff --git a/keyboards/lfkeyboards/lfk78/rules.mk b/keyboards/lfkeyboards/lfk78/rules.mk deleted file mode 100644 index 5ebd387c83..0000000000 --- a/keyboards/lfkeyboards/lfk78/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lfkeyboards/lfk78/revj diff --git a/keyboards/lfkeyboards/smk65/rules.mk b/keyboards/lfkeyboards/smk65/rules.mk deleted file mode 100644 index b2d7497663..0000000000 --- a/keyboards/lfkeyboards/smk65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lfkeyboards/smk65/revb diff --git a/keyboards/mechlovin/adelais/rgb_led/rules.mk b/keyboards/mechlovin/adelais/rgb_led/rules.mk deleted file mode 100644 index 18047f12c7..0000000000 --- a/keyboards/mechlovin/adelais/rgb_led/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/adelais/rgb_led/rev1 diff --git a/keyboards/mechlovin/adelais/standard_led/rules.mk b/keyboards/mechlovin/adelais/standard_led/rules.mk deleted file mode 100644 index a1d2ba038d..0000000000 --- a/keyboards/mechlovin/adelais/standard_led/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/adelais/standard_led/arm/rev2 diff --git a/keyboards/mechlovin/delphine/rules.mk b/keyboards/mechlovin/delphine/rules.mk deleted file mode 100644 index 819bce1cd3..0000000000 --- a/keyboards/mechlovin/delphine/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/delphine/mono_led diff --git a/keyboards/mechlovin/hannah60rgb/rules.mk b/keyboards/mechlovin/hannah60rgb/rules.mk deleted file mode 100644 index e876a56afb..0000000000 --- a/keyboards/mechlovin/hannah60rgb/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/hannah60rgb/rev1 diff --git a/keyboards/mechlovin/hannah910/rules.mk b/keyboards/mechlovin/hannah910/rules.mk deleted file mode 100644 index a356867197..0000000000 --- a/keyboards/mechlovin/hannah910/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/hannah910/rev1 diff --git a/keyboards/mechlovin/hex4b/rules.mk b/keyboards/mechlovin/hex4b/rules.mk deleted file mode 100644 index e3d9ab46b4..0000000000 --- a/keyboards/mechlovin/hex4b/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/hex4b/rev1 diff --git a/keyboards/melgeek/z70ultra/rules.mk b/keyboards/melgeek/z70ultra/rules.mk deleted file mode 100644 index 8cc384b91f..0000000000 --- a/keyboards/melgeek/z70ultra/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = melgeek/z70ultra/rev1 diff --git a/keyboards/montsinger/rebound/rules.mk b/keyboards/montsinger/rebound/rules.mk deleted file mode 100644 index d277d184e1..0000000000 --- a/keyboards/montsinger/rebound/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = montsinger/rebound/rev1 diff --git a/keyboards/polilla/rules.mk b/keyboards/polilla/rules.mk deleted file mode 100644 index 0d72c40bb6..0000000000 --- a/keyboards/polilla/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = polilla/rev1 \ No newline at end of file diff --git a/keyboards/primekb/prime_l/rules.mk b/keyboards/primekb/prime_l/rules.mk deleted file mode 100644 index 235bfea925..0000000000 --- a/keyboards/primekb/prime_l/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = primekb/prime_l/v1 diff --git a/keyboards/projectkb/alice/rules.mk b/keyboards/projectkb/alice/rules.mk deleted file mode 100644 index d672576992..0000000000 --- a/keyboards/projectkb/alice/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = projectkb/alice/rev1 diff --git a/keyboards/rgbkb/pan/rev1/rules.mk b/keyboards/rgbkb/pan/rev1/rules.mk deleted file mode 100644 index 4d3c0f6679..0000000000 --- a/keyboards/rgbkb/pan/rev1/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -# The default configuration is a atmega32a -DEFAULT_FOLDER = rgbkb/pan/rev1/32a diff --git a/keyboards/tkw/stoutgat/v2/rules.mk b/keyboards/tkw/stoutgat/v2/rules.mk deleted file mode 100644 index 1a660af26c..0000000000 --- a/keyboards/tkw/stoutgat/v2/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tkw/stoutgat/v2/f411 diff --git a/keyboards/whale/sk/rules.mk b/keyboards/whale/sk/rules.mk deleted file mode 100644 index 1a4ddedfa7..0000000000 --- a/keyboards/whale/sk/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = whale/sk/v3 diff --git a/keyboards/ymdk/melody96/rules.mk b/keyboards/ymdk/melody96/rules.mk deleted file mode 100644 index 806543977b..0000000000 --- a/keyboards/ymdk/melody96/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ymdk/melody96/soldered From 47575d4af16700e2dea8353c446dd4874e38d333 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 21 Jan 2025 02:30:19 +1100 Subject: [PATCH 140/592] LED drivers: remove deprecated defines (#24837) --- drivers/led/aw20216s.h | 260 ------------------ drivers/led/issi/is31fl3731-mono.h | 27 -- drivers/led/issi/is31fl3731.h | 27 -- drivers/led/issi/is31fl3733-mono.h | 32 --- drivers/led/issi/is31fl3733.h | 262 ------------------ drivers/led/issi/is31fl3736-mono.h | 140 ---------- drivers/led/issi/is31fl3736.h | 42 --- drivers/led/issi/is31fl3737-mono.h | 30 --- drivers/led/issi/is31fl3737.h | 203 -------------- drivers/led/issi/is31fl3741-mono.h | 401 --------------------------- drivers/led/issi/is31fl3741.h | 416 ----------------------------- drivers/led/issi/is31fl3743a.h | 211 --------------- drivers/led/snled27351-mono.h | 237 ---------------- drivers/led/snled27351.h | 249 ----------------- keyboards/zsa/voyager/voyager.c | 2 +- 15 files changed, 1 insertion(+), 2538 deletions(-) diff --git a/drivers/led/aw20216s.h b/drivers/led/aw20216s.h index b2c097125f..79b980fcdb 100644 --- a/drivers/led/aw20216s.h +++ b/drivers/led/aw20216s.h @@ -22,36 +22,6 @@ #include "gpio.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef AW_SCALING_MAX -# define AW20216S_SCALING_MAX AW_SCALING_MAX -#endif -#ifdef AW_GLOBAL_CURRENT_MAX -# define AW20216S_GLOBAL_CURRENT_MAX AW_GLOBAL_CURRENT_MAX -#endif -#ifdef AW_SPI_MODE -# define AW20216S_SPI_MODE AW_SPI_MODE -#endif -#ifdef AW_SPI_DIVISOR -# define AW20216S_SPI_DIVISOR AW_SPI_DIVISOR -#endif -#ifdef DRIVER_1_CS -# define AW20216S_CS_PIN_1 DRIVER_1_CS -#endif -#ifdef DRIVER_2_CS -# define AW20216S_CS_PIN_2 DRIVER_2_CS -#endif -#ifdef DRIVER_1_EN -# define AW20216S_EN_PIN DRIVER_1_EN -#endif -#ifdef AW20216S_EN_PIN_1 -# define AW20216S_EN_PIN AW20216S_EN_PIN_1 -#endif - -#define aw_led aw20216s_led_t -#define g_aw_leds g_aw20216s_leds -// ======== - #define AW20216S_ID (0b1010 << 4) #define AW20216S_WRITE 0 #define AW20216S_READ 1 @@ -328,233 +298,3 @@ void aw20216s_flush(void); #define SW12_CS16 0xD5 #define SW12_CS17 0xD6 #define SW12_CS18 0xD7 - -// DEPRECATED - DO NOT USE - -#define CS1_SW1 SW1_CS1 -#define CS2_SW1 SW1_CS2 -#define CS3_SW1 SW1_CS3 -#define CS4_SW1 SW1_CS4 -#define CS5_SW1 SW1_CS5 -#define CS6_SW1 SW1_CS6 -#define CS7_SW1 SW1_CS7 -#define CS8_SW1 SW1_CS8 -#define CS9_SW1 SW1_CS9 -#define CS10_SW1 SW1_CS10 -#define CS11_SW1 SW1_CS11 -#define CS12_SW1 SW1_CS12 -#define CS13_SW1 SW1_CS13 -#define CS14_SW1 SW1_CS14 -#define CS15_SW1 SW1_CS15 -#define CS16_SW1 SW1_CS16 -#define CS17_SW1 SW1_CS17 -#define CS18_SW1 SW1_CS18 - -#define CS1_SW2 SW2_CS1 -#define CS2_SW2 SW2_CS2 -#define CS3_SW2 SW2_CS3 -#define CS4_SW2 SW2_CS4 -#define CS5_SW2 SW2_CS5 -#define CS6_SW2 SW2_CS6 -#define CS7_SW2 SW2_CS7 -#define CS8_SW2 SW2_CS8 -#define CS9_SW2 SW2_CS9 -#define CS10_SW2 SW2_CS10 -#define CS11_SW2 SW2_CS11 -#define CS12_SW2 SW2_CS12 -#define CS13_SW2 SW2_CS13 -#define CS14_SW2 SW2_CS14 -#define CS15_SW2 SW2_CS15 -#define CS16_SW2 SW2_CS16 -#define CS17_SW2 SW2_CS17 -#define CS18_SW2 SW2_CS18 - -#define CS1_SW3 SW3_CS1 -#define CS2_SW3 SW3_CS2 -#define CS3_SW3 SW3_CS3 -#define CS4_SW3 SW3_CS4 -#define CS5_SW3 SW3_CS5 -#define CS6_SW3 SW3_CS6 -#define CS7_SW3 SW3_CS7 -#define CS8_SW3 SW3_CS8 -#define CS9_SW3 SW3_CS9 -#define CS10_SW3 SW3_CS10 -#define CS11_SW3 SW3_CS11 -#define CS12_SW3 SW3_CS12 -#define CS13_SW3 SW3_CS13 -#define CS14_SW3 SW3_CS14 -#define CS15_SW3 SW3_CS15 -#define CS16_SW3 SW3_CS16 -#define CS17_SW3 SW3_CS17 -#define CS18_SW3 SW3_CS18 - -#define CS1_SW4 SW4_CS1 -#define CS2_SW4 SW4_CS2 -#define CS3_SW4 SW4_CS3 -#define CS4_SW4 SW4_CS4 -#define CS5_SW4 SW4_CS5 -#define CS6_SW4 SW4_CS6 -#define CS7_SW4 SW4_CS7 -#define CS8_SW4 SW4_CS8 -#define CS9_SW4 SW4_CS9 -#define CS10_SW4 SW4_CS10 -#define CS11_SW4 SW4_CS11 -#define CS12_SW4 SW4_CS12 -#define CS13_SW4 SW4_CS13 -#define CS14_SW4 SW4_CS14 -#define CS15_SW4 SW4_CS15 -#define CS16_SW4 SW4_CS16 -#define CS17_SW4 SW4_CS17 -#define CS18_SW4 SW4_CS18 - -#define CS1_SW5 SW5_CS1 -#define CS2_SW5 SW5_CS2 -#define CS3_SW5 SW5_CS3 -#define CS4_SW5 SW5_CS4 -#define CS5_SW5 SW5_CS5 -#define CS6_SW5 SW5_CS6 -#define CS7_SW5 SW5_CS7 -#define CS8_SW5 SW5_CS8 -#define CS9_SW5 SW5_CS9 -#define CS10_SW5 SW5_CS10 -#define CS11_SW5 SW5_CS11 -#define CS12_SW5 SW5_CS12 -#define CS13_SW5 SW5_CS13 -#define CS14_SW5 SW5_CS14 -#define CS15_SW5 SW5_CS15 -#define CS16_SW5 SW5_CS16 -#define CS17_SW5 SW5_CS17 -#define CS18_SW5 SW5_CS18 - -#define CS1_SW6 SW6_CS1 -#define CS2_SW6 SW6_CS2 -#define CS3_SW6 SW6_CS3 -#define CS4_SW6 SW6_CS4 -#define CS5_SW6 SW6_CS5 -#define CS6_SW6 SW6_CS6 -#define CS7_SW6 SW6_CS7 -#define CS8_SW6 SW6_CS8 -#define CS9_SW6 SW6_CS9 -#define CS10_SW6 SW6_CS10 -#define CS11_SW6 SW6_CS11 -#define CS12_SW6 SW6_CS12 -#define CS13_SW6 SW6_CS13 -#define CS14_SW6 SW6_CS14 -#define CS15_SW6 SW6_CS15 -#define CS16_SW6 SW6_CS16 -#define CS17_SW6 SW6_CS17 -#define CS18_SW6 SW6_CS18 - -#define CS1_SW7 SW7_CS1 -#define CS2_SW7 SW7_CS2 -#define CS3_SW7 SW7_CS3 -#define CS4_SW7 SW7_CS4 -#define CS5_SW7 SW7_CS5 -#define CS6_SW7 SW7_CS6 -#define CS7_SW7 SW7_CS7 -#define CS8_SW7 SW7_CS8 -#define CS9_SW7 SW7_CS9 -#define CS10_SW7 SW7_CS10 -#define CS11_SW7 SW7_CS11 -#define CS12_SW7 SW7_CS12 -#define CS13_SW7 SW7_CS13 -#define CS14_SW7 SW7_CS14 -#define CS15_SW7 SW7_CS15 -#define CS16_SW7 SW7_CS16 -#define CS17_SW7 SW7_CS17 -#define CS18_SW7 SW7_CS18 - -#define CS1_SW8 SW8_CS1 -#define CS2_SW8 SW8_CS2 -#define CS3_SW8 SW8_CS3 -#define CS4_SW8 SW8_CS4 -#define CS5_SW8 SW8_CS5 -#define CS6_SW8 SW8_CS6 -#define CS7_SW8 SW8_CS7 -#define CS8_SW8 SW8_CS8 -#define CS9_SW8 SW8_CS9 -#define CS10_SW8 SW8_CS10 -#define CS11_SW8 SW8_CS11 -#define CS12_SW8 SW8_CS12 -#define CS13_SW8 SW8_CS13 -#define CS14_SW8 SW8_CS14 -#define CS15_SW8 SW8_CS15 -#define CS16_SW8 SW8_CS16 -#define CS17_SW8 SW8_CS17 -#define CS18_SW8 SW8_CS18 - -#define CS1_SW9 SW9_CS1 -#define CS2_SW9 SW9_CS2 -#define CS3_SW9 SW9_CS3 -#define CS4_SW9 SW9_CS4 -#define CS5_SW9 SW9_CS5 -#define CS6_SW9 SW9_CS6 -#define CS7_SW9 SW9_CS7 -#define CS8_SW9 SW9_CS8 -#define CS9_SW9 SW9_CS9 -#define CS10_SW9 SW9_CS10 -#define CS11_SW9 SW9_CS11 -#define CS12_SW9 SW9_CS12 -#define CS13_SW9 SW9_CS13 -#define CS14_SW9 SW9_CS14 -#define CS15_SW9 SW9_CS15 -#define CS16_SW9 SW9_CS16 -#define CS17_SW9 SW9_CS17 -#define CS18_SW9 SW9_CS18 - -#define CS1_SW10 SW10_CS1 -#define CS2_SW10 SW10_CS2 -#define CS3_SW10 SW10_CS3 -#define CS4_SW10 SW10_CS4 -#define CS5_SW10 SW10_CS5 -#define CS6_SW10 SW10_CS6 -#define CS7_SW10 SW10_CS7 -#define CS8_SW10 SW10_CS8 -#define CS9_SW10 SW10_CS9 -#define CS10_SW10 SW10_CS10 -#define CS11_SW10 SW10_CS11 -#define CS12_SW10 SW10_CS12 -#define CS13_SW10 SW10_CS13 -#define CS14_SW10 SW10_CS14 -#define CS15_SW10 SW10_CS15 -#define CS16_SW10 SW10_CS16 -#define CS17_SW10 SW10_CS17 -#define CS18_SW10 SW10_CS18 - -#define CS1_SW11 SW11_CS1 -#define CS2_SW11 SW11_CS2 -#define CS3_SW11 SW11_CS3 -#define CS4_SW11 SW11_CS4 -#define CS5_SW11 SW11_CS5 -#define CS6_SW11 SW11_CS6 -#define CS7_SW11 SW11_CS7 -#define CS8_SW11 SW11_CS8 -#define CS9_SW11 SW11_CS9 -#define CS10_SW11 SW11_CS10 -#define CS11_SW11 SW11_CS11 -#define CS12_SW11 SW11_CS12 -#define CS13_SW11 SW11_CS13 -#define CS14_SW11 SW11_CS14 -#define CS15_SW11 SW11_CS15 -#define CS16_SW11 SW11_CS16 -#define CS17_SW11 SW11_CS17 -#define CS18_SW11 SW11_CS18 - -#define CS1_SW12 SW12_CS1 -#define CS2_SW12 SW12_CS2 -#define CS3_SW12 SW12_CS3 -#define CS4_SW12 SW12_CS4 -#define CS5_SW12 SW12_CS5 -#define CS6_SW12 SW12_CS6 -#define CS7_SW12 SW12_CS7 -#define CS8_SW12 SW12_CS8 -#define CS9_SW12 SW12_CS9 -#define CS10_SW12 SW12_CS10 -#define CS11_SW12 SW12_CS11 -#define CS12_SW12 SW12_CS12 -#define CS13_SW12 SW12_CS13 -#define CS14_SW12 SW12_CS14 -#define CS15_SW12 SW12_CS15 -#define CS16_SW12 SW12_CS16 -#define CS17_SW12 SW12_CS17 -#define CS18_SW12 SW12_CS18 diff --git a/drivers/led/issi/is31fl3731-mono.h b/drivers/led/issi/is31fl3731-mono.h index e6e107d309..cc59b45cb3 100644 --- a/drivers/led/issi/is31fl3731-mono.h +++ b/drivers/led/issi/is31fl3731-mono.h @@ -23,33 +23,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef LED_DRIVER_ADDR_1 -# define IS31FL3731_I2C_ADDRESS_1 LED_DRIVER_ADDR_1 -#endif -#ifdef LED_DRIVER_ADDR_2 -# define IS31FL3731_I2C_ADDRESS_2 LED_DRIVER_ADDR_2 -#endif -#ifdef LED_DRIVER_ADDR_3 -# define IS31FL3731_I2C_ADDRESS_3 LED_DRIVER_ADDR_3 -#endif -#ifdef LED_DRIVER_ADDR_4 -# define IS31FL3731_I2C_ADDRESS_4 LED_DRIVER_ADDR_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3731_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3731_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_3731_DEGHOST -# define IS31FL3731_DEGHOST ISSI_3731_DEGHOST -#endif - -#define is31_led is31fl3731_led_t -#define g_is31_leds g_is31fl3731_leds -// ======== - #define IS31FL3731_REG_COMMAND 0xFD #define IS31FL3731_COMMAND_FRAME_1 0x00 #define IS31FL3731_COMMAND_FRAME_2 0x01 diff --git a/drivers/led/issi/is31fl3731.h b/drivers/led/issi/is31fl3731.h index dc229c876d..947b7dc8e9 100644 --- a/drivers/led/issi/is31fl3731.h +++ b/drivers/led/issi/is31fl3731.h @@ -22,33 +22,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define IS31FL3731_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define IS31FL3731_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define IS31FL3731_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define IS31FL3731_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3731_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3731_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_3731_DEGHOST -# define IS31FL3731_DEGHOST ISSI_3731_DEGHOST -#endif - -#define is31_led is31fl3731_led_t -#define g_is31_leds g_is31fl3731_leds -// ======== - #define IS31FL3731_REG_COMMAND 0xFD #define IS31FL3731_COMMAND_FRAME_1 0x00 #define IS31FL3731_COMMAND_FRAME_2 0x01 diff --git a/drivers/led/issi/is31fl3733-mono.h b/drivers/led/issi/is31fl3733-mono.h index 3786b2ed71..40d340a70d 100644 --- a/drivers/led/issi/is31fl3733-mono.h +++ b/drivers/led/issi/is31fl3733-mono.h @@ -25,38 +25,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef ISSI_TIMEOUT -# define IS31FL3733_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3733_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_PWM_FREQUENCY -# define IS31FL3733_PWM_FREQUENCY ISSI_PWM_FREQUENCY -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3733_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3733_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3733_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3733_led_t -#define g_is31_leds g_is31fl3733_leds - -#define PUR_0R IS31FL3733_PUR_0_OHM -#define PUR_05KR IS31FL3733_PUR_1K_OHM -#define PUR_3KR IS31FL3733_PUR_2K_OHM -#define PUR_4KR IS31FL3733_PUR_4K_OHM -#define PUR_8KR IS31FL3733_PUR_8K_OHM -#define PUR_16KR IS31FL3733_PUR_16K_OHM -#define PUR_32KR IS31FL3733_PUR_32K_OHM -// ======== - #define IS31FL3733_REG_INTERRUPT_MASK 0xF0 #define IS31FL3733_REG_INTERRUPT_STATUS 0xF1 diff --git a/drivers/led/issi/is31fl3733.h b/drivers/led/issi/is31fl3733.h index fb60c76c2d..8757d5ab07 100644 --- a/drivers/led/issi/is31fl3733.h +++ b/drivers/led/issi/is31fl3733.h @@ -24,62 +24,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define IS31FL3733_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define IS31FL3733_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define IS31FL3733_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define IS31FL3733_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef DRIVER_SYNC_1 -# define IS31FL3733_SYNC_1 DRIVER_SYNC_1 -#endif -#ifdef DRIVER_SYNC_2 -# define IS31FL3733_SYNC_2 DRIVER_SYNC_2 -#endif -#ifdef DRIVER_SYNC_3 -# define IS31FL3733_SYNC_3 DRIVER_SYNC_3 -#endif -#ifdef DRIVER_SYNC_4 -# define IS31FL3733_SYNC_4 DRIVER_SYNC_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3733_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3733_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_PWM_FREQUENCY -# define IS31FL3733_PWM_FREQUENCY ISSI_PWM_FREQUENCY -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3733_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3733_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3733_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3733_led_t -#define g_is31_leds g_is31fl3733_leds - -#define PUR_0R IS31FL3733_PUR_0_OHM -#define PUR_05KR IS31FL3733_PUR_1K_OHM -#define PUR_3KR IS31FL3733_PUR_2K_OHM -#define PUR_4KR IS31FL3733_PUR_4K_OHM -#define PUR_8KR IS31FL3733_PUR_8K_OHM -#define PUR_16KR IS31FL3733_PUR_16K_OHM -#define PUR_32KR IS31FL3733_PUR_32K_OHM -// ======== - #define IS31FL3733_REG_INTERRUPT_MASK 0xF0 #define IS31FL3733_REG_INTERRUPT_STATUS 0xF1 @@ -389,209 +333,3 @@ void is31fl3733_flush(void); #define SW12_CS14 0xBD #define SW12_CS15 0xBE #define SW12_CS16 0xBF - -// DEPRECATED - DO NOT USE - -#define A_1 SW1_CS1 -#define A_2 SW1_CS2 -#define A_3 SW1_CS3 -#define A_4 SW1_CS4 -#define A_5 SW1_CS5 -#define A_6 SW1_CS6 -#define A_7 SW1_CS7 -#define A_8 SW1_CS8 -#define A_9 SW1_CS9 -#define A_10 SW1_CS10 -#define A_11 SW1_CS11 -#define A_12 SW1_CS12 -#define A_13 SW1_CS13 -#define A_14 SW1_CS14 -#define A_15 SW1_CS15 -#define A_16 SW1_CS16 - -#define B_1 SW2_CS1 -#define B_2 SW2_CS2 -#define B_3 SW2_CS3 -#define B_4 SW2_CS4 -#define B_5 SW2_CS5 -#define B_6 SW2_CS6 -#define B_7 SW2_CS7 -#define B_8 SW2_CS8 -#define B_9 SW2_CS9 -#define B_10 SW2_CS10 -#define B_11 SW2_CS11 -#define B_12 SW2_CS12 -#define B_13 SW2_CS13 -#define B_14 SW2_CS14 -#define B_15 SW2_CS15 -#define B_16 SW2_CS16 - -#define C_1 SW3_CS1 -#define C_2 SW3_CS2 -#define C_3 SW3_CS3 -#define C_4 SW3_CS4 -#define C_5 SW3_CS5 -#define C_6 SW3_CS6 -#define C_7 SW3_CS7 -#define C_8 SW3_CS8 -#define C_9 SW3_CS9 -#define C_10 SW3_CS10 -#define C_11 SW3_CS11 -#define C_12 SW3_CS12 -#define C_13 SW3_CS13 -#define C_14 SW3_CS14 -#define C_15 SW3_CS15 -#define C_16 SW3_CS16 - -#define D_1 SW4_CS1 -#define D_2 SW4_CS2 -#define D_3 SW4_CS3 -#define D_4 SW4_CS4 -#define D_5 SW4_CS5 -#define D_6 SW4_CS6 -#define D_7 SW4_CS7 -#define D_8 SW4_CS8 -#define D_9 SW4_CS9 -#define D_10 SW4_CS10 -#define D_11 SW4_CS11 -#define D_12 SW4_CS12 -#define D_13 SW4_CS13 -#define D_14 SW4_CS14 -#define D_15 SW4_CS15 -#define D_16 SW4_CS16 - -#define E_1 SW5_CS1 -#define E_2 SW5_CS2 -#define E_3 SW5_CS3 -#define E_4 SW5_CS4 -#define E_5 SW5_CS5 -#define E_6 SW5_CS6 -#define E_7 SW5_CS7 -#define E_8 SW5_CS8 -#define E_9 SW5_CS9 -#define E_10 SW5_CS10 -#define E_11 SW5_CS11 -#define E_12 SW5_CS12 -#define E_13 SW5_CS13 -#define E_14 SW5_CS14 -#define E_15 SW5_CS15 -#define E_16 SW5_CS16 - -#define F_1 SW6_CS1 -#define F_2 SW6_CS2 -#define F_3 SW6_CS3 -#define F_4 SW6_CS4 -#define F_5 SW6_CS5 -#define F_6 SW6_CS6 -#define F_7 SW6_CS7 -#define F_8 SW6_CS8 -#define F_9 SW6_CS9 -#define F_10 SW6_CS10 -#define F_11 SW6_CS11 -#define F_12 SW6_CS12 -#define F_13 SW6_CS13 -#define F_14 SW6_CS14 -#define F_15 SW6_CS15 -#define F_16 SW6_CS16 - -#define G_1 SW7_CS1 -#define G_2 SW7_CS2 -#define G_3 SW7_CS3 -#define G_4 SW7_CS4 -#define G_5 SW7_CS5 -#define G_6 SW7_CS6 -#define G_7 SW7_CS7 -#define G_8 SW7_CS8 -#define G_9 SW7_CS9 -#define G_10 SW7_CS10 -#define G_11 SW7_CS11 -#define G_12 SW7_CS12 -#define G_13 SW7_CS13 -#define G_14 SW7_CS14 -#define G_15 SW7_CS15 -#define G_16 SW7_CS16 - -#define H_1 SW8_CS1 -#define H_2 SW8_CS2 -#define H_3 SW8_CS3 -#define H_4 SW8_CS4 -#define H_5 SW8_CS5 -#define H_6 SW8_CS6 -#define H_7 SW8_CS7 -#define H_8 SW8_CS8 -#define H_9 SW8_CS9 -#define H_10 SW8_CS10 -#define H_11 SW8_CS11 -#define H_12 SW8_CS12 -#define H_13 SW8_CS13 -#define H_14 SW8_CS14 -#define H_15 SW8_CS15 -#define H_16 SW8_CS16 - -#define I_1 SW9_CS1 -#define I_2 SW9_CS2 -#define I_3 SW9_CS3 -#define I_4 SW9_CS4 -#define I_5 SW9_CS5 -#define I_6 SW9_CS6 -#define I_7 SW9_CS7 -#define I_8 SW9_CS8 -#define I_9 SW9_CS9 -#define I_10 SW9_CS10 -#define I_11 SW9_CS11 -#define I_12 SW9_CS12 -#define I_13 SW9_CS13 -#define I_14 SW9_CS14 -#define I_15 SW9_CS15 -#define I_16 SW9_CS16 - -#define J_1 SW10_CS1 -#define J_2 SW10_CS2 -#define J_3 SW10_CS3 -#define J_4 SW10_CS4 -#define J_5 SW10_CS5 -#define J_6 SW10_CS6 -#define J_7 SW10_CS7 -#define J_8 SW10_CS8 -#define J_9 SW10_CS9 -#define J_10 SW10_CS10 -#define J_11 SW10_CS11 -#define J_12 SW10_CS12 -#define J_13 SW10_CS13 -#define J_14 SW10_CS14 -#define J_15 SW10_CS15 -#define J_16 SW10_CS16 - -#define K_1 SW11_CS1 -#define K_2 SW11_CS2 -#define K_3 SW11_CS3 -#define K_4 SW11_CS4 -#define K_5 SW11_CS5 -#define K_6 SW11_CS6 -#define K_7 SW11_CS7 -#define K_8 SW11_CS8 -#define K_9 SW11_CS9 -#define K_10 SW11_CS10 -#define K_11 SW11_CS11 -#define K_12 SW11_CS12 -#define K_13 SW11_CS13 -#define K_14 SW11_CS14 -#define K_15 SW11_CS15 -#define K_16 SW11_CS16 - -#define L_1 SW12_CS1 -#define L_2 SW12_CS2 -#define L_3 SW12_CS3 -#define L_4 SW12_CS4 -#define L_5 SW12_CS5 -#define L_6 SW12_CS6 -#define L_7 SW12_CS7 -#define L_8 SW12_CS8 -#define L_9 SW12_CS9 -#define L_10 SW12_CS10 -#define L_11 SW12_CS11 -#define L_12 SW12_CS12 -#define L_13 SW12_CS13 -#define L_14 SW12_CS14 -#define L_15 SW12_CS15 -#define L_16 SW12_CS16 diff --git a/drivers/led/issi/is31fl3736-mono.h b/drivers/led/issi/is31fl3736-mono.h index 91c2e0420b..73441ea551 100644 --- a/drivers/led/issi/is31fl3736-mono.h +++ b/drivers/led/issi/is31fl3736-mono.h @@ -22,36 +22,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef ISSI_TIMEOUT -# define IS31FL3736_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3736_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3736_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3736_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3736_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3736_led_t -#define g_is31_leds g_is31fl3736_leds - -#define PUR_0R IS31FL3736_PUR_0_OHM -#define PUR_05KR IS31FL3736_PUR_05K_OHM -#define PUR_1KR IS31FL3736_PUR_1K_OHM -#define PUR_2KR IS31FL3736_PUR_2K_OHM -#define PUR_4KR IS31FL3736_PUR_4K_OHM -#define PUR_8KR IS31FL3736_PUR_8K_OHM -#define PUR_16KR IS31FL3736_PUR_16K_OHM -#define PUR_32KR IS31FL3736_PUR_32K_OHM -// ======== - #define IS31FL3736_REG_INTERRUPT_MASK 0xF0 #define IS31FL3736_REG_INTERRUPT_STATUS 0xF1 @@ -259,113 +229,3 @@ void is31fl3736_flush(void); #define SW12_CS6 0xBA #define SW12_CS7 0xBC #define SW12_CS8 0xBE - -// DEPRECATED - DO NOT USE - -#define A_1 SW1_CS1 -#define A_2 SW1_CS2 -#define A_3 SW1_CS3 -#define A_4 SW1_CS4 -#define A_5 SW1_CS5 -#define A_6 SW1_CS6 -#define A_7 SW1_CS7 -#define A_8 SW1_CS8 - -#define B_1 SW2_CS1 -#define B_2 SW2_CS2 -#define B_3 SW2_CS3 -#define B_4 SW2_CS4 -#define B_5 SW2_CS5 -#define B_6 SW2_CS6 -#define B_7 SW2_CS7 -#define B_8 SW2_CS8 - -#define C_1 SW3_CS1 -#define C_2 SW3_CS2 -#define C_3 SW3_CS3 -#define C_4 SW3_CS4 -#define C_5 SW3_CS5 -#define C_6 SW3_CS6 -#define C_7 SW3_CS7 -#define C_8 SW3_CS8 - -#define D_1 SW4_CS1 -#define D_2 SW4_CS2 -#define D_3 SW4_CS3 -#define D_4 SW4_CS4 -#define D_5 SW4_CS5 -#define D_6 SW4_CS6 -#define D_7 SW4_CS7 -#define D_8 SW4_CS8 - -#define E_1 SW5_CS1 -#define E_2 SW5_CS2 -#define E_3 SW5_CS3 -#define E_4 SW5_CS4 -#define E_5 SW5_CS5 -#define E_6 SW5_CS6 -#define E_7 SW5_CS7 -#define E_8 SW5_CS8 - -#define F_1 SW6_CS1 -#define F_2 SW6_CS2 -#define F_3 SW6_CS3 -#define F_4 SW6_CS4 -#define F_5 SW6_CS5 -#define F_6 SW6_CS6 -#define F_7 SW6_CS7 -#define F_8 SW6_CS8 - -#define G_1 SW7_CS1 -#define G_2 SW7_CS2 -#define G_3 SW7_CS3 -#define G_4 SW7_CS4 -#define G_5 SW7_CS5 -#define G_6 SW7_CS6 -#define G_7 SW7_CS7 -#define G_8 SW7_CS8 - -#define H_1 SW8_CS1 -#define H_2 SW8_CS2 -#define H_3 SW8_CS3 -#define H_4 SW8_CS4 -#define H_5 SW8_CS5 -#define H_6 SW8_CS6 -#define H_7 SW8_CS7 -#define H_8 SW8_CS8 - -#define I_1 SW9_CS1 -#define I_2 SW9_CS2 -#define I_3 SW9_CS3 -#define I_4 SW9_CS4 -#define I_5 SW9_CS5 -#define I_6 SW9_CS6 -#define I_7 SW9_CS7 -#define I_8 SW9_CS8 - -#define J_1 SW10_CS1 -#define J_2 SW10_CS2 -#define J_3 SW10_CS3 -#define J_4 SW10_CS4 -#define J_5 SW10_CS5 -#define J_6 SW10_CS6 -#define J_7 SW10_CS7 -#define J_8 SW10_CS8 - -#define K_1 SW11_CS1 -#define K_2 SW11_CS2 -#define K_3 SW11_CS3 -#define K_4 SW11_CS4 -#define K_5 SW11_CS5 -#define K_6 SW11_CS6 -#define K_7 SW11_CS7 -#define K_8 SW11_CS8 - -#define L_1 SW12_CS1 -#define L_2 SW12_CS2 -#define L_3 SW12_CS3 -#define L_4 SW12_CS4 -#define L_5 SW12_CS5 -#define L_6 SW12_CS6 -#define L_7 SW12_CS7 -#define L_8 SW12_CS8 diff --git a/drivers/led/issi/is31fl3736.h b/drivers/led/issi/is31fl3736.h index dae7b3c812..f0eabad819 100644 --- a/drivers/led/issi/is31fl3736.h +++ b/drivers/led/issi/is31fl3736.h @@ -22,48 +22,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define IS31FL3736_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define IS31FL3736_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define IS31FL3736_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define IS31FL3736_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3736_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3736_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3736_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3736_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3736_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3736_led_t -#define g_is31_leds g_is31fl3736_leds - -#define PUR_0R IS31FL3736_PUR_0_OHM -#define PUR_05KR IS31FL3736_PUR_0K5_OHM -#define PUR_1KR IS31FL3736_PUR_1K_OHM -#define PUR_2KR IS31FL3736_PUR_2K_OHM -#define PUR_4KR IS31FL3736_PUR_4K_OHM -#define PUR_8KR IS31FL3736_PUR_8K_OHM -#define PUR_16KR IS31FL3736_PUR_16K_OHM -#define PUR_32KR IS31FL3736_PUR_32K_OHM -// ======== - #define IS31FL3736_REG_INTERRUPT_MASK 0xF0 #define IS31FL3736_REG_INTERRUPT_STATUS 0xF1 diff --git a/drivers/led/issi/is31fl3737-mono.h b/drivers/led/issi/is31fl3737-mono.h index 99151c1e7a..40380f9006 100644 --- a/drivers/led/issi/is31fl3737-mono.h +++ b/drivers/led/issi/is31fl3737-mono.h @@ -24,36 +24,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef ISSI_TIMEOUT -# define IS31FL3737_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3737_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_PWM_FREQUENCY -# define IS31FL3737_PWM_FREQUENCY ISSI_PWM_FREQUENCY -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3737_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3737_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3737_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define PUR_0R IS31FL3737_PUR_0_OHM -#define PUR_05KR IS31FL3737_PUR_0K5_OHM -#define PUR_1KR IS31FL3737_PUR_1K_OHM -#define PUR_2KR IS31FL3737_PUR_2K_OHM -#define PUR_4KR IS31FL3737_PUR_4K_OHM -#define PUR_8KR IS31FL3737_PUR_8K_OHM -#define PUR_16KR IS31FL3737_PUR_16K_OHM -#define PUR_32KR IS31FL3737_PUR_32K_OHM -// ======== - #define IS31FL3737_REG_INTERRUPT_MASK 0xF0 #define IS31FL3737_REG_INTERRUPT_STATUS 0xF1 diff --git a/drivers/led/issi/is31fl3737.h b/drivers/led/issi/is31fl3737.h index 735a3a1e30..c1a9306a87 100644 --- a/drivers/led/issi/is31fl3737.h +++ b/drivers/led/issi/is31fl3737.h @@ -24,51 +24,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define IS31FL3737_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define IS31FL3737_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define IS31FL3737_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define IS31FL3737_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3737_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3737_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_PWM_FREQUENCY -# define IS31FL3737_PWM_FREQUENCY ISSI_PWM_FREQUENCY -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3737_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3737_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3737_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3737_led_t -#define g_is31_leds g_is31fl3737_leds - -#define PUR_0R IS31FL3737_PUR_0_OHM -#define PUR_05KR IS31FL3737_PUR_0K5_OHM -#define PUR_1KR IS31FL3737_PUR_1K_OHM -#define PUR_2KR IS31FL3737_PUR_2K_OHM -#define PUR_4KR IS31FL3737_PUR_4K_OHM -#define PUR_8KR IS31FL3737_PUR_8K_OHM -#define PUR_16KR IS31FL3737_PUR_16K_OHM -#define PUR_32KR IS31FL3737_PUR_32K_OHM -// ======== - #define IS31FL3737_REG_INTERRUPT_MASK 0xF0 #define IS31FL3737_REG_INTERRUPT_STATUS 0xF1 @@ -314,161 +269,3 @@ void is31fl3737_flush(void); #define SW12_CS10 0xBB #define SW12_CS11 0xBC #define SW12_CS12 0xBD - -// DEPRECATED - DO NOT USE - -#define A_1 SW1_CS1 -#define A_2 SW1_CS2 -#define A_3 SW1_CS3 -#define A_4 SW1_CS4 -#define A_5 SW1_CS5 -#define A_6 SW1_CS6 -#define A_7 SW1_CS7 -#define A_8 SW1_CS8 -#define A_9 SW1_CS9 -#define A_10 SW1_CS10 -#define A_11 SW1_CS11 -#define A_12 SW1_CS12 - -#define B_1 SW2_CS1 -#define B_2 SW2_CS2 -#define B_3 SW2_CS3 -#define B_4 SW2_CS4 -#define B_5 SW2_CS5 -#define B_6 SW2_CS6 -#define B_7 SW2_CS7 -#define B_8 SW2_CS8 -#define B_9 SW2_CS9 -#define B_10 SW2_CS10 -#define B_11 SW2_CS11 -#define B_12 SW2_CS12 - -#define C_1 SW3_CS1 -#define C_2 SW3_CS2 -#define C_3 SW3_CS3 -#define C_4 SW3_CS4 -#define C_5 SW3_CS5 -#define C_6 SW3_CS6 -#define C_7 SW3_CS7 -#define C_8 SW3_CS8 -#define C_9 SW3_CS9 -#define C_10 SW3_CS10 -#define C_11 SW3_CS11 -#define C_12 SW3_CS12 - -#define D_1 SW4_CS1 -#define D_2 SW4_CS2 -#define D_3 SW4_CS3 -#define D_4 SW4_CS4 -#define D_5 SW4_CS5 -#define D_6 SW4_CS6 -#define D_7 SW4_CS7 -#define D_8 SW4_CS8 -#define D_9 SW4_CS9 -#define D_10 SW4_CS10 -#define D_11 SW4_CS11 -#define D_12 SW4_CS12 - -#define E_1 SW5_CS1 -#define E_2 SW5_CS2 -#define E_3 SW5_CS3 -#define E_4 SW5_CS4 -#define E_5 SW5_CS5 -#define E_6 SW5_CS6 -#define E_7 SW5_CS7 -#define E_8 SW5_CS8 -#define E_9 SW5_CS9 -#define E_10 SW5_CS10 -#define E_11 SW5_CS11 -#define E_12 SW5_CS12 - -#define F_1 SW6_CS1 -#define F_2 SW6_CS2 -#define F_3 SW6_CS3 -#define F_4 SW6_CS4 -#define F_5 SW6_CS5 -#define F_6 SW6_CS6 -#define F_7 SW6_CS7 -#define F_8 SW6_CS8 -#define F_9 SW6_CS9 -#define F_10 SW6_CS10 -#define F_11 SW6_CS11 -#define F_12 SW6_CS12 - -#define G_1 SW7_CS1 -#define G_2 SW7_CS2 -#define G_3 SW7_CS3 -#define G_4 SW7_CS4 -#define G_5 SW7_CS5 -#define G_6 SW7_CS6 -#define G_7 SW7_CS7 -#define G_8 SW7_CS8 -#define G_9 SW7_CS9 -#define G_10 SW7_CS10 -#define G_11 SW7_CS11 -#define G_12 SW7_CS12 - -#define H_1 SW8_CS1 -#define H_2 SW8_CS2 -#define H_3 SW8_CS3 -#define H_4 SW8_CS4 -#define H_5 SW8_CS5 -#define H_6 SW8_CS6 -#define H_7 SW8_CS7 -#define H_8 SW8_CS8 -#define H_9 SW8_CS9 -#define H_10 SW8_CS10 -#define H_11 SW8_CS11 -#define H_12 SW8_CS12 - -#define I_1 SW9_CS1 -#define I_2 SW9_CS2 -#define I_3 SW9_CS3 -#define I_4 SW9_CS4 -#define I_5 SW9_CS5 -#define I_6 SW9_CS6 -#define I_7 SW9_CS7 -#define I_8 SW9_CS8 -#define I_9 SW9_CS9 -#define I_10 SW9_CS10 -#define I_11 SW9_CS11 -#define I_12 SW9_CS12 - -#define J_1 SW10_CS1 -#define J_2 SW10_CS2 -#define J_3 SW10_CS3 -#define J_4 SW10_CS4 -#define J_5 SW10_CS5 -#define J_6 SW10_CS6 -#define J_7 SW10_CS7 -#define J_8 SW10_CS8 -#define J_9 SW10_CS9 -#define J_10 SW10_CS10 -#define J_11 SW10_CS11 -#define J_12 SW10_CS12 - -#define K_1 SW11_CS1 -#define K_2 SW11_CS2 -#define K_3 SW11_CS3 -#define K_4 SW11_CS4 -#define K_5 SW11_CS5 -#define K_6 SW11_CS6 -#define K_7 SW11_CS7 -#define K_8 SW11_CS8 -#define K_9 SW11_CS9 -#define K_10 SW11_CS10 -#define K_11 SW11_CS11 -#define K_12 SW11_CS12 - -#define L_1 SW12_CS1 -#define L_2 SW12_CS2 -#define L_3 SW12_CS3 -#define L_4 SW12_CS4 -#define L_5 SW12_CS5 -#define L_6 SW12_CS6 -#define L_7 SW12_CS7 -#define L_8 SW12_CS8 -#define L_9 SW12_CS9 -#define L_10 SW12_CS10 -#define L_11 SW12_CS11 -#define L_12 SW12_CS12 diff --git a/drivers/led/issi/is31fl3741-mono.h b/drivers/led/issi/is31fl3741-mono.h index 6d4f70b1b3..d8797bda32 100644 --- a/drivers/led/issi/is31fl3741-mono.h +++ b/drivers/led/issi/is31fl3741-mono.h @@ -24,36 +24,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef ISSI_TIMEOUT -# define IS31FL3741_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3741_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_CONFIGURATION -# define IS31FL3741_CONFIGURATION ISSI_CONFIGURATION -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3741_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3741_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3741_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define PUR_0R IS31FL3741_PUR_0_OHM -#define PUR_05KR IS31FL3741_PUR_0K5_OHM -#define PUR_1KR IS31FL3741_PUR_1K_OHM -#define PUR_2KR IS31FL3741_PUR_2K_OHM -#define PUR_4KR IS31FL3741_PUR_4K_OHM -#define PUR_8KR IS31FL3741_PUR_8K_OHM -#define PUR_16KR IS31FL3741_PUR_16K_OHM -#define PUR_32KR IS31FL3741_PUR_32K_OHM -// ======== - #define IS31FL3741_REG_INTERRUPT_MASK 0xF0 #define IS31FL3741_REG_INTERRUPT_STATUS 0xF1 #define IS31FL3741_REG_ID 0xFC @@ -514,374 +484,3 @@ void is31fl3741_flush(void); #define SW9_CS37 0x1A8 #define SW9_CS38 0x1A9 #define SW9_CS39 0x1AA - -// DEPRECATED - DO NOT USE - -#define CS1_SW1 SW1_CS1 -#define CS2_SW1 SW1_CS2 -#define CS3_SW1 SW1_CS3 -#define CS4_SW1 SW1_CS4 -#define CS5_SW1 SW1_CS5 -#define CS6_SW1 SW1_CS6 -#define CS7_SW1 SW1_CS7 -#define CS8_SW1 SW1_CS8 -#define CS9_SW1 SW1_CS9 -#define CS10_SW1 SW1_CS10 -#define CS11_SW1 SW1_CS11 -#define CS12_SW1 SW1_CS12 -#define CS13_SW1 SW1_CS13 -#define CS14_SW1 SW1_CS14 -#define CS15_SW1 SW1_CS15 -#define CS16_SW1 SW1_CS16 -#define CS17_SW1 SW1_CS17 -#define CS18_SW1 SW1_CS18 -#define CS19_SW1 SW1_CS19 -#define CS20_SW1 SW1_CS20 -#define CS21_SW1 SW1_CS21 -#define CS22_SW1 SW1_CS22 -#define CS23_SW1 SW1_CS23 -#define CS24_SW1 SW1_CS24 -#define CS25_SW1 SW1_CS25 -#define CS26_SW1 SW1_CS26 -#define CS27_SW1 SW1_CS27 -#define CS28_SW1 SW1_CS28 -#define CS29_SW1 SW1_CS29 -#define CS30_SW1 SW1_CS30 - -#define CS1_SW2 SW2_CS1 -#define CS2_SW2 SW2_CS2 -#define CS3_SW2 SW2_CS3 -#define CS4_SW2 SW2_CS4 -#define CS5_SW2 SW2_CS5 -#define CS6_SW2 SW2_CS6 -#define CS7_SW2 SW2_CS7 -#define CS8_SW2 SW2_CS8 -#define CS9_SW2 SW2_CS9 -#define CS10_SW2 SW2_CS10 -#define CS11_SW2 SW2_CS11 -#define CS12_SW2 SW2_CS12 -#define CS13_SW2 SW2_CS13 -#define CS14_SW2 SW2_CS14 -#define CS15_SW2 SW2_CS15 -#define CS16_SW2 SW2_CS16 -#define CS17_SW2 SW2_CS17 -#define CS18_SW2 SW2_CS18 -#define CS19_SW2 SW2_CS19 -#define CS20_SW2 SW2_CS20 -#define CS21_SW2 SW2_CS21 -#define CS22_SW2 SW2_CS22 -#define CS23_SW2 SW2_CS23 -#define CS24_SW2 SW2_CS24 -#define CS25_SW2 SW2_CS25 -#define CS26_SW2 SW2_CS26 -#define CS27_SW2 SW2_CS27 -#define CS28_SW2 SW2_CS28 -#define CS29_SW2 SW2_CS29 -#define CS30_SW2 SW2_CS30 - -#define CS1_SW3 SW3_CS1 -#define CS2_SW3 SW3_CS2 -#define CS3_SW3 SW3_CS3 -#define CS4_SW3 SW3_CS4 -#define CS5_SW3 SW3_CS5 -#define CS6_SW3 SW3_CS6 -#define CS7_SW3 SW3_CS7 -#define CS8_SW3 SW3_CS8 -#define CS9_SW3 SW3_CS9 -#define CS10_SW3 SW3_CS10 -#define CS11_SW3 SW3_CS11 -#define CS12_SW3 SW3_CS12 -#define CS13_SW3 SW3_CS13 -#define CS14_SW3 SW3_CS14 -#define CS15_SW3 SW3_CS15 -#define CS16_SW3 SW3_CS16 -#define CS17_SW3 SW3_CS17 -#define CS18_SW3 SW3_CS18 -#define CS19_SW3 SW3_CS19 -#define CS20_SW3 SW3_CS20 -#define CS21_SW3 SW3_CS21 -#define CS22_SW3 SW3_CS22 -#define CS23_SW3 SW3_CS23 -#define CS24_SW3 SW3_CS24 -#define CS25_SW3 SW3_CS25 -#define CS26_SW3 SW3_CS26 -#define CS27_SW3 SW3_CS27 -#define CS28_SW3 SW3_CS28 -#define CS29_SW3 SW3_CS29 -#define CS30_SW3 SW3_CS30 - -#define CS1_SW4 SW4_CS1 -#define CS2_SW4 SW4_CS2 -#define CS3_SW4 SW4_CS3 -#define CS4_SW4 SW4_CS4 -#define CS5_SW4 SW4_CS5 -#define CS6_SW4 SW4_CS6 -#define CS7_SW4 SW4_CS7 -#define CS8_SW4 SW4_CS8 -#define CS9_SW4 SW4_CS9 -#define CS10_SW4 SW4_CS10 -#define CS11_SW4 SW4_CS11 -#define CS12_SW4 SW4_CS12 -#define CS13_SW4 SW4_CS13 -#define CS14_SW4 SW4_CS14 -#define CS15_SW4 SW4_CS15 -#define CS16_SW4 SW4_CS16 -#define CS17_SW4 SW4_CS17 -#define CS18_SW4 SW4_CS18 -#define CS19_SW4 SW4_CS19 -#define CS20_SW4 SW4_CS20 -#define CS21_SW4 SW4_CS21 -#define CS22_SW4 SW4_CS22 -#define CS23_SW4 SW4_CS23 -#define CS24_SW4 SW4_CS24 -#define CS25_SW4 SW4_CS25 -#define CS26_SW4 SW4_CS26 -#define CS27_SW4 SW4_CS27 -#define CS28_SW4 SW4_CS28 -#define CS29_SW4 SW4_CS29 -#define CS30_SW4 SW4_CS30 - -#define CS1_SW5 SW5_CS1 -#define CS2_SW5 SW5_CS2 -#define CS3_SW5 SW5_CS3 -#define CS4_SW5 SW5_CS4 -#define CS5_SW5 SW5_CS5 -#define CS6_SW5 SW5_CS6 -#define CS7_SW5 SW5_CS7 -#define CS8_SW5 SW5_CS8 -#define CS9_SW5 SW5_CS9 -#define CS10_SW5 SW5_CS10 -#define CS11_SW5 SW5_CS11 -#define CS12_SW5 SW5_CS12 -#define CS13_SW5 SW5_CS13 -#define CS14_SW5 SW5_CS14 -#define CS15_SW5 SW5_CS15 -#define CS16_SW5 SW5_CS16 -#define CS17_SW5 SW5_CS17 -#define CS18_SW5 SW5_CS18 -#define CS19_SW5 SW5_CS19 -#define CS20_SW5 SW5_CS20 -#define CS21_SW5 SW5_CS21 -#define CS22_SW5 SW5_CS22 -#define CS23_SW5 SW5_CS23 -#define CS24_SW5 SW5_CS24 -#define CS25_SW5 SW5_CS25 -#define CS26_SW5 SW5_CS26 -#define CS27_SW5 SW5_CS27 -#define CS28_SW5 SW5_CS28 -#define CS29_SW5 SW5_CS29 -#define CS30_SW5 SW5_CS30 - -#define CS1_SW6 SW6_CS1 -#define CS2_SW6 SW6_CS2 -#define CS3_SW6 SW6_CS3 -#define CS4_SW6 SW6_CS4 -#define CS5_SW6 SW6_CS5 -#define CS6_SW6 SW6_CS6 -#define CS7_SW6 SW6_CS7 -#define CS8_SW6 SW6_CS8 -#define CS9_SW6 SW6_CS9 -#define CS10_SW6 SW6_CS10 -#define CS11_SW6 SW6_CS11 -#define CS12_SW6 SW6_CS12 -#define CS13_SW6 SW6_CS13 -#define CS14_SW6 SW6_CS14 -#define CS15_SW6 SW6_CS15 -#define CS16_SW6 SW6_CS16 -#define CS17_SW6 SW6_CS17 -#define CS18_SW6 SW6_CS18 -#define CS19_SW6 SW6_CS19 -#define CS20_SW6 SW6_CS20 -#define CS21_SW6 SW6_CS21 -#define CS22_SW6 SW6_CS22 -#define CS23_SW6 SW6_CS23 -#define CS24_SW6 SW6_CS24 -#define CS25_SW6 SW6_CS25 -#define CS26_SW6 SW6_CS26 -#define CS27_SW6 SW6_CS27 -#define CS28_SW6 SW6_CS28 -#define CS29_SW6 SW6_CS29 -#define CS30_SW6 SW6_CS30 - -#define CS1_SW7 SW7_CS1 -#define CS2_SW7 SW7_CS2 -#define CS3_SW7 SW7_CS3 -#define CS4_SW7 SW7_CS4 -#define CS5_SW7 SW7_CS5 -#define CS6_SW7 SW7_CS6 -#define CS7_SW7 SW7_CS7 -#define CS8_SW7 SW7_CS8 -#define CS9_SW7 SW7_CS9 -#define CS10_SW7 SW7_CS10 -#define CS11_SW7 SW7_CS11 -#define CS12_SW7 SW7_CS12 -#define CS13_SW7 SW7_CS13 -#define CS14_SW7 SW7_CS14 -#define CS15_SW7 SW7_CS15 -#define CS16_SW7 SW7_CS16 -#define CS17_SW7 SW7_CS17 -#define CS18_SW7 SW7_CS18 -#define CS19_SW7 SW7_CS19 -#define CS20_SW7 SW7_CS20 -#define CS21_SW7 SW7_CS21 -#define CS22_SW7 SW7_CS22 -#define CS23_SW7 SW7_CS23 -#define CS24_SW7 SW7_CS24 -#define CS25_SW7 SW7_CS25 -#define CS26_SW7 SW7_CS26 -#define CS27_SW7 SW7_CS27 -#define CS28_SW7 SW7_CS28 -#define CS29_SW7 SW7_CS29 -#define CS30_SW7 SW7_CS30 - -#define CS1_SW8 SW8_CS1 -#define CS2_SW8 SW8_CS2 -#define CS3_SW8 SW8_CS3 -#define CS4_SW8 SW8_CS4 -#define CS5_SW8 SW8_CS5 -#define CS6_SW8 SW8_CS6 -#define CS7_SW8 SW8_CS7 -#define CS8_SW8 SW8_CS8 -#define CS9_SW8 SW8_CS9 -#define CS10_SW8 SW8_CS10 -#define CS11_SW8 SW8_CS11 -#define CS12_SW8 SW8_CS12 -#define CS13_SW8 SW8_CS13 -#define CS14_SW8 SW8_CS14 -#define CS15_SW8 SW8_CS15 -#define CS16_SW8 SW8_CS16 -#define CS17_SW8 SW8_CS17 -#define CS18_SW8 SW8_CS18 -#define CS19_SW8 SW8_CS19 -#define CS20_SW8 SW8_CS20 -#define CS21_SW8 SW8_CS21 -#define CS22_SW8 SW8_CS22 -#define CS23_SW8 SW8_CS23 -#define CS24_SW8 SW8_CS24 -#define CS25_SW8 SW8_CS25 -#define CS26_SW8 SW8_CS26 -#define CS27_SW8 SW8_CS27 -#define CS28_SW8 SW8_CS28 -#define CS29_SW8 SW8_CS29 -#define CS30_SW8 SW8_CS30 - -#define CS1_SW9 SW9_CS1 -#define CS2_SW9 SW9_CS2 -#define CS3_SW9 SW9_CS3 -#define CS4_SW9 SW9_CS4 -#define CS5_SW9 SW9_CS5 -#define CS6_SW9 SW9_CS6 -#define CS7_SW9 SW9_CS7 -#define CS8_SW9 SW9_CS8 -#define CS9_SW9 SW9_CS9 -#define CS10_SW9 SW9_CS10 -#define CS11_SW9 SW9_CS11 -#define CS12_SW9 SW9_CS12 -#define CS13_SW9 SW9_CS13 -#define CS14_SW9 SW9_CS14 -#define CS15_SW9 SW9_CS15 -#define CS16_SW9 SW9_CS16 -#define CS17_SW9 SW9_CS17 -#define CS18_SW9 SW9_CS18 -#define CS19_SW9 SW9_CS19 -#define CS20_SW9 SW9_CS20 -#define CS21_SW9 SW9_CS21 -#define CS22_SW9 SW9_CS22 -#define CS23_SW9 SW9_CS23 -#define CS24_SW9 SW9_CS24 -#define CS25_SW9 SW9_CS25 -#define CS26_SW9 SW9_CS26 -#define CS27_SW9 SW9_CS27 -#define CS28_SW9 SW9_CS28 -#define CS29_SW9 SW9_CS29 -#define CS30_SW9 SW9_CS30 - -#define CS31_SW1 SW1_CS31 -#define CS32_SW1 SW1_CS32 -#define CS33_SW1 SW1_CS33 -#define CS34_SW1 SW1_CS34 -#define CS35_SW1 SW1_CS35 -#define CS36_SW1 SW1_CS36 -#define CS37_SW1 SW1_CS37 -#define CS38_SW1 SW1_CS38 -#define CS39_SW1 SW1_CS39 - -#define CS31_SW2 SW2_CS31 -#define CS32_SW2 SW2_CS32 -#define CS33_SW2 SW2_CS33 -#define CS34_SW2 SW2_CS34 -#define CS35_SW2 SW2_CS35 -#define CS36_SW2 SW2_CS36 -#define CS37_SW2 SW2_CS37 -#define CS38_SW2 SW2_CS38 -#define CS39_SW2 SW2_CS39 - -#define CS31_SW3 SW3_CS31 -#define CS32_SW3 SW3_CS32 -#define CS33_SW3 SW3_CS33 -#define CS34_SW3 SW3_CS34 -#define CS35_SW3 SW3_CS35 -#define CS36_SW3 SW3_CS36 -#define CS37_SW3 SW3_CS37 -#define CS38_SW3 SW3_CS38 -#define CS39_SW3 SW3_CS39 - -#define CS31_SW4 SW4_CS31 -#define CS32_SW4 SW4_CS32 -#define CS33_SW4 SW4_CS33 -#define CS34_SW4 SW4_CS34 -#define CS35_SW4 SW4_CS35 -#define CS36_SW4 SW4_CS36 -#define CS37_SW4 SW4_CS37 -#define CS38_SW4 SW4_CS38 -#define CS39_SW4 SW4_CS39 - -#define CS31_SW5 SW5_CS31 -#define CS32_SW5 SW5_CS32 -#define CS33_SW5 SW5_CS33 -#define CS34_SW5 SW5_CS34 -#define CS35_SW5 SW5_CS35 -#define CS36_SW5 SW5_CS36 -#define CS37_SW5 SW5_CS37 -#define CS38_SW5 SW5_CS38 -#define CS39_SW5 SW5_CS39 - -#define CS31_SW6 SW6_CS31 -#define CS32_SW6 SW6_CS32 -#define CS33_SW6 SW6_CS33 -#define CS34_SW6 SW6_CS34 -#define CS35_SW6 SW6_CS35 -#define CS36_SW6 SW6_CS36 -#define CS37_SW6 SW6_CS37 -#define CS38_SW6 SW6_CS38 -#define CS39_SW6 SW6_CS39 - -#define CS31_SW7 SW7_CS31 -#define CS32_SW7 SW7_CS32 -#define CS33_SW7 SW7_CS33 -#define CS34_SW7 SW7_CS34 -#define CS35_SW7 SW7_CS35 -#define CS36_SW7 SW7_CS36 -#define CS37_SW7 SW7_CS37 -#define CS38_SW7 SW7_CS38 -#define CS39_SW7 SW7_CS39 - -#define CS31_SW8 SW8_CS31 -#define CS32_SW8 SW8_CS32 -#define CS33_SW8 SW8_CS33 -#define CS34_SW8 SW8_CS34 -#define CS35_SW8 SW8_CS35 -#define CS36_SW8 SW8_CS36 -#define CS37_SW8 SW8_CS37 -#define CS38_SW8 SW8_CS38 -#define CS39_SW8 SW8_CS39 - -#define CS31_SW9 SW9_CS31 -#define CS32_SW9 SW9_CS32 -#define CS33_SW9 SW9_CS33 -#define CS34_SW9 SW9_CS34 -#define CS35_SW9 SW9_CS35 -#define CS36_SW9 SW9_CS36 -#define CS37_SW9 SW9_CS37 -#define CS38_SW9 SW9_CS38 -#define CS39_SW9 SW9_CS39 diff --git a/drivers/led/issi/is31fl3741.h b/drivers/led/issi/is31fl3741.h index cc9637a4e8..343dffe068 100644 --- a/drivers/led/issi/is31fl3741.h +++ b/drivers/led/issi/is31fl3741.h @@ -24,51 +24,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define IS31FL3741_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define IS31FL3741_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define IS31FL3741_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define IS31FL3741_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef ISSI_TIMEOUT -# define IS31FL3741_I2C_TIMEOUT ISSI_TIMEOUT -#endif -#ifdef ISSI_PERSISTENCE -# define IS31FL3741_I2C_PERSISTENCE ISSI_PERSISTENCE -#endif -#ifdef ISSI_CONFIGURATION -# define IS31FL3741_CONFIGURATION ISSI_CONFIGURATION -#endif -#ifdef ISSI_SWPULLUP -# define IS31FL3741_SW_PULLUP ISSI_SWPULLUP -#endif -#ifdef ISSI_CSPULLUP -# define IS31FL3741_CS_PULLDOWN ISSI_CSPULLUP -#endif -#ifdef ISSI_GLOBALCURRENT -# define IS31FL3741_GLOBAL_CURRENT ISSI_GLOBALCURRENT -#endif - -#define is31_led is31fl3741_led_t -#define g_is31_leds g_is31fl3741_leds - -#define PUR_0R IS31FL3741_PUR_0_OHM -#define PUR_05KR IS31FL3741_PUR_0K5_OHM -#define PUR_1KR IS31FL3741_PUR_1K_OHM -#define PUR_2KR IS31FL3741_PUR_2K_OHM -#define PUR_4KR IS31FL3741_PUR_4K_OHM -#define PUR_8KR IS31FL3741_PUR_8K_OHM -#define PUR_16KR IS31FL3741_PUR_16K_OHM -#define PUR_32KR IS31FL3741_PUR_32K_OHM -// ======== - #define IS31FL3741_REG_INTERRUPT_MASK 0xF0 #define IS31FL3741_REG_INTERRUPT_STATUS 0xF1 #define IS31FL3741_REG_ID 0xFC @@ -531,374 +486,3 @@ void is31fl3741_flush(void); #define SW9_CS37 0x1A8 #define SW9_CS38 0x1A9 #define SW9_CS39 0x1AA - -// DEPRECATED - DO NOT USE - -#define CS1_SW1 SW1_CS1 -#define CS2_SW1 SW1_CS2 -#define CS3_SW1 SW1_CS3 -#define CS4_SW1 SW1_CS4 -#define CS5_SW1 SW1_CS5 -#define CS6_SW1 SW1_CS6 -#define CS7_SW1 SW1_CS7 -#define CS8_SW1 SW1_CS8 -#define CS9_SW1 SW1_CS9 -#define CS10_SW1 SW1_CS10 -#define CS11_SW1 SW1_CS11 -#define CS12_SW1 SW1_CS12 -#define CS13_SW1 SW1_CS13 -#define CS14_SW1 SW1_CS14 -#define CS15_SW1 SW1_CS15 -#define CS16_SW1 SW1_CS16 -#define CS17_SW1 SW1_CS17 -#define CS18_SW1 SW1_CS18 -#define CS19_SW1 SW1_CS19 -#define CS20_SW1 SW1_CS20 -#define CS21_SW1 SW1_CS21 -#define CS22_SW1 SW1_CS22 -#define CS23_SW1 SW1_CS23 -#define CS24_SW1 SW1_CS24 -#define CS25_SW1 SW1_CS25 -#define CS26_SW1 SW1_CS26 -#define CS27_SW1 SW1_CS27 -#define CS28_SW1 SW1_CS28 -#define CS29_SW1 SW1_CS29 -#define CS30_SW1 SW1_CS30 - -#define CS1_SW2 SW2_CS1 -#define CS2_SW2 SW2_CS2 -#define CS3_SW2 SW2_CS3 -#define CS4_SW2 SW2_CS4 -#define CS5_SW2 SW2_CS5 -#define CS6_SW2 SW2_CS6 -#define CS7_SW2 SW2_CS7 -#define CS8_SW2 SW2_CS8 -#define CS9_SW2 SW2_CS9 -#define CS10_SW2 SW2_CS10 -#define CS11_SW2 SW2_CS11 -#define CS12_SW2 SW2_CS12 -#define CS13_SW2 SW2_CS13 -#define CS14_SW2 SW2_CS14 -#define CS15_SW2 SW2_CS15 -#define CS16_SW2 SW2_CS16 -#define CS17_SW2 SW2_CS17 -#define CS18_SW2 SW2_CS18 -#define CS19_SW2 SW2_CS19 -#define CS20_SW2 SW2_CS20 -#define CS21_SW2 SW2_CS21 -#define CS22_SW2 SW2_CS22 -#define CS23_SW2 SW2_CS23 -#define CS24_SW2 SW2_CS24 -#define CS25_SW2 SW2_CS25 -#define CS26_SW2 SW2_CS26 -#define CS27_SW2 SW2_CS27 -#define CS28_SW2 SW2_CS28 -#define CS29_SW2 SW2_CS29 -#define CS30_SW2 SW2_CS30 - -#define CS1_SW3 SW3_CS1 -#define CS2_SW3 SW3_CS2 -#define CS3_SW3 SW3_CS3 -#define CS4_SW3 SW3_CS4 -#define CS5_SW3 SW3_CS5 -#define CS6_SW3 SW3_CS6 -#define CS7_SW3 SW3_CS7 -#define CS8_SW3 SW3_CS8 -#define CS9_SW3 SW3_CS9 -#define CS10_SW3 SW3_CS10 -#define CS11_SW3 SW3_CS11 -#define CS12_SW3 SW3_CS12 -#define CS13_SW3 SW3_CS13 -#define CS14_SW3 SW3_CS14 -#define CS15_SW3 SW3_CS15 -#define CS16_SW3 SW3_CS16 -#define CS17_SW3 SW3_CS17 -#define CS18_SW3 SW3_CS18 -#define CS19_SW3 SW3_CS19 -#define CS20_SW3 SW3_CS20 -#define CS21_SW3 SW3_CS21 -#define CS22_SW3 SW3_CS22 -#define CS23_SW3 SW3_CS23 -#define CS24_SW3 SW3_CS24 -#define CS25_SW3 SW3_CS25 -#define CS26_SW3 SW3_CS26 -#define CS27_SW3 SW3_CS27 -#define CS28_SW3 SW3_CS28 -#define CS29_SW3 SW3_CS29 -#define CS30_SW3 SW3_CS30 - -#define CS1_SW4 SW4_CS1 -#define CS2_SW4 SW4_CS2 -#define CS3_SW4 SW4_CS3 -#define CS4_SW4 SW4_CS4 -#define CS5_SW4 SW4_CS5 -#define CS6_SW4 SW4_CS6 -#define CS7_SW4 SW4_CS7 -#define CS8_SW4 SW4_CS8 -#define CS9_SW4 SW4_CS9 -#define CS10_SW4 SW4_CS10 -#define CS11_SW4 SW4_CS11 -#define CS12_SW4 SW4_CS12 -#define CS13_SW4 SW4_CS13 -#define CS14_SW4 SW4_CS14 -#define CS15_SW4 SW4_CS15 -#define CS16_SW4 SW4_CS16 -#define CS17_SW4 SW4_CS17 -#define CS18_SW4 SW4_CS18 -#define CS19_SW4 SW4_CS19 -#define CS20_SW4 SW4_CS20 -#define CS21_SW4 SW4_CS21 -#define CS22_SW4 SW4_CS22 -#define CS23_SW4 SW4_CS23 -#define CS24_SW4 SW4_CS24 -#define CS25_SW4 SW4_CS25 -#define CS26_SW4 SW4_CS26 -#define CS27_SW4 SW4_CS27 -#define CS28_SW4 SW4_CS28 -#define CS29_SW4 SW4_CS29 -#define CS30_SW4 SW4_CS30 - -#define CS1_SW5 SW5_CS1 -#define CS2_SW5 SW5_CS2 -#define CS3_SW5 SW5_CS3 -#define CS4_SW5 SW5_CS4 -#define CS5_SW5 SW5_CS5 -#define CS6_SW5 SW5_CS6 -#define CS7_SW5 SW5_CS7 -#define CS8_SW5 SW5_CS8 -#define CS9_SW5 SW5_CS9 -#define CS10_SW5 SW5_CS10 -#define CS11_SW5 SW5_CS11 -#define CS12_SW5 SW5_CS12 -#define CS13_SW5 SW5_CS13 -#define CS14_SW5 SW5_CS14 -#define CS15_SW5 SW5_CS15 -#define CS16_SW5 SW5_CS16 -#define CS17_SW5 SW5_CS17 -#define CS18_SW5 SW5_CS18 -#define CS19_SW5 SW5_CS19 -#define CS20_SW5 SW5_CS20 -#define CS21_SW5 SW5_CS21 -#define CS22_SW5 SW5_CS22 -#define CS23_SW5 SW5_CS23 -#define CS24_SW5 SW5_CS24 -#define CS25_SW5 SW5_CS25 -#define CS26_SW5 SW5_CS26 -#define CS27_SW5 SW5_CS27 -#define CS28_SW5 SW5_CS28 -#define CS29_SW5 SW5_CS29 -#define CS30_SW5 SW5_CS30 - -#define CS1_SW6 SW6_CS1 -#define CS2_SW6 SW6_CS2 -#define CS3_SW6 SW6_CS3 -#define CS4_SW6 SW6_CS4 -#define CS5_SW6 SW6_CS5 -#define CS6_SW6 SW6_CS6 -#define CS7_SW6 SW6_CS7 -#define CS8_SW6 SW6_CS8 -#define CS9_SW6 SW6_CS9 -#define CS10_SW6 SW6_CS10 -#define CS11_SW6 SW6_CS11 -#define CS12_SW6 SW6_CS12 -#define CS13_SW6 SW6_CS13 -#define CS14_SW6 SW6_CS14 -#define CS15_SW6 SW6_CS15 -#define CS16_SW6 SW6_CS16 -#define CS17_SW6 SW6_CS17 -#define CS18_SW6 SW6_CS18 -#define CS19_SW6 SW6_CS19 -#define CS20_SW6 SW6_CS20 -#define CS21_SW6 SW6_CS21 -#define CS22_SW6 SW6_CS22 -#define CS23_SW6 SW6_CS23 -#define CS24_SW6 SW6_CS24 -#define CS25_SW6 SW6_CS25 -#define CS26_SW6 SW6_CS26 -#define CS27_SW6 SW6_CS27 -#define CS28_SW6 SW6_CS28 -#define CS29_SW6 SW6_CS29 -#define CS30_SW6 SW6_CS30 - -#define CS1_SW7 SW7_CS1 -#define CS2_SW7 SW7_CS2 -#define CS3_SW7 SW7_CS3 -#define CS4_SW7 SW7_CS4 -#define CS5_SW7 SW7_CS5 -#define CS6_SW7 SW7_CS6 -#define CS7_SW7 SW7_CS7 -#define CS8_SW7 SW7_CS8 -#define CS9_SW7 SW7_CS9 -#define CS10_SW7 SW7_CS10 -#define CS11_SW7 SW7_CS11 -#define CS12_SW7 SW7_CS12 -#define CS13_SW7 SW7_CS13 -#define CS14_SW7 SW7_CS14 -#define CS15_SW7 SW7_CS15 -#define CS16_SW7 SW7_CS16 -#define CS17_SW7 SW7_CS17 -#define CS18_SW7 SW7_CS18 -#define CS19_SW7 SW7_CS19 -#define CS20_SW7 SW7_CS20 -#define CS21_SW7 SW7_CS21 -#define CS22_SW7 SW7_CS22 -#define CS23_SW7 SW7_CS23 -#define CS24_SW7 SW7_CS24 -#define CS25_SW7 SW7_CS25 -#define CS26_SW7 SW7_CS26 -#define CS27_SW7 SW7_CS27 -#define CS28_SW7 SW7_CS28 -#define CS29_SW7 SW7_CS29 -#define CS30_SW7 SW7_CS30 - -#define CS1_SW8 SW8_CS1 -#define CS2_SW8 SW8_CS2 -#define CS3_SW8 SW8_CS3 -#define CS4_SW8 SW8_CS4 -#define CS5_SW8 SW8_CS5 -#define CS6_SW8 SW8_CS6 -#define CS7_SW8 SW8_CS7 -#define CS8_SW8 SW8_CS8 -#define CS9_SW8 SW8_CS9 -#define CS10_SW8 SW8_CS10 -#define CS11_SW8 SW8_CS11 -#define CS12_SW8 SW8_CS12 -#define CS13_SW8 SW8_CS13 -#define CS14_SW8 SW8_CS14 -#define CS15_SW8 SW8_CS15 -#define CS16_SW8 SW8_CS16 -#define CS17_SW8 SW8_CS17 -#define CS18_SW8 SW8_CS18 -#define CS19_SW8 SW8_CS19 -#define CS20_SW8 SW8_CS20 -#define CS21_SW8 SW8_CS21 -#define CS22_SW8 SW8_CS22 -#define CS23_SW8 SW8_CS23 -#define CS24_SW8 SW8_CS24 -#define CS25_SW8 SW8_CS25 -#define CS26_SW8 SW8_CS26 -#define CS27_SW8 SW8_CS27 -#define CS28_SW8 SW8_CS28 -#define CS29_SW8 SW8_CS29 -#define CS30_SW8 SW8_CS30 - -#define CS1_SW9 SW9_CS1 -#define CS2_SW9 SW9_CS2 -#define CS3_SW9 SW9_CS3 -#define CS4_SW9 SW9_CS4 -#define CS5_SW9 SW9_CS5 -#define CS6_SW9 SW9_CS6 -#define CS7_SW9 SW9_CS7 -#define CS8_SW9 SW9_CS8 -#define CS9_SW9 SW9_CS9 -#define CS10_SW9 SW9_CS10 -#define CS11_SW9 SW9_CS11 -#define CS12_SW9 SW9_CS12 -#define CS13_SW9 SW9_CS13 -#define CS14_SW9 SW9_CS14 -#define CS15_SW9 SW9_CS15 -#define CS16_SW9 SW9_CS16 -#define CS17_SW9 SW9_CS17 -#define CS18_SW9 SW9_CS18 -#define CS19_SW9 SW9_CS19 -#define CS20_SW9 SW9_CS20 -#define CS21_SW9 SW9_CS21 -#define CS22_SW9 SW9_CS22 -#define CS23_SW9 SW9_CS23 -#define CS24_SW9 SW9_CS24 -#define CS25_SW9 SW9_CS25 -#define CS26_SW9 SW9_CS26 -#define CS27_SW9 SW9_CS27 -#define CS28_SW9 SW9_CS28 -#define CS29_SW9 SW9_CS29 -#define CS30_SW9 SW9_CS30 - -#define CS31_SW1 SW1_CS31 -#define CS32_SW1 SW1_CS32 -#define CS33_SW1 SW1_CS33 -#define CS34_SW1 SW1_CS34 -#define CS35_SW1 SW1_CS35 -#define CS36_SW1 SW1_CS36 -#define CS37_SW1 SW1_CS37 -#define CS38_SW1 SW1_CS38 -#define CS39_SW1 SW1_CS39 - -#define CS31_SW2 SW2_CS31 -#define CS32_SW2 SW2_CS32 -#define CS33_SW2 SW2_CS33 -#define CS34_SW2 SW2_CS34 -#define CS35_SW2 SW2_CS35 -#define CS36_SW2 SW2_CS36 -#define CS37_SW2 SW2_CS37 -#define CS38_SW2 SW2_CS38 -#define CS39_SW2 SW2_CS39 - -#define CS31_SW3 SW3_CS31 -#define CS32_SW3 SW3_CS32 -#define CS33_SW3 SW3_CS33 -#define CS34_SW3 SW3_CS34 -#define CS35_SW3 SW3_CS35 -#define CS36_SW3 SW3_CS36 -#define CS37_SW3 SW3_CS37 -#define CS38_SW3 SW3_CS38 -#define CS39_SW3 SW3_CS39 - -#define CS31_SW4 SW4_CS31 -#define CS32_SW4 SW4_CS32 -#define CS33_SW4 SW4_CS33 -#define CS34_SW4 SW4_CS34 -#define CS35_SW4 SW4_CS35 -#define CS36_SW4 SW4_CS36 -#define CS37_SW4 SW4_CS37 -#define CS38_SW4 SW4_CS38 -#define CS39_SW4 SW4_CS39 - -#define CS31_SW5 SW5_CS31 -#define CS32_SW5 SW5_CS32 -#define CS33_SW5 SW5_CS33 -#define CS34_SW5 SW5_CS34 -#define CS35_SW5 SW5_CS35 -#define CS36_SW5 SW5_CS36 -#define CS37_SW5 SW5_CS37 -#define CS38_SW5 SW5_CS38 -#define CS39_SW5 SW5_CS39 - -#define CS31_SW6 SW6_CS31 -#define CS32_SW6 SW6_CS32 -#define CS33_SW6 SW6_CS33 -#define CS34_SW6 SW6_CS34 -#define CS35_SW6 SW6_CS35 -#define CS36_SW6 SW6_CS36 -#define CS37_SW6 SW6_CS37 -#define CS38_SW6 SW6_CS38 -#define CS39_SW6 SW6_CS39 - -#define CS31_SW7 SW7_CS31 -#define CS32_SW7 SW7_CS32 -#define CS33_SW7 SW7_CS33 -#define CS34_SW7 SW7_CS34 -#define CS35_SW7 SW7_CS35 -#define CS36_SW7 SW7_CS36 -#define CS37_SW7 SW7_CS37 -#define CS38_SW7 SW7_CS38 -#define CS39_SW7 SW7_CS39 - -#define CS31_SW8 SW8_CS31 -#define CS32_SW8 SW8_CS32 -#define CS33_SW8 SW8_CS33 -#define CS34_SW8 SW8_CS34 -#define CS35_SW8 SW8_CS35 -#define CS36_SW8 SW8_CS36 -#define CS37_SW8 SW8_CS37 -#define CS38_SW8 SW8_CS38 -#define CS39_SW8 SW8_CS39 - -#define CS31_SW9 SW9_CS31 -#define CS32_SW9 SW9_CS32 -#define CS33_SW9 SW9_CS33 -#define CS34_SW9 SW9_CS34 -#define CS35_SW9 SW9_CS35 -#define CS36_SW9 SW9_CS36 -#define CS37_SW9 SW9_CS37 -#define CS38_SW9 SW9_CS38 -#define CS39_SW9 SW9_CS39 diff --git a/drivers/led/issi/is31fl3743a.h b/drivers/led/issi/is31fl3743a.h index 48aeab46ab..bfff904047 100644 --- a/drivers/led/issi/is31fl3743a.h +++ b/drivers/led/issi/is31fl3743a.h @@ -328,214 +328,3 @@ void is31fl3743a_flush(void); #define SW11_CS16 0xC3 #define SW11_CS17 0xC4 #define SW11_CS18 0xC5 - -// DEPRECATED - DO NOT USE - -#define CS1_SW1 SW1_CS1 -#define CS2_SW1 SW1_CS2 -#define CS3_SW1 SW1_CS3 -#define CS4_SW1 SW1_CS4 -#define CS5_SW1 SW1_CS5 -#define CS6_SW1 SW1_CS6 -#define CS7_SW1 SW1_CS7 -#define CS8_SW1 SW1_CS8 -#define CS9_SW1 SW1_CS9 -#define CS10_SW1 SW1_CS10 -#define CS11_SW1 SW1_CS11 -#define CS12_SW1 SW1_CS12 -#define CS13_SW1 SW1_CS13 -#define CS14_SW1 SW1_CS14 -#define CS15_SW1 SW1_CS15 -#define CS16_SW1 SW1_CS16 -#define CS17_SW1 SW1_CS17 -#define CS18_SW1 SW1_CS18 - -#define CS1_SW2 SW2_CS1 -#define CS2_SW2 SW2_CS2 -#define CS3_SW2 SW2_CS3 -#define CS4_SW2 SW2_CS4 -#define CS5_SW2 SW2_CS5 -#define CS6_SW2 SW2_CS6 -#define CS7_SW2 SW2_CS7 -#define CS8_SW2 SW2_CS8 -#define CS9_SW2 SW2_CS9 -#define CS10_SW2 SW2_CS10 -#define CS11_SW2 SW2_CS11 -#define CS12_SW2 SW2_CS12 -#define CS13_SW2 SW2_CS13 -#define CS14_SW2 SW2_CS14 -#define CS15_SW2 SW2_CS15 -#define CS16_SW2 SW2_CS16 -#define CS17_SW2 SW2_CS17 -#define CS18_SW2 SW2_CS18 - -#define CS1_SW3 SW3_CS1 -#define CS2_SW3 SW3_CS2 -#define CS3_SW3 SW3_CS3 -#define CS4_SW3 SW3_CS4 -#define CS5_SW3 SW3_CS5 -#define CS6_SW3 SW3_CS6 -#define CS7_SW3 SW3_CS7 -#define CS8_SW3 SW3_CS8 -#define CS9_SW3 SW3_CS9 -#define CS10_SW3 SW3_CS10 -#define CS11_SW3 SW3_CS11 -#define CS12_SW3 SW3_CS12 -#define CS13_SW3 SW3_CS13 -#define CS14_SW3 SW3_CS14 -#define CS15_SW3 SW3_CS15 -#define CS16_SW3 SW3_CS16 -#define CS17_SW3 SW3_CS17 -#define CS18_SW3 SW3_CS18 - -#define CS1_SW4 SW4_CS1 -#define CS2_SW4 SW4_CS2 -#define CS3_SW4 SW4_CS3 -#define CS4_SW4 SW4_CS4 -#define CS5_SW4 SW4_CS5 -#define CS6_SW4 SW4_CS6 -#define CS7_SW4 SW4_CS7 -#define CS8_SW4 SW4_CS8 -#define CS9_SW4 SW4_CS9 -#define CS10_SW4 SW4_CS10 -#define CS11_SW4 SW4_CS11 -#define CS12_SW4 SW4_CS12 -#define CS13_SW4 SW4_CS13 -#define CS14_SW4 SW4_CS14 -#define CS15_SW4 SW4_CS15 -#define CS16_SW4 SW4_CS16 -#define CS17_SW4 SW4_CS17 -#define CS18_SW4 SW4_CS18 - -#define CS1_SW5 SW5_CS1 -#define CS2_SW5 SW5_CS2 -#define CS3_SW5 SW5_CS3 -#define CS4_SW5 SW5_CS4 -#define CS5_SW5 SW5_CS5 -#define CS6_SW5 SW5_CS6 -#define CS7_SW5 SW5_CS7 -#define CS8_SW5 SW5_CS8 -#define CS9_SW5 SW5_CS9 -#define CS10_SW5 SW5_CS10 -#define CS11_SW5 SW5_CS11 -#define CS12_SW5 SW5_CS12 -#define CS13_SW5 SW5_CS13 -#define CS14_SW5 SW5_CS14 -#define CS15_SW5 SW5_CS15 -#define CS16_SW5 SW5_CS16 -#define CS17_SW5 SW5_CS17 -#define CS18_SW5 SW5_CS18 - -#define CS1_SW6 SW6_CS1 -#define CS2_SW6 SW6_CS2 -#define CS3_SW6 SW6_CS3 -#define CS4_SW6 SW6_CS4 -#define CS5_SW6 SW6_CS5 -#define CS6_SW6 SW6_CS6 -#define CS7_SW6 SW6_CS7 -#define CS8_SW6 SW6_CS8 -#define CS9_SW6 SW6_CS9 -#define CS10_SW6 SW6_CS10 -#define CS11_SW6 SW6_CS11 -#define CS12_SW6 SW6_CS12 -#define CS13_SW6 SW6_CS13 -#define CS14_SW6 SW6_CS14 -#define CS15_SW6 SW6_CS15 -#define CS16_SW6 SW6_CS16 -#define CS17_SW6 SW6_CS17 -#define CS18_SW6 SW6_CS18 - -#define CS1_SW7 SW7_CS1 -#define CS2_SW7 SW7_CS2 -#define CS3_SW7 SW7_CS3 -#define CS4_SW7 SW7_CS4 -#define CS5_SW7 SW7_CS5 -#define CS6_SW7 SW7_CS6 -#define CS7_SW7 SW7_CS7 -#define CS8_SW7 SW7_CS8 -#define CS9_SW7 SW7_CS9 -#define CS10_SW7 SW7_CS10 -#define CS11_SW7 SW7_CS11 -#define CS12_SW7 SW7_CS12 -#define CS13_SW7 SW7_CS13 -#define CS14_SW7 SW7_CS14 -#define CS15_SW7 SW7_CS15 -#define CS16_SW7 SW7_CS16 -#define CS17_SW7 SW7_CS17 -#define CS18_SW7 SW7_CS18 - -#define CS1_SW8 SW8_CS1 -#define CS2_SW8 SW8_CS2 -#define CS3_SW8 SW8_CS3 -#define CS4_SW8 SW8_CS4 -#define CS5_SW8 SW8_CS5 -#define CS6_SW8 SW8_CS6 -#define CS7_SW8 SW8_CS7 -#define CS8_SW8 SW8_CS8 -#define CS9_SW8 SW8_CS9 -#define CS10_SW8 SW8_CS10 -#define CS11_SW8 SW8_CS11 -#define CS12_SW8 SW8_CS12 -#define CS13_SW8 SW8_CS13 -#define CS14_SW8 SW8_CS14 -#define CS15_SW8 SW8_CS15 -#define CS16_SW8 SW8_CS16 -#define CS17_SW8 SW8_CS17 -#define CS18_SW8 SW8_CS18 - -#define CS1_SW9 SW9_CS1 -#define CS2_SW9 SW9_CS2 -#define CS3_SW9 SW9_CS3 -#define CS4_SW9 SW9_CS4 -#define CS5_SW9 SW9_CS5 -#define CS6_SW9 SW9_CS6 -#define CS7_SW9 SW9_CS7 -#define CS8_SW9 SW9_CS8 -#define CS9_SW9 SW9_CS9 -#define CS10_SW9 SW9_CS10 -#define CS11_SW9 SW9_CS11 -#define CS12_SW9 SW9_CS12 -#define CS13_SW9 SW9_CS13 -#define CS14_SW9 SW9_CS14 -#define CS15_SW9 SW9_CS15 -#define CS16_SW9 SW9_CS16 -#define CS17_SW9 SW9_CS17 -#define CS18_SW9 SW9_CS18 - -#define CS1_SW10 SW10_CS1 -#define CS2_SW10 SW10_CS2 -#define CS3_SW10 SW10_CS3 -#define CS4_SW10 SW10_CS4 -#define CS5_SW10 SW10_CS5 -#define CS6_SW10 SW10_CS6 -#define CS7_SW10 SW10_CS7 -#define CS8_SW10 SW10_CS8 -#define CS9_SW10 SW10_CS9 -#define CS10_SW10 SW10_CS10 -#define CS11_SW10 SW10_CS11 -#define CS12_SW10 SW10_CS12 -#define CS13_SW10 SW10_CS13 -#define CS14_SW10 SW10_CS14 -#define CS15_SW10 SW10_CS15 -#define CS16_SW10 SW10_CS16 -#define CS17_SW10 SW10_CS17 -#define CS18_SW10 SW10_CS18 - -#define CS1_SW11 SW11_CS1 -#define CS2_SW11 SW11_CS2 -#define CS3_SW11 SW11_CS3 -#define CS4_SW11 SW11_CS4 -#define CS5_SW11 SW11_CS5 -#define CS6_SW11 SW11_CS6 -#define CS7_SW11 SW11_CS7 -#define CS8_SW11 SW11_CS8 -#define CS9_SW11 SW11_CS9 -#define CS10_SW11 SW11_CS10 -#define CS11_SW11 SW11_CS11 -#define CS12_SW11 SW11_CS12 -#define CS13_SW11 SW11_CS13 -#define CS14_SW11 SW11_CS14 -#define CS15_SW11 SW11_CS15 -#define CS16_SW11 SW11_CS16 -#define CS17_SW11 SW11_CS17 -#define CS18_SW11 SW11_CS18 diff --git a/drivers/led/snled27351-mono.h b/drivers/led/snled27351-mono.h index 43d39934cb..b88ef25f76 100644 --- a/drivers/led/snled27351-mono.h +++ b/drivers/led/snled27351-mono.h @@ -21,37 +21,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef CKLED2001_TIMEOUT -# define SNLED27351_I2C_TIMEOUT CKLED2001_TIMEOUT -#endif -#ifdef CKLED2001_PERSISTENCE -# define SNLED27351_I2C_PERSISTENCE CKLED2001_PERSISTENCE -#endif -#ifdef PHASE_CHANNEL -# define SNLED27351_PHASE_CHANNEL PHASE_CHANNEL -#endif -#ifdef CKLED2001_CURRENT_TUNE -# define SNLED27351_CURRENT_TUNE CKLED2001_CURRENT_TUNE -#endif - -#define MSKPHASE_12CHANNEL SNLED27351_SCAN_PHASE_12_CHANNEL -#define MSKPHASE_11CHANNEL SNLED27351_SCAN_PHASE_11_CHANNEL -#define MSKPHASE_10CHANNEL SNLED27351_SCAN_PHASE_10_CHANNEL -#define MSKPHASE_9CHANNEL SNLED27351_SCAN_PHASE_9_CHANNEL -#define MSKPHASE_8CHANNEL SNLED27351_SCAN_PHASE_8_CHANNEL -#define MSKPHASE_7CHANNEL SNLED27351_SCAN_PHASE_7_CHANNEL -#define MSKPHASE_6CHANNEL SNLED27351_SCAN_PHASE_6_CHANNEL -#define MSKPHASE_5CHANNEL SNLED27351_SCAN_PHASE_5_CHANNEL -#define MSKPHASE_4CHANNEL SNLED27351_SCAN_PHASE_4_CHANNEL -#define MSKPHASE_3CHANNEL SNLED27351_SCAN_PHASE_3_CHANNEL -#define MSKPHASE_2CHANNEL SNLED27351_SCAN_PHASE_2_CHANNEL -#define MSKPHASE_1CHANNEL SNLED27351_SCAN_PHASE_1_CHANNEL - -#define ckled2001_led snled27351_led_t -#define g_ckled2001_leds g_snled27351_leds -// ======== - #define SNLED27351_REG_COMMAND 0xFD #define SNLED27351_COMMAND_LED_CONTROL 0x00 #define SNLED27351_COMMAND_PWM 0x01 @@ -378,209 +347,3 @@ void snled27351_sw_shutdown(uint8_t index); #define CB12_CA14 0xBD #define CB12_CA15 0xBE #define CB12_CA16 0xBF - -// DEPRECATED - DO NOT USE - -#define A_1 CB1_CA1 -#define A_2 CB1_CA2 -#define A_3 CB1_CA3 -#define A_4 CB1_CA4 -#define A_5 CB1_CA5 -#define A_6 CB1_CA6 -#define A_7 CB1_CA7 -#define A_8 CB1_CA8 -#define A_9 CB1_CA9 -#define A_10 CB1_CA10 -#define A_11 CB1_CA11 -#define A_12 CB1_CA12 -#define A_13 CB1_CA13 -#define A_14 CB1_CA14 -#define A_15 CB1_CA15 -#define A_16 CB1_CA16 - -#define B_1 CB2_CA1 -#define B_2 CB2_CA2 -#define B_3 CB2_CA3 -#define B_4 CB2_CA4 -#define B_5 CB2_CA5 -#define B_6 CB2_CA6 -#define B_7 CB2_CA7 -#define B_8 CB2_CA8 -#define B_9 CB2_CA9 -#define B_10 CB2_CA10 -#define B_11 CB2_CA11 -#define B_12 CB2_CA12 -#define B_13 CB2_CA13 -#define B_14 CB2_CA14 -#define B_15 CB2_CA15 -#define B_16 CB2_CA16 - -#define C_1 CB3_CA1 -#define C_2 CB3_CA2 -#define C_3 CB3_CA3 -#define C_4 CB3_CA4 -#define C_5 CB3_CA5 -#define C_6 CB3_CA6 -#define C_7 CB3_CA7 -#define C_8 CB3_CA8 -#define C_9 CB3_CA9 -#define C_10 CB3_CA10 -#define C_11 CB3_CA11 -#define C_12 CB3_CA12 -#define C_13 CB3_CA13 -#define C_14 CB3_CA14 -#define C_15 CB3_CA15 -#define C_16 CB3_CA16 - -#define D_1 CB4_CA1 -#define D_2 CB4_CA2 -#define D_3 CB4_CA3 -#define D_4 CB4_CA4 -#define D_5 CB4_CA5 -#define D_6 CB4_CA6 -#define D_7 CB4_CA7 -#define D_8 CB4_CA8 -#define D_9 CB4_CA9 -#define D_10 CB4_CA10 -#define D_11 CB4_CA11 -#define D_12 CB4_CA12 -#define D_13 CB4_CA13 -#define D_14 CB4_CA14 -#define D_15 CB4_CA15 -#define D_16 CB4_CA16 - -#define E_1 CB5_CA1 -#define E_2 CB5_CA2 -#define E_3 CB5_CA3 -#define E_4 CB5_CA4 -#define E_5 CB5_CA5 -#define E_6 CB5_CA6 -#define E_7 CB5_CA7 -#define E_8 CB5_CA8 -#define E_9 CB5_CA9 -#define E_10 CB5_CA10 -#define E_11 CB5_CA11 -#define E_12 CB5_CA12 -#define E_13 CB5_CA13 -#define E_14 CB5_CA14 -#define E_15 CB5_CA15 -#define E_16 CB5_CA16 - -#define F_1 CB6_CA1 -#define F_2 CB6_CA2 -#define F_3 CB6_CA3 -#define F_4 CB6_CA4 -#define F_5 CB6_CA5 -#define F_6 CB6_CA6 -#define F_7 CB6_CA7 -#define F_8 CB6_CA8 -#define F_9 CB6_CA9 -#define F_10 CB6_CA10 -#define F_11 CB6_CA11 -#define F_12 CB6_CA12 -#define F_13 CB6_CA13 -#define F_14 CB6_CA14 -#define F_15 CB6_CA15 -#define F_16 CB6_CA16 - -#define G_1 CB7_CA1 -#define G_2 CB7_CA2 -#define G_3 CB7_CA3 -#define G_4 CB7_CA4 -#define G_5 CB7_CA5 -#define G_6 CB7_CA6 -#define G_7 CB7_CA7 -#define G_8 CB7_CA8 -#define G_9 CB7_CA9 -#define G_10 CB7_CA10 -#define G_11 CB7_CA11 -#define G_12 CB7_CA12 -#define G_13 CB7_CA13 -#define G_14 CB7_CA14 -#define G_15 CB7_CA15 -#define G_16 CB7_CA16 - -#define H_1 CB8_CA1 -#define H_2 CB8_CA2 -#define H_3 CB8_CA3 -#define H_4 CB8_CA4 -#define H_5 CB8_CA5 -#define H_6 CB8_CA6 -#define H_7 CB8_CA7 -#define H_8 CB8_CA8 -#define H_9 CB8_CA9 -#define H_10 CB8_CA10 -#define H_11 CB8_CA11 -#define H_12 CB8_CA12 -#define H_13 CB8_CA13 -#define H_14 CB8_CA14 -#define H_15 CB8_CA15 -#define H_16 CB8_CA16 - -#define I_1 CB9_CA1 -#define I_2 CB9_CA2 -#define I_3 CB9_CA3 -#define I_4 CB9_CA4 -#define I_5 CB9_CA5 -#define I_6 CB9_CA6 -#define I_7 CB9_CA7 -#define I_8 CB9_CA8 -#define I_9 CB9_CA9 -#define I_10 CB9_CA10 -#define I_11 CB9_CA11 -#define I_12 CB9_CA12 -#define I_13 CB9_CA13 -#define I_14 CB9_CA14 -#define I_15 CB9_CA15 -#define I_16 CB9_CA16 - -#define J_1 CB10_CA1 -#define J_2 CB10_CA2 -#define J_3 CB10_CA3 -#define J_4 CB10_CA4 -#define J_5 CB10_CA5 -#define J_6 CB10_CA6 -#define J_7 CB10_CA7 -#define J_8 CB10_CA8 -#define J_9 CB10_CA9 -#define J_10 CB10_CA10 -#define J_11 CB10_CA11 -#define J_12 CB10_CA12 -#define J_13 CB10_CA13 -#define J_14 CB10_CA14 -#define J_15 CB10_CA15 -#define J_16 CB10_CA16 - -#define K_1 CB11_CA1 -#define K_2 CB11_CA2 -#define K_3 CB11_CA3 -#define K_4 CB11_CA4 -#define K_5 CB11_CA5 -#define K_6 CB11_CA6 -#define K_7 CB11_CA7 -#define K_8 CB11_CA8 -#define K_9 CB11_CA9 -#define K_10 CB11_CA10 -#define K_11 CB11_CA11 -#define K_12 CB11_CA12 -#define K_13 CB11_CA13 -#define K_14 CB11_CA14 -#define K_15 CB11_CA15 -#define K_16 CB11_CA16 - -#define L_1 CB12_CA1 -#define L_2 CB12_CA2 -#define L_3 CB12_CA3 -#define L_4 CB12_CA4 -#define L_5 CB12_CA5 -#define L_6 CB12_CA6 -#define L_7 CB12_CA7 -#define L_8 CB12_CA8 -#define L_9 CB12_CA9 -#define L_10 CB12_CA10 -#define L_11 CB12_CA11 -#define L_12 CB12_CA12 -#define L_13 CB12_CA13 -#define L_14 CB12_CA14 -#define L_15 CB12_CA15 -#define L_16 CB12_CA16 diff --git a/drivers/led/snled27351.h b/drivers/led/snled27351.h index d902744d14..1b7f05c285 100644 --- a/drivers/led/snled27351.h +++ b/drivers/led/snled27351.h @@ -21,49 +21,6 @@ #include "progmem.h" #include "util.h" -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef DRIVER_ADDR_1 -# define SNLED27351_I2C_ADDRESS_1 DRIVER_ADDR_1 -#endif -#ifdef DRIVER_ADDR_2 -# define SNLED27351_I2C_ADDRESS_2 DRIVER_ADDR_2 -#endif -#ifdef DRIVER_ADDR_3 -# define SNLED27351_I2C_ADDRESS_3 DRIVER_ADDR_3 -#endif -#ifdef DRIVER_ADDR_4 -# define SNLED27351_I2C_ADDRESS_4 DRIVER_ADDR_4 -#endif -#ifdef CKLED2001_TIMEOUT -# define SNLED27351_I2C_TIMEOUT CKLED2001_TIMEOUT -#endif -#ifdef CKLED2001_PERSISTENCE -# define SNLED27351_I2C_PERSISTENCE CKLED2001_PERSISTENCE -#endif -#ifdef PHASE_CHANNEL -# define SNLED27351_PHASE_CHANNEL PHASE_CHANNEL -#endif -#ifdef CKLED2001_CURRENT_TUNE -# define SNLED27351_CURRENT_TUNE CKLED2001_CURRENT_TUNE -#endif - -#define MSKPHASE_12CHANNEL SNLED27351_SCAN_PHASE_12_CHANNEL -#define MSKPHASE_11CHANNEL SNLED27351_SCAN_PHASE_11_CHANNEL -#define MSKPHASE_10CHANNEL SNLED27351_SCAN_PHASE_10_CHANNEL -#define MSKPHASE_9CHANNEL SNLED27351_SCAN_PHASE_9_CHANNEL -#define MSKPHASE_8CHANNEL SNLED27351_SCAN_PHASE_8_CHANNEL -#define MSKPHASE_7CHANNEL SNLED27351_SCAN_PHASE_7_CHANNEL -#define MSKPHASE_6CHANNEL SNLED27351_SCAN_PHASE_6_CHANNEL -#define MSKPHASE_5CHANNEL SNLED27351_SCAN_PHASE_5_CHANNEL -#define MSKPHASE_4CHANNEL SNLED27351_SCAN_PHASE_4_CHANNEL -#define MSKPHASE_3CHANNEL SNLED27351_SCAN_PHASE_3_CHANNEL -#define MSKPHASE_2CHANNEL SNLED27351_SCAN_PHASE_2_CHANNEL -#define MSKPHASE_1CHANNEL SNLED27351_SCAN_PHASE_1_CHANNEL - -#define ckled2001_led snled27351_led_t -#define g_ckled2001_leds g_snled27351_leds -// ======== - #define SNLED27351_REG_COMMAND 0xFD #define SNLED27351_COMMAND_LED_CONTROL 0x00 #define SNLED27351_COMMAND_PWM 0x01 @@ -392,209 +349,3 @@ void snled27351_sw_shutdown(uint8_t index); #define CB12_CA14 0xBD #define CB12_CA15 0xBE #define CB12_CA16 0xBF - -// DEPRECATED - DO NOT USE - -#define A_1 CB1_CA1 -#define A_2 CB1_CA2 -#define A_3 CB1_CA3 -#define A_4 CB1_CA4 -#define A_5 CB1_CA5 -#define A_6 CB1_CA6 -#define A_7 CB1_CA7 -#define A_8 CB1_CA8 -#define A_9 CB1_CA9 -#define A_10 CB1_CA10 -#define A_11 CB1_CA11 -#define A_12 CB1_CA12 -#define A_13 CB1_CA13 -#define A_14 CB1_CA14 -#define A_15 CB1_CA15 -#define A_16 CB1_CA16 - -#define B_1 CB2_CA1 -#define B_2 CB2_CA2 -#define B_3 CB2_CA3 -#define B_4 CB2_CA4 -#define B_5 CB2_CA5 -#define B_6 CB2_CA6 -#define B_7 CB2_CA7 -#define B_8 CB2_CA8 -#define B_9 CB2_CA9 -#define B_10 CB2_CA10 -#define B_11 CB2_CA11 -#define B_12 CB2_CA12 -#define B_13 CB2_CA13 -#define B_14 CB2_CA14 -#define B_15 CB2_CA15 -#define B_16 CB2_CA16 - -#define C_1 CB3_CA1 -#define C_2 CB3_CA2 -#define C_3 CB3_CA3 -#define C_4 CB3_CA4 -#define C_5 CB3_CA5 -#define C_6 CB3_CA6 -#define C_7 CB3_CA7 -#define C_8 CB3_CA8 -#define C_9 CB3_CA9 -#define C_10 CB3_CA10 -#define C_11 CB3_CA11 -#define C_12 CB3_CA12 -#define C_13 CB3_CA13 -#define C_14 CB3_CA14 -#define C_15 CB3_CA15 -#define C_16 CB3_CA16 - -#define D_1 CB4_CA1 -#define D_2 CB4_CA2 -#define D_3 CB4_CA3 -#define D_4 CB4_CA4 -#define D_5 CB4_CA5 -#define D_6 CB4_CA6 -#define D_7 CB4_CA7 -#define D_8 CB4_CA8 -#define D_9 CB4_CA9 -#define D_10 CB4_CA10 -#define D_11 CB4_CA11 -#define D_12 CB4_CA12 -#define D_13 CB4_CA13 -#define D_14 CB4_CA14 -#define D_15 CB4_CA15 -#define D_16 CB4_CA16 - -#define E_1 CB5_CA1 -#define E_2 CB5_CA2 -#define E_3 CB5_CA3 -#define E_4 CB5_CA4 -#define E_5 CB5_CA5 -#define E_6 CB5_CA6 -#define E_7 CB5_CA7 -#define E_8 CB5_CA8 -#define E_9 CB5_CA9 -#define E_10 CB5_CA10 -#define E_11 CB5_CA11 -#define E_12 CB5_CA12 -#define E_13 CB5_CA13 -#define E_14 CB5_CA14 -#define E_15 CB5_CA15 -#define E_16 CB5_CA16 - -#define F_1 CB6_CA1 -#define F_2 CB6_CA2 -#define F_3 CB6_CA3 -#define F_4 CB6_CA4 -#define F_5 CB6_CA5 -#define F_6 CB6_CA6 -#define F_7 CB6_CA7 -#define F_8 CB6_CA8 -#define F_9 CB6_CA9 -#define F_10 CB6_CA10 -#define F_11 CB6_CA11 -#define F_12 CB6_CA12 -#define F_13 CB6_CA13 -#define F_14 CB6_CA14 -#define F_15 CB6_CA15 -#define F_16 CB6_CA16 - -#define G_1 CB7_CA1 -#define G_2 CB7_CA2 -#define G_3 CB7_CA3 -#define G_4 CB7_CA4 -#define G_5 CB7_CA5 -#define G_6 CB7_CA6 -#define G_7 CB7_CA7 -#define G_8 CB7_CA8 -#define G_9 CB7_CA9 -#define G_10 CB7_CA10 -#define G_11 CB7_CA11 -#define G_12 CB7_CA12 -#define G_13 CB7_CA13 -#define G_14 CB7_CA14 -#define G_15 CB7_CA15 -#define G_16 CB7_CA16 - -#define H_1 CB8_CA1 -#define H_2 CB8_CA2 -#define H_3 CB8_CA3 -#define H_4 CB8_CA4 -#define H_5 CB8_CA5 -#define H_6 CB8_CA6 -#define H_7 CB8_CA7 -#define H_8 CB8_CA8 -#define H_9 CB8_CA9 -#define H_10 CB8_CA10 -#define H_11 CB8_CA11 -#define H_12 CB8_CA12 -#define H_13 CB8_CA13 -#define H_14 CB8_CA14 -#define H_15 CB8_CA15 -#define H_16 CB8_CA16 - -#define I_1 CB9_CA1 -#define I_2 CB9_CA2 -#define I_3 CB9_CA3 -#define I_4 CB9_CA4 -#define I_5 CB9_CA5 -#define I_6 CB9_CA6 -#define I_7 CB9_CA7 -#define I_8 CB9_CA8 -#define I_9 CB9_CA9 -#define I_10 CB9_CA10 -#define I_11 CB9_CA11 -#define I_12 CB9_CA12 -#define I_13 CB9_CA13 -#define I_14 CB9_CA14 -#define I_15 CB9_CA15 -#define I_16 CB9_CA16 - -#define J_1 CB10_CA1 -#define J_2 CB10_CA2 -#define J_3 CB10_CA3 -#define J_4 CB10_CA4 -#define J_5 CB10_CA5 -#define J_6 CB10_CA6 -#define J_7 CB10_CA7 -#define J_8 CB10_CA8 -#define J_9 CB10_CA9 -#define J_10 CB10_CA10 -#define J_11 CB10_CA11 -#define J_12 CB10_CA12 -#define J_13 CB10_CA13 -#define J_14 CB10_CA14 -#define J_15 CB10_CA15 -#define J_16 CB10_CA16 - -#define K_1 CB11_CA1 -#define K_2 CB11_CA2 -#define K_3 CB11_CA3 -#define K_4 CB11_CA4 -#define K_5 CB11_CA5 -#define K_6 CB11_CA6 -#define K_7 CB11_CA7 -#define K_8 CB11_CA8 -#define K_9 CB11_CA9 -#define K_10 CB11_CA10 -#define K_11 CB11_CA11 -#define K_12 CB11_CA12 -#define K_13 CB11_CA13 -#define K_14 CB11_CA14 -#define K_15 CB11_CA15 -#define K_16 CB11_CA16 - -#define L_1 CB12_CA1 -#define L_2 CB12_CA2 -#define L_3 CB12_CA3 -#define L_4 CB12_CA4 -#define L_5 CB12_CA5 -#define L_6 CB12_CA6 -#define L_7 CB12_CA7 -#define L_8 CB12_CA8 -#define L_9 CB12_CA9 -#define L_10 CB12_CA10 -#define L_11 CB12_CA11 -#define L_12 CB12_CA12 -#define L_13 CB12_CA13 -#define L_14 CB12_CA14 -#define L_15 CB12_CA15 -#define L_16 CB12_CA16 diff --git a/keyboards/zsa/voyager/voyager.c b/keyboards/zsa/voyager/voyager.c index 6d4f6c5f26..b7ca8f748f 100644 --- a/keyboards/zsa/voyager/voyager.c +++ b/keyboards/zsa/voyager/voyager.c @@ -121,7 +121,7 @@ layer_state_t layer_state_set_kb(layer_state_t state) { #ifdef RGB_MATRIX_ENABLE // clang-format off -const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = { +const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT] = { /* Refer to IS31 manual for these locations * driver * | R location From a6a0dc803908a426c331b698acab663a900c2b10 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 21 Jan 2025 08:24:39 +1100 Subject: [PATCH 141/592] Consolidate send_string implementations. (#24817) --- builddefs/common_features.mk | 4 ++ quantum/dynamic_keymap.c | 66 +++++------------------ quantum/send_string/send_string.c | 88 ++++++++++++++----------------- quantum/send_string/send_string.h | 8 +++ 4 files changed, 64 insertions(+), 102 deletions(-) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index bb272099a6..989048d717 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -635,6 +635,10 @@ ifeq ($(strip $(VIA_ENABLE)), yes) TRI_LAYER_ENABLE := yes endif +ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) + SEND_STRING_ENABLE := yes +endif + VALID_CUSTOM_MATRIX_TYPES:= yes lite no CUSTOM_MATRIX ?= no diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 3c22bbd445..beb7f9d18f 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -245,6 +245,17 @@ void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *da } } +typedef struct send_string_eeprom_state_t { + const uint8_t *ptr; +} send_string_eeprom_state_t; + +char send_string_get_next_eeprom(void *arg) { + send_string_eeprom_state_t *state = (send_string_eeprom_state_t *)arg; + char ret = eeprom_read_byte(state->ptr); + state->ptr++; + return ret; +} + void dynamic_keymap_macro_reset(void) { void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); @@ -284,57 +295,6 @@ void dynamic_keymap_macro_send(uint8_t id) { ++p; } - // Send the macro string by making a temporary string. - char data[8] = {0}; - // We already checked there was a null at the end of - // the buffer, so this cannot go past the end - while (1) { - data[0] = eeprom_read_byte(p++); - data[1] = 0; - // Stop at the null terminator of this macro string - if (data[0] == 0) { - break; - } - if (data[0] == SS_QMK_PREFIX) { - // Get the code - data[1] = eeprom_read_byte(p++); - // Unexpected null, abort. - if (data[1] == 0) { - return; - } - if (data[1] == SS_TAP_CODE || data[1] == SS_DOWN_CODE || data[1] == SS_UP_CODE) { - // Get the keycode - data[2] = eeprom_read_byte(p++); - // Unexpected null, abort. - if (data[2] == 0) { - return; - } - // Null terminate - data[3] = 0; - } else if (data[1] == SS_DELAY_CODE) { - // Get the number and '|' - // At most this is 4 digits plus '|' - uint8_t i = 2; - while (1) { - data[i] = eeprom_read_byte(p++); - // Unexpected null, abort - if (data[i] == 0) { - return; - } - // Found '|', send it - if (data[i] == '|') { - data[i + 1] = 0; - break; - } - // If haven't found '|' by i==6 then - // number too big, abort - if (i == 6) { - return; - } - ++i; - } - } - } - send_string_with_delay(data, DYNAMIC_KEYMAP_MACRO_DELAY); - } + send_string_eeprom_state_t state = {p}; + send_string_with_delay_impl(send_string_get_next_eeprom, &state, DYNAMIC_KEYMAP_MACRO_DELAY); } diff --git a/quantum/send_string/send_string.c b/quantum/send_string/send_string.c index 44c5ec5ab9..602f24dabe 100644 --- a/quantum/send_string/send_string.c +++ b/quantum/send_string/send_string.c @@ -150,48 +150,65 @@ void send_string(const char *string) { send_string_with_delay(string, TAP_CODE_DELAY); } -void send_string_with_delay(const char *string, uint8_t interval) { +void send_string_with_delay_impl(char (*getter)(void *), void *arg, uint8_t interval) { while (1) { - char ascii_code = *string; + char ascii_code = getter(arg); if (!ascii_code) break; if (ascii_code == SS_QMK_PREFIX) { - ascii_code = *(++string); + ascii_code = getter(arg); if (ascii_code == SS_TAP_CODE) { // tap - uint8_t keycode = *(++string); + uint8_t keycode = getter(arg); tap_code(keycode); } else if (ascii_code == SS_DOWN_CODE) { // down - uint8_t keycode = *(++string); + uint8_t keycode = getter(arg); register_code(keycode); } else if (ascii_code == SS_UP_CODE) { // up - uint8_t keycode = *(++string); + uint8_t keycode = getter(arg); unregister_code(keycode); } else if (ascii_code == SS_DELAY_CODE) { // delay - int ms = 0; - uint8_t keycode = *(++string); + int ms = 0; + ascii_code = getter(arg); - while (isdigit(keycode)) { + while (isdigit(ascii_code)) { ms *= 10; - ms += keycode - '0'; - keycode = *(++string); + ms += ascii_code - '0'; + ascii_code = getter(arg); } wait_ms(ms); } wait_ms(interval); + + // if we had a delay that terminated with a null, we're done + if (ascii_code == 0) break; } else { send_char_with_delay(ascii_code, interval); } - - ++string; } } +typedef struct send_string_memory_state_t { + const char *string; +} send_string_memory_state_t; + +char send_string_get_next_ram(void *arg) { + send_string_memory_state_t *state = (send_string_memory_state_t *)arg; + char ret = *state->string; + state->string++; + return ret; +} + +void send_string_with_delay(const char *string, uint8_t interval) { + send_string_memory_state_t state = {string}; + send_string_with_delay_impl(send_string_get_next_ram, &state, interval); +} + void send_char(char ascii_code) { send_char_with_delay(ascii_code, TAP_CODE_DELAY); } @@ -297,42 +314,15 @@ void send_string_P(const char *string) { send_string_with_delay_P(string, TAP_CODE_DELAY); } +char send_string_get_next_progmem(void *arg) { + send_string_memory_state_t *state = (send_string_memory_state_t *)arg; + char ret = pgm_read_byte(state->string); + state->string++; + return ret; +} + void send_string_with_delay_P(const char *string, uint8_t interval) { - while (1) { - char ascii_code = pgm_read_byte(string); - if (!ascii_code) break; - if (ascii_code == SS_QMK_PREFIX) { - ascii_code = pgm_read_byte(++string); - - if (ascii_code == SS_TAP_CODE) { - // tap - uint8_t keycode = pgm_read_byte(++string); - tap_code(keycode); - } else if (ascii_code == SS_DOWN_CODE) { - // down - uint8_t keycode = pgm_read_byte(++string); - register_code(keycode); - } else if (ascii_code == SS_UP_CODE) { - // up - uint8_t keycode = pgm_read_byte(++string); - unregister_code(keycode); - } else if (ascii_code == SS_DELAY_CODE) { - // delay - int ms = 0; - uint8_t keycode = pgm_read_byte(++string); - - while (isdigit(keycode)) { - ms *= 10; - ms += keycode - '0'; - keycode = pgm_read_byte(++string); - } - wait_ms(ms); - } - } else { - send_char_with_delay(ascii_code, interval); - } - - ++string; - } + send_string_memory_state_t state = {string}; + send_string_with_delay_impl(send_string_get_next_progmem, &state, interval); } #endif diff --git a/quantum/send_string/send_string.h b/quantum/send_string/send_string.h index f727ec507d..4f91252075 100644 --- a/quantum/send_string/send_string.h +++ b/quantum/send_string/send_string.h @@ -161,4 +161,12 @@ void send_string_with_delay_P(const char *string, uint8_t interval); */ #define SEND_STRING_DELAY(string, interval) send_string_with_delay_P(PSTR(string), interval) +/** + * \brief Actual implementation function that iterates and sends the string returned by the getter function. + * + * The getter assumes that the next byte is available to be read, and returns it. `arg` is passed in and can be whatever + * makes most sense for the getter -- each invocation of `getter` must advance its position in the source. + */ +void send_string_with_delay_impl(char (*getter)(void *), void *arg, uint8_t interval); + /** \} */ From a573931fef26427e761456698de83e58458df17c Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 21 Jan 2025 08:32:52 +1100 Subject: [PATCH 142/592] License violations updates. (#24831) --- docs/license_violations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/license_violations.md b/docs/license_violations.md index b21bb286ac..f899deb07c 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -20,13 +20,13 @@ If you own a board from one of the following vendors already, consider asking th | Vendor | Reason | |------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | -| Chillkey | | | CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | | Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | | Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | | Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. | | iLovBee | Official 30-day copyright source code request issued Sep 11 2024 due to deception on PR, no response received. Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. | | KiiBOOM | Seems to use the same OEM as Epomaker, same problems. | +| kprepublic | Makes no attempt to release source code, all boards in QMK are reverse-engineered, created, and supported by the community. New board variants magically appear without telling customers they're incompatible with existing QMK versions, in some cases bricking boards or requiring ISP flashing. | | Luminkey | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | | Meletrix | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | | mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. | @@ -36,13 +36,13 @@ If you own a board from one of the following vendors already, consider asking th | Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. | | Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. | -| Shortcut Studio | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | | Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. | | TKD / Vertex | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | WOBKEY | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Weikav | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | | Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | +| XVX | Ambiguity on PRs -- marketing says wireless, PR author said wired-only. Seemingly intentionally deceptive. | | Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | ::: danger Violations From 7431401116c744e4e3d8e92e5047c9dc3baebb9f Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 21 Jan 2025 08:54:41 +1100 Subject: [PATCH 143/592] Fix up CI with `DEFAULT_FOLDER`. (#24842) --- keyboards/rgbkb/pan/rules.mk | 2 -- 1 file changed, 2 deletions(-) diff --git a/keyboards/rgbkb/pan/rules.mk b/keyboards/rgbkb/pan/rules.mk index b6f1d46a65..9a69649289 100644 --- a/keyboards/rgbkb/pan/rules.mk +++ b/keyboards/rgbkb/pan/rules.mk @@ -1,3 +1 @@ WS2812_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = rgbkb/pan/rev1 From 1a30e2b32b5255ed32d156abe26a897fa86db8a4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 20 Jan 2025 22:26:25 +0000 Subject: [PATCH 144/592] Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson (#24835) --- data/mappings/keyboard_aliases.hjson | 547 ++++++++++++++++++ keyboards/0_sixty/rules.mk | 1 - keyboards/0xcb/splaytoraid/rules.mk | 1 - keyboards/1upkeyboards/pi40/rules.mk | 1 - keyboards/1upkeyboards/pi50/rules.mk | 1 - keyboards/1upkeyboards/sweet16/rules.mk | 1 - keyboards/40percentclub/i75/rules.mk | 1 - keyboards/40percentclub/polyandry/rules.mk | 1 - keyboards/8pack/rules.mk | 1 - keyboards/adkb96/rules.mk | 1 - keyboards/adm42/rules.mk | 1 - keyboards/aeboards/satellite/rules.mk | 1 - keyboards/atreus/rules.mk | 1 - keyboards/atreyu/rules.mk | 1 - keyboards/binepad/bn009/rules.mk | 3 - keyboards/binepad/bnr1/rules.mk | 1 - keyboards/boston_meetup/rules.mk | 1 - keyboards/bpiphany/frosty_flake/rules.mk | 1 - keyboards/buzzard/rules.mk | 1 - keyboards/clickety_split/leeloo/rules.mk | 2 - keyboards/crkbd/rules.mk | 1 - keyboards/dailycraft/bat43/rules.mk | 1 - keyboards/dailycraft/claw44/rules.mk | 1 - keyboards/dailycraft/sandbox/rules.mk | 1 - keyboards/dailycraft/wings42/rules.mk | 1 - keyboards/delikeeb/vanana/rules.mk | 1 - keyboards/delikeeb/waaffle/rev3/rules.mk | 1 - keyboards/deltasplit75/rules.mk | 1 - keyboards/duck/octagon/rules.mk | 1 - keyboards/duck/orion/rules.mk | 1 - keyboards/ducky/one2mini/rules.mk | 1 - keyboards/ducky/one2sf/rules.mk | 1 - keyboards/dumbpad/rules.mk | 1 - keyboards/durgod/galaxy/rules.mk | 1 - keyboards/durgod/venus/rules.mk | 1 - keyboards/dztech/tofu/ii/rules.mk | 1 - keyboards/dztech/tofu/jr/rules.mk | 1 - keyboards/eco/rules.mk | 1 - keyboards/ergoslab/rules.mk | 1 - keyboards/ergotravel/rules.mk | 1 - keyboards/evyd13/atom47/rules.mk | 1 - keyboards/fortitude60/rules.mk | 1 - keyboards/fruitykeeb/fruitbar/r1/rules.mk | 1 - keyboards/ghs/jem/rules.mk | 1 - keyboards/hadron/rules.mk | 1 - keyboards/handwired/bento/rules.mk | 1 - .../handwired/dactyl_manuform/6x6/rules.mk | 1 - keyboards/handwired/ms_sculpt_mobile/rules.mk | 1 - keyboards/handwired/onekey/rules.mk | 1 - keyboards/handwired/pill60/rules.mk | 1 - keyboards/handwired/postageboard/rules.mk | 1 - keyboards/handwired/qc60/rules.mk | 1 - keyboards/handwired/sono1/rules.mk | 1 - keyboards/handwired/splittest/rules.mk | 1 - .../handwired/stef9998/split_5x7/rules.mk | 1 - .../symmetric70_proto/promicro/rules.mk | 1 - .../symmetric70_proto/proton_c/rules.mk | 1 - keyboards/handwired/unk/rules.mk | 1 - keyboards/hillside/46/rules.mk | 1 - keyboards/hillside/48/rules.mk | 1 - keyboards/hillside/52/rules.mk | 1 - keyboards/ibnuda/squiggle/rules.mk | 1 - keyboards/idobao/id80/v1/rules.mk | 2 - keyboards/idobao/id80/v3/rules.mk | 2 - keyboards/inett_studio/sq80/rules.mk | 1 - keyboards/jacky_studio/bear_65/rules.mk | 1 - keyboards/jadookb/jkb65/rules.mk | 1 - keyboards/jian/rules.mk | 1 - keyboards/jiran/rules.mk | 1 - keyboards/jorne/rules.mk | 1 - keyboards/junco/rules.mk | 1 - keyboards/kakunpc/business_card/rules.mk | 1 - keyboards/kakunpc/suihankey/rules.mk | 1 - keyboards/kapcave/paladinpad/rules.mk | 1 - keyboards/kapl/rules.mk | 1 - keyboards/kbdfans/d45/rules.mk | 1 - keyboards/kbdfans/kbd75/rules.mk | 1 - keyboards/keebio/bdn9/rules.mk | 1 - keyboards/keebio/convolution/rules.mk | 1 - keyboards/keebio/foldkb/rules.mk | 1 - keyboards/keebio/kbo5000/rules.mk | 1 - keyboards/keebio/levinson/rules.mk | 1 - keyboards/keebio/quefrency/rules.mk | 1 - keyboards/keebio/rorschach/rules.mk | 1 - keyboards/keebio/sinc/rules.mk | 1 - keyboards/keebio/viterbi/rules.mk | 1 - keyboards/keycapsss/kimiko/rules.mk | 1 - keyboards/kin80/rules.mk | 1 - keyboards/kumaokobo/kudox/rules.mk | 1 - keyboards/kumaokobo/kudox_full/rules.mk | 1 - keyboards/kumaokobo/kudox_game/rules.mk | 1 - keyboards/kumaokobo/pico/rules.mk | 1 - keyboards/lazydesigners/dimple/rules.mk | 1 - keyboards/lets_split/rules.mk | 1 - keyboards/lfkeyboards/lfk87/rules.mk | 1 - keyboards/lily58/rules.mk | 1 - keyboards/lime/rules.mk | 1 - keyboards/maple_computing/ivy/rules.mk | 1 - keyboards/maple_computing/launchpad/rules.mk | 1 - keyboards/maple_computing/minidox/rules.mk | 1 - keyboards/mariorion_v25/rules.mk | 1 - keyboards/marksard/rhymestone/rules.mk | 1 - keyboards/marksard/treadstone48/rules.mk | 1 - keyboards/maxipad/rules.mk | 1 - keyboards/mechkeys/mechmini/rules.mk | 1 - keyboards/mechllama/g35/rules.mk | 1 - keyboards/mechlovin/adelais/rules.mk | 1 - .../adelais/standard_led/arm/rev4/rules.mk | 1 - .../adelais/standard_led/arm/rules.mk | 1 - .../adelais/standard_led/avr/rules.mk | 2 - keyboards/mechlovin/infinity87/rev1/rules.mk | 1 - keyboards/mechlovin/infinity87/rules.mk | 1 - keyboards/mechlovin/mechlovin9/rules.mk | 1 - keyboards/mechlovin/olly/jf/rules.mk | 1 - keyboards/mechlovin/zed1800/rules.mk | 1 - .../mechlovin/zed65/no_backlight/rules.mk | 1 - keyboards/mechlovin/zed65/rules.mk | 1 - keyboards/mechwild/bde/rules.mk | 1 - keyboards/mechwild/mokulua/rules.mk | 1 - keyboards/mechwild/obe/f401/rules.mk | 1 - keyboards/mechwild/obe/f411/rules.mk | 1 - keyboards/mechwild/obe/rules.mk | 1 - keyboards/mechwild/waka60/f401/rules.mk | 1 - keyboards/mechwild/waka60/f411/rules.mk | 1 - keyboards/mechwild/waka60/rules.mk | 1 - keyboards/murcielago/rules.mk | 1 - keyboards/nullbitsco/scramble/rules.mk | 1 - keyboards/omkbd/ergodash/rules.mk | 1 - keyboards/omkbd/runner3680/rules.mk | 1 - keyboards/orthodox/rules.mk | 1 - keyboards/peej/rosaline/rules.mk | 1 - keyboards/peej/tripel/rules.mk | 1 - keyboards/peranekofactory/tone/rules.mk | 1 - keyboards/phase_studio/titan65/rules.mk | 1 - keyboards/pica40/rules.mk | 1 - keyboards/pinky/rules.mk | 1 - keyboards/primekb/meridian/rules.mk | 1 - keyboards/primekb/prime_e/rules.mk | 1 - keyboards/program_yoink/rules.mk | 1 - keyboards/projectcain/vault35/rules.mk | 1 - keyboards/qpockets/space_space/rules.mk | 1 - keyboards/qwertyydox/rules.mk | 1 - keyboards/redox/rev1/rules.mk | 1 - keyboards/rgbkb/mun/rules.mk | 1 - keyboards/rgbkb/sol/rules.mk | 1 - keyboards/rgbkb/sol3/rules.mk | 1 - keyboards/rgbkb/zen/rules.mk | 1 - keyboards/rgbkb/zygomorph/rules.mk | 1 - keyboards/rmi_kb/herringbone/rules.mk | 1 - keyboards/rmi_kb/mona/rules.mk | 1 - keyboards/rmi_kb/tkl_ff/rules.mk | 1 - keyboards/rmi_kb/wete/rules.mk | 1 - keyboards/rookiebwoy/late9/rules.mk | 1 - keyboards/rookiebwoy/neopad/rules.mk | 1 - keyboards/rura66/rules.mk | 1 - keyboards/sawnsprojects/okayu/rules.mk | 1 - keyboards/smoll/lefty/rules.mk | 1 - keyboards/sofle/rules.mk | 1 - keyboards/spacetime/rules.mk | 1 - keyboards/splitkb/aurora/corne/rules.mk | 16 - keyboards/splitkb/aurora/helix/rules.mk | 1 - keyboards/splitkb/aurora/lily58/rules.mk | 16 - keyboards/splitkb/aurora/sofle_v2/rules.mk | 1 - keyboards/splitkb/aurora/sweep/rules.mk | 16 - keyboards/splitkb/kyria/rev1/rules.mk | 1 - keyboards/splitkb/kyria/rev2/rules.mk | 1 - keyboards/splitty/rules.mk | 1 - keyboards/studiokestra/galatea/rules.mk | 1 - keyboards/takashiski/hecomi/rules.mk | 1 - keyboards/themadnoodle/noodlepad/rules.mk | 3 - keyboards/tkw/grandiceps/rules.mk | 1 - keyboards/tominabox1/littlefoot_lx/rules.mk | 1 - keyboards/tominabox1/underscore33/rules.mk | 1 - keyboards/trnthsn/e8ghty/rules.mk | 1 - keyboards/trnthsn/s6xty5neor2/rules.mk | 1 - keyboards/tweetydabird/lotus58/rules.mk | 1 - keyboards/unison/rules.mk | 1 - keyboards/uzu42/rules.mk | 1 - keyboards/vitamins_included/rules.mk | 1 - keyboards/yanghu/unicorne/rules.mk | 1 - keyboards/yosino58/rules.mk | 1 - keyboards/yushakobo/navpad/10/rules.mk | 1 - keyboards/yynmt/acperience12/rules.mk | 1 - 183 files changed, 547 insertions(+), 235 deletions(-) delete mode 100644 keyboards/0_sixty/rules.mk delete mode 100644 keyboards/0xcb/splaytoraid/rules.mk delete mode 100644 keyboards/1upkeyboards/pi40/rules.mk delete mode 100644 keyboards/1upkeyboards/pi50/rules.mk delete mode 100644 keyboards/1upkeyboards/sweet16/rules.mk delete mode 100644 keyboards/40percentclub/i75/rules.mk delete mode 100644 keyboards/40percentclub/polyandry/rules.mk delete mode 100644 keyboards/8pack/rules.mk delete mode 100644 keyboards/adkb96/rules.mk delete mode 100644 keyboards/adm42/rules.mk delete mode 100644 keyboards/aeboards/satellite/rules.mk delete mode 100644 keyboards/atreus/rules.mk delete mode 100644 keyboards/atreyu/rules.mk delete mode 100644 keyboards/binepad/bn009/rules.mk delete mode 100755 keyboards/binepad/bnr1/rules.mk delete mode 100644 keyboards/boston_meetup/rules.mk delete mode 100644 keyboards/bpiphany/frosty_flake/rules.mk delete mode 100644 keyboards/buzzard/rules.mk delete mode 100644 keyboards/clickety_split/leeloo/rules.mk delete mode 100644 keyboards/crkbd/rules.mk delete mode 100644 keyboards/dailycraft/bat43/rules.mk delete mode 100644 keyboards/dailycraft/claw44/rules.mk delete mode 100644 keyboards/dailycraft/sandbox/rules.mk delete mode 100644 keyboards/dailycraft/wings42/rules.mk delete mode 100644 keyboards/delikeeb/vanana/rules.mk delete mode 100644 keyboards/delikeeb/waaffle/rev3/rules.mk delete mode 100644 keyboards/deltasplit75/rules.mk delete mode 100644 keyboards/duck/octagon/rules.mk delete mode 100644 keyboards/duck/orion/rules.mk delete mode 100644 keyboards/ducky/one2mini/rules.mk delete mode 100644 keyboards/ducky/one2sf/rules.mk delete mode 100644 keyboards/dumbpad/rules.mk delete mode 100644 keyboards/durgod/galaxy/rules.mk delete mode 100644 keyboards/durgod/venus/rules.mk delete mode 100644 keyboards/dztech/tofu/ii/rules.mk delete mode 100644 keyboards/dztech/tofu/jr/rules.mk delete mode 100644 keyboards/eco/rules.mk delete mode 100644 keyboards/ergoslab/rules.mk delete mode 100644 keyboards/ergotravel/rules.mk delete mode 100644 keyboards/evyd13/atom47/rules.mk delete mode 100644 keyboards/fortitude60/rules.mk delete mode 100644 keyboards/fruitykeeb/fruitbar/r1/rules.mk delete mode 100644 keyboards/ghs/jem/rules.mk delete mode 100644 keyboards/hadron/rules.mk delete mode 100644 keyboards/handwired/bento/rules.mk delete mode 100644 keyboards/handwired/dactyl_manuform/6x6/rules.mk delete mode 100644 keyboards/handwired/ms_sculpt_mobile/rules.mk delete mode 100644 keyboards/handwired/onekey/rules.mk delete mode 100644 keyboards/handwired/pill60/rules.mk delete mode 100644 keyboards/handwired/postageboard/rules.mk delete mode 100644 keyboards/handwired/qc60/rules.mk delete mode 100644 keyboards/handwired/sono1/rules.mk delete mode 100644 keyboards/handwired/splittest/rules.mk delete mode 100644 keyboards/handwired/stef9998/split_5x7/rules.mk delete mode 100644 keyboards/handwired/symmetric70_proto/promicro/rules.mk delete mode 100644 keyboards/handwired/symmetric70_proto/proton_c/rules.mk delete mode 100644 keyboards/handwired/unk/rules.mk delete mode 100644 keyboards/hillside/46/rules.mk delete mode 100644 keyboards/hillside/48/rules.mk delete mode 100644 keyboards/hillside/52/rules.mk delete mode 100644 keyboards/ibnuda/squiggle/rules.mk delete mode 100644 keyboards/idobao/id80/v1/rules.mk delete mode 100644 keyboards/idobao/id80/v3/rules.mk delete mode 100644 keyboards/inett_studio/sq80/rules.mk delete mode 100644 keyboards/jacky_studio/bear_65/rules.mk delete mode 100644 keyboards/jadookb/jkb65/rules.mk delete mode 100644 keyboards/jian/rules.mk delete mode 100644 keyboards/jiran/rules.mk delete mode 100644 keyboards/jorne/rules.mk delete mode 100644 keyboards/junco/rules.mk delete mode 100644 keyboards/kakunpc/business_card/rules.mk delete mode 100644 keyboards/kakunpc/suihankey/rules.mk delete mode 100644 keyboards/kapcave/paladinpad/rules.mk delete mode 100644 keyboards/kapl/rules.mk delete mode 100644 keyboards/kbdfans/d45/rules.mk delete mode 100644 keyboards/kbdfans/kbd75/rules.mk delete mode 100644 keyboards/keebio/bdn9/rules.mk delete mode 100644 keyboards/keebio/convolution/rules.mk delete mode 100644 keyboards/keebio/foldkb/rules.mk delete mode 100644 keyboards/keebio/kbo5000/rules.mk delete mode 100644 keyboards/keebio/levinson/rules.mk delete mode 100644 keyboards/keebio/quefrency/rules.mk delete mode 100644 keyboards/keebio/rorschach/rules.mk delete mode 100644 keyboards/keebio/sinc/rules.mk delete mode 100644 keyboards/keebio/viterbi/rules.mk delete mode 100644 keyboards/keycapsss/kimiko/rules.mk delete mode 100644 keyboards/kin80/rules.mk delete mode 100644 keyboards/kumaokobo/kudox/rules.mk delete mode 100644 keyboards/kumaokobo/kudox_full/rules.mk delete mode 100644 keyboards/kumaokobo/kudox_game/rules.mk delete mode 100644 keyboards/kumaokobo/pico/rules.mk delete mode 100644 keyboards/lazydesigners/dimple/rules.mk delete mode 100644 keyboards/lets_split/rules.mk delete mode 100644 keyboards/lfkeyboards/lfk87/rules.mk delete mode 100644 keyboards/lily58/rules.mk delete mode 100644 keyboards/lime/rules.mk delete mode 100644 keyboards/maple_computing/ivy/rules.mk delete mode 100644 keyboards/maple_computing/launchpad/rules.mk delete mode 100644 keyboards/maple_computing/minidox/rules.mk delete mode 100644 keyboards/mariorion_v25/rules.mk delete mode 100644 keyboards/marksard/rhymestone/rules.mk delete mode 100644 keyboards/marksard/treadstone48/rules.mk delete mode 100644 keyboards/maxipad/rules.mk delete mode 100644 keyboards/mechkeys/mechmini/rules.mk delete mode 100644 keyboards/mechllama/g35/rules.mk delete mode 100644 keyboards/mechlovin/adelais/rules.mk delete mode 100644 keyboards/mechlovin/adelais/standard_led/arm/rev4/rules.mk delete mode 100644 keyboards/mechlovin/adelais/standard_led/arm/rules.mk delete mode 100644 keyboards/mechlovin/adelais/standard_led/avr/rules.mk delete mode 100644 keyboards/mechlovin/infinity87/rev1/rules.mk delete mode 100644 keyboards/mechlovin/infinity87/rules.mk delete mode 100644 keyboards/mechlovin/mechlovin9/rules.mk delete mode 100644 keyboards/mechlovin/olly/jf/rules.mk delete mode 100644 keyboards/mechlovin/zed1800/rules.mk delete mode 100644 keyboards/mechlovin/zed65/no_backlight/rules.mk delete mode 100644 keyboards/mechlovin/zed65/rules.mk delete mode 100644 keyboards/mechwild/bde/rules.mk delete mode 100644 keyboards/mechwild/mokulua/rules.mk delete mode 100644 keyboards/mechwild/obe/f401/rules.mk delete mode 100644 keyboards/mechwild/obe/f411/rules.mk delete mode 100644 keyboards/mechwild/obe/rules.mk delete mode 100644 keyboards/mechwild/waka60/f401/rules.mk delete mode 100644 keyboards/mechwild/waka60/f411/rules.mk delete mode 100644 keyboards/mechwild/waka60/rules.mk delete mode 100644 keyboards/murcielago/rules.mk delete mode 100644 keyboards/nullbitsco/scramble/rules.mk delete mode 100644 keyboards/omkbd/ergodash/rules.mk delete mode 100644 keyboards/omkbd/runner3680/rules.mk delete mode 100644 keyboards/orthodox/rules.mk delete mode 100644 keyboards/peej/rosaline/rules.mk delete mode 100644 keyboards/peej/tripel/rules.mk delete mode 100644 keyboards/peranekofactory/tone/rules.mk delete mode 100644 keyboards/phase_studio/titan65/rules.mk delete mode 100644 keyboards/pica40/rules.mk delete mode 100644 keyboards/pinky/rules.mk delete mode 100644 keyboards/primekb/meridian/rules.mk delete mode 100644 keyboards/primekb/prime_e/rules.mk delete mode 100644 keyboards/program_yoink/rules.mk delete mode 100644 keyboards/projectcain/vault35/rules.mk delete mode 100644 keyboards/qpockets/space_space/rules.mk delete mode 100644 keyboards/qwertyydox/rules.mk delete mode 100644 keyboards/redox/rev1/rules.mk delete mode 100644 keyboards/rgbkb/mun/rules.mk delete mode 100644 keyboards/rgbkb/sol/rules.mk delete mode 100644 keyboards/rgbkb/sol3/rules.mk delete mode 100644 keyboards/rgbkb/zen/rules.mk delete mode 100644 keyboards/rgbkb/zygomorph/rules.mk delete mode 100644 keyboards/rmi_kb/herringbone/rules.mk delete mode 100644 keyboards/rmi_kb/mona/rules.mk delete mode 100644 keyboards/rmi_kb/tkl_ff/rules.mk delete mode 100644 keyboards/rmi_kb/wete/rules.mk delete mode 100755 keyboards/rookiebwoy/late9/rules.mk delete mode 100755 keyboards/rookiebwoy/neopad/rules.mk delete mode 100644 keyboards/rura66/rules.mk delete mode 100644 keyboards/sawnsprojects/okayu/rules.mk delete mode 100644 keyboards/smoll/lefty/rules.mk delete mode 100644 keyboards/sofle/rules.mk delete mode 100644 keyboards/spacetime/rules.mk delete mode 100644 keyboards/splitkb/aurora/corne/rules.mk delete mode 100644 keyboards/splitkb/aurora/helix/rules.mk delete mode 100644 keyboards/splitkb/aurora/lily58/rules.mk delete mode 100644 keyboards/splitkb/aurora/sofle_v2/rules.mk delete mode 100644 keyboards/splitkb/aurora/sweep/rules.mk delete mode 100644 keyboards/splitkb/kyria/rev1/rules.mk delete mode 100644 keyboards/splitkb/kyria/rev2/rules.mk delete mode 100644 keyboards/splitty/rules.mk delete mode 100644 keyboards/studiokestra/galatea/rules.mk delete mode 100644 keyboards/takashiski/hecomi/rules.mk delete mode 100644 keyboards/themadnoodle/noodlepad/rules.mk delete mode 100644 keyboards/tkw/grandiceps/rules.mk delete mode 100644 keyboards/tominabox1/littlefoot_lx/rules.mk delete mode 100644 keyboards/tominabox1/underscore33/rules.mk delete mode 100644 keyboards/trnthsn/e8ghty/rules.mk delete mode 100644 keyboards/trnthsn/s6xty5neor2/rules.mk delete mode 100644 keyboards/tweetydabird/lotus58/rules.mk delete mode 100644 keyboards/unison/rules.mk delete mode 100644 keyboards/uzu42/rules.mk delete mode 100644 keyboards/vitamins_included/rules.mk delete mode 100644 keyboards/yanghu/unicorne/rules.mk delete mode 100644 keyboards/yosino58/rules.mk delete mode 100644 keyboards/yushakobo/navpad/10/rules.mk delete mode 100644 keyboards/yynmt/acperience12/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 4fd959c4eb..745faee801 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1558,5 +1558,552 @@ }, "dnworks/9973": { "target": "dnworks/tkl87" + }, + // DEFAULT_FOLDER removed during 2025 Q1 cycle + "0_sixty": { + "target": "0_sixty/base" + }, + "0xcb/splaytoraid": { + "target": "0xcb/splaytoraid/rp2040_ce" + }, + "1upkeyboards/pi40": { + "target": "1upkeyboards/pi40/mit_v1_0" + }, + "1upkeyboards/pi50": { + "target": "1upkeyboards/pi50/grid" + }, + "1upkeyboards/sweet16": { + "target": "1upkeyboards/sweet16/v1" + }, + "40percentclub/i75": { + "target": "40percentclub/i75/promicro" + }, + "40percentclub/polyandry": { + "target": "40percentclub/polyandry/promicro" + }, + "8pack": { + "target": "8pack/rev12" + }, + "adkb96": { + "target": "adkb96/rev1" + }, + "adm42": { + "target": "adm42/rev4" + }, + "aeboards/satellite": { + "target": "aeboards/satellite/rev1" + }, + "atreus": { + "target": "atreus/astar" + }, + "atreyu": { + "target": "atreyu/rev1" + }, + "binepad/bn009": { + "target": "binepad/bn009/r2" + }, + "binepad/bnr1": { + "target": "binepad/bnr1/v2" + }, + "boston_meetup": { + "target": "boston_meetup/2019" + }, + "bpiphany/frosty_flake": { + "target": "bpiphany/frosty_flake/20140521" + }, + "buzzard": { + "target": "buzzard/rev1" + }, + "clickety_split/leeloo": { + "target": "clickety_split/leeloo/rev3" + }, + "crkbd": { + "target": "crkbd/rev1" + }, + "dailycraft/bat43": { + "target": "dailycraft/bat43/rev2" + }, + "dailycraft/claw44": { + "target": "dailycraft/claw44/rev1" + }, + "dailycraft/sandbox": { + "target": "dailycraft/sandbox/rev2" + }, + "dailycraft/wings42": { + "target": "dailycraft/wings42/rev2" + }, + "delikeeb/vanana": { + "target": "delikeeb/vanana/rev2" + }, + "delikeeb/waaffle/rev3": { + "target": "delikeeb/waaffle/rev3/pro_micro" + }, + "deltasplit75": { + "target": "deltasplit75/v2" + }, + "duck/octagon": { + "target": "duck/octagon/v2" + }, + "duck/orion": { + "target": "duck/orion/v3" + }, + "ducky/one2mini": { + "target": "ducky/one2mini/1861st" + }, + "ducky/one2sf": { + "target": "ducky/one2sf/1967st" + }, + "dumbpad": { + "target": "dumbpad/v0x" + }, + "durgod/galaxy": { + "target": "durgod/dgk6x/galaxy" + }, + "durgod/venus": { + "target": "durgod/dgk6x/venus" + }, + "dztech/tofu/ii": { + "target": "dztech/tofu/ii/v1" + }, + "dztech/tofu/jr": { + "target": "dztech/tofu/jr/v1" + }, + "eco": { + "target": "eco/rev2" + }, + "ergoslab": { + "target": "ergoslab/rev1" + }, + "ergotravel": { + "target": "ergotravel/rev1" + }, + "evyd13/atom47": { + "target": "evyd13/atom47/rev4" + }, + "fortitude60": { + "target": "fortitude60/rev1" + }, + "fruitykeeb/fruitbar/r1": { + "target": "fruitykeeb/fruitbar/r1/promicro" + }, + "ghs/jem": { + "target": "ghs/jem/soldered" + }, + "hadron": { + "target": "hadron/ver2" + }, + "handwired/bento": { + "target": "handwired/bento/rev1" + }, + "handwired/dactyl_manuform/6x6": { + "target": "handwired/dactyl_manuform/6x6/promicro" + }, + "handwired/ms_sculpt_mobile": { + "target": "handwired/ms_sculpt_mobile/teensy2pp" + }, + "handwired/onekey": { + "target": "handwired/onekey/promicro" + }, + "handwired/pill60": { + "target": "handwired/pill60/bluepill" + }, + "handwired/postageboard": { + "target": "handwired/postageboard/mini" + }, + "handwired/qc60": { + "target": "handwired/qc60/proto" + }, + "handwired/sono1": { + "target": "handwired/sono1/t2pp" + }, + "handwired/splittest": { + "target": "handwired/splittest/promicro" + }, + "handwired/stef9998/split_5x7": { + "target": "handwired/stef9998/split_5x7/rev1" + }, + "handwired/symmetric70_proto/promicro": { + "target": "handwired/symmetric70_proto/promicro/base" + }, + "handwired/symmetric70_proto/proton_c": { + "target": "handwired/symmetric70_proto/proton_c/base" + }, + "handwired/unk": { + "target": "handwired/unk/rev1" + }, + "hillside/46": { + "target": "hillside/46/0_1" + }, + "hillside/48": { + "target": "hillside/48/0_1" + }, + "hillside/52": { + "target": "hillside/52/0_1" + }, + "ibnuda/squiggle": { + "target": "ibnuda/squiggle/rev1" + }, + "idobao/id80/v1": { + "target": "idobao/id80/v2/ansi" + }, + "idobao/id80/v3": { + "target": "idobao/id80/v3/ansi" + }, + "inett_studio/sq80": { + "target": "inett_studio/sq80/hotswap_layout_i" + }, + "jacky_studio/bear_65": { + "target": "jacky_studio/bear_65/rev1" + }, + "jadookb/jkb65": { + "target": "jadookb/jkb65/r1" + }, + "jian": { + "target": "jian/rev2" + }, + "jiran": { + "target": "jiran/rev1" + }, + "jorne": { + "target": "jorne/rev1" + }, + "junco": { + "target": "junco/rev1" + }, + "kakunpc/business_card": { + "target": "kakunpc/business_card/beta" + }, + "kakunpc/suihankey": { + "target": "kakunpc/suihankey/rev1" + }, + "kapcave/paladinpad": { + "target": "kapcave/paladinpad/rev2" + }, + "kapl": { + "target": "kapl/rev1" + }, + "kbdfans/d45": { + "target": "kbdfans/d45/v2" + }, + "kbdfans/kbd75": { + "target": "kbdfans/kbd75/rev1" + }, + "keebio/bdn9": { + "target": "keebio/bdn9/rev1" + }, + "keebio/convolution": { + "target": "keebio/convolution/rev1" + }, + "keebio/foldkb": { + "target": "keebio/foldkb/rev1" + }, + "keebio/kbo5000": { + "target": "keebio/kbo5000/rev1" + }, + "keebio/levinson": { + "target": "keebio/levinson/rev2" + }, + "keebio/quefrency": { + "target": "keebio/quefrency/rev1" + }, + "keebio/rorschach": { + "target": "keebio/rorschach/rev1" + }, + "keebio/sinc": { + "target": "keebio/sinc/rev1" + }, + "keebio/viterbi": { + "target": "keebio/viterbi/rev2" + }, + "keycapsss/kimiko": { + "target": "keycapsss/kimiko/rev2" + }, + "kin80": { + "target": "kin80/blackpill401" + }, + "kumaokobo/kudox_full": { + "target": "kumaokobo/kudox_full/rev1" + }, + "kumaokobo/kudox_game": { + "target": "kumaokobo/kudox_game/rev2" + }, + "kumaokobo/kudox": { + "target": "kumaokobo/kudox/rev3" + }, + "kumaokobo/pico": { + "target": "kumaokobo/pico/65keys" + }, + "lazydesigners/dimple": { + "target": "lazydesigners/dimple/staggered/rev1" + }, + "lets_split": { + "target": "lets_split/rev2" + }, + "lfkeyboards/lfk87": { + "target": "lfkeyboards/lfk78/revc" + }, + "lily58": { + "target": "lily58/rev1" + }, + "lime": { + "target": "lime/rev1" + }, + "maple_computing/ivy": { + "target": "maple_computing/ivy/rev1" + }, + "maple_computing/launchpad": { + "target": "maple_computing/launchpad/rev1" + }, + "maple_computing/minidox": { + "target": "maple_computing/minidox/rev1" + }, + "mariorion_v25": { + "target": "mariorion_v25/prod" + }, + "marksard/rhymestone": { + "target": "marksard/rhymestone/rev1" + }, + "marksard/treadstone48": { + "target": "marksard/treadstone48/rev1" + }, + "maxipad": { + "target": "maxipad/promicro" + }, + "mechkeys/mechmini": { + "target": "mechkeys/mechmini/v2" + }, + "mechllama/g35": { + "target": "mechllama/g35/v2" + }, + "mechlovin/adelais": { + "target": "mechlovin/adelais/standard_led/arm/rev2" + }, + "mechlovin/adelais/standard_led/arm/rev4": { + "target": "mechlovin/adelais/standard_led/arm/rev4/stm32f303" + }, + "mechlovin/adelais/standard_led/arm": { + "target": "mechlovin/adelais/standard_led/arm/rev2" + }, + "mechlovin/adelais/standard_led/avr": { + "target": "mechlovin/adelais/standard_led/avr/rev1" + }, + "mechlovin/infinity87/rev1": { + "target": "mechlovin/infinity87/rev1/standard" + }, + "mechlovin/infinity87": { + "target": "mechlovin/infinity87/rgb_rev1" + }, + "mechlovin/mechlovin9": { + "target": "mechlovin/mechlovin9/rev1" + }, + "mechlovin/olly/jf": { + "target": "mechlovin/olly/jf/rev1" + }, + "mechlovin/zed1800": { + "target": "mechlovin/zed1800/saber" + }, + "mechlovin/zed65/no_backlight": { + "target": "mechlovin/zed65/no_backlight/wearhaus66" + }, + "mechlovin/zed65": { + "target": "mechlovin/zed65/no_backlight/wearhaus66" + }, + "mechwild/bde": { + "target": "mechwild/bde/rev2" + }, + "mechwild/mokulua": { + "target": "mechwild/mokulua/standard" + }, + "mechwild/obe/f401": { + "target": "mechwild/obe/f401/base" + }, + "mechwild/obe/f411": { + "target": "mechwild/obe/f411/base" + }, + "mechwild/obe": { + "target": "mechwild/obe/f401/base" + }, + "mechwild/waka60/f401": { + "target": "mechwild/waka60/f401/base" + }, + "mechwild/waka60/f411": { + "target": "mechwild/waka60/f411/base" + }, + "mechwild/waka60": { + "target": "mechwild/waka60/f401/base" + }, + "murcielago": { + "target": "murcielago/rev1" + }, + "nullbitsco/scramble": { + "target": "nullbitsco/scramble/v2" + }, + "omkbd/ergodash": { + "target": "omkbd/ergodash/rev1" + }, + "omkbd/runner3680": { + "target": "omkbd/runner3680/5x8" + }, + "orthodox": { + "target": "orthodox/rev3" + }, + "peej/rosaline": { + "target": "peej/rosaline/staggered" + }, + "peej/tripel": { + "target": "peej/tripel/left" + }, + "peranekofactory/tone": { + "target": "peranekofactory/tone/rev2" + }, + "phase_studio/titan65": { + "target": "phase_studio/titan65/hotswap" + }, + "pica40": { + "target": "pica40/rev2" + }, + "pinky": { + "target": "pinky/3" + }, + "primekb/meridian": { + "target": "primekb/meridian/ktr1010" + }, + "primekb/prime_e": { + "target": "primekb/prime_e/std" + }, + "program_yoink": { + "target": "program_yoink/staggered" + }, + "projectcain/vault35": { + "target": "projectcain/vault35/atmega32u4" + }, + "qpockets/space_space": { + "target": "qpockets/space_space/rev2" + }, + "qwertyydox": { + "target": "qwertyydox/rev1" + }, + "redox/rev1": { + "target": "redox/rev1/base" + }, + "rgbkb/mun": { + "target": "rgbkb/mun/rev1" + }, + "rgbkb/sol3": { + "target": "rgbkb/sol3/rev1" + }, + "rgbkb/sol": { + "target": "rgbkb/sol/rev2" + }, + "rgbkb/zen": { + "target": "rgbkb/zen/rev2" + }, + "rgbkb/zygomorph": { + "target": "rgbkb/zygomorph/rev1" + }, + "rmi_kb/herringbone": { + "target": "rmi_kb/herringbone/v1" + }, + "rmi_kb/mona": { + "target": "rmi_kb/mona/v1_1" + }, + "rmi_kb/tkl_ff": { + "target": "rmi_kb/tkl_ff/v1" + }, + "rmi_kb/wete": { + "target": "rmi_kb/wete/v2" + }, + "rookiebwoy/late9": { + "target": "rookiebwoy/late9/rev1" + }, + "rookiebwoy/neopad": { + "target": "rookiebwoy/neopad/rev1" + }, + "rura66": { + "target": "rura66/rev1" + }, + "sawnsprojects/okayu": { + "target": "sawnsprojects/okayu/stm32f072" + }, + "smoll/lefty": { + "target": "smoll/lefty/rev2" + }, + "sofle": { + "target": "sofle/rev1" + }, + "spacetime": { + "target": "spacetime/rev1" + }, + "splitkb/aurora/corne": { + "target": "splitkb/aurora/corne/rev1" + }, + "splitkb/aurora/helix": { + "target": "splitkb/aurora/helix/rev1" + }, + "splitkb/aurora/lily58": { + "target": "splitkb/aurora/lily58/rev1" + }, + "splitkb/aurora/sofle_v2": { + "target": "splitkb/aurora/sofle_v2/rev1" + }, + "splitkb/aurora/sweep": { + "target": "splitkb/aurora/sweep/rev1" + }, + "splitkb/kyria/rev1": { + "target": "splitkb/kyria/rev1/base" + }, + "splitkb/kyria/rev2": { + "target": "splitkb/kyria/rev2/base" + }, + "splitty": { + "target": "splitty/rev1" + }, + "studiokestra/galatea": { + "target": "studiokestra/galatea/rev1" + }, + "takashiski/hecomi": { + "target": "takashiski/hecomi/alpha" + }, + "themadnoodle/noodlepad": { + "target": "themadnoodle/noodlepad/v1" + }, + "tkw/grandiceps": { + "target": "tkw/grandiceps/rev1" + }, + "tominabox1/littlefoot_lx": { + "target": "tominabox1/littlefoot_lx/rev1" + }, + "tominabox1/underscore33": { + "target": "tominabox1/underscore33/rev1" + }, + "trnthsn/e8ghty": { + "target": "trnthsn/e8ghty/stm32f103" + }, + "trnthsn/s6xty5neor2": { + "target": "trnthsn/s6xty5neor2/stm32f103" + }, + "tweetydabird/lotus58": { + "target": "tweetydabird/lotus58/promicro" + }, + "unison": { + "target": "unison/v04" + }, + "uzu42": { + "target": "uzu42/rev1" + }, + "vitamins_included": { + "target": "vitamins_included/rev2" + }, + "yanghu/unicorne": { + "target": "yanghu/unicorne/f411" + }, + "yosino58": { + "target": "yosino58/rev1" + }, + "yushakobo/navpad/10": { + "target": "yushakobo/navpad/10/rev1" + }, + "yynmt/acperience12": { + "target": "yynmt/acperience12/rev1" } } diff --git a/keyboards/0_sixty/rules.mk b/keyboards/0_sixty/rules.mk deleted file mode 100644 index a0d06a89dd..0000000000 --- a/keyboards/0_sixty/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 0_sixty/base diff --git a/keyboards/0xcb/splaytoraid/rules.mk b/keyboards/0xcb/splaytoraid/rules.mk deleted file mode 100644 index 65884dec4f..0000000000 --- a/keyboards/0xcb/splaytoraid/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 0xcb/splaytoraid/rp2040_ce diff --git a/keyboards/1upkeyboards/pi40/rules.mk b/keyboards/1upkeyboards/pi40/rules.mk deleted file mode 100644 index 48aea570e0..0000000000 --- a/keyboards/1upkeyboards/pi40/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 1upkeyboards/pi40/mit_v1_0 diff --git a/keyboards/1upkeyboards/pi50/rules.mk b/keyboards/1upkeyboards/pi50/rules.mk deleted file mode 100644 index a9660074af..0000000000 --- a/keyboards/1upkeyboards/pi50/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 1upkeyboards/pi50/grid diff --git a/keyboards/1upkeyboards/sweet16/rules.mk b/keyboards/1upkeyboards/sweet16/rules.mk deleted file mode 100644 index 7d269ac93f..0000000000 --- a/keyboards/1upkeyboards/sweet16/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 1upkeyboards/sweet16/v1 diff --git a/keyboards/40percentclub/i75/rules.mk b/keyboards/40percentclub/i75/rules.mk deleted file mode 100644 index 48b0427550..0000000000 --- a/keyboards/40percentclub/i75/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 40percentclub/i75/promicro diff --git a/keyboards/40percentclub/polyandry/rules.mk b/keyboards/40percentclub/polyandry/rules.mk deleted file mode 100644 index 3064c8202c..0000000000 --- a/keyboards/40percentclub/polyandry/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 40percentclub/polyandry/promicro diff --git a/keyboards/8pack/rules.mk b/keyboards/8pack/rules.mk deleted file mode 100644 index 81024a7119..0000000000 --- a/keyboards/8pack/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 8pack/rev12 diff --git a/keyboards/adkb96/rules.mk b/keyboards/adkb96/rules.mk deleted file mode 100644 index ac7561b21d..0000000000 --- a/keyboards/adkb96/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = adkb96/rev1 diff --git a/keyboards/adm42/rules.mk b/keyboards/adm42/rules.mk deleted file mode 100644 index 06fc88e9f6..0000000000 --- a/keyboards/adm42/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = adm42/rev4 \ No newline at end of file diff --git a/keyboards/aeboards/satellite/rules.mk b/keyboards/aeboards/satellite/rules.mk deleted file mode 100644 index bc32615d2b..0000000000 --- a/keyboards/aeboards/satellite/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = aeboards/satellite/rev1 diff --git a/keyboards/atreus/rules.mk b/keyboards/atreus/rules.mk deleted file mode 100644 index d933cb327d..0000000000 --- a/keyboards/atreus/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = atreus/astar diff --git a/keyboards/atreyu/rules.mk b/keyboards/atreyu/rules.mk deleted file mode 100644 index 4daffe6b9d..0000000000 --- a/keyboards/atreyu/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = atreyu/rev1 diff --git a/keyboards/binepad/bn009/rules.mk b/keyboards/binepad/bn009/rules.mk deleted file mode 100644 index 74214d60ed..0000000000 --- a/keyboards/binepad/bn009/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -# This file is mostly left blank - -DEFAULT_FOLDER = binepad/bn009/r2 diff --git a/keyboards/binepad/bnr1/rules.mk b/keyboards/binepad/bnr1/rules.mk deleted file mode 100755 index ce85c57404..0000000000 --- a/keyboards/binepad/bnr1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = binepad/bnr1/v2 diff --git a/keyboards/boston_meetup/rules.mk b/keyboards/boston_meetup/rules.mk deleted file mode 100644 index 6d6745a0e5..0000000000 --- a/keyboards/boston_meetup/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = boston_meetup/2019 diff --git a/keyboards/bpiphany/frosty_flake/rules.mk b/keyboards/bpiphany/frosty_flake/rules.mk deleted file mode 100644 index e5402b32f7..0000000000 --- a/keyboards/bpiphany/frosty_flake/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER=bpiphany/frosty_flake/20140521 diff --git a/keyboards/buzzard/rules.mk b/keyboards/buzzard/rules.mk deleted file mode 100644 index 2f66720b77..0000000000 --- a/keyboards/buzzard/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = buzzard/rev1 diff --git a/keyboards/clickety_split/leeloo/rules.mk b/keyboards/clickety_split/leeloo/rules.mk deleted file mode 100644 index 9d35960f7c..0000000000 --- a/keyboards/clickety_split/leeloo/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -# Default Folder -DEFAULT_FOLDER = clickety_split/leeloo/rev3 diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk deleted file mode 100644 index 836587e45e..0000000000 --- a/keyboards/crkbd/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = crkbd/rev1 diff --git a/keyboards/dailycraft/bat43/rules.mk b/keyboards/dailycraft/bat43/rules.mk deleted file mode 100644 index b152851948..0000000000 --- a/keyboards/dailycraft/bat43/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dailycraft/bat43/rev2 diff --git a/keyboards/dailycraft/claw44/rules.mk b/keyboards/dailycraft/claw44/rules.mk deleted file mode 100644 index 0344b3ee28..0000000000 --- a/keyboards/dailycraft/claw44/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dailycraft/claw44/rev1 diff --git a/keyboards/dailycraft/sandbox/rules.mk b/keyboards/dailycraft/sandbox/rules.mk deleted file mode 100644 index c62f01e18f..0000000000 --- a/keyboards/dailycraft/sandbox/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dailycraft/sandbox/rev2 diff --git a/keyboards/dailycraft/wings42/rules.mk b/keyboards/dailycraft/wings42/rules.mk deleted file mode 100644 index b027fec9b9..0000000000 --- a/keyboards/dailycraft/wings42/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dailycraft/wings42/rev2 diff --git a/keyboards/delikeeb/vanana/rules.mk b/keyboards/delikeeb/vanana/rules.mk deleted file mode 100644 index ff3dc1df61..0000000000 --- a/keyboards/delikeeb/vanana/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = delikeeb/vanana/rev2 diff --git a/keyboards/delikeeb/waaffle/rev3/rules.mk b/keyboards/delikeeb/waaffle/rev3/rules.mk deleted file mode 100644 index dbd58ca5bf..0000000000 --- a/keyboards/delikeeb/waaffle/rev3/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = delikeeb/waaffle/rev3/pro_micro diff --git a/keyboards/deltasplit75/rules.mk b/keyboards/deltasplit75/rules.mk deleted file mode 100644 index ee888337e5..0000000000 --- a/keyboards/deltasplit75/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = deltasplit75/v2 diff --git a/keyboards/duck/octagon/rules.mk b/keyboards/duck/octagon/rules.mk deleted file mode 100644 index 46bd457bb7..0000000000 --- a/keyboards/duck/octagon/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = duck/octagon/v2 \ No newline at end of file diff --git a/keyboards/duck/orion/rules.mk b/keyboards/duck/orion/rules.mk deleted file mode 100644 index 3788e0fbfb..0000000000 --- a/keyboards/duck/orion/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = duck/orion/v3 diff --git a/keyboards/ducky/one2mini/rules.mk b/keyboards/ducky/one2mini/rules.mk deleted file mode 100644 index 628be832ee..0000000000 --- a/keyboards/ducky/one2mini/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ducky/one2mini/1861st diff --git a/keyboards/ducky/one2sf/rules.mk b/keyboards/ducky/one2sf/rules.mk deleted file mode 100644 index 0c9ddb957f..0000000000 --- a/keyboards/ducky/one2sf/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ducky/one2sf/1967st diff --git a/keyboards/dumbpad/rules.mk b/keyboards/dumbpad/rules.mk deleted file mode 100644 index 87ec1ab01b..0000000000 --- a/keyboards/dumbpad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dumbpad/v0x diff --git a/keyboards/durgod/galaxy/rules.mk b/keyboards/durgod/galaxy/rules.mk deleted file mode 100644 index ff1e1ff205..0000000000 --- a/keyboards/durgod/galaxy/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER=durgod/dgk6x/galaxy diff --git a/keyboards/durgod/venus/rules.mk b/keyboards/durgod/venus/rules.mk deleted file mode 100644 index 57acf2a48c..0000000000 --- a/keyboards/durgod/venus/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER=durgod/dgk6x/venus diff --git a/keyboards/dztech/tofu/ii/rules.mk b/keyboards/dztech/tofu/ii/rules.mk deleted file mode 100644 index c08cfdaae9..0000000000 --- a/keyboards/dztech/tofu/ii/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dztech/tofu/ii/v1 diff --git a/keyboards/dztech/tofu/jr/rules.mk b/keyboards/dztech/tofu/jr/rules.mk deleted file mode 100644 index 7333c613fd..0000000000 --- a/keyboards/dztech/tofu/jr/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = dztech/tofu/jr/v1 diff --git a/keyboards/eco/rules.mk b/keyboards/eco/rules.mk deleted file mode 100644 index a3d419658b..0000000000 --- a/keyboards/eco/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = eco/rev2 diff --git a/keyboards/ergoslab/rules.mk b/keyboards/ergoslab/rules.mk deleted file mode 100644 index 8eb40c77d5..0000000000 --- a/keyboards/ergoslab/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ergoslab/rev1 diff --git a/keyboards/ergotravel/rules.mk b/keyboards/ergotravel/rules.mk deleted file mode 100644 index 3f30277bb5..0000000000 --- a/keyboards/ergotravel/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ergotravel/rev1 diff --git a/keyboards/evyd13/atom47/rules.mk b/keyboards/evyd13/atom47/rules.mk deleted file mode 100644 index 9d5b753077..0000000000 --- a/keyboards/evyd13/atom47/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = evyd13/atom47/rev4 diff --git a/keyboards/fortitude60/rules.mk b/keyboards/fortitude60/rules.mk deleted file mode 100644 index ef158b8cf0..0000000000 --- a/keyboards/fortitude60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = fortitude60/rev1 diff --git a/keyboards/fruitykeeb/fruitbar/r1/rules.mk b/keyboards/fruitykeeb/fruitbar/r1/rules.mk deleted file mode 100644 index 3328de6095..0000000000 --- a/keyboards/fruitykeeb/fruitbar/r1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = fruitykeeb/fruitbar/r1/promicro diff --git a/keyboards/ghs/jem/rules.mk b/keyboards/ghs/jem/rules.mk deleted file mode 100644 index e96c00e5c0..0000000000 --- a/keyboards/ghs/jem/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ghs/jem/soldered diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk deleted file mode 100644 index 8498675750..0000000000 --- a/keyboards/hadron/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = hadron/ver2 diff --git a/keyboards/handwired/bento/rules.mk b/keyboards/handwired/bento/rules.mk deleted file mode 100644 index e160faab83..0000000000 --- a/keyboards/handwired/bento/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/bento/rev1 diff --git a/keyboards/handwired/dactyl_manuform/6x6/rules.mk b/keyboards/handwired/dactyl_manuform/6x6/rules.mk deleted file mode 100644 index 29194b429e..0000000000 --- a/keyboards/handwired/dactyl_manuform/6x6/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/dactyl_manuform/6x6/promicro diff --git a/keyboards/handwired/ms_sculpt_mobile/rules.mk b/keyboards/handwired/ms_sculpt_mobile/rules.mk deleted file mode 100644 index 8a3cc6858c..0000000000 --- a/keyboards/handwired/ms_sculpt_mobile/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/ms_sculpt_mobile/teensy2pp diff --git a/keyboards/handwired/onekey/rules.mk b/keyboards/handwired/onekey/rules.mk deleted file mode 100644 index 2094801ed9..0000000000 --- a/keyboards/handwired/onekey/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/onekey/promicro diff --git a/keyboards/handwired/pill60/rules.mk b/keyboards/handwired/pill60/rules.mk deleted file mode 100644 index 9299a64d61..0000000000 --- a/keyboards/handwired/pill60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/pill60/bluepill diff --git a/keyboards/handwired/postageboard/rules.mk b/keyboards/handwired/postageboard/rules.mk deleted file mode 100644 index a7fcf6bea6..0000000000 --- a/keyboards/handwired/postageboard/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER=handwired/postageboard/mini diff --git a/keyboards/handwired/qc60/rules.mk b/keyboards/handwired/qc60/rules.mk deleted file mode 100644 index 4905848cf9..0000000000 --- a/keyboards/handwired/qc60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/qc60/proto diff --git a/keyboards/handwired/sono1/rules.mk b/keyboards/handwired/sono1/rules.mk deleted file mode 100644 index 9b472f28f2..0000000000 --- a/keyboards/handwired/sono1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/sono1/t2pp diff --git a/keyboards/handwired/splittest/rules.mk b/keyboards/handwired/splittest/rules.mk deleted file mode 100644 index ae4d823b53..0000000000 --- a/keyboards/handwired/splittest/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/splittest/promicro diff --git a/keyboards/handwired/stef9998/split_5x7/rules.mk b/keyboards/handwired/stef9998/split_5x7/rules.mk deleted file mode 100644 index f06c490f00..0000000000 --- a/keyboards/handwired/stef9998/split_5x7/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/stef9998/split_5x7/rev1 diff --git a/keyboards/handwired/symmetric70_proto/promicro/rules.mk b/keyboards/handwired/symmetric70_proto/promicro/rules.mk deleted file mode 100644 index 7aa985b3f1..0000000000 --- a/keyboards/handwired/symmetric70_proto/promicro/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/symmetric70_proto/promicro/base diff --git a/keyboards/handwired/symmetric70_proto/proton_c/rules.mk b/keyboards/handwired/symmetric70_proto/proton_c/rules.mk deleted file mode 100644 index 28c4536e4b..0000000000 --- a/keyboards/handwired/symmetric70_proto/proton_c/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/symmetric70_proto/proton_c/base diff --git a/keyboards/handwired/unk/rules.mk b/keyboards/handwired/unk/rules.mk deleted file mode 100644 index d4536e0cbb..0000000000 --- a/keyboards/handwired/unk/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = handwired/unk/rev1 diff --git a/keyboards/hillside/46/rules.mk b/keyboards/hillside/46/rules.mk deleted file mode 100644 index f3e926a8dc..0000000000 --- a/keyboards/hillside/46/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = hillside/46/0_1 \ No newline at end of file diff --git a/keyboards/hillside/48/rules.mk b/keyboards/hillside/48/rules.mk deleted file mode 100644 index d8d69d9ec1..0000000000 --- a/keyboards/hillside/48/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = hillside/48/0_1 diff --git a/keyboards/hillside/52/rules.mk b/keyboards/hillside/52/rules.mk deleted file mode 100644 index 402bc6bb95..0000000000 --- a/keyboards/hillside/52/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = hillside/52/0_1 diff --git a/keyboards/ibnuda/squiggle/rules.mk b/keyboards/ibnuda/squiggle/rules.mk deleted file mode 100644 index 0214333999..0000000000 --- a/keyboards/ibnuda/squiggle/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ibnuda/squiggle/rev1 diff --git a/keyboards/idobao/id80/v1/rules.mk b/keyboards/idobao/id80/v1/rules.mk deleted file mode 100644 index 20283f04be..0000000000 --- a/keyboards/idobao/id80/v1/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -# Defalt to the ansi version -DEFAULT_FOLDER = idobao/id80/v2/ansi diff --git a/keyboards/idobao/id80/v3/rules.mk b/keyboards/idobao/id80/v3/rules.mk deleted file mode 100644 index 218fc05539..0000000000 --- a/keyboards/idobao/id80/v3/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -# Defalt to the ansi version -DEFAULT_FOLDER = idobao/id80/v3/ansi diff --git a/keyboards/inett_studio/sq80/rules.mk b/keyboards/inett_studio/sq80/rules.mk deleted file mode 100644 index d4f8260d93..0000000000 --- a/keyboards/inett_studio/sq80/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = inett_studio/sq80/hotswap_layout_i diff --git a/keyboards/jacky_studio/bear_65/rules.mk b/keyboards/jacky_studio/bear_65/rules.mk deleted file mode 100644 index 91bb6f74b9..0000000000 --- a/keyboards/jacky_studio/bear_65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jacky_studio/bear_65/rev1 diff --git a/keyboards/jadookb/jkb65/rules.mk b/keyboards/jadookb/jkb65/rules.mk deleted file mode 100644 index 2bbb2a41ce..0000000000 --- a/keyboards/jadookb/jkb65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jadookb/jkb65/r1 diff --git a/keyboards/jian/rules.mk b/keyboards/jian/rules.mk deleted file mode 100644 index c19fa00b5c..0000000000 --- a/keyboards/jian/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jian/rev2 diff --git a/keyboards/jiran/rules.mk b/keyboards/jiran/rules.mk deleted file mode 100644 index 3ffe13302d..0000000000 --- a/keyboards/jiran/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jiran/rev1 diff --git a/keyboards/jorne/rules.mk b/keyboards/jorne/rules.mk deleted file mode 100644 index c43649b348..0000000000 --- a/keyboards/jorne/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jorne/rev1 diff --git a/keyboards/junco/rules.mk b/keyboards/junco/rules.mk deleted file mode 100644 index bb94741e5a..0000000000 --- a/keyboards/junco/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = junco/rev1 diff --git a/keyboards/kakunpc/business_card/rules.mk b/keyboards/kakunpc/business_card/rules.mk deleted file mode 100644 index 4525d52332..0000000000 --- a/keyboards/kakunpc/business_card/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kakunpc/business_card/beta diff --git a/keyboards/kakunpc/suihankey/rules.mk b/keyboards/kakunpc/suihankey/rules.mk deleted file mode 100644 index 46a0114bd5..0000000000 --- a/keyboards/kakunpc/suihankey/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kakunpc/suihankey/rev1 diff --git a/keyboards/kapcave/paladinpad/rules.mk b/keyboards/kapcave/paladinpad/rules.mk deleted file mode 100644 index 02685414e3..0000000000 --- a/keyboards/kapcave/paladinpad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kapcave/paladinpad/rev2 diff --git a/keyboards/kapl/rules.mk b/keyboards/kapl/rules.mk deleted file mode 100644 index a5dd22ce1c..0000000000 --- a/keyboards/kapl/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kapl/rev1 diff --git a/keyboards/kbdfans/d45/rules.mk b/keyboards/kbdfans/d45/rules.mk deleted file mode 100644 index 041e632f65..0000000000 --- a/keyboards/kbdfans/d45/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kbdfans/d45/v2 diff --git a/keyboards/kbdfans/kbd75/rules.mk b/keyboards/kbdfans/kbd75/rules.mk deleted file mode 100644 index 5c46171316..0000000000 --- a/keyboards/kbdfans/kbd75/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kbdfans/kbd75/rev1 diff --git a/keyboards/keebio/bdn9/rules.mk b/keyboards/keebio/bdn9/rules.mk deleted file mode 100644 index 431a8ad027..0000000000 --- a/keyboards/keebio/bdn9/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/bdn9/rev1 diff --git a/keyboards/keebio/convolution/rules.mk b/keyboards/keebio/convolution/rules.mk deleted file mode 100644 index 9df8bd1c47..0000000000 --- a/keyboards/keebio/convolution/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/convolution/rev1 diff --git a/keyboards/keebio/foldkb/rules.mk b/keyboards/keebio/foldkb/rules.mk deleted file mode 100644 index 6a0522a902..0000000000 --- a/keyboards/keebio/foldkb/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/foldkb/rev1 diff --git a/keyboards/keebio/kbo5000/rules.mk b/keyboards/keebio/kbo5000/rules.mk deleted file mode 100644 index 06d2f2f412..0000000000 --- a/keyboards/keebio/kbo5000/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/kbo5000/rev1 diff --git a/keyboards/keebio/levinson/rules.mk b/keyboards/keebio/levinson/rules.mk deleted file mode 100644 index 44cdce9d12..0000000000 --- a/keyboards/keebio/levinson/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/levinson/rev2 diff --git a/keyboards/keebio/quefrency/rules.mk b/keyboards/keebio/quefrency/rules.mk deleted file mode 100644 index fb40fc8a56..0000000000 --- a/keyboards/keebio/quefrency/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/quefrency/rev1 diff --git a/keyboards/keebio/rorschach/rules.mk b/keyboards/keebio/rorschach/rules.mk deleted file mode 100644 index 6cdac68a4e..0000000000 --- a/keyboards/keebio/rorschach/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/rorschach/rev1 diff --git a/keyboards/keebio/sinc/rules.mk b/keyboards/keebio/sinc/rules.mk deleted file mode 100644 index 1419957479..0000000000 --- a/keyboards/keebio/sinc/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/sinc/rev1 diff --git a/keyboards/keebio/viterbi/rules.mk b/keyboards/keebio/viterbi/rules.mk deleted file mode 100644 index ecf6a3fa87..0000000000 --- a/keyboards/keebio/viterbi/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keebio/viterbi/rev2 diff --git a/keyboards/keycapsss/kimiko/rules.mk b/keyboards/keycapsss/kimiko/rules.mk deleted file mode 100644 index cb9f69d6bb..0000000000 --- a/keyboards/keycapsss/kimiko/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keycapsss/kimiko/rev2 diff --git a/keyboards/kin80/rules.mk b/keyboards/kin80/rules.mk deleted file mode 100644 index b264c9cfc5..0000000000 --- a/keyboards/kin80/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kin80/blackpill401 diff --git a/keyboards/kumaokobo/kudox/rules.mk b/keyboards/kumaokobo/kudox/rules.mk deleted file mode 100644 index 16c27e7c3b..0000000000 --- a/keyboards/kumaokobo/kudox/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kumaokobo/kudox/rev3 diff --git a/keyboards/kumaokobo/kudox_full/rules.mk b/keyboards/kumaokobo/kudox_full/rules.mk deleted file mode 100644 index c912dcd2e5..0000000000 --- a/keyboards/kumaokobo/kudox_full/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kumaokobo/kudox_full/rev1 diff --git a/keyboards/kumaokobo/kudox_game/rules.mk b/keyboards/kumaokobo/kudox_game/rules.mk deleted file mode 100644 index 28918ca489..0000000000 --- a/keyboards/kumaokobo/kudox_game/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kumaokobo/kudox_game/rev2 diff --git a/keyboards/kumaokobo/pico/rules.mk b/keyboards/kumaokobo/pico/rules.mk deleted file mode 100644 index df859afa0f..0000000000 --- a/keyboards/kumaokobo/pico/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kumaokobo/pico/65keys diff --git a/keyboards/lazydesigners/dimple/rules.mk b/keyboards/lazydesigners/dimple/rules.mk deleted file mode 100644 index cd05623d84..0000000000 --- a/keyboards/lazydesigners/dimple/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lazydesigners/dimple/staggered/rev1 diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk deleted file mode 100644 index 0fb6d36204..0000000000 --- a/keyboards/lets_split/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lets_split/rev2 diff --git a/keyboards/lfkeyboards/lfk87/rules.mk b/keyboards/lfkeyboards/lfk87/rules.mk deleted file mode 100644 index 05b80ac74a..0000000000 --- a/keyboards/lfkeyboards/lfk87/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lfkeyboards/lfk78/revc diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk deleted file mode 100644 index a63bd42ad3..0000000000 --- a/keyboards/lily58/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lily58/rev1 diff --git a/keyboards/lime/rules.mk b/keyboards/lime/rules.mk deleted file mode 100644 index 4643abab93..0000000000 --- a/keyboards/lime/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = lime/rev1 diff --git a/keyboards/maple_computing/ivy/rules.mk b/keyboards/maple_computing/ivy/rules.mk deleted file mode 100644 index 2665d44abd..0000000000 --- a/keyboards/maple_computing/ivy/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = maple_computing/ivy/rev1 diff --git a/keyboards/maple_computing/launchpad/rules.mk b/keyboards/maple_computing/launchpad/rules.mk deleted file mode 100644 index 8c35a608a6..0000000000 --- a/keyboards/maple_computing/launchpad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = maple_computing/launchpad/rev1 diff --git a/keyboards/maple_computing/minidox/rules.mk b/keyboards/maple_computing/minidox/rules.mk deleted file mode 100644 index d5a7f49e40..0000000000 --- a/keyboards/maple_computing/minidox/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = maple_computing/minidox/rev1 diff --git a/keyboards/mariorion_v25/rules.mk b/keyboards/mariorion_v25/rules.mk deleted file mode 100644 index f0bfa47284..0000000000 --- a/keyboards/mariorion_v25/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mariorion_v25/prod diff --git a/keyboards/marksard/rhymestone/rules.mk b/keyboards/marksard/rhymestone/rules.mk deleted file mode 100644 index 1833888708..0000000000 --- a/keyboards/marksard/rhymestone/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = marksard/rhymestone/rev1 diff --git a/keyboards/marksard/treadstone48/rules.mk b/keyboards/marksard/treadstone48/rules.mk deleted file mode 100644 index 23865d27e6..0000000000 --- a/keyboards/marksard/treadstone48/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = marksard/treadstone48/rev1 diff --git a/keyboards/maxipad/rules.mk b/keyboards/maxipad/rules.mk deleted file mode 100644 index 98a712a7b8..0000000000 --- a/keyboards/maxipad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = maxipad/promicro diff --git a/keyboards/mechkeys/mechmini/rules.mk b/keyboards/mechkeys/mechmini/rules.mk deleted file mode 100644 index 9d63d875eb..0000000000 --- a/keyboards/mechkeys/mechmini/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechkeys/mechmini/v2 diff --git a/keyboards/mechllama/g35/rules.mk b/keyboards/mechllama/g35/rules.mk deleted file mode 100644 index 36acf8d17f..0000000000 --- a/keyboards/mechllama/g35/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechllama/g35/v2 diff --git a/keyboards/mechlovin/adelais/rules.mk b/keyboards/mechlovin/adelais/rules.mk deleted file mode 100644 index a1d2ba038d..0000000000 --- a/keyboards/mechlovin/adelais/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/adelais/standard_led/arm/rev2 diff --git a/keyboards/mechlovin/adelais/standard_led/arm/rev4/rules.mk b/keyboards/mechlovin/adelais/standard_led/arm/rev4/rules.mk deleted file mode 100644 index d348ae660f..0000000000 --- a/keyboards/mechlovin/adelais/standard_led/arm/rev4/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/adelais/standard_led/arm/rev4/stm32f303 diff --git a/keyboards/mechlovin/adelais/standard_led/arm/rules.mk b/keyboards/mechlovin/adelais/standard_led/arm/rules.mk deleted file mode 100644 index 16a636a342..0000000000 --- a/keyboards/mechlovin/adelais/standard_led/arm/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/adelais/standard_led/arm/rev2 \ No newline at end of file diff --git a/keyboards/mechlovin/adelais/standard_led/avr/rules.mk b/keyboards/mechlovin/adelais/standard_led/avr/rules.mk deleted file mode 100644 index f33198890d..0000000000 --- a/keyboards/mechlovin/adelais/standard_led/avr/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ - -DEFAULT_FOLDER = mechlovin/adelais/standard_led/avr/rev1 \ No newline at end of file diff --git a/keyboards/mechlovin/infinity87/rev1/rules.mk b/keyboards/mechlovin/infinity87/rev1/rules.mk deleted file mode 100644 index 101153f240..0000000000 --- a/keyboards/mechlovin/infinity87/rev1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/infinity87/rev1/standard diff --git a/keyboards/mechlovin/infinity87/rules.mk b/keyboards/mechlovin/infinity87/rules.mk deleted file mode 100644 index 4aa072cae7..0000000000 --- a/keyboards/mechlovin/infinity87/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/infinity87/rgb_rev1 diff --git a/keyboards/mechlovin/mechlovin9/rules.mk b/keyboards/mechlovin/mechlovin9/rules.mk deleted file mode 100644 index 79de7c7d31..0000000000 --- a/keyboards/mechlovin/mechlovin9/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/mechlovin9/rev1 diff --git a/keyboards/mechlovin/olly/jf/rules.mk b/keyboards/mechlovin/olly/jf/rules.mk deleted file mode 100644 index fa0eceeb8a..0000000000 --- a/keyboards/mechlovin/olly/jf/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/olly/jf/rev1 diff --git a/keyboards/mechlovin/zed1800/rules.mk b/keyboards/mechlovin/zed1800/rules.mk deleted file mode 100644 index e0088c95c3..0000000000 --- a/keyboards/mechlovin/zed1800/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/zed1800/saber diff --git a/keyboards/mechlovin/zed65/no_backlight/rules.mk b/keyboards/mechlovin/zed65/no_backlight/rules.mk deleted file mode 100644 index a699765498..0000000000 --- a/keyboards/mechlovin/zed65/no_backlight/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/zed65/no_backlight/wearhaus66 diff --git a/keyboards/mechlovin/zed65/rules.mk b/keyboards/mechlovin/zed65/rules.mk deleted file mode 100644 index a699765498..0000000000 --- a/keyboards/mechlovin/zed65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/zed65/no_backlight/wearhaus66 diff --git a/keyboards/mechwild/bde/rules.mk b/keyboards/mechwild/bde/rules.mk deleted file mode 100644 index 138a291916..0000000000 --- a/keyboards/mechwild/bde/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/bde/rev2 diff --git a/keyboards/mechwild/mokulua/rules.mk b/keyboards/mechwild/mokulua/rules.mk deleted file mode 100644 index 3a87a143e5..0000000000 --- a/keyboards/mechwild/mokulua/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/mokulua/standard \ No newline at end of file diff --git a/keyboards/mechwild/obe/f401/rules.mk b/keyboards/mechwild/obe/f401/rules.mk deleted file mode 100644 index 8709dbb4de..0000000000 --- a/keyboards/mechwild/obe/f401/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/obe/f401/base diff --git a/keyboards/mechwild/obe/f411/rules.mk b/keyboards/mechwild/obe/f411/rules.mk deleted file mode 100644 index e24fe60509..0000000000 --- a/keyboards/mechwild/obe/f411/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/obe/f411/base diff --git a/keyboards/mechwild/obe/rules.mk b/keyboards/mechwild/obe/rules.mk deleted file mode 100644 index 8709dbb4de..0000000000 --- a/keyboards/mechwild/obe/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/obe/f401/base diff --git a/keyboards/mechwild/waka60/f401/rules.mk b/keyboards/mechwild/waka60/f401/rules.mk deleted file mode 100644 index a0d74c14eb..0000000000 --- a/keyboards/mechwild/waka60/f401/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/waka60/f401/base diff --git a/keyboards/mechwild/waka60/f411/rules.mk b/keyboards/mechwild/waka60/f411/rules.mk deleted file mode 100644 index 0dd69ff65f..0000000000 --- a/keyboards/mechwild/waka60/f411/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/waka60/f411/base diff --git a/keyboards/mechwild/waka60/rules.mk b/keyboards/mechwild/waka60/rules.mk deleted file mode 100644 index a0d74c14eb..0000000000 --- a/keyboards/mechwild/waka60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechwild/waka60/f401/base diff --git a/keyboards/murcielago/rules.mk b/keyboards/murcielago/rules.mk deleted file mode 100644 index 661563697a..0000000000 --- a/keyboards/murcielago/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = murcielago/rev1 \ No newline at end of file diff --git a/keyboards/nullbitsco/scramble/rules.mk b/keyboards/nullbitsco/scramble/rules.mk deleted file mode 100644 index 5753f7786d..0000000000 --- a/keyboards/nullbitsco/scramble/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = nullbitsco/scramble/v2 diff --git a/keyboards/omkbd/ergodash/rules.mk b/keyboards/omkbd/ergodash/rules.mk deleted file mode 100644 index 492cdde65d..0000000000 --- a/keyboards/omkbd/ergodash/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = omkbd/ergodash/rev1 diff --git a/keyboards/omkbd/runner3680/rules.mk b/keyboards/omkbd/runner3680/rules.mk deleted file mode 100644 index 3460ad8964..0000000000 --- a/keyboards/omkbd/runner3680/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = omkbd/runner3680/5x8 diff --git a/keyboards/orthodox/rules.mk b/keyboards/orthodox/rules.mk deleted file mode 100644 index fd71b6c8fb..0000000000 --- a/keyboards/orthodox/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = orthodox/rev3 diff --git a/keyboards/peej/rosaline/rules.mk b/keyboards/peej/rosaline/rules.mk deleted file mode 100644 index 928164362a..0000000000 --- a/keyboards/peej/rosaline/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = peej/rosaline/staggered diff --git a/keyboards/peej/tripel/rules.mk b/keyboards/peej/tripel/rules.mk deleted file mode 100644 index 8d89700456..0000000000 --- a/keyboards/peej/tripel/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = peej/tripel/left diff --git a/keyboards/peranekofactory/tone/rules.mk b/keyboards/peranekofactory/tone/rules.mk deleted file mode 100644 index e87862a9f6..0000000000 --- a/keyboards/peranekofactory/tone/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = peranekofactory/tone/rev2 diff --git a/keyboards/phase_studio/titan65/rules.mk b/keyboards/phase_studio/titan65/rules.mk deleted file mode 100644 index d55ca35d7a..0000000000 --- a/keyboards/phase_studio/titan65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = phase_studio/titan65/hotswap diff --git a/keyboards/pica40/rules.mk b/keyboards/pica40/rules.mk deleted file mode 100644 index 9670889712..0000000000 --- a/keyboards/pica40/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = pica40/rev2 diff --git a/keyboards/pinky/rules.mk b/keyboards/pinky/rules.mk deleted file mode 100644 index 89b708f68f..0000000000 --- a/keyboards/pinky/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = pinky/3 diff --git a/keyboards/primekb/meridian/rules.mk b/keyboards/primekb/meridian/rules.mk deleted file mode 100644 index 585a04ad28..0000000000 --- a/keyboards/primekb/meridian/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = primekb/meridian/ktr1010 diff --git a/keyboards/primekb/prime_e/rules.mk b/keyboards/primekb/prime_e/rules.mk deleted file mode 100644 index debb966e0d..0000000000 --- a/keyboards/primekb/prime_e/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = primekb/prime_e/std diff --git a/keyboards/program_yoink/rules.mk b/keyboards/program_yoink/rules.mk deleted file mode 100644 index a7cc1a2dbf..0000000000 --- a/keyboards/program_yoink/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = program_yoink/staggered diff --git a/keyboards/projectcain/vault35/rules.mk b/keyboards/projectcain/vault35/rules.mk deleted file mode 100644 index 3cf3a331d8..0000000000 --- a/keyboards/projectcain/vault35/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = projectcain/vault35/atmega32u4 diff --git a/keyboards/qpockets/space_space/rules.mk b/keyboards/qpockets/space_space/rules.mk deleted file mode 100644 index 0ffe2efbf2..0000000000 --- a/keyboards/qpockets/space_space/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = qpockets/space_space/rev2 diff --git a/keyboards/qwertyydox/rules.mk b/keyboards/qwertyydox/rules.mk deleted file mode 100644 index 688444b566..0000000000 --- a/keyboards/qwertyydox/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = qwertyydox/rev1 diff --git a/keyboards/redox/rev1/rules.mk b/keyboards/redox/rev1/rules.mk deleted file mode 100644 index c971da1680..0000000000 --- a/keyboards/redox/rev1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = redox/rev1/base diff --git a/keyboards/rgbkb/mun/rules.mk b/keyboards/rgbkb/mun/rules.mk deleted file mode 100644 index 317c4d5a87..0000000000 --- a/keyboards/rgbkb/mun/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rgbkb/mun/rev1 diff --git a/keyboards/rgbkb/sol/rules.mk b/keyboards/rgbkb/sol/rules.mk deleted file mode 100644 index f8325017f9..0000000000 --- a/keyboards/rgbkb/sol/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rgbkb/sol/rev2 diff --git a/keyboards/rgbkb/sol3/rules.mk b/keyboards/rgbkb/sol3/rules.mk deleted file mode 100644 index 74804682a2..0000000000 --- a/keyboards/rgbkb/sol3/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rgbkb/sol3/rev1 diff --git a/keyboards/rgbkb/zen/rules.mk b/keyboards/rgbkb/zen/rules.mk deleted file mode 100644 index ee94832d4d..0000000000 --- a/keyboards/rgbkb/zen/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rgbkb/zen/rev2 diff --git a/keyboards/rgbkb/zygomorph/rules.mk b/keyboards/rgbkb/zygomorph/rules.mk deleted file mode 100644 index 8544e8767d..0000000000 --- a/keyboards/rgbkb/zygomorph/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rgbkb/zygomorph/rev1 diff --git a/keyboards/rmi_kb/herringbone/rules.mk b/keyboards/rmi_kb/herringbone/rules.mk deleted file mode 100644 index 1efe9fa4f5..0000000000 --- a/keyboards/rmi_kb/herringbone/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rmi_kb/herringbone/v1 diff --git a/keyboards/rmi_kb/mona/rules.mk b/keyboards/rmi_kb/mona/rules.mk deleted file mode 100644 index 54aa705d96..0000000000 --- a/keyboards/rmi_kb/mona/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rmi_kb/mona/v1_1 diff --git a/keyboards/rmi_kb/tkl_ff/rules.mk b/keyboards/rmi_kb/tkl_ff/rules.mk deleted file mode 100644 index c8847cc266..0000000000 --- a/keyboards/rmi_kb/tkl_ff/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rmi_kb/tkl_ff/v1 diff --git a/keyboards/rmi_kb/wete/rules.mk b/keyboards/rmi_kb/wete/rules.mk deleted file mode 100644 index cda6fbfbe4..0000000000 --- a/keyboards/rmi_kb/wete/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rmi_kb/wete/v2 diff --git a/keyboards/rookiebwoy/late9/rules.mk b/keyboards/rookiebwoy/late9/rules.mk deleted file mode 100755 index 358facb3ca..0000000000 --- a/keyboards/rookiebwoy/late9/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rookiebwoy/late9/rev1 diff --git a/keyboards/rookiebwoy/neopad/rules.mk b/keyboards/rookiebwoy/neopad/rules.mk deleted file mode 100755 index c34c04435e..0000000000 --- a/keyboards/rookiebwoy/neopad/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rookiebwoy/neopad/rev1 diff --git a/keyboards/rura66/rules.mk b/keyboards/rura66/rules.mk deleted file mode 100644 index 556ec17655..0000000000 --- a/keyboards/rura66/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rura66/rev1 diff --git a/keyboards/sawnsprojects/okayu/rules.mk b/keyboards/sawnsprojects/okayu/rules.mk deleted file mode 100644 index 59655554eb..0000000000 --- a/keyboards/sawnsprojects/okayu/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = sawnsprojects/okayu/stm32f072 \ No newline at end of file diff --git a/keyboards/smoll/lefty/rules.mk b/keyboards/smoll/lefty/rules.mk deleted file mode 100644 index 6bc5abbdc5..0000000000 --- a/keyboards/smoll/lefty/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = smoll/lefty/rev2 diff --git a/keyboards/sofle/rules.mk b/keyboards/sofle/rules.mk deleted file mode 100644 index a7307c3499..0000000000 --- a/keyboards/sofle/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = sofle/rev1 diff --git a/keyboards/spacetime/rules.mk b/keyboards/spacetime/rules.mk deleted file mode 100644 index ac339c2cef..0000000000 --- a/keyboards/spacetime/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = spacetime/rev1 diff --git a/keyboards/splitkb/aurora/corne/rules.mk b/keyboards/splitkb/aurora/corne/rules.mk deleted file mode 100644 index 9b4b90e972..0000000000 --- a/keyboards/splitkb/aurora/corne/rules.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2022 splitkb.com -# -# 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 . - -DEFAULT_FOLDER = splitkb/aurora/corne/rev1 diff --git a/keyboards/splitkb/aurora/helix/rules.mk b/keyboards/splitkb/aurora/helix/rules.mk deleted file mode 100644 index 8130273c1f..0000000000 --- a/keyboards/splitkb/aurora/helix/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitkb/aurora/helix/rev1 \ No newline at end of file diff --git a/keyboards/splitkb/aurora/lily58/rules.mk b/keyboards/splitkb/aurora/lily58/rules.mk deleted file mode 100644 index 1f5b922836..0000000000 --- a/keyboards/splitkb/aurora/lily58/rules.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2022 splitkb.com -# -# 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 . - -DEFAULT_FOLDER = splitkb/aurora/lily58/rev1 diff --git a/keyboards/splitkb/aurora/sofle_v2/rules.mk b/keyboards/splitkb/aurora/sofle_v2/rules.mk deleted file mode 100644 index 4a50c4dbb1..0000000000 --- a/keyboards/splitkb/aurora/sofle_v2/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitkb/aurora/sofle_v2/rev1 \ No newline at end of file diff --git a/keyboards/splitkb/aurora/sweep/rules.mk b/keyboards/splitkb/aurora/sweep/rules.mk deleted file mode 100644 index ec1e102039..0000000000 --- a/keyboards/splitkb/aurora/sweep/rules.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2022 splitkb.com -# -# 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 . - -DEFAULT_FOLDER = splitkb/aurora/sweep/rev1 diff --git a/keyboards/splitkb/kyria/rev1/rules.mk b/keyboards/splitkb/kyria/rev1/rules.mk deleted file mode 100644 index 3a8bfbe089..0000000000 --- a/keyboards/splitkb/kyria/rev1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitkb/kyria/rev1/base diff --git a/keyboards/splitkb/kyria/rev2/rules.mk b/keyboards/splitkb/kyria/rev2/rules.mk deleted file mode 100644 index fb808070bf..0000000000 --- a/keyboards/splitkb/kyria/rev2/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitkb/kyria/rev2/base diff --git a/keyboards/splitty/rules.mk b/keyboards/splitty/rules.mk deleted file mode 100644 index 68b3198bfb..0000000000 --- a/keyboards/splitty/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitty/rev1 diff --git a/keyboards/studiokestra/galatea/rules.mk b/keyboards/studiokestra/galatea/rules.mk deleted file mode 100644 index b5b1db4238..0000000000 --- a/keyboards/studiokestra/galatea/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = studiokestra/galatea/rev1 \ No newline at end of file diff --git a/keyboards/takashiski/hecomi/rules.mk b/keyboards/takashiski/hecomi/rules.mk deleted file mode 100644 index 41002fe272..0000000000 --- a/keyboards/takashiski/hecomi/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = takashiski/hecomi/alpha diff --git a/keyboards/themadnoodle/noodlepad/rules.mk b/keyboards/themadnoodle/noodlepad/rules.mk deleted file mode 100644 index 318832e121..0000000000 --- a/keyboards/themadnoodle/noodlepad/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Default folder for noodlepad -DEFAULT_FOLDER = themadnoodle/noodlepad/v1 - diff --git a/keyboards/tkw/grandiceps/rules.mk b/keyboards/tkw/grandiceps/rules.mk deleted file mode 100644 index ab8aeff268..0000000000 --- a/keyboards/tkw/grandiceps/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tkw/grandiceps/rev1 diff --git a/keyboards/tominabox1/littlefoot_lx/rules.mk b/keyboards/tominabox1/littlefoot_lx/rules.mk deleted file mode 100644 index 4756f7600f..0000000000 --- a/keyboards/tominabox1/littlefoot_lx/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tominabox1/littlefoot_lx/rev1 diff --git a/keyboards/tominabox1/underscore33/rules.mk b/keyboards/tominabox1/underscore33/rules.mk deleted file mode 100644 index b5e13fd420..0000000000 --- a/keyboards/tominabox1/underscore33/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tominabox1/underscore33/rev1 diff --git a/keyboards/trnthsn/e8ghty/rules.mk b/keyboards/trnthsn/e8ghty/rules.mk deleted file mode 100644 index e06e8fe182..0000000000 --- a/keyboards/trnthsn/e8ghty/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = trnthsn/e8ghty/stm32f103 diff --git a/keyboards/trnthsn/s6xty5neor2/rules.mk b/keyboards/trnthsn/s6xty5neor2/rules.mk deleted file mode 100644 index 1fc77fba72..0000000000 --- a/keyboards/trnthsn/s6xty5neor2/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = trnthsn/s6xty5neor2/stm32f103 diff --git a/keyboards/tweetydabird/lotus58/rules.mk b/keyboards/tweetydabird/lotus58/rules.mk deleted file mode 100644 index 4cd2262cc7..0000000000 --- a/keyboards/tweetydabird/lotus58/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tweetydabird/lotus58/promicro \ No newline at end of file diff --git a/keyboards/unison/rules.mk b/keyboards/unison/rules.mk deleted file mode 100644 index 69c33d71a2..0000000000 --- a/keyboards/unison/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = unison/v04 diff --git a/keyboards/uzu42/rules.mk b/keyboards/uzu42/rules.mk deleted file mode 100644 index 277e74b715..0000000000 --- a/keyboards/uzu42/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = uzu42/rev1 diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk deleted file mode 100644 index e3452d41db..0000000000 --- a/keyboards/vitamins_included/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = vitamins_included/rev2 diff --git a/keyboards/yanghu/unicorne/rules.mk b/keyboards/yanghu/unicorne/rules.mk deleted file mode 100644 index 96852c8abf..0000000000 --- a/keyboards/yanghu/unicorne/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = yanghu/unicorne/f411 diff --git a/keyboards/yosino58/rules.mk b/keyboards/yosino58/rules.mk deleted file mode 100644 index c700b6f5b5..0000000000 --- a/keyboards/yosino58/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = yosino58/rev1 diff --git a/keyboards/yushakobo/navpad/10/rules.mk b/keyboards/yushakobo/navpad/10/rules.mk deleted file mode 100644 index 32daeef814..0000000000 --- a/keyboards/yushakobo/navpad/10/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = yushakobo/navpad/10/rev1 diff --git a/keyboards/yynmt/acperience12/rules.mk b/keyboards/yynmt/acperience12/rules.mk deleted file mode 100644 index cfe8b8ac18..0000000000 --- a/keyboards/yynmt/acperience12/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = yynmt/acperience12/rev1 From 207dc01d49be315a1bbe77dbb9b48d49e54c1b9e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 20 Jan 2025 22:47:42 +0000 Subject: [PATCH 145/592] rgbkb/pan - Remove invalid build target (#24844) --- keyboards/rgbkb/pan/rev1/32a/rules.mk | 2 ++ keyboards/rgbkb/pan/{ => rev1/proton_c}/rules.mk | 0 2 files changed, 2 insertions(+) rename keyboards/rgbkb/pan/{ => rev1/proton_c}/rules.mk (100%) diff --git a/keyboards/rgbkb/pan/rev1/32a/rules.mk b/keyboards/rgbkb/pan/rev1/32a/rules.mk index c2ee0bc86f..f54ef3e987 100644 --- a/keyboards/rgbkb/pan/rev1/32a/rules.mk +++ b/keyboards/rgbkb/pan/rev1/32a/rules.mk @@ -1,2 +1,4 @@ # Processor frequency F_CPU = 16000000 + +WS2812_DRIVER_REQUIRED = yes diff --git a/keyboards/rgbkb/pan/rules.mk b/keyboards/rgbkb/pan/rev1/proton_c/rules.mk similarity index 100% rename from keyboards/rgbkb/pan/rules.mk rename to keyboards/rgbkb/pan/rev1/proton_c/rules.mk From a98070f21288fae025c6ffa2e08b775fb661bb4b Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 21 Jan 2025 09:53:35 +1100 Subject: [PATCH 146/592] [Docs] Correct I2C API reference (#24840) --- docs/drivers/i2c.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/docs/drivers/i2c.md b/docs/drivers/i2c.md index c806a090c5..2ef7afccc9 100644 --- a/docs/drivers/i2c.md +++ b/docs/drivers/i2c.md @@ -147,7 +147,7 @@ void i2c_init(void) { --- -### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit} +### `i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit} Send multiple bytes to the selected I2C device. @@ -155,7 +155,7 @@ Send multiple bytes to the selected I2C device. - `uint8_t address` The 7-bit I2C address of the device. - - `uint8_t *data` + - `const uint8_t* data` A pointer to the data to transmit. - `uint16_t length` The number of bytes to write. Take care not to overrun the length of `data`. @@ -176,7 +176,7 @@ Receive multiple bytes from the selected I2C device. - `uint8_t address` The 7-bit I2C address of the device. - - `uint8_t *data` + - `uint8_t* data` A pointer to the buffer to read into. - `uint16_t length` The number of bytes to read. Take care not to overrun the length of `data`. @@ -189,7 +189,7 @@ Receive multiple bytes from the selected I2C device. --- -### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register} +### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register} Writes to a register with an 8-bit address on the I2C device. @@ -199,7 +199,7 @@ Writes to a register with an 8-bit address on the I2C device. The 7-bit I2C address of the device. - `uint8_t regaddr` The register address to write to. - - `uint8_t *data` + - `const uint8_t* data` A pointer to the data to transmit. - `uint16_t length` The number of bytes to write. Take care not to overrun the length of `data`. @@ -212,7 +212,7 @@ Writes to a register with an 8-bit address on the I2C device. --- -### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16} +### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16} Writes to a register with a 16-bit address (big endian) on the I2C device. @@ -222,10 +222,10 @@ Writes to a register with a 16-bit address (big endian) on the I2C device. The 7-bit I2C address of the device. - `uint16_t regaddr` The register address to write to. - - `uint8_t *data` + - `const uint8_t* data` A pointer to the data to transmit. - `uint16_t length` - The number of bytes to write. Take care not to overrun the length of `data`. + The number of bytes to write. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -245,8 +245,10 @@ Reads from a register with an 8-bit address on the I2C device. The 7-bit I2C address of the device. - `uint8_t regaddr` The register address to read from. + - `uint8_t data` + A pointer to a buffer to read into. - `uint16_t length` - The number of bytes to read. Take care not to overrun the length of `data`. + The number of bytes to read. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -266,8 +268,10 @@ Reads from a register with a 16-bit address (big endian) on the I2C device. The 7-bit I2C address of the device. - `uint16_t regaddr` The register address to read from. + - `uint8_t* data` + A pointer to a buffer to read into. - `uint16_t length` - The number of bytes to read. Take care not to overrun the length of `data`. + The number of bytes to read. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -279,19 +283,19 @@ Reads from a register with a 16-bit address (big endian) on the I2C device. ### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address} -Pings the I2C bus for a specific address. +Pings the I2C bus for a specific address. -On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsucessful response to ping attempt). +On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt). -This function is weakly defined, meaning it can be overridden if necessary for your particular use case: +This function is weakly defined, meaning it can be overridden if necessary for your particular use case. -#### Arguments +#### Arguments {#api-i2c-ping-address-arguments} - `uint8_t address` The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically). - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. -#### Return Value +#### Return Value {#api-i2c-ping-address-return} `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. From 68130cc8a5557ac997a4aa6c95c7f4c67d07229b Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 21 Jan 2025 09:53:46 +1100 Subject: [PATCH 147/592] `ferris/0_1`: update I2C API usage (#24839) --- keyboards/ferris/0_1/matrix.c | 45 +++++++++++++----------------- keyboards/ferris/0_2/matrix.c | 3 +- platforms/avr/drivers/i2c_master.h | 3 -- 3 files changed, 21 insertions(+), 30 deletions(-) diff --git a/keyboards/ferris/0_1/matrix.c b/keyboards/ferris/0_1/matrix.c index a3e2bebba6..c05b193c1a 100644 --- a/keyboards/ferris/0_1/matrix.c +++ b/keyboards/ferris/0_1/matrix.c @@ -29,7 +29,7 @@ along with this program. If not, see . #include "i2c_master.h" extern i2c_status_t mcp23017_status; -#define I2C_TIMEOUT 1000 +#define MCP23017_I2C_TIMEOUT 1000 // For a better understanding of the i2c protocol, this is a good read: // https://www.robot-electronics.co.uk/i2c-tutorial @@ -41,9 +41,7 @@ extern i2c_status_t mcp23017_status; // All address pins of the mcp23017 are connected to the ground on the ferris // | 0 | 1 | 0 | 0 | A2 | A1 | A0 | // | 0 | 1 | 0 | 0 | 0 | 0 | 0 | -#define I2C_ADDR 0b0100000 -#define I2C_ADDR_WRITE ((I2C_ADDR << 1) | I2C_WRITE) -#define I2C_ADDR_READ ((I2C_ADDR << 1) | I2C_READ) +#define I2C_ADDR (0b0100000 << 1) // Register addresses // See https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h @@ -51,8 +49,8 @@ extern i2c_status_t mcp23017_status; #define IODIRB 0x01 #define GPPUA 0x0C // GPIO pull-up resistor register #define GPPUB 0x0D -#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT) -#define GPIOB 0x13 +#define MCP23017_GPIOA 0x12 // general purpose i/o port register (write modifies OLAT) +#define MCP23017_GPIOB 0x13 #define OLATA 0x14 // output latch register #define OLATB 0x15 @@ -60,14 +58,14 @@ bool i2c_initialized = 0; i2c_status_t mcp23017_status = I2C_ADDR; uint8_t init_mcp23017(void) { - print("starting init"); + print("init mcp23017\n"); mcp23017_status = I2C_ADDR; // I2C subsystem if (i2c_initialized == 0) { i2c_init(); // on pins D(1,0) i2c_initialized = true; - wait_ms(I2C_TIMEOUT); + wait_ms(MCP23017_I2C_TIMEOUT); } // set pin direction @@ -76,8 +74,10 @@ uint8_t init_mcp23017(void) { // - driving : output : 0 // This means: we will read all the bits on GPIOA // This means: we will write to the pins 0-4 on GPIOB (in select_rows) - uint8_t buf[] = {IODIRA, 0b11111111, 0b11110000}; - mcp23017_status = i2c_transmit(I2C_ADDR_WRITE, buf, sizeof(buf), I2C_TIMEOUT); + uint8_t buf[] = {0b11111111, 0b11110000}; + print("before transmit\n"); + mcp23017_status = i2c_write_register(I2C_ADDR, IODIRA, buf, sizeof(buf), MCP23017_I2C_TIMEOUT); + uprintf("after transmit %i\n", mcp23017_status); if (!mcp23017_status) { // set pull-up // - unused : on : 1 @@ -85,8 +85,8 @@ uint8_t init_mcp23017(void) { // - driving : off : 0 // This means: we will read all the bits on GPIOA // This means: we will write to the pins 0-4 on GPIOB (in select_rows) - uint8_t pullup_buf[] = {GPPUA, 0b11111111, 0b11110000}; - mcp23017_status = i2c_transmit(I2C_ADDR_WRITE, pullup_buf, sizeof(pullup_buf), I2C_TIMEOUT); + mcp23017_status = i2c_write_register(I2C_ADDR, GPPUA, buf, sizeof(buf), MCP23017_I2C_TIMEOUT); + uprintf("after transmit2 %i\n", mcp23017_status); } return mcp23017_status; } @@ -144,12 +144,12 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) { // if (++mcp23017_reset_loop >= 1300) { // since mcp23017_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans // this will be approx bit more frequent than once per second - dprint("trying to reset mcp23017\n"); + print("trying to reset mcp23017\n"); mcp23017_status = init_mcp23017(); if (mcp23017_status) { - dprint("right side not responding\n"); + print("right side not responding\n"); } else { - dprint("right side attached\n"); + print("right side attached\n"); } } } @@ -204,18 +204,13 @@ static matrix_row_t read_cols(uint8_t row) { if (mcp23017_status) { // if there was an error return 0; } else { - uint8_t buf[] = {GPIOA}; - mcp23017_status = i2c_transmit(I2C_ADDR_WRITE, buf, sizeof(buf), I2C_TIMEOUT); // We read all the pins on GPIOA. // The initial state was all ones and any depressed key at a given column for the currently selected row will have its bit flipped to zero. // The return value is a row as represented in the generic matrix code were the rightmost bits represent the lower columns and zeroes represent non-depressed keys while ones represent depressed keys. // Since the pins connected to eact columns are sequential, and counting from zero up (col 5 -> GPIOA0, col 6 -> GPIOA1 and so on), the only transformation needed is a bitwise not to swap all zeroes and ones. uint8_t data[] = {0}; - if (!mcp23017_status) { - mcp23017_status = i2c_receive(I2C_ADDR_READ, data, sizeof(data), I2C_TIMEOUT); - data[0] = ~(data[0]); - } - return data[0]; + mcp23017_status = i2c_read_register(I2C_ADDR, MCP23017_GPIOA, data, sizeof(data), MCP23017_I2C_TIMEOUT); + return ~data[0]; } } } @@ -236,7 +231,7 @@ static void unselect_rows(void) { static void select_row(uint8_t row) { if (row < MATRIX_ROWS_PER_SIDE) { - // select on atmega32u4 + // select on MCU pin_t matrix_row_pins_mcu[MATRIX_ROWS_PER_SIDE] = MATRIX_ROW_PINS_MCU; pin_t pin = matrix_row_pins_mcu[row]; gpio_set_pin_output(pin); @@ -248,8 +243,8 @@ static void select_row(uint8_t row) { } else { // Select the desired row by writing a byte for the entire GPIOB bus where only the bit representing the row we want to select is a zero (write instruction) and every other bit is a one. // Note that the row - MATRIX_ROWS_PER_SIDE reflects the fact that being on the right hand, the columns are numbered from MATRIX_ROWS_PER_SIDE to MATRIX_ROWS, but the pins we want to write to are indexed from zero up on the GPIOB bus. - uint8_t buf[] = {GPIOB, 0xFF & ~(1 << (row - MATRIX_ROWS_PER_SIDE))}; - mcp23017_status = i2c_transmit(I2C_ADDR_WRITE, buf, sizeof(buf), I2C_TIMEOUT); + uint8_t buf[] = {0xFF & ~(1 << (row - MATRIX_ROWS_PER_SIDE))}; + mcp23017_status = i2c_write_register(I2C_ADDR, MCP23017_GPIOB, buf, sizeof(buf), MCP23017_I2C_TIMEOUT); } } } diff --git a/keyboards/ferris/0_2/matrix.c b/keyboards/ferris/0_2/matrix.c index 74fab717a1..76bbcaf7b5 100644 --- a/keyboards/ferris/0_2/matrix.c +++ b/keyboards/ferris/0_2/matrix.c @@ -30,8 +30,7 @@ along with this program. If not, see . extern i2c_status_t mcp23017_status; #define MCP23017_I2C_TIMEOUT 1000 -#define I2C_WRITE 0x00 -#define I2C_READ 0x01 + // For a better understanding of the i2c protocol, this is a good read: // https://www.robot-electronics.co.uk/i2c-tutorial diff --git a/platforms/avr/drivers/i2c_master.h b/platforms/avr/drivers/i2c_master.h index 258bb2b9bf..ad92caa55a 100644 --- a/platforms/avr/drivers/i2c_master.h +++ b/platforms/avr/drivers/i2c_master.h @@ -21,9 +21,6 @@ #include -#define I2C_READ 0x01 -#define I2C_WRITE 0x00 - typedef int16_t i2c_status_t; #define I2C_STATUS_SUCCESS (0) From 163b894b97a5c8cf9ab80179b4d59999077ad8d5 Mon Sep 17 00:00:00 2001 From: Rory Chatterton Date: Tue, 21 Jan 2025 11:01:02 +1100 Subject: [PATCH 148/592] Updated Licence Violations for Chosfox L75 (#24833) Co-authored-by: Joel Challis --- docs/license_violations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/license_violations.md b/docs/license_violations.md index f899deb07c..3cb0f29efd 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -20,6 +20,7 @@ If you own a board from one of the following vendors already, consider asking th | Vendor | Reason | |------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. | | CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | | Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | | Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | From 5650894c2047a0cf5e77456ba7e62763dd8ba04f Mon Sep 17 00:00:00 2001 From: Brian Hill <51302710+TrojanPinata@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:33:38 -0500 Subject: [PATCH 149/592] Add Model-B keyboard (#24681) * Add Model-B keyboard * PR changes for Model-B * Update to OLED on Model-B * added license to pass lint check * update virtual eeprom for Model-B * eeconfig_read_kb() update on Model-B * cleanup changes for Model B * implementing Model B suggestions --- keyboards/trojan_pinata/model_b/readme.md | 32 ++ keyboards/trojan_pinata/model_b/rev0/config.h | 14 + .../trojan_pinata/model_b/rev0/keyboard.json | 122 ++++++ .../model_b/rev0/keymaps/default/keymap.c | 47 +++ .../trojan_pinata/model_b/rev0/mcuconf.h | 24 ++ keyboards/trojan_pinata/model_b/rev0/rev0.c | 397 ++++++++++++++++++ keyboards/trojan_pinata/model_b/rev0/rev0.h | 21 + 7 files changed, 657 insertions(+) create mode 100644 keyboards/trojan_pinata/model_b/readme.md create mode 100644 keyboards/trojan_pinata/model_b/rev0/config.h create mode 100644 keyboards/trojan_pinata/model_b/rev0/keyboard.json create mode 100644 keyboards/trojan_pinata/model_b/rev0/keymaps/default/keymap.c create mode 100644 keyboards/trojan_pinata/model_b/rev0/mcuconf.h create mode 100644 keyboards/trojan_pinata/model_b/rev0/rev0.c create mode 100644 keyboards/trojan_pinata/model_b/rev0/rev0.h diff --git a/keyboards/trojan_pinata/model_b/readme.md b/keyboards/trojan_pinata/model_b/readme.md new file mode 100644 index 0000000000..3d6ac2199d --- /dev/null +++ b/keyboards/trojan_pinata/model_b/readme.md @@ -0,0 +1,32 @@ +# Model-B + +A 75% keyboard based on the RP2040. + +* Keyboard Maintainer: [Brian Hill](https://github.com/TrojanPinata) +* Hardware Supported: [GitHub](https://github.com/TrojanPinata/Model-B) + +## Revisions + +At the current moment there is only one variant of the Model-B, the rev-0 (aka the prototype board). Any others are clones and may not have the exact firmware requirements. + +## Building and Flashing + +Make example for this keyboard (after setting up your build environment): + + make trojan_pinata/model-b/rev0:default + +Flashing example for this keyboard: + + make trojan_pinata/model-b/rev0: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 top left key and plug in the keyboard. This will also clear the emulated EEPROM, so it is a good first step if the keyboard is misbehaving. +* **Physical reset button**: Hold down the `BOOTSEL` button on the Pi Pico, then either plug the board in or press the `RESET` button. +* **Keycode in layout**: Press the key mapped to `QK_BOOT`. In the pre-supplied keymaps it is on the second layer, replacing the Esc key. + +After entering the bootloader through one of the three methods above, the keyboard will appear as a USB mass storage device named `RPI-RP2`. If the CLI is unable to find this device, the compiled `.uf2` file can be manually copied to it. The keyboard will reboot on completion with the new firmware loaded. diff --git a/keyboards/trojan_pinata/model_b/rev0/config.h b/keyboards/trojan_pinata/model_b/rev0/config.h new file mode 100644 index 0000000000..df90591928 --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/config.h @@ -0,0 +1,14 @@ +// Copyright 2022 Stefan Kerkmann +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U + +// settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port +#define I2C_DRIVER I2CD0 +#define I2C1_SDA_PIN GP0 +#define I2C1_SCL_PIN GP1 + +#define OLED_TIMEOUT 3000000 // 5 minutes before oled turns off diff --git a/keyboards/trojan_pinata/model_b/rev0/keyboard.json b/keyboards/trojan_pinata/model_b/rev0/keyboard.json new file mode 100644 index 0000000000..82d712d6fc --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/keyboard.json @@ -0,0 +1,122 @@ +{ + "manufacturer": "Trojan_Pinata", + "keyboard_name": "Model-B", + "maintainer": "Trojan_Pinata", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP27", "pin_b": "GP26"} + ] + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true, + "encoder": true + }, + "matrix_pins": { + "cols": ["GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP16", "GP17", "GP18", "GP19", "GP20", "GP21", "GP22"], + "rows": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7"] + }, + "processor": "RP2040", + "url": "https://github.com/TrojanPinata/Model-B", + "usb": { + "device_version": "1.0.0", + "pid": "0xA500", + "vid": "0xE739" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 1.25, "y": 0}, + {"matrix": [0, 3], "x": 2.25, "y": 0}, + {"matrix": [0, 4], "x": 3.25, "y": 0}, + {"matrix": [0, 5], "x": 4.25, "y": 0}, + {"matrix": [0, 6], "x": 5.5, "y": 0}, + {"matrix": [0, 7], "x": 6.5, "y": 0}, + {"matrix": [0, 8], "x": 7.5, "y": 0}, + {"matrix": [0, 9], "x": 8.5, "y": 0}, + {"matrix": [0, 10], "x": 9.75, "y": 0}, + {"matrix": [0, 11], "x": 10.75, "y": 0}, + {"matrix": [0, 12], "x": 11.75, "y": 0}, + {"matrix": [0, 13], "x": 12.75, "y": 0}, + {"matrix": [0, 14], "x": 15.75, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.5}, + {"matrix": [1, 2], "x": 2, "y": 1.5}, + {"matrix": [1, 3], "x": 3, "y": 1.5}, + {"matrix": [1, 4], "x": 4, "y": 1.5}, + {"matrix": [1, 5], "x": 5, "y": 1.5}, + {"matrix": [1, 6], "x": 6, "y": 1.5}, + {"matrix": [1, 7], "x": 7, "y": 1.5}, + {"matrix": [1, 8], "x": 8, "y": 1.5}, + {"matrix": [1, 9], "x": 9, "y": 1.5}, + {"matrix": [1, 10], "x": 10, "y": 1.5}, + {"matrix": [1, 11], "x": 11, "y": 1.5}, + {"matrix": [1, 12], "x": 12, "y": 1.5}, + {"matrix": [1, 13], "x": 13, "y": 1.5, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"matrix": [2, 2], "x": 2.5, "y": 2.5}, + {"matrix": [2, 3], "x": 3.5, "y": 2.5}, + {"matrix": [2, 4], "x": 4.5, "y": 2.5}, + {"matrix": [2, 5], "x": 5.5, "y": 2.5}, + {"matrix": [2, 6], "x": 6.5, "y": 2.5}, + {"matrix": [2, 7], "x": 7.5, "y": 2.5}, + {"matrix": [2, 8], "x": 8.5, "y": 2.5}, + {"matrix": [2, 9], "x": 9.5, "y": 2.5}, + {"matrix": [2, 10], "x": 10.5, "y": 2.5}, + {"matrix": [2, 11], "x": 11.5, "y": 2.5}, + {"matrix": [2, 12], "x": 12.5, "y": 2.5}, + {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.5}, + {"matrix": [3, 2], "x": 2.75, "y": 3.5}, + {"matrix": [3, 3], "x": 3.75, "y": 3.5}, + {"matrix": [3, 4], "x": 4.75, "y": 3.5}, + {"matrix": [3, 5], "x": 5.75, "y": 3.5}, + {"matrix": [3, 6], "x": 6.75, "y": 3.5}, + {"matrix": [3, 7], "x": 7.75, "y": 3.5}, + {"matrix": [3, 8], "x": 8.75, "y": 3.5}, + {"matrix": [3, 9], "x": 9.75, "y": 3.5}, + {"matrix": [3, 10], "x": 10.75, "y": 3.5}, + {"matrix": [3, 11], "x": 11.75, "y": 3.5}, + {"matrix": [3, 12], "x": 14, "y": 0}, + {"matrix": [3, 13], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [3, 14], "x": 16.25, "y": 1.5}, + {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [4, 1], "x": 2.25, "y": 4.5}, + {"matrix": [4, 2], "x": 3.25, "y": 4.5}, + {"matrix": [4, 3], "x": 4.25, "y": 4.5}, + {"matrix": [4, 4], "x": 5.25, "y": 4.5}, + {"matrix": [4, 5], "x": 6.25, "y": 4.5}, + {"matrix": [4, 6], "x": 7.25, "y": 4.5}, + {"matrix": [4, 7], "x": 8.25, "y": 4.5}, + {"matrix": [4, 8], "x": 9.25, "y": 4.5}, + {"matrix": [4, 9], "x": 10.25, "y": 4.5}, + {"matrix": [4, 10], "x": 11.25, "y": 4.5}, + {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 1.75}, + {"matrix": [4, 13], "x": 14.3, "y": 4.6}, + {"matrix": [4, 14], "x": 16.25, "y": 2.5}, + {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.5, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5.5}, + {"matrix": [5, 10], "x": 11, "y": 5.5}, + {"matrix": [5, 11], "x": 12, "y": 5.5}, + {"matrix": [5, 12], "x": 13.3, "y": 5.6}, + {"matrix": [5, 13], "x": 14.3, "y": 5.6}, + {"matrix": [5, 14], "x": 15.3, "y": 5.6} + ] + } + } +} diff --git a/keyboards/trojan_pinata/model_b/rev0/keymaps/default/keymap.c b/keyboards/trojan_pinata/model_b/rev0/keymaps/default/keymap.c new file mode 100644 index 0000000000..56c4657e7b --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/keymaps/default/keymap.c @@ -0,0 +1,47 @@ +/* Copyright 2024 Brian H (@Trojan_Pinata) + * + * 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 + +// keymaps +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_MUTE, + + 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_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_INS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, QK_KB, KC_ENT, KC_HOME, + 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_END, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT( + QK_BOOT, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_MUTE, + + EE_CLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, + DB_TOGG, _______, _______, KC_MYCM, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, + _______, _______, _______, _______, KC_CALC, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, + _______, _______, _______, _______, _______, _______, _______, KC_EXEC, _______, _______ + ) +}; + +// encoder handling +#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(_______, _______) }, +}; +#endif diff --git a/keyboards/trojan_pinata/model_b/rev0/mcuconf.h b/keyboards/trojan_pinata/model_b/rev0/mcuconf.h new file mode 100644 index 0000000000..57e58e14d7 --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/mcuconf.h @@ -0,0 +1,24 @@ +/* Copyright 2020 QMK + * + * 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 RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 TRUE diff --git a/keyboards/trojan_pinata/model_b/rev0/rev0.c b/keyboards/trojan_pinata/model_b/rev0/rev0.c new file mode 100644 index 0000000000..02cd92f0da --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/rev0.c @@ -0,0 +1,397 @@ +/* Copyright 2024 Brian H (@Trojan_Pinata) + * + * 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 "rev0.h" + +// NUM_MODES stays last to indicate the number of different screens possible +enum oled_modes { + MTNS, INFO, LOGO, MEW, CEL, RAY, NUM_MODES +}; + +// define the key that switches the display +enum keeb_codes { + OLED_MOD = QK_KB, +}; + +// virtual eeprom for storing last layer +typedef union { + uint32_t raw; + struct { + uint8_t display_mode_saved : 3; + }; +} keyboard_config_t; +keyboard_config_t keyboard_config; + +void keyboard_pre_init_kb(void) { + keyboard_config.raw = eeconfig_read_kb(); + keyboard_pre_init_user(); +} + +void eeconfig_init_kb(void) { + keyboard_config.raw = 0; + keyboard_config.display_mode_saved = INFO; + eeconfig_update_kb(keyboard_config.raw); + eeconfig_init_user(); +} + +// oled stuff below +#ifdef OLED_ENABLE + +// hold only let me just drop all of my embedded images rq +static const char PROGMEM bootscreen[] = { + // 'modelb-oled', 128x32px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 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, 0xff, 0xff, 0xff, 0x0f, 0x7f, 0xfe, + 0xf0, 0x80, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfe, 0x3f, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0xf0, 0xfc, 0xfe, 0x3f, 0x0f, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, 0x1f, + 0x3f, 0xfe, 0xfc, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, + 0x0f, 0x1f, 0xfe, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, + 0xe1, 0xe1, 0xe3, 0xff, 0xff, 0xbf, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, + 0x1f, 0x7f, 0xfc, 0xf0, 0xfe, 0x7f, 0x0f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x07, 0x1f, 0x3f, 0x7e, 0xf8, 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0x7c, + 0x7f, 0x3f, 0x1f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, + 0xf8, 0x7c, 0x3f, 0x1f, 0x07, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, + 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, + 0xc1, 0xc1, 0xc1, 0xe1, 0xff, 0xff, 0x7f, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const char PROGMEM mnts_l0[] = { + // 'base', 128x32px + 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0xa0, 0xb0, 0xf0, 0xd0, 0xd0, 0xf8, 0xfc, 0xdc, 0xfe, + 0xff, 0xff, 0xff, 0xdf, 0xde, 0xde, 0x9c, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0x90, 0xa0, 0x40, + 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x90, 0xd0, 0xd0, 0xc8, 0xe8, 0xec, 0xe4, 0xfc, 0xfa, 0xfa, 0xfa, + 0xf4, 0xe4, 0xe4, 0xc8, 0xc8, 0xd8, 0x90, 0x90, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x80, 0xc0, 0x60, 0x30, 0x10, 0x00, 0x40, 0x60, + 0x30, 0x10, 0xf8, 0x0c, 0x06, 0x02, 0x00, 0x10, 0x08, 0x18, 0x3f, 0xe8, 0x08, 0x24, 0x3c, 0x0c, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00, + 0xb9, 0x3d, 0x3d, 0x7c, 0x3e, 0x3f, 0x3f, 0x1d, 0x0d, 0x0f, 0x0b, 0x1f, 0x1f, 0x1f, 0x1f, 0x0b, + 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x05, 0x07, 0x0f, 0x0b, 0x0b, 0x13, 0x13, 0x37, 0x7f, 0xf7, + 0xf7, 0xf8, 0xf0, 0xf8, 0xf8, 0xf1, 0xe1, 0xf3, 0x12, 0xd2, 0xd1, 0xd1, 0x11, 0x00, 0xc0, 0xc0, + 0xe0, 0xf0, 0x78, 0x78, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0x1f, + 0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x0f, 0x1f, 0x1e, 0x1e, 0x1f, 0x1c, 0x39, 0x39, 0x3a, 0x3c, + 0x79, 0x79, 0xf2, 0xe2, 0xe4, 0xe5, 0x85, 0x49, 0x48, 0x08, 0xd0, 0xd0, 0x90, 0x20, 0x20, 0x40, + 0x40, 0x40, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, + 0x0b, 0x0f, 0x0f, 0x1f, 0x2f, 0x7c, 0x7c, 0xf8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x0f, 0x0f, 0x0f, + 0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7e, 0x7f, 0xff, 0x78, 0xf8, 0xe0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x07, 0x07, 0x00, 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, 0x07, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, + 0x0e, 0x0e, 0x0c, 0x0c, 0x00, 0x03, 0x47, 0x46, 0xc6, 0x8c, 0x8c, 0x0c, 0x18, 0x30, 0x63, 0x4c, + 0x50, 0xcc, 0x83, 0x00, 0x00, 0x12, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x15, 0x13, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x60, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x70, 0x70, 0x30, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1c, 0x1c, 0x07, 0x0f, 0x1f, + 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x18, 0x10, 0x30, 0x30, + 0x30, 0x30, 0x38, 0x38, 0x7c, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, + 0x60, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x80, 0x40, 0x60, + 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x06, 0x06, 0x0c, 0x08, 0x08, 0x10, 0x30, 0x20, 0x20, 0x60 +}; + +static const char PROGMEM mnts_l1[] = { + // 'alt', 128x32px + 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0xa0, 0xb0, 0xf0, 0xd0, 0xd0, 0xf8, 0xfc, 0xdc, 0xfe, + 0xff, 0xff, 0xff, 0xdf, 0xde, 0xde, 0x9c, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0x90, 0xa0, 0x40, + 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x90, 0xd0, 0xd0, 0xc8, 0xe8, 0xec, 0xe4, 0xfc, 0xfa, 0xfa, 0xfa, + 0xf4, 0xe4, 0xe4, 0xc8, 0xc8, 0xd8, 0x90, 0x90, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x80, 0xc0, 0x60, 0x30, 0x10, 0x00, 0x40, 0x60, + 0x30, 0x10, 0xf8, 0x0c, 0x06, 0x02, 0x00, 0x10, 0x08, 0x18, 0x3f, 0xe8, 0x08, 0x24, 0x3c, 0x0c, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x04, 0x82, 0x42, 0x22, 0x1c, 0x00, + 0xb9, 0x3d, 0x3d, 0x7c, 0x3e, 0x3f, 0x3f, 0x1d, 0x0d, 0x0f, 0x0b, 0x1f, 0x1f, 0x1f, 0x1f, 0x0b, + 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x05, 0x07, 0x0f, 0x0b, 0x0b, 0x13, 0x13, 0x37, 0x7f, 0xf7, + 0xf7, 0xf8, 0xf0, 0xf8, 0xf8, 0xf1, 0xe1, 0xf3, 0x12, 0xd2, 0xd1, 0xd1, 0x11, 0x00, 0xc0, 0xc0, + 0xe0, 0xf0, 0x78, 0x78, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0x1f, + 0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x0f, 0x1f, 0x1e, 0x1e, 0x1f, 0x1c, 0x39, 0x39, 0x3a, 0x3c, + 0x79, 0x79, 0xf2, 0xe2, 0xe4, 0xe5, 0x85, 0x49, 0x48, 0x08, 0xd0, 0xd0, 0x90, 0x20, 0x20, 0x40, + 0x40, 0x40, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x00, + 0x0b, 0x0f, 0x0f, 0x1f, 0x2f, 0x7c, 0x7c, 0xf8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x0f, 0x0f, 0x0f, + 0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7e, 0x7f, 0xff, 0x78, 0xf8, 0xe0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x07, 0x07, 0x00, 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, 0x07, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, + 0x0e, 0x0e, 0x0c, 0x0c, 0x00, 0x03, 0x47, 0x46, 0xc6, 0x8c, 0x8c, 0x0c, 0x18, 0x30, 0x63, 0x4c, + 0x50, 0xcc, 0x83, 0x00, 0x00, 0x12, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x15, 0x13, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x60, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x70, 0x70, 0x30, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1c, 0x1c, 0x07, 0x0f, 0x1f, + 0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x18, 0x10, 0x30, 0x30, + 0x30, 0x30, 0x38, 0x38, 0x7c, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, + 0x60, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x80, 0x40, 0x60, + 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x06, 0x06, 0x0c, 0x08, 0x08, 0x10, 0x30, 0x20, 0x20, 0x60 +}; + +static const char PROGMEM mew_disp[] = { + // 'mewl2', 128x32px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, + 0x60, 0x50, 0x10, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x08, + 0x04, 0xc4, 0xf2, 0xfa, 0x7e, 0x3e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0xa0, 0x20, 0x00, 0x10, + 0x10, 0x10, 0x10, 0x0c, 0x02, 0x22, 0x42, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x34, 0xf2, 0xf2, 0xc2, 0x01, 0x00, 0xc0, 0xa0, 0xe0, 0x28, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x1a, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x70, 0xe0, + 0xff, 0xff, 0xc7, 0x81, 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, + 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0x78, 0x78, 0x3c, 0x3c, 0x1c, 0x1c, 0x3c, 0x38, + 0x78, 0xf0, 0xe0, 0xc0, 0x00, 0x01, 0x06, 0x08, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x41, 0xc0, 0x80, + 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x61, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x8c, 0xd9, 0x7b, 0x53, 0x10, + 0x08, 0x18, 0x38, 0x3c, 0x36, 0x2f, 0x6b, 0x75, 0x92, 0xee, 0x18, 0xe4, 0xfc, 0x78, 0x00, 0xc1, + 0xb7, 0xcf, 0xf3, 0xfc, 0xfd, 0xef, 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, 0x78, 0xfe, 0xf9, + 0xf0, 0xf9, 0xff, 0x7f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x90, + 0x08, 0x09, 0x9f, 0xff, 0xff, 0xf8, 0x00, 0x38, 0xc6, 0x81, 0x8e, 0x70, 0x50, 0x50, 0x53, 0xe2, + 0x83, 0x01, 0x62, 0xab, 0xa8, 0xa8, 0x50, 0x54, 0x50, 0x89, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x0d, 0x0c, 0x04, 0x06, 0x1e, 0x6e, + 0x80, 0x00, 0x00, 0x38, 0x08, 0x84, 0xc4, 0xfe, 0x07, 0xf8, 0xff, 0xff, 0xff, 0x7f, 0x3e, 0x7f, + 0x7f, 0x3f, 0x0f, 0x01, 0x83, 0x7c, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xc8, 0x84, 0x86, 0xcf, + 0xb7, 0x81, 0x80, 0x41, 0x43, 0x8c, 0x92, 0xe1, 0x61, 0x53, 0x2e, 0x11, 0x11, 0x19, 0x2c, 0xd0, + 0x20, 0x41, 0x40, 0x40, 0x24, 0x30, 0x20, 0x20, 0xf0, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const char PROGMEM cel_disp[] = { + // 'celebi1', 128x32px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x20, 0xc0, 0xe0, 0xe0, 0xf0, 0xdc, 0xee, 0xf0, 0xbe, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x60, 0xc0, 0x81, 0x80, 0x80, 0xc0, + 0xc0, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x80, 0xc0, 0xc0, 0xc0, + 0x60, 0xb0, 0xcc, 0xf0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xc0, 0xf8, 0xfc, 0xfc, 0xfb, + 0xf4, 0xff, 0xff, 0x7f, 0x1f, 0xcf, 0x67, 0xe3, 0xc7, 0x0f, 0x9f, 0xff, 0x3e, 0xc0, 0xf0, 0x78, + 0x90, 0xe0, 0xf2, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x3f, + 0x3f, 0x3b, 0x3e, 0x79, 0xfe, 0xfe, 0xff, 0xfe, 0x7c, 0xfc, 0xf8, 0xd8, 0xf0, 0xf0, 0xb0, 0xa0, + 0xa0, 0xa0, 0xe0, 0xe0, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x31, 0x40, 0xf0, 0xf8, 0xfc, 0xfe, 0xf0, 0xff, 0xf0, 0xff, 0x7f, 0x3f, 0xbf, 0x9f, + 0x9f, 0x1f, 0x3f, 0xfe, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x87, 0x8f, 0x9f, + 0x9f, 0x9f, 0xc7, 0xcc, 0xd8, 0xd8, 0x98, 0x3c, 0xfc, 0xf7, 0xfb, 0x1c, 0x1d, 0x1e, 0x1e, 0x1f, + 0x0f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x87, 0xcf, 0x6d, 0xf8, 0x72, 0xf4, + 0xf4, 0x90, 0x20, 0x20, 0xa7, 0x6f, 0x6f, 0x6b, 0x0b, 0x06, 0x06, 0x05, 0x05, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0xc0, 0xc0, 0xc0, 0xc0, 0x83, 0x8f, 0x9f, 0x3f, 0x7f, 0x5f, 0xff, 0x71, 0xe0, 0xe1, 0x60, 0x62, + 0x27, 0x30, 0x18, 0x9f, 0xcf, 0xc3, 0xc0, 0xc0, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xe0, 0xe0, 0xc8, 0x9c, 0xf8, 0x60, 0x28, 0x3c, 0x7e, 0x7e, 0xfe, 0xff, 0xfc, 0xe1, + 0x07, 0x1f, 0x3f, 0x3e, 0x7d, 0x7b, 0x73, 0x72, 0xe2, 0xe0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x01, 0x01, 0xc1, 0xc1, 0x03, 0x03, 0x03, 0x23, 0x01, 0x0d, 0x06, 0x07, 0x37, 0x33, 0x01, 0x01, + 0x07, 0x0e, 0x3c, 0x39, 0x79, 0x71, 0x71, 0x60, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const char PROGMEM rayq_disp[] = { + // 'rayquaza1', 128x32px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, + 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x70, 0x70, 0x71, 0x50, 0x60, 0x60, 0x60, 0x40, 0x80, 0x80, + 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc0, 0x80, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, + 0xe0, 0x60, 0x70, 0x70, 0x7b, 0x7b, 0xfb, 0xfb, 0xf8, 0xb0, 0xb0, 0xd0, 0x60, 0x30, 0x10, 0x08, + 0x0c, 0x84, 0x86, 0x83, 0x81, 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, 0x80, 0x40, 0x30, 0x1c, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x11, 0x12, 0x10, 0x10, 0x0e, 0x0e, 0x0c, 0x0c, 0x07, + 0x07, 0x0f, 0x0f, 0x03, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xf3, 0x3e, 0xe7, 0xfc, 0x7f, 0x3f, 0x0f, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3c, 0x2e, 0x57, 0x17, 0x1b, 0x1d, 0x36, + 0x36, 0x3d, 0x31, 0x31, 0x39, 0x3d, 0x3d, 0x1d, 0x1f, 0x1f, 0xcf, 0x3f, 0x07, 0x00, 0x00, 0x81, + 0x83, 0x83, 0x83, 0x03, 0x07, 0x07, 0x07, 0x0f, 0x0e, 0x1e, 0x1c, 0x3c, 0x78, 0xf8, 0xf0, 0xe0, + 0x00, 0x40, 0xc0, 0x00, 0x60, 0x38, 0x38, 0x20, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0x7f, 0xfe, 0xec, 0xf8, 0x7c, 0x3c, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, + 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, 0xcf, 0x80, 0x07, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x08, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xc1, + 0x07, 0x0f, 0x9f, 0xbe, 0x78, 0xf0, 0xc0, 0x00, 0x80, 0x00, 0x80, 0x30, 0x30, 0x30, 0x11, 0x19, + 0x18, 0x02, 0x07, 0x1f, 0x1f, 0x3c, 0x73, 0xcf, 0x0f, 0x0f, 0x0f, 0x17, 0x2f, 0x56, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1d, 0x3b, 0xff, 0xff, 0xfc, 0xf8, 0xf0, + 0x60, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x68, 0x78, 0x10, 0x00, 0x18, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xfc, 0xf8, 0xe0, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, + 0xf0, 0xf0, 0xf0, 0xf1, 0xe1, 0x41, 0x04, 0x1e, 0xcf, 0xc7, 0x44, 0x63, 0x59, 0x6d, 0x0a, 0x03, + 0x03, 0x0c, 0x0e, 0x05, 0x03, 0x02, 0x02, 0x1b, 0xec, 0x67, 0x5b, 0x1c, 0x8c, 0xcc, 0xdc, 0x30, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xc0, 0x3f, 0xfc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +// invert display based on layer +static void inv_display(void) { + switch (get_highest_layer(layer_state)) { + case 1: + oled_invert(true); + break; + default: + oled_invert(false); + break; + } +} + +// MTNS +static void mountains(void) { + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_raw_P(mnts_l0, sizeof(mnts_l0)); + break; + case 1: + oled_write_raw_P(mnts_l1, sizeof(mnts_l1)); + break; + default: + oled_write_raw_P(mnts_l0, sizeof(mnts_l0)); + break; + } +} + +// INFO +static void info(void) { + // get layer the board is on + oled_write_P(PSTR("LAYER "), false); + oled_write_P(PSTR(" "), true); + oled_write_char(get_highest_layer(layer_state) + 0x30, true); + oled_write_P(PSTR(" "), true); + + // here we do a bit of trickery + oled_write_P(PSTR(" ENC "), false); + oled_write_P(PSTR(" VOL "), true); + + // lock key statuses + led_t led_state = host_keyboard_led_state(); + oled_set_cursor(9, 1); + oled_write_P(PSTR(" CAP "), led_state.caps_lock); + oled_set_cursor(14, 1); + oled_write_P(PSTR(" SCR "), led_state.scroll_lock); + + // write model B here in invert text + oled_set_cursor(0, 3); + oled_write_P(PSTR(" MODEL-B "), true); + + // mod masks - if you don't know what these do, don't worry about them + uint8_t mod_state = get_mods(); + oled_advance_char(); + oled_advance_char(); + oled_write_P(PSTR("S"), mod_state & MOD_MASK_SHIFT); + oled_advance_char(); + oled_write_P(PSTR("C"), mod_state & MOD_MASK_CTRL); + oled_advance_char(); + oled_write_P(PSTR("A"), mod_state & MOD_MASK_ALT); + oled_advance_char(); + oled_write_P(PSTR("G"), mod_state & MOD_MASK_GUI); + oled_advance_char(); +} + +// display logo - used on boot and exception state +static void logo(void) { + oled_write_raw_P(bootscreen, sizeof(bootscreen)); +} + +// run this whenever the oled needs to update +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + + switch (keyboard_config.display_mode_saved) { + case MTNS: + mountains(); + break; + case INFO: + info(); + break; + case LOGO: + oled_write_raw_P(bootscreen, sizeof(bootscreen)); // write image to screen + inv_display(); // invert image if necessary - remove if layer differs + break; + case MEW: + oled_write_raw_P(mew_disp, sizeof(mew_disp)); + inv_display(); + break; + case CEL: + oled_write_raw_P(cel_disp, sizeof(cel_disp)); + inv_display(); + break; + case RAY: + oled_write_raw_P(rayq_disp, sizeof(rayq_disp)); + inv_display(); + break; + default: + logo(); + } + return false; +} + +// render this on boot/reset +void oled_render_boot(bool bootloader) { + oled_clear(); + logo(); + oled_render_dirty(true); +} + +// change depending on if OLED_MOD is pressed +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + if (keycode == OLED_MOD && record->event.pressed) { + oled_clear(); + keyboard_config.display_mode_saved++; + if (keyboard_config.display_mode_saved == NUM_MODES) { + keyboard_config.display_mode_saved = 0; + } + eeconfig_update_kb(keyboard_config.raw); + } + return true; +} + +#endif diff --git a/keyboards/trojan_pinata/model_b/rev0/rev0.h b/keyboards/trojan_pinata/model_b/rev0/rev0.h new file mode 100644 index 0000000000..18906806c9 --- /dev/null +++ b/keyboards/trojan_pinata/model_b/rev0/rev0.h @@ -0,0 +1,21 @@ +/* Copyright 2024 Brian H (@Trojan_Pinata) + * + * 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 "quantum.h" + +void oled_render_boot(bool bootloader); From 6a9ccae18d6a9cd39dbbd5c0fb9aa26f4742c2f7 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 24 Jan 2025 19:11:38 -0800 Subject: [PATCH 150/592] Fix missing wait.h include in Dip Switch Map (#24863) --- quantum/dip_switch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c index 69cf665291..65ae21175b 100644 --- a/quantum/dip_switch.c +++ b/quantum/dip_switch.c @@ -64,6 +64,7 @@ __attribute__((weak)) bool dip_switch_update_mask_kb(uint32_t state) { #ifdef DIP_SWITCH_MAP_ENABLE # include "keymap_introspection.h" # include "action.h" +# include "wait.h" # ifndef DIP_SWITCH_MAP_KEY_DELAY # define DIP_SWITCH_MAP_KEY_DELAY TAP_CODE_DELAY From a6e931400ead19d3d34ca4a57785d1512dc2d12b Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 25 Jan 2025 17:38:12 +1100 Subject: [PATCH 151/592] Relocate base WS2812 code (#24850) --- builddefs/common_features.mk | 2 ++ drivers/{ => led}/ws2812.c | 0 drivers/{ => led}/ws2812.h | 0 keyboards/ibm/model_m/mschwingen/mschwingen.c | 5 ++++- 4 files changed, 6 insertions(+), 1 deletion(-) rename drivers/{ => led}/ws2812.c (100%) rename drivers/{ => led}/ws2812.h (100%) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 989048d717..c88ce36011 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -944,6 +944,8 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]')) + COMMON_VPATH += $(DRIVER_PATH)/led + SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c ifeq ($(strip $(PLATFORM)), CHIBIOS) diff --git a/drivers/ws2812.c b/drivers/led/ws2812.c similarity index 100% rename from drivers/ws2812.c rename to drivers/led/ws2812.c diff --git a/drivers/ws2812.h b/drivers/led/ws2812.h similarity index 100% rename from drivers/ws2812.h rename to drivers/led/ws2812.h diff --git a/keyboards/ibm/model_m/mschwingen/mschwingen.c b/keyboards/ibm/model_m/mschwingen/mschwingen.c index cb4854d8d1..34a878c769 100644 --- a/keyboards/ibm/model_m/mschwingen/mschwingen.c +++ b/keyboards/ibm/model_m/mschwingen/mschwingen.c @@ -19,9 +19,12 @@ #include "uart.h" #include "print.h" #include "sendchar.h" -#include "ws2812.h" #include "sleep_led.h" +#ifdef KEYBOARD_ibm_model_m_mschwingen_led_ws2812 +#include "ws2812.h" +#endif + #ifdef UART_DEBUG # undef sendchar static int8_t capture_sendchar(uint8_t c) { From 0a049163f148cd07cf2f58ce31b5809bfbacee18 Mon Sep 17 00:00:00 2001 From: Xelus22 <17491233+Xelus22@users.noreply.github.com> Date: Sun, 26 Jan 2025 02:58:38 +1100 Subject: [PATCH 152/592] [License Violation] add pressplayid (#24869) add pressplayid lic viol Co-authored-by: Xelus22 <> --- docs/license_violations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/license_violations.md b/docs/license_violations.md index 3cb0f29efd..81a6ba517f 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -33,6 +33,7 @@ If you own a board from one of the following vendors already, consider asking th | mmd / Smartmmd / i-game.tech | Ambiguity on PRs -- marketing says wireless, PR author said wired-only, then included wireless code anyway. Seemingly intentionally deceptive. | | MyKeyClub | Community-supported JRIS75, vendor was contacted by community members and refused to cooperate. | | owlab | Selling wired based on QMK without sources, just `via.json` provided. Ambiguous as to whether or not wireless firmware is based on QMK, given that their configuration tool looks very similar to VIA. | +| pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided | | qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | | Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. | From 5f711f04f163deaa4b781fc0ff5a13b6b81024c1 Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:06:29 +0700 Subject: [PATCH 153/592] [Keyboard] Add Support E8ghtyNeo (#24859) 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 * handle init e8ghtyneo firmware * Update qk boot firmware * Update firmware e8ghtyNeo * Update matrix * update manufacture * Update copyright --------- Co-authored-by: Trần Thanh Sơn Co-authored-by: Duncan Sutherland --- keyboards/trnthsn/e8ghtyneo/config.h | 23 + keyboards/trnthsn/e8ghtyneo/halconf.h | 21 + keyboards/trnthsn/e8ghtyneo/info.json | 992 ++++++++++++++++++ .../e8ghtyneo/keymaps/default/keymap.c | 39 + keyboards/trnthsn/e8ghtyneo/mcuconf.h | 22 + keyboards/trnthsn/e8ghtyneo/readme.md | 27 + .../trnthsn/e8ghtyneo/stm32f072/keyboard.json | 4 + .../trnthsn/e8ghtyneo/stm32f103/keyboard.json | 4 + 8 files changed, 1132 insertions(+) create mode 100644 keyboards/trnthsn/e8ghtyneo/config.h create mode 100644 keyboards/trnthsn/e8ghtyneo/halconf.h create mode 100644 keyboards/trnthsn/e8ghtyneo/info.json create mode 100644 keyboards/trnthsn/e8ghtyneo/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/e8ghtyneo/mcuconf.h create mode 100644 keyboards/trnthsn/e8ghtyneo/readme.md create mode 100644 keyboards/trnthsn/e8ghtyneo/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/e8ghtyneo/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/e8ghtyneo/config.h b/keyboards/trnthsn/e8ghtyneo/config.h new file mode 100644 index 0000000000..5e5c1eb155 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/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/e8ghtyneo/halconf.h b/keyboards/trnthsn/e8ghtyneo/halconf.h new file mode 100644 index 0000000000..75fea51332 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/halconf.h @@ -0,0 +1,21 @@ +/* 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/e8ghtyneo/info.json b/keyboards/trnthsn/e8ghtyneo/info.json new file mode 100644 index 0000000000..fef6259d24 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/info.json @@ -0,0 +1,992 @@ +{ + "manufacturer": "Tyson.Keebs", + "keyboard_name": "E8ghtyNeo", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["A9", "A8", "B14", "B12", "B11", "B10", "B0", "A7", "A6", "A4", "A3", "A2", "A1", "A0", "C13", "B9", "B7"], + "rows": ["B8", "A10", "B1", "A5", "C15", "C14"] + }, + "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_mood" + }, + "led_count": 4, + "sleep": true + }, + "ws2812": { + "pin": "B15", + "driver": "spi" + }, + "indicators": { + "caps_lock": "B3" + }, + "url": "", + "usb": { + "vid": "0x5453", + "pid": "0x3845", + "device_version": "0.0.1" + }, + "community_layouts": [ + "tkl_ansi_tsangan", + "tkl_ansi_tsangan_split_bs_rshift", + "tkl_iso_tsangan", + "tkl_iso_tsangan_split_bs_rshift" + ], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [0, 13], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "#", "matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 3.25, "w": 1.25}, + + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "\\", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [0, 13], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_ansi_wkl_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [0, 13], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_iso_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "#", "matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "\\", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Fn", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_iso_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [0, 13], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "#", "matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "\\", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "GUI", "matrix": [5, 1], "x": 1.5, "y": 5.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Fn", "matrix": [5, 12], "x": 12.5, "y": 5.25}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_iso_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "#", "matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "\\", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + }, + "LAYOUT_tkl_iso_wkl_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 12, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 13, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 14, "y": 0}, + + {"label": "Print Screen", "matrix": [0, 14], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [0, 15], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [0, 16], "x": 17.25, "y": 0}, + + {"label": "`", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "1", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "2", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "3", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "4", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "5", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "6", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "7", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "8", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "9", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": "0", "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": "Backspace", "matrix": [0, 13], "x": 13, "y": 1.25}, + {"label": "Delete", "matrix": [1, 13], "x": 14, "y": 1.25}, + + {"label": "Insert", "matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"label": "Home", "matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"label": "Page Up", "matrix": [1, 16], "x": 17.25, "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": "Delete", "matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"label": "End", "matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"label": "Page Down", "matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"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": "#", "matrix": [3, 12], "x": 12.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"label": "\\", "matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"label": "Z", "matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"label": ",", "matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"label": ".", "matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"label": "/", "matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Shift", "matrix": [4, 13], "x": 14, "y": 4.25}, + + {"label": "\u2191", "matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.5}, + {"label": "Space", "matrix": [5, 7], "x": 4, "y": 5.25, "w": 7}, + {"label": "Alt", "matrix": [5, 11], "x": 11, "y": 5.25, "w": 1.5}, + {"label": "Ctrl", "matrix": [5, 13], "x": 13.5, "y": 5.25, "w": 1.5}, + + {"label": "\u2190", "matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"label": "\u2193", "matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"label": "\u2192", "matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/trnthsn/e8ghtyneo/keymaps/default/keymap.c b/keyboards/trnthsn/e8ghtyneo/keymaps/default/keymap.c new file mode 100644 index 0000000000..31f1b5208a --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +// 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│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │Prs│Srk│Ps │ + // └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ + // ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐ + // │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Bsp│Bsp│ │Ins│Hm │PgU│ + // ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤ + // │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + // ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤ └───┴───┴───┘ + // │ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS, + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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_BSLS, 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_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT_all( + _______, _______, _______, _______, _______, UG_TOGG, _______, _______, _______, _______, UG_NEXT, UG_VALD, UG_VALU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_VOLD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/trnthsn/e8ghtyneo/mcuconf.h b/keyboards/trnthsn/e8ghtyneo/mcuconf.h new file mode 100644 index 0000000000..e96308a9a1 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/mcuconf.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 + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/trnthsn/e8ghtyneo/readme.md b/keyboards/trnthsn/e8ghtyneo/readme.md new file mode 100644 index 0000000000..7c7419e773 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/readme.md @@ -0,0 +1,27 @@ +# E8ghtyNeo + +![E8ghtyNeo](https://imgur.com/YXYfqzZ.png) + +A TKL keyboard PCB compatible with Neo80. Supports Neo80 keyboard like an out-of-the-box PCB without any modification. + +* Keyboard Maintainer: [Trnthsn](https://github.com/trnthsn) +* Hardware Supported: STM32, E8ghtyNeo, Neo80 +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/e8ghtyneo/stm32f072:default + +Flashing example for this keyboard: + + make trnthsn/e8ghtyneo/stm32f072: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/e8ghtyneo/stm32f072/keyboard.json b/keyboards/trnthsn/e8ghtyneo/stm32f072/keyboard.json new file mode 100644 index 0000000000..b5d728b1cd --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu", +} diff --git a/keyboards/trnthsn/e8ghtyneo/stm32f103/keyboard.json b/keyboards/trnthsn/e8ghtyneo/stm32f103/keyboard.json new file mode 100644 index 0000000000..5b2b6bc7d9 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot", +} From 291d154d7b13efb83f24c76df26277f32b9f0a58 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 26 Jan 2025 23:46:46 +1100 Subject: [PATCH 154/592] Unify UART headers (#24855) * Remove deprecated defines * Move default config to .c files * Unify UART headers * Clean up docs * Reorganise PAL mode defaults --- docs/drivers/uart.md | 26 +-- drivers/uart.h | 62 ++++++++ platforms/avr/drivers/uart.h | 39 ----- platforms/chibios/drivers/uart.h | 200 ------------------------ platforms/chibios/drivers/uart_serial.c | 83 ++++++++++ platforms/chibios/drivers/uart_sio.c | 67 ++++++++ 6 files changed, 225 insertions(+), 252 deletions(-) create mode 100644 drivers/uart.h delete mode 100644 platforms/avr/drivers/uart.h delete mode 100644 platforms/chibios/drivers/uart.h diff --git a/docs/drivers/uart.md b/docs/drivers/uart.md index 7cc68727ee..b895266cab 100644 --- a/docs/drivers/uart.md +++ b/docs/drivers/uart.md @@ -45,17 +45,17 @@ To enable UART, modify your board's `mcuconf.h` to enable the peripheral you've Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303. -| `config.h` override | Description | Default Value | -| --------------------------- | --------------------------------------------------------------- | ------------- | -| `#define UART_DRIVER` | USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc. | `SD1` | -| `#define UART_TX_PIN` | The pin to use for TX | `A9` | -| `#define UART_TX_PAL_MODE` | The alternate function mode for TX | `7` | -| `#define UART_RX_PIN` | The pin to use for RX | `A10` | -| `#define UART_RX_PAL_MODE` | The alternate function mode for RX | `7` | -| `#define UART_CTS_PIN` | The pin to use for CTS | `A11` | -| `#define UART_CTS_PAL_MODE` | The alternate function mode for CTS | `7` | -| `#define UART_RTS_PIN` | The pin to use for RTS | `A12` | -| `#define UART_RTS_PAL_MODE` | The alternate function mode for RTS | `7` | +|`config.h` Override|Description |Default| +|-------------------|---------------------------------------------------------------|-------| +|`UART_DRIVER` |USART peripheral to use - USART1 -> `SD1`, USART2 -> `SD2` etc.|`SD1` | +|`UART_TX_PIN` |The pin to use for TX |`A9` | +|`UART_TX_PAL_MODE` |The alternate function mode for TX |`7` | +|`UART_RX_PIN` |The pin to use for RX |`A10` | +|`UART_RX_PAL_MODE` |The alternate function mode for RX |`7` | +|`UART_CTS_PIN` |The pin to use for CTS |`A11` | +|`UART_CTS_PAL_MODE`|The alternate function mode for CTS |`7` | +|`UART_RTS_PIN` |The pin to use for RTS |`A12` | +|`UART_RTS_PAL_MODE`|The alternate function mode for RTS |`7` | ## API {#api} @@ -111,7 +111,7 @@ Receive multiple bytes. #### Arguments {#api-uart-receive-arguments} - `uint8_t *data` - A pointer to the buffer to read into. + A pointer to a buffer to read into. - `uint16_t length` The number of bytes to read. Take care not to overrun the length of `data`. @@ -123,4 +123,4 @@ Return whether the receive buffer contains data. Call this function to determine #### Return Value {#api-uart-available-return} -`true` if the receive buffer length is non-zero. +`true` if there is data available to read. diff --git a/drivers/uart.h b/drivers/uart.h new file mode 100644 index 0000000000..c5068c86e1 --- /dev/null +++ b/drivers/uart.h @@ -0,0 +1,62 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include + +/** + * \file + * + * \defgroup uart UART API + * + * \brief API to communicate with UART devices. + * \{ + */ + +/** + * \brief Initialize the UART driver. This function must be called only once, before any of the below functions can be called. + * + * \param baud The baud rate to transmit and receive at. This may depend on the device you are communicating with. Common values are 1200, 2400, 4800, 9600, 19200, 38400, 57600, and 115200. + */ +void uart_init(uint32_t baud); + +/** + * \brief Transmit a single byte. + * + * \param data The byte to write. + */ +void uart_write(uint8_t data); + +/** + * \brief Receive a single byte. + * + * \return The byte read from the receive buffer. This function will block if the buffer is empty (ie. no data to read). + */ +uint8_t uart_read(void); + +/** + * \brief Transmit multiple bytes. + * + * \param data A pointer to the data to write from. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + */ +void uart_transmit(const uint8_t *data, uint16_t length); + +/** + * \brief Receive multiple bytes. + * + * \param data A pointer to a buffer to read into. + * \param length The number of bytes to read. Take care not to overrun the length of `data`. + */ +void uart_receive(uint8_t *data, uint16_t length); + +/** + * \brief Return whether the receive buffer contains data. Call this function to determine if `uart_read()` will return data immediately. + * + * \return true if there is data available to read. + */ +bool uart_available(void); + +/** \} */ diff --git a/platforms/avr/drivers/uart.h b/platforms/avr/drivers/uart.h deleted file mode 100644 index e2dc664eda..0000000000 --- a/platforms/avr/drivers/uart.h +++ /dev/null @@ -1,39 +0,0 @@ -/* UART Example for Teensy USB Development Board - * http://www.pjrc.com/teensy/ - * Copyright (c) 2009 PJRC.COM, LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include -#include - -void uart_init(uint32_t baud); - -void uart_write(uint8_t data); - -uint8_t uart_read(void); - -void uart_transmit(const uint8_t *data, uint16_t length); - -void uart_receive(uint8_t *data, uint16_t length); - -bool uart_available(void); diff --git a/platforms/chibios/drivers/uart.h b/platforms/chibios/drivers/uart.h deleted file mode 100644 index c1945575f1..0000000000 --- a/platforms/chibios/drivers/uart.h +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2024 Stefan Kerkmann -// Copyright 2021 QMK -// Copyright 2024 Stefan Kerkmann -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include - -#include "gpio.h" -#include "chibios_config.h" - -// ======== DEPRECATED DEFINES - DO NOT USE ======== -#ifdef SERIAL_DRIVER -# define UART_DRIVER SERIAL_DRIVER -#endif -#ifdef SD1_TX_PIN -# define UART_TX_PIN SD1_TX_PIN -#endif -#ifdef SD1_RX_PIN -# define UART_RX_PIN SD1_RX_PIN -#endif -#ifdef SD1_CTS_PIN -# define UART_CTS_PIN SD1_CTS_PIN -#endif -#ifdef SD1_RTS_PIN -# define UART_RTS_PIN SD1_RTS_PIN -#endif -#ifdef SD1_TX_PAL_MODE -# define UART_TX_PAL_MODE SD1_TX_PAL_MODE -#endif -#ifdef SD1_RX_PAL_MODE -# define UART_RX_PAL_MODE SD1_RX_PAL_MODE -#endif -#ifdef SD1_CTS_PAL_MODE -# define UART_RTS_PAL_MODE SD1_CTS_PAL_MODE -#endif -#ifdef SD1_RTS_PAL_MODE -# define UART_TX_PAL_MODE SD1_RTS_PAL_MODE -#endif -#ifdef SD1_CR1 -# define UART_CR1 SD1_CR1 -#endif -#ifdef SD1_CR2 -# define UART_CR2 SD1_CR2 -#endif -#ifdef SD1_CR3 -# define UART_CR3 SD1_CR3 -#endif -#ifdef SD1_WRDLEN -# define UART_WRDLEN SD1_WRDLEN -#endif -#ifdef SD1_STPBIT -# define UART_STPBIT SD1_STPBIT -#endif -#ifdef SD1_PARITY -# define UART_PARITY SD1_PARITY -#endif -#ifdef SD1_ATFLCT -# define UART_ATFLCT SD1_ATFLCT -#endif -// ======== - -#ifndef UART_DRIVER -# if (HAL_USE_SERIAL == TRUE) -# define UART_DRIVER SD1 -# elif (HAL_USE_SIO == TRUE) -# define UART_DRIVER SIOD1 -# endif -#endif - -#ifndef UART_TX_PIN -# define UART_TX_PIN A9 -#endif - -#ifndef UART_RX_PIN -# define UART_RX_PIN A10 -#endif - -#ifndef UART_CTS_PIN -# define UART_CTS_PIN A11 -#endif - -#ifndef UART_RTS_PIN -# define UART_RTS_PIN A12 -#endif - -#ifdef USE_GPIOV1 -# ifndef UART_TX_PAL_MODE -# define UART_TX_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL -# endif -# ifndef UART_RX_PAL_MODE -# define UART_RX_PAL_MODE PAL_MODE_INPUT -# endif -# ifndef UART_CTS_PAL_MODE -# define UART_CTS_PAL_MODE PAL_MODE_INPUT -# endif -# ifndef UART_RTS_PAL_MODE -# define UART_RTS_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL -# endif -#else -# ifndef UART_TX_PAL_MODE -# define UART_TX_PAL_MODE 7 -# endif - -# ifndef UART_RX_PAL_MODE -# define UART_RX_PAL_MODE 7 -# endif - -# ifndef UART_CTS_PAL_MODE -# define UART_CTS_PAL_MODE 7 -# endif - -# ifndef UART_RTS_PAL_MODE -# define UART_RTS_PAL_MODE 7 -# endif -#endif - -#ifndef UART_CR1 -# define UART_CR1 0 -#endif - -#ifndef UART_CR2 -# define UART_CR2 0 -#endif - -#ifndef UART_CR3 -# define UART_CR3 0 -#endif - -#ifndef UART_WRDLEN -# define UART_WRDLEN 3 -#endif - -#ifndef UART_STPBIT -# define UART_STPBIT 0 -#endif - -#ifndef UART_PARITY -# define UART_PARITY 0 -#endif - -#ifndef UART_ATFLCT -# define UART_ATFLCT 0 -#endif - -/** - * @brief Initialize the UART driver. This function must be called only once, - * before any of the below functions can be called. - * - * @param baud The baud rate to transmit and receive at. This may depend on the - * device you are communicating with. Common values are 1200, 2400, 4800, 9600, - * 19200, 38400, 57600, and 115200. - */ -void uart_init(uint32_t baud); - -/** - * @brief Transmit a single byte. - * - * @param data The byte to transmit. - */ -void uart_write(uint8_t data); - -/** - * @brief Receive a single byte. - * - * @return uint8_t The byte read from the receive buffer. This function will - * block if the buffer is empty (ie. no data to read). - */ -uint8_t uart_read(void); - -/** - * @brief Transmit multiple bytes. - * - * @param data A pointer to the data to write from. - * @param length The number of bytes to write. Take care not to overrun the - * length of `data`. - */ -void uart_transmit(const uint8_t *data, uint16_t length); - -/** - * @brief Receive multiple bytes. - * - * @param data A pointer to the buffer to read into. - * @param length The number of bytes to read. Take care not to overrun the - * length of `data`. - */ -void uart_receive(uint8_t *data, uint16_t length); - -/** - * @brief Return whether the receive buffer contains data. Call this function - * to determine if `uart_read()` will return data immediately. - * - * @return true If there is data available to read. - * @return false If there is no data available to read. - */ -bool uart_available(void); diff --git a/platforms/chibios/drivers/uart_serial.c b/platforms/chibios/drivers/uart_serial.c index 6aff4eae47..e0afb9768a 100644 --- a/platforms/chibios/drivers/uart_serial.c +++ b/platforms/chibios/drivers/uart_serial.c @@ -3,6 +3,89 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "uart.h" +#include "gpio.h" +#include "chibios_config.h" +#include + +#ifndef UART_DRIVER +# define UART_DRIVER SD1 +#endif + +#ifndef UART_TX_PIN +# define UART_TX_PIN A9 +#endif + +#ifndef UART_TX_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_TX_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define UART_TX_PAL_MODE 7 +# endif +#endif + +#ifndef UART_RX_PIN +# define UART_RX_PIN A10 +#endif + +#ifndef UART_RX_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_RX_PAL_MODE PAL_MODE_INPUT +# else +# define UART_RX_PAL_MODE 7 +# endif +#endif + +#ifndef UART_CTS_PIN +# define UART_CTS_PIN A11 +#endif + +#ifndef UART_CTS_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_CTS_PAL_MODE PAL_MODE_INPUT +# else +# define UART_CTS_PAL_MODE 7 +# endif +#endif + +#ifndef UART_RTS_PIN +# define UART_RTS_PIN A12 +#endif + +#ifndef UART_RTS_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_RTS_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define UART_RTS_PAL_MODE 7 +# endif +#endif + +#ifndef UART_CR1 +# define UART_CR1 0 +#endif + +#ifndef UART_CR2 +# define UART_CR2 0 +#endif + +#ifndef UART_CR3 +# define UART_CR3 0 +#endif + +#ifndef UART_WRDLEN +# define UART_WRDLEN 3 +#endif + +#ifndef UART_STPBIT +# define UART_STPBIT 0 +#endif + +#ifndef UART_PARITY +# define UART_PARITY 0 +#endif + +#ifndef UART_ATFLCT +# define UART_ATFLCT 0 +#endif #if defined(MCU_KINETIS) static SerialConfig serialConfig = {SERIAL_DEFAULT_BITRATE}; diff --git a/platforms/chibios/drivers/uart_sio.c b/platforms/chibios/drivers/uart_sio.c index 442df1c54d..fc12f0abed 100644 --- a/platforms/chibios/drivers/uart_sio.c +++ b/platforms/chibios/drivers/uart_sio.c @@ -3,6 +3,73 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "uart.h" +#include "gpio.h" +#include "chibios_config.h" +#include + +#ifndef UART_DRIVER +# define UART_DRIVER SIOD1 +#endif + +#ifndef UART_TX_PIN +# define UART_TX_PIN A9 +#endif + +#ifndef UART_TX_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_TX_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define UART_TX_PAL_MODE 7 +# endif +#endif + +#ifndef UART_RX_PIN +# define UART_RX_PIN A10 +#endif + +#ifndef UART_RX_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_RX_PAL_MODE PAL_MODE_INPUT +# else +# define UART_RX_PAL_MODE 7 +# endif +#endif + +#ifndef UART_CTS_PIN +# define UART_CTS_PIN A11 +#endif + +#ifndef UART_CTS_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_CTS_PAL_MODE PAL_MODE_INPUT +# else +# define UART_CTS_PAL_MODE 7 +# endif +#endif + +#ifndef UART_RTS_PIN +# define UART_RTS_PIN A12 +#endif + +#ifndef UART_RTS_PAL_MODE +# ifdef USE_GPIOV1 +# define UART_RTS_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define UART_RTS_PAL_MODE 7 +# endif +#endif + +#ifndef UART_CR1 +# define UART_CR1 0 +#endif + +#ifndef UART_CR2 +# define UART_CR2 0 +#endif + +#ifndef UART_CR3 +# define UART_CR3 0 +#endif #if defined(MCU_RP) // 38400 baud, 8 data bits, 1 stop bit, no parity, no flow control From ef29a46c87e3a82459b3af4158f7888d55c0b22b Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 26 Jan 2025 23:48:46 +1100 Subject: [PATCH 155/592] Unify i2c_master headers (#24846) * Unify i2c_master headers * More documentation improvements * Reorganise PAL mode defaults --- docs/drivers/i2c.md | 94 +++++++++++------ drivers/i2c_master.h | 141 +++++++++++++++++++++++++ platforms/avr/drivers/i2c_master.h | 41 ------- platforms/chibios/drivers/i2c_master.c | 43 ++++---- platforms/chibios/drivers/i2c_master.h | 42 -------- 5 files changed, 225 insertions(+), 136 deletions(-) create mode 100644 drivers/i2c_master.h delete mode 100644 platforms/avr/drivers/i2c_master.h delete mode 100644 platforms/chibios/drivers/i2c_master.h diff --git a/docs/drivers/i2c.md b/docs/drivers/i2c.md index 2ef7afccc9..ad74d0e481 100644 --- a/docs/drivers/i2c.md +++ b/docs/drivers/i2c.md @@ -16,17 +16,22 @@ You can then call the I2C API by including `i2c_master.h` in your code. ## I2C Addressing {#note-on-i2c-addresses} -All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting -the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed -on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be -shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`. +I2C addresses listed on datasheets and the internet are usually represented as a 7-bit value. The eighth bit (the least significant bit) controls whether the operation is a read or a write. -You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`: +All of the address parameters expected by the driver API should therefore be pushed to the upper 7 bits of the address byte; the driver will take care of setting the read/write bit as appropriate. + +This is easy to do via the bitwise left shift operator. For example, if your device has an address of `0x18` you might create a define for convenience: ```c #define MY_I2C_ADDRESS (0x18 << 1) ``` +Or, you can shift the address ahead of time: + +```c +#define MY_I2C_ADDRESS 0x30 +``` + See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details. ## AVR Configuration {#avr-configuration} @@ -39,12 +44,12 @@ The following defines can be used to configure the I2C master driver: No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU: -|MCU |`SCL`|`SDA`| -|------------------|-----|-----| -|ATmega16/32U4 |`D0` |`D1` | -|AT90USB64/128 |`D0` |`D1` | -|ATmega32A |`C0` |`C1` | -|ATmega328/P |`C5` |`C4` | +|MCU |`SCL`|`SDA`| +|-------------|-----|-----| +|ATmega16/32U4|`D0` |`D1` | +|AT90USB64/128|`D0` |`D1` | +|ATmega32A |`C0` |`C1` | +|ATmega328/P |`C5` |`C4` | ::: tip The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver. @@ -52,7 +57,7 @@ The ATmega16/32U2 does not possess I2C functionality, and so cannot use this dri ## ChibiOS/ARM Configuration {#arm-configuration} -You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc. +You'll need to determine which pins can be used for I2C -- as an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc. To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your board's `mcuconf.h` to enable the peripheral you've chosen: @@ -83,15 +88,19 @@ To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your b Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303. -|`config.h` Overrride |Description |Default| -|------------------------|--------------------------------------------------------------|-------| -|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`| -|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` | -|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` | -|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` | -|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` | +|`config.h` Override|Description |Default| +|-------------------|-------------------------------------------------------------|-------| +|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc.|`I2CD1`| +|`I2C1_SCL_PIN` |The pin to use for SCL |`B6` | +|`I2C1_SCL_PAL_MODE`|The alternate function mode for SCL |`4` | +|`I2C1_SDA_PIN` |The pin to use for SDA |`B7` | +|`I2C1_SDA_PAL_MODE`|The alternate function mode for SDA |`4` | -The following configuration values depend on the specific MCU in use. +::: tip +Currently only a single I2C peripheral is supported, therefore the `I2C1_*` defines are used for configuration regardless of the selected peripheral. +::: + +The following configuration values are dependent on the ChibiOS I2C LLD, which is dictated by the microcontroller. ### I2Cv1 {#arm-configuration-i2cv1} @@ -158,7 +167,7 @@ Send multiple bytes to the selected I2C device. - `const uint8_t* data` A pointer to the data to transmit. - `uint16_t length` - The number of bytes to write. Take care not to overrun the length of `data`. + The number of bytes to write. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -168,6 +177,29 @@ Send multiple bytes to the selected I2C device. --- +### `i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit-p} + +Send multiple bytes from PROGMEM to the selected I2C device. + +On ARM devices, this function is simply an alias for `i2c_transmit(address, data, length, timeout)`. + +#### Arguments {#api-i2c-transmit-p-arguments} + + - `uint8_t address` + The 7-bit I2C address of the device. + - `const uint8_t* data` + A pointer to the data to transmit. + - `uint16_t length` + The number of bytes to write. Take care not to overrun the length of `data`. + - `uint16_t timeout` + The time in milliseconds to wait for a response from the target device. + +#### Return Value {#api-i2c-transmit-p-return} + +`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + +--- + ### `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-receive} Receive multiple bytes from the selected I2C device. @@ -177,9 +209,9 @@ Receive multiple bytes from the selected I2C device. - `uint8_t address` The 7-bit I2C address of the device. - `uint8_t* data` - A pointer to the buffer to read into. + A pointer to a buffer to read into. - `uint16_t length` - The number of bytes to read. Take care not to overrun the length of `data`. + The number of bytes to read. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -191,7 +223,7 @@ Receive multiple bytes from the selected I2C device. ### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register} -Writes to a register with an 8-bit address on the I2C device. +Write to a register with an 8-bit address on the I2C device. #### Arguments {#api-i2c-write-register-arguments} @@ -202,7 +234,7 @@ Writes to a register with an 8-bit address on the I2C device. - `const uint8_t* data` A pointer to the data to transmit. - `uint16_t length` - The number of bytes to write. Take care not to overrun the length of `data`. + The number of bytes to write. Take care not to overrun the length of `data`. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. @@ -214,7 +246,7 @@ Writes to a register with an 8-bit address on the I2C device. ### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16} -Writes to a register with a 16-bit address (big endian) on the I2C device. +Write to a register with a 16-bit address (big endian) on the I2C device. #### Arguments {#api-i2c-write-register16-arguments} @@ -237,7 +269,7 @@ Writes to a register with a 16-bit address (big endian) on the I2C device. ### `i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register} -Reads from a register with an 8-bit address on the I2C device. +Read from a register with an 8-bit address on the I2C device. #### Arguments {#api-i2c-read-register-arguments} @@ -260,7 +292,7 @@ Reads from a register with an 8-bit address on the I2C device. ### `i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register16} -Reads from a register with a 16-bit address (big endian) on the I2C device. +Read from a register with a 16-bit address (big endian) on the I2C device. #### Arguments {#api-i2c-read-register16-arguments} @@ -283,16 +315,16 @@ Reads from a register with a 16-bit address (big endian) on the I2C device. ### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address} -Pings the I2C bus for a specific address. +Ping the I2C bus for a specific address. -On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt). +On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the given address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt). This function is weakly defined, meaning it can be overridden if necessary for your particular use case. #### Arguments {#api-i2c-ping-address-arguments} - `uint8_t address` - The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically). + The 7-bit I2C address of the device. - `uint16_t timeout` The time in milliseconds to wait for a response from the target device. diff --git a/drivers/i2c_master.h b/drivers/i2c_master.h new file mode 100644 index 0000000000..dbe1cd42fa --- /dev/null +++ b/drivers/i2c_master.h @@ -0,0 +1,141 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +/** + * \file + * + * \defgroup i2c_master I2C Master API + * + * \brief API to communicate with I2C devices. + * \{ + */ + +typedef int16_t i2c_status_t; + +#define I2C_STATUS_SUCCESS (0) +#define I2C_STATUS_ERROR (-1) +#define I2C_STATUS_TIMEOUT (-2) + +#define I2C_TIMEOUT_IMMEDIATE (0) +#define I2C_TIMEOUT_INFINITE (0xFFFF) + +/** + * \brief Initialize the I2C driver. This function must be called only once, before any of the below functions can be called. + * + * This function is weakly defined, meaning it can be overridden if necessary for your particular use case. + */ +void i2c_init(void); + +/** + * \brief Send multiple bytes to the selected I2C device. + * + * \param address The 7-bit I2C address of the device. + * \param data A pointer to the data to transmit. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); + +#if defined(__AVR__) || defined(__DOXYGEN__) +/** + * \brief Send multiple bytes from PROGMEM to the selected I2C device. + * + * On ARM devices, this function is simply an alias for i2c_transmit(address, data, length, timeout). + * + * \param address The 7-bit I2C address of the device. + * \param data A pointer to the data to transmit. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); +#else +# define i2c_transmit_P(address, data, length, timeout) i2c_transmit(address, data, length, timeout) +#endif + +/** + * \brief Receive multiple bytes from the selected I2C device. + * + * \param address The 7-bit I2C address of the device. + * \param data A pointer to a buffer to read into. + * \param length The number of bytes to read. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); + +/** + * \brief Write to a register with an 8-bit address on the I2C device. + * + * \param devaddr The 7-bit I2C address of the device. + * \param regaddr The register address to write to. + * \param data A pointer to the data to transmit. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); + +/** + * \brief Write to a register with a 16-bit address (big endian) on the I2C device. + * + * \param devaddr The 7-bit I2C address of the device. + * \param regaddr The register address to write to. + * \param data A pointer to the data to transmit. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); + +/** + * \brief Read from a register with an 8-bit address on the I2C device. + * + * \param devaddr The 7-bit I2C address of the device. + * \param regaddr The register address to read from. + * \param data A pointer to a buffer to read into. + * \param length The number of bytes to read. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); + +/** + * \brief Read from a register with a 16-bit address (big endian) on the I2C device. + * + * \param devaddr The 7-bit I2C address of the device. + * \param regaddr The register address to read from. + * \param data A pointer to a buffer to read into. + * \param length The number of bytes to read. Take care not to overrun the length of `data`. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); + +/** + * \brief Ping the I2C bus for a specific address. + * + * On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the given address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsuccessful response to ping attempt). + * + * This function is weakly defined, meaning it can be overridden if necessary for your particular use case. + * + * \param address The 7-bit I2C address of the device. + * \param timeout The time in milliseconds to wait for a response from the target device. + * + * \return `I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`. + */ +i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout); + +/** \} */ diff --git a/platforms/avr/drivers/i2c_master.h b/platforms/avr/drivers/i2c_master.h deleted file mode 100644 index ad92caa55a..0000000000 --- a/platforms/avr/drivers/i2c_master.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2019 Elia Ritterbusch - + - * 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 . - */ -/* Library made by: g4lvanix - * GitHub repository: https://github.com/g4lvanix/I2C-master-lib - */ - -#pragma once - -#include - -typedef int16_t i2c_status_t; - -#define I2C_STATUS_SUCCESS (0) -#define I2C_STATUS_ERROR (-1) -#define I2C_STATUS_TIMEOUT (-2) - -#define I2C_TIMEOUT_IMMEDIATE (0) -#define I2C_TIMEOUT_INFINITE (0xFFFF) - -void i2c_init(void); -i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_transmit_P(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout); diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c index 0d5fb1e985..1d7fe27633 100644 --- a/platforms/chibios/drivers/i2c_master.c +++ b/platforms/chibios/drivers/i2c_master.c @@ -29,17 +29,37 @@ #include "i2c_master.h" #include "gpio.h" #include "chibios_config.h" -#include #include #include +#ifndef I2C_DRIVER +# define I2C_DRIVER I2CD1 +#endif + #ifndef I2C1_SCL_PIN # define I2C1_SCL_PIN B6 #endif + +#ifndef I2C1_SCL_PAL_MODE +# ifdef USE_GPIOV1 +# define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN +# else +# define I2C1_SCL_PAL_MODE 4 +# endif +#endif + #ifndef I2C1_SDA_PIN # define I2C1_SDA_PIN B7 #endif +#ifndef I2C1_SDA_PAL_MODE +# ifdef USE_GPIOV1 +# define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN +# else +# define I2C1_SDA_PAL_MODE 4 +# endif +#endif + #ifdef USE_I2CV1 # ifndef I2C1_OPMODE # define I2C1_OPMODE OPMODE_I2C @@ -70,27 +90,6 @@ # endif #endif -#ifndef I2C_DRIVER -# define I2C_DRIVER I2CD1 -#endif - -#ifdef USE_GPIOV1 -# ifndef I2C1_SCL_PAL_MODE -# define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN -# endif -# ifndef I2C1_SDA_PAL_MODE -# define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN -# endif -#else -// The default PAL alternate modes are used to signal that the pins are used for I2C -# ifndef I2C1_SCL_PAL_MODE -# define I2C1_SCL_PAL_MODE 4 -# endif -# ifndef I2C1_SDA_PAL_MODE -# define I2C1_SDA_PAL_MODE 4 -# endif -#endif - static const I2CConfig i2cconfig = { #if defined(USE_I2CV1_CONTRIB) I2C1_CLOCK_SPEED, diff --git a/platforms/chibios/drivers/i2c_master.h b/platforms/chibios/drivers/i2c_master.h deleted file mode 100644 index 2215f89ad2..0000000000 --- a/platforms/chibios/drivers/i2c_master.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright 2018 Jack Humbert - * Copyright 2018 Yiancar - * - * 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 . - */ - -/* This library follows the convention of the AVR i2c_master library. - * As a result addresses are expected to be already shifted (addr << 1). - * I2CD1 is the default driver which corresponds to pins B6 and B7. This - * can be changed. - * Please ensure that HAL_USE_I2C is TRUE in the halconf.h file and that - * STM32_I2C_USE_I2C1 is TRUE in the mcuconf.h file. - */ -#pragma once - -#include - -typedef int16_t i2c_status_t; - -#define I2C_STATUS_SUCCESS (0) -#define I2C_STATUS_ERROR (-1) -#define I2C_STATUS_TIMEOUT (-2) - -void i2c_init(void); -i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout); -i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout); From 04c2dbd3dfa23bf6fdffa35ae53cf66aa3f33fba Mon Sep 17 00:00:00 2001 From: Mick Hohmann Date: Sun, 26 Jan 2025 17:25:15 +0100 Subject: [PATCH 156/592] Add keyboard clap_studio/flame60 (#24870) - Got the source code from the _Clap_Studio_ Discord server - Migrated the source code to `keyboard.json` format - Added more layouts for most common cases - Fixed errors in `keymaps/default/keymap.c` - Updated the picture with a real picture of the PCB, to avoid confusion --- keyboards/clap_studio/flame60/keyboard.json | 663 ++++++++++++++++++ .../flame60/keymaps/default/keymap.c | 35 + keyboards/clap_studio/flame60/readme.md | 27 + 3 files changed, 725 insertions(+) create mode 100644 keyboards/clap_studio/flame60/keyboard.json create mode 100644 keyboards/clap_studio/flame60/keymaps/default/keymap.c create mode 100644 keyboards/clap_studio/flame60/readme.md diff --git a/keyboards/clap_studio/flame60/keyboard.json b/keyboards/clap_studio/flame60/keyboard.json new file mode 100644 index 0000000000..7f6b9014ae --- /dev/null +++ b/keyboards/clap_studio/flame60/keyboard.json @@ -0,0 +1,663 @@ +{ + "manufacturer": "Clap_Studio", + "keyboard_name": "Flame60", + "maintainer": "Freather", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["B0", "B1", "B2", "B3", "B7", "D3", "D2", "D1", "D0", "B5", "B4", "D7", "D6", "D4"], + "rows": ["F4", "F1", "D5", "B6", "F5"] + }, + "processor": "atmega32u4", + "url": "https://www.instagram.com/clap__studio__/", + "usb": { + "device_version": "1.0.0", + "pid": "0x464C", + "vid": "0x434C" + }, + "layout_aliases": { + "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [1, 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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 1], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [1, 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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 1], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 1], "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, 6], "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_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [1, 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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 1], "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, 6], "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": { + "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": [2, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [1, 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": [2, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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": [2, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 12], "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, 6], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [1, 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": [2, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 12], "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, 6], "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} + ] + } + } +} diff --git a/keyboards/clap_studio/flame60/keymaps/default/keymap.c b/keyboards/clap_studio/flame60/keymaps/default/keymap.c new file mode 100644 index 0000000000..bbf725d3b0 --- /dev/null +++ b/keyboards/clap_studio/flame60/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │Ctrl│GUI │Alt │ │ Alt│ GUI│ Fn │Ctrl│ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ + */ + [0] = LAYOUT_60_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_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, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL + ), + + [1] = LAYOUT_60_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/clap_studio/flame60/readme.md b/keyboards/clap_studio/flame60/readme.md new file mode 100644 index 0000000000..9e1c6a1163 --- /dev/null +++ b/keyboards/clap_studio/flame60/readme.md @@ -0,0 +1,27 @@ +# Flame60 + +![Flame60 PCB](https://i.imgur.com/vdOxw3j.jpeg) + +The Flame60 consists of a screwless exterior, flex cut pcb and plate to ensure a soft typing experience. + +* Keyboard Maintainer: [CMM.Studio Freather](https://github.com/frankBTHID) +* Hardware Supported: Atmega32u4 +* Hardware Availability: [CLAP.STUDIO (Instagram)](https://www.instagram.com/clap__studio__/) + +Make example for this keyboard (after setting up your build environment): + + make clap_studio/flame60:default + +Flashing example for this keyboard: + + make clap_studio/flame60: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 ee63d39058deee162b794c62d7180d61f540914a Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 27 Jan 2025 08:37:37 +1100 Subject: [PATCH 157/592] Unify spi_master headers (#24857) * Move default config to .c file * Explicitly define PAL modes for boards with custom init * Unify spi_master headers --- docs/drivers/spi.md | 8 +- drivers/spi_master.h | 116 ++++++++++++++++++ .../darkproject/kd83a_bfg_edition/config.h | 3 + .../darkproject/kd87a_bfg_edition/config.h | 3 + keyboards/gmmk/gmmk2/p96/config.h | 3 + keyboards/jukaie/jk01/config.h | 3 + .../projectd/65/projectd_65_ansi/config.h | 3 + keyboards/projectd/75/ansi/config.h | 3 + keyboards/projectd/75/iso/config.h | 3 + platforms/avr/drivers/spi_master.h | 68 ---------- platforms/chibios/drivers/spi_master.c | 43 ++++++- platforms/chibios/drivers/spi_master.h | 102 --------------- 12 files changed, 183 insertions(+), 175 deletions(-) create mode 100644 drivers/spi_master.h delete mode 100644 platforms/avr/drivers/spi_master.h delete mode 100644 platforms/chibios/drivers/spi_master.h diff --git a/docs/drivers/spi.md b/docs/drivers/spi.md index 43d2a056d5..140b204945 100644 --- a/docs/drivers/spi.md +++ b/docs/drivers/spi.md @@ -88,7 +88,7 @@ Start an SPI transaction. #### Arguments {#api-spi-start-arguments} - `pin_t slavePin` - The QMK pin to assert as the slave select pin, eg. `B4`. + The GPIO pin connected to the desired device's `SS` line. - `bool lsbFirst` Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first. - `uint8_t mode` @@ -106,7 +106,7 @@ Start an SPI transaction. #### Return Value {#api-spi-start-return} -`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`. +`true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use. --- @@ -131,7 +131,7 @@ Read a byte from the selected SPI device. #### Return Value {#api-spi-read-return} -`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device. +`SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device. --- @@ -159,7 +159,7 @@ Receive multiple bytes from the selected SPI device. #### Arguments {#api-spi-receive-arguments} - `uint8_t *data` - A pointer to the buffer to read into. + A pointer to a buffer to read into. - `uint16_t length` The number of bytes to read. Take care not to overrun the length of `data`. diff --git a/drivers/spi_master.h b/drivers/spi_master.h new file mode 100644 index 0000000000..d206b812bf --- /dev/null +++ b/drivers/spi_master.h @@ -0,0 +1,116 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "gpio.h" + +/** + * \file + * + * \defgroup spi_master SPI Master API + * + * \brief API to communicate with SPI devices. + * \{ + */ + +// Hardware SS pin is defined in the header so that user code can refer to it +#ifdef __AVR__ +# if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) +# define SPI_SS_PIN B0 +# elif defined(__AVR_ATmega32A__) +# define SPI_SS_PIN B4 +# elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) +# define SPI_SS_PIN B2 +# endif +#endif + +typedef int16_t spi_status_t; + +#define SPI_STATUS_SUCCESS (0) +#define SPI_STATUS_ERROR (-1) +#define SPI_STATUS_TIMEOUT (-2) + +#define SPI_TIMEOUT_IMMEDIATE (0) +#define SPI_TIMEOUT_INFINITE (0xFFFF) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct spi_start_config_t { + pin_t slave_pin; + bool lsb_first; + uint8_t mode; + uint16_t divisor; + bool cs_active_low; +} spi_start_config_t; + +/** + * \brief Initialize the SPI driver. This function must be called only once, before any of the below functions can be called. + */ +void spi_init(void); + +/** + * \brief Start an SPI transaction. + * + * \param slavePin The GPIO pin connected to the desired device's `SS` line. + * \param lsbFirst Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first. + * \param mode The SPI mode to use. + * \param divisor The SPI clock divisor. + * + * \return `true` if the operation was successful, otherwise `false` if the supplied parameters are invalid or the SPI peripheral is already in use. + */ +bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor); + +bool spi_start_extended(spi_start_config_t *start_config); + +/** + * \brief Write a byte to the selected SPI device. + * + * \param data The byte to write. + * + * \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, or `SPI_STATUS_SUCCESS`. + */ +spi_status_t spi_write(uint8_t data); + +/** + * \brief Read a byte from the selected SPI device. + * + * \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, otherwise the byte read from the device. + */ +spi_status_t spi_read(void); + +/** + * \brief Send multiple bytes to the selected SPI device. + * + * \param data A pointer to the data to write from. + * \param length The number of bytes to write. Take care not to overrun the length of `data`. + * + * \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`. + */ +spi_status_t spi_transmit(const uint8_t *data, uint16_t length); + +/** + * \brief Receive multiple bytes from the selected SPI device. + * + * \param data A pointer to a buffer to read into. + * \param length The number of bytes to read. Take care not to overrun the length of `data`. + * + * \return `SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_ERROR` if some other error occurs, otherwise `SPI_STATUS_SUCCESS`. + */ +spi_status_t spi_receive(uint8_t *data, uint16_t length); + +/** + * \brief End the current SPI transaction. This will deassert the slave select pin and reset the endianness, mode and divisor configured by `spi_start()`. + * + */ +void spi_stop(void); + +#ifdef __cplusplus +} +#endif + +/** \} */ diff --git a/keyboards/darkproject/kd83a_bfg_edition/config.h b/keyboards/darkproject/kd83a_bfg_edition/config.h index 880aabd5d7..fce00d29ab 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/config.h +++ b/keyboards/darkproject/kd83a_bfg_edition/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/keyboards/darkproject/kd87a_bfg_edition/config.h b/keyboards/darkproject/kd87a_bfg_edition/config.h index a32f712231..9e68844daf 100644 --- a/keyboards/darkproject/kd87a_bfg_edition/config.h +++ b/keyboards/darkproject/kd87a_bfg_edition/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/keyboards/gmmk/gmmk2/p96/config.h b/keyboards/gmmk/gmmk2/p96/config.h index 1b246e4f3f..852d29df65 100644 --- a/keyboards/gmmk/gmmk2/p96/config.h +++ b/keyboards/gmmk/gmmk2/p96/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/keyboards/jukaie/jk01/config.h b/keyboards/jukaie/jk01/config.h index d8dfb9f535..41534ce6c4 100644 --- a/keyboards/jukaie/jk01/config.h +++ b/keyboards/jukaie/jk01/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/keyboards/projectd/65/projectd_65_ansi/config.h b/keyboards/projectd/65/projectd_65_ansi/config.h index c8da5c42a7..6e23afc902 100644 --- a/keyboards/projectd/65/projectd_65_ansi/config.h +++ b/keyboards/projectd/65/projectd_65_ansi/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_EN_PIN C13 diff --git a/keyboards/projectd/75/ansi/config.h b/keyboards/projectd/75/ansi/config.h index 282e20a8e2..acbe853949 100644 --- a/keyboards/projectd/75/ansi/config.h +++ b/keyboards/projectd/75/ansi/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/keyboards/projectd/75/iso/config.h b/keyboards/projectd/75/iso/config.h index 282e20a8e2..acbe853949 100644 --- a/keyboards/projectd/75/iso/config.h +++ b/keyboards/projectd/75/iso/config.h @@ -22,8 +22,11 @@ /* SPI Config for LED Driver */ #define SPI_DRIVER SPIDQ #define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 #define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 #define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 #define AW20216S_CS_PIN_1 A15 #define AW20216S_CS_PIN_2 B15 diff --git a/platforms/avr/drivers/spi_master.h b/platforms/avr/drivers/spi_master.h deleted file mode 100644 index ebbf7ddeab..0000000000 --- a/platforms/avr/drivers/spi_master.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright 2020 - * - * 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 - -#include "gpio.h" - -typedef int16_t spi_status_t; - -// Hardware SS pin is defined in the header so that user code can refer to it -#if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) -# define SPI_SS_PIN B0 -#elif defined(__AVR_ATmega32A__) -# define SPI_SS_PIN B4 -#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) -# define SPI_SS_PIN B2 -#endif - -#define SPI_STATUS_SUCCESS (0) -#define SPI_STATUS_ERROR (-1) -#define SPI_STATUS_TIMEOUT (-2) - -#define SPI_TIMEOUT_IMMEDIATE (0) -#define SPI_TIMEOUT_INFINITE (0xFFFF) - -#ifdef __cplusplus -extern "C" { -#endif -typedef struct spi_start_config_t { - pin_t slave_pin; - bool lsb_first; - uint8_t mode; - uint16_t divisor; - bool cs_active_low; -} spi_start_config_t; - -void spi_init(void); - -bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor); -bool spi_start_extended(spi_start_config_t *start_config); - -spi_status_t spi_write(uint8_t data); - -spi_status_t spi_read(void); - -spi_status_t spi_transmit(const uint8_t *data, uint16_t length); - -spi_status_t spi_receive(uint8_t *data, uint16_t length); - -void spi_stop(void); -#ifdef __cplusplus -} -#endif diff --git a/platforms/chibios/drivers/spi_master.c b/platforms/chibios/drivers/spi_master.c index 414e5b10a3..f5e48edfda 100644 --- a/platforms/chibios/drivers/spi_master.c +++ b/platforms/chibios/drivers/spi_master.c @@ -15,8 +15,49 @@ */ #include "spi_master.h" +#include "chibios_config.h" +#include +#include -#include "timer.h" +#ifndef SPI_DRIVER +# define SPI_DRIVER SPID2 +#endif + +#ifndef SPI_SCK_PIN +# define SPI_SCK_PIN B13 +#endif + +#ifndef SPI_SCK_PAL_MODE +# ifdef USE_GPIOV1 +# define SPI_SCK_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define SPI_SCK_PAL_MODE 5 +# endif +#endif + +#ifndef SPI_MOSI_PIN +# define SPI_MOSI_PIN B15 +#endif + +#ifndef SPI_MOSI_PAL_MODE +# ifdef USE_GPIOV1 +# define SPI_MOSI_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define SPI_MOSI_PAL_MODE 5 +# endif +#endif + +#ifndef SPI_MISO_PIN +# define SPI_MISO_PIN B14 +#endif + +#ifndef SPI_MISO_PAL_MODE +# ifdef USE_GPIOV1 +# define SPI_MISO_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL +# else +# define SPI_MISO_PAL_MODE 5 +# endif +#endif static bool spiStarted = false; #if SPI_SELECT_MODE == SPI_SELECT_MODE_NONE diff --git a/platforms/chibios/drivers/spi_master.h b/platforms/chibios/drivers/spi_master.h deleted file mode 100644 index 4ad6144091..0000000000 --- a/platforms/chibios/drivers/spi_master.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright 2020 Nick Brassel (tzarc) - * - * 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 -#include -#include - -#include "gpio.h" -#include "chibios_config.h" - -#ifndef SPI_DRIVER -# define SPI_DRIVER SPID2 -#endif - -#ifndef SPI_SCK_PIN -# define SPI_SCK_PIN B13 -#endif - -#ifndef SPI_SCK_PAL_MODE -# if defined(USE_GPIOV1) -# define SPI_SCK_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL -# else -# define SPI_SCK_PAL_MODE 5 -# endif -#endif - -#ifndef SPI_MOSI_PIN -# define SPI_MOSI_PIN B15 -#endif - -#ifndef SPI_MOSI_PAL_MODE -# if defined(USE_GPIOV1) -# define SPI_MOSI_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL -# else -# define SPI_MOSI_PAL_MODE 5 -# endif -#endif - -#ifndef SPI_MISO_PIN -# define SPI_MISO_PIN B14 -#endif - -#ifndef SPI_MISO_PAL_MODE -# if defined(USE_GPIOV1) -# define SPI_MISO_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL -# else -# define SPI_MISO_PAL_MODE 5 -# endif -#endif - -typedef int16_t spi_status_t; - -#define SPI_STATUS_SUCCESS (0) -#define SPI_STATUS_ERROR (-1) -#define SPI_STATUS_TIMEOUT (-2) - -#define SPI_TIMEOUT_IMMEDIATE (0) -#define SPI_TIMEOUT_INFINITE (0xFFFF) - -#ifdef __cplusplus -extern "C" { -#endif -typedef struct spi_start_config_t { - pin_t slave_pin; - bool lsb_first; - uint8_t mode; - uint16_t divisor; - bool cs_active_low; -} spi_start_config_t; - -void spi_init(void); - -bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor); -bool spi_start_extended(spi_start_config_t *start_config); - -spi_status_t spi_write(uint8_t data); - -spi_status_t spi_read(void); - -spi_status_t spi_transmit(const uint8_t *data, uint16_t length); - -spi_status_t spi_receive(uint8_t *data, uint16_t length); - -void spi_stop(void); -#ifdef __cplusplus -} -#endif From 544ddde113657a932275399f577a422a809d2880 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Mon, 27 Jan 2025 03:32:23 -0800 Subject: [PATCH 158/592] [Core] Add Chordal Hold, an "opposite hands rule" tap-hold option similar to Achordion, Bilateral Combinations. (#24560) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Chordal Hold: restrict what chords settle as hold * Chordal Hold: docs and further improvements * Fix formatting. * Doc rewording and minor edit. * Support Chordal Hold of multiple tap-hold keys. * Fix formatting. * Simplification and additional test. * Fix formatting. * Tighten tests. * Add test two_mod_taps_same_hand_hold_til_timeout. * Revise handing of pairs of tap-hold keys. * Generate a default chordal_hold_layout. * Document chordal_hold_handedness(). * Add license notice to new and branched files in PR. * Add `tapping.chordal_hold` property for info.json. * Update docs/reference_info_json.md * Revise "hand" jsonschema. * Chordal Hold: Improved layout handedness heuristic. This commit improves the heuristic used in generate-keyboard-c for inferring key handedness from keyboard.json geometry data. Heuristic summary: 1. If the layout is symmetric (e.g. most split keyboards), guess the handedness based on the sign of (x - layout_x_midpoint). 2. Otherwise, if the layout has a key of >=6u width, it is probably the spacebar. Form a dividing line through the spacebar, nearly vertical but with a slight angle to follow typical row stagger. 3. Otherwise, assume handedness based on the widest horizontal separation. I have tested this strategy on a couple dozen keyboards and found it to work reliably. * Use Optional instead of `| None`. * Refactor to avoid lambdas. * Remove trailing comma in chordal_hold_layout. * Minor docs edits. * Revise to allow combining multiple same-hand mods. This commit revises Chordal Hold as described in discussion in https://github.com/qmk/qmk_firmware/pull/24560#discussion_r1894655238 1. In "RCTL_T(KC_A)↓, RSFT_T(KC_C)↓, RCTL_T(KC_A)↑" before the tapping term, RCTL_T(KC_A) is settled as tapped. 2. In "RCTL_T(KC_A)↓, RSFT_T(KC_C)↓, RSFT_T(KC_C)↑", both RCTL_T(KC_A) and RSFT_T(KC_C) are settled as tapped. 3. In "RCTL_T(KC_A)↓, RSFT_T(KC_C)↓, KC_U↓" (all keys on the same side), both RCTL_T(KC_A) and RSFT_T(KC_C) are settled as tapped. 4. In "RCTL_T(KC_A)↓, RSFT_T(KC_C)↓, LSFT_T(KC_T)↓", with the third key on the other side, we allow Permissive Hold or Hold On Other Keypress to decide how/when to settle the keys. 5. In "RCTL_T(KC_A)↓, RSFT_T(KC_C)↓" held until the tapping term, the keys are settled as held. 1–3 provide same-hand roll protection. 4–5 are for combining multiple same-hand modifiers. I've updated the unit tests and have been running it on my keyboard, for a few hours so far, and all seems good. I really like this scheme. It allows combining same-side mods, yet it also has roll protection on streaks. For me, this feels like Achordion, but clearly better streak handling and improved responsiveness. * Fix formatting. * Add a couple tests with LT keys. * Remove stale use of CHORDAL_HOLD_LAYOUT. * Fix misspelling lastest -> latest * Handling tweak for LTs and tests. * Fix formatting. * More tests with LT keys. * Fix formatting. --- data/mappings/info_config.hjson | 1 + data/schemas/keyboard.jsonschema | 7 +- docs/reference_info_json.md | 4 + docs/tap_hold.md | 163 ++++ lib/python/qmk/cli/generate/keyboard_c.py | 138 ++- quantum/action_tapping.c | 274 +++++- quantum/action_tapping.h | 65 ++ .../chordal_hold/default/config.h | 21 + .../chordal_hold/default/test.mk | 17 + .../chordal_hold/default/test_keymap.c | 22 + .../default/test_one_shot_keys.cpp | 168 ++++ .../chordal_hold/default/test_tap_hold.cpp | 264 +++++ .../hold_on_other_key_press/config.h | 22 + .../hold_on_other_key_press/test.mk | 17 + .../hold_on_other_key_press/test_keymap.c | 22 + .../hold_on_other_key_press/test_tap_hold.cpp | 807 ++++++++++++++++ .../chordal_hold/permissive_hold/config.h | 22 + .../chordal_hold/permissive_hold/test.mk | 17 + .../permissive_hold/test_keymap.c | 22 + .../permissive_hold/test_one_shot_keys.cpp | 174 ++++ .../permissive_hold/test_tap_hold.cpp | 898 ++++++++++++++++++ .../retro_shift_permissive_hold/config.h | 28 + .../retro_shift_permissive_hold/test.mk | 18 + .../retro_shift_permissive_hold/test_keymap.c | 22 + .../test_retro_shift.cpp | 420 ++++++++ 25 files changed, 3607 insertions(+), 26 deletions(-) create mode 100644 tests/tap_hold_configurations/chordal_hold/default/config.h create mode 100644 tests/tap_hold_configurations/chordal_hold/default/test.mk create mode 100644 tests/tap_hold_configurations/chordal_hold/default/test_keymap.c create mode 100644 tests/tap_hold_configurations/chordal_hold/default/test_one_shot_keys.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/default/test_tap_hold.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/config.h create mode 100644 tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test.mk create mode 100644 tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_keymap.c create mode 100644 tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold/config.h create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold/test.mk create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold/test_keymap.c create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold/test_one_shot_keys.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/config.h create mode 100644 tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test.mk create mode 100644 tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_keymap.c create mode 100644 tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_retro_shift.cpp diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index 8d3e3c7f0e..b643553b52 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -200,6 +200,7 @@ "SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"}, // Tapping + "CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"}, "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"}, "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"}, "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index ec87680fa0..8b6cc7032b 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -422,7 +422,11 @@ "h": {"$ref": "qmk.definitions.v1#/key_unit"}, "w": {"$ref": "qmk.definitions.v1#/key_unit"}, "x": {"$ref": "qmk.definitions.v1#/key_unit"}, - "y": {"$ref": "qmk.definitions.v1#/key_unit"} + "y": {"$ref": "qmk.definitions.v1#/key_unit"}, + "hand": { + "type": "string", + "enum": ["L", "R", "*"] + } } } } @@ -915,6 +919,7 @@ "tapping": { "type": "object", "properties": { + "chordal_hold": {"type": "boolean"}, "force_hold": {"type": "boolean"}, "force_hold_per_key": {"type": "boolean"}, "ignore_mod_tap_interrupt": {"type": "boolean"}, diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index 99ff7b1f7a..29b999c32e 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -74,6 +74,8 @@ You can create `info.json` files at every level under `qmk_firmware/keyboards/Boolean + * Default: `false` * `hold_on_other_key_press` Boolean * Default: `false` * `hold_on_other_key_press_per_key` Boolean @@ -328,6 +330,8 @@ The ISO enter key is represented by a 1.25u×2uh key. Renderers which utilize in * `h` KeyUnit * The height of the key, in key units. * Default: `1` (1u) + * `hand` String + * The handedness of the key for Chordal Hold, either `"L"` (left hand), `"R"` (right hand), or `"*"` (either or exempted handedness). * `label` String * What to name the key. This is *not* a key assignment as in the keymap, but should usually correspond to the keycode for the first layer of the default keymap. * Example: `"Escape"` diff --git a/docs/tap_hold.md b/docs/tap_hold.md index 9b7f6552cb..254d5de5ec 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -425,6 +425,169 @@ uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) { If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`. ::: +## Chordal Hold + +Chordal Hold is intended to be used together with either Permissive Hold or Hold +On Other Key Press. Chordal Hold is enabled by adding to your `config.h`: + +```c +#define CHORDAL_HOLD +``` + +Chordal Hold implements, by default, an "opposite hands" rule. Suppose a +tap-hold key is pressed and then, before the tapping term, another key is +pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two +keys are on the same hand. + +Otherwise, if the keys are on opposite hands, Chordal Hold introduces no new +behavior. Hold On Other Key Press or Permissive Hold may be used together with +Chordal Hold to configure the behavior in the opposite hands case. With Hold On +Other Key Press, an opposite hands chord is settled immediately as held. Or with +Permissive Hold, an opposite hands chord is settled as held provided the other +key is pressed and released (nested press) before releasing the tap-hold key. + +Chordal Hold may be useful to avoid accidental modifier activation with +mod-taps, particularly in rolled keypresses when using home row mods. + +Notes: + +* Chordal Hold has no effect after the tapping term. + +* Combos are exempt from the opposite hands rule, since "handedness" is + ill-defined in this case. Even so, Chordal Hold's behavior involving combos + may be customized through the `get_chordal_hold()` callback. + +An example of a sequence that is affected by “chordal hold”: + +- `SFT_T(KC_A)` Down +- `KC_C` Down +- `KC_C` Up +- `SFT_T(KC_A)` Up + +``` + TAPPING_TERM + +---------------------------|--------+ + | +----------------------+ | | + | | SFT_T(KC_A) | | | + | +----------------------+ | | + | +--------------+ | | + | | KC_C | | | + | +--------------+ | | + +---------------------------|--------+ +``` + +If the two keys are on the same hand, then this will produce `ac` with +`SFT_T(KC_A)` settled as tapped the moment that `KC_C` is pressed. + +If the two keys are on opposite hands and the `HOLD_ON_OTHER_KEY_PRESS` option +enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when `KC_C` is +pressed. + +Or if the two keys are on opposite hands and the `PERMISSIVE_HOLD` option is +enabled, this will produce `C` with `SFT_T(KC_A)` settled as held when that +`KC_C` is released. + +### Chordal Hold Handedness + +Determining whether keys are on the same or opposite hands involves defining the +"handedness" of each key position. By default, if nothing is specified, +handedness is guessed based on keyboard geometry. + +Handedness may be specified with `chordal_hold_layout`. In keymap.c, define +`chordal_hold_layout` in the following form: + +```c +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = + LAYOUT( + 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', + 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', + 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R', + 'L', 'L', 'L', 'R', 'R', 'R' + ); +``` + +Use the same `LAYOUT` macro as used to define your keymap layers. Each entry is +a character indicating the handedness of one key, either `'L'` for left, `'R'` +for right, or `'*'` to exempt keys from the "opposite hands rule." A key with +`'*'` handedness may settle as held in chords with any other key. This could be +used perhaps on thumb keys or other places where you want to allow same-hand +chords. + +Keyboard makers may specify handedness in keyboard.json. Under `"layouts"`, +specify the handedness of a key by adding a `"hand"` field with a value of +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", "*"}, +``` + +Alternatively, handedness may be defined functionally with +`chordal_hold_handedness()`. For example, in keymap.c define: + +```c +char chordal_hold_handedness(keypos_t key) { + if (key.col == 0 || key.col == MATRIX_COLS - 1) { + return '*'; // Exempt the outer columns. + } + // On split keyboards, typically, the first half of the rows are on the + // left, and the other half are on the right. + return key.row < MATRIX_ROWS / 2 ? 'L' : 'R'; +} +``` + +Given the matrix position of a key, the function should return `'L'`, `'R'`, or +`'*'`. Adapt the logic in this function according to the keyboard's matrix. + +::: warning +Note the matrix may have irregularities around larger keys, around the edges of +the board, and around thumb clusters. You may find it helpful to use [this +debugging example](faq_debug#which-matrix-position-is-this-keypress) to +correspond physical keys to matrix positions. +::: + +::: tip If you define both `chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS]` and +`chordal_hold_handedness(keypos_t key)` for handedness, the latter takes +precedence. +::: + + +### Per-chord customization + +Beyond the per-key configuration possible through handedness, Chordal Hold may +be configured at a *per-chord* granularity for detailed tuning. In keymap.c, +define `get_chordal_hold()`. Returning `true` allows the chord to be held, while +returning `false` settles as tapped. + +For example: + +```c +bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t* tap_hold_record, + uint16_t other_keycode, keyrecord_t* other_record) { + // Exceptionally allow some one-handed chords for hotkeys. + switch (tap_hold_keycode) { + case LCTL_T(KC_Z): + if (other_keycode == KC_C || other_keycode == KC_V) { + return true; + } + break; + + case RCTL_T(KC_SLSH): + if (other_keycode == KC_N) { + return true; + } + break; + } + // Otherwise defer to the opposite hands rule. + return get_chordal_hold_default(tap_hold_record, other_record); +} +``` + +As shown in the last line above, you may use +`get_chordal_hold_default(tap_hold_record, other_record)` to get the default tap +vs. hold decision according to the opposite hands rule. + + ## Retro Tapping To enable `retro tapping`, add the following to your `config.h`: diff --git a/lib/python/qmk/cli/generate/keyboard_c.py b/lib/python/qmk/cli/generate/keyboard_c.py index 228b320942..1978de4a22 100755 --- a/lib/python/qmk/cli/generate/keyboard_c.py +++ b/lib/python/qmk/cli/generate/keyboard_c.py @@ -1,5 +1,9 @@ """Used by the make system to generate keyboard.c from info.json. """ +import bisect +import dataclasses +from typing import Optional + from milc import cli from qmk.info import info_json @@ -87,6 +91,7 @@ def _gen_matrix_mask(info_data): lines.append(f' 0b{"".join(reversed(mask[i]))},') lines.append('};') lines.append('#endif') + lines.append('') return lines @@ -122,6 +127,128 @@ def _gen_joystick_axes(info_data): lines.append('};') lines.append('#endif') + lines.append('') + + return lines + + +@dataclasses.dataclass +class LayoutKey: + """Geometric info for one key in a layout.""" + row: int + col: int + x: float + y: float + w: float = 1.0 + h: float = 1.0 + hand: Optional[str] = None + + @staticmethod + def from_json(key_json): + row, col = key_json['matrix'] + return LayoutKey( + row=row, + col=col, + x=key_json['x'], + y=key_json['y'], + w=key_json.get('w', 1.0), + h=key_json.get('h', 1.0), + hand=key_json.get('hand', None), + ) + + @property + def cx(self): + """Center x coordinate of the key.""" + return self.x + self.w / 2.0 + + @property + def cy(self): + """Center y coordinate of the key.""" + return self.y + self.h / 2.0 + + +class Layout: + """Geometric info of a layout.""" + def __init__(self, layout_json): + self.keys = [LayoutKey.from_json(key_json) for key_json in layout_json['layout']] + self.x_min = min(key.cx for key in self.keys) + self.x_max = max(key.cx for key in self.keys) + self.x_mid = (self.x_min + self.x_max) / 2 + # If there is one key with width >= 6u, it is probably the spacebar. + i = [i for i, key in enumerate(self.keys) if key.w >= 6.0] + self.spacebar = self.keys[i[0]] if len(i) == 1 else None + + def is_symmetric(self, tol: float = 0.02): + """Whether the key positions are symmetric about x_mid.""" + x = sorted([key.cx for key in self.keys]) + for i in range(len(x)): + x_i_mirrored = 2.0 * self.x_mid - x[i] + # Find leftmost x element greater than or equal to (x_i_mirrored - tol). + j = bisect.bisect_left(x, x_i_mirrored - tol) + if j == len(x) or abs(x[j] - x_i_mirrored) > tol: + return False + + return True + + def widest_horizontal_gap(self): + """Finds the x midpoint of the widest horizontal gap between keys.""" + x = sorted([key.cx for key in self.keys]) + x_mid = self.x_mid + max_sep = 0 + for i in range(len(x) - 1): + sep = x[i + 1] - x[i] + if sep > max_sep: + max_sep = sep + x_mid = (x[i + 1] + x[i]) / 2 + + return x_mid + + +def _gen_chordal_hold_layout(info_data): + """Convert info.json content to chordal_hold_layout + """ + # NOTE: If there are multiple layouts, only the first is read. + for layout_name, layout_json in info_data['layouts'].items(): + layout = Layout(layout_json) + break + + if layout.is_symmetric(): + # If the layout is symmetric (e.g. most split keyboards), guess the + # handedness based on the sign of (x - layout.x_mid). + hand_signs = [key.x - layout.x_mid for key in layout.keys] + elif layout.spacebar is not None: + # If the layout has a spacebar, form a dividing line through the spacebar, + # nearly vertical but with a slight angle to follow typical row stagger. + x0 = layout.spacebar.cx - 0.05 + y0 = layout.spacebar.cy - 1.0 + hand_signs = [(key.x - x0) - (key.y - y0) / 3.0 for key in layout.keys] + else: + # Fallback: assume handedness based on the widest horizontal separation. + x_mid = layout.widest_horizontal_gap() + hand_signs = [key.x - x_mid for key in layout.keys] + + for key, hand_sign in zip(layout.keys, hand_signs): + if key.hand is None: + if key == layout.spacebar or abs(hand_sign) <= 0.02: + key.hand = '*' + else: + key.hand = 'L' if hand_sign < 0.0 else 'R' + + lines = [] + lines.append('#ifdef CHORDAL_HOLD') + line = ('__attribute__((weak)) const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = ' + layout_name + '(') + + x_prev = None + for key in layout.keys: + if x_prev is None or key.x < x_prev: + lines.append(line) + line = ' ' + line += f"'{key.hand}', " + x_prev = key.x + + lines.append(line[:-2]) + lines.append(');') + lines.append('#endif') return lines @@ -136,11 +263,12 @@ def generate_keyboard_c(cli): kb_info_json = info_json(cli.args.keyboard) # Build the layouts.h file. - keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#include QMK_KEYBOARD_H', ''] + keyboard_c_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#include QMK_KEYBOARD_H', ''] - keyboard_h_lines.extend(_gen_led_configs(kb_info_json)) - keyboard_h_lines.extend(_gen_matrix_mask(kb_info_json)) - keyboard_h_lines.extend(_gen_joystick_axes(kb_info_json)) + keyboard_c_lines.extend(_gen_led_configs(kb_info_json)) + keyboard_c_lines.extend(_gen_matrix_mask(kb_info_json)) + keyboard_c_lines.extend(_gen_joystick_axes(kb_info_json)) + keyboard_c_lines.extend(_gen_chordal_hold_layout(kb_info_json)) # Show the results - dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet) + dump_lines(cli.args.output, keyboard_c_lines, cli.args.quiet) diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index 8f238490f2..9171970702 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -49,6 +49,45 @@ __attribute__((weak)) bool get_permissive_hold(uint16_t keycode, keyrecord_t *re } # endif +# if defined(CHORDAL_HOLD) +extern const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM; + +# define REGISTERED_TAPS_SIZE 8 +// Array of tap-hold keys that have been settled as tapped but not yet released. +static keypos_t registered_taps[REGISTERED_TAPS_SIZE] = {}; +static uint8_t num_registered_taps = 0; + +/** Adds `key` to the registered_taps array. */ +static void registered_taps_add(keypos_t key); +/** Returns the index of `key` in registered_taps, or -1 if not found. */ +static int8_t registered_tap_find(keypos_t key); +/** Removes index `i` from the registered_taps array. */ +static void registered_taps_del_index(uint8_t i); +/** Logs the registered_taps array for debugging. */ +static void debug_registered_taps(void); + +/** \brief Finds which queued events should be held according to Chordal Hold. + * + * In a situation with multiple unsettled tap-hold key presses, scan the queue + * up until the first release, non-tap-hold, or one-shot event and find the + * latest event in the queue that settles as held according to + * get_chordal_hold(). + * + * \return Index of the first tap, or equivalently, one past the latest hold. + */ +static uint8_t waiting_buffer_find_chordal_hold_tap(void); + +/** Processes queued events up to and including `key` as tapped. */ +static void waiting_buffer_chordal_hold_taps_until(keypos_t key); + +/** \brief Processes and pops buffered events until the first tap-hold event. */ +static void waiting_buffer_process_regular(void); + +static bool is_mt_or_lt(uint16_t keycode) { + return IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode); +} +# endif // CHORDAL_HOLD + # ifdef HOLD_ON_OTHER_KEY_PRESS_PER_KEY __attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) { return false; @@ -166,6 +205,20 @@ void action_tapping_process(keyrecord_t record) { bool process_tapping(keyrecord_t *keyp) { const keyevent_t event = keyp->event; +# if defined(CHORDAL_HOLD) + if (!event.pressed) { + const int8_t i = registered_tap_find(event.key); + if (i != -1) { + // If a tap-hold key was previously settled as tapped, set its + // tap.count correspondingly on release. + keyp->tap.count = 1; + registered_taps_del_index(i); + ac_dprintf("Found tap release for [%d]\n", i); + debug_registered_taps(); + } + } +# endif // CHORDAL_HOLD + // state machine is in the "reset" state, no tapping key is to be // processed if (IS_NOEVENT(tapping_key.event)) { @@ -188,7 +241,7 @@ bool process_tapping(keyrecord_t *keyp) { return true; } -# if (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) || defined(PERMISSIVE_HOLD_PER_KEY) || defined(HOLD_ON_OTHER_KEY_PRESS_PER_KEY) +# if (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) || defined(PERMISSIVE_HOLD_PER_KEY) || defined(CHORDAL_HOLD) || defined(HOLD_ON_OTHER_KEY_PRESS_PER_KEY) TAP_DEFINE_KEYCODE; # endif @@ -199,6 +252,7 @@ bool process_tapping(keyrecord_t *keyp) { // early return for tick events return true; } + if (tapping_key.tap.count == 0) { if (IS_TAPPING_RECORD(keyp) && !event.pressed) { // first tap! @@ -212,6 +266,25 @@ bool process_tapping(keyrecord_t *keyp) { // enqueue return false; } +# if defined(CHORDAL_HOLD) + else if (is_mt_or_lt(tapping_keycode) && !event.pressed && waiting_buffer_typed(event) && !get_chordal_hold(tapping_keycode, &tapping_key, get_record_keycode(keyp, false), keyp)) { + // Key release that is not a chord with the tapping key. + // Settle the tapping key and any other pending tap-hold + // keys preceding the press of this key as tapped. + + ac_dprintf("Tapping: End. Chord considered a tap\n"); + tapping_key.tap.count = 1; + registered_taps_add(tapping_key.event.key); + process_record(&tapping_key); + tapping_key = (keyrecord_t){0}; + + waiting_buffer_chordal_hold_taps_until(event.key); + debug_registered_taps(); + debug_waiting_buffer(); + // enqueue + return false; + } +# endif // CHORDAL_HOLD /* Process a key typed within TAPPING_TERM * This can register the key before settlement of tapping, * useful for long TAPPING_TERM but may prevent fast typing. @@ -229,6 +302,22 @@ bool process_tapping(keyrecord_t *keyp) { // clang-format on ac_dprintf("Tapping: End. No tap. Interfered by typing key\n"); process_record(&tapping_key); + +# if defined(CHORDAL_HOLD) + uint8_t first_tap = waiting_buffer_find_chordal_hold_tap(); + ac_dprintf("first_tap = %u\n", first_tap); + if (first_tap < WAITING_BUFFER_SIZE) { + for (; waiting_buffer_tail != first_tap; waiting_buffer_tail = (waiting_buffer_tail + 1) % WAITING_BUFFER_SIZE) { + ac_dprintf("Processing [%u]\n", waiting_buffer_tail); + process_record(&waiting_buffer[waiting_buffer_tail]); + } + } + + waiting_buffer_chordal_hold_taps_until(event.key); + debug_registered_taps(); + debug_waiting_buffer(); +# endif // CHORDAL_HOLD + tapping_key = (keyrecord_t){0}; debug_tapping_key(); // enqueue @@ -237,6 +326,19 @@ bool process_tapping(keyrecord_t *keyp) { /* Process release event of a key pressed before tapping starts * Without this unexpected repeating will occur with having fast repeating setting * https://github.com/tmk/tmk_keyboard/issues/60 + * + * NOTE: This workaround causes events to process out of order, + * e.g. in a rolled press of three tap-hold keys like + * + * "A down, B down, C down, A up, B up, C up" + * + * events are processed as + * + * "A down, B down, A up, B up, C down, C up" + * + * It seems incorrect to process keyp before the tapping key. + * This workaround is old, from 2013. This might no longer + * be needed for the original problem it was meant to address. */ else if (!event.pressed && !waiting_buffer_typed(event)) { // Modifier/Layer should be retained till end of this tapping. @@ -271,19 +373,52 @@ bool process_tapping(keyrecord_t *keyp) { // set interrupted flag when other key pressed during tapping if (event.pressed) { tapping_key.tap.interrupted = true; - if (TAP_GET_HOLD_ON_OTHER_KEY_PRESS + +# if defined(CHORDAL_HOLD) + if (is_mt_or_lt(tapping_keycode) && !get_chordal_hold(tapping_keycode, &tapping_key, get_record_keycode(keyp, false), keyp)) { + // In process_action(), HOLD_ON_OTHER_KEY_PRESS + // will revert interrupted events to holds, so + // this needs to be set false. + tapping_key.tap.interrupted = false; + + if (!is_tap_record(keyp)) { + ac_dprintf("Tapping: End. Chord considered a tap\n"); + tapping_key.tap.count = 1; + registered_taps_add(tapping_key.event.key); + debug_registered_taps(); + process_record(&tapping_key); + tapping_key = (keyrecord_t){0}; + } + } else +# endif // CHORDAL_HOLD + if (TAP_GET_HOLD_ON_OTHER_KEY_PRESS # if defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT) - // Auto Shift cannot evaluate this early - // Retro Shift uses the hold action for all nested taps even without HOLD_ON_OTHER_KEY_PRESS, so this is fine to skip - && !(MAYBE_RETRO_SHIFTING(event, keyp) && get_auto_shifted_key(get_record_keycode(keyp, false), keyp)) + // Auto Shift cannot evaluate this early + // Retro Shift uses the hold action for all nested taps even without HOLD_ON_OTHER_KEY_PRESS, so this is fine to skip + && !(MAYBE_RETRO_SHIFTING(event, keyp) && get_auto_shifted_key(get_record_keycode(keyp, false), keyp)) # endif - ) { + ) { + // Settle the tapping key as *held*, since + // HOLD_ON_OTHER_KEY_PRESS is enabled for this key. ac_dprintf("Tapping: End. No tap. Interfered by pressed key\n"); process_record(&tapping_key); - tapping_key = (keyrecord_t){0}; + +# if defined(CHORDAL_HOLD) + if (waiting_buffer_tail != waiting_buffer_head && is_tap_record(&waiting_buffer[waiting_buffer_tail])) { + tapping_key = waiting_buffer[waiting_buffer_tail]; + // Pop tail from the queue. + waiting_buffer_tail = (waiting_buffer_tail + 1) % WAITING_BUFFER_SIZE; + debug_waiting_buffer(); + } else +# endif // CHORDAL_HOLD + { + tapping_key = (keyrecord_t){0}; + } debug_tapping_key(); - // enqueue - return false; + +# if defined(CHORDAL_HOLD) + waiting_buffer_process_regular(); +# endif // CHORDAL_HOLD } } // enqueue @@ -520,26 +655,125 @@ void waiting_buffer_scan_tap(void) { } } -/** \brief Tapping key debug print - * - * FIXME: Needs docs - */ +# ifdef CHORDAL_HOLD +__attribute__((weak)) bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t *tap_hold_record, uint16_t other_keycode, keyrecord_t *other_record) { + return get_chordal_hold_default(tap_hold_record, other_record); +} + +bool get_chordal_hold_default(keyrecord_t *tap_hold_record, keyrecord_t *other_record) { + if (tap_hold_record->event.type != KEY_EVENT || other_record->event.type != KEY_EVENT) { + return true; // Return true on combos or other non-key events. + } + + char tap_hold_hand = chordal_hold_handedness(tap_hold_record->event.key); + if (tap_hold_hand == '*') { + return true; + } + char other_hand = chordal_hold_handedness(other_record->event.key); + return other_hand == '*' || tap_hold_hand != other_hand; +} + +__attribute__((weak)) char chordal_hold_handedness(keypos_t key) { + return (char)pgm_read_byte(&chordal_hold_layout[key.row][key.col]); +} + +static void registered_taps_add(keypos_t key) { + if (num_registered_taps >= REGISTERED_TAPS_SIZE) { + ac_dprintf("TAPS OVERFLOW: CLEAR ALL STATES\n"); + clear_keyboard(); + num_registered_taps = 0; + } + + registered_taps[num_registered_taps] = key; + ++num_registered_taps; +} + +static int8_t registered_tap_find(keypos_t key) { + for (int8_t i = 0; i < num_registered_taps; ++i) { + if (KEYEQ(registered_taps[i], key)) { + return i; + } + } + return -1; +} + +static void registered_taps_del_index(uint8_t i) { + if (i < num_registered_taps) { + --num_registered_taps; + if (i < num_registered_taps) { + registered_taps[i] = registered_taps[num_registered_taps]; + } + } +} + +static void debug_registered_taps(void) { + ac_dprintf("registered_taps = { "); + for (int8_t i = 0; i < num_registered_taps; ++i) { + ac_dprintf("%02X%02X ", registered_taps[i].row, registered_taps[i].col); + } + ac_dprintf("}\n"); +} + +static uint8_t waiting_buffer_find_chordal_hold_tap(void) { + keyrecord_t *prev = &tapping_key; + uint16_t prev_keycode = get_record_keycode(&tapping_key, false); + uint8_t first_tap = WAITING_BUFFER_SIZE; + for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { + keyrecord_t * cur = &waiting_buffer[i]; + const uint16_t cur_keycode = get_record_keycode(cur, false); + if (!cur->event.pressed || !is_mt_or_lt(prev_keycode)) { + break; + } else if (get_chordal_hold(prev_keycode, prev, cur_keycode, cur)) { + first_tap = i; // Track one index past the latest hold. + } + prev = cur; + prev_keycode = cur_keycode; + } + return first_tap; +} + +static void waiting_buffer_chordal_hold_taps_until(keypos_t key) { + while (waiting_buffer_tail != waiting_buffer_head) { + keyrecord_t *record = &waiting_buffer[waiting_buffer_tail]; + ac_dprintf("waiting_buffer_chordal_hold_taps_until: processing [%u]\n", waiting_buffer_tail); + if (is_tap_record(record)) { + record->tap.count = 1; + registered_taps_add(record->event.key); + } + process_record(record); + waiting_buffer_tail = (waiting_buffer_tail + 1) % WAITING_BUFFER_SIZE; + + if (KEYEQ(key, record->event.key) && record->event.pressed) { + break; + } + } +} + +static void waiting_buffer_process_regular(void) { + for (; waiting_buffer_tail != waiting_buffer_head; waiting_buffer_tail = (waiting_buffer_tail + 1) % WAITING_BUFFER_SIZE) { + if (is_tap_record(&waiting_buffer[waiting_buffer_tail])) { + break; // Stop once a tap-hold key event is reached. + } + ac_dprintf("waiting_buffer_process_regular: processing [%u]\n", waiting_buffer_tail); + process_record(&waiting_buffer[waiting_buffer_tail]); + } + debug_waiting_buffer(); +} +# endif // CHORDAL_HOLD + +/** \brief Logs tapping key if ACTION_DEBUG is enabled. */ static void debug_tapping_key(void) { ac_dprintf("TAPPING_KEY="); debug_record(tapping_key); ac_dprintf("\n"); } -/** \brief Waiting buffer debug print - * - * FIXME: Needs docs - */ +/** \brief Logs waiting buffer if ACTION_DEBUG is enabled. */ static void debug_waiting_buffer(void) { - ac_dprintf("{ "); + ac_dprintf("{"); for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { - ac_dprintf("[%u]=", i); + ac_dprintf(" [%u]=", i); debug_record(waiting_buffer[i]); - ac_dprintf(" "); } ac_dprintf("}\n"); } diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h index 6b518b8298..c3c7b999ec 100644 --- a/quantum/action_tapping.h +++ b/quantum/action_tapping.h @@ -46,6 +46,71 @@ bool get_permissive_hold(uint16_t keycode, keyrecord_t *record); bool get_retro_tapping(uint16_t keycode, keyrecord_t *record); bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record); +#ifdef CHORDAL_HOLD +/** + * Callback to say when a key chord before the tapping term may be held. + * + * In keymap.c, define the callback + * + * bool get_chordal_hold(uint16_t tap_hold_keycode, + * keyrecord_t* tap_hold_record, + * uint16_t other_keycode, + * keyrecord_t* other_record) { + * // Conditions... + * } + * + * This callback is called when: + * + * 1. `tap_hold_keycode` is pressed. + * 2. `other_keycode` is pressed while `tap_hold_keycode` is still held, + * provided `other_keycode` is *not* also a tap-hold key and it is pressed + * before the tapping term. + * + * If false is returned, this has the effect of immediately settling the + * tap-hold key as tapped. If true is returned, the tap-hold key is still + * unsettled, and may be settled as held depending on configuration and + * subsequent events. + * + * @param tap_hold_keycode Keycode of the tap-hold key. + * @param tap_hold_record Record from the tap-hold press event. + * @param other_keycode Keycode of the other key. + * @param other_record Record from the other key's press event. + * @return True if the tap-hold key may be considered held; false if tapped. + */ +bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t *tap_hold_record, uint16_t other_keycode, keyrecord_t *other_record); + +/** + * Default "opposite hands rule" for whether a key chord may settle as held. + * + * This function returns true when the tap-hold key and other key are on + * "opposite hands." In detail, handedness of the two keys are compared. If + * handedness values differ, or if either handedness is '*', the function + * returns true, indicating that it may be held. Otherwise, it returns false, + * in which case the tap-hold key is immediately settled at tapped. + * + * @param tap_hold_record Record of the active tap-hold key press. + * @param other_record Record of the other, interrupting key press. + * @return True if the tap-hold key may be considered held; false if tapped. + */ +bool get_chordal_hold_default(keyrecord_t *tap_hold_record, keyrecord_t *other_record); + +/** + * Gets the handedness of a key. + * + * This function returns: + * 'L' for keys pressed by the left hand, + * 'R' for keys on the right hand, + * '*' for keys exempt from the "opposite hands rule." This could be used + * perhaps on thumb keys or keys that might be pressed by either hand. + * + * @param key A key matrix position. + * @return Handedness value. + */ +char chordal_hold_handedness(keypos_t key); + +extern const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM; +#endif + #ifdef DYNAMIC_TAPPING_TERM_ENABLE extern uint16_t g_tapping_term; #endif diff --git a/tests/tap_hold_configurations/chordal_hold/default/config.h b/tests/tap_hold_configurations/chordal_hold/default/config.h new file mode 100644 index 0000000000..2ba155df73 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/default/config.h @@ -0,0 +1,21 @@ +/* Copyright 2022 Vladislav Kucheriavykh + * Copyright 2024 Google LLC + * + * 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 "test_common.h" +#define CHORDAL_HOLD diff --git a/tests/tap_hold_configurations/chordal_hold/default/test.mk b/tests/tap_hold_configurations/chordal_hold/default/test.mk new file mode 100644 index 0000000000..2b049cea3b --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/default/test.mk @@ -0,0 +1,17 @@ +# Copyright 2022 Vladislav Kucheriavykh +# Copyright 2024 Google LLC +# +# 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 . + +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/chordal_hold/default/test_keymap.c b/tests/tap_hold_configurations/chordal_hold/default/test_keymap.c new file mode 100644 index 0000000000..8a6a2c59b0 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/default/test_keymap.c @@ -0,0 +1,22 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'*', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, +}; diff --git a/tests/tap_hold_configurations/chordal_hold/default/test_one_shot_keys.cpp b/tests/tap_hold_configurations/chordal_hold/default/test_one_shot_keys.cpp new file mode 100644 index 0000000000..ac4edd08b2 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/default/test_one_shot_keys.cpp @@ -0,0 +1,168 @@ +/* Copyright 2021 Stefan Kerkmann + * Copyright 2024 Google LLC + * + * 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 "action_util.h" +#include "keyboard_report_util.hpp" +#include "test_common.hpp" + +using testing::_; +using testing::InSequence; + +class OneShot : public TestFixture {}; +class OneShotParametrizedTestFixture : public ::testing::WithParamInterface>, public OneShot {}; + +TEST_P(OneShotParametrizedTestFixture, OSMWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_P(OneShotParametrizedTestFixture, OSMAsRegularModifierWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press OSM. + EXPECT_NO_REPORT(driver); + osm_key.press(); + run_one_scan_loop(); + // Press regular key. + regular_key.press(); + run_one_scan_loop(); + // Release regular key. + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSM. + EXPECT_REPORT(driver, (regular_key.report_code, osm_key.report_code)); + EXPECT_EMPTY_REPORT(driver); + osm_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +// clang-format off + +INSTANTIATE_TEST_CASE_P( + OneShotModifierTests, + OneShotParametrizedTestFixture, + ::testing::Values( + // First is osm key, second is regular key. + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LCTL), KC_LCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LALT), KC_LALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LGUI), KC_LGUI}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RCTL), KC_RCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RSFT), KC_RSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RALT), KC_RALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RGUI), KC_RGUI}, KeymapKey{0, 1, 1, KC_A}) + )); +// clang-format on + +TEST_F(OneShot, OSLWithAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osl_key1 = KeymapKey{1, 0, 0, KC_X}; + KeymapKey regular_key0 = KeymapKey{0, 1, 0, KC_Y}; + KeymapKey regular_key1 = KeymapKey{1, 1, 0, KC_A}; + + set_keymap({osl_key, osl_key1, regular_key0, regular_key1}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (regular_key1.report_code)); + EXPECT_EMPTY_REPORT(driver); + regular_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_NO_REPORT(driver); + regular_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osm_key = KeymapKey{1, 1, 0, OSM(MOD_LSFT), KC_LSFT}; + KeymapKey regular_key = KeymapKey{1, 1, 1, KC_A}; + KeymapKey blank_key = KeymapKey{1, 0, 0, KC_NO}; + + set_keymap({osl_key, osm_key, regular_key, blank_key}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/default/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/default/test_tap_hold.cpp new file mode 100644 index 0000000000..70949e218c --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/default/test_tap_hold.cpp @@ -0,0 +1,264 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::InSequence; + +class ChordalHoldDefault : public TestFixture {}; + +TEST_F(ChordalHoldDefault, chord_nested_press_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + // Tap regular key. + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, chord_rolled_press_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key and regular key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, non_chord_with_mod_tap_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key and regular key both on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_P)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, tap_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + idle_for(TAPPING_TERM - 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, hold_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, two_mod_taps_same_hand_hold_til_timeout) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, MATRIX_COLS - 2, 0, RCTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Continue holding til the tapping term. + EXPECT_REPORT(driver, (KC_RIGHT_CTRL)); + EXPECT_REPORT(driver, (KC_RIGHT_CTRL, KC_RIGHT_SHIFT)); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_RIGHT_SHIFT)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, three_mod_taps_same_hand_streak_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + // + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_C)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order, with the first two keys released + // before pressing KC_C. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldDefault, tap_regular_key_while_layer_tap_key_is_held) { + TestDriver driver; + InSequence s; + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, layer_key}); + + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); // Press layer-tap-hold key. + run_one_scan_loop(); + regular_key.press(); // Press regular key. + run_one_scan_loop(); + regular_key.release(); // Release regular key. + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + layer_tap_hold_key.release(); // Release layer-tap-hold key. + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/config.h b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/config.h new file mode 100644 index 0000000000..87094b2fac --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/config.h @@ -0,0 +1,22 @@ +/* Copyright 2022 Vladislav Kucheriavykh + * Copyright 2024 Google LLC + * + * 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 "test_common.h" +#define CHORDAL_HOLD +#define HOLD_ON_OTHER_KEY_PRESS diff --git a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test.mk b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test.mk new file mode 100644 index 0000000000..2b049cea3b --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test.mk @@ -0,0 +1,17 @@ +# Copyright 2022 Vladislav Kucheriavykh +# Copyright 2024 Google LLC +# +# 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 . + +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_keymap.c b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_keymap.c new file mode 100644 index 0000000000..8a6a2c59b0 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_keymap.c @@ -0,0 +1,22 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'*', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, +}; diff --git a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp new file mode 100644 index 0000000000..e6852bbbb1 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp @@ -0,0 +1,807 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::InSequence; + +class ChordalHoldHoldOnOtherKeyPress : public TestFixture {}; + +TEST_F(ChordalHoldHoldOnOtherKeyPress, chord_with_mod_tap_settled_as_hold) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, chord_nested_press_settled_as_hold) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_A)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, chord_rolled_press_settled_as_hold) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, non_chord_with_mod_tap_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key and regular key both on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_P)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, tap_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + idle_for(TAPPING_TERM - 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, hold_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, two_mod_taps_same_hand_hold_til_timeout) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, MATRIX_COLS - 2, 0, RCTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Continue holding til the tapping term. + EXPECT_REPORT(driver, (KC_RIGHT_CTRL)); + EXPECT_REPORT(driver, (KC_RIGHT_CTRL, KC_RIGHT_SHIFT)); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_RIGHT_SHIFT)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, two_mod_taps_nested_press_opposite_hands) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press first mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press second mod-tap key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second mod-tap key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, two_mod_taps_nested_press_same_hand) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, three_mod_taps_same_hand_streak_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + // + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A)); + // EXPECT_REPORT(driver, (KC_A, KC_B)); + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_C)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order, with the first two keys released + // before pressing KC_C. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, three_mod_taps_same_hand_streak_orders) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + // Press mod-tap keys. + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + // Release keys 3, 2, 1. + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + idle_for(TAPPING_TERM); + // Press mod-tap keys. + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + // Release keys 3, 1, 2. + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A)); + // EXPECT_REPORT(driver, (KC_A, KC_B)); + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_A, KC_C)); + // EXPECT_REPORT(driver, (KC_A)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order, with the first two keys released + // before pressing KC_C. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_C)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + idle_for(TAPPING_TERM); + // Press mod-tap keys. + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + // Release keys 2, 3, 1. + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, three_mod_taps_two_left_one_right) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 2, then key 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 1, then key 2. + EXPECT_REPORT(driver, (KC_LEFT_CTRL)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, three_mod_taps_one_held_two_tapped) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 2, 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key3.press(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 1, 2. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key3.press(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, tap_regular_key_while_layer_tap_key_is_held) { + TestDriver driver; + InSequence s; + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto no_key = KeymapKey(1, 1, 0, XXXXXXX); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, no_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_B)); + regular_key.press(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, long_distinct_taps_of_layer_tap_key_and_regular_key) { + TestDriver driver; + InSequence s; + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto layer_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Idle for tapping term of layer tap hold key. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, nested_tap_of_layer_0_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on layer 0 but regular keys on layer 1. + auto first_layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_layer_tap_key = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_on_layer = KeymapKey(1, 1, 0, KC_B); + auto second_key_on_layer = KeymapKey(1, MATRIX_COLS - 1, 0, KC_Q); + + set_keymap({first_layer_tap_key, second_layer_tap_key, first_key_on_layer, second_key_on_layer}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + second_layer_tap_key.press(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_EMPTY_REPORT(driver); + second_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, lt_mt_one_regular_key) { + TestDriver driver; + InSequence s; + auto lt_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto mt_key0 = KeymapKey(0, 2, 0, SFT_T(KC_B)); + auto mt_key1 = KeymapKey(1, 2, 0, CTL_T(KC_C)); + auto regular_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_X); + auto no_key0 = KeymapKey(0, MATRIX_COLS - 1, 0, XXXXXXX); + auto no_key1 = KeymapKey(1, 1, 0, XXXXXXX); + + set_keymap({lt_key, mt_key0, mt_key1, regular_key, no_key0, no_key1}); + + // Press LT, MT. + EXPECT_NO_REPORT(driver); + lt_key.press(); + run_one_scan_loop(); + mt_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL, KC_X)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release the regular key. + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release MT key. + EXPECT_EMPTY_REPORT(driver); + mt_key1.release(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); + VERIFY_AND_CLEAR(driver); + + // Release LT key. + lt_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, nested_tap_of_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on all layers. + auto first_key_layer_0 = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_key_layer_0 = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_layer_1 = KeymapKey(1, 1, 0, LT(2, KC_B)); + auto second_key_layer_1 = KeymapKey(1, MATRIX_COLS - 1, 0, LT(2, KC_Q)); + auto first_key_layer_2 = KeymapKey(2, 1, 0, KC_TRNS); + auto second_key_layer_2 = KeymapKey(2, MATRIX_COLS - 1, 0, KC_TRNS); + + set_keymap({first_key_layer_0, second_key_layer_0, first_key_layer_1, second_key_layer_1, first_key_layer_2, second_key_layer_2}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press second layer-tap key. + EXPECT_NO_REPORT(driver); + second_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + second_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldHoldOnOtherKeyPress, roll_layer_tap_key_with_regular_key) { + TestDriver driver; + InSequence s; + + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_B)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/config.h b/tests/tap_hold_configurations/chordal_hold/permissive_hold/config.h new file mode 100644 index 0000000000..f7bb7ab0ec --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/config.h @@ -0,0 +1,22 @@ +/* Copyright 2022 Vladislav Kucheriavykh + * Copyright 2024 Google LLC + * + * 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 "test_common.h" +#define CHORDAL_HOLD +#define PERMISSIVE_HOLD diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test.mk b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test.mk new file mode 100644 index 0000000000..2b049cea3b --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test.mk @@ -0,0 +1,17 @@ +# Copyright 2022 Vladislav Kucheriavykh +# Copyright 2024 Google LLC +# +# 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 . + +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_keymap.c b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_keymap.c new file mode 100644 index 0000000000..8a6a2c59b0 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_keymap.c @@ -0,0 +1,22 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'*', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, +}; diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_one_shot_keys.cpp b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_one_shot_keys.cpp new file mode 100644 index 0000000000..e48cba73e2 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_one_shot_keys.cpp @@ -0,0 +1,174 @@ +/* Copyright 2021 Stefan Kerkmann + * Copyright 2024 Google LLC + * + * 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 "action_util.h" +#include "keyboard_report_util.hpp" +#include "test_common.hpp" + +using testing::_; +using testing::InSequence; + +class OneShot : public TestFixture {}; +class OneShotParametrizedTestFixture : public ::testing::WithParamInterface>, public OneShot {}; + +TEST_P(OneShotParametrizedTestFixture, OSMWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_P(OneShotParametrizedTestFixture, OSMAsRegularModifierWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press OSM. + EXPECT_NO_REPORT(driver); + osm_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (osm_key.report_code)).Times(2); + EXPECT_REPORT(driver, (regular_key.report_code, osm_key.report_code)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSM. + EXPECT_EMPTY_REPORT(driver); + osm_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +// clang-format off + +INSTANTIATE_TEST_CASE_P( + OneShotModifierTests, + OneShotParametrizedTestFixture, + ::testing::Values( + // First is osm key, second is regular key. + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LCTL), KC_LCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LALT), KC_LALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LGUI), KC_LGUI}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RCTL), KC_RCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RSFT), KC_RSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RALT), KC_RALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RGUI), KC_RGUI}, KeymapKey{0, 1, 1, KC_A}) + )); +// clang-format on + +TEST_F(OneShot, OSLWithAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osl_key1 = KeymapKey{1, 0, 0, KC_X}; + KeymapKey regular_key0 = KeymapKey{0, 1, 0, KC_Y}; + KeymapKey regular_key1 = KeymapKey{1, 1, 0, KC_A}; + + set_keymap({osl_key, osl_key1, regular_key0, regular_key1}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (regular_key1.report_code)); + EXPECT_EMPTY_REPORT(driver); + regular_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_NO_REPORT(driver); + regular_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osm_key = KeymapKey{1, 1, 0, OSM(MOD_LSFT), KC_LSFT}; + KeymapKey regular_key = KeymapKey{1, 1, 1, KC_A}; + KeymapKey blank_key = KeymapKey{1, 0, 0, KC_NO}; + + set_keymap({osl_key, osm_key, regular_key, blank_key}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp new file mode 100644 index 0000000000..1f89ab3eae --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp @@ -0,0 +1,898 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::InSequence; + +class ChordalHoldPermissiveHold : public TestFixture {}; + +TEST_F(ChordalHoldPermissiveHold, chordal_hold_handedness) { + EXPECT_EQ(chordal_hold_handedness({.col = 0, .row = 0}), 'L'); + EXPECT_EQ(chordal_hold_handedness({.col = MATRIX_COLS - 1, .row = 0}), 'R'); + EXPECT_EQ(chordal_hold_handedness({.col = 0, .row = 2}), '*'); +} + +TEST_F(ChordalHoldPermissiveHold, get_chordal_hold_default) { + auto make_record = [](uint8_t row, uint8_t col, keyevent_type_t type = KEY_EVENT) { + return keyrecord_t{ + .event = + { + .key = {.col = col, .row = row}, + .type = type, + .pressed = true, + }, + }; + }; + // Create two records on the left hand. + keyrecord_t record_l0 = make_record(0, 0); + keyrecord_t record_l1 = make_record(1, 0); + // Create a record on the right hand. + keyrecord_t record_r = make_record(0, MATRIX_COLS - 1); + + // Function should return true when records are on opposite hands. + EXPECT_TRUE(get_chordal_hold_default(&record_l0, &record_r)); + EXPECT_TRUE(get_chordal_hold_default(&record_r, &record_l0)); + // ... and false when on the same hand. + EXPECT_FALSE(get_chordal_hold_default(&record_l0, &record_l1)); + EXPECT_FALSE(get_chordal_hold_default(&record_l1, &record_l0)); + // But (2, 0) has handedness '*', for which true is returned for chords + // with either hand. + keyrecord_t record_l2 = make_record(2, 0); + EXPECT_TRUE(get_chordal_hold_default(&record_l2, &record_l0)); + EXPECT_TRUE(get_chordal_hold_default(&record_l2, &record_r)); + + // Create a record resulting from a combo. + keyrecord_t record_combo = make_record(0, 0, COMBO_EVENT); + // Function returns true in all cases. + EXPECT_TRUE(get_chordal_hold_default(&record_l0, &record_combo)); + EXPECT_TRUE(get_chordal_hold_default(&record_r, &record_combo)); + EXPECT_TRUE(get_chordal_hold_default(&record_combo, &record_l0)); + EXPECT_TRUE(get_chordal_hold_default(&record_combo, &record_r)); +} + +TEST_F(ChordalHoldPermissiveHold, chord_nested_press_settled_as_hold) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_A)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, chord_rolled_press_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key and regular key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, non_chord_with_mod_tap_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key and regular key both on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_P)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, tap_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + idle_for(TAPPING_TERM - 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, hold_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, two_mod_taps_same_hand_hold_til_timeout) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, MATRIX_COLS - 2, 0, RCTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Continue holding til the tapping term. + EXPECT_REPORT(driver, (KC_RIGHT_CTRL)); + EXPECT_REPORT(driver, (KC_RIGHT_CTRL, KC_RIGHT_SHIFT)); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_RIGHT_SHIFT)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, two_mod_taps_nested_press_opposite_hands) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, two_mod_taps_nested_press_same_hand) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, three_mod_taps_same_hand_streak_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + // + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_C)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order, with the first two keys released + // before pressing KC_C. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, three_mod_taps_same_hand_streak_orders) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 2, 1. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 1, 2. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 2, 3, 1. + // + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_A, KC_C)); + // EXPECT_REPORT(driver, (KC_A)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_C)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, three_mod_taps_opposite_hands_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + // + // NOTE: The correct order of events should be + // EXPECT_REPORT(driver, (KC_A, KC_B)); + // EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_B, KC_C)); + // EXPECT_REPORT(driver, (KC_C)); + // EXPECT_EMPTY_REPORT(driver); + // + // However, due to a workaround for https://github.com/tmk/tmk_keyboard/issues/60, + // the events are processed out of order, with the first two keys released + // before pressing KC_C. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, three_mod_taps_two_left_one_right) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 2, then key 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 1, then key 2. + EXPECT_REPORT(driver, (KC_LEFT_CTRL)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, three_mod_taps_one_held_two_tapped) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 2, 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 1, 2. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, two_mod_taps_one_regular_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 2, 0, CTL_T(KC_B)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_C); + + set_keymap({mod_tap_key1, mod_tap_key2, regular_key}); + + // Press keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_C)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, tap_regular_key_while_layer_tap_key_is_held) { + TestDriver driver; + InSequence s; + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto no_key = KeymapKey(1, 1, 0, XXXXXXX); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, no_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + // Press regular key. + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, nested_tap_of_layer_0_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on layer 2 but regular keys on layer 1. + auto first_layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_layer_tap_key = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_on_layer = KeymapKey(1, 1, 0, KC_B); + auto second_key_on_layer = KeymapKey(1, MATRIX_COLS - 1, 0, KC_Q); + + set_keymap({first_layer_tap_key, second_layer_tap_key, first_key_on_layer, second_key_on_layer}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.press(); + run_one_scan_loop(); + // Press second layer-tap key. + second_layer_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + second_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, lt_mt_one_regular_key) { + TestDriver driver; + InSequence s; + auto lt_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto mt_key0 = KeymapKey(0, 2, 0, SFT_T(KC_B)); + auto mt_key1 = KeymapKey(1, 2, 0, CTL_T(KC_C)); + auto regular_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_X); + auto no_key0 = KeymapKey(0, MATRIX_COLS - 1, 0, XXXXXXX); + auto no_key1 = KeymapKey(1, 1, 0, XXXXXXX); + + set_keymap({lt_key, mt_key0, mt_key1, regular_key, no_key0, no_key1}); + + // Press LT, MT, and regular key. + EXPECT_NO_REPORT(driver); + lt_key.press(); + run_one_scan_loop(); + mt_key1.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release the regular key. + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL, KC_X)); + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), MOD_BIT_LCTRL); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release MT key. + EXPECT_EMPTY_REPORT(driver); + mt_key1.release(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); + VERIFY_AND_CLEAR(driver); + + // Release LT key. + EXPECT_NO_REPORT(driver); + lt_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, nested_tap_of_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on all layers. + auto first_key_layer_0 = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_key_layer_0 = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_layer_1 = KeymapKey(1, 1, 0, LT(2, KC_B)); + auto second_key_layer_1 = KeymapKey(1, MATRIX_COLS - 1, 0, LT(2, KC_Q)); + auto first_key_layer_2 = KeymapKey(2, 1, 0, KC_TRNS); + auto second_key_layer_2 = KeymapKey(2, MATRIX_COLS - 1, 0, KC_TRNS); + + set_keymap({first_key_layer_0, second_key_layer_0, first_key_layer_1, second_key_layer_1, first_key_layer_2, second_key_layer_2}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press second layer-tap key. + EXPECT_NO_REPORT(driver); + second_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + second_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHold, roll_layer_tap_key_with_regular_key) { + TestDriver driver; + InSequence s; + + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/config.h b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/config.h new file mode 100644 index 0000000000..4d704c5978 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/config.h @@ -0,0 +1,28 @@ +/* Copyright 2022 Isaac Elenbaas + * Copyright 2024 Google LLC + * + * 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 "test_common.h" + +#define CHORDAL_HOLD +#define PERMISSIVE_HOLD + +#define RETRO_SHIFT 2 * TAPPING_TERM +// releases between AUTO_SHIFT_TIMEOUT and TAPPING_TERM are not tested +#define AUTO_SHIFT_TIMEOUT TAPPING_TERM +#define AUTO_SHIFT_MODIFIERS diff --git a/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test.mk b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test.mk new file mode 100644 index 0000000000..c39dfa9cb1 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test.mk @@ -0,0 +1,18 @@ +# Copyright 2022 Isaac Elenbaas +# Copyright 2024 Google LLC +# +# 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 . + +AUTO_SHIFT_ENABLE = yes +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_keymap.c b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_keymap.c new file mode 100644 index 0000000000..8a6a2c59b0 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_keymap.c @@ -0,0 +1,22 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'*', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, +}; diff --git a/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_retro_shift.cpp b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_retro_shift.cpp new file mode 100644 index 0000000000..16fbabbd8a --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/retro_shift_permissive_hold/test_retro_shift.cpp @@ -0,0 +1,420 @@ +/* Copyright 2022 Isaac Elenbaas + * Copyright 2024 Google LLC + * + * 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 "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +bool get_auto_shifted_key(uint16_t keycode, keyrecord_t *record) { + return true; +} + +using testing::_; +using testing::AnyNumber; +using testing::AnyOf; +using testing::InSequence; + +class RetroShiftPermissiveHold : public TestFixture {}; + +TEST_F(RetroShiftPermissiveHold, tap_regular_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_hold_key, regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release regular key. */ + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LCTL))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LCTL, KC_A)); + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, tap_mod_tap_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto mod_tap_regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, ALT_T(KC_A)); + + set_keymap({mod_tap_hold_key, mod_tap_regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press mod-tap-regular key. */ + EXPECT_NO_REPORT(driver); + mod_tap_regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-regular key. */ + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LCTL))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LCTL, KC_A)); + EXPECT_REPORT(driver, (KC_LCTL)); + mod_tap_regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, tap_regular_key_while_mod_tap_key_is_held_over_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_hold_key, regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release regular key. */ + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LCTL))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LCTL, KC_A)); + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + idle_for(TAPPING_TERM); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, tap_mod_tap_key_while_mod_tap_key_is_held_over_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto mod_tap_regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, ALT_T(KC_A)); + + set_keymap({mod_tap_hold_key, mod_tap_regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press mod-tap-regular key. */ + EXPECT_NO_REPORT(driver); + mod_tap_regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-regular key. */ + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LCTL))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LCTL, KC_A)); + EXPECT_REPORT(driver, (KC_LCTL)); + mod_tap_regular_key.release(); + run_one_scan_loop(); + idle_for(TAPPING_TERM); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, hold_regular_key_while_mod_tap_key_is_held_over_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_hold_key, regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + idle_for(AUTO_SHIFT_TIMEOUT); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release regular key. */ + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(KC_LCTL, KC_LSFT), + KeyboardReport(KC_LSFT), + KeyboardReport(KC_LCTL)))) + .Times(AnyNumber()); + // clang-format on + EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_A)); + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(KC_LCTL, KC_LSFT), + KeyboardReport(KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, hold_mod_tap_key_while_mod_tap_key_is_held_over_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto mod_tap_regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, ALT_T(KC_A)); + + set_keymap({mod_tap_hold_key, mod_tap_regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press mod-tap-regular key. */ + EXPECT_NO_REPORT(driver); + mod_tap_regular_key.press(); + run_one_scan_loop(); + idle_for(AUTO_SHIFT_TIMEOUT); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-regular key. */ + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(KC_LCTL, KC_LSFT), + KeyboardReport(KC_LSFT), + KeyboardReport(KC_LCTL)))) + .Times(AnyNumber()); + // clang-format on + EXPECT_REPORT(driver, (KC_LCTL, KC_LSFT, KC_A)); + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(KC_LCTL, KC_LSFT), + KeyboardReport(KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + EXPECT_REPORT(driver, (KC_LCTL)); + mod_tap_regular_key.release(); + run_one_scan_loop(); + idle_for(TAPPING_TERM); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, roll_tap_regular_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_hold_key, regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release regular key. */ + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, roll_tap_mod_tap_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto mod_tap_regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, ALT_T(KC_A)); + + set_keymap({mod_tap_hold_key, mod_tap_regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press mod-tap-regular key. */ + EXPECT_NO_REPORT(driver); + mod_tap_regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-regular key. */ + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, roll_hold_regular_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_hold_key, regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + idle_for(AUTO_SHIFT_TIMEOUT); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} + +TEST_F(RetroShiftPermissiveHold, roll_hold_mod_tap_key_while_mod_tap_key_is_held_under_tapping_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 0, 0, CTL_T(KC_P)); + auto mod_tap_regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, ALT_T(KC_A)); + + set_keymap({mod_tap_hold_key, mod_tap_regular_key}); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Press mod-tap-regular key. */ + EXPECT_NO_REPORT(driver); + mod_tap_regular_key.press(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-hold key. */ + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); + + /* Release mod-tap-regular key. */ + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_EMPTY_REPORT(driver); + idle_for(AUTO_SHIFT_TIMEOUT); + mod_tap_regular_key.release(); + run_one_scan_loop(); + testing::Mock::VerifyAndClearExpectations(&driver); +} From c7904502e535b4368bd39cb12fa68f2717d0b3c1 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 28 Jan 2025 05:58:21 +0000 Subject: [PATCH 159/592] handwired/xealous - Remove DEFAULT_FOLDER (#24877) --- data/mappings/keyboard_aliases.hjson | 3 ++ keyboards/handwired/xealous/config.h | 32 --------------- keyboards/handwired/xealous/matrix.c | 49 ----------------------- keyboards/handwired/xealous/rev1/config.h | 13 ++++++ keyboards/handwired/xealous/rules.mk | 3 -- 5 files changed, 16 insertions(+), 84 deletions(-) delete mode 100644 keyboards/handwired/xealous/config.h delete mode 100644 keyboards/handwired/xealous/matrix.c delete mode 100644 keyboards/handwired/xealous/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 745faee801..86fcdb8c29 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1731,6 +1731,9 @@ "handwired/unk": { "target": "handwired/unk/rev1" }, + "handwired/xealous": { + "target": "handwired/xealous/rev1" + }, "hillside/46": { "target": "hillside/46/0_1" }, diff --git a/keyboards/handwired/xealous/config.h b/keyboards/handwired/xealous/config.h deleted file mode 100644 index 6cc6b4d1de..0000000000 --- a/keyboards/handwired/xealous/config.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 USE_I2C -#define SCL_CLOCK 800000UL - -//#define DEBUG_MATRIX_SCAN_RATE //Use this to determine scan-rate. - -#ifdef AUDIO_ENABLE - #define AUDIO_PIN C6 - #define STARTUP_SONG SONG(STARTUP_SOUND) - #define NO_MUSIC_MODE - #define TONE_QWERTY SONG(Q__NOTE(_E4)); - #define TONE_NUMPAD SONG(Q__NOTE(_D4)); -#endif diff --git a/keyboards/handwired/xealous/matrix.c b/keyboards/handwired/xealous/matrix.c deleted file mode 100644 index b8ae9fd738..0000000000 --- a/keyboards/handwired/xealous/matrix.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "timer.h" - -// Copy this code to split_common/matrix.c, -// and call it instead of the unoptimized col_reader. Scan-rate jumps from 1200->1920 -// Also remove the sleep_us(30), not necessary for this keyboard. -// In usb_descriptor.c, set .PollingIntervalMS = 0x01 -#define ROW_SHIFTER ((uint8_t)1) -inline static matrix_row_t optimized_col_reader(void) { - //MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5, F4 } - return (PINB & (1 << 6) ? 0 : (ROW_SHIFTER << 0)) | - (PINB & (1 << 2) ? 0 : (ROW_SHIFTER << 1)) | - (PINB & (1 << 3) ? 0 : (ROW_SHIFTER << 2)) | - (PINB & (1 << 1) ? 0 : (ROW_SHIFTER << 3)) | - (PINF & (1 << 7) ? 0 : (ROW_SHIFTER << 4)) | - (PINF & (1 << 6) ? 0 : (ROW_SHIFTER << 5)) | - (PINF & (1 << 5) ? 0 : (ROW_SHIFTER << 6)) | - (PINF & (1 << 4) ? 0 : (ROW_SHIFTER << 7)); -} - - diff --git a/keyboards/handwired/xealous/rev1/config.h b/keyboards/handwired/xealous/rev1/config.h index 49be10cce4..2ea66a692c 100644 --- a/keyboards/handwired/xealous/rev1/config.h +++ b/keyboards/handwired/xealous/rev1/config.h @@ -18,6 +18,19 @@ along with this program. If not, see . #pragma once +#define USE_I2C +#define SCL_CLOCK 800000UL + +//#define DEBUG_MATRIX_SCAN_RATE //Use this to determine scan-rate. + +#ifdef AUDIO_ENABLE + #define AUDIO_PIN C6 + #define STARTUP_SONG SONG(STARTUP_SOUND) + #define NO_MUSIC_MODE + #define TONE_QWERTY SONG(Q__NOTE(_E4)); + #define TONE_NUMPAD SONG(Q__NOTE(_D4)); +#endif + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/handwired/xealous/rules.mk b/keyboards/handwired/xealous/rules.mk deleted file mode 100644 index 4a97d066df..0000000000 --- a/keyboards/handwired/xealous/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -SRC += matrix.c - -DEFAULT_FOLDER = handwired/xealous/rev1 From 8afa3f2f084ce16a2f55ae72efcc2b8db1b74269 Mon Sep 17 00:00:00 2001 From: muge <221161+muge@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:18:41 -0800 Subject: [PATCH 160/592] Add CXT Studio 12E3 keyboard (#24749) Co-authored-by: jack Co-authored-by: Joel Challis --- keyboards/cxt_studio/12e3/keyboard.json | 99 +++++++++++++++++++ .../cxt_studio/12e3/keymaps/default/keymap.c | 40 ++++++++ .../cxt_studio/12e3/keymaps/default/rules.mk | 1 + keyboards/cxt_studio/12e3/readme.md | 27 +++++ 4 files changed, 167 insertions(+) create mode 100644 keyboards/cxt_studio/12e3/keyboard.json create mode 100644 keyboards/cxt_studio/12e3/keymaps/default/keymap.c create mode 100644 keyboards/cxt_studio/12e3/keymaps/default/rules.mk create mode 100644 keyboards/cxt_studio/12e3/readme.md diff --git a/keyboards/cxt_studio/12e3/keyboard.json b/keyboards/cxt_studio/12e3/keyboard.json new file mode 100644 index 0000000000..763f6bd5b9 --- /dev/null +++ b/keyboards/cxt_studio/12e3/keyboard.json @@ -0,0 +1,99 @@ +{ + "manufacturer": "cxt_studio", + "keyboard_name": "cxt_studio 12E3", + "maintainer": "muge", + "bootloader": "atmel-dfu", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "encoder": true, + "rgb_matrix": true + }, + "ws2812": { + "pin": "F7" + }, + "matrix_pins": { + "cols": ["D4", "D7", "B4", "B5"], + "rows": ["C7", "C6", "D6", "F4"] + }, + "encoder": { + "rotary": [ + {"pin_a": "F5", "pin_b": "F6"}, + {"pin_a": "E6", "pin_b": "F0"}, + {"pin_a": "B3", "pin_b": "B2", "resolution": 2} + ] + }, + "processor": "atmega32u4", + "rgb_matrix": { + "animations": { + "breathing": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true + }, + "default": { + "animation": "solid_reactive_simple" + }, + "driver": "ws2812", + "layout": [ + {"flags": 4, "matrix": [0, 3], "x": 3, "y": 0}, + {"flags": 4, "matrix": [0, 2], "x": 2, "y": 0}, + {"flags": 4, "matrix": [0, 1], "x": 1, "y": 0}, + {"flags": 4, "matrix": [0, 0], "x": 0, "y": 0}, + {"flags": 4, "matrix": [1, 0], "x": 0, "y": 1}, + {"flags": 4, "matrix": [1, 1], "x": 1, "y": 1}, + {"flags": 4, "matrix": [1, 2], "x": 2, "y": 1}, + {"flags": 4, "matrix": [1, 3], "x": 3, "y": 1}, + {"flags": 4, "matrix": [2, 3], "x": 3, "y": 2}, + {"flags": 4, "matrix": [2, 2], "x": 2, "y": 2}, + {"flags": 4, "matrix": [2, 1], "x": 1, "y": 2}, + {"flags": 4, "matrix": [2, 0], "x": 0, "y": 2} + ] + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x12E3", + "vid": "0x0215" + }, + "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": [3, 2], "x": 4, "y": 0}, + {"matrix": [3, 3], "x": 5, "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}, + + {"matrix": [3, 1], "x": 4, "y": 1, "w": 2, "h": 2}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + } +} + diff --git a/keyboards/cxt_studio/12e3/keymaps/default/keymap.c b/keyboards/cxt_studio/12e3/keymaps/default/keymap.c new file mode 100644 index 0000000000..78375680d4 --- /dev/null +++ b/keyboards/cxt_studio/12e3/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum my_layers { + _BASE, + _RGBL, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT( + KC_PSCR, KC_CUT, KC_COPY, KC_PSTE, MS_BTN3, RM_TOGG, + KC_CALC, KC_UNDO, KC_MPLY, KC_MNXT, KC_MUTE, + MO(1), KC_LGUI, KC_DEL, KC_APP + ), + + [_RGBL] = LAYOUT( + RM_NEXT, RM_SATU, KC_INS, KC_DEL, _______, _______, + RM_PREV, RM_SATD, KC_PGUP, KC_HOME, _______, + _______, QK_BOOT, KC_PGDN, KC_END + ), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + // Encoders: Left, Right, Big + [_BASE] = { + ENCODER_CCW_CW(MS_WHLD, MS_WHLU), + ENCODER_CCW_CW(KC_PGDN, KC_PGUP), + ENCODER_CCW_CW(KC_VOLD, KC_VOLU) + }, + [_RGBL] = { + ENCODER_CCW_CW(RM_HUED, RM_HUEU), + ENCODER_CCW_CW(RM_SPDD, RM_SPDU), + ENCODER_CCW_CW(RM_VALD, RM_VALU) + }, +}; +#endif diff --git a/keyboards/cxt_studio/12e3/keymaps/default/rules.mk b/keyboards/cxt_studio/12e3/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/cxt_studio/12e3/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cxt_studio/12e3/readme.md b/keyboards/cxt_studio/12e3/readme.md new file mode 100644 index 0000000000..8ea527f473 --- /dev/null +++ b/keyboards/cxt_studio/12e3/readme.md @@ -0,0 +1,27 @@ +# cxt_studio/12e3 + +![cxt_studio/12e3](https://i.postimg.cc/NFK8rY8N/M5rtTSP.png) + +3x4 ortho layout, with 3 encoders. + +* Keyboard Maintainer: [muge](https://github.com/muge) +* Hardware Supported: CXT Studio 12E3 +* Hardware Availability: AliExpress, Taobao + +Make example for this keyboard (after setting up your build environment): + + make cxt_studio/12e3:default + +Flashing example for this keyboard: + + make cxt_studio/12e3: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, located under the large encoder, on the right side +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. It is included in the default layout From 08dcc8856f078e50f6dbdd6a75647f131e270645 Mon Sep 17 00:00:00 2001 From: Joy Lee Date: Wed, 29 Jan 2025 11:09:12 +0800 Subject: [PATCH 161/592] Add more layout for skiller_sgk50_s4 (#24784) * Add more layout for skiller_sgk50_s4 * Update skiller_sgk50_s4 default keymap * update keymap.c Co-authored-by: Ryan * Update keymap.c Co-authored-by: Ryan * Update keyboard.json * Update keyboard.json * Update keyboard.json * Update keyboard.json --------- Co-authored-by: wb Co-authored-by: Ryan --- .../sharkoon/skiller_sgk50_s4/keyboard.json | 130 ++++++++++-------- .../skiller_sgk50_s4/keymaps/default/keymap.c | 12 +- 2 files changed, 80 insertions(+), 62 deletions(-) diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json index 7d36616e52..b7a628fd78 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json @@ -21,7 +21,7 @@ "rgb_matrix": true }, "matrix_pins": { - "cols": ["C0", "C1", "C2", "C3", "A6", "B1", "B10", "B11", "B12", "B13", "B14", "B15", "C6", "C7"], + "cols": ["C0", "C1", "C2", "C3", "A6", "B1", "B10", "B11", "B12", "B13", "B14", "C6", "C7", "C8", "C9", "A8"], "rows": ["A0", "A1", "A2", "A3", "C13"] }, "processor": "WB32FQ95", @@ -77,11 +77,15 @@ "driver": "ws2812", "layout": [ {"matrix": [4, 6], "x": 103, "y": 64, "flags": 4}, + {"matrix": [4, 9], "x": 154, "y": 64, "flags": 4}, {"matrix": [4, 10], "x": 172, "y": 64, "flags": 4}, {"matrix": [4, 11], "x": 190, "y": 64, "flags": 4}, {"matrix": [4, 12], "x": 207, "y": 64, "flags": 4}, - {"matrix": [4, 13], "x": 224, "y": 64, "flags": 4}, - {"matrix": [3, 13], "x": 224, "y": 48, "flags": 4}, + {"matrix": [4, 15], "x": 224, "y": 64, "flags": 4}, + {"matrix": [3, 15], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 14], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 210, "y": 48, "flags": 4}, + {"matrix": [3, 12], "x": 200, "y": 48, "flags": 4}, {"matrix": [3, 11], "x": 190, "y": 48, "flags": 4}, {"matrix": [3, 10], "x": 172, "y": 48, "flags": 4}, {"matrix": [3, 9], "x": 155, "y": 48, "flags": 4}, @@ -93,6 +97,7 @@ {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4}, {"matrix": [3, 2], "x": 34, "y": 48, "flags": 4}, {"matrix": [3, 1], "x": 17, "y": 48, "flags": 4}, + {"matrix": [4, 3], "x": 52, "y": 64, "flags": 4}, {"matrix": [4, 2], "x": 34, "y": 64, "flags": 4}, {"matrix": [4, 1], "x": 17, "y": 64, "flags": 4}, {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, @@ -109,8 +114,10 @@ {"matrix": [2, 9], "x": 155, "y": 32, "flags": 4}, {"matrix": [2, 10], "x": 172, "y": 32, "flags": 4}, {"matrix": [2, 11], "x": 190, "y": 32, "flags": 4}, - {"matrix": [2, 13], "x": 207, "y": 32, "flags": 4}, - {"matrix": [2, 12], "x": 224, "y": 16, "flags": 4}, + {"matrix": [2, 12], "x": 200, "y": 32, "flags": 4}, + {"matrix": [2, 13], "x": 224, "y": 32, "flags": 4}, + {"matrix": [1, 14], "x": 224, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 224, "y": 16, "flags": 4}, {"matrix": [1, 12], "x": 207, "y": 16, "flags": 4}, {"matrix": [1, 11], "x": 190, "y": 16, "flags": 4}, {"matrix": [1, 10], "x": 172, "y": 16, "flags": 4}, @@ -137,7 +144,9 @@ {"matrix": [0, 10], "x": 172, "y": 0, "flags": 4}, {"matrix": [0, 11], "x": 190, "y": 0, "flags": 4}, {"matrix": [0, 12], "x": 207, "y": 0, "flags": 4}, - {"matrix": [0, 13], "x": 224, "y": 0, "flags": 4} + {"matrix": [0, 13], "x": 210, "y": 0, "flags": 4}, + {"matrix": [0, 14], "x": 210, "y": 0, "flags": 4}, + {"matrix": [0, 15], "x": 224, "y": 0, "flags": 4} ], "max_brightness": 110, "sleep": true, @@ -145,13 +154,13 @@ }, "url": "", "usb": { - "device_version": "1.0.0", + "device_version": "1.1.0", "pid": "0x1020", "suspend_wakeup_delay": 1000, "vid": "0x6332" }, "ws2812": { - "pin": "A8" + "pin": "B15" }, "community_layouts": ["60_ansi", "60_iso"], "layouts": { @@ -170,7 +179,9 @@ {"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": [0, 13], "x": 13, "y": 0, "w": 0.5}, + {"matrix": [0, 14], "x": 13.5, "y": 0}, + {"matrix": [0, 15], "x": 14.5, "y": 0, "w": 0.5}, {"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}, @@ -184,7 +195,8 @@ {"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, 12], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [1, 13], "x": 13.5, "y": 1}, + {"matrix": [1, 14], "x": 14.5, "y": 1, "w": 0.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}, @@ -197,28 +209,34 @@ {"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": 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, 13], "x": 12.25, "y": 3, "w": 2.75}, + {"matrix": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 0.75}, + {"matrix": [3, 1], "x": 0.75, "y": 3, "w": 0.5}, + {"matrix": [3, 2], "x": 1.25, "y": 3}, + {"matrix": [3, 3], "x": 2.25, "y": 3}, + {"matrix": [3, 4], "x": 3.25, "y": 3}, + {"matrix": [3, 5], "x": 4.25, "y": 3}, + {"matrix": [3, 6], "x": 5.25, "y": 3}, + {"matrix": [3, 7], "x": 6.25, "y": 3}, + {"matrix": [3, 8], "x": 7.25, "y": 3}, + {"matrix": [3, 9], "x": 8.25, "y": 3}, + {"matrix": [3, 10], "x": 9.25, "y": 3}, + {"matrix": [3, 11], "x": 10.25, "y": 3}, + {"matrix": [3, 12], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3}, + {"matrix": [3, 14], "x": 13.25, "y": 3, "w": 0.75}, + {"matrix": [3, 15], "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, 2], "x": 2.5, "y": 4, "w": 1.25}, - {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 3], "x": 3.75, "y": 4}, + {"matrix": [4, 6], "x": 4.75, "y": 4, "w": 4.25}, + {"matrix": [4, 9], "x": 9, "y": 4}, {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, - {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + {"matrix": [4, 15], "x": 13.75, "y": 4, "w": 1.25} ] }, "LAYOUT_60_ansi": { @@ -236,7 +254,7 @@ {"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": [0, 14], "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}, @@ -250,7 +268,7 @@ {"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, 12], "x": 13.5, "y": 1, "w": 1.5}, + {"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}, @@ -264,18 +282,18 @@ {"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, 13], "x": 12.25, "y": 3, "w": 2.75}, + {"matrix": [3, 1], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 3], "x": 2.25, "y": 3}, + {"matrix": [3, 4], "x": 3.25, "y": 3}, + {"matrix": [3, 5], "x": 4.25, "y": 3}, + {"matrix": [3, 6], "x": 5.25, "y": 3}, + {"matrix": [3, 7], "x": 6.25, "y": 3}, + {"matrix": [3, 8], "x": 7.25, "y": 3}, + {"matrix": [3, 9], "x": 8.25, "y": 3}, + {"matrix": [3, 10], "x": 9.25, "y": 3}, + {"matrix": [3, 11], "x": 10.25, "y": 3}, + {"matrix": [3, 12], "x": 11.25, "y": 3}, + {"matrix": [3, 14], "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, 2], "x": 2.5, "y": 4, "w": 1.25}, @@ -283,7 +301,7 @@ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, - {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + {"matrix": [4, 15], "x": 13.75, "y": 4, "w": 1.25} ] }, "LAYOUT_60_iso": { @@ -301,7 +319,7 @@ {"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": [0, 14], "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}, @@ -328,20 +346,20 @@ {"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": [1, 14], "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, 13], "x": 12.25, "y": 3, "w": 2.75}, + {"matrix": [3, 2], "x": 1.25, "y": 3}, + {"matrix": [3, 3], "x": 2.25, "y": 3}, + {"matrix": [3, 4], "x": 3.25, "y": 3}, + {"matrix": [3, 5], "x": 4.25, "y": 3}, + {"matrix": [3, 6], "x": 5.25, "y": 3}, + {"matrix": [3, 7], "x": 6.25, "y": 3}, + {"matrix": [3, 8], "x": 7.25, "y": 3}, + {"matrix": [3, 9], "x": 8.25, "y": 3}, + {"matrix": [3, 10], "x": 9.25, "y": 3}, + {"matrix": [3, 11], "x": 10.25, "y": 3}, + {"matrix": [3, 12], "x": 11.25, "y": 3}, + {"matrix": [3, 14], "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, 2], "x": 2.5, "y": 4, "w": 1.25}, @@ -349,7 +367,7 @@ {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, - {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + {"matrix": [4, 15], "x": 13.75, "y": 4, "w": 1.25} ] } } diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c index a8a64d1f2d..9a9e207113 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c +++ b/keyboards/sharkoon/skiller_sgk50_s4/keymaps/default/keymap.c @@ -4,18 +4,18 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_all( + [0] = LAYOUT_60_iso( 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_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_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_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_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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL ), - [1] = LAYOUT_all( + [1] = LAYOUT_60_iso( 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, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, RM_VALU, - _______, _______, _______, _______, _______, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, + _______, _______, _______, _______, _______, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, + _______, _______, _______, _______, _______, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, RM_VALD, _______, _______, GU_TOGG, _______, _______, _______, _______, RM_HUEU, RM_NEXT ) From 76b5cef79345cdb42bbcb42417f56881c4e59b2d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 29 Jan 2025 19:17:29 +0000 Subject: [PATCH 162/592] Reject keyboard.json next to info.json (#24882) --- lib/python/qmk/info.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 38ca89697c..d70e7ee1b3 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -99,6 +99,13 @@ def _validate_build_target(keyboard, info_data): if info_file != keyboard_json_path: _log_error(info_data, f'Invalid keyboard.json location detected: {info_file}.') + # No keyboard.json next to info.json + for conf_file in config_files: + if conf_file.name == 'keyboard.json': + info_file = conf_file.parent / 'info.json' + if info_file.exists(): + _log_error(info_data, f'Invalid info.json location detected: {info_file}.') + # Moving forward keyboard.json should be used as a build target if keyboard_json_count == 0: _log_warning(info_data, 'Build marker "keyboard.json" not found.') From 9d799aff97163a1cce24c2bd1551a085fac7a8f6 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:17:54 -0800 Subject: [PATCH 163/592] [Bug][Core] Fix for Chordal Hold: stuck mods when mod-taps are pressed in a stuttered sequence. (#24878) --- quantum/action_tapping.c | 2 +- .../hold_on_other_key_press/test_tap_hold.cpp | 43 ++++++++++++++++++ .../permissive_hold/test_tap_hold.cpp | 45 ++++++++++++++++++- 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index 9171970702..e42a98554d 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -736,7 +736,7 @@ static void waiting_buffer_chordal_hold_taps_until(keypos_t key) { while (waiting_buffer_tail != waiting_buffer_head) { keyrecord_t *record = &waiting_buffer[waiting_buffer_tail]; ac_dprintf("waiting_buffer_chordal_hold_taps_until: processing [%u]\n", waiting_buffer_tail); - if (is_tap_record(record)) { + if (record->event.pressed && is_tap_record(record)) { record->tap.count = 1; registered_taps_add(record->event.key); } diff --git a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp index e6852bbbb1..7691f226af 100644 --- a/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/chordal_hold/hold_on_other_key_press/test_tap_hold.cpp @@ -805,3 +805,46 @@ TEST_F(ChordalHoldHoldOnOtherKeyPress, roll_layer_tap_key_with_regular_key) { run_one_scan_loop(); VERIFY_AND_CLEAR(driver); } + +TEST_F(ChordalHoldHoldOnOtherKeyPress, two_mod_tap_keys_stuttered_press) { + TestDriver driver; + InSequence s; + + auto mod_tap_key1 = KeymapKey(0, 1, 0, LSFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, LCTL_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Hold first mod-tap key until the tapping term. + EXPECT_REPORT(driver, (KC_LSFT)); + mod_tap_key1.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press the second mod-tap key, then quickly release and press the first. + EXPECT_NO_REPORT(driver); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_REPORT(driver, (KC_B, KC_A)); + mod_tap_key1.press(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); // Verify that Shift was released. + VERIFY_AND_CLEAR(driver); + + // Release both keys. + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp index 1f89ab3eae..19e73edb02 100644 --- a/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold/test_tap_hold.cpp @@ -877,6 +877,7 @@ TEST_F(ChordalHoldPermissiveHold, roll_layer_tap_key_with_regular_key) { VERIFY_AND_CLEAR(driver); // Press regular key. + EXPECT_NO_REPORT(driver); regular_key.press(); run_one_scan_loop(); VERIFY_AND_CLEAR(driver); @@ -885,7 +886,6 @@ TEST_F(ChordalHoldPermissiveHold, roll_layer_tap_key_with_regular_key) { EXPECT_REPORT(driver, (KC_P)); EXPECT_REPORT(driver, (KC_P, KC_A)); EXPECT_REPORT(driver, (KC_A)); - EXPECT_NO_REPORT(driver); layer_tap_hold_key.release(); run_one_scan_loop(); VERIFY_AND_CLEAR(driver); @@ -896,3 +896,46 @@ TEST_F(ChordalHoldPermissiveHold, roll_layer_tap_key_with_regular_key) { run_one_scan_loop(); VERIFY_AND_CLEAR(driver); } + +TEST_F(ChordalHoldPermissiveHold, two_mod_tap_keys_stuttered_press) { + TestDriver driver; + InSequence s; + + auto mod_tap_key1 = KeymapKey(0, 1, 0, LSFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, LCTL_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Hold first mod-tap key until the tapping term. + EXPECT_REPORT(driver, (KC_LSFT)); + mod_tap_key1.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press the second mod-tap key, then quickly release and press the first. + EXPECT_NO_REPORT(driver); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_REPORT(driver, (KC_B, KC_A)); + mod_tap_key1.press(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); // Verify that Shift was released. + VERIFY_AND_CLEAR(driver); + + // Release both keys. + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} From d7fb12164a6623da0ab356b2d1ce1c1fa9797535 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 30 Jan 2025 06:18:07 +1100 Subject: [PATCH 164/592] Invoke `process_record_via` after `_user`/`_kb` have a chance to handle it. (#24879) --- quantum/quantum.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index d4ebd58e7f..b63300add8 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -329,13 +329,13 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef HAPTIC_ENABLE process_haptic(keycode, record) && #endif -#if defined(VIA_ENABLE) - process_record_via(keycode, record) && -#endif #if defined(POINTING_DEVICE_ENABLE) && defined(POINTING_DEVICE_AUTO_MOUSE_ENABLE) process_auto_mouse(keycode, record) && #endif process_record_kb(keycode, record) && +#if defined(VIA_ENABLE) + process_record_via(keycode, record) && +#endif #if defined(SECURE_ENABLE) process_secure(keycode, record) && #endif From ea3a968510d14b55c44c3e92dc39600f114fddef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 06:20:08 +1100 Subject: [PATCH 165/592] Bump vite from 5.2.14 to 5.4.12 in /builddefs/docsgen (#24852) --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 477 +++++++++++++++++---------------- 2 files changed, 251 insertions(+), 228 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index 3bc4b38c86..21f56d7ddf 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.2.14", + "vite": "^5.4.12", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index 057e89d073..0b36eec07c 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -178,205 +178,220 @@ "@docsearch/css" "3.6.0" algoliasearch "^4.19.1" -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@rollup/rollup-android-arm-eabi@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5" - integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w== +"@rollup/rollup-android-arm-eabi@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285" + integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA== -"@rollup/rollup-android-arm64@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb" - integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA== +"@rollup/rollup-android-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d" + integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g== -"@rollup/rollup-darwin-arm64@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b" - integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q== +"@rollup/rollup-darwin-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844" + integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g== -"@rollup/rollup-darwin-x64@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791" - integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw== +"@rollup/rollup-darwin-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf" + integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ== -"@rollup/rollup-linux-arm-gnueabihf@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232" - integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ== +"@rollup/rollup-freebsd-arm64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c" + integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew== -"@rollup/rollup-linux-arm-musleabihf@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa" - integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg== +"@rollup/rollup-freebsd-x64@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467" + integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA== -"@rollup/rollup-linux-arm64-gnu@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15" - integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw== +"@rollup/rollup-linux-arm-gnueabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b" + integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw== -"@rollup/rollup-linux-arm64-musl@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820" - integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA== +"@rollup/rollup-linux-arm-musleabihf@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327" + integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg== -"@rollup/rollup-linux-powerpc64le-gnu@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e" - integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg== +"@rollup/rollup-linux-arm64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae" + integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA== -"@rollup/rollup-linux-riscv64-gnu@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128" - integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA== +"@rollup/rollup-linux-arm64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05" + integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g== -"@rollup/rollup-linux-s390x-gnu@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc" - integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q== +"@rollup/rollup-linux-loongarch64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee" + integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ== -"@rollup/rollup-linux-x64-gnu@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0" - integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg== +"@rollup/rollup-linux-powerpc64le-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba" + integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ== -"@rollup/rollup-linux-x64-musl@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f" - integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g== +"@rollup/rollup-linux-riscv64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e" + integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw== -"@rollup/rollup-win32-arm64-msvc@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0" - integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw== +"@rollup/rollup-linux-s390x-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e" + integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ== -"@rollup/rollup-win32-ia32-msvc@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422" - integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g== +"@rollup/rollup-linux-x64-gnu@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" + integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== -"@rollup/rollup-win32-x64-msvc@4.22.4": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202" - integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q== +"@rollup/rollup-linux-x64-musl@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" + integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== + +"@rollup/rollup-win32-arm64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691" + integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw== + +"@rollup/rollup-win32-ia32-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3" + integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ== + +"@rollup/rollup-win32-x64-msvc@4.31.0": + version "4.31.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645" + integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw== "@shikijs/core@1.3.0", "@shikijs/core@^1.3.0": version "1.3.0" @@ -390,10 +405,10 @@ dependencies: shiki "1.3.0" -"@types/estree@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/linkify-it@*": version "3.0.5" @@ -589,34 +604,34 @@ entities@^4.5.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" estree-walker@^2.0.2: version "2.0.2" @@ -662,7 +677,7 @@ mitt@^3.0.1: resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== -nanoid@^3.3.7: +nanoid@^3.3.8: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -672,19 +687,19 @@ perfect-debounce@^1.0.0: resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.4.38, postcss@^8.4.43: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" preact@^10.0.0: version "10.20.2" @@ -696,29 +711,32 @@ rfdc@^1.3.1: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== -rollup@^4.13.0: - version "4.22.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f" - integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A== +rollup@^4.20.0: + version "4.31.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" + integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.22.4" - "@rollup/rollup-android-arm64" "4.22.4" - "@rollup/rollup-darwin-arm64" "4.22.4" - "@rollup/rollup-darwin-x64" "4.22.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.22.4" - "@rollup/rollup-linux-arm-musleabihf" "4.22.4" - "@rollup/rollup-linux-arm64-gnu" "4.22.4" - "@rollup/rollup-linux-arm64-musl" "4.22.4" - "@rollup/rollup-linux-powerpc64le-gnu" "4.22.4" - "@rollup/rollup-linux-riscv64-gnu" "4.22.4" - "@rollup/rollup-linux-s390x-gnu" "4.22.4" - "@rollup/rollup-linux-x64-gnu" "4.22.4" - "@rollup/rollup-linux-x64-musl" "4.22.4" - "@rollup/rollup-win32-arm64-msvc" "4.22.4" - "@rollup/rollup-win32-ia32-msvc" "4.22.4" - "@rollup/rollup-win32-x64-msvc" "4.22.4" + "@rollup/rollup-android-arm-eabi" "4.31.0" + "@rollup/rollup-android-arm64" "4.31.0" + "@rollup/rollup-darwin-arm64" "4.31.0" + "@rollup/rollup-darwin-x64" "4.31.0" + "@rollup/rollup-freebsd-arm64" "4.31.0" + "@rollup/rollup-freebsd-x64" "4.31.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.31.0" + "@rollup/rollup-linux-arm-musleabihf" "4.31.0" + "@rollup/rollup-linux-arm64-gnu" "4.31.0" + "@rollup/rollup-linux-arm64-musl" "4.31.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.31.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0" + "@rollup/rollup-linux-riscv64-gnu" "4.31.0" + "@rollup/rollup-linux-s390x-gnu" "4.31.0" + "@rollup/rollup-linux-x64-gnu" "4.31.0" + "@rollup/rollup-linux-x64-musl" "4.31.0" + "@rollup/rollup-win32-arm64-msvc" "4.31.0" + "@rollup/rollup-win32-ia32-msvc" "4.31.0" + "@rollup/rollup-win32-x64-msvc" "4.31.0" fsevents "~2.3.2" shiki@1.3.0, shiki@^1.3.0: @@ -733,6 +751,11 @@ source-map-js@^1.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + speakingurl@^14.0.1: version "14.0.1" resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" @@ -743,14 +766,14 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.14, vite@^5.2.9: - version "5.2.14" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.14.tgz#fd5f60facf6b5f90ec7da6323c467a365d380c3d" - integrity sha512-TFQLuwWLPms+NBNlh0D9LZQ+HXW471COABxw/9TEUBrjuHMo9BrYBPrN/SYAwIuVL+rLerycxiLT41t4f5MZpA== +vite@^5.2.9, vite@^5.4.12: + version "5.4.12" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.12.tgz#627d12ff06de3942557dfe8632fd712a12a072c7" + integrity sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA== dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" - rollup "^4.13.0" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" From 7073ba3dbb0570309b63bbb6cb9642c4638b229b Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 29 Jan 2025 19:21:09 +0000 Subject: [PATCH 166/592] Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson (#24845) --- data/mappings/keyboard_aliases.hjson | 84 +++++++++++++++++++ keyboards/25keys/aleth42/rules.mk | 1 - keyboards/25keys/zinc/rules.mk | 1 - keyboards/aeboards/ext65/rules.mk | 1 - keyboards/biacco42/ergo42/rules.mk | 1 - keyboards/custommk/genesis/rules.mk | 1 - keyboards/drhigsby/ogurec/rules.mk | 1 - keyboards/input_club/infinity60/rules.mk | 1 - keyboards/jacky_studio/piggy60/rev1/rules.mk | 1 - keyboards/jacky_studio/piggy60/rules.mk | 1 - keyboards/jones/rules.mk | 1 - keyboards/kakunpc/angel17/rules.mk | 1 - keyboards/kakunpc/suihankey/split/rules.mk | 1 - keyboards/keyhive/navi10/rules.mk | 1 - keyboards/keyhive/uno/rules.mk | 1 - .../maple_computing/christmas_tree/rules.mk | 1 - keyboards/marksard/treadstone32/rules.mk | 1 - keyboards/mechlovin/hannah65/rev1/rules.mk | 1 - keyboards/mechlovin/hannah65/rules.mk | 1 - keyboards/rate/pistachio/rules.mk | 1 - keyboards/recompile_keys/choco60/rules.mk | 1 - keyboards/recompile_keys/nomu30/rules.mk | 1 - keyboards/salicylic_acid3/7skb/rules.mk | 1 - keyboards/salicylic_acid3/getta25/rules.mk | 1 - keyboards/salicylic_acid3/jisplit89/rules.mk | 1 - keyboards/salicylic_acid3/naked48/rules.mk | 1 - keyboards/salicylic_acid3/naked60/rules.mk | 1 - keyboards/salicylic_acid3/naked64/rules.mk | 1 - keyboards/salicylic_acid3/setta21/rules.mk | 1 - keyboards/spaceholdings/nebula68b/rules.mk | 1 - keyboards/splitkb/kyria/rules.mk | 1 - keyboards/takashiski/namecard2x4/rules.mk | 1 - keyboards/tominabox1/le_chiffre/rules.mk | 1 - keyboards/ymdk/yd60mq/rules.mk | 1 - 34 files changed, 84 insertions(+), 33 deletions(-) delete mode 100644 keyboards/25keys/aleth42/rules.mk delete mode 100644 keyboards/25keys/zinc/rules.mk delete mode 100644 keyboards/aeboards/ext65/rules.mk delete mode 100644 keyboards/biacco42/ergo42/rules.mk delete mode 100644 keyboards/custommk/genesis/rules.mk delete mode 100644 keyboards/drhigsby/ogurec/rules.mk delete mode 100644 keyboards/input_club/infinity60/rules.mk delete mode 100644 keyboards/jacky_studio/piggy60/rev1/rules.mk delete mode 100644 keyboards/jacky_studio/piggy60/rules.mk delete mode 100644 keyboards/jones/rules.mk delete mode 100644 keyboards/kakunpc/angel17/rules.mk delete mode 100644 keyboards/kakunpc/suihankey/split/rules.mk delete mode 100644 keyboards/keyhive/navi10/rules.mk delete mode 100644 keyboards/keyhive/uno/rules.mk delete mode 100644 keyboards/maple_computing/christmas_tree/rules.mk delete mode 100644 keyboards/marksard/treadstone32/rules.mk delete mode 100644 keyboards/mechlovin/hannah65/rev1/rules.mk delete mode 100644 keyboards/mechlovin/hannah65/rules.mk delete mode 100644 keyboards/rate/pistachio/rules.mk delete mode 100644 keyboards/recompile_keys/choco60/rules.mk delete mode 100644 keyboards/recompile_keys/nomu30/rules.mk delete mode 100644 keyboards/salicylic_acid3/7skb/rules.mk delete mode 100644 keyboards/salicylic_acid3/getta25/rules.mk delete mode 100644 keyboards/salicylic_acid3/jisplit89/rules.mk delete mode 100644 keyboards/salicylic_acid3/naked48/rules.mk delete mode 100644 keyboards/salicylic_acid3/naked60/rules.mk delete mode 100644 keyboards/salicylic_acid3/naked64/rules.mk delete mode 100644 keyboards/salicylic_acid3/setta21/rules.mk delete mode 100644 keyboards/spaceholdings/nebula68b/rules.mk delete mode 100644 keyboards/splitkb/kyria/rules.mk delete mode 100644 keyboards/takashiski/namecard2x4/rules.mk delete mode 100644 keyboards/tominabox1/le_chiffre/rules.mk delete mode 100644 keyboards/ymdk/yd60mq/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 86fcdb8c29..760e54b889 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1575,6 +1575,12 @@ "1upkeyboards/sweet16": { "target": "1upkeyboards/sweet16/v1" }, + "25keys/aleth42": { + "target": "25keys/aleth42/rev1" + }, + "25keys/zinc": { + "target": "25keys/zinc/rev1" + }, "40percentclub/i75": { "target": "40percentclub/i75/promicro" }, @@ -1599,6 +1605,9 @@ "atreyu": { "target": "atreyu/rev1" }, + "biacco42/ergo42": { + "target": "biacco42/ergo42/rev1" + }, "binepad/bn009": { "target": "binepad/bn009/r2" }, @@ -1641,6 +1650,9 @@ "deltasplit75": { "target": "deltasplit75/v2" }, + "drhigsby/ogurec": { + "target": "drhigsby/ogurec/left_pm" + }, "duck/octagon": { "target": "duck/octagon/v2" }, @@ -1755,9 +1767,15 @@ "inett_studio/sq80": { "target": "inett_studio/sq80/hotswap_layout_i" }, + "input_club/infinity60": { + "target": "input_club/infinity60/led" + }, "jacky_studio/bear_65": { "target": "jacky_studio/bear_65/rev1" }, + "jacky_studio/piggy60/rev1": { + "target": "jacky_studio/piggy60/rev1/solder" + }, "jadookb/jkb65": { "target": "jadookb/jkb65/r1" }, @@ -1773,12 +1791,18 @@ "junco": { "target": "junco/rev1" }, + "kakunpc/angel17": { + "target": "kakunpc/angel17/rev1" + }, "kakunpc/business_card": { "target": "kakunpc/business_card/beta" }, "kakunpc/suihankey": { "target": "kakunpc/suihankey/rev1" }, + "kakunpc/suihankey/split": { + "target": "kakunpc/suihankey/split/rev1" + }, "kapcave/paladinpad": { "target": "kapcave/paladinpad/rev2" }, @@ -1821,6 +1845,12 @@ "keycapsss/kimiko": { "target": "keycapsss/kimiko/rev2" }, + "keyhive/navi10": { + "target": "keyhive/navi10/rev3" + }, + "keyhive/uno": { + "target": "keyhive/uno/rev1" + }, "kin80": { "target": "kin80/blackpill401" }, @@ -1851,6 +1881,9 @@ "lime": { "target": "lime/rev1" }, + "maple_computing/christmas_tree": { + "target": "maple_computing/christmas_tree/v2017" + }, "maple_computing/ivy": { "target": "maple_computing/ivy/rev1" }, @@ -1866,6 +1899,9 @@ "marksard/rhymestone": { "target": "marksard/rhymestone/rev1" }, + "marksard/treadstone32": { + "target": "marksard/treadstone32/rev1" + }, "marksard/treadstone48": { "target": "marksard/treadstone48/rev1" }, @@ -1890,6 +1926,9 @@ "mechlovin/adelais/standard_led/avr": { "target": "mechlovin/adelais/standard_led/avr/rev1" }, + "mechlovin/hannah65/rev1": { + "target": "mechlovin/hannah65/rev1/haus" + }, "mechlovin/infinity87/rev1": { "target": "mechlovin/infinity87/rev1/standard" }, @@ -1986,6 +2025,15 @@ "qwertyydox": { "target": "qwertyydox/rev1" }, + "rate/pistachio": { + "target": "rate/pistachio/rev2" + }, + "recompile_keys/choco60": { + "target": "recompile_keys/choco60/rev1" + }, + "recompile_keys/nomu30": { + "target": "recompile_keys/nomu30/rev1" + }, "redox/rev1": { "target": "redox/rev1/base" }, @@ -2025,6 +2073,27 @@ "rura66": { "target": "rura66/rev1" }, + "salicylic_acid3/7skb": { + "target": "salicylic_acid3/7skb/rev1" + }, + "salicylic_acid3/getta25": { + "target": "salicylic_acid3/getta25/rev1" + }, + "salicylic_acid3/jisplit89": { + "target": "salicylic_acid3/jisplit89/rev1" + }, + "salicylic_acid3/naked48": { + "target": "salicylic_acid3/naked48/rev1" + }, + "salicylic_acid3/naked60": { + "target": "salicylic_acid3/naked60/rev1" + }, + "salicylic_acid3/naked64": { + "target": "salicylic_acid3/naked64/rev1" + }, + "salicylic_acid3/setta21": { + "target": "salicylic_acid3/setta21/rev1" + }, "sawnsprojects/okayu": { "target": "sawnsprojects/okayu/stm32f072" }, @@ -2034,6 +2103,9 @@ "sofle": { "target": "sofle/rev1" }, + "spaceholdings/nebula68b": { + "target": "spaceholdings/nebula68b/solder" + }, "spacetime": { "target": "spacetime/rev1" }, @@ -2052,6 +2124,9 @@ "splitkb/aurora/sweep": { "target": "splitkb/aurora/sweep/rev1" }, + "splitkb/kyria": { + "target": "splitkb/kyria/rev3" + }, "splitkb/kyria/rev1": { "target": "splitkb/kyria/rev1/base" }, @@ -2067,12 +2142,18 @@ "takashiski/hecomi": { "target": "takashiski/hecomi/alpha" }, + "takashiski/namecard2x4": { + "target": "takashiski/namecard2x4/rev2" + }, "themadnoodle/noodlepad": { "target": "themadnoodle/noodlepad/v1" }, "tkw/grandiceps": { "target": "tkw/grandiceps/rev1" }, + "tominabox1/le_chiffre": { + "target": "tominabox1/le_chiffre/rev1" + }, "tominabox1/littlefoot_lx": { "target": "tominabox1/littlefoot_lx/rev1" }, @@ -2103,6 +2184,9 @@ "yosino58": { "target": "yosino58/rev1" }, + "ymdk/yd60mq": { + "target": "ymdk/yd60mq/12led" + }, "yushakobo/navpad/10": { "target": "yushakobo/navpad/10/rev1" }, diff --git a/keyboards/25keys/aleth42/rules.mk b/keyboards/25keys/aleth42/rules.mk deleted file mode 100644 index 8034ad5440..0000000000 --- a/keyboards/25keys/aleth42/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 25keys/aleth42/rev1 diff --git a/keyboards/25keys/zinc/rules.mk b/keyboards/25keys/zinc/rules.mk deleted file mode 100644 index 1edcb0a345..0000000000 --- a/keyboards/25keys/zinc/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = 25keys/zinc/rev1 diff --git a/keyboards/aeboards/ext65/rules.mk b/keyboards/aeboards/ext65/rules.mk deleted file mode 100644 index d8b0595a5d..0000000000 --- a/keyboards/aeboards/ext65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = aeboards/ext65/rev2 \ No newline at end of file diff --git a/keyboards/biacco42/ergo42/rules.mk b/keyboards/biacco42/ergo42/rules.mk deleted file mode 100644 index 18059c0a3b..0000000000 --- a/keyboards/biacco42/ergo42/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = biacco42/ergo42/rev1 diff --git a/keyboards/custommk/genesis/rules.mk b/keyboards/custommk/genesis/rules.mk deleted file mode 100644 index 3d64c0af2b..0000000000 --- a/keyboards/custommk/genesis/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = custommk/genesis/rev2 diff --git a/keyboards/drhigsby/ogurec/rules.mk b/keyboards/drhigsby/ogurec/rules.mk deleted file mode 100644 index ed83fb6386..0000000000 --- a/keyboards/drhigsby/ogurec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = drhigsby/ogurec/left_pm diff --git a/keyboards/input_club/infinity60/rules.mk b/keyboards/input_club/infinity60/rules.mk deleted file mode 100644 index 9c4b1e74c2..0000000000 --- a/keyboards/input_club/infinity60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = input_club/infinity60/led diff --git a/keyboards/jacky_studio/piggy60/rev1/rules.mk b/keyboards/jacky_studio/piggy60/rev1/rules.mk deleted file mode 100644 index 873e9334ed..0000000000 --- a/keyboards/jacky_studio/piggy60/rev1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jacky_studio/piggy60/rev1/solder diff --git a/keyboards/jacky_studio/piggy60/rules.mk b/keyboards/jacky_studio/piggy60/rules.mk deleted file mode 100644 index 873e9334ed..0000000000 --- a/keyboards/jacky_studio/piggy60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jacky_studio/piggy60/rev1/solder diff --git a/keyboards/jones/rules.mk b/keyboards/jones/rules.mk deleted file mode 100644 index 9f0da2abec..0000000000 --- a/keyboards/jones/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = jones/v1 diff --git a/keyboards/kakunpc/angel17/rules.mk b/keyboards/kakunpc/angel17/rules.mk deleted file mode 100644 index 48095d37e6..0000000000 --- a/keyboards/kakunpc/angel17/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kakunpc/angel17/rev1 diff --git a/keyboards/kakunpc/suihankey/split/rules.mk b/keyboards/kakunpc/suihankey/split/rules.mk deleted file mode 100644 index 1dc7b014f0..0000000000 --- a/keyboards/kakunpc/suihankey/split/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = kakunpc/suihankey/split/rev1 diff --git a/keyboards/keyhive/navi10/rules.mk b/keyboards/keyhive/navi10/rules.mk deleted file mode 100644 index 6ebb2d0ceb..0000000000 --- a/keyboards/keyhive/navi10/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keyhive/navi10/rev3 diff --git a/keyboards/keyhive/uno/rules.mk b/keyboards/keyhive/uno/rules.mk deleted file mode 100644 index 3220994593..0000000000 --- a/keyboards/keyhive/uno/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = keyhive/uno/rev1 diff --git a/keyboards/maple_computing/christmas_tree/rules.mk b/keyboards/maple_computing/christmas_tree/rules.mk deleted file mode 100644 index 3a6633cf56..0000000000 --- a/keyboards/maple_computing/christmas_tree/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = maple_computing/christmas_tree/v2017 diff --git a/keyboards/marksard/treadstone32/rules.mk b/keyboards/marksard/treadstone32/rules.mk deleted file mode 100644 index 2d7ca16d86..0000000000 --- a/keyboards/marksard/treadstone32/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = marksard/treadstone32/rev1 diff --git a/keyboards/mechlovin/hannah65/rev1/rules.mk b/keyboards/mechlovin/hannah65/rev1/rules.mk deleted file mode 100644 index ae9bc176a4..0000000000 --- a/keyboards/mechlovin/hannah65/rev1/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/hannah65/rev1/haus diff --git a/keyboards/mechlovin/hannah65/rules.mk b/keyboards/mechlovin/hannah65/rules.mk deleted file mode 100644 index ae9bc176a4..0000000000 --- a/keyboards/mechlovin/hannah65/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = mechlovin/hannah65/rev1/haus diff --git a/keyboards/rate/pistachio/rules.mk b/keyboards/rate/pistachio/rules.mk deleted file mode 100644 index a5f4485316..0000000000 --- a/keyboards/rate/pistachio/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = rate/pistachio/rev2 diff --git a/keyboards/recompile_keys/choco60/rules.mk b/keyboards/recompile_keys/choco60/rules.mk deleted file mode 100644 index 6abfd34d47..0000000000 --- a/keyboards/recompile_keys/choco60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = recompile_keys/choco60/rev1 diff --git a/keyboards/recompile_keys/nomu30/rules.mk b/keyboards/recompile_keys/nomu30/rules.mk deleted file mode 100644 index 431b619249..0000000000 --- a/keyboards/recompile_keys/nomu30/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = recompile_keys/nomu30/rev1 diff --git a/keyboards/salicylic_acid3/7skb/rules.mk b/keyboards/salicylic_acid3/7skb/rules.mk deleted file mode 100644 index 15364c29a5..0000000000 --- a/keyboards/salicylic_acid3/7skb/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/7skb/rev1 diff --git a/keyboards/salicylic_acid3/getta25/rules.mk b/keyboards/salicylic_acid3/getta25/rules.mk deleted file mode 100644 index 069fe74b14..0000000000 --- a/keyboards/salicylic_acid3/getta25/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/getta25/rev1 diff --git a/keyboards/salicylic_acid3/jisplit89/rules.mk b/keyboards/salicylic_acid3/jisplit89/rules.mk deleted file mode 100644 index d54d2ccef4..0000000000 --- a/keyboards/salicylic_acid3/jisplit89/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/jisplit89/rev1 diff --git a/keyboards/salicylic_acid3/naked48/rules.mk b/keyboards/salicylic_acid3/naked48/rules.mk deleted file mode 100644 index dadfa7a257..0000000000 --- a/keyboards/salicylic_acid3/naked48/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/naked48/rev1 diff --git a/keyboards/salicylic_acid3/naked60/rules.mk b/keyboards/salicylic_acid3/naked60/rules.mk deleted file mode 100644 index 904309ea35..0000000000 --- a/keyboards/salicylic_acid3/naked60/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/naked60/rev1 diff --git a/keyboards/salicylic_acid3/naked64/rules.mk b/keyboards/salicylic_acid3/naked64/rules.mk deleted file mode 100644 index 0ac8d83bfc..0000000000 --- a/keyboards/salicylic_acid3/naked64/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/naked64/rev1 diff --git a/keyboards/salicylic_acid3/setta21/rules.mk b/keyboards/salicylic_acid3/setta21/rules.mk deleted file mode 100644 index 02e68b5748..0000000000 --- a/keyboards/salicylic_acid3/setta21/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = salicylic_acid3/setta21/rev1 diff --git a/keyboards/spaceholdings/nebula68b/rules.mk b/keyboards/spaceholdings/nebula68b/rules.mk deleted file mode 100644 index 8fe37f83b3..0000000000 --- a/keyboards/spaceholdings/nebula68b/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = spaceholdings/nebula68b/solder diff --git a/keyboards/splitkb/kyria/rules.mk b/keyboards/splitkb/kyria/rules.mk deleted file mode 100644 index 1342089f56..0000000000 --- a/keyboards/splitkb/kyria/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = splitkb/kyria/rev3 diff --git a/keyboards/takashiski/namecard2x4/rules.mk b/keyboards/takashiski/namecard2x4/rules.mk deleted file mode 100644 index f93cfc823d..0000000000 --- a/keyboards/takashiski/namecard2x4/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = takashiski/namecard2x4/rev2 diff --git a/keyboards/tominabox1/le_chiffre/rules.mk b/keyboards/tominabox1/le_chiffre/rules.mk deleted file mode 100644 index 57b3d94eab..0000000000 --- a/keyboards/tominabox1/le_chiffre/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = tominabox1/le_chiffre/rev1 diff --git a/keyboards/ymdk/yd60mq/rules.mk b/keyboards/ymdk/yd60mq/rules.mk deleted file mode 100644 index c37722c8bb..0000000000 --- a/keyboards/ymdk/yd60mq/rules.mk +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_FOLDER = ymdk/yd60mq/12led From 0c14fc3a211fc6ba55cf58c1b8224700102a33b3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 29 Jan 2025 19:22:05 +0000 Subject: [PATCH 167/592] Resolve keyboard_aliases when processing keyboard make targets (#24834) --- Makefile | 36 +++++++++++++++++++---------- lib/python/qmk/cli/__init__.py | 1 + lib/python/qmk/cli/resolve_alias.py | 16 +++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 lib/python/qmk/cli/resolve_alias.py diff --git a/Makefile b/Makefile index 5fcd6bbf0f..c68ee7418a 100644 --- a/Makefile +++ b/Makefile @@ -113,6 +113,29 @@ endef # Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND) +# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional +# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule +define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB + # Split on ":", padding with empty strings to avoid indexing issues + TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE)) + TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE)) + + TOKEN1:=$$(shell $(QMK_BIN) resolve-alias --allow-unknown $$(TOKEN1)) + + FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1)) + ifneq ($$(FOUNDx),) + RULE := $$(TOKENr) + RULE_FOUND := true + MATCHED_ITEM := $$(TOKEN1) + else + RULE_FOUND := false + MATCHED_ITEM := + endif +endef + +# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST_KB +TRY_TO_MATCH_RULE_FROM_LIST_KB = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB,$1))$(RULE_FOUND) + define ALL_IN_LIST_LOOP OLD_RULE$1 := $$(RULE) $$(eval $$(call $1,$$(ITEM$1))) @@ -138,7 +161,7 @@ define PARSE_RULE $$(eval $$(call PARSE_TEST)) # If the rule starts with the name of a known keyboard, then continue # the parsing from PARSE_KEYBOARD - else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults)),true) + else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST_KB,$$(shell $(QMK_BIN) list-keyboards)),true) KEYBOARD_RULE=$$(MATCHED_ITEM) $$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM))) else @@ -170,17 +193,6 @@ define PARSE_KEYBOARD # include the correct makefile to determine the actual name of it CURRENT_KB := $1 - # KEYBOARD_FOLDERS := $$(subst /, , $(CURRENT_KB)) - - DEFAULT_FOLDER := $$(CURRENT_KB) - - # We assume that every rules.mk will contain the full default value - $$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/rules.mk) - ifneq ($$(DEFAULT_FOLDER),$$(CURRENT_KB)) - $$(eval include $(ROOT_DIR)/keyboards/$$(DEFAULT_FOLDER)/rules.mk) - endif - CURRENT_KB := $$(DEFAULT_FOLDER) - # 5/4/3/2/1 KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB) KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1))) diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 2d63dfb447..bb47ea26ed 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -82,6 +82,7 @@ subcommands = [ 'qmk.cli.new.keymap', 'qmk.cli.painter', 'qmk.cli.pytest', + 'qmk.cli.resolve_alias', 'qmk.cli.test.c', 'qmk.cli.userspace.add', 'qmk.cli.userspace.compile', diff --git a/lib/python/qmk/cli/resolve_alias.py b/lib/python/qmk/cli/resolve_alias.py new file mode 100644 index 0000000000..b9ffb46618 --- /dev/null +++ b/lib/python/qmk/cli/resolve_alias.py @@ -0,0 +1,16 @@ +from qmk.keyboard import keyboard_folder + +from milc import cli + + +@cli.argument('--allow-unknown', arg_only=True, action='store_true', help="Return original if rule is not a valid keyboard.") +@cli.argument('keyboard', arg_only=True, help='The keyboard\'s name') +@cli.subcommand('Resolve DEFAULT_FOLDER and any keyboard_aliases for provided rule') +def resolve_alias(cli): + try: + print(keyboard_folder(cli.args.keyboard)) + except ValueError: + if cli.args.allow_unknown: + print(cli.args.keyboard) + else: + raise From 8bf01dd7966c9d556a7931be47f97bafe9a32ff9 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 29 Jan 2025 11:25:21 -0800 Subject: [PATCH 168/592] [OS Detection] Improve MacOS detection (#24708) --- quantum/os_detection.c | 2 +- quantum/os_detection/tests/os_detection.cpp | 61 ++++++++++++++++++--- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/quantum/os_detection.c b/quantum/os_detection.c index 0dd048a8c4..84bbeeed54 100644 --- a/quantum/os_detection.c +++ b/quantum/os_detection.c @@ -133,7 +133,7 @@ void process_wlength(const uint16_t w_length) { } else if (setups_data.count == setups_data.cnt_ff) { // Linux has 3 packets with 0xFF. guessed = OS_LINUX; - } else if (setups_data.count == 5 && setups_data.last_wlength == 0xFF && setups_data.cnt_ff == 1 && setups_data.cnt_02 == 2) { + } else if (setups_data.count >= 5 && setups_data.last_wlength == 0xFF && setups_data.cnt_ff >= 1 && setups_data.cnt_02 >= 2) { guessed = OS_MACOS; } else if (setups_data.count == 4 && setups_data.cnt_ff == 0 && setups_data.cnt_02 == 2) { // iOS and iPadOS don't have the last 0xFF packet. diff --git a/quantum/os_detection/tests/os_detection.cpp b/quantum/os_detection/tests/os_detection.cpp index ea43de144c..21c4536243 100644 --- a/quantum/os_detection/tests/os_detection.cpp +++ b/quantum/os_detection/tests/os_detection.cpp @@ -68,8 +68,12 @@ ChibiOS: Windows 10: [FF, FF, 4, 24, 4, 24, 4, FF, 24, FF, 4, FF, 24, 4, 24, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A] Windows 10 (another host): [FF, FF, 4, 24, 4, 24, 4, 24, 4, 24, 4, 24] macOS 12.5: [2, 24, 2, 28, FF] +macOS 15.1.x: [ 2, 4E, 2, 1C, 2, 1A, FF, FF] +macOS 15.x (another host): [ 2, 0E, 2, 1E, 2, 42, FF] +macOS 15.x (periodic weirdness): [ 2, 42, 2, 1C, 2, 1A, FF, 2, 42, 2, 1C, 2, 1A, FF ] iOS/iPadOS 15.6: [2, 24, 2, 28] Linux (including Android, Raspberry Pi and WebOS TV): [FF, FF, FF] +Linux (another host): [FF, FF, FF, FF, FF, FF] PS5: [2, 4, 2, 28, 2, 24] Nintendo Switch: [82, FF, 40, 40, FF, 40, 40, FF, 40, 40, FF, 40, 40, FF, 40, 40] Quest 2: [FF, FF, FF, FE, FF, FE, FF, FE, FF, FE, FF] @@ -79,6 +83,7 @@ Windows 10 (first connect): [12, FF, FF, 4, 10, FF, FF, FF, 4, 10, 20A, 20A, 20A Windows 10 (subsequent connect): [FF, FF, 4, 10, FF, 4, FF, 10, FF, 20A, 20A, 20A, 20A, 20A, 20A] Windows 10 (another host): [FF, FF, 4, 10, 4, 10] macOS: [2, 10, 2, E, FF] +macOS 15.x: [ 2, 64, 2, 28, FF, FF] iOS/iPadOS: [2, 10, 2, E] Linux: [FF, FF, FF] PS5: [2, 4, 2, E, 2, 10] @@ -109,18 +114,67 @@ TEST_F(OsDetectionTest, TestLinux) { assert_not_reported(); } +TEST_F(OsDetectionTest, TestChibiosLinux) { + EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}), OS_LINUX); + os_detection_task(); + assert_not_reported(); +} + TEST_F(OsDetectionTest, TestChibiosMacos) { EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28, 0xFF}), OS_MACOS); os_detection_task(); assert_not_reported(); } +TEST_F(OsDetectionTest, TestChibiosMacos2) { + EXPECT_EQ(check_sequence({0x2, 0x42, 0x2, 0x1C, 0x2, 0x1A, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + +TEST_F(OsDetectionTest, TestChibiosMacos3) { + EXPECT_EQ(check_sequence({0x2, 0x42, 0x2, 0x1C, 0x2, 0x1A, 0xFF, 0x2, 0x42, 0x2, 0x1C, 0x2, 0x1A, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + +// Regression reported in https://github.com/qmk/qmk_firmware/pull/21777#issuecomment-1922815841 +TEST_F(OsDetectionTest, TestChibiosMacM1) { + EXPECT_EQ(check_sequence({0x02, 0x32, 0x02, 0x24, 0x101, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + +TEST_F(OsDetectionTest, TestChibiosMacSequoia) { + EXPECT_EQ(check_sequence({0x02, 0x4E, 0x02, 0x1C, 0x02, 0x1A, 0xFF, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + +TEST_F(OsDetectionTest, TestChibiosMacSequoia2) { + EXPECT_EQ(check_sequence({0x02, 0x4E, 0x02, 0x1C, 0x02, 0x1A, 0xFF, 0x02, 0x42, 0x02, 0x1C, 0x02, 0x1A, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + +TEST_F(OsDetectionTest, TestChibiosMacSequoia3) { + EXPECT_EQ(check_sequence({0x02, 0x0E, 0x02, 0x1E, 0x02, 0x42, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + TEST_F(OsDetectionTest, TestLufaMacos) { EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE, 0xFF}), OS_MACOS); os_detection_task(); assert_not_reported(); } +TEST_F(OsDetectionTest, TestDetectLufaMacSequoia2) { + EXPECT_EQ(check_sequence({0x02, 0x64, 0x02, 0x28, 0xFF, 0xFF}), OS_MACOS); + os_detection_task(); + assert_not_reported(); +} + TEST_F(OsDetectionTest, TestVusbMacos) { EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE, 0xFF}), OS_MACOS); os_detection_task(); @@ -235,13 +289,6 @@ TEST_F(OsDetectionTest, TestVusbQuest2) { assert_not_reported(); } -// Regression reported in https://github.com/qmk/qmk_firmware/pull/21777#issuecomment-1922815841 -TEST_F(OsDetectionTest, TestDetectMacM1AsIOS) { - EXPECT_EQ(check_sequence({0x02, 0x32, 0x02, 0x24, 0x101, 0xFF}), OS_IOS); - os_detection_task(); - assert_not_reported(); -} - TEST_F(OsDetectionTest, TestDoNotReportIfUsbUnstable) { EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX); os_detection_task(); From fa98117a3e10afed347f16b2614e4e8a9e26cd32 Mon Sep 17 00:00:00 2001 From: adophoxia <100170946+adophoxia@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:28:58 -0800 Subject: [PATCH 169/592] Add Keychron C3 Pro (Red & RGB) (#24874) * Add Keychron C3 Pro variants * Update to upstream standards * Apply suggestions from code review Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Ryan * Reformatted `keyboard.json` for `red`/`rgb` and `c3_pro.c` * Apply suggestions from code review Co-authored-by: Ryan * Update keyboards/keychron/c3_pro/ansi/red/config.h Co-authored-by: Daniel <1767914+iamdanielv@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Drashna Jaelre * Add C Pro V2 variants * remove boards by accident --------- Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Ryan Co-authored-by: Daniel <1767914+iamdanielv@users.noreply.github.com> Co-authored-by: Drashna Jaelre --- keyboards/keychron/c3_pro/ansi/red/config.h | 31 +++ .../keychron/c3_pro/ansi/red/keyboard.json | 242 +++++++++++++++++ .../c3_pro/ansi/red/keymaps/default/keymap.c | 60 +++++ keyboards/keychron/c3_pro/ansi/red/red.c | 132 ++++++++++ keyboards/keychron/c3_pro/ansi/rgb/config.h | 29 ++ .../keychron/c3_pro/ansi/rgb/keyboard.json | 249 ++++++++++++++++++ .../c3_pro/ansi/rgb/keymaps/default/keymap.c | 64 +++++ keyboards/keychron/c3_pro/ansi/rgb/rgb.c | 135 ++++++++++ keyboards/keychron/c3_pro/c3_pro.c | 112 ++++++++ keyboards/keychron/c3_pro/c3_pro.h | 25 ++ keyboards/keychron/c3_pro/config.h | 24 ++ keyboards/keychron/c3_pro/halconf.h | 21 ++ keyboards/keychron/c3_pro/info.json | 26 ++ keyboards/keychron/c3_pro/mcuconf.h | 28 ++ keyboards/keychron/c3_pro/readme.md | 28 ++ 15 files changed, 1206 insertions(+) create mode 100644 keyboards/keychron/c3_pro/ansi/red/config.h create mode 100644 keyboards/keychron/c3_pro/ansi/red/keyboard.json create mode 100644 keyboards/keychron/c3_pro/ansi/red/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c3_pro/ansi/red/red.c create mode 100644 keyboards/keychron/c3_pro/ansi/rgb/config.h create mode 100644 keyboards/keychron/c3_pro/ansi/rgb/keyboard.json create mode 100644 keyboards/keychron/c3_pro/ansi/rgb/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c3_pro/ansi/rgb/rgb.c create mode 100644 keyboards/keychron/c3_pro/c3_pro.c create mode 100644 keyboards/keychron/c3_pro/c3_pro.h create mode 100644 keyboards/keychron/c3_pro/config.h create mode 100644 keyboards/keychron/c3_pro/halconf.h create mode 100644 keyboards/keychron/c3_pro/info.json create mode 100644 keyboards/keychron/c3_pro/mcuconf.h create mode 100644 keyboards/keychron/c3_pro/readme.md diff --git a/keyboards/keychron/c3_pro/ansi/red/config.h b/keyboards/keychron/c3_pro/ansi/red/config.h new file mode 100644 index 0000000000..5af1da7f3b --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/red/config.h @@ -0,0 +1,31 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 + +/* Indication led */ +#define LED_MAC_OS_PIN A4 +#define LED_WIN_OS_PIN A5 +#define LED_OS_PIN_ON_STATE 1 + +/* LED Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND + +/* Use first 7 channels of LED driver */ +#define SNLED27351_PHASE_CHANNEL SNLED27351_SCAN_PHASE_7_CHANNEL + +/* Set LED driver current */ +#define SNLED27351_CURRENT_TUNE { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50 } diff --git a/keyboards/keychron/c3_pro/ansi/red/keyboard.json b/keyboards/keychron/c3_pro/ansi/red/keyboard.json new file mode 100644 index 0000000000..a759e92928 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/red/keyboard.json @@ -0,0 +1,242 @@ + +{ + "keyboard_name": "Keychron C3 Pro Red", + "features": { + "led_matrix": true + }, + "indicators": { + "caps_lock": "A3" + }, + "led_matrix": { + "animations": { + "band_pinwheel": true, + "band_spiral": true, + "breathing": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_up_down": true, + "dual_beacon": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 26, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 39, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 52, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 65, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 84, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 97, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 110, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 123, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 143, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 156, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 169, "y": 0, "flags": 1}, + {"matrix": [0, 13], "x": 182, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 198, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 211, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 224, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 1}, + {"matrix": [1, 1], "x": 13, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 26, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 39, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 52, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 65, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 78, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 91, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 104, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 117, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 130, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 143, "y": 16, "flags": 4}, + {"matrix": [1, 12], "x": 156, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 175, "y": 16, "flags": 1}, + {"matrix": [1, 14], "x": 198, "y": 16, "flags": 1}, + {"matrix": [1, 15], "x": 211, "y": 16, "flags": 1}, + {"matrix": [1, 16], "x": 224, "y": 16, "flags": 1}, + + {"matrix": [2, 0], "x": 3, "y": 28, "flags": 1}, + {"matrix": [2, 1], "x": 19, "y": 28, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 28, "flags": 4}, + {"matrix": [2, 3], "x": 45, "y": 28, "flags": 4}, + {"matrix": [2, 4], "x": 58, "y": 28, "flags": 4}, + {"matrix": [2, 5], "x": 71, "y": 28, "flags": 4}, + {"matrix": [2, 6], "x": 84, "y": 28, "flags": 4}, + {"matrix": [2, 7], "x": 97, "y": 28, "flags": 4}, + {"matrix": [2, 8], "x": 110, "y": 28, "flags": 4}, + {"matrix": [2, 9], "x": 123, "y": 28, "flags": 4}, + {"matrix": [2, 10], "x": 136, "y": 28, "flags": 4}, + {"matrix": [2, 11], "x": 149, "y": 28, "flags": 4}, + {"matrix": [2, 12], "x": 162, "y": 28, "flags": 4}, + {"matrix": [2, 13], "x": 178, "y": 28, "flags": 1}, + {"matrix": [2, 14], "x": 198, "y": 28, "flags": 1}, + {"matrix": [2, 15], "x": 211, "y": 28, "flags": 1}, + {"matrix": [2, 16], "x": 224, "y": 28, "flags": 1}, + + {"matrix": [3, 0], "x": 5, "y": 40, "flags": 8}, + {"matrix": [3, 1], "x": 23, "y": 40, "flags": 4}, + {"matrix": [3, 2], "x": 36, "y": 40, "flags": 4}, + {"matrix": [3, 3], "x": 49, "y": 40, "flags": 4}, + {"matrix": [3, 4], "x": 62, "y": 40, "flags": 4}, + {"matrix": [3, 5], "x": 75, "y": 40, "flags": 4}, + {"matrix": [3, 6], "x": 88, "y": 40, "flags": 4}, + {"matrix": [3, 7], "x": 101, "y": 40, "flags": 4}, + {"matrix": [3, 8], "x": 114, "y": 40, "flags": 4}, + {"matrix": [3, 9], "x": 126, "y": 40, "flags": 4}, + {"matrix": [3, 10], "x": 139, "y": 40, "flags": 4}, + {"matrix": [3, 11], "x": 152, "y": 40, "flags": 4}, + {"matrix": [3, 13], "x": 173, "y": 40, "flags": 1}, + + {"matrix": [4, 0], "x": 8, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 29, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 42, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 68, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 81, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 94, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 107, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 120, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 133, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 146, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 170, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 211, "y": 52, "flags": 1}, + + {"matrix": [5, 0], "x": 2, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 18, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 34, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 83, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 131, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 148, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 164, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 180, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 198, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 211, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 224, "y": 64, "flags": 1}, + + {"x": 0, "y": 0, "flags": 1}, + {"x": 0, "y": 16, "flags": 1}, + {"x": 0, "y": 28, "flags": 1}, + {"x": 0, "y": 40, "flags": 1}, + {"x": 0, "y": 52, "flags": 1}, + {"x": 0, "y": 64, "flags": 1}, + {"x": 224, "y": 0, "flags": 1}, + {"x": 224, "y": 16, "flags": 1}, + {"x": 224, "y": 28, "flags": 1}, + {"x": 224, "y": 40, "flags": 1}, + {"x": 224, "y": 52, "flags": 1}, + {"x": 224, "y": 64, "flags": 1} + ], + "sleep": true + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "usb": { + "device_version": "1.0.1", + "pid": "0x0430" + }, + "layouts": { + "LAYOUT_tkl_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/keychron/c3_pro/ansi/red/keymaps/default/keymap.c b/keyboards/keychron/c3_pro/ansi/red/keymaps/default/keymap.c new file mode 100644 index 0000000000..053ede0545 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/red/keymaps/default/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_TRNS, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(MAC_FN),KC_TRNS, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_tkl_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_OSSW, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_tkl_ansi( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, _______, _______, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, BL_STEP, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_OSSW, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + diff --git a/keyboards/keychron/c3_pro/ansi/red/red.c b/keyboards/keychron/c3_pro/ansi/red/red.c new file mode 100644 index 0000000000..faf79e0cac --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/red/red.c @@ -0,0 +1,132 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * 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 LED_MATRIX_ENABLE +// clang-format off +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, CB6_CA1}, + {0, CB6_CA3}, + {0, CB6_CA4}, + {0, CB6_CA5}, + {0, CB6_CA6}, + {0, CB6_CA7}, + {0, CB6_CA8}, + {0, CB6_CA9}, + {0, CB6_CA10}, + {0, CB6_CA11}, + {0, CB6_CA12}, + {0, CB6_CA13}, + {0, CB6_CA14}, + {0, CB6_CA15}, + {0, CB6_CA16}, + {0, CB3_CA13}, + + {0, CB5_CA1}, + {0, CB5_CA2}, + {0, CB5_CA3}, + {0, CB5_CA4}, + {0, CB5_CA5}, + {0, CB5_CA6}, + {0, CB5_CA7}, + {0, CB5_CA8}, + {0, CB5_CA9}, + {0, CB5_CA10}, + {0, CB5_CA11}, + {0, CB5_CA12}, + {0, CB5_CA13}, + {0, CB5_CA14}, + {0, CB5_CA15}, + {0, CB5_CA16}, + {0, CB3_CA15}, + + {0, CB4_CA1}, + {0, CB4_CA2}, + {0, CB4_CA3}, + {0, CB4_CA4}, + {0, CB4_CA5}, + {0, CB4_CA6}, + {0, CB4_CA7}, + {0, CB4_CA8}, + {0, CB4_CA9}, + {0, CB4_CA10}, + {0, CB4_CA11}, + {0, CB4_CA12}, + {0, CB4_CA13}, + {0, CB4_CA14}, + {0, CB4_CA15}, + {0, CB4_CA16}, + {0, CB3_CA16}, + + {0, CB3_CA1}, + {0, CB3_CA2}, + {0, CB3_CA3}, + {0, CB3_CA4}, + {0, CB3_CA5}, + {0, CB3_CA6}, + {0, CB3_CA7}, + {0, CB3_CA8}, + {0, CB3_CA9}, + {0, CB3_CA10}, + {0, CB3_CA11}, + {0, CB3_CA12}, + {0, CB3_CA14}, + + {0, CB2_CA1}, + {0, CB2_CA3}, + {0, CB2_CA4}, + {0, CB2_CA5}, + {0, CB2_CA6}, + {0, CB2_CA7}, + {0, CB2_CA8}, + {0, CB2_CA9}, + {0, CB2_CA10}, + {0, CB2_CA11}, + {0, CB2_CA12}, + {0, CB2_CA14}, + {0, CB2_CA16}, + + {0, CB1_CA1}, + {0, CB1_CA2}, + {0, CB1_CA3}, + {0, CB1_CA7}, + {0, CB1_CA11}, + {0, CB1_CA12}, + {0, CB1_CA13}, + {0, CB1_CA14}, + {0, CB1_CA15}, + {0, CB1_CA16}, + {0, CB2_CA15}, + + {0, CB7_CA1}, + {0, CB7_CA2}, + {0, CB7_CA3}, + {0, CB7_CA4}, + {0, CB7_CA5}, + {0, CB7_CA6}, + {0, CB7_CA12}, + {0, CB7_CA11}, + {0, CB7_CA10}, + {0, CB7_CA9}, + {0, CB7_CA8}, + {0, CB7_CA7}, +}; +#endif diff --git a/keyboards/keychron/c3_pro/ansi/rgb/config.h b/keyboards/keychron/c3_pro/ansi/rgb/config.h new file mode 100644 index 0000000000..19054e4773 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/rgb/config.h @@ -0,0 +1,29 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 + +/* Enable indicator LED*/ +#define LED_MAC_OS_PIN A6 +#define LED_WIN_OS_PIN A7 +#define LED_OS_PIN_ON_STATE 1 + +/* RGB Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_VDDIO +#define SNLED27351_I2C_ADDRESS_2 SNLED27351_I2C_ADDRESS_GND + +/* Set LED driver current */ +#define SNLED27351_CURRENT_TUNE { 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 } diff --git a/keyboards/keychron/c3_pro/ansi/rgb/keyboard.json b/keyboards/keychron/c3_pro/ansi/rgb/keyboard.json new file mode 100644 index 0000000000..ca6f1abf08 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/rgb/keyboard.json @@ -0,0 +1,249 @@ +{ + "keyboard_name": "Keychron C3 Pro RGB", + "features": { + "rgb_matrix": true + }, + "indicators": { + "caps_lock": "A5" + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "B7", "C13", "C14", "C15", "C0", "C1", "C2", "C3", "A0", "A1", "A2", "A3", "A4"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "rgb_matrix": { + "animations": { + "band_spiral_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, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 20, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 30, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 40, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 50, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 65, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 75, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 85, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 95, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 110, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 120, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 130, "y": 0, "flags": 1}, + {"matrix": [0, 13], "x": 140, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 155, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 165, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 175, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 4}, + {"matrix": [1, 1], "x": 10, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 20, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 30, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 40, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 50, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 60, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 70, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 80, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 90, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 100, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 110, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 120, "y": 15, "flags": 4}, + {"matrix": [1, 13], "x": 135, "y": 15, "flags": 1}, + {"matrix": [1, 14], "x": 155, "y": 15, "flags": 1}, + {"matrix": [1, 15], "x": 165, "y": 15, "flags": 1}, + {"matrix": [1, 16], "x": 175, "y": 15, "flags": 1}, + + {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1}, + {"matrix": [2, 1], "x": 16, "y": 27, "flags": 4}, + {"matrix": [2, 2], "x": 26, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 36, "y": 27, "flags": 4}, + {"matrix": [2, 4], "x": 47, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 57, "y": 27, "flags": 4}, + {"matrix": [2, 6], "x": 68, "y": 27, "flags": 4}, + {"matrix": [2, 7], "x": 78, "y": 27, "flags": 4}, + {"matrix": [2, 8], "x": 89, "y": 27, "flags": 4}, + {"matrix": [2, 9], "x": 99, "y": 27, "flags": 4}, + {"matrix": [2, 10], "x": 109, "y": 27, "flags": 4}, + {"matrix": [2, 11], "x": 120, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 130, "y": 27, "flags": 4}, + {"matrix": [2, 13], "x": 143, "y": 27, "flags": 4}, + {"matrix": [2, 14], "x": 155, "y": 27, "flags": 1}, + {"matrix": [2, 15], "x": 165, "y": 27, "flags": 1}, + {"matrix": [2, 16], "x": 175, "y": 27, "flags": 1}, + + {"matrix": [3, 0], "x": 4, "y": 40, "flags": 8}, + {"matrix": [3, 1], "x": 18, "y": 40, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 40, "flags": 4}, + {"matrix": [3, 3], "x": 39, "y": 40, "flags": 4}, + {"matrix": [3, 4], "x": 50, "y": 40, "flags": 4}, + {"matrix": [3, 5], "x": 60, "y": 40, "flags": 4}, + {"matrix": [3, 6], "x": 70, "y": 40, "flags": 4}, + {"matrix": [3, 7], "x": 81, "y": 40, "flags": 4}, + {"matrix": [3, 8], "x": 91, "y": 40, "flags": 4}, + {"matrix": [3, 9], "x": 102, "y": 40, "flags": 4}, + {"matrix": [3, 10], "x": 112, "y": 40, "flags": 4}, + {"matrix": [3, 11], "x": 123, "y": 40, "flags": 4}, + {"matrix": [3, 13], "x": 143, "y": 40, "flags": 4}, + + {"matrix": [4, 0], "x": 7, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 23, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 34, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 44, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 65, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 76, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 86, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 96, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 107, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 117, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 137, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 165, "y": 52, "flags": 1}, + + {"matrix": [5, 0], "x": 1, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 14, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 27, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 67, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 104, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 116, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 128, "y": 64, "flags": 4}, + {"matrix": [5, 13], "x": 140, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 155, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 165, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 175, "y": 64, "flags": 1}, + + {"x": 0, "y": 0, "flags": 1}, + {"x": 0, "y": 16, "flags": 1}, + {"x": 0, "y": 28, "flags": 1}, + {"x": 0, "y": 40, "flags": 1}, + {"x": 0, "y": 52, "flags": 1}, + {"x": 0, "y": 64, "flags": 1}, + {"x": 224, "y": 0, "flags": 1}, + {"x": 224, "y": 16, "flags": 1}, + {"x": 224, "y": 28, "flags": 1}, + {"x": 224, "y": 40, "flags": 1}, + {"x": 224, "y": 52, "flags": 1}, + {"x": 224, "y": 64, "flags": 1} + ], + "sleep": true + }, + "usb": { + "device_version": "1.0.1", + "pid": "0x0433" + }, + "layouts": { + "LAYOUT_tkl_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 10, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/keychron/c3_pro/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/c3_pro/ansi/rgb/keymaps/default/keymap.c new file mode 100644 index 0000000000..27b5a7fb07 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/rgb/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_TRNS, RM_NEXT, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, MO(MAC_FN), KC_APP, KC_RCTL,KC_LEFT, KC_DOWN, KC_RGHT ), + + [MAC_FN] = LAYOUT_tkl_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_OSSW, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + + [WIN_BASE] = LAYOUT_tkl_ansi( + 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_PSCR,KC_SCROLL_LOCK,KC_PAUSE, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_APP, KC_RCTL,KC_LEFT, KC_DOWN, KC_RGHT ), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_NEXT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_OSSW, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), +}; diff --git a/keyboards/keychron/c3_pro/ansi/rgb/rgb.c b/keyboards/keychron/c3_pro/ansi/rgb/rgb.c new file mode 100644 index 0000000000..8ec1995a09 --- /dev/null +++ b/keyboards/keychron/c3_pro/ansi/rgb/rgb.c @@ -0,0 +1,135 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 +// clang-format off +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, CB7_CA1, CB9_CA1, CB8_CA1}, + {0, CB7_CA3, CB9_CA3, CB8_CA3}, + {0, CB7_CA4, CB9_CA4, CB8_CA4}, + {0, CB7_CA5, CB9_CA5, CB8_CA5}, + {0, CB7_CA6, CB9_CA6, CB8_CA6}, + {0, CB7_CA7, CB9_CA7, CB8_CA7}, + {0, CB7_CA8, CB9_CA8, CB8_CA8}, + {0, CB7_CA9, CB9_CA9, CB8_CA9}, + {0, CB7_CA10, CB9_CA10, CB8_CA10}, + {0, CB7_CA11, CB9_CA11, CB8_CA11}, + {0, CB7_CA12, CB9_CA12, CB8_CA12}, + {0, CB7_CA13, CB9_CA13, CB8_CA13}, + {0, CB7_CA14, CB9_CA14, CB8_CA14}, + {0, CB7_CA15, CB9_CA15, CB8_CA15}, + {0, CB7_CA16, CB9_CA16, CB8_CA16}, + {1, CB7_CA16, CB9_CA16, CB8_CA16}, + + {0, CB4_CA1, CB6_CA1, CB5_CA1}, + {0, CB4_CA2, CB6_CA2, CB5_CA2}, + {0, CB4_CA3, CB6_CA3, CB5_CA3}, + {0, CB4_CA4, CB6_CA4, CB5_CA4}, + {0, CB4_CA5, CB6_CA5, CB5_CA5}, + {0, CB4_CA6, CB6_CA6, CB5_CA6}, + {0, CB4_CA7, CB6_CA7, CB5_CA7}, + {0, CB4_CA8, CB6_CA8, CB5_CA8}, + {0, CB4_CA9, CB6_CA9, CB5_CA9}, + {0, CB4_CA10, CB6_CA10, CB5_CA10}, + {0, CB4_CA11, CB6_CA11, CB5_CA11}, + {0, CB4_CA12, CB6_CA12, CB5_CA12}, + {0, CB4_CA13, CB6_CA13, CB5_CA13}, + {0, CB4_CA14, CB6_CA14, CB5_CA14}, + {0, CB4_CA15, CB6_CA15, CB5_CA15}, + {0, CB4_CA16, CB6_CA16, CB5_CA16}, + {1, CB7_CA13, CB9_CA13, CB8_CA13}, + + {0, CB1_CA1, CB3_CA1, CB2_CA1}, + {0, CB1_CA2, CB3_CA2, CB2_CA2}, + {0, CB1_CA3, CB3_CA3, CB2_CA3}, + {0, CB1_CA4, CB3_CA4, CB2_CA4}, + {0, CB1_CA5, CB3_CA5, CB2_CA5}, + {0, CB1_CA6, CB3_CA6, CB2_CA6}, + {0, CB1_CA7, CB3_CA7, CB2_CA7}, + {0, CB1_CA8, CB3_CA8, CB2_CA8}, + {0, CB1_CA9, CB3_CA9, CB2_CA9}, + {0, CB1_CA10, CB3_CA10, CB2_CA10}, + {0, CB1_CA11, CB3_CA11, CB2_CA11}, + {0, CB1_CA12, CB3_CA12, CB2_CA12}, + {0, CB1_CA13, CB3_CA13, CB2_CA13}, + {0, CB1_CA14, CB3_CA14, CB2_CA14}, + {0, CB1_CA15, CB3_CA15, CB2_CA15}, + {0, CB1_CA16, CB3_CA16, CB2_CA16}, + {1, CB7_CA15, CB9_CA15, CB8_CA15}, + + {1, CB7_CA1, CB9_CA1, CB8_CA1}, + {1, CB7_CA2, CB9_CA2, CB8_CA2}, + {1, CB7_CA3, CB9_CA3, CB8_CA3}, + {1, CB7_CA4, CB9_CA4, CB8_CA4}, + {1, CB7_CA5, CB9_CA5, CB8_CA5}, + {1, CB7_CA6, CB9_CA6, CB8_CA6}, + {1, CB7_CA7, CB9_CA7, CB8_CA7}, + {1, CB7_CA8, CB9_CA8, CB8_CA8}, + {1, CB7_CA9, CB9_CA9, CB8_CA9}, + {1, CB7_CA10, CB9_CA10, CB8_CA10}, + {1, CB7_CA11, CB9_CA11, CB8_CA11}, + {1, CB7_CA12, CB9_CA12, CB8_CA12}, + {1, CB7_CA14, CB9_CA14, CB8_CA14}, + + {1, CB1_CA1, CB3_CA1, CB2_CA1}, + {1, CB1_CA3, CB3_CA3, CB2_CA3}, + {1, CB1_CA4, CB3_CA4, CB2_CA4}, + {1, CB1_CA5, CB3_CA5, CB2_CA5}, + {1, CB1_CA6, CB3_CA6, CB2_CA6}, + {1, CB1_CA7, CB3_CA7, CB2_CA7}, + {1, CB1_CA8, CB3_CA8, CB2_CA8}, + {1, CB1_CA9, CB3_CA9, CB2_CA9}, + {1, CB1_CA10, CB3_CA10, CB2_CA10}, + {1, CB1_CA11, CB3_CA11, CB2_CA11}, + {1, CB1_CA12, CB3_CA12, CB2_CA12}, + {1, CB1_CA14, CB3_CA14, CB2_CA14}, + {1, CB1_CA16, CB3_CA16, CB2_CA16}, + + {1, CB4_CA1, CB6_CA1, CB5_CA1}, + {1, CB4_CA2, CB6_CA2, CB5_CA2}, + {1, CB4_CA3, CB6_CA3, CB5_CA3}, + {1, CB4_CA7, CB6_CA7, CB5_CA7}, + {1, CB4_CA11, CB6_CA11, CB5_CA11}, + {1, CB4_CA12, CB6_CA12, CB5_CA12}, + {1, CB4_CA13, CB6_CA13, CB5_CA13}, + {1, CB4_CA14, CB6_CA14, CB5_CA14}, + {1, CB4_CA15, CB6_CA15, CB5_CA15}, + {1, CB4_CA16, CB6_CA16, CB5_CA16}, + {1, CB1_CA15, CB3_CA15, CB2_CA15}, + + {0, CB10_CA1, CB12_CA1, CB11_CA1}, + {0, CB10_CA2, CB12_CA2, CB11_CA2}, + {0, CB10_CA3, CB12_CA3, CB11_CA3}, + {0, CB10_CA4, CB12_CA4, CB11_CA4}, + {0, CB10_CA5, CB12_CA5, CB11_CA5}, + {0, CB10_CA6, CB12_CA6, CB11_CA6}, + {0, CB10_CA7, CB12_CA7, CB11_CA7}, + {0, CB10_CA8, CB12_CA8, CB11_CA8}, + {0, CB10_CA9, CB12_CA9, CB11_CA9}, + {0, CB10_CA10, CB12_CA10, CB11_CA10}, + {0, CB10_CA11, CB12_CA11, CB11_CA11}, + {0, CB10_CA12, CB12_CA12, CB11_CA12}, +}; +#endif diff --git a/keyboards/keychron/c3_pro/c3_pro.c b/keyboards/keychron/c3_pro/c3_pro.c new file mode 100644 index 0000000000..905eb86f5a --- /dev/null +++ b/keyboards/keychron/c3_pro/c3_pro.c @@ -0,0 +1,112 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 "c3_pro.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { +#ifdef RGB_MATRIX_ENABLE + case QK_RGB_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_set_color_all(0, 0, 0); + } break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!rgb_matrix_is_enabled()) { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable(); + } + return false; +#endif +#ifdef LED_MATRIX_ENABLE + case QK_LED_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (led_matrix_get_flags()) { + case LED_FLAG_ALL: { + led_matrix_set_flags(LED_FLAG_NONE); + led_matrix_set_value_all(0); + } break; + default: { + led_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!led_matrix_is_enabled()) { + led_matrix_set_flags(LED_FLAG_ALL); + led_matrix_enable(); + } + return false; +#endif + case KC_OSSW: + if (record->event.pressed) { + default_layer_xor(1U << 0); + default_layer_xor(1U << 2); + eeconfig_update_default_layer(default_layer_state); + } + return false; + default: + return true; + } +} + +#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) + +bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { + if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { + return false; + } + // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); + + if (host_keyboard_led_state().caps_lock) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 255, 255, 255); + } else { + if (!rgb_matrix_get_flags()) { + RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0); + } + } + return true; +} + +#endif // RGB_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX + +#if defined(LED_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) + +bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { + if (!led_matrix_indicators_advanced_user(led_min, led_max)) { + return false; + } + + if (host_keyboard_led_state().caps_lock) { + led_matrix_set_value(CAPS_LOCK_LED_INDEX, 255); + + } else { + if (!led_matrix_get_flags()) { + led_matrix_set_value(CAPS_LOCK_LED_INDEX, 0); + } + } + return true; +} + +#endif // LED_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX diff --git a/keyboards/keychron/c3_pro/c3_pro.h b/keyboards/keychron/c3_pro/c3_pro.h new file mode 100644 index 0000000000..689e061657 --- /dev/null +++ b/keyboards/keychron/c3_pro/c3_pro.h @@ -0,0 +1,25 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 "quantum.h" + +enum my_keycodes { + KC_OS_SWITCH = QK_KB_11, +}; + +#define KC_OSSW KC_OS_SWITCH diff --git a/keyboards/keychron/c3_pro/config.h b/keyboards/keychron/c3_pro/config.h new file mode 100644 index 0000000000..f5e7e85969 --- /dev/null +++ b/keyboards/keychron/c3_pro/config.h @@ -0,0 +1,24 @@ +/* Copyright 2024 @ Keychron(https://www.keychron.com) + * + * 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 + +/* I2C driver Configuration */ +#define I2C1_SCL_PIN B8 +#define I2C1_SDA_PIN B9 +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 + diff --git a/keyboards/keychron/c3_pro/halconf.h b/keyboards/keychron/c3_pro/halconf.h new file mode 100644 index 0000000000..093e4254c3 --- /dev/null +++ b/keyboards/keychron/c3_pro/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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 + +#include_next diff --git a/keyboards/keychron/c3_pro/info.json b/keyboards/keychron/c3_pro/info.json new file mode 100644 index 0000000000..2bcd155c1b --- /dev/null +++ b/keyboards/keychron/c3_pro/info.json @@ -0,0 +1,26 @@ +{ + "manufacturer": "Keychron", + "maintainer": "Joe", + "bootloader": "stm32-dfu", + "community_layouts": ["tkl_ansi"], + "diode_direction": "ROW2COL", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "processor": "STM32F401", + "url": "https://github.com/Keychron", + "usb": { + "device_version": "1.0.1", + "vid": "0x3434" + } +} diff --git a/keyboards/keychron/c3_pro/mcuconf.h b/keyboards/keychron/c3_pro/mcuconf.h new file mode 100644 index 0000000000..b2b81df855 --- /dev/null +++ b/keyboards/keychron/c3_pro/mcuconf.h @@ -0,0 +1,28 @@ +/* Copyright 2024 @ Keychron (https://www.keychron.com) + * + * 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_HSECLK +#define STM32_HSECLK 16000000U + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/c3_pro/readme.md b/keyboards/keychron/c3_pro/readme.md new file mode 100644 index 0000000000..ae2deb45a7 --- /dev/null +++ b/keyboards/keychron/c3_pro/readme.md @@ -0,0 +1,28 @@ +# Keychron C3 Pro + +![Keychron C3 Pro](https://i.imgur.com/b4FTJsf.jpg) + +A customizable 87% keyboard. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron C3 Pro +* Hardware Availability: [Keychron](https://www.keychron.com/) + +Make example for this keyboard (after setting up your build environment): + + make keychron/c3_pro/ansi/red:default + make keychron/c3_pro/ansi/rgb:default + +Flashing example for this keyboard: + + make keychron/c3_pro/ansi/red:default:flash + make keychron/c3_pro/ansi/rgb:default:flash + +## bootloader + +Enter the bootloader in two ways: + +* **Bootmagic reset**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard. +* **Physical reset button**: Briefly press the RESET button under the spacebar. + +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). From 273d8d6a1a6badb8d9b473954f16a0fbbe671987 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 1 Feb 2025 21:19:30 +1100 Subject: [PATCH 170/592] `qmk docs`: restore `--port` and `--browser` arguments (#24623) * `qmk docs`: restore `--port` and `--browser` arguments * Make docs command args always a list --- docs/cli_commands.md | 15 +++++++++------ docs/contributing.md | 4 ++-- lib/python/qmk/cli/docs.py | 9 ++++++--- lib/python/qmk/cli/generate/docs.py | 6 ++---- lib/python/qmk/docs.py | 8 ++++---- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index 4cd5ae98c3..d17b0eda23 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -723,23 +723,26 @@ Now open your dev environment and live a squiggly-free life. ## `qmk docs` -This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 5173. +This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936. +Use the `-b`/`--browser` flag to automatically open the local webserver in your default browser. -This command requires `node` and `yarn` to be installed as prerequisites, and provides live reload capability whilst editing. +Requires `node` and `yarn` to be installed as prerequisites. **Usage**: ``` -usage: qmk docs [-h] +usage: qmk docs [-h] [-b] [-p PORT] options: - -h, --help show this help message and exit + -h, --help show this help message and exit + -b, --browser Open the docs in the default browser. + -p, --port PORT Port number to use. ``` ## `qmk generate-docs` -This command allows you to generate QMK documentation locally. It can be uses for general browsing or improving the docs. -Use the `-s`/`--serve` flag to also serve the static site once built. Default port is 4173. +This command generates QMK documentation for production. +Use the `-s`/`--serve` flag to also serve the static site on port 4173 once built. Note that this does not provide live reloading; use `qmk docs` instead for development purposes. This command requires `node` and `yarn` to be installed as prerequisites, and requires the operating system to support symlinks. diff --git a/docs/contributing.md b/docs/contributing.md index bbb1997a6f..70a00b706d 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -106,10 +106,10 @@ enum my_keycodes { Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder: ``` -qmk docs +qmk docs -b ``` -and navigating to `http://localhost:5173/`. +Which should automatically open your browser; otherwise, navigate to `http://localhost:8936/`. ## Keyboards diff --git a/lib/python/qmk/cli/docs.py b/lib/python/qmk/cli/docs.py index d28dddf194..da02ebf95e 100644 --- a/lib/python/qmk/cli/docs.py +++ b/lib/python/qmk/cli/docs.py @@ -6,6 +6,8 @@ from qmk.docs import prepare_docs_build_area, run_docs_command from milc import cli +@cli.argument('-p', '--port', default=8936, type=int, help='Port number to use.') +@cli.argument('-b', '--browser', action='store_true', help='Open the docs in the default browser.') @cli.subcommand('Run a local webserver for QMK documentation.', hidden=False if cli.config.user.developer else True) def docs(cli): """Spin up a local HTTP server for the QMK docs. @@ -22,6 +24,7 @@ def docs(cli): if not prepare_docs_build_area(is_production=False): return False - if not cli.config.general.verbose: - cli.log.info('Serving docs at http://localhost:5173/ (Ctrl+C to stop)') - run_docs_command('run', 'docs:dev') + cmd = ['docs:dev', '--port', f'{cli.args.port}'] + if cli.args.browser: + cmd.append('--open') + run_docs_command('run', cmd) diff --git a/lib/python/qmk/cli/generate/docs.py b/lib/python/qmk/cli/generate/docs.py index 5821d43b86..7abeca9d2a 100644 --- a/lib/python/qmk/cli/generate/docs.py +++ b/lib/python/qmk/cli/generate/docs.py @@ -27,10 +27,8 @@ def generate_docs(cli): return False cli.log.info('Building vitepress docs') - run_docs_command('run', 'docs:build') + run_docs_command('run', ['docs:build']) cli.log.info('Successfully generated docs to %s.', BUILD_DOCS_PATH) if cli.args.serve: - if not cli.config.general.verbose: - cli.log.info('Serving docs at http://localhost:4173/ (Ctrl+C to stop)') - run_docs_command('run', 'docs:preview') + run_docs_command('run', ['docs:preview']) diff --git a/lib/python/qmk/docs.py b/lib/python/qmk/docs.py index 56694cf6ae..75d2d60bda 100644 --- a/lib/python/qmk/docs.py +++ b/lib/python/qmk/docs.py @@ -17,18 +17,18 @@ BUILD_DOCS_PATH = BUILD_PATH / 'docs' DOXYGEN_PATH = BUILD_DOCS_PATH / 'static' / 'doxygen' -def run_docs_command(verb, cmd=None): +def run_docs_command(verb, cmd_args=None): environ['PATH'] += pathsep + str(NODE_MODULES_PATH / '.bin') - args = {'capture_output': False if cli.config.general.verbose else True, 'check': True, 'stdin': DEVNULL} + args = {'capture_output': False, 'check': True} docs_env = environ.copy() if cli.config.general.verbose: docs_env['DEBUG'] = 'vitepress:*,vite:*' args['env'] = docs_env arg_list = ['yarn', verb] - if cmd: - arg_list.append(cmd) + if cmd_args: + arg_list.extend(cmd_args) chdir(BUILDDEFS_PATH) cli.run(arg_list, **args) From 7fe168a8ed1577be2f75ec0f0a43a3997a7df199 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 7 Feb 2025 00:10:45 -0800 Subject: [PATCH 171/592] [Keyboard] Move Ergodox STM32 to handwired folder (#24903) * [Keyboard] Move Erogdox STM32 to handwired folder To minimize confusion with ZSA's ergodox EZ ST (stm32f303) and because this is basically a one-off board * Don't forget mapping * Fix readme --- data/mappings/keyboard_aliases.hjson | 3 +++ keyboards/{ => handwired}/ergodox_stm32/board.h | 0 keyboards/{ => handwired}/ergodox_stm32/chconf.h | 0 keyboards/{ => handwired}/ergodox_stm32/config.h | 0 keyboards/{ => handwired}/ergodox_stm32/ergodox_stm32.c | 0 keyboards/{ => handwired}/ergodox_stm32/ergodox_stm32.h | 0 keyboards/{ => handwired}/ergodox_stm32/halconf.h | 0 keyboards/{ => handwired}/ergodox_stm32/keyboard.json | 0 .../{ => handwired}/ergodox_stm32/keymaps/default/keymap.c | 0 .../{ => handwired}/ergodox_stm32/ld/stm32f103_bootloader.ld | 0 keyboards/{ => handwired}/ergodox_stm32/matrix.c | 0 keyboards/{ => handwired}/ergodox_stm32/mcuconf.h | 0 keyboards/{ => handwired}/ergodox_stm32/readme.md | 2 +- keyboards/{ => handwired}/ergodox_stm32/rules.mk | 0 14 files changed, 4 insertions(+), 1 deletion(-) rename keyboards/{ => handwired}/ergodox_stm32/board.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/chconf.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/config.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/ergodox_stm32.c (100%) rename keyboards/{ => handwired}/ergodox_stm32/ergodox_stm32.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/halconf.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/keyboard.json (100%) rename keyboards/{ => handwired}/ergodox_stm32/keymaps/default/keymap.c (100%) rename keyboards/{ => handwired}/ergodox_stm32/ld/stm32f103_bootloader.ld (100%) rename keyboards/{ => handwired}/ergodox_stm32/matrix.c (100%) rename keyboards/{ => handwired}/ergodox_stm32/mcuconf.h (100%) rename keyboards/{ => handwired}/ergodox_stm32/readme.md (91%) rename keyboards/{ => handwired}/ergodox_stm32/rules.mk (100%) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 760e54b889..d03ff33f2c 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -197,6 +197,9 @@ "ergodone": { "target": "ktec/ergodone" }, + "ergodox_stm32": { + "target": "handwired/ergodox_stm32" + }, "ergoinu": { "target": "dm9records/ergoinu" }, diff --git a/keyboards/ergodox_stm32/board.h b/keyboards/handwired/ergodox_stm32/board.h similarity index 100% rename from keyboards/ergodox_stm32/board.h rename to keyboards/handwired/ergodox_stm32/board.h diff --git a/keyboards/ergodox_stm32/chconf.h b/keyboards/handwired/ergodox_stm32/chconf.h similarity index 100% rename from keyboards/ergodox_stm32/chconf.h rename to keyboards/handwired/ergodox_stm32/chconf.h diff --git a/keyboards/ergodox_stm32/config.h b/keyboards/handwired/ergodox_stm32/config.h similarity index 100% rename from keyboards/ergodox_stm32/config.h rename to keyboards/handwired/ergodox_stm32/config.h diff --git a/keyboards/ergodox_stm32/ergodox_stm32.c b/keyboards/handwired/ergodox_stm32/ergodox_stm32.c similarity index 100% rename from keyboards/ergodox_stm32/ergodox_stm32.c rename to keyboards/handwired/ergodox_stm32/ergodox_stm32.c diff --git a/keyboards/ergodox_stm32/ergodox_stm32.h b/keyboards/handwired/ergodox_stm32/ergodox_stm32.h similarity index 100% rename from keyboards/ergodox_stm32/ergodox_stm32.h rename to keyboards/handwired/ergodox_stm32/ergodox_stm32.h diff --git a/keyboards/ergodox_stm32/halconf.h b/keyboards/handwired/ergodox_stm32/halconf.h similarity index 100% rename from keyboards/ergodox_stm32/halconf.h rename to keyboards/handwired/ergodox_stm32/halconf.h diff --git a/keyboards/ergodox_stm32/keyboard.json b/keyboards/handwired/ergodox_stm32/keyboard.json similarity index 100% rename from keyboards/ergodox_stm32/keyboard.json rename to keyboards/handwired/ergodox_stm32/keyboard.json diff --git a/keyboards/ergodox_stm32/keymaps/default/keymap.c b/keyboards/handwired/ergodox_stm32/keymaps/default/keymap.c similarity index 100% rename from keyboards/ergodox_stm32/keymaps/default/keymap.c rename to keyboards/handwired/ergodox_stm32/keymaps/default/keymap.c diff --git a/keyboards/ergodox_stm32/ld/stm32f103_bootloader.ld b/keyboards/handwired/ergodox_stm32/ld/stm32f103_bootloader.ld similarity index 100% rename from keyboards/ergodox_stm32/ld/stm32f103_bootloader.ld rename to keyboards/handwired/ergodox_stm32/ld/stm32f103_bootloader.ld diff --git a/keyboards/ergodox_stm32/matrix.c b/keyboards/handwired/ergodox_stm32/matrix.c similarity index 100% rename from keyboards/ergodox_stm32/matrix.c rename to keyboards/handwired/ergodox_stm32/matrix.c diff --git a/keyboards/ergodox_stm32/mcuconf.h b/keyboards/handwired/ergodox_stm32/mcuconf.h similarity index 100% rename from keyboards/ergodox_stm32/mcuconf.h rename to keyboards/handwired/ergodox_stm32/mcuconf.h diff --git a/keyboards/ergodox_stm32/readme.md b/keyboards/handwired/ergodox_stm32/readme.md similarity index 91% rename from keyboards/ergodox_stm32/readme.md rename to keyboards/handwired/ergodox_stm32/readme.md index f8b9c4c553..84accbb5fe 100644 --- a/keyboards/ergodox_stm32/readme.md +++ b/keyboards/handwired/ergodox_stm32/readme.md @@ -4,6 +4,6 @@ Make example for this keyboard (after setting up your build environment): - make ergodox_stm32:default + make handwired/ergodox_stm32:default 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). diff --git a/keyboards/ergodox_stm32/rules.mk b/keyboards/handwired/ergodox_stm32/rules.mk similarity index 100% rename from keyboards/ergodox_stm32/rules.mk rename to keyboards/handwired/ergodox_stm32/rules.mk From 2699e2f7c826b0288c3dddcd86a97811726cf6a4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 8 Feb 2025 12:17:35 +0000 Subject: [PATCH 172/592] Avoid WindowsPath errors for 'qmk format-text' (#24905) --- lib/python/qmk/cli/format/text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/format/text.py b/lib/python/qmk/cli/format/text.py index 6dd4511896..344631081b 100644 --- a/lib/python/qmk/cli/format/text.py +++ b/lib/python/qmk/cli/format/text.py @@ -18,7 +18,7 @@ def _get_chunks(it, size): def dos2unix_run(files): """Spawn multiple dos2unix subprocess avoiding too long commands on formatting everything """ - for chunk in _get_chunks(files, 10): + for chunk in _get_chunks([normpath(file).as_posix() for file in files], 10): dos2unix = cli.run(['dos2unix', *chunk]) if dos2unix.returncode: From 37e234252e70957725734221d829ffd814a2ae72 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 12 Feb 2025 17:16:27 +0000 Subject: [PATCH 173/592] Extend lint to reject 'blank' files (#23994) --- lib/python/qmk/c_parse.py | 6 +- lib/python/qmk/cli/lint.py | 112 +++++++++++++++++++++++++++---------- 2 files changed, 84 insertions(+), 34 deletions(-) diff --git a/lib/python/qmk/c_parse.py b/lib/python/qmk/c_parse.py index 08d23cf5ba..785b940456 100644 --- a/lib/python/qmk/c_parse.py +++ b/lib/python/qmk/c_parse.py @@ -24,7 +24,7 @@ def _get_chunks(it, size): return iter(lambda: tuple(islice(it, size)), ()) -def _preprocess_c_file(file): +def preprocess_c_file(file): """Load file and strip comments """ file_contents = file.read_text(encoding='utf-8') @@ -66,7 +66,7 @@ def find_layouts(file): parsed_layouts = {} # Search the file for LAYOUT macros and aliases - file_contents = _preprocess_c_file(file) + file_contents = preprocess_c_file(file) for line in file_contents.split('\n'): if layout_macro_define_regex.match(line.lstrip()) and '(' in line and 'LAYOUT' in line: @@ -248,7 +248,7 @@ def _parse_led_config(file, matrix_cols, matrix_rows): current_row_index = 0 current_row = [] - for _type, value in lex(_preprocess_c_file(file), CLexer()): + for _type, value in lex(preprocess_c_file(file), CLexer()): if not found_g_led_config: # Check for type if value == 'led_config_t': diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index efb29704ae..d82be8b2d0 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -10,7 +10,7 @@ from qmk.keyboard import keyboard_completer, keyboard_folder_or_all, is_all_keyb from qmk.keymap import locate_keymap, list_keymaps from qmk.path import keyboard from qmk.git import git_get_ignored_files -from qmk.c_parse import c_source_files +from qmk.c_parse import c_source_files, preprocess_c_file CHIBIOS_CONF_CHECKS = ['chconf.h', 'halconf.h', 'mcuconf.h', 'board.h'] INVALID_KB_FEATURES = set(['encoder_map', 'dip_switch_map', 'combo', 'tap_dance', 'via']) @@ -33,12 +33,42 @@ def _list_defaultish_keymaps(kb): return keymaps +def _get_build_files(kb, km=None): + """Return potential keyboard/keymap build files + """ + search_path = locate_keymap(kb, km).parent if km else keyboard(kb) + + build_files = [] + + if not km: + current_path = Path() + for path_part in search_path.parts: + current_path = current_path / path_part + build_files.extend(current_path.glob('*rules.mk')) + + for file in search_path.glob("**/*rules.mk"): + # Ignore keymaps when only globing keyboard files + if not km and 'keymaps' in file.parts: + continue + build_files.append(file) + + return set(build_files) + + def _get_code_files(kb, km=None): """Return potential keyboard/keymap code files """ search_path = locate_keymap(kb, km).parent if km else keyboard(kb) code_files = [] + + if not km: + current_path = Path() + for path_part in search_path.parts: + current_path = current_path / path_part + code_files.extend(current_path.glob('*.h')) + code_files.extend(current_path.glob('*.c')) + for file in c_source_files([search_path]): # Ignore keymaps when only globing keyboard files if not km and 'keymaps' in file.parts: @@ -48,6 +78,24 @@ def _get_code_files(kb, km=None): return code_files +def _is_empty_rules(file): + """Check if file contains any useful content + """ + for line in file.read_text(encoding='utf-8').split("\n"): + if len(line) > 0 and not line.isspace() and not line.startswith('#'): + return False + return True + + +def _is_empty_include(file): + """Check if file contains any useful content + """ + for line in preprocess_c_file(file).split("\n"): + if len(line) > 0 and not line.isspace() and not line.startswith('#pragma once'): + return False + return True + + def _has_license(file): """Check file has a license header """ @@ -91,37 +139,28 @@ def _chibios_conf_includenext_check(target): return None -def _rules_mk_assignment_only(kb): +def _rules_mk_assignment_only(rules_mk): """Check the keyboard-level rules.mk to ensure it only has assignments. """ - keyboard_path = keyboard(kb) - current_path = Path() errors = [] + continuation = None + for i, line in enumerate(rules_mk.open()): + line = line.strip() - for path_part in keyboard_path.parts: - current_path = current_path / path_part - rules_mk = current_path / 'rules.mk' + if '#' in line: + line = line[:line.index('#')] - if rules_mk.exists(): + if continuation: + line = continuation + line continuation = None - for i, line in enumerate(rules_mk.open()): - line = line.strip() + if line: + if line[-1] == '\\': + continuation = line[:-1] + continue - if '#' in line: - line = line[:line.index('#')] - - if continuation: - line = continuation + line - continuation = None - - if line: - if line[-1] == '\\': - continuation = line[:-1] - continue - - if line and '=' not in line: - errors.append(f'Non-assignment code on line +{i} {rules_mk}: {line}') + if line and '=' not in line: + errors.append(f'Non-assignment code on line +{i} {rules_mk}: {line}') return errors @@ -175,13 +214,6 @@ def keyboard_check(kb): if not _handle_invalid_features(kb, kb_info): ok = False - rules_mk_assignment_errors = _rules_mk_assignment_only(kb) - if rules_mk_assignment_errors: - ok = False - cli.log.error('%s: Non-assignment code found in rules.mk. Move it to post_rules.mk instead.', kb) - for assignment_error in rules_mk_assignment_errors: - cli.log.error(assignment_error) - invalid_files = git_get_ignored_files(f'keyboards/{kb}/') for file in invalid_files: if 'keymap' in file: @@ -189,11 +221,29 @@ def keyboard_check(kb): cli.log.error(f'{kb}: The file "{file}" should not exist!') ok = False + for file in _get_build_files(kb): + if _is_empty_rules(file): + cli.log.error(f'{kb}: The file "{file}" is effectively empty and should be removed!') + ok = False + + if file.suffix in ['rules.mk']: + rules_mk_assignment_errors = _rules_mk_assignment_only(file) + if rules_mk_assignment_errors: + ok = False + cli.log.error('%s: Non-assignment code found in rules.mk. Move it to post_rules.mk instead.', kb) + for assignment_error in rules_mk_assignment_errors: + cli.log.error(assignment_error) + for file in _get_code_files(kb): if not _has_license(file): cli.log.error(f'{kb}: The file "{file}" does not have a license header!') ok = False + if file.name in ['config.h']: + if _is_empty_include(file): + cli.log.error(f'{kb}: The file "{file}" is effectively empty and should be removed!') + ok = False + if file.name in CHIBIOS_CONF_CHECKS: check_error = _chibios_conf_includenext_check(file) if check_error is not None: From 8400fad3d8822a9499e72ea0752e59642d9f6ac3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 13 Feb 2025 07:03:55 +0000 Subject: [PATCH 174/592] Remove readme dummy content (#24912) --- keyboards/al1/readme.md | 2 -- keyboards/alf/dc60/readme.md | 2 -- keyboards/biacco42/meishi2/readme.md | 3 +-- keyboards/bpiphany/unloved_bastard/readme.md | 4 ---- keyboards/cool836a/readme.md | 2 +- keyboards/deltapad/readme.md | 5 ----- keyboards/duck/jetfire/readme.md | 2 -- keyboards/ericrlau/numdiscipline/readme.md | 1 - keyboards/handwired/fc200rt_qmk/readme.md | 1 - keyboards/handwired/novem/readme.md | 2 -- keyboards/hineybush/h75_singa/readme.md | 2 -- keyboards/kakunpc/business_card/readme.md | 8 +------- keyboards/keebio/ergodicity/readme.md | 4 ---- keyboards/kira/kira75/readme.md | 2 -- keyboards/kprepublic/bm16a/v1/readme.md | 1 - keyboards/kprepublic/bm16s/readme.md | 1 - keyboards/marksard/treadstone32/readme.md | 4 +--- keyboards/marksard/treadstone48/readme.md | 4 +--- keyboards/masterworks/classy_tkl/readme.md | 2 -- keyboards/mb44/readme.md | 2 -- keyboards/mechlovin/delphine/readme.md | 2 -- keyboards/mechwild/mokulua/readme.md | 2 -- keyboards/meme/readme.md | 2 -- keyboards/mint60/readme.md | 3 --- keyboards/pegasus/readme.md | 2 -- keyboards/tgr/tris/readme.md | 2 -- keyboards/x16/readme.md | 1 - 27 files changed, 5 insertions(+), 63 deletions(-) diff --git a/keyboards/al1/readme.md b/keyboards/al1/readme.md index 3531e2fdc6..4dcf83f05f 100644 --- a/keyboards/al1/readme.md +++ b/keyboards/al1/readme.md @@ -1,7 +1,5 @@ # TriangleLabs AL1 -![AL1](imgur.com image replace me!) - * Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin), [Olivia](https://github.com/olivia) * Hardware Supported: AL1 PCB * Hardware Availability: [GroupBuy](https://geekhack.org/index.php?topic=93258.0) diff --git a/keyboards/alf/dc60/readme.md b/keyboards/alf/dc60/readme.md index d8e20a8f4f..628878e8de 100644 --- a/keyboards/alf/dc60/readme.md +++ b/keyboards/alf/dc60/readme.md @@ -1,7 +1,5 @@ # dc60 -![dc60](imgur.com image replace me!) - A 60% PCB sold with the Alf DC60. Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) diff --git a/keyboards/biacco42/meishi2/readme.md b/keyboards/biacco42/meishi2/readme.md index 97c5465f86..b190ff38ce 100644 --- a/keyboards/biacco42/meishi2/readme.md +++ b/keyboards/biacco42/meishi2/readme.md @@ -5,8 +5,7 @@ meishi2 - The better micro macro keyboard Keyboard Maintainer: [Biacco42](https://github.com/Biacco42) -Hardware Supported: The PCBs, controllers supported -Hardware Availability: [links to where you can find this hardware](https://github.com/Biacco42/meishi2) +Hardware Availability: https://github.com/Biacco42/meishi2 Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/bpiphany/unloved_bastard/readme.md b/keyboards/bpiphany/unloved_bastard/readme.md index 9909d5af3f..b11a9bfa77 100644 --- a/keyboards/bpiphany/unloved_bastard/readme.md +++ b/keyboards/bpiphany/unloved_bastard/readme.md @@ -1,9 +1,5 @@ # unloved_bastard -![unloved_bastard](imgur.com image replace me!) - -A short description of the keyboard/project - Keyboard Maintainer: [Alexander Fougner](https://github.com/fougner) Hardware Supported: CoolerMaster Masterkeys S PBT (Not the Pro versions with backlighting etc) Hardware Availability: Pretty much anywhere diff --git a/keyboards/cool836a/readme.md b/keyboards/cool836a/readme.md index dd3ace3cbc..9473b7136a 100644 --- a/keyboards/cool836a/readme.md +++ b/keyboards/cool836a/readme.md @@ -28,7 +28,7 @@ git clone のあと、 ----------------- ## English -- [Here](https://github.com/telzo2000/cool836A) are a full description of this project and build guide by the great Designer: [m.ki](imgur.com image replace me!) +- [Here](https://github.com/telzo2000/cool836A) are a full description of this project and build guide by the great Designer: m.ki - Each virsions(A, B+, C+) of cool836A has the same circuit and that means you can install this firmware on any of them. - However, this repository is currently(Jan 7, 2021) tested on ver.B+ (RED version) only. Feel free to contact [ME](https://github.com/ketcha-k) for any problems. diff --git a/keyboards/deltapad/readme.md b/keyboards/deltapad/readme.md index 858f99b436..f5dae4d9b0 100644 --- a/keyboards/deltapad/readme.md +++ b/keyboards/deltapad/readme.md @@ -1,15 +1,10 @@ # deltapad - - -*A short description of the keyboard/project* - A 4x4 keypad * Keyboard Maintainer: [Richard Snijder](https://github.com/rich239) * Hardware Supported: Atmel 32u4 based keypads - Make example for this keyboard (after setting up your build environment): make deltapad:default diff --git a/keyboards/duck/jetfire/readme.md b/keyboards/duck/jetfire/readme.md index 8de2f5ced6..2e12315d6b 100644 --- a/keyboards/duck/jetfire/readme.md +++ b/keyboards/duck/jetfire/readme.md @@ -1,7 +1,5 @@ # Jetfire -![jetfire](imgur.com image replace me!) - The Duck Jetfire is a hybrid full size and 1800 layout keyboard that went on Group Buy in November 2017. diff --git a/keyboards/ericrlau/numdiscipline/readme.md b/keyboards/ericrlau/numdiscipline/readme.md index bd040df2a5..9770432e56 100644 --- a/keyboards/ericrlau/numdiscipline/readme.md +++ b/keyboards/ericrlau/numdiscipline/readme.md @@ -13,7 +13,6 @@ A modified version of the through hole 65% Discipline keyboard by cftkb. Other Information: * Keyboard Maintainer: [ELau](https://github.com/ericrlau) -* Hardware Supported: The PCBs, controllers supported * Hardware Availability: https://github.com/ericrlau/NumDiscipline Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/handwired/fc200rt_qmk/readme.md b/keyboards/handwired/fc200rt_qmk/readme.md index 6490227806..2b7a0dd1ec 100644 --- a/keyboards/handwired/fc200rt_qmk/readme.md +++ b/keyboards/handwired/fc200rt_qmk/readme.md @@ -25,7 +25,6 @@ Choose any key from the corrosponding row and column and solder it to the pin on _NOTE: Some of the keys had mislabled columns and rows, so make sure the columns are all connected without diodes to one another, and that the rows are soldered after the diode_ * Keyboard Maintainer: [NaCly](https://github.com/Na-Cly) -* Hardware Supported: The PCBs, controllers supported * Hardware Availability: Leopold FC200RT + Teensy 2.0 Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/handwired/novem/readme.md b/keyboards/handwired/novem/readme.md index c259c2cb82..4ccf815236 100644 --- a/keyboards/handwired/novem/readme.md +++ b/keyboards/handwired/novem/readme.md @@ -2,8 +2,6 @@ ![novem](https://i.imgur.com/nPjBE9b.jpg) -A short description of the keyboard/project - * Keyboard Maintainer: [Jose I. Martinez](https://github.com/mechanicalguy21) * Hardware Supported: This is a handwired keyboard created over a 3d printed case. STL will be shared soon. diff --git a/keyboards/hineybush/h75_singa/readme.md b/keyboards/hineybush/h75_singa/readme.md index 815785834c..b110fd5b14 100644 --- a/keyboards/hineybush/h75_singa/readme.md +++ b/keyboards/hineybush/h75_singa/readme.md @@ -1,7 +1,5 @@ # h75_singa -![h75_singa](imgur.com image replace me!) - TBD - New 75% PCB for Singa Keyboards * Keyboard Maintainer: [hineybush](https://github.com/hineybush) diff --git a/keyboards/kakunpc/business_card/readme.md b/keyboards/kakunpc/business_card/readme.md index cbd05af410..98fdf1be90 100644 --- a/keyboards/kakunpc/business_card/readme.md +++ b/keyboards/kakunpc/business_card/readme.md @@ -1,12 +1,6 @@ # business_card -![business_card](imgur.com image replace me!) - -A short description of the keyboard/project - -Keyboard Maintainer: [kakunpc](https://github.com/kakunpc) -Hardware Supported: The PCBs, controllers supported -Hardware Availability: links to where you can find this hardware +* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/keebio/ergodicity/readme.md b/keyboards/keebio/ergodicity/readme.md index 0f841d6e3e..61f4ee658c 100644 --- a/keyboards/keebio/ergodicity/readme.md +++ b/keyboards/keebio/ergodicity/readme.md @@ -1,9 +1,5 @@ # Ergodicity -![ergodicity](imgur.com image replace me!) - -A short description of the keyboard/project - Keyboard Maintainer: [nooges/bakingpy](https://github.com/nooges) Hardware Supported: Ergodicity PCB w/ATmega32u4 Hardware Availability: [Keebio](https://keeb.io) diff --git a/keyboards/kira/kira75/readme.md b/keyboards/kira/kira75/readme.md index a30b60d179..237e81d06b 100644 --- a/keyboards/kira/kira75/readme.md +++ b/keyboards/kira/kira75/readme.md @@ -1,7 +1,5 @@ # Kira 75 -![kira75](imgur.com image replace me!) - 75% keyboard designed by thesiscamper Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) diff --git a/keyboards/kprepublic/bm16a/v1/readme.md b/keyboards/kprepublic/bm16a/v1/readme.md index d24a879505..6ad3773371 100644 --- a/keyboards/kprepublic/bm16a/v1/readme.md +++ b/keyboards/kprepublic/bm16a/v1/readme.md @@ -5,7 +5,6 @@ A 16 key macropad, with USB C, RGB underglow and backlight. * Keyboard Maintainer: QMK Community -* Hardware Supported: The PCBs, controllers supported * Hardware Availability: [KPrepublic](https://kprepublic.com/products/bm16a-16-keys-custom-mechanical-keyboard-pcb-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-bottom-underglow-alps-mx); [AliExpress](https://www.aliexpress.com/store/product/bm16a-16-keys-Custom-Mechanical-Keyboard-PCB-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-bottom/3034003_32970629907.html) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/kprepublic/bm16s/readme.md b/keyboards/kprepublic/bm16s/readme.md index 6a887e553a..5b121cdaea 100644 --- a/keyboards/kprepublic/bm16s/readme.md +++ b/keyboards/kprepublic/bm16s/readme.md @@ -3,7 +3,6 @@ A 16-key macropad, with USB C and per-key RGB backlighting. This is a variant of the BM16A, but with low profile Choc switches. * Keyboard Maintainer: QMK Community -* Hardware Supported: The PCBs, controllers supported * Hardware Availability: [KPrepublic](https://kprepublic.com/collections/pcb/products/bm16s-16-keys-custom-mechanical-keyboard-pcb-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-switch-leds-choc-switch); [AliExpress](https://www.aliexpress.com/item/bm16s-16-keys-Custom-Mechanical-Keyboard-PCB-plate-programmed-numpad-layouts-qmk-firmware-with-rgb-switch/32999247908.html); [Massdrop](https://www.massdrop.com/buy/78169) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/marksard/treadstone32/readme.md b/keyboards/marksard/treadstone32/readme.md index 170c6bc761..4e3d544698 100644 --- a/keyboards/marksard/treadstone32/readme.md +++ b/keyboards/marksard/treadstone32/readme.md @@ -4,9 +4,7 @@ A 32-key Symmetric staggered keyboard. -Keyboard Maintainer: [marksard](https://github.com/marksard) -Hardware Supported: The PCBs, controllers supported -Hardware Availability: links to where you can find this hardware +* Keyboard Maintainer: [marksard](https://github.com/marksard) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/marksard/treadstone48/readme.md b/keyboards/marksard/treadstone48/readme.md index c5f6f8f73f..692891447c 100644 --- a/keyboards/marksard/treadstone48/readme.md +++ b/keyboards/marksard/treadstone48/readme.md @@ -4,9 +4,7 @@ A 47 (or 48) keys Symmetric Staggered keyboard. -Keyboard Maintainer: [marksard](https://github.com/marksard) -Hardware Supported: The PCBs, controllers supported -Hardware Availability: links to where you can find this hardware +* Keyboard Maintainer: [marksard](https://github.com/marksard) Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/masterworks/classy_tkl/readme.md b/keyboards/masterworks/classy_tkl/readme.md index 0557ed7f4c..1e5903483c 100644 --- a/keyboards/masterworks/classy_tkl/readme.md +++ b/keyboards/masterworks/classy_tkl/readme.md @@ -2,8 +2,6 @@ ![Classy TKL](https://i.imgur.com/p1dxfYKl.jpg) -A short description of the keyboard/project - * Keyboard Maintainer: [Mathias Andersson](https://github.com/wraul) * Hardware Supported: [Classy TKL PCB](https://github.com/4pplet/classyTKL) * Hardware Availability: https://geekhack.org/index.php?topic=105933 diff --git a/keyboards/mb44/readme.md b/keyboards/mb44/readme.md index 3cd59ecdb1..3029c69f9e 100644 --- a/keyboards/mb44/readme.md +++ b/keyboards/mb44/readme.md @@ -5,8 +5,6 @@ To reset and put into bootloader mode, please use the hardware reset button on the botton of the PCB. If the PCB is on the default firmware, software reset is available by holding the bottom left corner key and pressing `B` in the standard qwerty layout. * Keyboard Maintainer: [melonbred](https://github.com/melonbred) -* Hardware Supported: The PCBs, controllers supported -* Hardware Availability: Links to where you can find this hardware Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/mechlovin/delphine/readme.md b/keyboards/mechlovin/delphine/readme.md index 9a5389a5f3..397a0ada40 100644 --- a/keyboards/mechlovin/delphine/readme.md +++ b/keyboards/mechlovin/delphine/readme.md @@ -1,7 +1,5 @@ # delphine -![delphine](imgur.com image replace me!) - A Number-Pad PCB, Mono backlight and RGB backlight version, Dolpad compatible. * Keyboard Maintainer: [Mechlovin'](https://github.com/mechlovin) diff --git a/keyboards/mechwild/mokulua/readme.md b/keyboards/mechwild/mokulua/readme.md index 24f01b10d4..5a6b69e66e 100644 --- a/keyboards/mechwild/mokulua/readme.md +++ b/keyboards/mechwild/mokulua/readme.md @@ -2,8 +2,6 @@ ![Mokulua](https://i.imgur.com/7fifiQch.jpg) -*A short description of the keyboard/project* - * Keyboard Maintainer: [Kyle McCreery](https://github.com/kylemccreery) * Hardware Supported: Mokulua v1.3 * Hardware Availability: https://mechwild.com/product/mokulua/ diff --git a/keyboards/meme/readme.md b/keyboards/meme/readme.md index 94b55d746e..7b09a5e18f 100644 --- a/keyboards/meme/readme.md +++ b/keyboards/meme/readme.md @@ -1,7 +1,5 @@ # Meme -![meme](imgur.com image replace me!) - 65% gasket mount keyboard. Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) diff --git a/keyboards/mint60/readme.md b/keyboards/mint60/readme.md index 1824c682f8..3a28f56181 100644 --- a/keyboards/mint60/readme.md +++ b/keyboards/mint60/readme.md @@ -2,11 +2,8 @@ ![Mint60](https://i.imgur.com/suOE8HN.jpg) -A short description of the keyboard/project - Keyboard Maintainer: [Eucalyn](https://github.com/eucalyn) [@eucalyn_](https://twitter.com/eucalyn_) Hardware Supported: The Mint60 PCBs, ProMicro supported -Hardware Availability: links to where you can find this hardware Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/pegasus/readme.md b/keyboards/pegasus/readme.md index c523c03540..9c6d575e92 100644 --- a/keyboards/pegasus/readme.md +++ b/keyboards/pegasus/readme.md @@ -5,8 +5,6 @@ Pegasus is a 40% keyboard with a 12.75u "WKL" layout with 0.75u blockers. * Keyboard Maintainer: [melonbred](https://github.com/melonbred) -* Hardware Supported: The PCBs, controllers supported -* Hardware Availability: Links to where you can find this hardware Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/tgr/tris/readme.md b/keyboards/tgr/tris/readme.md index c9cc199069..e01e7decaa 100644 --- a/keyboards/tgr/tris/readme.md +++ b/keyboards/tgr/tris/readme.md @@ -1,7 +1,5 @@ # TGR Tris/Tris CE -A short description of the keyboard/project - * Keyboard Maintainer: [poisonking](https://github.com/halfenergized) * Hardware Supported: Tris PCB * Hardware Availability: https://geekhack.org/index.php?topic=86221.0 diff --git a/keyboards/x16/readme.md b/keyboards/x16/readme.md index 6434af99c7..cfe83905d7 100644 --- a/keyboards/x16/readme.md +++ b/keyboards/x16/readme.md @@ -3,7 +3,6 @@ A 16 key macropad, with USB C * Keyboard Maintainer: QMK Community -* Hardware Supported: The PCBs, controllers supported * Hardware Availability: The x16 was discontinued by [x16](https://yinxianwei.github.io/x16/) Make example for this keyboard (after setting up your build environment): From 5e886478792ba40cf98c95a508e0faee9fa171a6 Mon Sep 17 00:00:00 2001 From: wmatex Date: Sat, 15 Feb 2025 05:56:00 +0100 Subject: [PATCH 175/592] Fix installation of clang in gentoo install script (#24917) fix: sys-devel/clang was renamed to llvm-core/clang see: https://github.com/gentoo/gentoo/commit/1f9f1999cdc8ccb94054dec2d2951c7e486aa996 --- util/install/gentoo.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/install/gentoo.sh b/util/install/gentoo.sh index 49e80490be..3c8f417fb7 100755 --- a/util/install/gentoo.sh +++ b/util/install/gentoo.sh @@ -22,7 +22,7 @@ _qmk_install() { echo "sys-devel/gcc multilib\ncross-arm-none-eabi/newlib nano" | sudo tee --append /etc/portage/package.use/qmkfirmware >/dev/null sudo emerge -auN sys-devel/gcc sudo emerge -au --noreplace \ - app-arch/unzip app-arch/zip net-misc/wget sys-devel/clang \ + app-arch/unzip app-arch/zip net-misc/wget llvm-core/clang \ sys-devel/crossdev \>=dev-lang/python-3.7 dev-embedded/avrdude \ dev-embedded/dfu-programmer app-mobilephone/dfu-util sys-apps/hwloc \ dev-libs/hidapi From 3ab2b3b6e2ac85c8bc00b81911d73f060e616228 Mon Sep 17 00:00:00 2001 From: DavidSannier Date: Sun, 16 Feb 2025 10:48:40 +0100 Subject: [PATCH 176/592] Chaining OSL and MO (#23065) --- quantum/action.c | 4 + tests/basic/test_one_shot_keys.cpp | 336 ++++++++++++++++++++++++++++- 2 files changed, 339 insertions(+), 1 deletion(-) diff --git a/quantum/action.c b/quantum/action.c index a39631ba3e..395340d9d7 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -817,6 +817,10 @@ void process_action(keyrecord_t *record, action_t action) { case ACT_LAYER_TAP_EXT: # endif led_set(host_keyboard_leds()); +# ifndef NO_ACTION_ONESHOT + // don't release the key + do_release_oneshot = false; +# endif break; default: break; diff --git a/tests/basic/test_one_shot_keys.cpp b/tests/basic/test_one_shot_keys.cpp index 64a8673a5c..92db52f811 100644 --- a/tests/basic/test_one_shot_keys.cpp +++ b/tests/basic/test_one_shot_keys.cpp @@ -168,7 +168,7 @@ TEST_F(OneShot, OSMChainingTwoOSMs) { tap_key(osm_key1); VERIFY_AND_CLEAR(driver); - /* Press and relesea OSM2 */ + /* Press and release OSM2 */ EXPECT_NO_REPORT(driver); tap_key(osm_key2); VERIFY_AND_CLEAR(driver); @@ -353,3 +353,337 @@ TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) { run_one_scan_loop(); VERIFY_AND_CLEAR(driver); } + +TEST_F(OneShot, OSLWithMoAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey mo_key = KeymapKey{1, 1, 0, MO(2)}; + KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A}; + + set_keymap({osl_key, mo_key, regular_key}); + + /* Press OSL key */ + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release OSL key */ + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press MO */ + EXPECT_NO_REPORT(driver); + mo_key.press(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(2)); + VERIFY_AND_CLEAR(driver); + + /* Press regular key */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + regular_key.press(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(2)); + VERIFY_AND_CLEAR(driver); + + /* Release regular key */ + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release MO */ + EXPECT_NO_REPORT(driver); + mo_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(0)); + VERIFY_AND_CLEAR(driver); +} + +class OneShotLayerParametrizedTestFixture : public ::testing::WithParamInterface, public OneShot {}; + +TEST_P(OneShotLayerParametrizedTestFixture, OSLWithActionAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey action_key = KeymapKey{1, 1, 0, GetParam()}; + KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A}; + + set_keymap({osl_key, action_key, regular_key}); + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Tag Action key */ + EXPECT_NO_REPORT(driver); + tap_key(action_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(2)); + VERIFY_AND_CLEAR(driver); + + /* Press regular key */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + regular_key.press(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(2)); + VERIFY_AND_CLEAR(driver); + + /* Release regular key */ + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +INSTANTIATE_TEST_CASE_P(OneShotLayerTests, OneShotLayerParametrizedTestFixture, ::testing::Values(TG(2), TO(2))); + +TEST_F(OneShot, OSLWithDFAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey df_key = KeymapKey{1, 1, 0, DF(2)}; + KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A}; + + set_keymap({osl_key, df_key, regular_key}); + + layer_state_t default_layer_state_bak = default_layer_state; + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press DF key */ + EXPECT_NO_REPORT(driver); + df_key.press(); + run_one_scan_loop(); + EXPECT_EQ(default_layer_state, 0b001); + + VERIFY_AND_CLEAR(driver); + + /* Release DF key */ + EXPECT_NO_REPORT(driver); + df_key.release(); + run_one_scan_loop(); + EXPECT_EQ(default_layer_state, 0b100); + VERIFY_AND_CLEAR(driver); + + /* Press regular key */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release regular key */ + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + default_layer_state = default_layer_state_bak; +} + +TEST_F(OneShot, OSLChainingTwoOSLsAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl1_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osl2_key = KeymapKey{1, 1, 0, OSL(2)}; + KeymapKey regular_key = KeymapKey{2, 1, 1, KC_A}; + + set_keymap({osl1_key, osl2_key, regular_key}); + + /* Press and release first OSL key */ + EXPECT_NO_REPORT(driver); + osl1_key.press(); + run_one_scan_loop(); + osl1_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press and release second OSL */ + EXPECT_NO_REPORT(driver); + osl2_key.press(); + run_one_scan_loop(); + osl2_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(2)); + VERIFY_AND_CLEAR(driver); + + /* Press regular key */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + EXPECT_EMPTY_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release regular key */ + EXPECT_NO_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(0)); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithShortLT) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey lt_key = KeymapKey(1, 1, 0, LT(2, KC_A)); + + set_keymap({osl_key, lt_key}); + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Tap LT key. */ + EXPECT_REPORT(driver, (lt_key.report_code)).Times(1); + EXPECT_EMPTY_REPORT(driver); + tap_key(lt_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(0)); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithLongLTAndRegularKey) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey lt_key = KeymapKey(1, 1, 0, LT(2, KC_A)); + KeymapKey regular_key = KeymapKey(2, 1, 1, KC_B); + + set_keymap({osl_key, lt_key, regular_key}); + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press LT key. */ + EXPECT_NO_REPORT(driver); + lt_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Idle for tapping term of mod tap hold key. */ + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + EXPECT_TRUE(layer_state_is(2)); + + /* Press regular key. */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release regular key. */ + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithShortModTapKeyAndRegularKey) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_P)); + KeymapKey regular_key = KeymapKey(0, 2, 0, KC_A); + + set_keymap({osl_key, mod_tap_hold_key, regular_key}); + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release mod-tap-hold key. */ + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Press regular key. */ + EXPECT_REPORT(driver, (regular_key.report_code)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release regular key. */ + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithLongModTapKeyAndRegularKey) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey mod_tap_hold_key = KeymapKey(1, 1, 0, SFT_T(KC_P)); + KeymapKey regular_key = KeymapKey(1, 2, 0, KC_A); + + set_keymap({osl_key, mod_tap_hold_key, regular_key}); + + /* Tap OSL key */ + EXPECT_NO_REPORT(driver); + tap_key(osl_key); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + /* Press mod-tap-hold key. */ + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Idle for tapping term of mod tap hold key. */ + EXPECT_REPORT(driver, (KC_LSFT)); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + /* Release mod-tap-hold key. */ + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Press regular key. */ + EXPECT_REPORT(driver, (regular_key.report_code)).Times(1); + EXPECT_EMPTY_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + /* Release regular key. */ + EXPECT_NO_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} \ No newline at end of file From b69bf4b885cd8d597c29f0af64a3faf2aafa54ce Mon Sep 17 00:00:00 2001 From: John Date: Sun, 16 Feb 2025 03:50:42 -0600 Subject: [PATCH 177/592] Retro Tapping Re-Write; Key Roll Fix (#23641) --- quantum/action.c | 50 ++- .../retro_tapping/test_key_roll.cpp | 408 ++++++++++++++++++ 2 files changed, 446 insertions(+), 12 deletions(-) create mode 100644 tests/tap_hold_configurations/retro_tapping/test_key_roll.cpp diff --git a/quantum/action.c b/quantum/action.c index 395340d9d7..be85192d25 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -47,7 +47,12 @@ along with this program. If not, see . int tp_buttons; #if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) || (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) -int retro_tapping_counter = 0; +bool retro_tap_primed = false; +uint16_t retro_tap_curr_key = 0; +# if !(defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) +uint8_t retro_tap_curr_mods = 0; +uint8_t retro_tap_next_mods = 0; +# endif #endif #if defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT) && !defined(NO_ACTION_TAPPING) @@ -77,7 +82,13 @@ void action_exec(keyevent_t event) { debug_event(event); ac_dprintf("\n"); #if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) || (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) - retro_tapping_counter++; + uint16_t event_keycode = get_event_keycode(event, false); + if (event.pressed) { + retro_tap_primed = false; + retro_tap_curr_key = event_keycode; + } else if (retro_tap_curr_key == event_keycode) { + retro_tap_primed = true; + } #endif } @@ -531,7 +542,8 @@ void process_action(keyrecord_t *record, action_t action) { # if defined(RETRO_TAPPING) && defined(DUMMY_MOD_NEUTRALIZER_KEYCODE) // Send a dummy keycode to neutralize flashing modifiers // if the key was held and then released with no interruptions. - if (retro_tapping_counter == 2) { + uint16_t ev_kc = get_event_keycode(event, false); + if (retro_tap_primed && retro_tap_curr_key == ev_kc) { neutralize_flashing_modifiers(get_mods()); } # endif @@ -829,30 +841,44 @@ void process_action(keyrecord_t *record, action_t action) { #ifndef NO_ACTION_TAPPING # if defined(RETRO_TAPPING) || defined(RETRO_TAPPING_PER_KEY) || (defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) - if (!is_tap_action(action)) { - retro_tapping_counter = 0; - } else { + if (is_tap_action(action)) { if (event.pressed) { if (tap_count > 0) { - retro_tapping_counter = 0; + retro_tap_primed = false; + } else { +# if !(defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) + retro_tap_curr_mods = retro_tap_next_mods; + retro_tap_next_mods = get_mods(); +# endif } } else { + uint16_t event_keycode = get_event_keycode(event, false); +# if !(defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) + uint8_t curr_mods = get_mods(); +# endif if (tap_count > 0) { - retro_tapping_counter = 0; - } else { + retro_tap_primed = false; + } else if (retro_tap_curr_key == event_keycode) { if ( # ifdef RETRO_TAPPING_PER_KEY - get_retro_tapping(get_event_keycode(record->event, false), record) && + get_retro_tapping(event_keycode, record) && # endif - retro_tapping_counter == 2) { + retro_tap_primed) { # if defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT) process_auto_shift(action.layer_tap.code, record); # else + register_mods(retro_tap_curr_mods); + wait_ms(TAP_CODE_DELAY); tap_code(action.layer_tap.code); + wait_ms(TAP_CODE_DELAY); + unregister_mods(retro_tap_curr_mods); # endif } - retro_tapping_counter = 0; + retro_tap_primed = false; } +# if !(defined(AUTO_SHIFT_ENABLE) && defined(RETRO_SHIFT)) + retro_tap_next_mods = curr_mods; +# endif } } # endif diff --git a/tests/tap_hold_configurations/retro_tapping/test_key_roll.cpp b/tests/tap_hold_configurations/retro_tapping/test_key_roll.cpp new file mode 100644 index 0000000000..afcbde9937 --- /dev/null +++ b/tests/tap_hold_configurations/retro_tapping/test_key_roll.cpp @@ -0,0 +1,408 @@ +/* Copyright 2024 John Rigoni + * + * 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 "keyboard_report_util.hpp" +#include "keycode.h" +#include "keycodes.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::InSequence; + +class RetroTapKeyRoll : public TestFixture {}; + +TEST_F(RetroTapKeyRoll, regular_to_left_gui_mod_over_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_B); + + set_keymap({mod_tap_hold_key, regular_key}); + + EXPECT_REPORT(driver, (KC_B)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B, KC_LEFT_GUI)); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE)); + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, regular_to_mod_over_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto regular_key = KeymapKey(0, 2, 0, KC_B); + + set_keymap({mod_tap_hold_key, regular_key}); + + EXPECT_REPORT(driver, (KC_B)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B, KC_LEFT_SHIFT)); + mod_tap_hold_key.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, regular_to_mod_under_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto regular_key = KeymapKey(0, 2, 0, KC_B); + + set_keymap({mod_tap_hold_key, regular_key}); + + EXPECT_REPORT(driver, (KC_B)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_regular) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_B); + + set_keymap({mod_tap_hold_key, regular_key}); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_B, KC_P)); + EXPECT_REPORT(driver, (KC_B)); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_regular) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_key = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto regular_key = KeymapKey(0, 2, 0, KC_B); + + set_keymap({mod_tap_hold_key, regular_key}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_hold_key.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_under_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft}); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_lshft.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_gui.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_gui.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_mod_under_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_hold_lshft.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_gui.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_P)); + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_gui.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_over_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft}); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_lshft.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_GUI)); + mod_tap_hold_gui.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE)); + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_P, KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_gui.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_under_tap_term_to_mod_over_tap_term_offset) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft}); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_lshft.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + mod_tap_hold_gui.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE)); + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_hold_gui.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_over_tap_term_to_mod_over_tap_term) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_gui = KeymapKey(0, 1, 0, LGUI_T(KC_P)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_hold_gui, mod_tap_hold_lshft}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_hold_lshft.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_GUI)); + mod_tap_hold_gui.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_GUI, DUMMY_MOD_NEUTRALIZER_KEYCODE)); + EXPECT_REPORT(driver, (KC_LEFT_GUI)); + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_P, KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_gui.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(RetroTapKeyRoll, mod_to_mod_to_mod) { + TestDriver driver; + InSequence s; + auto mod_tap_hold_lalt = KeymapKey(0, 1, 0, LALT_T(KC_R)); + auto mod_tap_hold_lshft = KeymapKey(0, 2, 0, SFT_T(KC_A)); + auto mod_tap_hold_lctrl = KeymapKey(0, 3, 0, LCTL_T(KC_C)); + + set_keymap({mod_tap_hold_lalt, mod_tap_hold_lshft, mod_tap_hold_lctrl}); + + EXPECT_REPORT(driver, (KC_LEFT_ALT)); + mod_tap_hold_lalt.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_ALT)); + mod_tap_hold_lshft.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_hold_lalt.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_CTRL, KC_LEFT_SHIFT)); + EXPECT_NO_REPORT(driver); + mod_tap_hold_lctrl.press(); + idle_for(TAPPING_TERM); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_CTRL)); + mod_tap_hold_lshft.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_C, KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_hold_lctrl.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} From 110cc0923b012c6f081a448fc120cddc2e670cb9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 16 Feb 2025 10:22:57 +0000 Subject: [PATCH 178/592] Reject readme dummy content (#24913) --- lib/python/qmk/cli/lint.py | 48 +++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index d82be8b2d0..c09e377ad6 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -33,6 +33,28 @@ def _list_defaultish_keymaps(kb): return keymaps +def _get_readme_files(kb, km=None): + """Return potential keyboard/keymap readme files + """ + search_path = locate_keymap(kb, km).parent if km else keyboard(kb) + + readme_files = [] + + if not km: + current_path = Path(search_path.parts[0]) + for path_part in search_path.parts[1:]: + current_path = current_path / path_part + readme_files.extend(current_path.glob('*readme.md')) + + for file in search_path.glob("**/*readme.md"): + # Ignore keymaps when only globing keyboard files + if not km and 'keymaps' in file.parts: + continue + readme_files.append(file) + + return set(readme_files) + + def _get_build_files(kb, km=None): """Return potential keyboard/keymap build files """ @@ -78,6 +100,25 @@ def _get_code_files(kb, km=None): return code_files +def _is_invalid_readme(file): + """Check if file contains any unfilled content + """ + tokens = [ + '%KEYBOARD%', + '%REAL_NAME%', + '%USER_NAME%', + 'image replace me!', + 'A short description of the keyboard/project', + 'The PCBs, controllers supported', + 'Links to where you can find this hardware', + ] + + for line in file.read_text(encoding='utf-8').split("\n"): + if any(token in line for token in tokens): + return True + return False + + def _is_empty_rules(file): """Check if file contains any useful content """ @@ -201,7 +242,7 @@ def keymap_check(kb, km): return ok -def keyboard_check(kb): +def keyboard_check(kb): # noqa C901 """Perform the keyboard level checks. """ ok = True @@ -221,6 +262,11 @@ def keyboard_check(kb): cli.log.error(f'{kb}: The file "{file}" should not exist!') ok = False + for file in _get_readme_files(kb): + if _is_invalid_readme(file): + cli.log.error(f'{kb}: The file "{file}" still contains template tokens!') + ok = False + for file in _get_build_files(kb): if _is_empty_rules(file): cli.log.error(f'{kb}: The file "{file}" is effectively empty and should be removed!') From ad2c0f35651a7825277c8c30bc3c0e8ead5ddb73 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 16 Feb 2025 21:24:01 +1100 Subject: [PATCH 179/592] Add more stale exemption labels. (#24922) --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index ce9bd0f316..25649ce943 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -45,7 +45,7 @@ jobs: stale-pr-label: stale days-before-pr-stale: 45 days-before-pr-close: 30 - exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold + exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold,needs-core-wireless,crippled-firmware stale-pr-message: > Thank you for your contribution! From d035f02c08b587213a35335c1d523af10b11b543 Mon Sep 17 00:00:00 2001 From: HorrorTroll Date: Sun, 16 Feb 2025 22:07:17 +0700 Subject: [PATCH 180/592] Patch up issue for inverted complementary output on Backlight (#24794) Change complementary output to active high, when backlight on state is 1 --- platforms/chibios/drivers/backlight_pwm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/chibios/drivers/backlight_pwm.c b/platforms/chibios/drivers/backlight_pwm.c index 25fe7962b0..47ad008415 100644 --- a/platforms/chibios/drivers/backlight_pwm.c +++ b/platforms/chibios/drivers/backlight_pwm.c @@ -28,9 +28,9 @@ // Support for pins which are on TIM1_CH1N #ifdef BACKLIGHT_PWM_COMPLEMENTARY_OUTPUT # if BACKLIGHT_ON_STATE == 1 -# define PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW; -# else # define PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_HIGH; +# else +# define PWM_OUTPUT_MODE PWM_COMPLEMENTARY_OUTPUT_ACTIVE_LOW; # endif #else # if BACKLIGHT_ON_STATE == 1 From 132efa907679832b81c06c57042c337241b17b8c Mon Sep 17 00:00:00 2001 From: Nizhegorodtsev Vyacheslav Sergeyevich <42460719+Programmer86@users.noreply.github.com> Date: Sun, 16 Feb 2025 21:32:50 +0500 Subject: [PATCH 181/592] Update for 'A-JAZZ AKC084' ('A-JAZZ AKP846') (#24868) Fix indicators, image, bootloader instructions and default keymap for 'A-JAZZ AKC084' --- keyboards/a_jazz/akc084/keyboard.json | 2 +- .../a_jazz/akc084/keymaps/default/keymap.c | 18 +++++++++--------- keyboards/a_jazz/akc084/readme.md | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/keyboards/a_jazz/akc084/keyboard.json b/keyboards/a_jazz/akc084/keyboard.json index a489a5ade5..a8290ea75f 100644 --- a/keyboards/a_jazz/akc084/keyboard.json +++ b/keyboards/a_jazz/akc084/keyboard.json @@ -20,7 +20,7 @@ }, "indicators": { "caps_lock": "A9", - "num_lock": "A10" + "scroll_lock": "A10" }, "matrix_pins": { "cols": ["B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13"], diff --git a/keyboards/a_jazz/akc084/keymaps/default/keymap.c b/keyboards/a_jazz/akc084/keymaps/default/keymap.c index 0ea7355fec..2bd7992707 100644 --- a/keyboards/a_jazz/akc084/keymaps/default/keymap.c +++ b/keyboards/a_jazz/akc084/keymaps/default/keymap.c @@ -25,19 +25,19 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - 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_PSCR, KC_SCRL, KC_PAUS, KC_MUTE, + 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_PSCR, KC_PAUS, KC_DEL, KC_MUTE, 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_HOME, - 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_DEL, - 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_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_ENT, 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, KC_END, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), [1] = LAYOUT( - _______, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_MYCM, KC_CALC, _______, _______, _______, _______, + _______, KC_MSEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MAIL, KC_WHOM, KC_MYCM, KC_CALC, _______, _______, KC_SCRL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SCRL, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______, _______, _______ ) }; \ No newline at end of file diff --git a/keyboards/a_jazz/akc084/readme.md b/keyboards/a_jazz/akc084/readme.md index d93c8a687d..4be104f581 100644 --- a/keyboards/a_jazz/akc084/readme.md +++ b/keyboards/a_jazz/akc084/readme.md @@ -1,8 +1,8 @@ -# A-JAZZ AKC084 +# A-JAZZ AKC084 (AKP846) A customizable 84keys keyboard -![akc084](https://i.imgur.com/381vaD7.png) +![akc084](https://i.imgur.com/6D0jBco.png) * Keyboard Maintainer: [Feng](https://github.com/fenggx-a-jazz) * Hardware Supported: [a-jazz](https://www.a-jazz.com) * Hardware Availability: [a-jazz](https://ajazzstore.com/collections/all/products/ajazz-akp846) @@ -18,6 +18,6 @@ Flashing example for this keyboard: See the build environment setup and the make instructions for more information. Brand new to QMK? Start with our Complete Newbs Guide. ## Bootloader ESC the bootloader in 3 ways: -* **Bootmagic reset: Hold down Enter in the keyboard then replug +* **Bootmagic reset: Hold down Esc in the keyboard then replug * **Physical reset button: Briefly press the button on the back of the PCB * **Keycode in layout: Press the key mapped to QK_BOOT From 164b7331c3b98165e49d38127bee366f9c545513 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 16 Feb 2025 21:39:29 +0000 Subject: [PATCH 182/592] Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson (#24915) --- data/mappings/keyboard_aliases.hjson | 36 +++++++++++++++++++ .../db60/hotswap}/rules.mk | 2 -- .../westm68 => cannonkeys/db60/j02}/rules.mk | 2 -- keyboards/cannonkeys/db60/{ => rev2}/rules.mk | 2 -- keyboards/converter/palm_usb/info.json | 20 ----------- .../palm_usb/{ => stowaway}/config.h | 0 .../converter/palm_usb/stowaway/keyboard.json | 18 ++++++++++ .../palm_usb/{ => stowaway}/matrix.c | 0 .../palm_usb/{ => stowaway}/readme.md | 0 .../palm_usb/{ => stowaway}/rules.mk | 2 -- .../meck_tkl/blackpill_f401/rules.mk | 2 ++ keyboards/handwired/meck_tkl/rules.mk | 4 --- keyboards/hhkb/ansi/{ => 32u2}/rules.mk | 2 -- keyboards/hhkb/ansi/32u4/rules.mk | 4 +++ keyboards/kakunpc/angel64/alpha/rules.mk | 3 ++ keyboards/kakunpc/angel64/rev1/rules.mk | 3 ++ keyboards/kakunpc/angel64/rules.mk | 5 --- keyboards/oddball/{ => v1}/rules.mk | 2 -- keyboards/oddball/v2/rules.mk | 1 + keyboards/oddball/v2_1/rules.mk | 1 + keyboards/teleport/native/ansi/rules.mk | 1 + keyboards/teleport/native/iso/rules.mk | 1 + keyboards/teleport/native/rules.mk | 3 -- keyboards/westm/westm68/rev1/rules.mk | 2 ++ keyboards/westm/westm68/rev2/rules.mk | 2 ++ keyboards/westm/westm9/rev1/rules.mk | 2 ++ keyboards/westm/westm9/rev2/rules.mk | 2 ++ keyboards/woodkeys/meira/featherble/rules.mk | 3 ++ keyboards/woodkeys/meira/promicro/rules.mk | 3 ++ keyboards/woodkeys/meira/rules.mk | 4 --- keyboards/work_louder/loop/post_rules.mk | 1 + keyboards/work_louder/loop/rules.mk | 3 -- .../work_louder/work_board/post_rules.mk | 1 + keyboards/work_louder/work_board/rules.mk | 3 -- keyboards/zsa/planck_ez/base/rules.mk | 2 ++ keyboards/zsa/planck_ez/glow/rules.mk | 2 ++ keyboards/zsa/planck_ez/rules.mk | 4 --- 37 files changed, 90 insertions(+), 58 deletions(-) rename keyboards/{westm/westm9 => cannonkeys/db60/hotswap}/rules.mk (64%) rename keyboards/{westm/westm68 => cannonkeys/db60/j02}/rules.mk (63%) rename keyboards/cannonkeys/db60/{ => rev2}/rules.mk (62%) delete mode 100644 keyboards/converter/palm_usb/info.json rename keyboards/converter/palm_usb/{ => stowaway}/config.h (100%) rename keyboards/converter/palm_usb/{ => stowaway}/matrix.c (100%) rename keyboards/converter/palm_usb/{ => stowaway}/readme.md (100%) rename keyboards/converter/palm_usb/{ => stowaway}/rules.mk (65%) create mode 100644 keyboards/handwired/meck_tkl/blackpill_f401/rules.mk delete mode 100644 keyboards/handwired/meck_tkl/rules.mk rename keyboards/hhkb/ansi/{ => 32u2}/rules.mk (64%) create mode 100644 keyboards/hhkb/ansi/32u4/rules.mk create mode 100644 keyboards/kakunpc/angel64/alpha/rules.mk create mode 100644 keyboards/kakunpc/angel64/rev1/rules.mk delete mode 100644 keyboards/kakunpc/angel64/rules.mk rename keyboards/oddball/{ => v1}/rules.mk (53%) create mode 100644 keyboards/oddball/v2/rules.mk create mode 100644 keyboards/oddball/v2_1/rules.mk create mode 100644 keyboards/teleport/native/ansi/rules.mk create mode 100644 keyboards/teleport/native/iso/rules.mk delete mode 100644 keyboards/teleport/native/rules.mk create mode 100644 keyboards/westm/westm68/rev1/rules.mk create mode 100644 keyboards/westm/westm68/rev2/rules.mk create mode 100644 keyboards/westm/westm9/rev1/rules.mk create mode 100644 keyboards/westm/westm9/rev2/rules.mk delete mode 100644 keyboards/woodkeys/meira/rules.mk create mode 100644 keyboards/work_louder/loop/post_rules.mk delete mode 100644 keyboards/work_louder/loop/rules.mk create mode 100644 keyboards/work_louder/work_board/post_rules.mk delete mode 100644 keyboards/work_louder/work_board/rules.mk create mode 100644 keyboards/zsa/planck_ez/base/rules.mk create mode 100644 keyboards/zsa/planck_ez/glow/rules.mk delete mode 100644 keyboards/zsa/planck_ez/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index d03ff33f2c..09549baf69 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1626,9 +1626,15 @@ "buzzard": { "target": "buzzard/rev1" }, + "cannonkeys/db60": { + "target": "cannonkeys/db60/rev2" + }, "clickety_split/leeloo": { "target": "clickety_split/leeloo/rev3" }, + "converter/palm_usb": { + "target": "converter/palm_usb/stowaway" + }, "crkbd": { "target": "crkbd/rev1" }, @@ -1713,6 +1719,9 @@ "handwired/dactyl_manuform/6x6": { "target": "handwired/dactyl_manuform/6x6/promicro" }, + "handwired/meck_tkl": { + "target": "handwired/meck_tkl/blackpill_f401" + }, "handwired/ms_sculpt_mobile": { "target": "handwired/ms_sculpt_mobile/teensy2pp" }, @@ -1752,6 +1761,9 @@ "hillside/46": { "target": "hillside/46/0_1" }, + "hhkb/ansi": { + "target": "hhkb/ansi/32u4" + }, "hillside/48": { "target": "hillside/48/0_1" }, @@ -1797,6 +1809,9 @@ "kakunpc/angel17": { "target": "kakunpc/angel17/rev1" }, + "kakunpc/angel64": { + "target": "kakunpc/angel64/rev1" + }, "kakunpc/business_card": { "target": "kakunpc/business_card/beta" }, @@ -2148,6 +2163,9 @@ "takashiski/namecard2x4": { "target": "takashiski/namecard2x4/rev2" }, + "teleport/native": { + "target": "teleport/native/iso" + }, "themadnoodle/noodlepad": { "target": "themadnoodle/noodlepad/v1" }, @@ -2181,6 +2199,21 @@ "vitamins_included": { "target": "vitamins_included/rev2" }, + "westm/westm68": { + "target": "westm/westm68/rev2" + }, + "westm/westm9": { + "target": "westm/westm9/rev2" + }, + "woodkeys/meira": { + "target": "woodkeys/meira/promicro" + }, + "work_louder/loop": { + "target": "work_louder/loop/rev3" + }, + "work_louder/work_board": { + "target": "work_louder/work_board/rev3" + }, "yanghu/unicorne": { "target": "yanghu/unicorne/f411" }, @@ -2195,5 +2228,8 @@ }, "yynmt/acperience12": { "target": "yynmt/acperience12/rev1" + }, + "zsa/planck_ez": { + "target": "zsa/planck_ez/base" } } diff --git a/keyboards/westm/westm9/rules.mk b/keyboards/cannonkeys/db60/hotswap/rules.mk similarity index 64% rename from keyboards/westm/westm9/rules.mk rename to keyboards/cannonkeys/db60/hotswap/rules.mk index 3ff78857b3..0ab54aaaf7 100644 --- a/keyboards/westm/westm9/rules.mk +++ b/keyboards/cannonkeys/db60/hotswap/rules.mk @@ -1,4 +1,2 @@ # Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS = -v FFFF -p FFFF - -DEFAULT_FOLDER = westm/westm9/rev2 diff --git a/keyboards/westm/westm68/rules.mk b/keyboards/cannonkeys/db60/j02/rules.mk similarity index 63% rename from keyboards/westm/westm68/rules.mk rename to keyboards/cannonkeys/db60/j02/rules.mk index 2a716f41c4..0ab54aaaf7 100644 --- a/keyboards/westm/westm68/rules.mk +++ b/keyboards/cannonkeys/db60/j02/rules.mk @@ -1,4 +1,2 @@ # Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS = -v FFFF -p FFFF - -DEFAULT_FOLDER = westm/westm68/rev2 diff --git a/keyboards/cannonkeys/db60/rules.mk b/keyboards/cannonkeys/db60/rev2/rules.mk similarity index 62% rename from keyboards/cannonkeys/db60/rules.mk rename to keyboards/cannonkeys/db60/rev2/rules.mk index 60addd7fe7..0ab54aaaf7 100644 --- a/keyboards/cannonkeys/db60/rules.mk +++ b/keyboards/cannonkeys/db60/rev2/rules.mk @@ -1,4 +1,2 @@ # Wildcard to allow APM32 MCU DFU_SUFFIX_ARGS = -v FFFF -p FFFF - -DEFAULT_FOLDER = cannonkeys/db60/rev2 diff --git a/keyboards/converter/palm_usb/info.json b/keyboards/converter/palm_usb/info.json deleted file mode 100644 index c5b893d757..0000000000 --- a/keyboards/converter/palm_usb/info.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "keyboard_name": "Stowaway Converter", - "manufacturer": "QMK", - "url": "", - "maintainer": "qmk", - "usb": { - "vid": "0xFEED", - "pid": "0x0001", - "device_version": "1.0.0" - }, - "processor": "atmega32u4", - "bootloader": "caterina", - "features": { - "bootmagic": false, - "mousekey": false, - "extrakey": false, - "console": true, - "command": true - } -} diff --git a/keyboards/converter/palm_usb/config.h b/keyboards/converter/palm_usb/stowaway/config.h similarity index 100% rename from keyboards/converter/palm_usb/config.h rename to keyboards/converter/palm_usb/stowaway/config.h diff --git a/keyboards/converter/palm_usb/stowaway/keyboard.json b/keyboards/converter/palm_usb/stowaway/keyboard.json index 9a263327ad..c93957b7d8 100644 --- a/keyboards/converter/palm_usb/stowaway/keyboard.json +++ b/keyboards/converter/palm_usb/stowaway/keyboard.json @@ -1,4 +1,22 @@ { + "keyboard_name": "Stowaway Converter", + "manufacturer": "QMK", + "url": "", + "maintainer": "qmk", + "usb": { + "vid": "0xFEED", + "pid": "0x0001", + "device_version": "1.0.0" + }, + "processor": "atmega32u4", + "bootloader": "caterina", + "features": { + "bootmagic": false, + "mousekey": false, + "extrakey": false, + "console": true, + "command": true + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/converter/palm_usb/matrix.c b/keyboards/converter/palm_usb/stowaway/matrix.c similarity index 100% rename from keyboards/converter/palm_usb/matrix.c rename to keyboards/converter/palm_usb/stowaway/matrix.c diff --git a/keyboards/converter/palm_usb/readme.md b/keyboards/converter/palm_usb/stowaway/readme.md similarity index 100% rename from keyboards/converter/palm_usb/readme.md rename to keyboards/converter/palm_usb/stowaway/readme.md diff --git a/keyboards/converter/palm_usb/rules.mk b/keyboards/converter/palm_usb/stowaway/rules.mk similarity index 65% rename from keyboards/converter/palm_usb/rules.mk rename to keyboards/converter/palm_usb/stowaway/rules.mk index bdb3bb0d6b..ccb8eb9ecc 100644 --- a/keyboards/converter/palm_usb/rules.mk +++ b/keyboards/converter/palm_usb/stowaway/rules.mk @@ -3,5 +3,3 @@ CUSTOM_MATRIX = yes SRC += matrix.c UART_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = converter/palm_usb/stowaway diff --git a/keyboards/handwired/meck_tkl/blackpill_f401/rules.mk b/keyboards/handwired/meck_tkl/blackpill_f401/rules.mk new file mode 100644 index 0000000000..6e47ffcd67 --- /dev/null +++ b/keyboards/handwired/meck_tkl/blackpill_f401/rules.mk @@ -0,0 +1,2 @@ +AUDIO_SUPPORTED = no +BACKLIGHT_SUPPORTED = no diff --git a/keyboards/handwired/meck_tkl/rules.mk b/keyboards/handwired/meck_tkl/rules.mk deleted file mode 100644 index cdf3900ff0..0000000000 --- a/keyboards/handwired/meck_tkl/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no -BACKLIGHT_SUPPORTED = no - -DEFAULT_FOLDER = handwired/meck_tkl/blackpill_f401 diff --git a/keyboards/hhkb/ansi/rules.mk b/keyboards/hhkb/ansi/32u2/rules.mk similarity index 64% rename from keyboards/hhkb/ansi/rules.mk rename to keyboards/hhkb/ansi/32u2/rules.mk index 841565b846..94eaaab9c0 100644 --- a/keyboards/hhkb/ansi/rules.mk +++ b/keyboards/hhkb/ansi/32u2/rules.mk @@ -2,5 +2,3 @@ CUSTOM_MATRIX = yes # project specific files SRC = matrix.c - -DEFAULT_FOLDER = hhkb/ansi/32u4 diff --git a/keyboards/hhkb/ansi/32u4/rules.mk b/keyboards/hhkb/ansi/32u4/rules.mk new file mode 100644 index 0000000000..94eaaab9c0 --- /dev/null +++ b/keyboards/hhkb/ansi/32u4/rules.mk @@ -0,0 +1,4 @@ +CUSTOM_MATRIX = yes + +# project specific files +SRC = matrix.c diff --git a/keyboards/kakunpc/angel64/alpha/rules.mk b/keyboards/kakunpc/angel64/alpha/rules.mk new file mode 100644 index 0000000000..09c02c88b0 --- /dev/null +++ b/keyboards/kakunpc/angel64/alpha/rules.mk @@ -0,0 +1,3 @@ +CUSTOM_MATRIX = yes + +SRC += matrix.c diff --git a/keyboards/kakunpc/angel64/rev1/rules.mk b/keyboards/kakunpc/angel64/rev1/rules.mk new file mode 100644 index 0000000000..09c02c88b0 --- /dev/null +++ b/keyboards/kakunpc/angel64/rev1/rules.mk @@ -0,0 +1,3 @@ +CUSTOM_MATRIX = yes + +SRC += matrix.c diff --git a/keyboards/kakunpc/angel64/rules.mk b/keyboards/kakunpc/angel64/rules.mk deleted file mode 100644 index c95d5297bd..0000000000 --- a/keyboards/kakunpc/angel64/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -CUSTOM_MATRIX = yes - -SRC += matrix.c - -DEFAULT_FOLDER = kakunpc/angel64/rev1 diff --git a/keyboards/oddball/rules.mk b/keyboards/oddball/v1/rules.mk similarity index 53% rename from keyboards/oddball/rules.mk rename to keyboards/oddball/v1/rules.mk index 2fc8995acb..84de35aeb1 100644 --- a/keyboards/oddball/rules.mk +++ b/keyboards/oddball/v1/rules.mk @@ -1,3 +1 @@ POINTING_DEVICE_DRIVER = adns9800 - -DEFAULT_FOLDER = oddball/v1 diff --git a/keyboards/oddball/v2/rules.mk b/keyboards/oddball/v2/rules.mk new file mode 100644 index 0000000000..84de35aeb1 --- /dev/null +++ b/keyboards/oddball/v2/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = adns9800 diff --git a/keyboards/oddball/v2_1/rules.mk b/keyboards/oddball/v2_1/rules.mk new file mode 100644 index 0000000000..84de35aeb1 --- /dev/null +++ b/keyboards/oddball/v2_1/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = adns9800 diff --git a/keyboards/teleport/native/ansi/rules.mk b/keyboards/teleport/native/ansi/rules.mk new file mode 100644 index 0000000000..942ef4c5db --- /dev/null +++ b/keyboards/teleport/native/ansi/rules.mk @@ -0,0 +1 @@ +RGB_MATRIX_CUSTOM_KB = yes diff --git a/keyboards/teleport/native/iso/rules.mk b/keyboards/teleport/native/iso/rules.mk new file mode 100644 index 0000000000..942ef4c5db --- /dev/null +++ b/keyboards/teleport/native/iso/rules.mk @@ -0,0 +1 @@ +RGB_MATRIX_CUSTOM_KB = yes diff --git a/keyboards/teleport/native/rules.mk b/keyboards/teleport/native/rules.mk deleted file mode 100644 index 53dc2b1747..0000000000 --- a/keyboards/teleport/native/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -RGB_MATRIX_CUSTOM_KB = yes - -DEFAULT_FOLDER = teleport/native/iso diff --git a/keyboards/westm/westm68/rev1/rules.mk b/keyboards/westm/westm68/rev1/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/westm/westm68/rev1/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/westm/westm68/rev2/rules.mk b/keyboards/westm/westm68/rev2/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/westm/westm68/rev2/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/westm/westm9/rev1/rules.mk b/keyboards/westm/westm9/rev1/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/westm/westm9/rev1/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/westm/westm9/rev2/rules.mk b/keyboards/westm/westm9/rev2/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/westm/westm9/rev2/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/woodkeys/meira/featherble/rules.mk b/keyboards/woodkeys/meira/featherble/rules.mk index 3437a35bdf..44ebb2c1fe 100644 --- a/keyboards/woodkeys/meira/featherble/rules.mk +++ b/keyboards/woodkeys/meira/featherble/rules.mk @@ -1,2 +1,5 @@ # Processor frequency F_CPU = 8000000 + +CUSTOM_MATRIX = yes +SRC += matrix.c diff --git a/keyboards/woodkeys/meira/promicro/rules.mk b/keyboards/woodkeys/meira/promicro/rules.mk index 09057bea54..32a05accc5 100644 --- a/keyboards/woodkeys/meira/promicro/rules.mk +++ b/keyboards/woodkeys/meira/promicro/rules.mk @@ -1,3 +1,6 @@ +CUSTOM_MATRIX = yes +SRC += matrix.c + # Disable unsupported hardware RGBLIGHT_SUPPORTED = no AUDIO_SUPPORTED = no diff --git a/keyboards/woodkeys/meira/rules.mk b/keyboards/woodkeys/meira/rules.mk deleted file mode 100644 index 423c14cfb7..0000000000 --- a/keyboards/woodkeys/meira/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -CUSTOM_MATRIX = yes -SRC += matrix.c - -DEFAULT_FOLDER = woodkeys/meira/promicro diff --git a/keyboards/work_louder/loop/post_rules.mk b/keyboards/work_louder/loop/post_rules.mk new file mode 100644 index 0000000000..e0822c009b --- /dev/null +++ b/keyboards/work_louder/loop/post_rules.mk @@ -0,0 +1 @@ +SRC += rgb_functions.c diff --git a/keyboards/work_louder/loop/rules.mk b/keyboards/work_louder/loop/rules.mk deleted file mode 100644 index 53c3227972..0000000000 --- a/keyboards/work_louder/loop/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -SRC += rgb_functions.c - -DEFAULT_FOLDER = work_louder/loop/rev3 diff --git a/keyboards/work_louder/work_board/post_rules.mk b/keyboards/work_louder/work_board/post_rules.mk new file mode 100644 index 0000000000..e0822c009b --- /dev/null +++ b/keyboards/work_louder/work_board/post_rules.mk @@ -0,0 +1 @@ +SRC += rgb_functions.c diff --git a/keyboards/work_louder/work_board/rules.mk b/keyboards/work_louder/work_board/rules.mk deleted file mode 100644 index a4c45393c0..0000000000 --- a/keyboards/work_louder/work_board/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -SRC += rgb_functions.c - -DEFAULT_FOLDER = work_louder/work_board/rev3 diff --git a/keyboards/zsa/planck_ez/base/rules.mk b/keyboards/zsa/planck_ez/base/rules.mk new file mode 100644 index 0000000000..c0b951fba9 --- /dev/null +++ b/keyboards/zsa/planck_ez/base/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_SUPPORTED = no +BACKLIGHT_SUPPORTED = no diff --git a/keyboards/zsa/planck_ez/glow/rules.mk b/keyboards/zsa/planck_ez/glow/rules.mk new file mode 100644 index 0000000000..c0b951fba9 --- /dev/null +++ b/keyboards/zsa/planck_ez/glow/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_SUPPORTED = no +BACKLIGHT_SUPPORTED = no diff --git a/keyboards/zsa/planck_ez/rules.mk b/keyboards/zsa/planck_ez/rules.mk deleted file mode 100644 index 67921c96ed..0000000000 --- a/keyboards/zsa/planck_ez/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -RGBLIGHT_SUPPORTED = no -BAKCLIGHT_SUPPORTED = no - -DEFAULT_FOLDER = zsa/planck_ez/base From c00b0c5bc96b4cd5d096d3c8701e86be9aba4982 Mon Sep 17 00:00:00 2001 From: Steve Storck Date: Sun, 16 Feb 2025 16:41:07 -0500 Subject: [PATCH 183/592] Created SH1107 driver for quantum painter (#24724) Co-authored-by: Sergey Vlasov --- drivers/painter/sh1107/qp_sh1107.c | 218 +++++++++++++++++++++ drivers/painter/sh1107/qp_sh1107.h | 64 ++++++ drivers/painter/sh1107/qp_sh1107_opcodes.h | 25 +++ quantum/painter/qp.h | 6 + quantum/painter/qp_internal.c | 1 + quantum/painter/rules.mk | 25 +++ 6 files changed, 339 insertions(+) create mode 100644 drivers/painter/sh1107/qp_sh1107.c create mode 100644 drivers/painter/sh1107/qp_sh1107.h create mode 100644 drivers/painter/sh1107/qp_sh1107_opcodes.h diff --git a/drivers/painter/sh1107/qp_sh1107.c b/drivers/painter/sh1107/qp_sh1107.c new file mode 100644 index 0000000000..f4cbd49e40 --- /dev/null +++ b/drivers/painter/sh1107/qp_sh1107.c @@ -0,0 +1,218 @@ +#include "qp_internal.h" +#include "qp_comms.h" +#include "qp_surface_internal.h" +#include "qp_oled_panel.h" +#include "qp_sh1107.h" +#include "qp_sh1107_opcodes.h" +#include "qp_surface.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Driver storage +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +typedef struct sh1107_device_t { + oled_panel_painter_device_t oled; + + uint8_t framebuffer[SURFACE_REQUIRED_BUFFER_BYTE_SIZE(128, 128, 1)]; +} sh1107_device_t; + +static sh1107_device_t sh1107_drivers[SH1107_NUM_DEVICES] = {0}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantum Painter API implementations + +// Initialisation +__attribute__((weak)) bool qp_sh1107_init(painter_device_t device, painter_rotation_t rotation) { + sh1107_device_t *driver = (sh1107_device_t *)device; + + // Change the surface geometry based on the panel rotation + if (rotation == QP_ROTATION_90 || rotation == QP_ROTATION_270) { + driver->oled.surface.base.panel_width = driver->oled.base.panel_height; + driver->oled.surface.base.panel_height = driver->oled.base.panel_width; + } else { + driver->oled.surface.base.panel_width = driver->oled.base.panel_width; + driver->oled.surface.base.panel_height = driver->oled.base.panel_height; + } + + // Init the internal surface + if (!qp_init(&driver->oled.surface.base, QP_ROTATION_0)) { + qp_dprintf("Failed to init internal surface in qp_sh1107_init\n"); + return false; + } + + // clang-format off + uint8_t sh1107_init_sequence[] = { + // Command, Delay, N, Data[N] + SH1107_SET_MUX_RATIO, 0, 1, 0x7F, // 1/128 duty + SH1107_DISPLAY_OFFSET, 0, 1, 0x00, + SH1107_SET_START_LINE, 0, 1, 0x00, // Different from SH1106 + SH1107_SET_SEGMENT_REMAP_INV, 0, 0, + SH1107_COM_SCAN_DIR_DEC, 0, 0, + SH1107_COM_PADS_HW_CFG, 0, 1, 0x12, + SH1107_SET_CONTRAST, 0, 1, 0x7F, + SH1107_ALL_ON_RESUME, 0, 0, + SH1107_NON_INVERTING_DISPLAY, 0, 0, + SH1107_SET_OSC_DIVFREQ, 0, 1, 0x80, + SH1107_SET_CHARGE_PUMP, 0, 1, 0x14, + SH1107_DISPLAY_ON, 0, 0, + }; + // clang-format on + + // If the display width is anything other than the default 128 pixels, change SH1107_SET_MUX_RATIO data byte to the correct value. + if (driver->oled.base.panel_width != 128) { + sh1107_init_sequence[3] = driver->oled.base.panel_width - 1; + } + + // If the display width is less than the default 128 pixels, change SH1107_DISPLAY_OFFSET to use the center columns. + if (driver->oled.base.panel_width < 128) { + sh1107_init_sequence[7] = (128U - driver->oled.base.panel_width) / 2; + } + + // For smaller displays, change SH1107_COM_PADS_HW_CFG data byte from alternative (0x12) to sequential (0x02) configuration + if (driver->oled.base.panel_height <= 64) { + sh1107_init_sequence[20] = 0x02; + } + + qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence)); + return true; +} + +// Screen flush +bool qp_sh1107_flush(painter_device_t device) { + sh1107_device_t *driver = (sh1107_device_t *)device; + + if (!driver->oled.surface.dirty.is_dirty) { + return true; + } + + switch (driver->oled.base.rotation) { + default: + case QP_ROTATION_0: + qp_oled_panel_page_column_flush_rot0(device, &driver->oled.surface.dirty, driver->framebuffer); + break; + case QP_ROTATION_90: + qp_oled_panel_page_column_flush_rot90(device, &driver->oled.surface.dirty, driver->framebuffer); + break; + case QP_ROTATION_180: + qp_oled_panel_page_column_flush_rot180(device, &driver->oled.surface.dirty, driver->framebuffer); + break; + case QP_ROTATION_270: + qp_oled_panel_page_column_flush_rot270(device, &driver->oled.surface.dirty, driver->framebuffer); + break; + } + + // Clear the dirty area + qp_flush(&driver->oled.surface); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Driver vtable +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const oled_panel_painter_driver_vtable_t sh1107_driver_vtable = { + .base = + { + .init = qp_sh1107_init, + .power = qp_oled_panel_power, + .clear = qp_oled_panel_clear, + .flush = qp_sh1107_flush, + .pixdata = qp_oled_panel_passthru_pixdata, + .viewport = qp_oled_panel_passthru_viewport, + .palette_convert = qp_oled_panel_passthru_palette_convert, + .append_pixels = qp_oled_panel_passthru_append_pixels, + .append_pixdata = qp_oled_panel_passthru_append_pixdata, + }, + .opcodes = + { + .display_on = SH1107_DISPLAY_ON, + .display_off = SH1107_DISPLAY_OFF, + .set_page = SH1107_PAGE_ADDR, + .set_column_lsb = SH1107_SETCOLUMN_LSB, + .set_column_msb = SH1107_SETCOLUMN_MSB, + }, +}; + +#ifdef QUANTUM_PAINTER_SH1107_SPI_ENABLE +// Factory function for creating a handle to the SH1107 device +painter_device_t qp_sh1107_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode) { + for (uint32_t i = 0; i < SH1107_NUM_DEVICES; ++i) { + sh1107_device_t *driver = &sh1107_drivers[i]; + if (!driver->oled.base.driver_vtable) { + painter_device_t surface = qp_make_mono1bpp_surface_advanced(&driver->oled.surface, 1, panel_width, panel_height, driver->framebuffer); + if (!surface) { + return NULL; + } + + // Setup the OLED device + driver->oled.base.driver_vtable = (const painter_driver_vtable_t *)&sh1107_driver_vtable; + driver->oled.base.comms_vtable = (const painter_comms_vtable_t *)&spi_comms_with_dc_vtable; + driver->oled.base.native_bits_per_pixel = 1; // 1bpp mono + driver->oled.base.panel_width = panel_width; + driver->oled.base.panel_height = panel_height; + driver->oled.base.rotation = QP_ROTATION_0; + driver->oled.base.offset_x = 0; + driver->oled.base.offset_y = 0; + + // SPI and other pin configuration + driver->oled.base.comms_config = &driver->oled.spi_dc_reset_config; + driver->oled.spi_dc_reset_config.spi_config.chip_select_pin = chip_select_pin; + driver->oled.spi_dc_reset_config.spi_config.divisor = spi_divisor; + driver->oled.spi_dc_reset_config.spi_config.lsb_first = false; + driver->oled.spi_dc_reset_config.spi_config.mode = spi_mode; + driver->oled.spi_dc_reset_config.dc_pin = dc_pin; + driver->oled.spi_dc_reset_config.reset_pin = reset_pin; + driver->oled.spi_dc_reset_config.command_params_uses_command_pin = true; + + if (!qp_internal_register_device((painter_device_t)driver)) { + memset(driver, 0, sizeof(sh1107_device_t)); + return NULL; + } + + return (painter_device_t)driver; + } + } + return NULL; +} + +#endif // QUANTUM_PAINTER_SH1107_SPI_ENABLE + +#ifdef QUANTUM_PAINTER_SH1107_I2C_ENABLE +// Factory function for creating a handle to the SH1107 device +painter_device_t qp_sh1107_make_i2c_device(uint16_t panel_width, uint16_t panel_height, uint8_t i2c_address) { + for (uint32_t i = 0; i < SH1107_NUM_DEVICES; ++i) { + sh1107_device_t *driver = &sh1107_drivers[i]; + if (!driver->oled.base.driver_vtable) { + // Instantiate the surface + painter_device_t surface = qp_make_mono1bpp_surface_advanced(&driver->oled.surface, 1, panel_width, panel_height, driver->framebuffer); + if (!surface) { + return NULL; + } + + // Setup the OLED device + driver->oled.base.driver_vtable = (const painter_driver_vtable_t *)&sh1107_driver_vtable; + driver->oled.base.comms_vtable = (const painter_comms_vtable_t *)&i2c_comms_cmddata_vtable; + driver->oled.base.native_bits_per_pixel = 1; // 1bpp mono + driver->oled.base.panel_width = panel_width; + driver->oled.base.panel_height = panel_height; + driver->oled.base.rotation = QP_ROTATION_0; + driver->oled.base.offset_x = 0; + driver->oled.base.offset_y = 0; + + // I2C configuration + driver->oled.base.comms_config = &driver->oled.i2c_config; + driver->oled.i2c_config.chip_address = i2c_address; + + if (!qp_internal_register_device((painter_device_t)driver)) { + memset(driver, 0, sizeof(sh1107_device_t)); + return NULL; + } + + return (painter_device_t)driver; + } + } + return NULL; +} + +#endif // QUANTUM_PAINTER_SH1107_I2C_ENABLE diff --git a/drivers/painter/sh1107/qp_sh1107.h b/drivers/painter/sh1107/qp_sh1107.h new file mode 100644 index 0000000000..2b866d7dc8 --- /dev/null +++ b/drivers/painter/sh1107/qp_sh1107.h @@ -0,0 +1,64 @@ +#pragma once + +#include "gpio.h" +#include "qp_internal.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantum Painter SH1107 configurables (add to your keyboard's config.h) + +#if defined(QUANTUM_PAINTER_SH1107_SPI_ENABLE) && !defined(SH1107_NUM_SPI_DEVICES) +/** + * @def This controls the maximum number of SPI SH1107 devices that Quantum Painter can communicate with at any one time. + * Increasing this number allows for multiple displays to be used. + */ +# define SH1107_NUM_SPI_DEVICES 1 +#else +# define SH1107_NUM_SPI_DEVICES 0 +#endif + +#if defined(QUANTUM_PAINTER_SH1107_I2C_ENABLE) && !defined(SH1107_NUM_I2C_DEVICES) +/** + * @def This controls the maximum number of I2C SH1107 devices that Quantum Painter can communicate with at any one time. + * Increasing this number allows for multiple displays to be used. + */ +# define SH1107_NUM_I2C_DEVICES 1 +#else +# define SH1107_NUM_I2C_DEVICES 0 +#endif + +#define SH1107_NUM_DEVICES ((SH1107_NUM_SPI_DEVICES) + (SH1107_NUM_I2C_DEVICES)) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantum Painter SH1107 device factories + +#ifdef QUANTUM_PAINTER_SH1107_SPI_ENABLE + +/** + * Factory method for an SH1107 SPI LCD device. + * + * @param panel_width[in] the width of the display in pixels (usually 64) + * @param panel_height[in] the height of the display in pixels (usually 128) + * @param chip_select_pin[in] the GPIO pin used for SPI chip select + * @param dc_pin[in] the GPIO pin used for D/C control + * @param reset_pin[in] the GPIO pin used for RST + * @param spi_divisor[in] the SPI divisor to use when communicating with the display + * @param spi_mode[in] the SPI mode to use when communicating with the display + * @return the device handle used with all drawing routines in Quantum Painter + */ +painter_device_t qp_sh1107_make_spi_device(uint16_t panel_width, uint16_t panel_height, pin_t chip_select_pin, pin_t dc_pin, pin_t reset_pin, uint16_t spi_divisor, int spi_mode); + +#endif // QUANTUM_PAINTER_SH1107_SPI_ENABLE + +#ifdef QUANTUM_PAINTER_SH1107_I2C_ENABLE + +/** + * Factory method for an SH1107 I2C LCD device. + * + * @param panel_width[in] the width of the display in pixels (usually 64) + * @param panel_height[in] the height of the display in pixels (usually 128) + * @param i2c_address[in] the I2C address to use + * @return the device handle used with all drawing routines in Quantum Painter + */ +painter_device_t qp_sh1107_make_i2c_device(uint16_t panel_width, uint16_t panel_height, uint8_t i2c_address); + +#endif // QUANTUM_PAINTER_SH1107_I2C_ENABLE diff --git a/drivers/painter/sh1107/qp_sh1107_opcodes.h b/drivers/painter/sh1107/qp_sh1107_opcodes.h new file mode 100644 index 0000000000..818bf40928 --- /dev/null +++ b/drivers/painter/sh1107/qp_sh1107_opcodes.h @@ -0,0 +1,25 @@ +// Copyright 2024 Steve Branam (@smbranam) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define SH1107_DISPLAY_ON 0xAF +#define SH1107_DISPLAY_OFF 0xAE +#define SH1107_SET_OSC_DIVFREQ 0xD5 +#define SH1107_SET_MUX_RATIO 0xA8 +#define SH1107_DISPLAY_OFFSET 0xD3 +#define SH1107_SET_START_LINE 0xDC // Key/sole difference from SH1106 (which uses 0x40) +#define SH1107_SET_CHARGE_PUMP 0x8D +#define SH1107_SET_SEGMENT_REMAP_NORMAL 0xA0 +#define SH1107_SET_SEGMENT_REMAP_INV 0xA1 +#define SH1107_COM_SCAN_DIR_INC 0xC0 +#define SH1107_COM_SCAN_DIR_DEC 0xC8 +#define SH1107_COM_PADS_HW_CFG 0xDA +#define SH1107_SET_CONTRAST 0x81 +#define SH1107_SET_PRECHARGE_PERIOD 0xD9 +#define SH1107_VCOM_DESELECT_LEVEL 0xDB +#define SH1107_ALL_ON_RESUME 0xA4 +#define SH1107_NON_INVERTING_DISPLAY 0xA6 +#define SH1107_DEACTIVATE_SCROLL 0x2E +#define SH1107_SETCOLUMN_LSB 0x00 +#define SH1107_SETCOLUMN_MSB 0x10 +#define SH1107_PAGE_ADDR 0xB0 diff --git a/quantum/painter/qp.h b/quantum/painter/qp.h index 3dc77b42cf..f7fdb02789 100644 --- a/quantum/painter/qp.h +++ b/quantum/painter/qp.h @@ -557,6 +557,12 @@ int16_t qp_drawtext_recolor(painter_device_t device, uint16_t x, uint16_t y, pai # define SH1106_NUM_DEVICES 0 #endif // QUANTUM_PAINTER_SH1106_ENABLE +#ifdef QUANTUM_PAINTER_SH1107_ENABLE +# include "qp_sh1107.h" +#else // QUANTUM_PAINTER_SH1107_ENABLE +# define SH1107_NUM_DEVICES 0 +#endif // QUANTUM_PAINTER_SH1107_ENABLE + #ifdef QUANTUM_PAINTER_LD7032_ENABLE # include "qp_ld7032.h" #else // QUANTUM_PAINTER_LD7032_ENABLE diff --git a/quantum/painter/qp_internal.c b/quantum/painter/qp_internal.c index 5097edfa07..24b881bd09 100644 --- a/quantum/painter/qp_internal.c +++ b/quantum/painter/qp_internal.c @@ -19,6 +19,7 @@ enum { + (GC9107_NUM_DEVICES) // GC9107 + (SSD1351_NUM_DEVICES) // SSD1351 + (SH1106_NUM_DEVICES) // SH1106 + + (SH1107_NUM_DEVICES) // SH1107 + (LD7032_NUM_DEVICES) // LD7032 }; diff --git a/quantum/painter/rules.mk b/quantum/painter/rules.mk index b773dd091c..10c2698092 100644 --- a/quantum/painter/rules.mk +++ b/quantum/painter/rules.mk @@ -18,6 +18,8 @@ VALID_QUANTUM_PAINTER_DRIVERS := \ ssd1351_spi \ sh1106_i2c \ sh1106_spi \ + sh1107_i2c \ + sh1107_spi \ ld7032_i2c \ ld7032_spi @@ -184,6 +186,29 @@ define handle_quantum_painter_driver $(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \ $(DRIVER_PATH)/painter/sh1106/qp_sh1106.c + else ifeq ($$(strip $$(CURRENT_PAINTER_DRIVER)),sh1107_spi) + QUANTUM_PAINTER_NEEDS_SURFACE := yes + QUANTUM_PAINTER_NEEDS_COMMS_SPI := yes + QUANTUM_PAINTER_NEEDS_COMMS_SPI_DC_RESET := yes + OPT_DEFS += -DQUANTUM_PAINTER_SH1107_ENABLE -DQUANTUM_PAINTER_SH1107_SPI_ENABLE + COMMON_VPATH += \ + $(DRIVER_PATH)/painter/oled_panel \ + $(DRIVER_PATH)/painter/sh1107 + SRC += \ + $(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \ + $(DRIVER_PATH)/painter/sh1107/qp_sh1107.c + + else ifeq ($$(strip $$(CURRENT_PAINTER_DRIVER)),sh1107_i2c) + QUANTUM_PAINTER_NEEDS_SURFACE := yes + QUANTUM_PAINTER_NEEDS_COMMS_I2C := yes + OPT_DEFS += -DQUANTUM_PAINTER_SH1107_ENABLE -DQUANTUM_PAINTER_SH1107_I2C_ENABLE + COMMON_VPATH += \ + $(DRIVER_PATH)/painter/oled_panel \ + $(DRIVER_PATH)/painter/sh1107 + SRC += \ + $(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \ + $(DRIVER_PATH)/painter/sh1107/qp_sh1107.c + else ifeq ($$(strip $$(CURRENT_PAINTER_DRIVER)),ld7032_spi) QUANTUM_PAINTER_NEEDS_SURFACE := yes QUANTUM_PAINTER_NEEDS_COMMS_SPI := yes From a5c77b5c45d377a01e25d9d479b7e245f2159cba Mon Sep 17 00:00:00 2001 From: Juno Nguyen Date: Wed, 19 Feb 2025 00:04:57 +0800 Subject: [PATCH 184/592] Fix startup sound for Planck (#24893) --- keyboards/planck/config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/planck/config.h b/keyboards/planck/config.h index 469d237b86..d7d071ad82 100644 --- a/keyboards/planck/config.h +++ b/keyboards/planck/config.h @@ -20,6 +20,8 @@ along with this program. If not, see . #define AUDIO_VOICES #define AUDIO_PIN C6 +#define AUDIO_INIT_DELAY + /* * Feature disable options * These options are also useful to firmware size reduction. From 6d0e5728aa61b442885d48caf49d29e5c60e8197 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:07:18 +0000 Subject: [PATCH 185/592] Bump JamesIves/github-pages-deploy-action from 4.7.2 to 4.7.3 (#24933) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.2 to 4.7.3. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.2...v4.7.3) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index edce1a6e5c..34319675bf 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,7 +56,7 @@ jobs: - name: Deploy if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }} - uses: JamesIves/github-pages-deploy-action@v4.7.2 + uses: JamesIves/github-pages-deploy-action@v4.7.3 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages From 50967dbe7e5137f74365b9989e10f03e94d92926 Mon Sep 17 00:00:00 2001 From: ploopyco <54917504+ploopyco@users.noreply.github.com> Date: Fri, 21 Feb 2025 03:01:29 -0500 Subject: [PATCH 186/592] Updates to Ploopy Classic, Mouse, and Thumb for RP2040 hardware upgrade (#24880) Co-authored-by: Drashna Jaelre --- keyboards/ploopyco/mouse/config.h | 11 ------- .../mouse/{keyboard.json => info.json} | 27 +++------------ keyboards/ploopyco/mouse/post_rules.mk | 1 + keyboards/ploopyco/mouse/readme.md | 6 ++-- keyboards/ploopyco/mouse/rev1_002/config.h | 33 +++++++++++++++++++ .../ploopyco/mouse/rev1_002/keyboard.json | 21 ++++++++++++ keyboards/ploopyco/mouse/rev1_002/readme.md | 3 ++ .../ploopyco/mouse/{ => rev1_002}/rules.mk | 2 -- keyboards/ploopyco/mouse/rev1_003/config.h | 32 ++++++++++++++++++ .../ploopyco/mouse/rev1_003/keyboard.json | 25 ++++++++++++++ keyboards/ploopyco/mouse/rev1_003/readme.md | 3 ++ keyboards/ploopyco/trackball/config.h | 11 +------ keyboards/ploopyco/trackball/info.json | 5 ++- keyboards/ploopyco/trackball/post_rules.mk | 1 + keyboards/ploopyco/trackball/readme.md | 25 +++++++++----- .../trackball/{rev1 => rev1_004}/config.h | 6 ++++ .../{rev1 => rev1_004}/keyboard.json | 0 .../trackball/{rev1 => rev1_004}/readme.md | 0 .../ploopyco/trackball/rev1_004/rules.mk | 2 ++ .../ploopyco/trackball/rev1_005/config.h | 9 +++++ .../ploopyco/trackball/rev1_005/readme.md | 4 +-- .../ploopyco/trackball/rev1_005/rules.mk | 2 ++ .../ploopyco/trackball/rev1_007/config.h | 32 ++++++++++++++++++ .../ploopyco/trackball/rev1_007/keyboard.json | 25 ++++++++++++++ .../ploopyco/trackball/rev1_007/readme.md | 3 ++ keyboards/ploopyco/trackball/rules.mk | 6 ---- keyboards/ploopyco/trackball_thumb/config.h | 6 ---- keyboards/ploopyco/trackball_thumb/info.json | 14 ++++---- .../ploopyco/trackball_thumb/post_rules.mk | 1 + keyboards/ploopyco/trackball_thumb/readme.md | 4 +-- .../trackball_thumb/rev1_001/config.h | 6 ++++ .../trackball_thumb/rev1_001/keyboard.json | 12 +++---- .../trackball_thumb/rev1_001/readme.md | 4 +-- .../trackball_thumb/rev1_001/rules.mk | 2 ++ .../trackball_thumb/rev1_002/config.h | 32 ++++++++++++++++++ .../trackball_thumb/rev1_002/keyboard.json | 25 ++++++++++++++ .../trackball_thumb/rev1_002/readme.md | 3 ++ keyboards/ploopyco/trackball_thumb/rules.mk | 6 ---- 38 files changed, 311 insertions(+), 99 deletions(-) rename keyboards/ploopyco/mouse/{keyboard.json => info.json} (69%) create mode 100644 keyboards/ploopyco/mouse/post_rules.mk create mode 100644 keyboards/ploopyco/mouse/rev1_002/config.h create mode 100644 keyboards/ploopyco/mouse/rev1_002/keyboard.json create mode 100644 keyboards/ploopyco/mouse/rev1_002/readme.md rename keyboards/ploopyco/mouse/{ => rev1_002}/rules.mk (52%) create mode 100644 keyboards/ploopyco/mouse/rev1_003/config.h create mode 100644 keyboards/ploopyco/mouse/rev1_003/keyboard.json create mode 100644 keyboards/ploopyco/mouse/rev1_003/readme.md create mode 100644 keyboards/ploopyco/trackball/post_rules.mk rename keyboards/ploopyco/trackball/{rev1 => rev1_004}/config.h (90%) rename keyboards/ploopyco/trackball/{rev1 => rev1_004}/keyboard.json (100%) rename keyboards/ploopyco/trackball/{rev1 => rev1_004}/readme.md (100%) create mode 100644 keyboards/ploopyco/trackball/rev1_004/rules.mk create mode 100644 keyboards/ploopyco/trackball/rev1_005/rules.mk create mode 100644 keyboards/ploopyco/trackball/rev1_007/config.h create mode 100644 keyboards/ploopyco/trackball/rev1_007/keyboard.json create mode 100644 keyboards/ploopyco/trackball/rev1_007/readme.md delete mode 100644 keyboards/ploopyco/trackball/rules.mk create mode 100644 keyboards/ploopyco/trackball_thumb/post_rules.mk create mode 100644 keyboards/ploopyco/trackball_thumb/rev1_001/rules.mk create mode 100644 keyboards/ploopyco/trackball_thumb/rev1_002/config.h create mode 100644 keyboards/ploopyco/trackball_thumb/rev1_002/keyboard.json create mode 100644 keyboards/ploopyco/trackball_thumb/rev1_002/readme.md delete mode 100644 keyboards/ploopyco/trackball_thumb/rules.mk diff --git a/keyboards/ploopyco/mouse/config.h b/keyboards/ploopyco/mouse/config.h index 0f8774dcd7..0645283880 100644 --- a/keyboards/ploopyco/mouse/config.h +++ b/keyboards/ploopyco/mouse/config.h @@ -18,11 +18,6 @@ #pragma once -// These pins are not broken out, and cannot be used normally. -// They are set as output and pulled high, by default -#define UNUSABLE_PINS \ - { B4, D6, F1, F5, F6, F7 } - /* disable action features */ //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING @@ -30,13 +25,7 @@ // #define DEBUG_LED_PIN F7 -/* PMW33XX Settings */ -#define PMW33XX_CS_PIN B0 - #define ENCODER_BUTTON_COL 1 #define ENCODER_BUTTON_ROW 0 /* Custom encoder needs to specify just how many encoders we have */ #define NUM_ENCODERS 1 - -#define ENCODER_A_PINS { F0 } -#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/mouse/keyboard.json b/keyboards/ploopyco/mouse/info.json similarity index 69% rename from keyboards/ploopyco/mouse/keyboard.json rename to keyboards/ploopyco/mouse/info.json index 4c81ee7338..1a70989f25 100644 --- a/keyboards/ploopyco/mouse/keyboard.json +++ b/keyboards/ploopyco/mouse/info.json @@ -1,6 +1,6 @@ { "keyboard_name": "Mouse", - "manufacturer": "PloopyCo", + "manufacturer": "Ploopy", "url": "www.ploopy.co", "maintainer": "drashna", "usb": { @@ -9,6 +9,9 @@ "device_version": "0.0.1", "max_power": 100 }, + "bootmagic": { + "matrix": [0, 3] + }, "features": { "bootmagic": true, "extrakey": true, @@ -17,28 +20,6 @@ "pointing_device": true, "encoder": true }, - "bootmagic": { - "matrix": [0, 3] - }, - "ws2812": { - "pin": "B5" - }, - "rgblight": { - "led_count": 4, - "max_brightness": 40, - "animations": { - "breathing": true, - "rainbow_mood": true, - "rainbow_swirl": true - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu", - "matrix_pins": { - "direct": [ - ["D4", "D2", "E6", "B6", "D7", "C6", "C7", "B7"] - ] - }, "encoder": { "driver": "custom" }, diff --git a/keyboards/ploopyco/mouse/post_rules.mk b/keyboards/ploopyco/mouse/post_rules.mk new file mode 100644 index 0000000000..0d1a00b89e --- /dev/null +++ b/keyboards/ploopyco/mouse/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 \ No newline at end of file diff --git a/keyboards/ploopyco/mouse/readme.md b/keyboards/ploopyco/mouse/readme.md index 060448c2bf..c5c6bb7dce 100644 --- a/keyboards/ploopyco/mouse/readme.md +++ b/keyboards/ploopyco/mouse/readme.md @@ -6,14 +6,14 @@ It's a DIY, QMK Powered Mouse!!!! * Keyboard Maintainer: [PloopyCo](https://github.com/ploopyco), [Drashna Jael're](https://github.com/drashna/), [Germ](https://github.com/germ/) -* Hardware Supported: ATMega32u4 8MHz(3.3v) +* Hardware Supported: ATMega32u4 8MHz(3.3v), Raspberry RP2040 * Hardware Availability: [Store](https://ploopy.co), [GitHub](https://github.com/ploopyco) Make example for this keyboard (after setting up your build environment): make ploopyco/mouse:default:flash - -To jump to the bootloader, hold down "Button 4" (the "forward" button on the left side) + +To jump to the bootloader, hold down "Button 4" (the "forward" button on the left side) 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). diff --git a/keyboards/ploopyco/mouse/rev1_002/config.h b/keyboards/ploopyco/mouse/rev1_002/config.h new file mode 100644 index 0000000000..49b53bc8dd --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_002/config.h @@ -0,0 +1,33 @@ +/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) + * Copyright 2019 Sunjun Kim + * Copyright 2020 Ploopy Corporation + * + * 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 + +// These pins are not broken out, and cannot be used normally. +// They are set as output and pulled high, by default +#define UNUSABLE_PINS \ + { B4, D6, F1, F5, F6, F7 } + +// If board has a debug LED, you can enable it by defining this +// #define DEBUG_LED_PIN F7 + +/* PMW33XX Settings */ +#define PMW33XX_CS_PIN B0 + +#define ENCODER_A_PINS { F0 } +#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/mouse/rev1_002/keyboard.json b/keyboards/ploopyco/mouse/rev1_002/keyboard.json new file mode 100644 index 0000000000..bfed3232f0 --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_002/keyboard.json @@ -0,0 +1,21 @@ +{ + "processor": "atmega32u4", + "bootloader": "atmel-dfu", + "matrix_pins": { + "direct": [ + ["D4", "D2", "E6", "B6", "D7", "C6", "C7", "B7"] + ] + }, + "ws2812": { + "pin": "B5" + }, + "rgblight": { + "led_count": 3, + "max_brightness": 40, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true + } + } +} diff --git a/keyboards/ploopyco/mouse/rev1_002/readme.md b/keyboards/ploopyco/mouse/rev1_002/readme.md new file mode 100644 index 0000000000..a9400ea100 --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_002/readme.md @@ -0,0 +1,3 @@ +See the [main readme](../readme.md) for more details. + +This is for the R1.002 version of the Mouse. It's easily distinguishable from the R1.003+ versions of the Mouse because it has an ATmega32u4 on the board. diff --git a/keyboards/ploopyco/mouse/rules.mk b/keyboards/ploopyco/mouse/rev1_002/rules.mk similarity index 52% rename from keyboards/ploopyco/mouse/rules.mk rename to keyboards/ploopyco/mouse/rev1_002/rules.mk index 3d1d3fc961..3437a35bdf 100644 --- a/keyboards/ploopyco/mouse/rules.mk +++ b/keyboards/ploopyco/mouse/rev1_002/rules.mk @@ -1,4 +1,2 @@ # Processor frequency F_CPU = 8000000 - -POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/ploopyco/mouse/rev1_003/config.h b/keyboards/ploopyco/mouse/rev1_003/config.h new file mode 100644 index 0000000000..b4291e307b --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_003/config.h @@ -0,0 +1,32 @@ +/* Copyright 2024 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) + * Copyright 2019 Sunjun Kim + * + * 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 UNUSABLE_PINS \ + { GP1, GP3, GP4, GP6, GP8, GP10, GP11, GP16, GP18, GP20, GP25, GP27, GP29 } + +/* PMW3360 Settings */ +#define PMW33XX_LIFTOFF_DISTANCE 0x00 +#define PMW33XX_CS_PIN GP5 +#define SPI_SCK_PIN GP2 +#define SPI_MISO_PIN GP0 +#define SPI_MOSI_PIN GP7 + +#define ENCODER_A_PINS { GP26 } +#define ENCODER_B_PINS { GP28 } diff --git a/keyboards/ploopyco/mouse/rev1_003/keyboard.json b/keyboards/ploopyco/mouse/rev1_003/keyboard.json new file mode 100644 index 0000000000..46eca8012f --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_003/keyboard.json @@ -0,0 +1,25 @@ +{ + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "device_version": "1.0.0" + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "direct": [ + ["GP15", "GP21", "GP23", "GP17", "GP19", "GP22", "GP14", "GP24"] + ] + }, + "rgblight": { + "led_count": 1, + "max_brightness": 40, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true + } + }, + "ws2812": { + "pin": "GP12" + } +} diff --git a/keyboards/ploopyco/mouse/rev1_003/readme.md b/keyboards/ploopyco/mouse/rev1_003/readme.md new file mode 100644 index 0000000000..3e402f4280 --- /dev/null +++ b/keyboards/ploopyco/mouse/rev1_003/readme.md @@ -0,0 +1,3 @@ +See the [main readme](../readme.md) for more details. + +This is for the R1.003+ version of the Mouse. It's easily distinguishable from the previous versions of the Mouse because it has an RP2040 on the board. diff --git a/keyboards/ploopyco/trackball/config.h b/keyboards/ploopyco/trackball/config.h index 2aac27437a..1a9b4ad225 100644 --- a/keyboards/ploopyco/trackball/config.h +++ b/keyboards/ploopyco/trackball/config.h @@ -23,20 +23,11 @@ //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT +/* PMW3360 settings */ #define ROTATIONAL_TRANSFORM_ANGLE 20 - -// If board has a debug LED, you can enable it by defining this -// #define DEBUG_LED_PIN F7 - -/* PMW33XX Settings */ -#define PMW33XX_CS_PIN B0 #define POINTING_DEVICE_INVERT_Y - #define ENCODER_BUTTON_COL 1 #define ENCODER_BUTTON_ROW 0 /* Custom encoder needs to specify just how many encoders we have */ #define NUM_ENCODERS 1 - -#define ENCODER_A_PINS { F0 } -#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/trackball/info.json b/keyboards/ploopyco/trackball/info.json index 8014db1d63..9e3312d4bc 100644 --- a/keyboards/ploopyco/trackball/info.json +++ b/keyboards/ploopyco/trackball/info.json @@ -1,6 +1,6 @@ { - "keyboard_name": "Trackball", - "manufacturer": "PloopyCo", + "keyboard_name": "Classic Trackball", + "manufacturer": "Ploopy", "url": "www.ploopy.co", "maintainer": "drashna", "usb": { @@ -12,7 +12,6 @@ "bootmagic": { "matrix": [0, 3] }, - "features": { "bootmagic": true, "extrakey": true, diff --git a/keyboards/ploopyco/trackball/post_rules.mk b/keyboards/ploopyco/trackball/post_rules.mk new file mode 100644 index 0000000000..0d1a00b89e --- /dev/null +++ b/keyboards/ploopyco/trackball/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 \ No newline at end of file diff --git a/keyboards/ploopyco/trackball/readme.md b/keyboards/ploopyco/trackball/readme.md index c668c5dd03..cca2c15114 100644 --- a/keyboards/ploopyco/trackball/readme.md +++ b/keyboards/ploopyco/trackball/readme.md @@ -1,27 +1,34 @@ -# Ploopyco Trackball +# Ploopy Classic Trackball -![Ploopyco Trackball](https://i.redd.it/j7z0y83txps31.jpg) +![Ploopy Trackball](https://i.redd.it/j7z0y83txps31.jpg) It's a DIY, QMK Powered Trackball!!!! -* Keyboard Maintainer: [PloopyCo](https://github.com/ploopyco), [Drashna Jael're](https://github.com/drashna/), [Germ](https://github.com/germ/) -* Hardware Supported: ATMega32u4 8MHz(3.3v) +* Keyboard Maintainer: [Ploopy](https://github.com/ploopyco), [Drashna Jael're](https://github.com/drashna/), [Germ](https://github.com/germ/) +* Hardware Supported: ATMega32u4 8MHz(3.3v), Raspberry RP2040 * Hardware Availability: [Store](https://ploopy.co), [GitHub](https://github.com/ploopyco) Make example for this keyboard (after setting up your build environment): - make ploopyco/trackball/rev1:default:flash + make ploopyco/trackball/rev1_004:default:flash make ploopyco/trackball/rev1_005:default:flash - -To jump to the bootloader, hold down "Button 4" (immediate right of the trackball) + make ploopyco/trackball/rev1_007:default:flash + +To jump to the bootloader, hold down "Button 4" (immediate right of the trackball) 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). ## Revisions -There are two main revisions for the PloopyCo Trackball, everything up to 1.004, and 1.005-1.006. +There are three main revisions for the Ploopy Classic Trackball: -In the 1.005 revision, button for was changed from pin B5 to B6, and the debug LED pin was changed from F7 to B5. +- Everything up to 1.004 (very rare) +- Revision 1.005 and 1.006 (commonly sold between 2020 and 2024) +- Revision 1.007 (first available in 2025) + +In the 1.005 revision, button four was changed from pin B5 to B6, and the debug LED pin was changed from F7 to B5. + +In the 1.007 revision, the board was switched from an ATMega32u4 architecture to the Raspberry RP2040 architecture. The PCB should indicate which revision this is. diff --git a/keyboards/ploopyco/trackball/rev1/config.h b/keyboards/ploopyco/trackball/rev1_004/config.h similarity index 90% rename from keyboards/ploopyco/trackball/rev1/config.h rename to keyboards/ploopyco/trackball/rev1_004/config.h index 35ab215341..25bcf86391 100644 --- a/keyboards/ploopyco/trackball/rev1/config.h +++ b/keyboards/ploopyco/trackball/rev1_004/config.h @@ -25,3 +25,9 @@ // If board has a debug LED, you can enable it by defining this #define DEBUG_LED_PIN F7 + +/* PMW33XX Settings */ +#define PMW33XX_CS_PIN B0 + +#define ENCODER_A_PINS { F0 } +#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/trackball/rev1/keyboard.json b/keyboards/ploopyco/trackball/rev1_004/keyboard.json similarity index 100% rename from keyboards/ploopyco/trackball/rev1/keyboard.json rename to keyboards/ploopyco/trackball/rev1_004/keyboard.json diff --git a/keyboards/ploopyco/trackball/rev1/readme.md b/keyboards/ploopyco/trackball/rev1_004/readme.md similarity index 100% rename from keyboards/ploopyco/trackball/rev1/readme.md rename to keyboards/ploopyco/trackball/rev1_004/readme.md diff --git a/keyboards/ploopyco/trackball/rev1_004/rules.mk b/keyboards/ploopyco/trackball/rev1_004/rules.mk new file mode 100644 index 0000000000..3437a35bdf --- /dev/null +++ b/keyboards/ploopyco/trackball/rev1_004/rules.mk @@ -0,0 +1,2 @@ +# Processor frequency +F_CPU = 8000000 diff --git a/keyboards/ploopyco/trackball/rev1_005/config.h b/keyboards/ploopyco/trackball/rev1_005/config.h index 014d67f9c1..404caca093 100644 --- a/keyboards/ploopyco/trackball/rev1_005/config.h +++ b/keyboards/ploopyco/trackball/rev1_005/config.h @@ -22,3 +22,12 @@ // They are set as output and pulled high, by default #define UNUSABLE_PINS \ { D1, D3, B4, B7, D6, C7, F6, F5, F3, F7 } + +// If board has a debug LED, you can enable it by defining this +// #define DEBUG_LED_PIN F7 + +/* PMW33XX Settings */ +#define PMW33XX_CS_PIN B0 + +#define ENCODER_A_PINS { F0 } +#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/trackball/rev1_005/readme.md b/keyboards/ploopyco/trackball/rev1_005/readme.md index a923d16591..980f118a10 100644 --- a/keyboards/ploopyco/trackball/rev1_005/readme.md +++ b/keyboards/ploopyco/trackball/rev1_005/readme.md @@ -1,3 +1,3 @@ -See the [main readme](../readme.md) for more details. +See the [main readme](../readme.md) for more details. -This is just the rev 1.005+ trackball +This is for the R1.005-R1.006 version of the Classic. It's easily distinguishable from the R1.007+ versions of the Classic because it has an ATmega32u4 on the board. \ No newline at end of file diff --git a/keyboards/ploopyco/trackball/rev1_005/rules.mk b/keyboards/ploopyco/trackball/rev1_005/rules.mk new file mode 100644 index 0000000000..3437a35bdf --- /dev/null +++ b/keyboards/ploopyco/trackball/rev1_005/rules.mk @@ -0,0 +1,2 @@ +# Processor frequency +F_CPU = 8000000 diff --git a/keyboards/ploopyco/trackball/rev1_007/config.h b/keyboards/ploopyco/trackball/rev1_007/config.h new file mode 100644 index 0000000000..97f2e46b5c --- /dev/null +++ b/keyboards/ploopyco/trackball/rev1_007/config.h @@ -0,0 +1,32 @@ +/* Copyright 2024 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) + * Copyright 2019 Sunjun Kim + * + * 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 UNUSABLE_PINS \ + { GP1, GP3, GP4, GP6, GP8, GP10, GP11, GP14, GP16, GP18, GP20, GP22, GP24, GP25, GP27, GP29 } + +/* PMW3360 Settings */ +#define PMW33XX_LIFTOFF_DISTANCE 0x00 +#define PMW33XX_CS_PIN GP5 +#define SPI_SCK_PIN GP2 +#define SPI_MISO_PIN GP0 +#define SPI_MOSI_PIN GP7 + +#define ENCODER_A_PINS { GP26 } +#define ENCODER_B_PINS { GP28 } diff --git a/keyboards/ploopyco/trackball/rev1_007/keyboard.json b/keyboards/ploopyco/trackball/rev1_007/keyboard.json new file mode 100644 index 0000000000..4098c86fda --- /dev/null +++ b/keyboards/ploopyco/trackball/rev1_007/keyboard.json @@ -0,0 +1,25 @@ +{ + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "device_version": "1.0.0" + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "direct": [ + ["GP15", "GP21", "GP23", "GP17", "GP19"] + ] + }, + "rgblight": { + "led_count": 1, + "max_brightness": 40, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true + } + }, + "ws2812": { + "pin": "GP12" + } +} diff --git a/keyboards/ploopyco/trackball/rev1_007/readme.md b/keyboards/ploopyco/trackball/rev1_007/readme.md new file mode 100644 index 0000000000..6b8da3a959 --- /dev/null +++ b/keyboards/ploopyco/trackball/rev1_007/readme.md @@ -0,0 +1,3 @@ +See the [main readme](../readme.md) for more details. + +This is for the R1.007+ version of the Classic. It's easily distinguishable from the previous versions of the Classic because it has an RP2040 on the board. diff --git a/keyboards/ploopyco/trackball/rules.mk b/keyboards/ploopyco/trackball/rules.mk deleted file mode 100644 index 9ea10ba6e8..0000000000 --- a/keyboards/ploopyco/trackball/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -# Processor frequency -F_CPU = 8000000 - -POINTING_DEVICE_DRIVER = pmw3360 - -DEFAULT_FOLDER = ploopyco/trackball/rev1_005 diff --git a/keyboards/ploopyco/trackball_thumb/config.h b/keyboards/ploopyco/trackball_thumb/config.h index f03ffc7699..0f269bd21a 100644 --- a/keyboards/ploopyco/trackball_thumb/config.h +++ b/keyboards/ploopyco/trackball_thumb/config.h @@ -29,9 +29,6 @@ // If board has a debug LED, you can enable it by defining this // #define DEBUG_LED_PIN F7 -/* PMW3360 Settings */ -#define POINTING_DEVICE_CS_PIN B0 - #define ENCODER_BUTTON_COL 1 #define ENCODER_BUTTON_ROW 0 @@ -41,6 +38,3 @@ #define ENCODER_HIGH_THRES_B 90 /* Custom encoder needs to specify just how many encoders we have */ #define NUM_ENCODERS 1 - -#define ENCODER_A_PINS { F4 } -#define ENCODER_B_PINS { F0 } diff --git a/keyboards/ploopyco/trackball_thumb/info.json b/keyboards/ploopyco/trackball_thumb/info.json index e27bf47252..7e93296d24 100644 --- a/keyboards/ploopyco/trackball_thumb/info.json +++ b/keyboards/ploopyco/trackball_thumb/info.json @@ -1,22 +1,22 @@ { - "keyboard_name": "PloopyCo Thumb Trackball", + "keyboard_name": "Thumb Trackball", + "manufacturer": "Ploopy", "url": "www.ploopy.co", "maintainer": "ploopyco", - "manufacturer": "Ploopy Corporation", - "processor": "atmega32u4", - "bootloader": "atmel-dfu", "usb": { "vid": "0x5043", "pid": "0x5C46", + "device_version": "0.0.1", "max_power": 100 }, + "bootmagic": { + "matrix": [0, 3] + }, "features": { "bootmagic": true, - "command": false, - "console": false, "extrakey": true, "mousekey": true, - "nkro": true, + "nkro": false, "pointing_device": true, "encoder": true }, diff --git a/keyboards/ploopyco/trackball_thumb/post_rules.mk b/keyboards/ploopyco/trackball_thumb/post_rules.mk new file mode 100644 index 0000000000..0d1a00b89e --- /dev/null +++ b/keyboards/ploopyco/trackball_thumb/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 \ No newline at end of file diff --git a/keyboards/ploopyco/trackball_thumb/readme.md b/keyboards/ploopyco/trackball_thumb/readme.md index 8299c08809..bb870d2003 100644 --- a/keyboards/ploopyco/trackball_thumb/readme.md +++ b/keyboards/ploopyco/trackball_thumb/readme.md @@ -3,13 +3,13 @@ It's a DIY, QMK Powered Trackball...for thumb ballers! * Keyboard Maintainer: [PloopyCo](https://github.com/ploopyco), [Drashna Jael're](https://github.com/drashna/), [Germ](https://github.com/germ/) -* Hardware Supported: ATMega32u4 8MHz(3.3v) +* Hardware Supported: ATMega32u4 8MHz(3.3v), Raspberry RP2040 * Hardware Availability: [Store](https://ploopy.co), [GitHub](https://github.com/ploopyco) Make example for this keyboard (after setting up your build environment): make ploopyco/trackball_thumb/rev1_001:default:flash - + To jump to the bootloader, hold down "Button 4" (button closest to the USB port). 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). diff --git a/keyboards/ploopyco/trackball_thumb/rev1_001/config.h b/keyboards/ploopyco/trackball_thumb/rev1_001/config.h index a648e8e8e4..108a104cdc 100644 --- a/keyboards/ploopyco/trackball_thumb/rev1_001/config.h +++ b/keyboards/ploopyco/trackball_thumb/rev1_001/config.h @@ -22,3 +22,9 @@ // They are set as output and pulled high, by default #define UNUSABLE_PINS \ { D1, D3, B4, B7, D6, C7, F6, F5, F3, F7 } + +/* PMW33XX Settings */ +#define PMW33XX_CS_PIN B0 + +#define ENCODER_A_PINS { F0 } +#define ENCODER_B_PINS { F4 } diff --git a/keyboards/ploopyco/trackball_thumb/rev1_001/keyboard.json b/keyboards/ploopyco/trackball_thumb/rev1_001/keyboard.json index db12ee6217..04457f19b9 100644 --- a/keyboards/ploopyco/trackball_thumb/rev1_001/keyboard.json +++ b/keyboards/ploopyco/trackball_thumb/rev1_001/keyboard.json @@ -1,13 +1,14 @@ { - "usb": { - "device_version": "1.0.0" - }, - "diode_direction": "COL2ROW", + "processor": "atmega32u4", + "bootloader": "atmel-dfu", "matrix_pins": { "direct": [ ["D5", "B6", "D4", "D2", "E6", "D7"] ] }, + "ws2812": { + "pin": "B5" + }, "rgblight": { "led_count": 3, "max_brightness": 40, @@ -16,8 +17,5 @@ "rainbow_mood": true, "rainbow_swirl": true } - }, - "ws2812": { - "pin": "B5" } } diff --git a/keyboards/ploopyco/trackball_thumb/rev1_001/readme.md b/keyboards/ploopyco/trackball_thumb/rev1_001/readme.md index 5a5f0563e7..658a71df0a 100644 --- a/keyboards/ploopyco/trackball_thumb/rev1_001/readme.md +++ b/keyboards/ploopyco/trackball_thumb/rev1_001/readme.md @@ -1,3 +1,3 @@ -This is the R1.001+ version of the Thumb. Future versions may have other features. +See the [main readme](../readme.md) for more details. -See the [main readme](../readme.md) for more details. +This is for the R1.001 version of the Thumb. It's easily distinguishable from the R1.002+ versions of the Thumb because it has an ATmega32u4 on the board. \ No newline at end of file diff --git a/keyboards/ploopyco/trackball_thumb/rev1_001/rules.mk b/keyboards/ploopyco/trackball_thumb/rev1_001/rules.mk new file mode 100644 index 0000000000..3437a35bdf --- /dev/null +++ b/keyboards/ploopyco/trackball_thumb/rev1_001/rules.mk @@ -0,0 +1,2 @@ +# Processor frequency +F_CPU = 8000000 diff --git a/keyboards/ploopyco/trackball_thumb/rev1_002/config.h b/keyboards/ploopyco/trackball_thumb/rev1_002/config.h new file mode 100644 index 0000000000..e25f50604e --- /dev/null +++ b/keyboards/ploopyco/trackball_thumb/rev1_002/config.h @@ -0,0 +1,32 @@ +/* Copyright 2024 Colin Lam (Ploopy Corporation) + * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) + * Copyright 2019 Sunjun Kim + * + * 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 UNUSABLE_PINS \ + { GP1, GP3, GP4, GP6, GP8, GP10, GP11, GP14, GP18, GP20, GP22, GP24, GP25, GP27, GP29 } + +/* PMW3360 Settings */ +#define PMW33XX_LIFTOFF_DISTANCE 0x00 +#define PMW33XX_CS_PIN GP5 +#define SPI_SCK_PIN GP2 +#define SPI_MISO_PIN GP0 +#define SPI_MOSI_PIN GP7 + +#define ENCODER_A_PINS { GP28 } +#define ENCODER_B_PINS { GP26 } diff --git a/keyboards/ploopyco/trackball_thumb/rev1_002/keyboard.json b/keyboards/ploopyco/trackball_thumb/rev1_002/keyboard.json new file mode 100644 index 0000000000..a3a50a536e --- /dev/null +++ b/keyboards/ploopyco/trackball_thumb/rev1_002/keyboard.json @@ -0,0 +1,25 @@ +{ + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "device_version": "1.0.0" + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "direct": [ + ["GP17", "GP16", "GP15", "GP21", "GP23", "GP19"] + ] + }, + "rgblight": { + "led_count": 1, + "max_brightness": 40, + "animations": { + "breathing": true, + "rainbow_mood": true, + "rainbow_swirl": true + } + }, + "ws2812": { + "pin": "GP12" + } +} diff --git a/keyboards/ploopyco/trackball_thumb/rev1_002/readme.md b/keyboards/ploopyco/trackball_thumb/rev1_002/readme.md new file mode 100644 index 0000000000..c1e95d9a8e --- /dev/null +++ b/keyboards/ploopyco/trackball_thumb/rev1_002/readme.md @@ -0,0 +1,3 @@ +See the [main readme](../readme.md) for more details. + +This is for the R1.002+ version of the Thumb. It's easily distinguishable from the previous versions of the Thumb because it has an RP2040 on the board. diff --git a/keyboards/ploopyco/trackball_thumb/rules.mk b/keyboards/ploopyco/trackball_thumb/rules.mk deleted file mode 100644 index 0bd44d316a..0000000000 --- a/keyboards/ploopyco/trackball_thumb/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -# Processor frequency -F_CPU = 8000000 - -POINTING_DEVICE_DRIVER = pmw3360 - -DEFAULT_FOLDER = ploopyco/trackball_thumb/rev1_001 From 63daf94ee60a629afcce2de623f22ae6777682c5 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 22 Feb 2025 01:48:42 +0000 Subject: [PATCH 187/592] Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson (#24938) --- data/mappings/keyboard_aliases.hjson | 12 ++++++++++++ keyboards/ploopyco/madromys/post_rules.mk | 1 + keyboards/ploopyco/madromys/rules.mk | 3 --- keyboards/ploopyco/trackball_mini/post_rules.mk | 1 + keyboards/ploopyco/trackball_mini/rules.mk | 3 --- keyboards/ploopyco/trackball_nano/post_rules.mk | 1 + keyboards/ploopyco/trackball_nano/rules.mk | 3 --- 7 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 keyboards/ploopyco/madromys/post_rules.mk delete mode 100644 keyboards/ploopyco/madromys/rules.mk create mode 100644 keyboards/ploopyco/trackball_mini/post_rules.mk delete mode 100644 keyboards/ploopyco/trackball_mini/rules.mk create mode 100644 keyboards/ploopyco/trackball_nano/post_rules.mk delete mode 100644 keyboards/ploopyco/trackball_nano/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 09549baf69..b601a42761 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -2025,6 +2025,18 @@ "pinky": { "target": "pinky/3" }, + "ploopyco/madromys": { + "target": "ploopyco/madromys/rev1_001" + }, + "ploopyco/trackball_mini": { + "target": "ploopyco/trackball_mini/rev1_001" + }, + "ploopyco/trackball_nano": { + "target": "ploopyco/trackball_nano/rev1_001" + }, + "ploopyco/trackball_thumb": { + "target": "ploopyco/trackball_thumb/rev1_001" + }, "primekb/meridian": { "target": "primekb/meridian/ktr1010" }, diff --git a/keyboards/ploopyco/madromys/post_rules.mk b/keyboards/ploopyco/madromys/post_rules.mk new file mode 100644 index 0000000000..fab9162dc6 --- /dev/null +++ b/keyboards/ploopyco/madromys/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/ploopyco/madromys/rules.mk b/keyboards/ploopyco/madromys/rules.mk deleted file mode 100644 index b7e33d92f9..0000000000 --- a/keyboards/ploopyco/madromys/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -POINTING_DEVICE_DRIVER = pmw3360 - -DEFAULT_FOLDER = ploopyco/madromys/rev1_001 diff --git a/keyboards/ploopyco/trackball_mini/post_rules.mk b/keyboards/ploopyco/trackball_mini/post_rules.mk new file mode 100644 index 0000000000..99fca15fc1 --- /dev/null +++ b/keyboards/ploopyco/trackball_mini/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = adns5050 diff --git a/keyboards/ploopyco/trackball_mini/rules.mk b/keyboards/ploopyco/trackball_mini/rules.mk deleted file mode 100644 index 2705ac6855..0000000000 --- a/keyboards/ploopyco/trackball_mini/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -POINTING_DEVICE_DRIVER = adns5050 - -DEFAULT_FOLDER = ploopyco/trackball_mini/rev1_001 diff --git a/keyboards/ploopyco/trackball_nano/post_rules.mk b/keyboards/ploopyco/trackball_nano/post_rules.mk new file mode 100644 index 0000000000..99fca15fc1 --- /dev/null +++ b/keyboards/ploopyco/trackball_nano/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = adns5050 diff --git a/keyboards/ploopyco/trackball_nano/rules.mk b/keyboards/ploopyco/trackball_nano/rules.mk deleted file mode 100644 index df29dfbc07..0000000000 --- a/keyboards/ploopyco/trackball_nano/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -POINTING_DEVICE_DRIVER = adns5050 - -DEFAULT_FOLDER = ploopyco/trackball_nano/rev1_001 From 63b095212b157c4522bdeda3de144fb87213085d Mon Sep 17 00:00:00 2001 From: Joel Beckmeyer Date: Wed, 26 Feb 2025 06:25:01 -0500 Subject: [PATCH 188/592] fix EEPROM driver for STM32L0/1 cat.1 devices (#24928) --- .../drivers/eeprom/eeprom_stm32_L0_L1.c | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c b/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c index 628137a0b3..31062a4816 100644 --- a/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c +++ b/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c @@ -25,6 +25,7 @@ #define EEPROM_ADDR(offset) (EEPROM_BASE_ADDR + (offset)) #define EEPROM_PTR(offset) ((__IO uint8_t *)EEPROM_ADDR(offset)) #define EEPROM_BYTE(location, offset) (*(EEPROM_PTR(((uint32_t)location) + ((uint32_t)offset)))) +#define EEPROM_WORD(location) (*(__IO uint32_t *)EEPROM_PTR(location)) #define BUFFER_BYTE(buffer, offset) (*(((uint8_t *)buffer) + offset)) @@ -62,12 +63,16 @@ void eeprom_driver_erase(void) { STM32_L0_L1_EEPROM_Unlock(); for (size_t offset = 0; offset < STM32_ONBOARD_EEPROM_SIZE; offset += sizeof(uint32_t)) { +#ifdef QMK_MCU_SERIES_STM32L0XX FLASH->PECR |= FLASH_PECR_ERASE | FLASH_PECR_DATA; +#endif - *(__IO uint32_t *)EEPROM_ADDR(offset) = (uint32_t)0; + EEPROM_WORD(offset) = (uint32_t)0; STM32_L0_L1_EEPROM_WaitNotBusy(); +#ifdef QMK_MCU_SERIES_STM32L0XX FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_DATA); +#endif } STM32_L0_L1_EEPROM_Lock(); @@ -86,17 +91,39 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) { } void eeprom_write_block(const void *buf, void *addr, size_t len) { - STM32_L0_L1_EEPROM_Unlock(); + // use word-aligned write to overcome issues with writing null bytes + uint32_t start_addr = (uint32_t)addr; + if (start_addr >= (STM32_ONBOARD_EEPROM_SIZE)) { + return; + } + uint32_t max_len = (STM32_ONBOARD_EEPROM_SIZE)-start_addr; + if (len > max_len) { + len = max_len; + } + uint32_t end_addr = start_addr + len; - for (size_t offset = 0; offset < len; ++offset) { - // Drop out if we've hit the limit of the EEPROM - if ((((uint32_t)addr) + offset) >= STM32_ONBOARD_EEPROM_SIZE) { - break; + uint32_t aligned_start = start_addr & ~0x3; + uint32_t aligned_end = (end_addr + 3) & ~0x3; + + STM32_L0_L1_EEPROM_Unlock(); + for (uint32_t word_addr = aligned_start; word_addr < aligned_end; word_addr += 4) { + uint32_t existing_word = EEPROM_WORD(word_addr); + uint32_t new_word = existing_word; + + // Update the relevant bytes in the word + for (int i = 0; i < 4; i++) { + uint32_t byte_addr = word_addr + i; + if (byte_addr >= start_addr && byte_addr < end_addr) { + uint8_t new_byte = BUFFER_BYTE(buf, byte_addr - start_addr); + new_word = (new_word & ~(0xFFU << (i * 8))) | ((uint32_t)new_byte << (i * 8)); + } } - STM32_L0_L1_EEPROM_WaitNotBusy(); - EEPROM_BYTE(addr, offset) = BUFFER_BYTE(buf, offset); + // Only write if the word has changed + if (new_word != existing_word) { + STM32_L0_L1_EEPROM_WaitNotBusy(); + EEPROM_WORD(word_addr) = new_word; + } } - STM32_L0_L1_EEPROM_Lock(); } From 1efc82403bebe759272d1ba7a79d9dfa0d5df506 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 26 Feb 2025 22:25:41 +1100 Subject: [PATCH 189/592] Community modules (#24848) --- .github/labeler.yml | 4 + .github/workflows/format.yml | 1 + builddefs/build_keyboard.mk | 122 +++++--- data/constants/keycodes/keycodes_0.0.7.hjson | 7 + data/constants/module_hooks/0.1.0.hjson | 25 ++ data/constants/module_hooks/1.0.0.hjson | 26 ++ data/schemas/community_module.jsonschema | 17 ++ data/schemas/keyboard.jsonschema | 17 +- data/schemas/keymap.jsonschema | 6 + docs/_sidebar.json | 1 + docs/custom_quantum_functions.md | 11 +- docs/features/community_modules.md | 142 ++++++++++ .../onekey/keymaps/community_module/keymap.c | 7 + .../keymaps/community_module/keymap.json | 3 + lib/python/qmk/cli/__init__.py | 1 + lib/python/qmk/cli/format/c.py | 2 +- lib/python/qmk/cli/format/json.py | 13 +- .../qmk/cli/generate/community_modules.py | 263 ++++++++++++++++++ lib/python/qmk/cli/generate/rules_mk.py | 46 ++- lib/python/qmk/cli/info.py | 5 + lib/python/qmk/commands.py | 5 +- lib/python/qmk/community_modules.py | 100 +++++++ lib/python/qmk/info.py | 27 ++ lib/python/qmk/json_encoders.py | 28 ++ lib/python/qmk/keymap.py | 27 -- modules/qmk/hello_world/hello_world.c | 33 +++ modules/qmk/hello_world/introspection.c | 10 + modules/qmk/hello_world/introspection.h | 10 + modules/qmk/hello_world/qmk_module.json | 13 + modules/qmk/hello_world/rules.mk | 2 + quantum/action.h | 2 +- quantum/keyboard.c | 44 ++- quantum/keycodes.h | 3 + quantum/keymap_introspection.c | 11 + quantum/os_detection.c | 7 + quantum/quantum.c | 26 +- quantum/quantum.h | 4 + 37 files changed, 987 insertions(+), 84 deletions(-) create mode 100644 data/constants/keycodes/keycodes_0.0.7.hjson create mode 100644 data/constants/module_hooks/0.1.0.hjson create mode 100644 data/constants/module_hooks/1.0.0.hjson create mode 100644 data/schemas/community_module.jsonschema create mode 100644 docs/features/community_modules.md create mode 100644 keyboards/handwired/onekey/keymaps/community_module/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/community_module/keymap.json create mode 100644 lib/python/qmk/cli/generate/community_modules.py create mode 100644 lib/python/qmk/community_modules.py create mode 100644 modules/qmk/hello_world/hello_world.c create mode 100644 modules/qmk/hello_world/introspection.c create mode 100644 modules/qmk/hello_world/introspection.h create mode 100644 modules/qmk/hello_world/qmk_module.json create mode 100644 modules/qmk/hello_world/rules.mk diff --git a/.github/labeler.yml b/.github/labeler.yml index 270cd1a813..82f9672bb7 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -54,3 +54,7 @@ dd: - data/constants/** - data/mappings/** - data/schemas/** +community_module: + - changed-files: + - any-glob-to-any-file: + - modules/** diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 74c518fe05..b4e32f981b 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -10,6 +10,7 @@ on: - 'lib/arm_atsam/**' - 'lib/lib8tion/**' - 'lib/python/**' + - 'modules/**' - 'platforms/**' - 'quantum/**' - 'tests/**' diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index 7d58c29462..c5fc9cd25d 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -112,6 +112,39 @@ endif ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") include $(KEYBOARD_PATH_1)/rules.mk endif +# Create dependencies on DD keyboard config - structure validated elsewhere +DD_CONFIG_FILES := +ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json +endif + +ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","") + DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json +endif MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP) MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP) @@ -207,17 +240,17 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "") include $(INFO_RULES_MK) # Add rules to generate the keymap files - indentation here is important -$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) +$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) $(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)) @$(BUILD_CMD) -$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) +$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) $(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON)) @$(BUILD_CMD) -$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) +$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) $(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON)) @$(BUILD_CMD) @@ -226,6 +259,32 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/ endif +# Community modules +$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON)) + @$(BUILD_CMD) + +$(INTERMEDIATE_OUTPUT)/src/community_modules.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-community-modules-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(KEYMAP_JSON)) + @$(BUILD_CMD) + +$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(KEYMAP_JSON)) + @$(BUILD_CMD) + +$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON)) + @$(BUILD_CMD) + +SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c + +generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h + + include $(BUILDDEFS_PATH)/converters.mk # Generate the board's version.h file. @@ -315,6 +374,14 @@ endif # Find all of the config.h files and add them to our CONFIG_H define. CONFIG_H := + +define config_h_community_module_appender + ifneq ("$(wildcard $(1)/config.h)","") + CONFIG_H += $(1)/config.h + endif +endef +$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module)))) + ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","") CONFIG_H += $(KEYBOARD_PATH_5)/config.h endif @@ -332,6 +399,14 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","") endif POST_CONFIG_H := + +define post_config_h_community_module_appender + ifneq ("$(wildcard $(1)/post_config.h)","") + POST_CONFIG_H += $(1)/post_config.h + endif +endef +$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module)))) + ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","") POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h endif @@ -348,40 +423,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","") POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h endif -# Create dependencies on DD keyboard config - structure validated elsewhere -DD_CONFIG_FILES := -ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json -endif - -ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","") - DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json -endif - CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c @@ -462,6 +503,13 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","") include $(KEYBOARD_PATH_5)/post_rules.mk endif +define post_rules_mk_community_module_includer + ifneq ("$(wildcard $(1)/post_rules.mk)","") + include $(1)/post_rules.mk + endif +endef +$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module)))) + ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") CONFIG_H += $(KEYMAP_PATH)/config.h endif diff --git a/data/constants/keycodes/keycodes_0.0.7.hjson b/data/constants/keycodes/keycodes_0.0.7.hjson new file mode 100644 index 0000000000..52e1a50443 --- /dev/null +++ b/data/constants/keycodes/keycodes_0.0.7.hjson @@ -0,0 +1,7 @@ +{ + "ranges": { + "0x77C0/0x003F": { + "define": "QK_COMMUNITY_MODULE" + } + } +} diff --git a/data/constants/module_hooks/0.1.0.hjson b/data/constants/module_hooks/0.1.0.hjson new file mode 100644 index 0000000000..c77f4c297e --- /dev/null +++ b/data/constants/module_hooks/0.1.0.hjson @@ -0,0 +1,25 @@ +{ + keyboard_pre_init: { + ret_type: void + args: void + } + keyboard_post_init: { + ret_type: void + args: void + } + pre_process_record: { + ret_type: bool + args: uint16_t keycode, keyrecord_t *record + call_params: keycode, record + } + process_record: { + ret_type: bool + args: uint16_t keycode, keyrecord_t *record + call_params: keycode, record + } + post_process_record: { + ret_type: void + args: uint16_t keycode, keyrecord_t *record + call_params: keycode, record + } +} diff --git a/data/constants/module_hooks/1.0.0.hjson b/data/constants/module_hooks/1.0.0.hjson new file mode 100644 index 0000000000..4e7bf30412 --- /dev/null +++ b/data/constants/module_hooks/1.0.0.hjson @@ -0,0 +1,26 @@ +{ + housekeeping_task: { + ret_type: void + args: void + } + suspend_power_down: { + ret_type: void + args: void + } + suspend_wakeup_init: { + ret_type: void + args: void + } + shutdown: { + ret_type: bool + args: bool jump_to_bootloader + call_params: jump_to_bootloader + } + process_detected_host_os: { + ret_type: bool + args: os_variant_t os + call_params: os + guard: defined(OS_DETECTION_ENABLE) + header: os_detection.h + } +} diff --git a/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema new file mode 100644 index 0000000000..a3474476df --- /dev/null +++ b/data/schemas/community_module.jsonschema @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema#", + "$id": "qmk.community_module.v1", + "title": "Community Module Information", + "type": "object", + "required": ["module_name", "maintainer"] + "properties": { + "module_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, + "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, + "url": { + "type": "string", + "format": "uri" + }, + "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, + "features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"}, + } +} diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 8b6cc7032b..9b63f62d45 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -31,6 +31,11 @@ "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} } } + "features_config": { + "$ref": "qmk.definitions.v1#/boolean_array", + "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, + "not": {"required": ["lto"]} + }, }, "type": "object", "not": {"required": ["vendorId", "productId"]}, // reject via keys... @@ -328,11 +333,7 @@ "enabled": {"type": "boolean"} } }, - "features": { - "$ref": "qmk.definitions.v1#/boolean_array", - "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, - "not": {"required": ["lto"]} - }, + "features": { "$ref": "#/definitions/features_config" }, "indicators": { "type": "object", "properties": { @@ -467,6 +468,12 @@ "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} } }, + "modules": { + "type": "array", + "items": { + "type": "string" + } + }, "mouse_key": { "type": "object", "properties": { diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema index e967e45c53..b92a536c2c 100644 --- a/data/schemas/keymap.jsonschema +++ b/data/schemas/keymap.jsonschema @@ -71,6 +71,12 @@ "config": {"$ref": "qmk.keyboard.v1"}, "notes": { "type": "string" + }, + "modules": { + "type": "array", + "items": { + "type": "string" + } } } } diff --git a/docs/_sidebar.json b/docs/_sidebar.json index 95601be7de..0b5f297018 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -60,6 +60,7 @@ "items": [ { "text": "Customizing Functionality", "link": "/custom_quantum_functions" }, { "text": "Driver Installation with Zadig", "link": "/driver_installation_zadig" }, + { "text": "Community Modules", "link": "/features/community_modules" }, { "text": "Keymap Overview", "link": "/keymap" }, { "text": "Development Environments", diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index 1479eb53f6..c69beb055e 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -9,12 +9,19 @@ This page does not assume any special knowledge about QMK, but reading [Understa We have structured QMK as a hierarchy: * Core (`_quantum`) + * Community Module (`_`) + * Community Module -> Keyboard/Revision (`__kb`) + * Community Module -> Keymap (`__user`) * Keyboard/Revision (`_kb`) * Keymap (`_user`) Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level. -When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called. +When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` at an appropriate location, otherwise the keymap level function will never be called. + +Functions at the `__xxx()` level are intended to allow keyboards or keymaps to override or enhance the processing associated with a [community module](/features/community_modules). + +When defining module overrides such as `process_record_()`, the same pattern should be used; the module must invoke `process_record__kb()` as appropriate. # Custom Keycodes @@ -99,7 +106,7 @@ These are the three main initialization functions, listed in the order that they * `keyboard_post_init_*` - Happens at the end of the firmware's startup process. This is where you'd want to put "customization" code, for the most part. ::: warning -For most people, the `keyboard_post_init_user` function is what you want to call. For instance, this is where you want to set up things for RGB Underglow. +For most people, the `keyboard_post_init_user` function is what you want to implement. For instance, this is where you want to set up things for RGB Underglow. ::: ## Keyboard Pre Initialization code diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md new file mode 100644 index 0000000000..3a1a82e7bc --- /dev/null +++ b/docs/features/community_modules.md @@ -0,0 +1,142 @@ +# Community Modules + +Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds. + +These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may implement. + +## Adding a Community Module to your build + +Community Modules have first-class support for [External Userspace](/newbs_external_userspace), and QMK strongly recommends using External Userspace for hosting keymaps and Community Modules together. + +Modules must live in either of two locations: + +* `/modules/` +* `/modules/` + +A basic module is provided within QMK itself -- `qmk/hello_world` -- which prints out a notification over [HID console](/faq_debug) after 10 seconds, and adds a new keycode, `COMMUNITY_MODULE_HELLO` (aliased to `CM_HELO`) which types `Hello there.` to the active application when the corresponding key is pressed. + +To add this module to your build, in your keymap's directory create a `keymap.json` with the following content: + +```json +{ + "modules": [ + "qmk/hello_world" + ] +} +``` + +If you already have a `keymap.json`, you'll need to manually merge the `modules` section into your keymap. + +::: warning +Community Modules are not supported by QMK Configurator. If you wish to use Community Modules, you must build your own firmware. +::: + +## Adding a Community Module to your External Userspace + +Module authors are encouraged to provide a git repository on GitHub which may be imported into a user's external userspace. If a user wishes to import a module repository, they can do the following: + +```sh +cd /path/to/your/external/userspace +mkdir -p modules +# Replace the following {user} and {repo} with the author's community module repository +git submodule add https://github.com/{user}/{repo}.git modules/{user} +git submdule update --init --recursive +``` + +This will ensure the copy of the module is made in your userspace. + +Add a new entry into your `keymap.json` with the desired modules, replacing `{user}` and `{module_name}` as appropriate: + +```json +{ + "modules": [ + "qmk/hello_world", + "{user}/{module_name}" + ] +} +``` + +::: info +The module listed in `keymap.json` is the relative path within the `modules/` directory. So long as the module is present _somewhere_ under `modules/`, then the `keymap.json` can refer to that path. +::: + +## Writing a QMK Community Module + +As stated earlier, Community Module authors are strongly encouraged to provide their modules through git, allowing users to leverage submodules to import functionality. + +### `qmk_module.json` + +A Community Module is denoted by a `qmk_module.json` file such as the following: + +```json +{ + "module_name": "Hello World", + "maintainer": "QMK Maintainers", + "features": { + "deferred_exec": true + }, + "keycodes": [ + { + "key": "COMMUNITY_MODULE_HELLO", + "aliases": ["CM_HELO"] + } + ] +} +``` + +At minimum, the module must provide the `module_name` and `maintainer` fields. + +The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build. + +The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap. + +### `rules.mk` / `post_rules.mk` + +These two files follows standard QMK build system logic, allowing for `Makefile`-style customisation as if it were present in the keyboard or keymap. + +### `.c` + +This file will be automatically added to the build if the filename matches the directory name. For example, the `qmk/hello_world` module contains a `hello_world.c` file, which is automatically added to the build. + +::: info +Other files intended to be included must use the normal method of `SRC += my_file.c` inside `rules.mk`. +::: + +::: tip +This file should use `ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1,0,0);` to enforce a minimum version of the API that it requires, ensuring the Community Module is built with a compatible version of QMK. The list of APIs and corresponding version is given at the bottom of this document. Note the use of commas instead of periods. +::: + +### `introspection.c` / `introspection.h` + +These two files hook into the keymap introspection logic -- the header is prepended before the user keymap, and the C source file is appended after the user keymap. + +The header may provide definitions which are useful to the user's `keymap.c`. + +The source file may provide functions which allow access to information specified in the user's `keymap.c`. + +::: warning +Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk). +::: + +### Compatible APIs + +Community Modules may provide specializations for the following APIs: + +| Base API | API Format | Example (`hello_world` module) | API Version | +|----------------------------|-------------------------------------|----------------------------------------|-------------| +| `keyboard_pre_init` | `keyboard_pre_init_` | `keyboard_pre_init_hello_world` | `0.1.0` | +| `keyboard_post_init` | `keyboard_post_init_` | `keyboard_post_init_hello_world` | `0.1.0` | +| `pre_process_record` | `pre_process_record_` | `pre_process_record_hello_world` | `0.1.0` | +| `process_record` | `process_record_` | `process_record_hello_world` | `0.1.0` | +| `post_process_record` | `post_process_record_` | `post_process_record_hello_world` | `0.1.0` | +| `housekeeping_task` | `housekeeping_task_` | `housekeeping_task_hello_world` | `1.0.0` | +| `suspend_power_down` | `suspend_power_down_` | `suspend_power_down_hello_world` | `1.0.0` | +| `suspend_wakeup_init` | `suspend_wakeup_init_` | `suspend_wakeup_init_hello_world` | `1.0.0` | +| `shutdown` | `shutdown_` | `shutdown_hello_world` | `1.0.0` | +| `process_detected_host_os` | `process_detected_host_os_` | `process_detected_host_os_hello_world` | `1.0.0` | + +::: info +An unspecified API is disregarded if a Community Module does not provide a specialization for it. +::: + +Each API has an equivalent `__kb()` and `__user()` hook, as per the normal QMK [`_quantum`, `_kb`, and `_user` functions](/custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap). diff --git a/keyboards/handwired/onekey/keymaps/community_module/keymap.c b/keyboards/handwired/onekey/keymaps/community_module/keymap.c new file mode 100644 index 0000000000..5115a9fea0 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/community_module/keymap.c @@ -0,0 +1,7 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(CM_HELO) +}; diff --git a/keyboards/handwired/onekey/keymaps/community_module/keymap.json b/keyboards/handwired/onekey/keymaps/community_module/keymap.json new file mode 100644 index 0000000000..e3b4051b9e --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/community_module/keymap.json @@ -0,0 +1,3 @@ +{ + "modules": ["qmk/hello_world"] +} diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index bb47ea26ed..3f2ba9ce3c 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -49,6 +49,7 @@ subcommands = [ 'qmk.cli.generate.api', 'qmk.cli.generate.autocorrect_data', 'qmk.cli.generate.compilation_database', + 'qmk.cli.generate.community_modules', 'qmk.cli.generate.config_h', 'qmk.cli.generate.develop_pr_list', 'qmk.cli.generate.dfu_header', diff --git a/lib/python/qmk/cli/format/c.py b/lib/python/qmk/cli/format/c.py index a58aef3fbc..65818155b0 100644 --- a/lib/python/qmk/cli/format/c.py +++ b/lib/python/qmk/cli/format/c.py @@ -10,7 +10,7 @@ from qmk.path import normpath from qmk.c_parse import c_source_files c_file_suffixes = ('c', 'h', 'cpp', 'hpp') -core_dirs = ('drivers', 'quantum', 'tests', 'tmk_core', 'platforms') +core_dirs = ('drivers', 'quantum', 'tests', 'tmk_core', 'platforms', 'modules') ignored = ('tmk_core/protocol/usb_hid', 'platforms/chibios/boards') diff --git a/lib/python/qmk/cli/format/json.py b/lib/python/qmk/cli/format/json.py index 3670294434..61f5254184 100755 --- a/lib/python/qmk/cli/format/json.py +++ b/lib/python/qmk/cli/format/json.py @@ -9,7 +9,7 @@ from milc import cli from qmk.info import info_json from qmk.json_schema import json_load, validate -from qmk.json_encoders import InfoJSONEncoder, KeymapJSONEncoder, UserspaceJSONEncoder +from qmk.json_encoders import InfoJSONEncoder, KeymapJSONEncoder, UserspaceJSONEncoder, CommunityModuleJSONEncoder from qmk.path import normpath @@ -30,6 +30,13 @@ def _detect_json_format(file, json_data): except ValidationError: pass + if json_encoder is None: + try: + validate(json_data, 'qmk.community_module.v1') + json_encoder = CommunityModuleJSONEncoder + except ValidationError: + pass + if json_encoder is None: try: validate(json_data, 'qmk.keyboard.v1') @@ -54,6 +61,8 @@ def _get_json_encoder(file, json_data): json_encoder = KeymapJSONEncoder elif cli.args.format == 'userspace': json_encoder = UserspaceJSONEncoder + elif cli.args.format == 'community_module': + json_encoder = CommunityModuleJSONEncoder else: # This should be impossible cli.log.error('Unknown format: %s', cli.args.format) @@ -61,7 +70,7 @@ def _get_json_encoder(file, json_data): @cli.argument('json_file', arg_only=True, type=normpath, help='JSON file to format') -@cli.argument('-f', '--format', choices=['auto', 'keyboard', 'keymap', 'userspace'], default='auto', arg_only=True, help='JSON formatter to use (Default: autodetect)') +@cli.argument('-f', '--format', choices=['auto', 'keyboard', 'keymap', 'userspace', 'community_module'], default='auto', arg_only=True, help='JSON formatter to use (Default: autodetect)') @cli.argument('-i', '--inplace', action='store_true', arg_only=True, help='If set, will operate in-place on the input file') @cli.argument('-p', '--print', action='store_true', arg_only=True, help='If set, will print the formatted json to stdout ') @cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True) diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py new file mode 100644 index 0000000000..23678a2fb5 --- /dev/null +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -0,0 +1,263 @@ +import contextlib +from argcomplete.completers import FilesCompleter +from pathlib import Path + +from milc import cli + +import qmk.path +from qmk.info import get_modules +from qmk.keyboard import keyboard_completer, keyboard_folder +from qmk.commands import dump_lines +from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE +from qmk.community_modules import module_api_list, load_module_jsons, find_module_path + + +@contextlib.contextmanager +def _render_api_guard(lines, api): + if api.guard: + lines.append(f'#if {api.guard}') + yield + if api.guard: + lines.append(f'#endif // {api.guard}') + + +def _render_api_header(api): + lines = [] + if api.header: + lines.append('') + with _render_api_guard(lines, api): + lines.append(f'#include <{api.header}>') + return lines + + +def _render_keycodes(module_jsons): + lines = [] + lines.append('') + lines.append('enum {') + first = True + for module_json in module_jsons: + module_name = Path(module_json['module']).name + keycodes = module_json.get('keycodes', []) + if len(keycodes) > 0: + lines.append(f' // From module: {module_name}') + for keycode in keycodes: + key = keycode.get('key', None) + if first: + lines.append(f' {key} = QK_COMMUNITY_MODULE,') + first = False + else: + lines.append(f' {key},') + for alias in keycode.get('aliases', []): + lines.append(f' {alias} = {key},') + lines.append('') + lines.append(' LAST_COMMUNITY_MODULE_KEY') + lines.append('};') + lines.append('_Static_assert((int)LAST_COMMUNITY_MODULE_KEY <= (int)(QK_COMMUNITY_MODULE_MAX+1), "Too many community module keycodes");') + return lines + + +def _render_api_declarations(api, module, user_kb=True): + lines = [] + lines.append('') + with _render_api_guard(lines, api): + if user_kb: + lines.append(f'{api.ret_type} {api.name}_{module}_user({api.args});') + lines.append(f'{api.ret_type} {api.name}_{module}_kb({api.args});') + lines.append(f'{api.ret_type} {api.name}_{module}({api.args});') + return lines + + +def _render_api_implementations(api, module): + module_name = Path(module).name + lines = [] + lines.append('') + with _render_api_guard(lines, api): + # _user + lines.append(f'__attribute__((weak)) {api.ret_type} {api.name}_{module_name}_user({api.args}) {{') + if api.ret_type == 'bool': + lines.append(' return true;') + else: + pass + lines.append('}') + lines.append('') + + # _kb + lines.append(f'__attribute__((weak)) {api.ret_type} {api.name}_{module_name}_kb({api.args}) {{') + if api.ret_type == 'bool': + lines.append(f' if(!{api.name}_{module_name}_user({api.call_params})) {{ return false; }}') + lines.append(' return true;') + else: + lines.append(f' {api.name}_{module_name}_user({api.call_params});') + lines.append('}') + lines.append('') + + # module (non-suffixed) + lines.append(f'__attribute__((weak)) {api.ret_type} {api.name}_{module_name}({api.args}) {{') + if api.ret_type == 'bool': + lines.append(f' if(!{api.name}_{module_name}_kb({api.call_params})) {{ return false; }}') + lines.append(' return true;') + else: + lines.append(f' {api.name}_{module_name}_kb({api.call_params});') + lines.append('}') + return lines + + +def _render_core_implementation(api, modules): + lines = [] + lines.append('') + with _render_api_guard(lines, api): + lines.append(f'{api.ret_type} {api.name}_modules({api.args}) {{') + if api.ret_type == 'bool': + lines.append(' return true') + for module in modules: + module_name = Path(module).name + if api.ret_type == 'bool': + lines.append(f' && {api.name}_{module_name}({api.call_params})') + else: + lines.append(f' {api.name}_{module_name}({api.call_params});') + if api.ret_type == 'bool': + lines.append(' ;') + lines.append('}') + return lines + + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.h for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates a community_modules.h from a keymap.json file.') +def generate_community_modules_h(cli): + """Creates a community_modules.h from a keymap.json file + """ + if cli.args.output and cli.args.output.name == '-': + cli.args.output = None + + api_list, api_version, ver_major, ver_minor, ver_patch = module_api_list() + + lines = [ + GPL2_HEADER_C_LIKE, + GENERATED_HEADER_C_LIKE, + '#pragma once', + '#include ', + '#include ', + '#include ', + '', + '#define COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) (((((uint32_t)(ver_major))&0xFF) << 24) | ((((uint32_t)(ver_minor))&0xFF) << 16) | (((uint32_t)(ver_patch))&0xFF))', + f'#define COMMUNITY_MODULES_API_VERSION COMMUNITY_MODULES_API_VERSION_BUILDER({ver_major},{ver_minor},{ver_patch})', + f'#define ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(ver_major,ver_minor,ver_patch) _Static_assert(COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) <= COMMUNITY_MODULES_API_VERSION, "Community module requires a newer version of QMK modules API -- needs: " #ver_major "." #ver_minor "." #ver_patch ", current: {api_version}.")', + '', + 'typedef struct keyrecord_t keyrecord_t; // forward declaration so we don\'t need to include quantum.h', + '', + ] + + modules = get_modules(cli.args.keyboard, cli.args.filename) + module_jsons = load_module_jsons(modules) + if len(modules) > 0: + lines.extend(_render_keycodes(module_jsons)) + + for api in api_list: + lines.extend(_render_api_header(api)) + + for module in modules: + lines.append('') + lines.append(f'// From module: {module}') + for api in api_list: + lines.extend(_render_api_declarations(api, Path(module).name)) + lines.append('') + + lines.append('// Core wrapper') + for api in api_list: + lines.extend(_render_api_declarations(api, 'modules', user_kb=False)) + + dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.c for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates a community_modules.c from a keymap.json file.') +def generate_community_modules_c(cli): + """Creates a community_modules.c from a keymap.json file + """ + if cli.args.output and cli.args.output.name == '-': + cli.args.output = None + + api_list, _, _, _, _ = module_api_list() + + lines = [ + GPL2_HEADER_C_LIKE, + GENERATED_HEADER_C_LIKE, + '', + '#include "community_modules.h"', + ] + + modules = get_modules(cli.args.keyboard, cli.args.filename) + if len(modules) > 0: + + for module in modules: + for api in api_list: + lines.extend(_render_api_implementations(api, Path(module).name)) + + for api in api_list: + lines.extend(_render_core_implementation(api, modules)) + + dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.c for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates a community_modules_introspection.h from a keymap.json file.') +def generate_community_modules_introspection_h(cli): + """Creates a community_modules_introspection.h from a keymap.json file + """ + if cli.args.output and cli.args.output.name == '-': + cli.args.output = None + + lines = [ + GPL2_HEADER_C_LIKE, + GENERATED_HEADER_C_LIKE, + '', + ] + + modules = get_modules(cli.args.keyboard, cli.args.filename) + if len(modules) > 0: + for module in modules: + module_path = find_module_path(module) + lines.append(f'#if __has_include("{module_path}/introspection.h")') + lines.append(f'#include "{module_path}/introspection.h"') + lines.append(f'#endif // __has_include("{module_path}/introspection.h")') + lines.append('') + + dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.c for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates a community_modules_introspection.c from a keymap.json file.') +def generate_community_modules_introspection_c(cli): + """Creates a community_modules_introspection.c from a keymap.json file + """ + if cli.args.output and cli.args.output.name == '-': + cli.args.output = None + + lines = [ + GPL2_HEADER_C_LIKE, + GENERATED_HEADER_C_LIKE, + '', + ] + + modules = get_modules(cli.args.keyboard, cli.args.filename) + if len(modules) > 0: + for module in modules: + module_path = find_module_path(module) + lines.append(f'#if __has_include("{module_path}/introspection.c")') + lines.append(f'#include "{module_path}/introspection.c"') + lines.append(f'#endif // __has_include("{module_path}/introspection.c")') + lines.append('') + + dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 5291556109..cae9b07c3e 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -6,12 +6,13 @@ from dotty_dict import dotty from argcomplete.completers import FilesCompleter from milc import cli -from qmk.info import info_json +from qmk.info import info_json, get_modules from qmk.json_schema import json_load from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines, parse_configurator_json from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE +from qmk.community_modules import find_module_path, load_module_jsons def generate_rule(rules_key, rules_value): @@ -46,6 +47,42 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict): return generate_rule(rules_key, rules_value) +def generate_features_rules(features_dict): + lines = [] + for feature, enabled in features_dict.items(): + feature = feature.upper() + enabled = 'yes' if enabled else 'no' + lines.append(generate_rule(f'{feature}_ENABLE', enabled)) + return lines + + +def generate_modules_rules(keyboard, filename): + lines = [] + modules = get_modules(keyboard, filename) + if len(modules) > 0: + lines.append('') + lines.append('OPT_DEFS += -DCOMMUNITY_MODULES_ENABLE=TRUE') + for module in modules: + module_path = find_module_path(module) + if not module_path: + raise FileNotFoundError(f"Module '{module}' not found.") + lines.append('') + lines.append(f'COMMUNITY_MODULES += {module_path.name}') # use module_path here instead of module as it may be a subdirectory + lines.append(f'OPT_DEFS += -DCOMMUNITY_MODULE_{module_path.name.upper()}_ENABLE=TRUE') + lines.append(f'COMMUNITY_MODULE_PATHS += {module_path}') + lines.append(f'VPATH += {module_path}') + lines.append(f'SRC += $(wildcard {module_path}/{module_path.name}.c)') + lines.append(f'-include {module_path}/rules.mk') + + module_jsons = load_module_jsons(modules) + for module_json in module_jsons: + if 'features' in module_json: + lines.append('') + lines.append(f'# Module: {module_json["module_name"]}') + lines.extend(generate_features_rules(module_json['features'])) + return lines + + @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @@ -80,10 +117,7 @@ def generate_rules_mk(cli): # Iterate through features to enable/disable them if 'features' in kb_info_json: - for feature, enabled in kb_info_json['features'].items(): - feature = feature.upper() - enabled = 'yes' if enabled else 'no' - rules_mk_lines.append(generate_rule(f'{feature}_ENABLE', enabled)) + rules_mk_lines.extend(generate_features_rules(kb_info_json['features'])) # Set SPLIT_TRANSPORT, if needed if kb_info_json.get('split', {}).get('transport', {}).get('protocol') == 'custom': @@ -99,6 +133,8 @@ def generate_rules_mk(cli): if converter: rules_mk_lines.append(generate_rule('CONVERT_TO', converter)) + rules_mk_lines.extend(generate_modules_rules(cli.args.keyboard, cli.args.filename)) + # Show the results dump_lines(cli.args.output, rules_mk_lines) diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index e662407474..5925b57258 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -52,6 +52,11 @@ def show_keymap(kb_info_json, title_caps=True): if keymap_path and keymap_path.suffix == '.json': keymap_data = json.load(keymap_path.open(encoding='utf-8')) + + # cater for layout-less keymap.json + if 'layout' not in keymap_data: + return + layout_name = keymap_data['layout'] layout_name = kb_info_json.get('layout_aliases', {}).get(layout_name, layout_name) # Resolve alias names diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index a05b3641b5..0e1876ca7a 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -98,11 +98,14 @@ def in_virtualenv(): return active_prefix != sys.prefix -def dump_lines(output_file, lines, quiet=True): +def dump_lines(output_file, lines, quiet=True, remove_repeated_newlines=False): """Handle dumping to stdout or file Creates parent folders if required """ generated = '\n'.join(lines) + '\n' + if remove_repeated_newlines: + while '\n\n\n' in generated: + generated = generated.replace('\n\n\n', '\n\n') if output_file and output_file.name != '-': output_file.parent.mkdir(parents=True, exist_ok=True) if output_file.exists(): diff --git a/lib/python/qmk/community_modules.py b/lib/python/qmk/community_modules.py new file mode 100644 index 0000000000..f7e96a6b93 --- /dev/null +++ b/lib/python/qmk/community_modules.py @@ -0,0 +1,100 @@ +import os + +from pathlib import Path +from functools import lru_cache + +from milc.attrdict import AttrDict + +from qmk.json_schema import json_load, validate, merge_ordered_dicts +from qmk.util import truthy +from qmk.constants import QMK_FIRMWARE, QMK_USERSPACE, HAS_QMK_USERSPACE +from qmk.path import under_qmk_firmware, under_qmk_userspace + +COMMUNITY_MODULE_JSON_FILENAME = 'qmk_module.json' + + +class ModuleAPI(AttrDict): + def __init__(self, **kwargs): + super().__init__() + for key, value in kwargs.items(): + self[key] = value + + +@lru_cache(maxsize=1) +def module_api_list(): + module_definition_files = sorted(set(QMK_FIRMWARE.glob('data/constants/module_hooks/*.hjson'))) + module_definition_jsons = [json_load(f) for f in module_definition_files] + module_definitions = merge_ordered_dicts(module_definition_jsons) + latest_module_version = module_definition_files[-1].stem + latest_module_version_parts = latest_module_version.split('.') + + api_list = [] + for name, mod in module_definitions.items(): + api_list.append(ModuleAPI( + ret_type=mod['ret_type'], + name=name, + args=mod['args'], + call_params=mod.get('call_params', ''), + guard=mod.get('guard', None), + header=mod.get('header', None), + )) + + return api_list, latest_module_version, latest_module_version_parts[0], latest_module_version_parts[1], latest_module_version_parts[2] + + +def find_available_module_paths(): + """Find all available modules. + """ + search_dirs = [] + if HAS_QMK_USERSPACE: + search_dirs.append(QMK_USERSPACE / 'modules') + search_dirs.append(QMK_FIRMWARE / 'modules') + + modules = [] + for search_dir in search_dirs: + for module_json_path in search_dir.rglob(COMMUNITY_MODULE_JSON_FILENAME): + modules.append(module_json_path.parent) + return modules + + +def find_module_path(module): + """Find a module by name. + """ + for module_path in find_available_module_paths(): + # Ensure the module directory is under QMK Firmware or QMK Userspace + relative_path = under_qmk_firmware(module_path) + if not relative_path: + relative_path = under_qmk_userspace(module_path) + if not relative_path: + continue + + lhs = str(relative_path.as_posix())[len('modules/'):] + rhs = str(Path(module).as_posix()) + + if relative_path and lhs == rhs: + return module_path + return None + + +def load_module_json(module): + """Load a module JSON file. + """ + module_path = find_module_path(module) + if not module_path: + raise FileNotFoundError(f'Module not found: {module}') + + module_json = json_load(module_path / COMMUNITY_MODULE_JSON_FILENAME) + + if not truthy(os.environ.get('SKIP_SCHEMA_VALIDATION'), False): + validate(module_json, 'qmk.community_module.v1') + + module_json['module'] = module + module_json['module_path'] = module_path + + return module_json + + +def load_module_jsons(modules): + """Load the module JSON files, matching the specified order. + """ + return list(map(load_module_json, modules)) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index d70e7ee1b3..93eba7376a 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -1059,3 +1059,30 @@ def keymap_json(keyboard, keymap, force_layout=None): _extract_config_h(kb_info_json, parse_config_h_file(keymap_config)) return kb_info_json + + +def get_modules(keyboard, keymap_filename): + """Get the modules for a keyboard/keymap. + """ + modules = [] + + if keymap_filename: + keymap_json = parse_configurator_json(keymap_filename) + + if keymap_json: + kb = keymap_json.get('keyboard', None) + if not kb: + kb = keyboard + + if kb: + kb_info_json = info_json(kb) + if kb_info_json: + modules.extend(kb_info_json.get('modules', [])) + + modules.extend(keymap_json.get('modules', [])) + + elif keyboard: + kb_info_json = info_json(keyboard) + modules.extend(kb_info_json.get('modules', [])) + + return list(dict.fromkeys(modules)) # remove dupes diff --git a/lib/python/qmk/json_encoders.py b/lib/python/qmk/json_encoders.py index 0e4ad1d220..e83a381d52 100755 --- a/lib/python/qmk/json_encoders.py +++ b/lib/python/qmk/json_encoders.py @@ -235,3 +235,31 @@ class UserspaceJSONEncoder(QMKJSONEncoder): return '01build_targets' return key + + +class CommunityModuleJSONEncoder(QMKJSONEncoder): + """Custom encoder to make qmk_module.json's a little nicer to work with. + """ + def sort_dict(self, item): + """Sorts the hashes in a nice way. + """ + key = item[0] + + if self.indentation_level == 1: + if key == 'module_name': + return '00module_name' + if key == 'maintainer': + return '01maintainer' + if key == 'url': + return '02url' + if key == 'features': + return '03features' + if key == 'keycodes': + return '04keycodes' + elif self.indentation_level == 3: # keycodes + if key == 'key': + return '00key' + if key == 'aliases': + return '01aliases' + + return key diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 9dd043c4a8..8e36461722 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -334,33 +334,6 @@ def write_json(keyboard, keymap, layout, layers, macros=None): return write_file(keymap_file, keymap_content) -def write(keymap_json): - """Generate the `keymap.c` and write it to disk. - - Returns the filename written to. - - `keymap_json` should be a dict with the following keys: - keyboard - The name of the keyboard - - keymap - The name of the keymap - - layout - The LAYOUT macro this keymap uses. - - layers - An array of arrays describing the keymap. Each item in the inner array should be a string that is a valid QMK keycode. - - macros - A list of macros for this keymap. - """ - keymap_content = generate_c(keymap_json) - keymap_file = qmk.path.keymaps(keymap_json['keyboard'])[0] / keymap_json['keymap'] / 'keymap.c' - - return write_file(keymap_file, keymap_content) - - def locate_keymap(keyboard, keymap, force_layout=None): """Returns the path to a keymap for a specific keyboard. """ diff --git a/modules/qmk/hello_world/hello_world.c b/modules/qmk/hello_world/hello_world.c new file mode 100644 index 0000000000..d9dd366100 --- /dev/null +++ b/modules/qmk/hello_world/hello_world.c @@ -0,0 +1,33 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +#include "introspection.h" + +ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1, 0, 0); + +uint32_t delayed_hello_world(uint32_t trigger_time, void *cb_arg) { + printf("Hello, world! I'm a QMK based keyboard! The keymap array size is %d bytes.\n", (int)hello_world_introspection().total_size); + return 0; +} + +void keyboard_post_init_hello_world(void) { + keyboard_post_init_hello_world_kb(); + defer_exec(10000, delayed_hello_world, NULL); +} + +bool process_record_hello_world(uint16_t keycode, keyrecord_t *record) { + if (!process_record_hello_world_kb(keycode, record)) { + return false; + } + + switch (keycode) { + case COMMUNITY_MODULE_HELLO: + if (record->event.pressed) { + SEND_STRING("Hello there."); + break; + } + } + + return true; +} diff --git a/modules/qmk/hello_world/introspection.c b/modules/qmk/hello_world/introspection.c new file mode 100644 index 0000000000..2c32a074f5 --- /dev/null +++ b/modules/qmk/hello_world/introspection.c @@ -0,0 +1,10 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later + +hello_world_introspection_t hello_world_introspection(void) { + hello_world_introspection_t introspection = { + .total_size = sizeof(keymaps), + .layer_count = sizeof(keymaps) / sizeof(keymaps[0]), + }; + return introspection; +} diff --git a/modules/qmk/hello_world/introspection.h b/modules/qmk/hello_world/introspection.h new file mode 100644 index 0000000000..fd3d7f24a0 --- /dev/null +++ b/modules/qmk/hello_world/introspection.h @@ -0,0 +1,10 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +typedef struct hello_world_introspection_t { + int16_t total_size; + int16_t layer_count; +} hello_world_introspection_t; + +hello_world_introspection_t hello_world_introspection(void); diff --git a/modules/qmk/hello_world/qmk_module.json b/modules/qmk/hello_world/qmk_module.json new file mode 100644 index 0000000000..4f269cb4e9 --- /dev/null +++ b/modules/qmk/hello_world/qmk_module.json @@ -0,0 +1,13 @@ +{ + "module_name": "Hello World", + "maintainer": "QMK Maintainers", + "features": { + "deferred_exec": true + }, + "keycodes": [ + { + "key": "COMMUNITY_MODULE_HELLO", + "aliases": ["CM_HELO"] + } + ] +} diff --git a/modules/qmk/hello_world/rules.mk b/modules/qmk/hello_world/rules.mk new file mode 100644 index 0000000000..91806fb1e3 --- /dev/null +++ b/modules/qmk/hello_world/rules.mk @@ -0,0 +1,2 @@ +# Just a simple rules.mk which tests that they work from a community module. +$(shell $(QMK_BIN) hello -n "from QMK's hello world community module") diff --git a/quantum/action.h b/quantum/action.h index d5b15c6f17..7596688f31 100644 --- a/quantum/action.h +++ b/quantum/action.h @@ -45,7 +45,7 @@ typedef struct { } tap_t; /* Key event container for recording */ -typedef struct { +typedef struct keyrecord_t { keyevent_t event; #ifndef NO_ACTION_TAPPING tap_t tap; diff --git a/quantum/keyboard.c b/quantum/keyboard.c index d7836cf36e..ad740de4b3 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -289,6 +289,21 @@ __attribute__((weak)) void keyboard_pre_init_kb(void) { keyboard_pre_init_user(); } +/** \brief keyboard_pre_init_modules + * + * FIXME: needs doc + */ +__attribute__((weak)) void keyboard_pre_init_modules(void) {} + +/** \brief keyboard_pre_init_quantum + * + * FIXME: needs doc + */ +void keyboard_pre_init_quantum(void) { + keyboard_pre_init_modules(); + keyboard_pre_init_kb(); +} + /** \brief keyboard_post_init_user * * FIXME: needs doc @@ -305,6 +320,23 @@ __attribute__((weak)) void keyboard_post_init_kb(void) { keyboard_post_init_user(); } +/** \brief keyboard_post_init_modules + * + * FIXME: needs doc + */ + +__attribute__((weak)) void keyboard_post_init_modules(void) {} + +/** \brief keyboard_post_init_quantum + * + * FIXME: needs doc + */ + +void keyboard_post_init_quantum(void) { + keyboard_post_init_modules(); + keyboard_post_init_kb(); +} + /** \brief matrix_can_read * * Allows overriding when matrix scanning operations should be executed. @@ -323,7 +355,7 @@ void keyboard_setup(void) { eeprom_driver_init(); #endif matrix_setup(); - keyboard_pre_init_kb(); + keyboard_pre_init_quantum(); } #ifndef SPLIT_KEYBOARD @@ -355,6 +387,13 @@ __attribute__((weak)) bool should_process_keypress(void) { return is_keyboard_master(); } +/** \brief housekeeping_task_modules + * + * Codegen will override this if community modules are enabled. + * This is specific to keyboard-level functionality. + */ +__attribute__((weak)) void housekeeping_task_modules(void) {} + /** \brief housekeeping_task_kb * * Override this function if you have a need to execute code for every keyboard main loop iteration. @@ -374,6 +413,7 @@ __attribute__((weak)) void housekeeping_task_user(void) {} * Invokes hooks for executing code after QMK is done after each loop iteration. */ void housekeeping_task(void) { + housekeeping_task_modules(); housekeeping_task_kb(); housekeeping_task_user(); } @@ -493,7 +533,7 @@ void keyboard_init(void) { debug_enable = true; #endif - keyboard_post_init_kb(); /* Always keep this last */ + keyboard_post_init_quantum(); /* Always keep this last */ } /** \brief key_event_task diff --git a/quantum/keycodes.h b/quantum/keycodes.h index 5929e35687..b4fc38f5ff 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h @@ -76,6 +76,8 @@ enum qk_keycode_ranges { QK_MACRO_MAX = 0x777F, QK_CONNECTION = 0x7780, QK_CONNECTION_MAX = 0x77BF, + QK_COMMUNITY_MODULE = 0x77C0, + QK_COMMUNITY_MODULE_MAX = 0x77FF, QK_LIGHTING = 0x7800, QK_LIGHTING_MAX = 0x78FF, QK_QUANTUM = 0x7C00, @@ -1476,6 +1478,7 @@ enum qk_keycode_defines { #define IS_QK_STENO(code) ((code) >= QK_STENO && (code) <= QK_STENO_MAX) #define IS_QK_MACRO(code) ((code) >= QK_MACRO && (code) <= QK_MACRO_MAX) #define IS_QK_CONNECTION(code) ((code) >= QK_CONNECTION && (code) <= QK_CONNECTION_MAX) +#define IS_QK_COMMUNITY_MODULE(code) ((code) >= QK_COMMUNITY_MODULE && (code) <= QK_COMMUNITY_MODULE_MAX) #define IS_QK_LIGHTING(code) ((code) >= QK_LIGHTING && (code) <= QK_LIGHTING_MAX) #define IS_QK_QUANTUM(code) ((code) >= QK_QUANTUM && (code) <= QK_QUANTUM_MAX) #define IS_QK_KB(code) ((code) >= QK_KB && (code) <= QK_KB_MAX) diff --git a/quantum/keymap_introspection.c b/quantum/keymap_introspection.c index 236b54ce98..23e842353a 100644 --- a/quantum/keymap_introspection.c +++ b/quantum/keymap_introspection.c @@ -1,6 +1,10 @@ // Copyright 2022 Nick Brassel (@tzarc) // SPDX-License-Identifier: GPL-2.0-or-later +#if defined(COMMUNITY_MODULES_ENABLE) +# include "community_modules_introspection.h" +#endif // defined(COMMUNITY_MODULES_ENABLE) + // Pull the actual keymap code so that we can inspect stuff from it #include KEYMAP_C @@ -171,3 +175,10 @@ __attribute__((weak)) const key_override_t* key_override_get(uint16_t key_overri } #endif // defined(KEY_OVERRIDE_ENABLE) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Community modules (must be last in this file!) + +#if defined(COMMUNITY_MODULES_ENABLE) +# include "community_modules_introspection.c" +#endif // defined(COMMUNITY_MODULES_ENABLE) diff --git a/quantum/os_detection.c b/quantum/os_detection.c index 84bbeeed54..9a9f9052f2 100644 --- a/quantum/os_detection.c +++ b/quantum/os_detection.c @@ -72,6 +72,8 @@ static volatile struct usb_device_state maxprev_usb_device_state = {.configure_s static volatile bool debouncing = false; static volatile fast_timer_t last_time = 0; +bool process_detected_host_os_modules(os_variant_t os); + void os_detection_task(void) { #ifdef OS_DETECTION_KEYBOARD_RESET // resetting the keyboard on the USB device state change callback results in instability, so delegate that to this task @@ -96,12 +98,17 @@ void os_detection_task(void) { if (detected_os != reported_os || first_report) { first_report = false; reported_os = detected_os; + process_detected_host_os_modules(detected_os); process_detected_host_os_kb(detected_os); } } } } +__attribute__((weak)) bool process_detected_host_os_modules(os_variant_t os) { + return true; +} + __attribute__((weak)) bool process_detected_host_os_kb(os_variant_t detected_os) { return process_detected_host_os_user(detected_os); } diff --git a/quantum/quantum.c b/quantum/quantum.c index b63300add8..adb14d64b6 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -162,6 +162,10 @@ __attribute__((weak)) void tap_code16(uint16_t code) { tap_code16_delay(code, code == KC_CAPS_LOCK ? TAP_HOLD_CAPS_DELAY : TAP_CODE_DELAY); } +__attribute__((weak)) bool pre_process_record_modules(uint16_t keycode, keyrecord_t *record) { + return true; +} + __attribute__((weak)) bool pre_process_record_kb(uint16_t keycode, keyrecord_t *record) { return pre_process_record_user(keycode, record); } @@ -174,6 +178,10 @@ __attribute__((weak)) bool process_action_kb(keyrecord_t *record) { return true; } +__attribute__((weak)) bool process_record_modules(uint16_t keycode, keyrecord_t *record) { + return true; +} + __attribute__((weak)) bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return process_record_user(keycode, record); } @@ -182,12 +190,22 @@ __attribute__((weak)) bool process_record_user(uint16_t keycode, keyrecord_t *re return true; } +__attribute__((weak)) void post_process_record_modules(uint16_t keycode, keyrecord_t *record) {} + __attribute__((weak)) void post_process_record_kb(uint16_t keycode, keyrecord_t *record) { post_process_record_user(keycode, record); } __attribute__((weak)) void post_process_record_user(uint16_t keycode, keyrecord_t *record) {} +__attribute__((weak)) bool shutdown_modules(bool jump_to_bootloader) { + return true; +} + +__attribute__((weak)) void suspend_power_down_modules(void) {} + +__attribute__((weak)) void suspend_wakeup_init_modules(void) {} + void shutdown_quantum(bool jump_to_bootloader) { clear_keyboard(); #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) @@ -199,11 +217,13 @@ void shutdown_quantum(bool jump_to_bootloader) { # endif uint16_t timer_start = timer_read(); PLAY_SONG(goodbye_song); + shutdown_modules(jump_to_bootloader); shutdown_kb(jump_to_bootloader); while (timer_elapsed(timer_start) < 250) wait_ms(1); stop_all_notes(); #else + shutdown_modules(jump_to_bootloader); shutdown_kb(jump_to_bootloader); wait_ms(250); #endif @@ -258,7 +278,7 @@ uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache) { /* Get keycode, and then process pre tapping functionality */ bool pre_process_record_quantum(keyrecord_t *record) { - return pre_process_record_kb(get_record_keycode(record, true), record) && + return pre_process_record_modules(get_record_keycode(record, true), record) && pre_process_record_kb(get_record_keycode(record, true), record) && #ifdef COMBO_ENABLE process_combo(get_record_keycode(record, true), record) && #endif @@ -268,6 +288,7 @@ bool pre_process_record_quantum(keyrecord_t *record) { /* Get keycode, and then call keyboard function */ void post_process_record_quantum(keyrecord_t *record) { uint16_t keycode = get_record_keycode(record, false); + post_process_record_modules(keycode, record); post_process_record_kb(keycode, record); } @@ -332,6 +353,7 @@ bool process_record_quantum(keyrecord_t *record) { #if defined(POINTING_DEVICE_ENABLE) && defined(POINTING_DEVICE_AUTO_MOUSE_ENABLE) process_auto_mouse(keycode, record) && #endif + process_record_modules(keycode, record) && // modules must run before kb process_record_kb(keycode, record) && #if defined(VIA_ENABLE) process_record_via(keycode, record) && @@ -526,6 +548,7 @@ __attribute__((weak)) bool shutdown_kb(bool jump_to_bootloader) { } void suspend_power_down_quantum(void) { + suspend_power_down_modules(); suspend_power_down_kb(); #ifndef NO_SUSPEND_POWER_DOWN // Turn off backlight @@ -593,6 +616,7 @@ __attribute__((weak)) void suspend_wakeup_init_quantum(void) { #if defined(RGB_MATRIX_ENABLE) rgb_matrix_set_suspend_state(false); #endif + suspend_wakeup_init_modules(); suspend_wakeup_init_kb(); } diff --git a/quantum/quantum.h b/quantum/quantum.h index 9db88a54d4..59a415ead4 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -244,6 +244,10 @@ extern layer_state_t layer_state; # include "layer_lock.h" #endif +#ifdef COMMUNITY_MODULES_ENABLE +# include "community_modules.h" +#endif + void set_single_default_layer(uint8_t default_layer); void set_single_persistent_default_layer(uint8_t default_layer); From c4aaab5fa34ec9d66bb57c3640a5356c2daa638f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 27 Feb 2025 22:14:32 +0000 Subject: [PATCH 190/592] 2025q1 develop changelog (#24949) Co-authored-by: Nick Brassel --- docs/ChangeLog/20250223.md | 135 ++++++++++++++++++++++++ docs/_sidebar.json | 2 +- docs/breaking_changes.md | 20 ++-- docs/breaking_changes_history.md | 1 + modules/qmk/hello_world/qmk_module.json | 1 + 5 files changed, 148 insertions(+), 11 deletions(-) create mode 100644 docs/ChangeLog/20250223.md diff --git a/docs/ChangeLog/20250223.md b/docs/ChangeLog/20250223.md new file mode 100644 index 0000000000..858848a60b --- /dev/null +++ b/docs/ChangeLog/20250223.md @@ -0,0 +1,135 @@ +# QMK Breaking Changes - 2025 February 23 Changelog + +## Notable Features + +### Community Modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848)) + +Community Modules are a feature within QMK which allows code to be implemented by third parties, making it available for other people to import into their own builds. + +These modules can provide implementations which override or enhance normal QMK processing; initialization, key processing, suspend, and shutdown are some of the provided hooks which modules may currently implement. + +See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks. + +First-class support for [External Userspace](../newbs_external_userspace) is included out of the box, so there's even more reason to take the plunge and convert your keymap builds to a userspace repository! + +::: tip +An example with a new keycode and some debugging information in the QMK repository [lives here](https://github.com/qmk/qmk_firmware/tree/master/modules/qmk/hello_world), and a community module port of [getreuer's SOCD Cleaner](https://getreuer.info/posts/keyboards/socd-cleaner/) can be found in [tzarc's modules repo](https://github.com/tzarc/qmk_modules). +::: + +### Chordal Hold ([#24560](https://github.com/qmk/qmk_firmware/pull/24560)) + +Chordal Hold implements, by default, an "opposite hands" rule. Suppose a tap-hold key is pressed and then, before the tapping term, another key is pressed. With Chordal Hold, the tap-hold key is settled as tapped if the two keys are on the same hand. + +Chordal Hold may be useful to avoid accidental modifier activation with mod-taps, particularly in rolled keypresses when using home row mods. + +See the [Chordal Hold documentation](../tap_hold#chordal-hold) for more information. + +## Changes Requiring User Action + +### Updated Keyboard Codebases + +| Old Keyboard Name | New Keyboard Name | +|-------------------------|-----------------------------| +| cxt_studio | cxt_studio/12e4 | +| ergodox_stm32 | handwired/ergodox_stm32 | +| ploopyco/mouse | ploopyco/mouse/rev1_002 | +| ploopyco/trackball/rev1 | ploopyco/trackball/rev1_004 | +| ymdk/id75 | ymdk/id75/f103 | + +## Deprecation Notices + +In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here. + +### DEFAULT_FOLDER removal ([#24836](https://github.com/qmk/qmk_firmware/pull/24836)) + +`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system. +Parent folders containing common configuration would create invalid build targets. + +With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets. +The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration. + +Backwards compatibility of build targets has been maintained where possible. + +## Full changelist + +Core: +* Chaining OSL and MO ([#23065](https://github.com/qmk/qmk_firmware/pull/23065)) +* Add extra keymap for EurKEY layout ([#24241](https://github.com/qmk/qmk_firmware/pull/24241)) +* Add leader_add_user callback ([#24266](https://github.com/qmk/qmk_firmware/pull/24266)) +* always return audio pin to 0 on ARM ([#24503](https://github.com/qmk/qmk_firmware/pull/24503)) +* Update Starlight matrix effects ([#24521](https://github.com/qmk/qmk_firmware/pull/24521)) +* Refactor Hue Breathing matrix effect with runner ([#24525](https://github.com/qmk/qmk_firmware/pull/24525)) +* Ensure timer_read() is safe to call from interrupt handlers on ARM ([#24529](https://github.com/qmk/qmk_firmware/pull/24529)) +* Update Raindrops effect to respect LED range limits ([#24531](https://github.com/qmk/qmk_firmware/pull/24531)) +* Add Chordal Hold, an "opposite hands rule" tap-hold option similar to Achordion, Bilateral Combinations. ([#24560](https://github.com/qmk/qmk_firmware/pull/24560)) +* Azoteq - improve I2C behaviour while polling. ([#24611](https://github.com/qmk/qmk_firmware/pull/24611)) +* macOS install: remove bad ARM toolchains ([#24637](https://github.com/qmk/qmk_firmware/pull/24637)) +* small refactoring of TIMER_DIFF ([#24678](https://github.com/qmk/qmk_firmware/pull/24678)) +* Subscript alef correction ([#24707](https://github.com/qmk/qmk_firmware/pull/24707)) +* Created SH1107 driver for quantum painter ([#24724](https://github.com/qmk/qmk_firmware/pull/24724)) +* [CI] Regenerate Files ([#24772](https://github.com/qmk/qmk_firmware/pull/24772)) +* Patch up issue for inverted complementary output on Backlight ([#24794](https://github.com/qmk/qmk_firmware/pull/24794)) +* Patch up issue when compile with APA102 driver ([#24800](https://github.com/qmk/qmk_firmware/pull/24800)) +* Consolidate send_string implementations. ([#24817](https://github.com/qmk/qmk_firmware/pull/24817)) +* Consolidate timer_elapsed implementations ([#24830](https://github.com/qmk/qmk_firmware/pull/24830)) +* `i2c_master`: remove deprecated functions ([#24832](https://github.com/qmk/qmk_firmware/pull/24832)) +* Resolve keyboard_aliases when processing keyboard make targets ([#24834](https://github.com/qmk/qmk_firmware/pull/24834)) +* LED drivers: remove deprecated defines ([#24837](https://github.com/qmk/qmk_firmware/pull/24837)) +* `ferris/0_1`: update I2C API usage ([#24839](https://github.com/qmk/qmk_firmware/pull/24839)) +* Unify i2c_master headers ([#24846](https://github.com/qmk/qmk_firmware/pull/24846)) +* Community modules ([#24848](https://github.com/qmk/qmk_firmware/pull/24848)) +* Relocate base WS2812 code ([#24850](https://github.com/qmk/qmk_firmware/pull/24850)) +* Unify UART headers ([#24855](https://github.com/qmk/qmk_firmware/pull/24855)) +* Unify spi_master headers ([#24857](https://github.com/qmk/qmk_firmware/pull/24857)) +* Invoke `process_record_via` after `_user`/`_kb` have a chance to handle it. ([#24879](https://github.com/qmk/qmk_firmware/pull/24879)) + +CLI: +* Extend lint to reject 'blank' files ([#23994](https://github.com/qmk/qmk_firmware/pull/23994)) +* `qmk docs`: restore `--port` and `--browser` arguments ([#24623](https://github.com/qmk/qmk_firmware/pull/24623)) +* Update via2json layout macro searching ([#24640](https://github.com/qmk/qmk_firmware/pull/24640)) +* Change `new-keymap` keymap name prompt ([#24701](https://github.com/qmk/qmk_firmware/pull/24701)) +* default_keyboard.h generation tweaks ([#24715](https://github.com/qmk/qmk_firmware/pull/24715)) +* Ensure `qmk flash` rejects invalid files for uf2 compatible bootloaders ([#24802](https://github.com/qmk/qmk_firmware/pull/24802)) +* Reject readme dummy content ([#24913](https://github.com/qmk/qmk_firmware/pull/24913)) + +Submodule updates: +* chibios: usb_main: remove OTG sof workaround ([#24259](https://github.com/qmk/qmk_firmware/pull/24259)) +* Update ChibiOS to latest stable branch. ([#24651](https://github.com/qmk/qmk_firmware/pull/24651)) +* Update ChibiOS `stable_21.11.x`. ([#24714](https://github.com/qmk/qmk_firmware/pull/24714)) +* Update ChibiOS-Contrib. ([#24803](https://github.com/qmk/qmk_firmware/pull/24803)) + +Keyboards: +* refactor: move ymdk/id75 to revision ([#24590](https://github.com/qmk/qmk_firmware/pull/24590)) +* skyloong/gk61: Remove overriding of core keycode behaviour ([#24655](https://github.com/qmk/qmk_firmware/pull/24655)) +* moky/moky88: Remove use of deprecated defines ([#24656](https://github.com/qmk/qmk_firmware/pull/24656)) +* Updating Promenade keyboard (Missing keys in matrix, other minor changes to keymap) ([#24705](https://github.com/qmk/qmk_firmware/pull/24705)) +* Moving cxt_studio keyboard to own folder ([#24748](https://github.com/qmk/qmk_firmware/pull/24748)) +* Add CXT Studio 12E3 keyboard ([#24749](https://github.com/qmk/qmk_firmware/pull/24749)) +* Add Silakka54 keyboard ([#24757](https://github.com/qmk/qmk_firmware/pull/24757)) +* Add more layout for skiller_sgk50_s4 ([#24784](https://github.com/qmk/qmk_firmware/pull/24784)) +* Add watchdog service to RGBKB Sol 3 ([#24786](https://github.com/qmk/qmk_firmware/pull/24786)) +* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24835](https://github.com/qmk/qmk_firmware/pull/24835)) +* Remove DEFAULT_FOLDER where keyboard aliases already exists ([#24838](https://github.com/qmk/qmk_firmware/pull/24838)) +* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24845](https://github.com/qmk/qmk_firmware/pull/24845)) +* Update for 'A-JAZZ AKC084' ('A-JAZZ AKP846') ([#24868](https://github.com/qmk/qmk_firmware/pull/24868)) +* handwired/xealous - Remove DEFAULT_FOLDER ([#24877](https://github.com/qmk/qmk_firmware/pull/24877)) +* Updates to Ploopy Classic, Mouse, and Thumb for RP2040 hardware upgrade ([#24880](https://github.com/qmk/qmk_firmware/pull/24880)) +* Move Ergodox STM32 to handwired folder ([#24903](https://github.com/qmk/qmk_firmware/pull/24903)) +* Remove readme dummy content ([#24912](https://github.com/qmk/qmk_firmware/pull/24912)) +* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24915](https://github.com/qmk/qmk_firmware/pull/24915)) +* Migrate some DEFAULT_FOLDER to keyboard_aliases.hjson ([#24938](https://github.com/qmk/qmk_firmware/pull/24938)) + +Keyboard fixes: +* Fix up CI with `DEFAULT_FOLDER`. ([#24842](https://github.com/qmk/qmk_firmware/pull/24842)) +* rgbkb/pan - Remove invalid build target ([#24844](https://github.com/qmk/qmk_firmware/pull/24844)) + +Others: +* Formally deprecate DEFAULT_FOLDER ([#24836](https://github.com/qmk/qmk_firmware/pull/24836)) +* Correct I2C API reference ([#24840](https://github.com/qmk/qmk_firmware/pull/24840)) + +Bugs: +* Retro Tapping Re-Write; Key Roll Fix ([#23641](https://github.com/qmk/qmk_firmware/pull/23641)) +* Fix Quantum Painter compiliation issues with heavy optimization ([#24667](https://github.com/qmk/qmk_firmware/pull/24667)) +* Bugfix and update for AT32F415 ([#24807](https://github.com/qmk/qmk_firmware/pull/24807)) +* Fix for Chordal Hold: stuck mods when mod-taps are pressed in a stuttered sequence. ([#24878](https://github.com/qmk/qmk_firmware/pull/24878)) +* fix EEPROM driver for STM32L0/1 cat.1 devices ([#24928](https://github.com/qmk/qmk_firmware/pull/24928)) diff --git a/docs/_sidebar.json b/docs/_sidebar.json index 0b5f297018..ae4d8fe4a9 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -207,7 +207,7 @@ { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "Most Recent ChangeLog", - "link": "/ChangeLog/20241124" + "link": "/ChangeLog/20250223" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Deprecation Policy", "link": "/support_deprecation_policy" } diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md index 132c5943cc..a5a57ccd12 100644 --- a/docs/breaking_changes.md +++ b/docs/breaking_changes.md @@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch ## What has been included in past Breaking Changes? +* [2025 Feb 23](ChangeLog/20250223) * [2024 Nov 24](ChangeLog/20241124) * [2024 Aug 25](ChangeLog/20240825) -* [2024 May 26](ChangeLog/20240526) * [Older Breaking Changes](breaking_changes_history) ## When is the next Breaking Change? -The next Breaking Change is scheduled for February 23, 2025. +The next Breaking Change is scheduled for May 25, 2025. ### Important Dates -* 2024 Nov 24 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. -* 2025 Jan 26 - `develop` closed to new PRs. -* 2025 Jan 26 - Call for testers. -* 2025 Feb 9 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes -* 2025 Feb 16 - `develop` is locked, only critical bugfix PRs merged. -* 2024 Nov 21 - `master` is locked, no PRs merged. -* 2025 Feb 23 - Merge `develop` to `master`. -* 2025 Feb 23 - `master` is unlocked. PRs can be merged again. +* 2025 Feb 23 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. +* 2025 Apr 27 - `develop` closed to new PRs. +* 2025 Apr 27 - Call for testers. +* 2025 May 11 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes +* 2025 May 18 - `develop` is locked, only critical bugfix PRs merged. +* 2025 May 23 - `master` is locked, no PRs merged. +* 2025 May 25 - Merge `develop` to `master`. +* 2025 May 25 - `master` is unlocked. PRs can be merged again. ## What changes will be included? diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md index f877f42639..af8c1c04d5 100644 --- a/docs/breaking_changes_history.md +++ b/docs/breaking_changes_history.md @@ -2,6 +2,7 @@ This page links to all previous changelogs from the QMK Breaking Changes process. +* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0 * [2024 Nov 24](ChangeLog/20241124) - version 0.27.0 * [2024 Aug 25](ChangeLog/20240825) - version 0.26.0 * [2024 May 26](ChangeLog/20240526) - version 0.25.0 diff --git a/modules/qmk/hello_world/qmk_module.json b/modules/qmk/hello_world/qmk_module.json index 4f269cb4e9..fd855a6e23 100644 --- a/modules/qmk/hello_world/qmk_module.json +++ b/modules/qmk/hello_world/qmk_module.json @@ -2,6 +2,7 @@ "module_name": "Hello World", "maintainer": "QMK Maintainers", "features": { + "console": true, "deferred_exec": true }, "keycodes": [ From cdb865cf60b17593f5c811c24a21d7b3030d8653 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 28 Feb 2025 09:20:58 +1100 Subject: [PATCH 191/592] Merge point for 2025q1 breaking change. --- readme.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/readme.md b/readme.md index e5c0d41b7b..62aed12066 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,3 @@ -# THIS IS THE DEVELOP BRANCH - -Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. - # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From 312f42945daede5c46d72e58dfe44b86c7666eb1 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 28 Feb 2025 09:26:13 +1100 Subject: [PATCH 192/592] Branch point for 2025q2 breaking change. --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 62aed12066..e5c0d41b7b 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,7 @@ +# THIS IS THE DEVELOP BRANCH + +Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. + # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From 6ee806f376f2bb821c1eb724645444fbf4f5a18e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 28 Feb 2025 05:46:14 +0000 Subject: [PATCH 193/592] Implement battery level interface (#24666) Co-authored-by: Nick Brassel --- builddefs/common_features.mk | 22 ++++++++ docs/_sidebar.json | 1 + docs/drivers/battery.md | 51 +++++++++++++++++ drivers/battery/battery.c | 31 +++++++++++ drivers/battery/battery.h | 34 ++++++++++++ drivers/battery/battery_adc.c | 55 +++++++++++++++++++ drivers/battery/battery_driver.h | 29 ++++++++++ .../handwired/onekey/keymaps/battery/config.h | 6 ++ .../handwired/onekey/keymaps/battery/keymap.c | 28 ++++++++++ .../onekey/keymaps/battery/keymap.json | 7 +++ .../handwired/onekey/keymaps/battery/rules.mk | 1 + quantum/keyboard.c | 10 ++++ 12 files changed, 275 insertions(+) create mode 100644 docs/drivers/battery.md create mode 100644 drivers/battery/battery.c create mode 100644 drivers/battery/battery.h create mode 100644 drivers/battery/battery_adc.c create mode 100644 drivers/battery/battery_driver.h create mode 100644 keyboards/handwired/onekey/keymaps/battery/config.h create mode 100644 keyboards/handwired/onekey/keymaps/battery/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/battery/keymap.json create mode 100644 keyboards/handwired/onekey/keymaps/battery/rules.mk diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index c88ce36011..cbfbbcced5 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -934,6 +934,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes) endif endif +VALID_BATTERY_DRIVER_TYPES := adc custom vendor + +BATTERY_DRIVER ?= adc +ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes) + ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),) + $(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver) + endif + + OPT_DEFS += -DBATTERY_DRIVER + OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]')) + + COMMON_VPATH += $(DRIVER_PATH)/battery + + SRC += battery.c + SRC += battery_$(strip $(BATTERY_DRIVER)).c + + # add extra deps + ifeq ($(strip $(BATTERY_DRIVER)), adc) + ANALOG_DRIVER_REQUIRED = yes + endif +endif + VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor WS2812_DRIVER ?= bitbang diff --git a/docs/_sidebar.json b/docs/_sidebar.json index ae4d8fe4a9..f504f6f900 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -227,6 +227,7 @@ { "text": "ADC Driver", "link": "/drivers/adc" }, { "text": "APA102 Driver", "link": "/drivers/apa102" }, { "text": "Audio Driver", "link": "/drivers/audio" }, + { "text": "Battery Driver", "link": "/drivers/battery" }, { "text": "EEPROM Driver", "link": "/drivers/eeprom" }, { "text": "Flash Driver", "link": "/drivers/flash" }, { "text": "I2C Driver", "link": "/drivers/i2c" }, diff --git a/docs/drivers/battery.md b/docs/drivers/battery.md new file mode 100644 index 0000000000..b1f75c1156 --- /dev/null +++ b/docs/drivers/battery.md @@ -0,0 +1,51 @@ +# Battery Driver + +This driver provides support for sampling battery level. + +## Usage + +To use this driver, add the following to your `rules.mk`: + +```make +BATTERY_DRIVER_REQUIRED = yes +``` + +## Basic Configuration {#basic-configuration} + +Add the following to your `config.h`: + +|Define |Default |Description | +|--------------------------|--------|--------------------------------------------------| +|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. | + +## Driver Configuration {#driver-configuration} + +Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers. + +### ADC Driver {#adc-driver} + +This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider. + +```make +BATTERY_DRIVER = adc +``` + +The following `#define`s apply only to the `adc` driver: + +|Define |Default |Description | +|-----------------------------|--------------|--------------------------------------------------------------| +|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. | +|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. | +|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. | + +## Functions + +### `uint8_t battery_get_percent(void)` {#api-battery-get-percent} + +Sample battery level. + +#### Return Value {#api-battery-get-percent-return} + +The battery percentage, in the range 0-100. diff --git a/drivers/battery/battery.c b/drivers/battery/battery.c new file mode 100644 index 0000000000..65497399e8 --- /dev/null +++ b/drivers/battery/battery.c @@ -0,0 +1,31 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "battery_driver.h" +#include "battery.h" +#include "timer.h" + +#ifndef BATTERY_SAMPLE_INTERVAL +# define BATTERY_SAMPLE_INTERVAL 30000 +#endif + +static uint8_t last_bat_level = 100; + +void battery_init(void) { + battery_driver_init(); + + last_bat_level = battery_driver_sample_percent(); +} + +void battery_task(void) { + static uint32_t bat_timer = 0; + if (timer_elapsed32(bat_timer) > BATTERY_SAMPLE_INTERVAL) { + last_bat_level = battery_driver_sample_percent(); + + bat_timer = timer_read32(); + } +} + +uint8_t battery_get_percent(void) { + return last_bat_level; +} diff --git a/drivers/battery/battery.h b/drivers/battery/battery.h new file mode 100644 index 0000000000..831b1f07e5 --- /dev/null +++ b/drivers/battery/battery.h @@ -0,0 +1,34 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +/** + * \file + * + * \defgroup battery Battery API + * + * \brief API to query battery status. + * \{ + */ + +/** + * \brief Initialize the battery driver. + */ +void battery_init(void); + +/** + * \brief Perform housekeeping tasks. + */ +void battery_task(void); + +/** + * \brief Sample battery level. + * + * \return The battery percentage, in the range 0-100. + */ +uint8_t battery_get_percent(void); + +/** \} */ diff --git a/drivers/battery/battery_adc.c b/drivers/battery/battery_adc.c new file mode 100644 index 0000000000..cf0e69cb48 --- /dev/null +++ b/drivers/battery/battery_adc.c @@ -0,0 +1,55 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "analog.h" +#include "gpio.h" + +#ifndef BATTERY_PIN +# error("BATTERY_PIN not configured!") +#endif + +#ifndef BATTERY_REF_VOLTAGE_MV +# define BATTERY_REF_VOLTAGE_MV 3300 +#endif + +#ifndef BATTERY_VOLTAGE_DIVIDER_R1 +# define BATTERY_VOLTAGE_DIVIDER_R1 100 +#endif + +#ifndef BATTERY_VOLTAGE_DIVIDER_R2 +# define BATTERY_VOLTAGE_DIVIDER_R2 100 +#endif + +// TODO: infer from adc config? +#ifndef BATTERY_ADC_RESOLUTION +# define BATTERY_ADC_RESOLUTION 10 +#endif + +void battery_driver_init(void) { + gpio_set_pin_input(BATTERY_PIN); +} + +uint16_t battery_driver_get_mv(void) { + uint32_t raw = analogReadPin(BATTERY_PIN); + + uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION); + +#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0 + bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2; +#endif + + return bat_mv; +} + +uint8_t battery_driver_sample_percent(void) { + uint16_t bat_mv = battery_driver_get_mv(); + + // https://github.com/zmkfirmware/zmk/blob/3f7c9d7cc4f46617faad288421025ea2a6b0bd28/app/module/drivers/sensor/battery/battery_common.c#L33 + if (bat_mv >= 4200) { + return 100; + } else if (bat_mv <= 3450) { + return 0; + } + + return bat_mv * 2 / 15 - 459; +} diff --git a/drivers/battery/battery_driver.h b/drivers/battery/battery_driver.h new file mode 100644 index 0000000000..c2ee75e966 --- /dev/null +++ b/drivers/battery/battery_driver.h @@ -0,0 +1,29 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +/** + * \file + * + * \defgroup battery Battery Driver API + * + * \brief API to query battery status. + * \{ + */ + +/** + * \brief Initialize the battery driver. This function must be called only once, before any of the below functions can be called. + */ +void battery_driver_init(void); + +/** + * \brief Sample battery level. + * + * \return The battery percentage, in the range 0-100. + */ +uint8_t battery_driver_sample_percent(void); + +/** \} */ diff --git a/keyboards/handwired/onekey/keymaps/battery/config.h b/keyboards/handwired/onekey/keymaps/battery/config.h new file mode 100644 index 0000000000..8a1c05d436 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/battery/config.h @@ -0,0 +1,6 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define BATTERY_PIN ADC_PIN diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.c b/keyboards/handwired/onekey/keymaps/battery/keymap.c new file mode 100644 index 0000000000..74191e83fc --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/battery/keymap.c @@ -0,0 +1,28 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H +#include "battery.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(KC_A) +}; + +void keyboard_post_init_user(void) { + // Customise these values to desired behaviour + debug_enable=true; +// debug_matrix=false; +// debug_keyboard=true; +// debug_mouse=false; + + battery_init(); +} + +void housekeeping_task_user(void) { + static uint32_t last = 0; + if (timer_elapsed32(last) > 2000) { + uprintf("Bat: %d!\n", battery_get_percent()); + + last = timer_read32(); + } +} diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.json b/keyboards/handwired/onekey/keymaps/battery/keymap.json new file mode 100644 index 0000000000..c641dfe773 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/battery/keymap.json @@ -0,0 +1,7 @@ +{ + "config": { + "features": { + "console": true + } + } +} diff --git a/keyboards/handwired/onekey/keymaps/battery/rules.mk b/keyboards/handwired/onekey/keymaps/battery/rules.mk new file mode 100644 index 0000000000..06908179ae --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/battery/rules.mk @@ -0,0 +1 @@ +BATTERY_DRIVER_REQUIRED = yes diff --git a/quantum/keyboard.c b/quantum/keyboard.c index ad740de4b3..fccdaf2990 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -122,6 +122,9 @@ along with this program. If not, see . #ifdef SPLIT_KEYBOARD # include "split_util.h" #endif +#ifdef BATTERY_DRIVER +# include "battery.h" +#endif #ifdef BLUETOOTH_ENABLE # include "bluetooth.h" #endif @@ -522,6 +525,9 @@ void keyboard_init(void) { // init after split init pointing_device_init(); #endif +#ifdef BATTERY_DRIVER + battery_init(); +#endif #ifdef BLUETOOTH_ENABLE bluetooth_init(); #endif @@ -782,6 +788,10 @@ void keyboard_task(void) { joystick_task(); #endif +#ifdef BATTERY_DRIVER + battery_task(); +#endif + #ifdef BLUETOOTH_ENABLE bluetooth_task(); #endif From e62352e606b1dacccae8b15c825229d18d60044c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Mart=C3=ADnez?= <58857054+elpekenin@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:39:43 +0100 Subject: [PATCH 194/592] [Cleanup] Handling of optional `*.mk` files (#24952) replace check + `include` with `-include` --- builddefs/build_keyboard.mk | 41 ++++++++++--------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index c5fc9cd25d..fb07042bb7 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -97,21 +97,12 @@ endif # Pull in rules.mk files from all our subfolders -ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","") - include $(KEYBOARD_PATH_5)/rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","") - include $(KEYBOARD_PATH_4)/rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","") - include $(KEYBOARD_PATH_3)/rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","") - include $(KEYBOARD_PATH_2)/rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") - include $(KEYBOARD_PATH_1)/rules.mk -endif +-include $(KEYBOARD_PATH_5)/rules.mk +-include $(KEYBOARD_PATH_4)/rules.mk +-include $(KEYBOARD_PATH_3)/rules.mk +-include $(KEYBOARD_PATH_2)/rules.mk +-include $(KEYBOARD_PATH_1)/rules.mk + # Create dependencies on DD keyboard config - structure validated elsewhere DD_CONFIG_FILES := ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") @@ -487,21 +478,11 @@ ifneq ("$(CONVERTER)","") endif # Pull in post_rules.mk files from all our subfolders -ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","") - include $(KEYBOARD_PATH_1)/post_rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","") - include $(KEYBOARD_PATH_2)/post_rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","") - include $(KEYBOARD_PATH_3)/post_rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","") - include $(KEYBOARD_PATH_4)/post_rules.mk -endif -ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","") - include $(KEYBOARD_PATH_5)/post_rules.mk -endif +-include $(KEYBOARD_PATH_1)/post_rules.mk +-include $(KEYBOARD_PATH_2)/post_rules.mk +-include $(KEYBOARD_PATH_3)/post_rules.mk +-include $(KEYBOARD_PATH_4)/post_rules.mk +-include $(KEYBOARD_PATH_5)/post_rules.mk define post_rules_mk_community_module_includer ifneq ("$(wildcard $(1)/post_rules.mk)","") From a4d86a63f2b9a075648ac02f4e20582f418a332a Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:07:51 +0000 Subject: [PATCH 195/592] Add Mechboards Lily58 variant and common code. (#24937) * Add lily58 and common code * Apply suggestions from code review Co-authored-by: jack * Apply suggestions from code review Co-authored-by: jack --------- Co-authored-by: jack --- keyboards/mechboards/common/display_oled.c | 385 ++++++++++++++++++ keyboards/mechboards/common/post_rules.mk | 3 + keyboards/mechboards/common/rgb_effects.h | 54 +++ keyboards/mechboards/lily58/pro/config.h | 6 + keyboards/mechboards/lily58/pro/keyboard.json | 206 ++++++++++ .../lily58/pro/keymaps/default/keymap.c | 51 +++ .../lily58/pro/keymaps/default/rules.mk | 1 + keyboards/mechboards/lily58/pro/post_rules.mk | 1 + keyboards/mechboards/lily58/pro/pro.c | 15 + keyboards/mechboards/lily58/pro/readme.md | 25 ++ 10 files changed, 747 insertions(+) create mode 100644 keyboards/mechboards/common/display_oled.c create mode 100644 keyboards/mechboards/common/post_rules.mk create mode 100644 keyboards/mechboards/common/rgb_effects.h create mode 100644 keyboards/mechboards/lily58/pro/config.h create mode 100644 keyboards/mechboards/lily58/pro/keyboard.json create mode 100644 keyboards/mechboards/lily58/pro/keymaps/default/keymap.c create mode 100644 keyboards/mechboards/lily58/pro/keymaps/default/rules.mk create mode 100644 keyboards/mechboards/lily58/pro/post_rules.mk create mode 100644 keyboards/mechboards/lily58/pro/pro.c create mode 100644 keyboards/mechboards/lily58/pro/readme.md diff --git a/keyboards/mechboards/common/display_oled.c b/keyboards/mechboards/common/display_oled.c new file mode 100644 index 0000000000..fed13c22fd --- /dev/null +++ b/keyboards/mechboards/common/display_oled.c @@ -0,0 +1,385 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +static uint16_t current_keycode = 0xFF; + +static const char *depad_str(const char *depad_str, char depad_char) { + while (*depad_str == depad_char) + ++depad_str; + return depad_str; +} + +static void render_spacer(uint8_t char_length) { + static const char PROGMEM spacer_char[] = {8, 8, 8, 8, 8, 8, 8}; + if (char_length > 5) { + char_length = 5; + } + for (uint8_t i = 0; i < char_length; i++) { + oled_write_raw_P(spacer_char, sizeof(spacer_char)); + oled_advance_char(); + } +} + +__attribute__((weak)) void render_logo(void) { + static const char PROGMEM mb_logo[] = { + 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 31, 31, 31, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 227, 227, 227, 3, 227, 227, 227, 3, 227, 227, 227, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 254, 252, 255, 255, 255, 255, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 4, 4, 4, 4, 4, 255, + 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 238, 238, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 65, 65, 65, 65, 65, 255, 127, 127, 127, 127, 127, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 63, 127, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 199, 199, 199, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 224, 127, 63, + }; + oled_write_raw_P(mb_logo, sizeof(mb_logo)); +} + +void render_small_mb_logo(void) { + static const char PROGMEM small_mb_logo[] = { + 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 0, 119, 119, 119, 0, 112, 112, 112, 0, 112, 112, 112, 119, 119, 119, 0, 0, 0, 0, 0, 119, 119, 119, 0, 0, 0, 0, 0, 119, 119, 119, 0, 0, 119, 119, 119, 0, 112, 112, 112, 0, 119, 119, 119, + }; + oled_write_raw_P(small_mb_logo, sizeof(small_mb_logo)); +} + +static uint8_t last_hue; +static uint8_t last_sat; +static uint8_t last_val; +static uint8_t last_mode; + +void render_rgb_info(void) { + last_hue = rgb_matrix_get_hue(); + last_sat = rgb_matrix_get_sat(); + last_val = rgb_matrix_get_val(); + last_mode = rgb_matrix_get_mode(); + oled_set_cursor(0, 6); + oled_write("H:", false); + oled_write(depad_str(get_u16_str(last_hue, ' '), ' '), false); + oled_set_cursor(0, 7); + oled_write("S:", false); + oled_write_ln(depad_str(get_u16_str(last_sat, ' '), ' '), false); + oled_set_cursor(0, 8); + oled_write("V:", false); + oled_write_ln(depad_str(get_u16_str(last_val, ' '), ' '), false); + oled_set_cursor(0, 9); + oled_write("M:", false); + oled_write_ln(depad_str(get_u16_str(last_mode, ' '), ' '), false); +} + +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_270; + } + return rotation; +} + +char basic_codes_to_name[57] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', '#', ';', '\'', '`', ',', '.', '/'}; + +const char *keycode_string(uint16_t keycode) { + char *keycode_str; + static char key; + switch (keycode) { + case 0 ... 56: + key = pgm_read_byte(&basic_codes_to_name[keycode]); + return &key; + case KC_CAPS: + keycode_str = "Caps\0"; + break; + case KC_SCRL: + keycode_str = "Scrl\0"; + break; + case KC_PAUS: + keycode_str = "Pause\0"; + break; + case KC_DEL: + keycode_str = "Del\0"; + break; + case KC_NUM: + keycode_str = "Num\0"; + break; + case KC_MUTE: + keycode_str = "Mute\0"; + break; + case KC_VOLU: + keycode_str = "VolUp\0"; + break; + case KC_VOLD: + keycode_str = "VolD\0"; + break; + case KC_MNXT: + keycode_str = "Next\0"; + break; + case KC_MPRV: + keycode_str = "Prev\0"; + break; + case KC_MSTP: + keycode_str = "Stop\0"; + break; + case KC_MPLY: + keycode_str = "Play\0"; + break; + case QK_MODS ... QK_MODS_MAX: + keycode_str = "MOD()\0"; + break; + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + keycode_str = "MT()\0"; + break; + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + keycode_str = "LT()\0"; + break; + case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: + keycode_str = "LM()\0"; + break; + case QK_TO ... QK_TO_MAX: + keycode_str = "TO()\0"; + break; + case QK_MOMENTARY ... QK_MOMENTARY_MAX: + keycode_str = "MO()\0"; + break; + case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: + keycode_str = "DF()\0"; + break; + case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: + keycode_str = "TG()\0"; + break; + case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_MOD_MAX: + keycode_str = "1SHOT\0"; + break; + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: + keycode_str = "TT()\0"; + break; + case QK_PERSISTENT_DEF_LAYER ... QK_PERSISTENT_DEF_LAYER_MAX: + keycode_str = "PDF()\0"; + break; + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: + keycode_str = "SWAP\0"; + break; + case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: + keycode_str = "TD()\0"; + break; + case QK_MAGIC ... QK_MAGIC_MAX: + keycode_str = "Magic\0"; + break; + case QK_MIDI ... QK_MIDI_MAX: + keycode_str = "Midi\0"; + break; + case QK_SEQUENCER ... QK_SEQUENCER_MAX: + keycode_str = "Seq\0"; + break; + case QK_JOYSTICK ... QK_JOYSTICK_MAX: + keycode_str = "Joy\0"; + break; + case QK_PROGRAMMABLE_BUTTON ... QK_PROGRAMMABLE_BUTTON_MAX: + keycode_str = "Prog\0"; + break; + case QK_AUDIO ... QK_AUDIO_MAX: + keycode_str = "Audio\0"; + break; + case QK_STENO ... QK_STENO_MAX: + keycode_str = "Steno\0"; + break; + case QK_MACRO ... QK_MACRO_MAX: + keycode_str = "Macro\0"; + break; + case QK_CONNECTION ... QK_CONNECTION_MAX: + keycode_str = "Conn\0"; + break; + case QK_LIGHTING ... QK_LIGHTING_MAX: + keycode_str = "Light\0"; + break; + case QK_QUANTUM ... QK_QUANTUM_MAX: + keycode_str = "Quant\0"; + break; + case QK_KB ... QK_KB_MAX: + keycode_str = "KB\0"; + break; + case QK_USER ... QK_USER_MAX: + keycode_str = "USER\0"; + break; + case QK_UNICODEMAP ... QK_UNICODEMAP_PAIR_MAX: + keycode_str = "Uni\0"; + break; + default: + keycode_str = "Undef\0"; + break; + } + + return keycode_str; +} + +const char *layer_string(uint32_t layer) { + char *layer_str; + switch (layer) { + case 0: + layer_str = "Zero\0"; + break; + case 1: + layer_str = "One\0"; + break; + case 2: + layer_str = "Two\0"; + break; + case 3: + layer_str = "Three\0"; + break; + case 4: + layer_str = "Four\0"; + break; + case 5: + layer_str = "Five\0"; + break; + case 6: + layer_str = "Six\0"; + break; + case 7: + layer_str = "Seven\0"; + break; + default: + return get_u16_str(layer, ' '); + } + + return layer_str; +} + +bool process_detected_host_os_kb(os_variant_t detected_os) { + if (!process_detected_host_os_user(detected_os)) { + return false; + } + + oled_set_cursor(0, 10); + switch (detected_os) { + case OS_MACOS: + oled_write_ln("MacOS", false); + case OS_IOS: + oled_write_ln("Apple", false); + break; + case OS_WINDOWS: + oled_write_ln("Win", false); + break; + case OS_LINUX: + oled_write_ln("Linux", false); + break; + case OS_UNSURE: + oled_write_ln("Unkno", false); + + break; + } + + return true; +} + +void keyboard_post_init_kb(void) { + if (!is_keyboard_master()) { + render_logo(); + } else { + oled_set_cursor(0, 0); + oled_write("Layer", false); + render_spacer(5); + oled_write_ln(layer_string(get_highest_layer(layer_state)), false); + + oled_set_cursor(0, 4); + oled_write_ln("Key", false); + render_spacer(3); + oled_advance_page(false); + oled_write_ln("None", false); + + oled_set_cursor(0, 8); + oled_write_ln("OS", false); + render_spacer(2); + oled_advance_page(false); + oled_write_ln("Wait", false); + + oled_set_cursor(0, 12); + oled_write_ln("Rate", false); + render_spacer(4); + } + keyboard_post_init_user(); +} + +layer_state_t layer_state_set_kb(layer_state_t state) { + state = layer_state_set_user(state); + oled_set_cursor(0, 2); + oled_write_ln(layer_string(get_highest_layer(state)), false); + return state; +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + current_keycode = keycode; + return process_record_user(keycode, record); +}; + +uint16_t loop_rate = 0; +void housekeeping_task_kb(void) { + if (is_keyboard_master()) { + static uint32_t loop_count = 0; + static fast_timer_t loop_time = 0; + loop_count++; + if (timer_elapsed_fast(loop_time) > 1000) { + loop_time = timer_read_fast(); + loop_rate = loop_count > UINT16_MAX ? UINT16_MAX : loop_count; + loop_count = 0; + if (is_oled_on()) { + oled_set_cursor(0, 14); + oled_write(depad_str(get_u16_str(loop_rate, ' '), ' '), false); + } + } + } + if (is_oled_on() && last_input_activity_elapsed() > OLED_TIMEOUT) { + oled_off(); + } +} + +void oled_reinit_slave(void) { + oled_init(OLED_ROTATION_270); + oled_clear(); + oled_set_cursor(0, 0); + oled_write_ln("WPM", false); + render_spacer(3); + oled_advance_page(false); + oled_write_ln(depad_str(get_u16_str(get_current_wpm(), ' '), ' '), false); + + oled_set_cursor(0, 4); + oled_write_ln("RGB", false); + render_spacer(3); + render_rgb_info(); + + oled_set_cursor(0, 13); + render_small_mb_logo(); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + + static uint16_t last_keycode = 0xFF; + static bool oled_slave_init_done = false; + + if (is_keyboard_master()) { + if (last_keycode != current_keycode) { + oled_set_cursor(0, 6); + if (current_keycode < ARRAY_SIZE(basic_codes_to_name)) { + oled_write_char(basic_codes_to_name[current_keycode], false); + oled_advance_page(true); + } else { + oled_write_ln(keycode_string(current_keycode), false); + } + last_keycode = current_keycode; + } + } else { + if (!oled_slave_init_done) { + if (timer_elapsed32(0) > 5000) { + oled_slave_init_done = true; + oled_reinit_slave(); + } + } else { + static uint16_t last_wpm = 0; + if (rgb_matrix_get_hue() != last_hue || rgb_matrix_get_sat() != last_sat || rgb_matrix_get_val() != last_val || rgb_matrix_get_mode() != last_mode) { + render_rgb_info(); + } + if (last_wpm != get_current_wpm()) { + last_wpm = get_current_wpm(); + oled_set_cursor(0, 2); + oled_write_ln(depad_str(get_u16_str(last_wpm, ' '), ' '), false); + } + } + } + + return false; +} diff --git a/keyboards/mechboards/common/post_rules.mk b/keyboards/mechboards/common/post_rules.mk new file mode 100644 index 0000000000..69bbbab9d0 --- /dev/null +++ b/keyboards/mechboards/common/post_rules.mk @@ -0,0 +1,3 @@ +ifeq ($(strip $(OLED_ENABLE)), yes) + SRC += keyboards/mechboards/common/display_oled.c +endif diff --git a/keyboards/mechboards/common/rgb_effects.h b/keyboards/mechboards/common/rgb_effects.h new file mode 100644 index 0000000000..8763d2a007 --- /dev/null +++ b/keyboards/mechboards/common/rgb_effects.h @@ -0,0 +1,54 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#ifdef CONVERTER_ENABLED +# define ENABLE_RGB_MATRIX_ALPHA_MODS +# define ENABLE_RGB_MATRIX_BREATHING +# define ENABLE_RGB_MATRIX_COLORBAND_PINWHEEL_SAT +# define ENABLE_RGB_MATRIX_COLORBAND_PINWHEEL_VAL +# define ENABLE_RGB_MATRIX_COLORBAND_SAT +# define ENABLE_RGB_MATRIX_COLORBAND_SPIRIAL_SAT +# define ENABLE_RGB_MATRIX_COLORBAND_SPIRIAL_VAL +# define ENABLE_RGB_MATRIX_COLORBAND_VAL +# define ENABLE_RGB_MATRIX_CYCLE_ALL +# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN +# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +# define ENABLE_RGB_MATRIX_DIGITAL_RAIN +# define ENABLE_RGB_MATRIX_DUAL_BEACON +# define ENABLE_RGB_MATRIX_FLOWER_BLOOMING +# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +# define ENABLE_RGB_MATRIX_HUE_BREATHING +# define ENABLE_RGB_MATRIX_HUE_PENDULUM +# define ENABLE_RGB_MATRIX_HUE_WAVE +# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +# define ENABLE_RGB_MATRIX_PIXEL_FLOW +# define ENABLE_RGB_MATRIX_PIXEL_FRACTAL +# define ENABLE_RGB_MATRIX_PIXEL_RAIN +# define ENABLE_RGB_MATRIX_RAINBOW_BEACON +# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +# define ENABLE_RGB_MATRIX_RAINDROPS +# define ENABLE_RGB_MATRIX_RIVERFLOW +# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +# define ENABLE_RGB_MATRIX_SOLID_SPLASH +# define ENABLE_RGB_MATRIX_SPLASH +# define ENABLE_RGB_MATRIX_STARLIGHT +# define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE +# define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT +# define ENABLE_RGB_MATRIX_TYPING_HEATMAP +#endif diff --git a/keyboards/mechboards/lily58/pro/config.h b/keyboards/mechboards/lily58/pro/config.h new file mode 100644 index 0000000000..43a4b3eb9f --- /dev/null +++ b/keyboards/mechboards/lily58/pro/config.h @@ -0,0 +1,6 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "keyboards/mechboards/common/rgb_effects.h" diff --git a/keyboards/mechboards/lily58/pro/keyboard.json b/keyboards/mechboards/lily58/pro/keyboard.json new file mode 100644 index 0000000000..d655377f19 --- /dev/null +++ b/keyboards/mechboards/lily58/pro/keyboard.json @@ -0,0 +1,206 @@ +{ + "manufacturer": "Mechboards", + "keyboard_name": "Lily58 Pro", + "maintainer": "dasky", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "F5", "pin_b": "F4"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "os_detection": true, + "rgb_matrix": true, + "wpm": true + }, + "matrix_pins": { + "cols": ["F6", "F7", "B1", "B3", "B2", "B6"], + "rows": ["C6", "D7", "E6", "B4", "B5"] + }, + "rgb_matrix": { + "animations": { + "cycle_left_right": true + }, + "default": { + "animation": "cycle_left_right" + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4}, + {"matrix": [0, 4], "x": 58, "y": 2, "flags": 4}, + {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 29, "y": 2, "flags": 4}, + {"matrix": [0, 1], "x": 14, "y": 6, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 8, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 23, "flags": 4}, + {"matrix": [1, 1], "x": 14, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 29, "y": 17, "flags": 4}, + {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 58, "y": 17, "flags": 4}, + {"matrix": [1, 5], "x": 72, "y": 19, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 34, "flags": 4}, + {"matrix": [2, 4], "x": 58, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4}, + {"matrix": [2, 2], "x": 29, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 14, "y": 36, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 38, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 53, "flags": 4}, + {"matrix": [3, 1], "x": 14, "y": 51, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 47, "flags": 4}, + {"matrix": [3, 3], "x": 43, "y": 45, "flags": 4}, + {"matrix": [3, 4], "x": 58, "y": 47, "flags": 4}, + {"matrix": [3, 5], "x": 72, "y": 49, "flags": 4}, + {"matrix": [4, 5], "x": 87, "y": 41, "flags": 4}, + {"matrix": [4, 4], "x": 87, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 65, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 51, "y": 62, "flags": 4}, + {"matrix": [4, 1], "x": 36, "y": 62, "flags": 4}, + {"x": 96, "y": 64, "flags": 2}, + {"x": 32, "y": 64, "flags": 2}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 0, "y": 32, "flags": 2}, + {"x": 16, "y": 0, "flags": 2}, + {"x": 50, "y": 0, "flags": 2}, + {"x": 80, "y": 0, "flags": 2}, + {"x": 96, "y": 32, "flags": 2}, + {"matrix": [5, 5], "x": 152, "y": 4, "flags": 4}, + {"matrix": [5, 4], "x": 166, "y": 2, "flags": 4}, + {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 195, "y": 2, "flags": 4}, + {"matrix": [5, 1], "x": 210, "y": 6, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 8, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 23, "flags": 4}, + {"matrix": [6, 1], "x": 210, "y": 21, "flags": 4}, + {"matrix": [6, 2], "x": 195, "y": 17, "flags": 4}, + {"matrix": [6, 3], "x": 181, "y": 15, "flags": 4}, + {"matrix": [6, 4], "x": 166, "y": 17, "flags": 4}, + {"matrix": [6, 5], "x": 152, "y": 19, "flags": 4}, + {"matrix": [7, 5], "x": 152, "y": 34, "flags": 4}, + {"matrix": [7, 4], "x": 166, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 181, "y": 30, "flags": 4}, + {"matrix": [7, 2], "x": 195, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 210, "y": 36, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 38, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 53, "flags": 4}, + {"matrix": [8, 1], "x": 210, "y": 51, "flags": 4}, + {"matrix": [8, 2], "x": 195, "y": 47, "flags": 4}, + {"matrix": [8, 3], "x": 181, "y": 45, "flags": 4}, + {"matrix": [8, 4], "x": 166, "y": 47, "flags": 4}, + {"matrix": [8, 5], "x": 152, "y": 49, "flags": 4}, + {"matrix": [9, 5], "x": 137, "y": 41, "flags": 4}, + {"matrix": [9, 4], "x": 137, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 159, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 173, "y": 62, "flags": 4}, + {"matrix": [9, 1], "x": 188, "y": 62, "flags": 4}, + {"x": 128, "y": 64, "flags": 2}, + {"x": 192, "y": 64, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 224, "y": 32, "flags": 2}, + {"x": 206, "y": 0, "flags": 2}, + {"x": 150, "y": 0, "flags": 2}, + {"x": 140, "y": 0, "flags": 2}, + {"x": 128, "y": 32, "flags": 2} + ], + "max_brightness": 120, + "sleep": true, + "split_count": [37, 37] + }, + "rgblight": { + "max_brightness": 120 + }, + "split": { + "enabled": true, + "serial": { + "pin": "D2" + }, + "transport": { + "sync": { + "matrix_state": true, + "oled": true, + "wpm": true + } + } + }, + "url": "mechboards.co.uk", + "usb": { + "device_version": "1.0.0", + "pid": "0x0002", + "vid": "0x7171" + }, + "ws2812": { + "pin": "D3" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.5}, + {"matrix": [0, 1], "x": 1, "y": 0.375}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [5, 5], "x": 10.5, "y": 0.25}, + {"matrix": [5, 4], "x": 11.5, "y": 0.125}, + {"matrix": [5, 3], "x": 12.5, "y": 0}, + {"matrix": [5, 2], "x": 13.5, "y": 0.125}, + {"matrix": [5, 1], "x": 14.5, "y": 0.375}, + {"matrix": [5, 0], "x": 15.5, "y": 0.5}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.375}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [6, 5], "x": 10.5, "y": 1.25}, + {"matrix": [6, 4], "x": 11.5, "y": 1.125}, + {"matrix": [6, 3], "x": 12.5, "y": 1}, + {"matrix": [6, 2], "x": 13.5, "y": 1.125}, + {"matrix": [6, 1], "x": 14.5, "y": 1.375}, + {"matrix": [6, 0], "x": 15.5, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5}, + {"matrix": [2, 1], "x": 1, "y": 2.375}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.25}, + {"matrix": [7, 5], "x": 10.5, "y": 2.25}, + {"matrix": [7, 4], "x": 11.5, "y": 2.125}, + {"matrix": [7, 3], "x": 12.5, "y": 2}, + {"matrix": [7, 2], "x": 13.5, "y": 2.125}, + {"matrix": [7, 1], "x": 14.5, "y": 2.375}, + {"matrix": [7, 0], "x": 15.5, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5}, + {"matrix": [3, 1], "x": 1, "y": 3.375}, + {"matrix": [3, 2], "x": 2, "y": 3.125}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3.125}, + {"matrix": [3, 5], "x": 5, "y": 3.25}, + {"matrix": [4, 5], "x": 6, "y": 2.75}, + {"matrix": [9, 5], "x": 9.5, "y": 2.75}, + {"matrix": [8, 5], "x": 10.5, "y": 3.25}, + {"matrix": [8, 4], "x": 11.5, "y": 3.125}, + {"matrix": [8, 3], "x": 12.5, "y": 3}, + {"matrix": [8, 2], "x": 13.5, "y": 3.125}, + {"matrix": [8, 1], "x": 14.5, "y": 3.375}, + {"matrix": [8, 0], "x": 15.5, "y": 3.5}, + {"matrix": [4, 1], "x": 2.5, "y": 4.125}, + {"matrix": [4, 2], "x": 3.5, "y": 4.15}, + {"matrix": [4, 3], "x": 4.5, "y": 4.25}, + {"matrix": [4, 4], "x": 6, "y": 4.25, "h": 1.5}, + {"matrix": [9, 4], "x": 9.5, "y": 4.25, "h": 1.5}, + {"matrix": [9, 3], "x": 11, "y": 4.25}, + {"matrix": [9, 2], "x": 12, "y": 4.15}, + {"matrix": [9, 1], "x": 13, "y": 4.15} + ] + } + } +} diff --git a/keyboards/mechboards/lily58/pro/keymaps/default/keymap.c b/keyboards/mechboards/lily58/pro/keymaps/default/keymap.c new file mode 100644 index 0000000000..6c23650b05 --- /dev/null +++ b/keyboards/mechboards/lily58/pro/keymaps/default/keymap.c @@ -0,0 +1,51 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [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_GRV, + 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_BSPC, KC_RGUI +), + +[1] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, + 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_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, _______, _______, _______, _______, MO(3), _______, _______ +), + + +[2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, _______, MO(3), _______, _______, _______, _______, _______ +), + + [3] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, + [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, + [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)} +}; +#endif +// clang-format on diff --git a/keyboards/mechboards/lily58/pro/keymaps/default/rules.mk b/keyboards/mechboards/lily58/pro/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/mechboards/lily58/pro/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/mechboards/lily58/pro/post_rules.mk b/keyboards/mechboards/lily58/pro/post_rules.mk new file mode 100644 index 0000000000..4bfdc8ca89 --- /dev/null +++ b/keyboards/mechboards/lily58/pro/post_rules.mk @@ -0,0 +1 @@ +include keyboards/mechboards/common/post_rules.mk diff --git a/keyboards/mechboards/lily58/pro/pro.c b/keyboards/mechboards/lily58/pro/pro.c new file mode 100644 index 0000000000..34c1f6409e --- /dev/null +++ b/keyboards/mechboards/lily58/pro/pro.c @@ -0,0 +1,15 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE +void render_logo(void) { + static const char PROGMEM pro_logo[] = { + 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 31, 31, 31, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 252, 0, 0, 0, 248, 248, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 248, 24, 24, 24, 24, 24, 24, 0, 0, 240, 248, 24, 24, 24, 24, 24, 248, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 4, 4, 4, 4, 4, 255, + 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 255, 255, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 249, 249, 0, 0, 255, 255, 0, 0, 248, 248, 0, 0, 0, 0, 248, 248, 0, 0, 7, 7, 6, 6, 6, 6, 254, 252, 0, 0, 251, 255, 6, 6, 6, 6, 6, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 65, 65, 65, 65, 65, 255, 127, 127, 127, 127, 127, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 0, 3, 3, 0, 0, 131, 131, 131, 131, 131, 131, + 255, 255, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 3, 225, 240, 48, 176, 176, 112, 240, 48, 176, 176, 112, 240, 112, 176, 176, 112, 240, 224, 0, 0, 63, 127, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 255, 255, 127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 63, 48, 61, 61, 62, 63, 48, 61, 61, 50, 63, 56, 55, 55, 56, 63, 31, 0, 0, + }; + oled_write_raw_P(pro_logo, sizeof(pro_logo)); +} +#endif diff --git a/keyboards/mechboards/lily58/pro/readme.md b/keyboards/mechboards/lily58/pro/readme.md new file mode 100644 index 0000000000..9ec83c2800 --- /dev/null +++ b/keyboards/mechboards/lily58/pro/readme.md @@ -0,0 +1,25 @@ +# Lily58 Pro + +A refreshed Lily58 PCB with RGB, battery, power switch and encoder support. + +* Keyboard Maintainer: [dasky](https://github.com/daskygit) +* Hardware Supported: Controllers using promicro footprint. +* Hardware Availability: https://mechboards.co.uk + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb mechboards/lily58/pro -km default + +Flashing example for this keyboard: + + qmk flash -kb mechboards/lily58/pro -km default + +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 top left key (for left half) or top right key (for right half) when plugging in USB. +* **Physical reset button**: Briefly double press the button below the TRRS socket. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From e0e96c2a755cf957ab684c9ad414ab1b19fe3372 Mon Sep 17 00:00:00 2001 From: Danny Date: Sat, 1 Mar 2025 15:47:16 -0500 Subject: [PATCH 196/592] Add Handwired Cherry Protype (#24806) * Add handwired Cherry Protype * Fix instructions * Replace tabs with spaces Co-authored-by: Drashna Jaelre * Update keyboards/handwired/protype/keyboard.json Co-authored-by: Drashna Jaelre --------- Co-authored-by: Drashna Jaelre --- keyboards/handwired/protype/keyboard.json | 104 ++++++++++++++++++ .../protype/keymaps/default/keymap.c | 15 +++ keyboards/handwired/protype/readme.md | 26 +++++ 3 files changed, 145 insertions(+) create mode 100644 keyboards/handwired/protype/keyboard.json create mode 100644 keyboards/handwired/protype/keymaps/default/keymap.c create mode 100644 keyboards/handwired/protype/readme.md diff --git a/keyboards/handwired/protype/keyboard.json b/keyboards/handwired/protype/keyboard.json new file mode 100644 index 0000000000..69f196abc4 --- /dev/null +++ b/keyboards/handwired/protype/keyboard.json @@ -0,0 +1,104 @@ +{ + "manufacturer": "Cherry", + "keyboard_name": "Protype Display Typewriter", + "maintainer": "nooges", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "rows": ["GP29", "GP28", "GP27", "GP26", "GP22", "GP20", "GP23", "GP21"], + "cols": ["GP12", "GP9", "GP10", "GP0", "GP1", "GP5", "GP6", "GP2", "GP3", "GP4"] + }, + "processor": "RP2040", + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0xB7D7", + "vid": "0x046A" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "label": "F1", "matrix": [0, 0], "w": 1.5, "x": 0, "y": 0 }, + { "label": "F2", "matrix": [0, 1], "w": 1.5, "x": 1.5, "y": 0 }, + { "label": "`", "matrix": [0, 2], "x": 3.5, "y": 0 }, + { "label": "1", "matrix": [0, 3], "x": 4.5, "y": 0 }, + { "label": "2", "matrix": [0, 4], "x": 5.5, "y": 0 }, + { "label": "3", "matrix": [0, 5], "x": 6.5, "y": 0 }, + { "label": "4", "matrix": [0, 6], "x": 7.5, "y": 0 }, + { "label": "5", "matrix": [0, 7], "x": 8.5, "y": 0 }, + { "label": "6", "matrix": [0, 8], "x": 9.5, "y": 0 }, + { "label": "7", "matrix": [0, 9], "x": 10.5, "y": 0 }, + { "label": "8", "matrix": [4, 8], "x": 11.5, "y": 0 }, + { "label": "9", "matrix": [4, 7], "x": 12.5, "y": 0 }, + { "label": "0", "matrix": [4, 6], "x": 13.5, "y": 0 }, + { "label": "-", "matrix": [4, 5], "x": 14.5, "y": 0 }, + { "label": "=", "matrix": [4, 4], "x": 15.5, "y": 0 }, + { "label": "Backspace", "matrix": [4, 3], "w": 2, "x": 16.5, "y": 0 }, + { "label": "Pg Up", "matrix": [4, 2], "x": 18.5, "y": 0 }, + { "label": "F8", "matrix": [4, 1], "w": 1.5, "x": 20, "y": 0 }, + { "label": "F9", "matrix": [4, 0], "w": 1.5, "x": 21.5, "y": 0 }, + { "label": "F3", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 }, + { "label": "F4", "matrix": [1, 1], "w": 1.5, "x": 1.5, "y": 1 }, + { "label": "Tab", "matrix": [1, 2], "w": 1.5, "x": 3.5, "y": 1 }, + { "label": "Q", "matrix": [1, 3], "x": 5, "y": 1 }, + { "label": "W", "matrix": [1, 4], "x": 6, "y": 1 }, + { "label": "E", "matrix": [1, 5], "x": 7, "y": 1 }, + { "label": "R", "matrix": [1, 6], "x": 8, "y": 1 }, + { "label": "T", "matrix": [1, 7], "x": 9, "y": 1 }, + { "label": "Y", "matrix": [1, 8], "x": 10, "y": 1 }, + { "label": "U", "matrix": [5, 9], "x": 11, "y": 1 }, + { "label": "I", "matrix": [5, 8], "x": 12, "y": 1 }, + { "label": "O", "matrix": [5, 7], "x": 13, "y": 1 }, + { "label": "P", "matrix": [5, 6], "x": 14, "y": 1 }, + { "label": "[", "matrix": [5, 5], "x": 15, "y": 1 }, + { "label": "]", "matrix": [5, 4], "x": 16, "y": 1 }, + { "label": "\\", "matrix": [5, 3], "w": 1.5, "x": 17, "y": 1 }, + { "label": "Pg Dn", "matrix": [5, 2], "x": 18.5, "y": 1 }, + { "label": "F10", "matrix": [5, 1], "w": 1.5, "x": 20, "y": 1 }, + { "label": "F11", "matrix": [5, 0], "w": 1.5, "x": 21.5, "y": 1 }, + { "label": "F5", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 2 }, + { "label": "F6", "matrix": [2, 1], "w": 1.5, "x": 1.5, "y": 2 }, + { "label": "Caps Lock", "matrix": [2, 2], "w": 1.75, "x": 3.5, "y": 2 }, + { "label": "A", "matrix": [2, 3], "x": 5.25, "y": 2 }, + { "label": "S", "matrix": [2, 4], "x": 6.25, "y": 2 }, + { "label": "D", "matrix": [2, 5], "x": 7.25, "y": 2 }, + { "label": "F", "matrix": [2, 6], "x": 8.25, "y": 2 }, + { "label": "G", "matrix": [2, 7], "x": 9.25, "y": 2 }, + { "label": "H", "matrix": [2, 8], "x": 10.25, "y": 2 }, + { "label": "J", "matrix": [2, 9], "x": 11.25, "y": 2 }, + { "label": "K", "matrix": [6, 8], "x": 12.25, "y": 2 }, + { "label": "L", "matrix": [6, 7], "x": 13.25, "y": 2 }, + { "label": ";", "matrix": [6, 6], "x": 14.25, "y": 2 }, + { "label": "'", "matrix": [6, 5], "x": 15.25, "y": 2 }, + { "label": "Enter", "matrix": [6, 4], "w": 2.25, "x": 16.25, "y": 2 }, + { "label": "Up", "matrix": [6, 2], "x": 18.5, "y": 2 }, + { "label": "F12", "matrix": [6, 1], "w": 1.5, "x": 20, "y": 2 }, + { "label": "F13", "matrix": [6, 0], "w": 1.5, "x": 21.5, "y": 2 }, + { "label": "F7", "matrix": [3, 0], "w": 3, "x": 0, "y": 3 }, + { "label": "Ctrl", "matrix": [3, 2], "x": 3.5, "y": 3 }, + { "label": "Shift", "matrix": [3, 3], "w": 1.25, "x": 4.5, "y": 3 }, + { "label": "Z", "matrix": [3, 4], "x": 5.75, "y": 3 }, + { "label": "X", "matrix": [3, 5], "x": 6.75, "y": 3 }, + { "label": "C", "matrix": [3, 6], "x": 7.75, "y": 3 }, + { "label": "V", "matrix": [3, 7], "x": 8.75, "y": 3 }, + { "label": "B", "matrix": [3, 8], "x": 9.75, "y": 3 }, + { "label": "N", "matrix": [7, 9], "x": 10.75, "y": 3 }, + { "label": "M", "matrix": [7, 8], "x": 11.75, "y": 3 }, + { "label": ",", "matrix": [7, 7], "x": 12.75, "y": 3 }, + { "label": ".", "matrix": [7, 6], "x": 13.75, "y": 3 }, + { "label": "/", "matrix": [7, 5], "x": 14.75, "y": 3 }, + { "label": "Shift", "matrix": [7, 4], "w": 2.75, "x": 15.75, "y": 3 }, + { "label": "Down", "matrix": [7, 2], "x": 18.5, "y": 3 }, + { "label": "F14", "matrix": [7, 1], "w": 1.5, "x": 20, "y": 3 }, + { "label": "F15", "matrix": [7, 0], "w": 1.5, "x": 21.5, "y": 3 }, + { "matrix": [3, 1], "w": 9, "x": 6.75, "y": 4 } + ] + } + } +} diff --git a/keyboards/handwired/protype/keymaps/default/keymap.c b/keyboards/handwired/protype/keymaps/default/keymap.c new file mode 100644 index 0000000000..a8c41d9f7d --- /dev/null +++ b/keyboards/handwired/protype/keymaps/default/keymap.c @@ -0,0 +1,15 @@ +// Copyright 2025 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_F1, KC_F2, 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_PGUP, KC_F8, KC_F9, + KC_F3, KC_F4, 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_PGDN, KC_F10, KC_F11, + KC_F5, KC_F6, 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_UP, KC_F12, KC_F13, + KC_F7, KC_LCTL, 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_DOWN, KC_F14, KC_F15, + KC_SPC + ) +}; diff --git a/keyboards/handwired/protype/readme.md b/keyboards/handwired/protype/readme.md new file mode 100644 index 0000000000..678ab2b888 --- /dev/null +++ b/keyboards/handwired/protype/readme.md @@ -0,0 +1,26 @@ +# Cherry Protype Display Typewriter + +![handwired/protype](https://i.imgur.com/hcFikid.jpeg) + +Handwired RP2040 Pro Micro (Community Edition) on Cherry Protype Display Typewriter PCB. + +* Keyboard Maintainer: [nooges](https://github.com/nooges) +* Hardware Supported: RP2040 Pro Micro Controller + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb handwired/protype -km default + +Flashing example for this keyboard: + + qmk flash -kb handwired/protype -km default + +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**: Hold the Boot button on the microcontroller and then press Reset +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 88d1f61f10d75b4c49c0185478c9310cf89f5f0e Mon Sep 17 00:00:00 2001 From: arcmags Date: Sat, 1 Mar 2025 14:48:11 -0600 Subject: [PATCH 197/592] Add `tkl_f13_ansi_tsangan` community layout to novelkeys/nk87* (#24730) * missing LAYOUTS added to novelkeys/nk87*/rules.mk * Revert "missing LAYOUTS added to novelkeys/nk87*/rules.mk" This reverts commit 43917bfc3638ebde58bc8c2b6b8cbc477343b646. * missing community layouts added to novelkeys/nk87*/keyboard.json --- keyboards/novelkeys/nk87/keyboard.json | 1 + keyboards/novelkeys/nk87b/keyboard.json | 1 + 2 files changed, 2 insertions(+) diff --git a/keyboards/novelkeys/nk87/keyboard.json b/keyboards/novelkeys/nk87/keyboard.json index 9573ff4c9c..8b7f8fed4d 100755 --- a/keyboards/novelkeys/nk87/keyboard.json +++ b/keyboards/novelkeys/nk87/keyboard.json @@ -22,6 +22,7 @@ "processor": "STM32F303", "bootloader": "stm32-dfu", "board": "QMK_PROTON_C", + "community_layouts": ["tkl_f13_ansi_tsangan"], "layout_aliases": { "LAYOUT_all": "LAYOUT_tkl_f13_ansi_tsangan" }, diff --git a/keyboards/novelkeys/nk87b/keyboard.json b/keyboards/novelkeys/nk87b/keyboard.json index f81793acee..563f502aae 100755 --- a/keyboards/novelkeys/nk87b/keyboard.json +++ b/keyboards/novelkeys/nk87b/keyboard.json @@ -80,6 +80,7 @@ }, "processor": "STM32F072", "bootloader": "stm32-dfu", + "community_layouts": ["tkl_f13_ansi_tsangan"], "layout_aliases": { "LAYOUT_all": "LAYOUT_tkl_f13_ansi_tsangan" }, From a3a3af118426edc7e6650f62e03633a0e0cf8ad4 Mon Sep 17 00:00:00 2001 From: telybelly <136142585+telybelly@users.noreply.github.com> Date: Sun, 2 Mar 2025 04:59:52 +0800 Subject: [PATCH 198/592] Add Janky No.9 (#24910) * Add Janky No.9 Add Janky No.9 * Update readme.md * Update keyboard.json updated as per waffle87 suggestions, and run qmk format-json * Apply suggestions from code review updated as per suggestions from zvecr Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- keyboards/jankycaps/janky9/keyboard.json | 40 +++++++++++++++++++ .../jankycaps/janky9/keymaps/default/keymap.c | 25 ++++++++++++ keyboards/jankycaps/janky9/readme.md | 27 +++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 keyboards/jankycaps/janky9/keyboard.json create mode 100644 keyboards/jankycaps/janky9/keymaps/default/keymap.c create mode 100644 keyboards/jankycaps/janky9/readme.md diff --git a/keyboards/jankycaps/janky9/keyboard.json b/keyboards/jankycaps/janky9/keyboard.json new file mode 100644 index 0000000000..73116a5cb8 --- /dev/null +++ b/keyboards/jankycaps/janky9/keyboard.json @@ -0,0 +1,40 @@ +{ + "manufacturer": "jankycaps", + "keyboard_name": "Janky No.9", + "maintainer": "telybelly", + "development_board": "promicro", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "direct": [ + ["F4", "F5", "F6"], + ["F7", "B1", "B3"], + ["B2", "B6", "B5"] + ] + }, + "url": "https://anky.studio/", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x4E4B" + }, + "community_layouts": ["ortho_3x3"], + "layouts": { + "LAYOUT_ortho_3x3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"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/jankycaps/janky9/keymaps/default/keymap.c b/keyboards/jankycaps/janky9/keymaps/default/keymap.c new file mode 100644 index 0000000000..2a04817a90 --- /dev/null +++ b/keyboards/jankycaps/janky9/keymaps/default/keymap.c @@ -0,0 +1,25 @@ +/* Copyright 2025 + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_3x3( + KC_1, KC_2, KC_3, + KC_4, KC_5, KC_6, + KC_7, KC_8, KC_9 + ), +}; diff --git a/keyboards/jankycaps/janky9/readme.md b/keyboards/jankycaps/janky9/readme.md new file mode 100644 index 0000000000..b97fd0f078 --- /dev/null +++ b/keyboards/jankycaps/janky9/readme.md @@ -0,0 +1,27 @@ +# Janky No.9 + +![Janky No.9](https://i.imgur.com/hkEorpO.jpeg) + +*A Handmade 3x3 Macropad* + +* Keyboard Maintainer: [telybelly](https://github.com/telybelly) +* Hardware Supported: Janky No.9 +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + + make jankycaps/janky9:default + +Flashing example for this keyboard: + + make jankycaps/janky9: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**: Quickly short the RST and GND pads on the PCB twice +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 0419cd2eed96157ff47d340c5f20ca7f46787848 Mon Sep 17 00:00:00 2001 From: Eric Banker Date: Sat, 1 Mar 2025 13:01:30 -0800 Subject: [PATCH 199/592] [Docs] Fix example code in quantum_painter.md (#24897) https://github.com/qmk/qmk_firmware/issues/24896 --- docs/quantum_painter.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/quantum_painter.md b/docs/quantum_painter.md index 782d496ff7..bbe8944516 100644 --- a/docs/quantum_painter.md +++ b/docs/quantum_painter.md @@ -884,7 +884,7 @@ static painter_image_handle_t my_image; void keyboard_post_init_kb(void) { my_image = qp_load_image_mem(gfx_my_image); if (my_image != NULL) { - qp_drawimage(display, (239 - my_image->width), (319 - my_image->height), my_image); + qp_drawimage(display, (240 - my_image->width), (320 - my_image->height), my_image); } } ``` @@ -909,7 +909,7 @@ static deferred_token my_anim; void keyboard_post_init_kb(void) { my_image = qp_load_image_mem(gfx_my_image); if (my_image != NULL) { - my_anim = qp_animate(display, (239 - my_image->width), (319 - my_image->height), my_image); + my_anim = qp_animate(display, (240 - my_image->width), (320 - my_image->height), my_image); } } ``` @@ -1001,7 +1001,7 @@ void keyboard_post_init_kb(void) { if (my_font != NULL) { static const char *text = "Hello from QMK!"; int16_t width = qp_textwidth(my_font, text); - qp_drawtext(display, (239 - width), (319 - my_font->line_height), my_font, text); + qp_drawtext(display, (240 - width), (320 - my_font->line_height), my_font, text); } } ``` From 516fa90f991f95edc005b823e59fdfa789e8dfeb Mon Sep 17 00:00:00 2001 From: era <73109780+eerraa@users.noreply.github.com> Date: Sun, 2 Mar 2025 06:25:26 +0900 Subject: [PATCH 200/592] Add Chickpad (#24895) * Add ChickPad Add ChickPad * Add Chickpad Add Chickpad * Add PCB image Add PCB image * Update keyboards/era/sirind/chickpad/keyboard.json Co-authored-by: Joel Challis * Update keyboards/era/sirind/chickpad/config.h Co-authored-by: jack <0x6a73@protonmail.com> * Update keyboards/era/sirind/chickpad/keymaps/default/keymap.c Co-authored-by: jack <0x6a73@protonmail.com> * Update keyboards/era/sirind/chickpad/readme.md Co-authored-by: jack <0x6a73@protonmail.com> --------- Co-authored-by: Joel Challis Co-authored-by: jack --- keyboards/era/sirind/chickpad/config.h | 8 ++ keyboards/era/sirind/chickpad/keyboard.json | 120 ++++++++++++++++++ .../sirind/chickpad/keymaps/default/keymap.c | 13 ++ keyboards/era/sirind/chickpad/readme.md | 25 ++++ 4 files changed, 166 insertions(+) create mode 100644 keyboards/era/sirind/chickpad/config.h create mode 100644 keyboards/era/sirind/chickpad/keyboard.json create mode 100644 keyboards/era/sirind/chickpad/keymaps/default/keymap.c create mode 100644 keyboards/era/sirind/chickpad/readme.md diff --git a/keyboards/era/sirind/chickpad/config.h b/keyboards/era/sirind/chickpad/config.h new file mode 100644 index 0000000000..4a8c7d1a6b --- /dev/null +++ b/keyboards/era/sirind/chickpad/config.h @@ -0,0 +1,8 @@ +// Copyright 2024 Hyojin Bak (@eerraa) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Reset */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/era/sirind/chickpad/keyboard.json b/keyboards/era/sirind/chickpad/keyboard.json new file mode 100644 index 0000000000..fe76df006d --- /dev/null +++ b/keyboards/era/sirind/chickpad/keyboard.json @@ -0,0 +1,120 @@ +{ + "manufacturer": "SIRIND", + "keyboard_name": "ChickPad", + "maintainer": "eerraa", + "bootloader": "rp2040", + "build": { + "debounce_type": "sym_defer_pk" + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP23", "GP25", "GP3", "GP5", "GP4"], + "rows": ["GP18", "GP24", "GP22"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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 + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 56, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 168, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 224, "y": 16, "flags": 1}, + {"matrix": [1, 3], "x": 168, "y": 32, "flags": 4}, + {"matrix": [1, 2], "x": 112, "y": 32, "flags": 4}, + {"matrix": [1, 1], "x": 56, "y": 32, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 28, "y": 64, "flags": 1}, + {"matrix": [2, 2], "x": 112, "y": 64, "flags": 4}, + {"matrix": [2, 3], "x": 168, "y": 64, "flags": 4}, + {"matrix": [2, 4], "x": 224, "y": 64, "flags": 4} + ], + "sleep": true + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0015", + "vid": "0x4552" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP19" + }, + "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.25, "y": 0, "w": 1.25, "h": 2}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.25}, + {"matrix": [1, 1], "x": 1.25, "y": 1}, + {"matrix": [1, 2], "x": 2.25, "y": 1}, + {"matrix": [1, 3], "x": 3.25, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 2.25}, + {"matrix": [2, 2], "x": 2.25, "y": 2}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2} + ] + } + } +} diff --git a/keyboards/era/sirind/chickpad/keymaps/default/keymap.c b/keyboards/era/sirind/chickpad/keymaps/default/keymap.c new file mode 100644 index 0000000000..a208c4866c --- /dev/null +++ b/keyboards/era/sirind/chickpad/keymaps/default/keymap.c @@ -0,0 +1,13 @@ +// Copyright 2024 QMK (@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_ENT , + KC_LSFT, KC_VOLU, KC_VOLD, KC_UP , + KC_SPC , KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/era/sirind/chickpad/readme.md b/keyboards/era/sirind/chickpad/readme.md new file mode 100644 index 0000000000..fd6ad72d4f --- /dev/null +++ b/keyboards/era/sirind/chickpad/readme.md @@ -0,0 +1,25 @@ +# ChickPad Unified + +![Chickpad](https://i.imgur.com/RAH7dyl.jpeg) + +* Keyboard Maintainer: [ERA](https://github.com/eerraa) +* Hardware supported: Chickpad PCB w/ RP2040 +* Hardware availability: [Syryan](https://srind.mysoho.com/) + +Make example for this keyboard (after setting up your build environment): + + make era/sirind/chickpad:default + +Flashing example for this keyboard: + + make era/sirind/chickpad: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 ESC(0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly short the `RESET` and `GND` pads on the SWD header twice, or short the `BOOT` header and plug in keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 655bf4008a1f04adebec0cdf1c67705a952fb20f Mon Sep 17 00:00:00 2001 From: suikagiken <115451678+suikagiken@users.noreply.github.com> Date: Sun, 2 Mar 2025 06:50:10 +0900 Subject: [PATCH 201/592] Add keyboard suika15tone (#24947) * Add keyboard suika15tone * Update keyboards/suikagiken/suika15tone/keyboard.json Co-authored-by: Drashna Jaelre --------- Co-authored-by: Drashna Jaelre --- keyboards/suikagiken/suika15tone/config.h | 5 ++ .../suikagiken/suika15tone/keyboard.json | 48 +++++++++++++++++++ .../suika15tone/keymaps/default/keymap.json | 12 +++++ .../suika15tone/keymaps/midi/keymap.json | 12 +++++ keyboards/suikagiken/suika15tone/readme.md | 44 +++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 keyboards/suikagiken/suika15tone/config.h create mode 100644 keyboards/suikagiken/suika15tone/keyboard.json create mode 100644 keyboards/suikagiken/suika15tone/keymaps/default/keymap.json create mode 100644 keyboards/suikagiken/suika15tone/keymaps/midi/keymap.json create mode 100644 keyboards/suikagiken/suika15tone/readme.md diff --git a/keyboards/suikagiken/suika15tone/config.h b/keyboards/suikagiken/suika15tone/config.h new file mode 100644 index 0000000000..7d35e3c436 --- /dev/null +++ b/keyboards/suikagiken/suika15tone/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 @suikagiken +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#define MIDI_ADVANCED diff --git a/keyboards/suikagiken/suika15tone/keyboard.json b/keyboards/suikagiken/suika15tone/keyboard.json new file mode 100644 index 0000000000..de3c8f33f3 --- /dev/null +++ b/keyboards/suikagiken/suika15tone/keyboard.json @@ -0,0 +1,48 @@ +{ + "manufacturer": "suikagiken", + "keyboard_name": "suika15tone", + "maintainer": "suikagiken", + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "midi": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP24", "GP0", "GP1", "GP2", "GP3", "GP4", "GP12", "GP13", "GP14"], + "rows": ["GP25", "GP23"] + }, + "url": "https://github.com/suikagiken/suika15tone", + "usb": { + "device_version": "1.0.0", + "vid": "0x4B48", + "pid": "0x0301" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6, "y": 0}, + {"matrix": [0, 6], "x": 7, "y": 0}, + {"matrix": [1, 0], "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} + ] + } + } +} diff --git a/keyboards/suikagiken/suika15tone/keymaps/default/keymap.json b/keyboards/suikagiken/suika15tone/keymaps/default/keymap.json new file mode 100644 index 0000000000..478bcc6212 --- /dev/null +++ b/keyboards/suikagiken/suika15tone/keymaps/default/keymap.json @@ -0,0 +1,12 @@ +{ + "author": "suikagiken", + "keyboard": "suikagiken/suika15tone", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_A", "KC_D", "KC_F", "KC_I", "KC_K", "KC_M", + "KC_B", "KC_C", "KC_E", "KC_G", "KC_H", "KC_J", "KC_L", "KC_N", "KC_O" + ] + ] +} diff --git a/keyboards/suikagiken/suika15tone/keymaps/midi/keymap.json b/keyboards/suikagiken/suika15tone/keymaps/midi/keymap.json new file mode 100644 index 0000000000..532f7dd5c9 --- /dev/null +++ b/keyboards/suikagiken/suika15tone/keymaps/midi/keymap.json @@ -0,0 +1,12 @@ +{ + "author": "suikagiken", + "keyboard": "suikagiken/suika15tone", + "keymap": "midi", + "layout": "LAYOUT", + "layers": [ + [ + "MI_OCTU", "MI_Cs1", "MI_Ds1", "MI_Fs1", "MI_Gs1", "MI_As1", + "MI_OCTD", "MI_C1", "MI_D1", "MI_E1", "MI_F1", "MI_G1", "MI_A1", "MI_B1", "MI_C2" + ] + ] +} diff --git a/keyboards/suikagiken/suika15tone/readme.md b/keyboards/suikagiken/suika15tone/readme.md new file mode 100644 index 0000000000..39489898dd --- /dev/null +++ b/keyboards/suikagiken/suika15tone/readme.md @@ -0,0 +1,44 @@ +# suika15tone +(English Follows Japanese) + +## 概要 +![suika15tone1](https://i.imgur.com/r0shhWR.jpg) +![suika15tone2](https://i.imgur.com/7lCqpEX.jpg) + +suika15toneは1オクターブのピアノ鍵盤型マクロキーパッドです。 +通常のマクロキーパッドとしても使えるほか、MIDIキーボードとしてDAWソフトの入力や演奏に使用できます。 + +* 制作 : すいか技研 (Website: https://suikagiken.net GitHub: [suikagiken](https://github.com/suikagiken) ) +* 販売 : すいか技研の[booth](https://suikagiken.booth.pm/)にて販売予定です + +## ビルドガイド + +[こちら](https://github.com/suikagiken/suika15tone/blob/main/buildguide_1.0.md)からご覧下さい。 + +--- + +## Overview + +suika15tone is a 1-octave piano shaped macro keypad. +You can use it as a normal macro keypad, or use it as a MIDI keyboard for DAW software input and musical performance. + +* Keyboard Maintainer: [suikagiken](https://github.com/suikagiken) +* Hardware Availability: Available at [booth](https://suikagiken.booth.pm/). + +Make example for this keyboard (after setting up your build environment): + + make suikagiken/suika15tone:default + +Flashing example for this keyboard: + + make suikagiken/suika15tone: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 top left 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 acec6904d8097a1890df272e424c4d43ad8a6831 Mon Sep 17 00:00:00 2001 From: blindassassin111 <38090555+blindassassin111@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:24:15 -0600 Subject: [PATCH 202/592] Adding support for the VKR 94 (#24883) * Adding support for the VKR 94 * Update keyboards/viktus/vkr94/keyboard.json Co-authored-by: Joel Challis * Delete keyboards/viktus/vkr94/config.h * Delete keyboards/viktus/vkr94/rules.mk * Update readme.md --------- Co-authored-by: Joel Challis --- keyboards/viktus/vkr94/keyboard.json | 947 ++++++++++++++++++ .../viktus/vkr94/keymaps/default/keymap.c | 35 + keyboards/viktus/vkr94/readme.md | 27 + 3 files changed, 1009 insertions(+) create mode 100644 keyboards/viktus/vkr94/keyboard.json create mode 100644 keyboards/viktus/vkr94/keymaps/default/keymap.c create mode 100644 keyboards/viktus/vkr94/readme.md diff --git a/keyboards/viktus/vkr94/keyboard.json b/keyboards/viktus/vkr94/keyboard.json new file mode 100644 index 0000000000..31fd8ee1c7 --- /dev/null +++ b/keyboards/viktus/vkr94/keyboard.json @@ -0,0 +1,947 @@ +{ + "keyboard_name": "VKR 94", + "manufacturer": "Viktus Design", + "url": "", + "maintainer": "BlindAssassin111", + "usb": { + "vid": "0x5644", + "pid": "0x3934", + "device_version": "1.0.0" + }, + "processor": "atmega32u4", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["D1", "D3", "D5", "D4", "D6", "D7", "B4", "B5", "B6"], + "rows": ["F1", "F0", "F5", "F4", "F7", "F6", "C7", "C6", "D0"] + }, + "ws2812": { + "pin": "D2" + }, + "rgb_matrix": { + "driver": "ws2812", + "max_brightness": 150, + "layout": [ + { "flags": 8, "x": 1, "y": 2 }, + { "flags": 8, "x": 0, "y": 2 }, + { "flags": 8, "x": 0, "y": 1 }, + { "flags": 8, "x": 1, "y": 1 }, + { "flags": 8, "x": 1, "y": 0 }, + { "flags": 8, "x": 0, "y": 0 } + ], + "animations": { + "breathing": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true + }, + "sleep": true + }, + "layouts": { + "LAYOUT_splitbs_splitshift_ansi_7u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 1], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 5.5, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_splitbs_fullshift_ansi_7u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 1], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 5.5, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_splitbs_splitshift_ansi_9u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4.5, "y": 4, "w": 9}, + {"matrix": [8, 6], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_splitbs_fullshift_ansi_9u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4.5, "y": 4, "w": 9}, + {"matrix": [8, 6], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_splitbs_splitshift_ansi_10u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 10}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_splitbs_fullshift_ansi_10u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [0, 7], "x": 14.5, "y": 0}, + {"matrix": [1, 7], "x": 15.5, "y": 0}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1, "w": 1.5}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 7], "x": 14.25, "y": 2, "w": 2.25}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 10}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_fullbs_splitshift_iso_7u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 1], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 5.5, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_fullbs_fullshift_iso_7u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 1], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 5.5, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_fullbs_splitshift_iso_9u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4.5, "y": 4, "w": 9}, + {"matrix": [8, 6], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_fullbs_fullshift_iso_9u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4.5, "y": 4, "w": 9}, + {"matrix": [8, 6], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_fullbs_splitshift_iso_10u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 1.25}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 10}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + }, + "LAYOUT_fullbs_fullshift_iso_10u": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1.5, "y": 0}, + {"matrix": [0, 1], "x": 2.5, "y": 0}, + {"matrix": [1, 1], "x": 3.5, "y": 0}, + {"matrix": [0, 2], "x": 4.5, "y": 0}, + {"matrix": [1, 2], "x": 5.5, "y": 0}, + {"matrix": [0, 3], "x": 6.5, "y": 0}, + {"matrix": [1, 3], "x": 7.5, "y": 0}, + {"matrix": [0, 4], "x": 8.5, "y": 0}, + {"matrix": [1, 4], "x": 9.5, "y": 0}, + {"matrix": [0, 5], "x": 10.5, "y": 0}, + {"matrix": [1, 5], "x": 11.5, "y": 0}, + {"matrix": [0, 6], "x": 12.5, "y": 0}, + {"matrix": [1, 6], "x": 13.5, "y": 0}, + {"matrix": [1, 7], "x": 14.5, "y": 0, "w": 2}, + {"matrix": [0, 8], "x": 18, "y": 0}, + + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [3, 0], "x": 1.5, "y": 1, "w": 1.5}, + {"matrix": [2, 1], "x": 3, "y": 1}, + {"matrix": [3, 1], "x": 4, "y": 1}, + {"matrix": [2, 2], "x": 5, "y": 1}, + {"matrix": [3, 2], "x": 6, "y": 1}, + {"matrix": [2, 3], "x": 7, "y": 1}, + {"matrix": [3, 3], "x": 8, "y": 1}, + {"matrix": [2, 4], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "y": 1}, + {"matrix": [2, 5], "x": 11, "y": 1}, + {"matrix": [3, 5], "x": 12, "y": 1}, + {"matrix": [2, 6], "x": 13, "y": 1}, + {"matrix": [3, 6], "x": 14, "y": 1}, + {"matrix": [5, 7], "x": 15.25, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 8], "x": 18, "y": 1}, + + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [5, 0], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [4, 1], "x": 3.25, "y": 2}, + {"matrix": [5, 1], "x": 4.25, "y": 2}, + {"matrix": [4, 2], "x": 5.25, "y": 2}, + {"matrix": [5, 2], "x": 6.25, "y": 2}, + {"matrix": [4, 3], "x": 7.25, "y": 2}, + {"matrix": [5, 3], "x": 8.25, "y": 2}, + {"matrix": [4, 4], "x": 9.25, "y": 2}, + {"matrix": [5, 4], "x": 10.25, "y": 2}, + {"matrix": [4, 5], "x": 11.25, "y": 2}, + {"matrix": [5, 5], "x": 12.25, "y": 2}, + {"matrix": [4, 6], "x": 13.25, "y": 2}, + {"matrix": [5, 6], "x": 14.25, "y": 2}, + {"matrix": [4, 8], "x": 18, "y": 2}, + + {"matrix": [6, 0], "x": 0, "y": 3}, + {"matrix": [7, 0], "x": 2, "y": 3, "w": 1.75}, + {"matrix": [6, 1], "x": 3.75, "y": 3}, + {"matrix": [7, 1], "x": 4.75, "y": 3}, + {"matrix": [6, 2], "x": 5.75, "y": 3}, + {"matrix": [7, 2], "x": 6.75, "y": 3}, + {"matrix": [6, 3], "x": 7.75, "y": 3}, + {"matrix": [7, 3], "x": 8.75, "y": 3}, + {"matrix": [6, 4], "x": 9.75, "y": 3}, + {"matrix": [7, 4], "x": 10.75, "y": 3}, + {"matrix": [6, 5], "x": 11.75, "y": 3}, + {"matrix": [7, 5], "x": 12.75, "y": 3}, + {"matrix": [6, 6], "x": 13.75, "y": 3, "w": 2.25}, + {"matrix": [6, 8], "x": 18, "y": 3}, + + {"matrix": [8, 0], "x": 3, "y": 4}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 10}, + {"matrix": [8, 6], "x": 14, "y": 4} + ] + } + } +} diff --git a/keyboards/viktus/vkr94/keymaps/default/keymap.c b/keyboards/viktus/vkr94/keymaps/default/keymap.c new file mode 100644 index 0000000000..8c266deb77 --- /dev/null +++ b/keyboards/viktus/vkr94/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +/* Copyright 2025 BlindAssassin111 + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_splitbs_splitshift_ansi_7u( + KC_F1, 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_BSLS, KC_GRV, KC_DEL, + KC_F2, 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_BSPC, KC_HOME, + KC_F3, 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_F4, 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_PGDN, + KC_LCTL, KC_LALT, LT(1,KC_SPC), KC_RALT, KC_RCTL + ), + + [1] = LAYOUT_splitbs_splitshift_ansi_7u( + QK_BOOT, _______, 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_RGHT, KC_DOWN, KC_LEFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/viktus/vkr94/readme.md b/keyboards/viktus/vkr94/readme.md new file mode 100644 index 0000000000..9a6f4d228c --- /dev/null +++ b/keyboards/viktus/vkr94/readme.md @@ -0,0 +1,27 @@ +# Viktus VKR 94 + +![viktus/vkr94](https://i.imgur.com/ahJVciu.png) + +A small run vintage-esque design with RGB indicators. + +* Keyboard Maintainer: [BlindAssassin111](https://github.com/blindassassin111) +* Hardware Supported: VKR 94 PCBs +* Hardware Availability: BlindAssassin111 + +Make example for this keyboard (after setting up your build environment): + + make viktus/vkr94:default + +Flashing example for this keyboard: + + make viktus/vkr94: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 abea50c26e2bb26977146a1431e458a73bea7f39 Mon Sep 17 00:00:00 2001 From: adophoxia <100170946+adophoxia@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:48:59 -0800 Subject: [PATCH 203/592] Add Keychron C1 Pro V2 (#24899) * Add C1 Pro V2 * Remove default values for f401xC generic board definition * Update clang and copyright years * Add version description --- .../c1_pro_v2/ansi/non_light/keyboard.json | 7 + .../ansi/non_light/keymaps/default/keymap.c | 64 +++++++++ .../keychron/c1_pro_v2/ansi/rgb/config.h | 24 ++++ .../keychron/c1_pro_v2/ansi/rgb/keyboard.json | 131 ++++++++++++++++++ .../ansi/rgb/keymaps/default/keymap.c | 65 +++++++++ keyboards/keychron/c1_pro_v2/ansi/rgb/rgb.c | 124 +++++++++++++++++ .../keychron/c1_pro_v2/ansi/white/config.h | 25 ++++ .../c1_pro_v2/ansi/white/keyboard.json | 122 ++++++++++++++++ .../ansi/white/keymaps/default/keymap.c | 65 +++++++++ .../keychron/c1_pro_v2/ansi/white/white.c | 121 ++++++++++++++++ keyboards/keychron/c1_pro_v2/c1_pro_v2.c | 104 ++++++++++++++ keyboards/keychron/c1_pro_v2/config.h | 29 ++++ keyboards/keychron/c1_pro_v2/halconf.h | 21 +++ keyboards/keychron/c1_pro_v2/info.json | 131 ++++++++++++++++++ keyboards/keychron/c1_pro_v2/mcuconf.h | 28 ++++ keyboards/keychron/c1_pro_v2/readme.md | 32 +++++ 16 files changed, 1093 insertions(+) create mode 100644 keyboards/keychron/c1_pro_v2/ansi/non_light/keyboard.json create mode 100644 keyboards/keychron/c1_pro_v2/ansi/non_light/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c1_pro_v2/ansi/rgb/config.h create mode 100644 keyboards/keychron/c1_pro_v2/ansi/rgb/keyboard.json create mode 100644 keyboards/keychron/c1_pro_v2/ansi/rgb/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c1_pro_v2/ansi/rgb/rgb.c create mode 100644 keyboards/keychron/c1_pro_v2/ansi/white/config.h create mode 100644 keyboards/keychron/c1_pro_v2/ansi/white/keyboard.json create mode 100644 keyboards/keychron/c1_pro_v2/ansi/white/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c1_pro_v2/ansi/white/white.c create mode 100644 keyboards/keychron/c1_pro_v2/c1_pro_v2.c create mode 100644 keyboards/keychron/c1_pro_v2/config.h create mode 100644 keyboards/keychron/c1_pro_v2/halconf.h create mode 100644 keyboards/keychron/c1_pro_v2/info.json create mode 100644 keyboards/keychron/c1_pro_v2/mcuconf.h create mode 100644 keyboards/keychron/c1_pro_v2/readme.md diff --git a/keyboards/keychron/c1_pro_v2/ansi/non_light/keyboard.json b/keyboards/keychron/c1_pro_v2/ansi/non_light/keyboard.json new file mode 100644 index 0000000000..07a0688e0a --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/non_light/keyboard.json @@ -0,0 +1,7 @@ +{ + "keyboards_name": "Keychron C1 Pro V2 Non-Light", + "usb": { + "pid": "0x051C", + "device_version": "1.0.0" + } +} diff --git a/keyboards/keychron/c1_pro_v2/ansi/non_light/keymaps/default/keymap.c b/keyboards/keychron/c1_pro_v2/ansi/non_light/keymaps/default/keymap.c new file mode 100644 index 0000000000..3c24214b9c --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/non_light/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_SLEP, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_tkl_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_tkl_ansi( + 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_PSCR, KC_NO, KC_SLEP, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on diff --git a/keyboards/keychron/c1_pro_v2/ansi/rgb/config.h b/keyboards/keychron/c1_pro_v2/ansi/rgb/config.h new file mode 100644 index 0000000000..739eb788fd --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/rgb/config.h @@ -0,0 +1,24 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +/* RGB Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_VDDIO +#define SNLED27351_I2C_ADDRESS_2 SNLED27351_I2C_ADDRESS_GND + +/* Set LED driver current */ +#define SNLED27351_CURRENT_TUNE { 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28 } diff --git a/keyboards/keychron/c1_pro_v2/ansi/rgb/keyboard.json b/keyboards/keychron/c1_pro_v2/ansi/rgb/keyboard.json new file mode 100644 index 0000000000..e1aca75ea5 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/rgb/keyboard.json @@ -0,0 +1,131 @@ +{ + "keyboard_name": "Keychron C1 Pro V2 RGB", + "features": { + "rgb_matrix": true + }, + "rgb_matrix": { + "animations": { + "band_spiral_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, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 26, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 39, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 52, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 65, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 85, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 98, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 111, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 124, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 143, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 156, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 169, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 182, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 198, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 211, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 224, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 1}, + {"matrix": [1, 1], "x": 15, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 26, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 39, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 52, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 65, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 78, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 91, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 104, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 117, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 130, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 143, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 156, "y": 15, "flags": 4}, + {"matrix": [1, 13], "x": 176, "y": 15, "flags": 1}, + {"matrix": [1, 14], "x": 198, "y": 15, "flags": 1}, + {"matrix": [1, 15], "x": 211, "y": 15, "flags": 1}, + {"matrix": [1, 16], "x": 224, "y": 15, "flags": 1}, + + {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1}, + {"matrix": [2, 1], "x": 20, "y": 27, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 46, "y": 27, "flags": 4}, + {"matrix": [2, 4], "x": 59, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 27, "flags": 4}, + {"matrix": [2, 6], "x": 85, "y": 27, "flags": 4}, + {"matrix": [2, 7], "x": 98, "y": 27, "flags": 4}, + {"matrix": [2, 8], "x": 111, "y": 27, "flags": 4}, + {"matrix": [2, 9], "x": 124, "y": 27, "flags": 4}, + {"matrix": [2, 10], "x": 137, "y": 27, "flags": 4}, + {"matrix": [2, 11], "x": 150, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 163, "y": 27, "flags": 4}, + {"matrix": [2, 13], "x": 179, "y": 27, "flags": 1}, + {"matrix": [2, 14], "x": 198, "y": 27, "flags": 1}, + {"matrix": [2, 15], "x": 211, "y": 27, "flags": 1}, + {"matrix": [2, 16], "x": 224, "y": 27, "flags": 1}, + + {"matrix": [3, 0], "x": 5, "y": 39, "flags": 8}, + {"matrix": [3, 1], "x": 23, "y": 39, "flags": 4}, + {"matrix": [3, 2], "x": 36, "y": 39, "flags": 4}, + {"matrix": [3, 3], "x": 49, "y": 39, "flags": 4}, + {"matrix": [3, 4], "x": 62, "y": 39, "flags": 4}, + {"matrix": [3, 5], "x": 75, "y": 39, "flags": 4}, + {"matrix": [3, 6], "x": 88, "y": 39, "flags": 4}, + {"matrix": [3, 7], "x": 101, "y": 39, "flags": 4}, + {"matrix": [3, 8], "x": 114, "y": 39, "flags": 4}, + {"matrix": [3, 9], "x": 127, "y": 39, "flags": 4}, + {"matrix": [3, 10], "x": 140, "y": 39, "flags": 4}, + {"matrix": [3, 11], "x": 153, "y": 39, "flags": 4}, + {"matrix": [3, 13], "x": 174, "y": 39, "flags": 1}, + + {"matrix": [4, 0], "x": 8, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 29, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 42, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 68, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 82, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 95, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 108, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 121, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 134, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 147, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 171, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 211, "y": 52, "flags": 1}, + + {"matrix": [5, 0], "x": 2, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 18, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 34, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 83, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 132, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 148, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 165, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 181, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 198, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 211, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 224, "y": 64, "flags": 1} + ], + "sleep": true + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0516" + } +} diff --git a/keyboards/keychron/c1_pro_v2/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/c1_pro_v2/ansi/rgb/keymaps/default/keymap.c new file mode 100644 index 0000000000..e775db45d1 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/rgb/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, RM_NEXT, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_tkl_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_tkl_ansi( + 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_PSCR, KC_NO, RM_NEXT, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on diff --git a/keyboards/keychron/c1_pro_v2/ansi/rgb/rgb.c b/keyboards/keychron/c1_pro_v2/ansi/rgb/rgb.c new file mode 100644 index 0000000000..8c5b45583a --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/rgb/rgb.c @@ -0,0 +1,124 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +// clang-format off +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, CB9_CA1, CB7_CA1, CB8_CA1}, + {0, CB9_CA2, CB7_CA2, CB8_CA2}, + {0, CB9_CA3, CB7_CA3, CB8_CA3}, + {0, CB9_CA4, CB7_CA4, CB8_CA4}, + {0, CB9_CA5, CB7_CA5, CB8_CA5}, + {0, CB9_CA6, CB7_CA6, CB8_CA6}, + {0, CB9_CA7, CB7_CA7, CB8_CA7}, + {0, CB9_CA8, CB7_CA8, CB8_CA8}, + {0, CB9_CA9, CB7_CA9, CB8_CA9}, + {0, CB9_CA10, CB7_CA10, CB8_CA10}, + {0, CB9_CA11, CB7_CA11, CB8_CA11}, + {0, CB9_CA12, CB7_CA12, CB8_CA12}, + {0, CB9_CA13, CB7_CA13, CB8_CA13}, + {0, CB9_CA15, CB7_CA15, CB8_CA15}, + {0, CB9_CA16, CB7_CA16, CB8_CA16}, + {0, CB12_CA5, CB10_CA5, CB11_CA5}, + + {0, CB3_CA1, CB1_CA1, CB2_CA1}, + {0, CB3_CA2, CB1_CA2, CB2_CA2}, + {0, CB3_CA3, CB1_CA3, CB2_CA3}, + {0, CB3_CA4, CB1_CA4, CB2_CA4}, + {0, CB3_CA5, CB1_CA5, CB2_CA5}, + {0, CB3_CA6, CB1_CA6, CB2_CA6}, + {0, CB3_CA7, CB1_CA7, CB2_CA7}, + {0, CB3_CA8, CB1_CA8, CB2_CA8}, + {0, CB3_CA9, CB1_CA9, CB2_CA9}, + {0, CB3_CA10, CB1_CA10, CB2_CA10}, + {0, CB3_CA11, CB1_CA11, CB2_CA11}, + {0, CB3_CA12, CB1_CA12, CB2_CA12}, + {0, CB3_CA13, CB1_CA13, CB2_CA13}, + {0, CB3_CA14, CB1_CA14, CB2_CA14}, + {0, CB3_CA15, CB1_CA15, CB2_CA15}, + {0, CB3_CA16, CB1_CA16, CB2_CA16}, + {0, CB12_CA9, CB10_CA9, CB11_CA9}, + + {0, CB6_CA1, CB4_CA1, CB5_CA1}, + {0, CB6_CA2, CB4_CA2, CB5_CA2}, + {0, CB6_CA3, CB4_CA3, CB5_CA3}, + {0, CB6_CA4, CB4_CA4, CB5_CA4}, + {0, CB6_CA5, CB4_CA5, CB5_CA5}, + {0, CB6_CA6, CB4_CA6, CB5_CA6}, + {0, CB6_CA7, CB4_CA7, CB5_CA7}, + {0, CB6_CA8, CB4_CA8, CB5_CA8}, + {0, CB6_CA9, CB4_CA9, CB5_CA9}, + {0, CB6_CA10, CB4_CA10, CB5_CA10}, + {0, CB6_CA11, CB4_CA11, CB5_CA11}, + {0, CB6_CA12, CB4_CA12, CB5_CA12}, + {0, CB6_CA13, CB4_CA13, CB5_CA13}, + {0, CB6_CA14, CB4_CA14, CB5_CA14}, + {0, CB6_CA15, CB4_CA15, CB5_CA15}, + {0, CB6_CA16, CB4_CA16, CB5_CA16}, + {0, CB12_CA14, CB10_CA14, CB11_CA14}, + + {1, CB3_CA16, CB1_CA16, CB2_CA16}, + {1, CB3_CA15, CB1_CA15, CB2_CA15}, + {1, CB3_CA14, CB1_CA14, CB2_CA14}, + {1, CB3_CA13, CB1_CA13, CB2_CA13}, + {1, CB3_CA12, CB1_CA12, CB2_CA12}, + {1, CB3_CA11, CB1_CA11, CB2_CA11}, + {1, CB3_CA10, CB1_CA10, CB2_CA10}, + {1, CB3_CA9, CB1_CA9, CB2_CA9}, + {1, CB3_CA8, CB1_CA8, CB2_CA8}, + {1, CB3_CA7, CB1_CA7, CB2_CA7}, + {1, CB3_CA6, CB1_CA6, CB2_CA6}, + {1, CB3_CA5, CB1_CA5, CB2_CA5}, + {1, CB3_CA3, CB1_CA3, CB2_CA3}, + + {1, CB9_CA16, CB7_CA16, CB8_CA16}, + {1, CB9_CA14, CB7_CA14, CB8_CA14}, + {1, CB9_CA13, CB7_CA13, CB8_CA13}, + {1, CB9_CA12, CB7_CA12, CB8_CA12}, + {1, CB9_CA11, CB7_CA11, CB8_CA11}, + {1, CB9_CA10, CB7_CA10, CB8_CA10}, + {1, CB9_CA9, CB7_CA9, CB8_CA9}, + {1, CB9_CA8, CB7_CA8, CB8_CA8}, + {1, CB9_CA7, CB7_CA7, CB8_CA7}, + {1, CB9_CA6, CB7_CA6, CB8_CA6}, + {1, CB9_CA5, CB7_CA5, CB8_CA5}, + {1, CB9_CA3, CB7_CA3, CB8_CA3}, + {1, CB9_CA1, CB7_CA1, CB8_CA1}, + + {1, CB6_CA16, CB4_CA16, CB5_CA16}, + {1, CB6_CA15, CB4_CA15, CB5_CA15}, + {1, CB6_CA14, CB4_CA14, CB5_CA14}, + {1, CB6_CA10, CB4_CA10, CB5_CA10}, + {1, CB6_CA6, CB4_CA6, CB5_CA6}, + {1, CB6_CA5, CB4_CA5, CB5_CA5}, + {1, CB6_CA4, CB4_CA4, CB5_CA4}, + {1, CB6_CA3, CB4_CA3, CB5_CA3}, + {1, CB6_CA2, CB4_CA2, CB5_CA2}, + {1, CB6_CA1, CB4_CA1, CB5_CA1}, + {1, CB12_CA10, CB10_CA10, CB11_CA10}, +}; +#endif // RGB_MATRIX_ENABLE + +// clang-format on diff --git a/keyboards/keychron/c1_pro_v2/ansi/white/config.h b/keyboards/keychron/c1_pro_v2/ansi/white/config.h new file mode 100644 index 0000000000..4fdbf33656 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/white/config.h @@ -0,0 +1,25 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND + +/* Scan phase of led driver set as MSKPHASE_9CHANNEL(defined as 0x03 in CKLED2001.h) */ +#define SNLED27351_PHASE_CHANNEL SNLED27351_SCAN_PHASE_9_CHANNEL + +#define SNLED27351_CURRENT_TUNE { 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60 } diff --git a/keyboards/keychron/c1_pro_v2/ansi/white/keyboard.json b/keyboards/keychron/c1_pro_v2/ansi/white/keyboard.json new file mode 100644 index 0000000000..cd29952e62 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/white/keyboard.json @@ -0,0 +1,122 @@ +{ + "features": { + "led_matrix": true + }, + "led_matrix": { + "animations": { + "band_pinwheel": true, + "band_spiral": true, + "breathing": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_up_down": true, + "dual_beacon": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 26, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 39, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 52, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 65, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 85, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 98, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 111, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 124, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 143, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 156, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 169, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 182, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 198, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 211, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 224, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 1}, + {"matrix": [1, 1], "x": 15, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 26, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 39, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 52, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 65, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 78, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 91, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 104, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 117, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 130, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 143, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 156, "y": 15, "flags": 4}, + {"matrix": [1, 13], "x": 176, "y": 15, "flags": 1}, + {"matrix": [1, 14], "x": 198, "y": 15, "flags": 1}, + {"matrix": [1, 15], "x": 211, "y": 15, "flags": 1}, + {"matrix": [1, 16], "x": 224, "y": 15, "flags": 1}, + + {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1}, + {"matrix": [2, 1], "x": 20, "y": 27, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 46, "y": 27, "flags": 4}, + {"matrix": [2, 4], "x": 59, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 27, "flags": 4}, + {"matrix": [2, 6], "x": 85, "y": 27, "flags": 4}, + {"matrix": [2, 7], "x": 98, "y": 27, "flags": 4}, + {"matrix": [2, 8], "x": 111, "y": 27, "flags": 4}, + {"matrix": [2, 9], "x": 124, "y": 27, "flags": 4}, + {"matrix": [2, 10], "x": 137, "y": 27, "flags": 4}, + {"matrix": [2, 11], "x": 150, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 163, "y": 27, "flags": 4}, + {"matrix": [2, 13], "x": 179, "y": 27, "flags": 1}, + {"matrix": [2, 14], "x": 198, "y": 27, "flags": 1}, + {"matrix": [2, 15], "x": 211, "y": 27, "flags": 1}, + {"matrix": [2, 16], "x": 224, "y": 27, "flags": 1}, + + {"matrix": [3, 0], "x": 5, "y": 39, "flags": 8}, + {"matrix": [3, 1], "x": 23, "y": 39, "flags": 4}, + {"matrix": [3, 2], "x": 36, "y": 39, "flags": 4}, + {"matrix": [3, 3], "x": 49, "y": 39, "flags": 4}, + {"matrix": [3, 4], "x": 62, "y": 39, "flags": 4}, + {"matrix": [3, 5], "x": 75, "y": 39, "flags": 4}, + {"matrix": [3, 6], "x": 88, "y": 39, "flags": 4}, + {"matrix": [3, 7], "x": 101, "y": 39, "flags": 4}, + {"matrix": [3, 8], "x": 114, "y": 39, "flags": 4}, + {"matrix": [3, 9], "x": 127, "y": 39, "flags": 4}, + {"matrix": [3, 10], "x": 140, "y": 39, "flags": 4}, + {"matrix": [3, 11], "x": 153, "y": 39, "flags": 4}, + {"matrix": [3, 13], "x": 174, "y": 39, "flags": 1}, + + {"matrix": [4, 0], "x": 8, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 29, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 42, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 68, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 82, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 95, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 108, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 121, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 134, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 147, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 171, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 211, "y": 52, "flags": 1}, + + {"matrix": [5, 0], "x": 2, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 18, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 34, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 83, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 132, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 148, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 165, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 181, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 198, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 211, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 224, "y": 64, "flags": 1} + ], + "sleep": true + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0519" + } +} diff --git a/keyboards/keychron/c1_pro_v2/ansi/white/keymaps/default/keymap.c b/keyboards/keychron/c1_pro_v2/ansi/white/keymaps/default/keymap.c new file mode 100644 index 0000000000..af1c54d738 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/white/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_tkl_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, LM_NEXT, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_tkl_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, LM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + LM_TOGG, LM_NEXT, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_tkl_ansi( + 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_PSCR, _______, LM_NEXT, + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_tkl_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, LM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + LM_TOGG, LM_NEXT, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +// clang-format on diff --git a/keyboards/keychron/c1_pro_v2/ansi/white/white.c b/keyboards/keychron/c1_pro_v2/ansi/white/white.c new file mode 100644 index 0000000000..36fa6bf1d1 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/ansi/white/white.c @@ -0,0 +1,121 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 LED_MATRIX_ENABLE +// clang-format off +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, CB1_CA16}, + {0, CB1_CA15}, + {0, CB1_CA14}, + {0, CB1_CA13}, + {0, CB1_CA12}, + {0, CB1_CA11}, + {0, CB1_CA10}, + {0, CB1_CA9 }, + {0, CB1_CA8 }, + {0, CB1_CA7 }, + {0, CB1_CA6 }, + {0, CB1_CA5 }, + {0, CB1_CA4 }, + {0, CB1_CA2 }, + {0, CB1_CA1 }, + {0, CB7_CA1 }, + + {0, CB2_CA16}, + {0, CB2_CA15}, + {0, CB2_CA14}, + {0, CB2_CA13}, + {0, CB2_CA12}, + {0, CB2_CA11}, + {0, CB2_CA10}, + {0, CB2_CA9 }, + {0, CB2_CA8 }, + {0, CB2_CA7 }, + {0, CB2_CA6 }, + {0, CB2_CA5 }, + {0, CB2_CA4 }, + {0, CB2_CA3 }, + {0, CB2_CA2 }, + {0, CB2_CA1 }, + {0, CB8_CA1 }, + + {0, CB3_CA16}, + {0, CB3_CA15}, + {0, CB3_CA14}, + {0, CB3_CA13}, + {0, CB3_CA12}, + {0, CB3_CA11}, + {0, CB3_CA10}, + {0, CB3_CA9 }, + {0, CB3_CA8 }, + {0, CB3_CA7 }, + {0, CB3_CA6 }, + {0, CB3_CA5 }, + {0, CB3_CA4 }, + {0, CB3_CA3 }, + {0, CB3_CA2 }, + {0, CB3_CA1 }, + {0, CB7_CA6 }, + + {0, CB4_CA16}, + {0, CB4_CA15}, + {0, CB4_CA14}, + {0, CB4_CA13}, + {0, CB4_CA12}, + {0, CB4_CA11}, + {0, CB4_CA10}, + {0, CB4_CA9 }, + {0, CB4_CA8 }, + {0, CB4_CA7 }, + {0, CB4_CA6 }, + {0, CB4_CA5 }, + {0, CB4_CA3 }, + + {0, CB5_CA16}, + {0, CB5_CA14}, + {0, CB5_CA13}, + {0, CB5_CA12}, + {0, CB5_CA11}, + {0, CB5_CA10}, + {0, CB5_CA9 }, + {0, CB5_CA8 }, + {0, CB5_CA7 }, + {0, CB5_CA6 }, + {0, CB5_CA5 }, + {0, CB5_CA3 }, + {0, CB5_CA1 }, + + {0, CB6_CA16}, + {0, CB6_CA15}, + {0, CB6_CA14}, + {0, CB6_CA10}, + {0, CB6_CA6 }, + {0, CB6_CA5 }, + {0, CB6_CA4 }, + {0, CB6_CA3 }, + {0, CB6_CA2 }, + {0, CB6_CA1 }, + {0, CB7_CA13}, +}; +#endif + +// clang-fomat on diff --git a/keyboards/keychron/c1_pro_v2/c1_pro_v2.c b/keyboards/keychron/c1_pro_v2/c1_pro_v2.c new file mode 100644 index 0000000000..d4ff5eb9dc --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/c1_pro_v2.c @@ -0,0 +1,104 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (!dip_switch_update_user(index, active)) { + return false; + } + if (index == 0) { + default_layer_set(1UL << (active ? 0 : 2)); + } + return true; +} +#endif + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { +#ifdef RGB_MATRIX_ENABLE + case QK_RGB_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_set_color_all(0, 0, 0); + } break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!rgb_matrix_is_enabled()) { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable(); + } + return false; +#endif +#ifdef LED_MATRIX_ENABLE + case QK_LED_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (led_matrix_get_flags()) { + case LED_FLAG_ALL: { + led_matrix_set_flags(LED_FLAG_NONE); + led_matrix_set_value_all(0); + } break; + default: { + led_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!led_matrix_is_enabled()) { + led_matrix_set_flags(LED_FLAG_ALL); + led_matrix_enable(); + } + return false; +#endif + default: + return true; + } +} + +void keyboard_post_init_kb(void) { + gpio_set_pin_output_push_pull(LED_MAC_OS_PIN); + gpio_set_pin_output_push_pull(LED_WIN_OS_PIN); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + + keyboard_post_init_user(); +} + +void housekeeping_task_kb(void) { + if (default_layer_state == (1U << 0)) { + gpio_write_pin(LED_MAC_OS_PIN, LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + } + if (default_layer_state == (1U << 2)) { + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, LED_OS_PIN_ON_STATE); + } +} + +void suspend_power_down_kb(void) { + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + + suspend_power_down_user(); +} diff --git a/keyboards/keychron/c1_pro_v2/config.h b/keyboards/keychron/c1_pro_v2/config.h new file mode 100644 index 0000000000..eb8ee47a96 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/config.h @@ -0,0 +1,29 @@ +/* Copyright 2025 @ Keychron(https://www.keychron.com) + * + * 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 + +/* DIP switch */ +#define DIP_SWITCH_PINS { D2 } + +/* Increase I2C speed to 1000 KHz */ +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 + +/* System indication led */ +#define LED_MAC_OS_PIN C10 +#define LED_WIN_OS_PIN C11 +#define LED_OS_PIN_ON_STATE 1 diff --git a/keyboards/keychron/c1_pro_v2/halconf.h b/keyboards/keychron/c1_pro_v2/halconf.h new file mode 100644 index 0000000000..d0a9933637 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +#include_next diff --git a/keyboards/keychron/c1_pro_v2/info.json b/keyboards/keychron/c1_pro_v2/info.json new file mode 100644 index 0000000000..af4e6017e4 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/info.json @@ -0,0 +1,131 @@ +{ + "manufacturer": "Keychron", + "maintainer": "lalalademaxiya1", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "dip_switch": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "C9" + }, + "matrix_pins": { + "cols": ["A0", "A1", "A2", "A3", "C0", "C1", "C2", "C3", "A8", "C12", "B9", "C6", "C7", "C4", "C5", "A15", "B10"], + "rows": ["B0", "B1", "B8", "B3", "B4", "B5"] + }, + "processor": "STM32F401", + "url": "https://github.com/Keychron", + "usb": { + "vid": "0x3434" + }, + "community_layouts": ["tkl_ansi"], + "layouts": { + "LAYOUT_tkl_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [0, 10], "x": 12, "y": 0}, + {"matrix": [0, 11], "x": 13, "y": 0}, + {"matrix": [0, 12], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25} + ] + } + } +} diff --git a/keyboards/keychron/c1_pro_v2/mcuconf.h b/keyboards/keychron/c1_pro_v2/mcuconf.h new file mode 100644 index 0000000000..ca470fb5b3 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/mcuconf.h @@ -0,0 +1,28 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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_HSECLK +#define STM32_HSECLK 16000000U + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/c1_pro_v2/readme.md b/keyboards/keychron/c1_pro_v2/readme.md new file mode 100644 index 0000000000..6cabd71b18 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/readme.md @@ -0,0 +1,32 @@ +# Keychron C1 Pro V2 + +![Keychron C1 Pro](https://i.imgur.com/Svdm4lph.jpg) + +A customizable 80% TKL keyboard. + +v1 is based on STM32L432 and v2 is based on STM32F402. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron C1 Pro +* Hardware Availability: [Keychron](https://www.keychron.com) + +Make example for this keyboard (after setting up your build environment): + + make keychron/c1_pro_v2/ansi/rgb:default + make keychron/c1_pro_v2/ansi/white:default + make keychron/c1_pro_v2/ansi/non_light:default + +Flashing example for this keyboard: + + make keychron/c1_pro_v2/ansi/rgb:default:flash + make keychron/c1_pro_v2/ansi/white:default:flash + make keychron/c1_pro_v2/ansi/non_light:default:flash + +## bootloader + +Enter the bootloader in two ways: + +* **Bootmagic reset**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard. +* **Physical reset button**: Briefly press the RESET button under the spacebar. + +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). From 6c10839e3306521e5f0e0050a891c013b7a4f766 Mon Sep 17 00:00:00 2001 From: adophoxia <100170946+adophoxia@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:57:15 -0800 Subject: [PATCH 204/592] Add Keychron C2 Pro V2 (#24900) Same changes as for C1 Pro V2 --- .../keychron/c2_pro_v2/ansi/rgb/config.h | 24 +++ .../keychron/c2_pro_v2/ansi/rgb/keyboard.json | 148 ++++++++++++++++++ .../ansi/rgb/keymaps/default/keymap.c | 64 ++++++++ keyboards/keychron/c2_pro_v2/ansi/rgb/rgb.c | 139 ++++++++++++++++ .../keychron/c2_pro_v2/ansi/white/config.h | 26 +++ .../c2_pro_v2/ansi/white/keyboard.json | 140 +++++++++++++++++ .../ansi/white/keymaps/default/keymap.c | 65 ++++++++ .../keychron/c2_pro_v2/ansi/white/white.c | 138 ++++++++++++++++ keyboards/keychron/c2_pro_v2/c2_pro_v2.c | 104 ++++++++++++ keyboards/keychron/c2_pro_v2/config.h | 29 ++++ keyboards/keychron/c2_pro_v2/halconf.h | 21 +++ keyboards/keychron/c2_pro_v2/info.json | 148 ++++++++++++++++++ keyboards/keychron/c2_pro_v2/mcuconf.h | 28 ++++ keyboards/keychron/c2_pro_v2/readme.md | 30 ++++ 14 files changed, 1104 insertions(+) create mode 100644 keyboards/keychron/c2_pro_v2/ansi/rgb/config.h create mode 100644 keyboards/keychron/c2_pro_v2/ansi/rgb/keyboard.json create mode 100644 keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c2_pro_v2/ansi/rgb/rgb.c create mode 100644 keyboards/keychron/c2_pro_v2/ansi/white/config.h create mode 100644 keyboards/keychron/c2_pro_v2/ansi/white/keyboard.json create mode 100644 keyboards/keychron/c2_pro_v2/ansi/white/keymaps/default/keymap.c create mode 100644 keyboards/keychron/c2_pro_v2/ansi/white/white.c create mode 100644 keyboards/keychron/c2_pro_v2/c2_pro_v2.c create mode 100644 keyboards/keychron/c2_pro_v2/config.h create mode 100644 keyboards/keychron/c2_pro_v2/halconf.h create mode 100644 keyboards/keychron/c2_pro_v2/info.json create mode 100644 keyboards/keychron/c2_pro_v2/mcuconf.h create mode 100644 keyboards/keychron/c2_pro_v2/readme.md diff --git a/keyboards/keychron/c2_pro_v2/ansi/rgb/config.h b/keyboards/keychron/c2_pro_v2/ansi/rgb/config.h new file mode 100644 index 0000000000..739eb788fd --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/rgb/config.h @@ -0,0 +1,24 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +/* RGB Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_VDDIO +#define SNLED27351_I2C_ADDRESS_2 SNLED27351_I2C_ADDRESS_GND + +/* Set LED driver current */ +#define SNLED27351_CURRENT_TUNE { 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28 } diff --git a/keyboards/keychron/c2_pro_v2/ansi/rgb/keyboard.json b/keyboards/keychron/c2_pro_v2/ansi/rgb/keyboard.json new file mode 100644 index 0000000000..f619ab096c --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/rgb/keyboard.json @@ -0,0 +1,148 @@ +{ + "keyboard_name": "Keychron C2 Pro V2 RGB", + "features": { + "rgb_matrix": true + }, + "rgb_matrix": { + "animations": { + "band_spiral_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, + "jellybean_raindrops": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "splash": true, + "typing_heatmap": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 21, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 31, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 42, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 52, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 68, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 78, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 89, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 99, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 115, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 125, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 136, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 146, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 159, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 169, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 180, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 1}, + {"matrix": [1, 1], "x": 10, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 21, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 31, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 42, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 52, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 63, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 73, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 83, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 94, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 104, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 115, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 125, "y": 15, "flags": 4}, + {"matrix": [1, 13], "x": 141, "y": 15, "flags": 1}, + {"matrix": [1, 14], "x": 159, "y": 15, "flags": 1}, + {"matrix": [1, 15], "x": 169, "y": 15, "flags": 1}, + {"matrix": [1, 16], "x": 180, "y": 15, "flags": 1}, + {"matrix": [1, 17], "x": 193, "y": 15, "flags": 4}, + {"matrix": [1, 18], "x": 203, "y": 15, "flags": 4}, + {"matrix": [1, 19], "x": 214, "y": 15, "flags": 4}, + {"matrix": [1, 20], "x": 224, "y": 15, "flags": 4}, + + {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1}, + {"matrix": [2, 1], "x": 16, "y": 27, "flags": 4}, + {"matrix": [2, 2], "x": 26, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 36, "y": 27, "flags": 4}, + {"matrix": [2, 4], "x": 47, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 57, "y": 27, "flags": 4}, + {"matrix": [2, 6], "x": 68, "y": 27, "flags": 4}, + {"matrix": [2, 7], "x": 78, "y": 27, "flags": 4}, + {"matrix": [2, 8], "x": 89, "y": 27, "flags": 4}, + {"matrix": [2, 9], "x": 99, "y": 27, "flags": 4}, + {"matrix": [2, 10], "x": 109, "y": 27, "flags": 4}, + {"matrix": [2, 11], "x": 120, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 130, "y": 27, "flags": 4}, + {"matrix": [2, 13], "x": 143, "y": 27, "flags": 1}, + {"matrix": [2, 14], "x": 159, "y": 27, "flags": 1}, + {"matrix": [2, 15], "x": 169, "y": 27, "flags": 1}, + {"matrix": [2, 16], "x": 180, "y": 27, "flags": 1}, + {"matrix": [2, 17], "x": 193, "y": 27, "flags": 4}, + {"matrix": [2, 18], "x": 203, "y": 27, "flags": 4}, + {"matrix": [2, 19], "x": 214, "y": 27, "flags": 4}, + {"matrix": [2, 20], "x": 224, "y": 34, "flags": 4}, + + {"matrix": [3, 0], "x": 4, "y": 40, "flags": 8}, + {"matrix": [3, 1], "x": 18, "y": 40, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 40, "flags": 4}, + {"matrix": [3, 3], "x": 39, "y": 40, "flags": 4}, + {"matrix": [3, 4], "x": 50, "y": 40, "flags": 4}, + {"matrix": [3, 5], "x": 60, "y": 40, "flags": 4}, + {"matrix": [3, 6], "x": 70, "y": 40, "flags": 4}, + {"matrix": [3, 7], "x": 81, "y": 40, "flags": 4}, + {"matrix": [3, 8], "x": 91, "y": 40, "flags": 4}, + {"matrix": [3, 9], "x": 102, "y": 40, "flags": 4}, + {"matrix": [3, 10], "x": 112, "y": 40, "flags": 4}, + {"matrix": [3, 11], "x": 123, "y": 40, "flags": 4}, + {"matrix": [3, 13], "x": 139, "y": 40, "flags": 1}, + {"matrix": [3, 17], "x": 193, "y": 40, "flags": 4}, + {"matrix": [3, 18], "x": 203, "y": 40, "flags": 4}, + {"matrix": [3, 19], "x": 214, "y": 40, "flags": 4}, + + {"matrix": [4, 0], "x": 7, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 23, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 34, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 44, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 65, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 76, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 86, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 96, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 107, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 117, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 137, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 169, "y": 52, "flags": 1}, + {"matrix": [4, 17], "x": 193, "y": 52, "flags": 4}, + {"matrix": [4, 18], "x": 203, "y": 52, "flags": 4}, + {"matrix": [4, 19], "x": 214, "y": 52, "flags": 4}, + {"matrix": [4, 20], "x": 224, "y": 58, "flags": 4}, + + {"matrix": [5, 0], "x": 1, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 14, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 27, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 66, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 105, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 118, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 131, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 145, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 159, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 169, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 180, "y": 64, "flags": 1}, + {"matrix": [5, 17], "x": 198, "y": 64, "flags": 4}, + {"matrix": [5, 18], "x": 214, "y": 64, "flags": 4} + ], + "sleep": true + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0526" + } +} diff --git a/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c new file mode 100644 index 0000000000..7e09d028f7 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_104_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, RM_NEXT, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + + [MAC_FN] = LAYOUT_104_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, RM_NEXT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + + [WIN_BASE] = LAYOUT_104_ansi( + 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_PSCR, KC_NO, RM_NEXT, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + + [WIN_FN] = LAYOUT_104_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RM_VALU, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_TOGG, RM_NEXT, RM_VALU, RM_HUEU, RM_SATU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_VALD, RM_HUED, RM_SATD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), +}; + +// clang-format on diff --git a/keyboards/keychron/c2_pro_v2/ansi/rgb/rgb.c b/keyboards/keychron/c2_pro_v2/ansi/rgb/rgb.c new file mode 100644 index 0000000000..d92cf177f4 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/rgb/rgb.c @@ -0,0 +1,139 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 SNLED27351 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, CB9_CA1, CB7_CA1, CB8_CA1}, + {0, CB9_CA2, CB7_CA2, CB8_CA2}, + {0, CB9_CA3, CB7_CA3, CB8_CA3}, + {0, CB9_CA4, CB7_CA4, CB8_CA4}, + {0, CB9_CA5, CB7_CA5, CB8_CA5}, + {0, CB9_CA6, CB7_CA6, CB8_CA6}, + {0, CB9_CA7, CB7_CA7, CB8_CA7}, + {0, CB9_CA8, CB7_CA8, CB8_CA8}, + {0, CB9_CA9, CB7_CA9, CB8_CA9}, + {0, CB9_CA10, CB7_CA10, CB8_CA10}, + {0, CB9_CA11, CB7_CA11, CB8_CA11}, + {0, CB9_CA12, CB7_CA12, CB8_CA12}, + {0, CB9_CA13, CB7_CA13, CB8_CA13}, + {0, CB9_CA15, CB7_CA15, CB8_CA15}, + {0, CB9_CA16, CB7_CA16, CB8_CA16}, + {0, CB12_CA5, CB10_CA5, CB11_CA5}, + + {0, CB3_CA1, CB1_CA1, CB2_CA1}, + {0, CB3_CA2, CB1_CA2, CB2_CA2}, + {0, CB3_CA3, CB1_CA3, CB2_CA3}, + {0, CB3_CA4, CB1_CA4, CB2_CA4}, + {0, CB3_CA5, CB1_CA5, CB2_CA5}, + {0, CB3_CA6, CB1_CA6, CB2_CA6}, + {0, CB3_CA7, CB1_CA7, CB2_CA7}, + {0, CB3_CA8, CB1_CA8, CB2_CA8}, + {0, CB3_CA9, CB1_CA9, CB2_CA9}, + {0, CB3_CA10, CB1_CA10, CB2_CA10}, + {0, CB3_CA11, CB1_CA11, CB2_CA11}, + {0, CB3_CA12, CB1_CA12, CB2_CA12}, + {0, CB3_CA13, CB1_CA13, CB2_CA13}, + {0, CB3_CA14, CB1_CA14, CB2_CA14}, + {0, CB3_CA15, CB1_CA15, CB2_CA15}, + {0, CB3_CA16, CB1_CA16, CB2_CA16}, + {0, CB12_CA9, CB10_CA9, CB11_CA9}, + {0, CB12_CA10, CB10_CA10, CB11_CA10}, + {0, CB12_CA11, CB10_CA11, CB11_CA11}, + {0, CB12_CA12, CB10_CA12, CB11_CA12}, + {0, CB12_CA13, CB10_CA13, CB11_CA13}, + + {0, CB6_CA1, CB4_CA1, CB5_CA1}, + {0, CB6_CA2, CB4_CA2, CB5_CA2}, + {0, CB6_CA3, CB4_CA3, CB5_CA3}, + {0, CB6_CA4, CB4_CA4, CB5_CA4}, + {0, CB6_CA5, CB4_CA5, CB5_CA5}, + {0, CB6_CA6, CB4_CA6, CB5_CA6}, + {0, CB6_CA7, CB4_CA7, CB5_CA7}, + {0, CB6_CA8, CB4_CA8, CB5_CA8}, + {0, CB6_CA9, CB4_CA9, CB5_CA9}, + {0, CB6_CA10, CB4_CA10, CB5_CA10}, + {0, CB6_CA11, CB4_CA11, CB5_CA11}, + {0, CB6_CA12, CB4_CA12, CB5_CA12}, + {0, CB6_CA13, CB4_CA13, CB5_CA13}, + {0, CB6_CA14, CB4_CA14, CB5_CA14}, + {0, CB6_CA15, CB4_CA15, CB5_CA15}, + {0, CB6_CA16, CB4_CA16, CB5_CA16}, + {0, CB12_CA14, CB10_CA14, CB11_CA14}, + {0, CB12_CA15, CB10_CA15, CB11_CA15}, + {0, CB12_CA16, CB10_CA16, CB11_CA16}, + {1, CB12_CA1, CB10_CA1, CB11_CA1}, + {1, CB12_CA2, CB10_CA2, CB11_CA2}, + + {1, CB3_CA16, CB1_CA16, CB2_CA16}, + {1, CB3_CA15, CB1_CA15, CB2_CA15}, + {1, CB3_CA14, CB1_CA14, CB2_CA14}, + {1, CB3_CA13, CB1_CA13, CB2_CA13}, + {1, CB3_CA12, CB1_CA12, CB2_CA12}, + {1, CB3_CA11, CB1_CA11, CB2_CA11}, + {1, CB3_CA10, CB1_CA10, CB2_CA10}, + {1, CB3_CA9, CB1_CA9, CB2_CA9}, + {1, CB3_CA8, CB1_CA8, CB2_CA8}, + {1, CB3_CA7, CB1_CA7, CB2_CA7}, + {1, CB3_CA6, CB1_CA6, CB2_CA6}, + {1, CB3_CA5, CB1_CA5, CB2_CA5}, + {1, CB3_CA3, CB1_CA3, CB2_CA3}, + {1, CB12_CA3, CB10_CA3, CB11_CA3}, + {1, CB12_CA4, CB10_CA4, CB11_CA4}, + {1, CB12_CA5, CB10_CA5, CB11_CA5}, + + {1, CB9_CA16, CB7_CA16, CB8_CA16}, + {1, CB9_CA14, CB7_CA14, CB8_CA14}, + {1, CB9_CA13, CB7_CA13, CB8_CA13}, + {1, CB9_CA12, CB7_CA12, CB8_CA12}, + {1, CB9_CA11, CB7_CA11, CB8_CA11}, + {1, CB9_CA10, CB7_CA10, CB8_CA10}, + {1, CB9_CA9, CB7_CA9, CB8_CA9}, + {1, CB9_CA8, CB7_CA8, CB8_CA8}, + {1, CB9_CA7, CB7_CA7, CB8_CA7}, + {1, CB9_CA6, CB7_CA6, CB8_CA6}, + {1, CB9_CA5, CB7_CA5, CB8_CA5}, + {1, CB9_CA3, CB7_CA3, CB8_CA3}, + {1, CB9_CA1, CB7_CA1, CB8_CA1}, + {1, CB12_CA6, CB10_CA6, CB11_CA6}, + {1, CB12_CA7, CB10_CA7, CB11_CA7}, + {1, CB12_CA8, CB10_CA8, CB11_CA8}, + {1, CB12_CA9, CB10_CA9, CB11_CA9}, + + {1, CB6_CA16, CB4_CA16, CB5_CA16}, + {1, CB6_CA15, CB4_CA15, CB5_CA15}, + {1, CB6_CA14, CB4_CA14, CB5_CA14}, + {1, CB6_CA10, CB4_CA10, CB5_CA10}, + {1, CB6_CA6, CB4_CA6, CB5_CA6}, + {1, CB6_CA5, CB4_CA5, CB5_CA5}, + {1, CB6_CA4, CB4_CA4, CB5_CA4}, + {1, CB6_CA3, CB4_CA3, CB5_CA3}, + {1, CB6_CA2, CB4_CA2, CB5_CA2}, + {1, CB6_CA1, CB4_CA1, CB5_CA1}, + {1, CB12_CA10, CB10_CA10, CB11_CA10}, + {1, CB12_CA11, CB10_CA11, CB11_CA11}, + {1, CB12_CA12, CB10_CA12, CB11_CA12}, +}; +#endif + +// clang-format on diff --git a/keyboards/keychron/c2_pro_v2/ansi/white/config.h b/keyboards/keychron/c2_pro_v2/ansi/white/config.h new file mode 100644 index 0000000000..65302c9969 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/white/config.h @@ -0,0 +1,26 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 Matrix Driver Configuration */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND + +/* Use the first 8 channels of led driver */ +#define SNLED27351_PHASE_CHANNEL SNLED27351_SCAN_PHASE_8_CHANNEL + +/* Set LED driver current */ +#define SNLED27351_CURRENT_TUNE { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50 } diff --git a/keyboards/keychron/c2_pro_v2/ansi/white/keyboard.json b/keyboards/keychron/c2_pro_v2/ansi/white/keyboard.json new file mode 100644 index 0000000000..020f6c0bd9 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/white/keyboard.json @@ -0,0 +1,140 @@ +{ + "keyboard_name": "Keychron C2 Pro V2 White", + "features": { + "led_matrix": true + }, + "led_matrix": { + "animations": { + "band_pinwheel": true, + "band_spiral": true, + "breathing": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_up_down": true, + "dual_beacon": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 21, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 31, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 42, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 52, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 68, "y": 0, "flags": 1}, + {"matrix": [0, 6], "x": 78, "y": 0, "flags": 1}, + {"matrix": [0, 7], "x": 89, "y": 0, "flags": 1}, + {"matrix": [0, 8], "x": 99, "y": 0, "flags": 1}, + {"matrix": [0, 9], "x": 115, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 125, "y": 0, "flags": 1}, + {"matrix": [0, 11], "x": 136, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 146, "y": 0, "flags": 1}, + {"matrix": [0, 14], "x": 159, "y": 0, "flags": 1}, + {"matrix": [0, 15], "x": 169, "y": 0, "flags": 1}, + {"matrix": [0, 16], "x": 180, "y": 0, "flags": 1}, + + {"matrix": [1, 0], "x": 0, "y": 15, "flags": 1}, + {"matrix": [1, 1], "x": 10, "y": 15, "flags": 4}, + {"matrix": [1, 2], "x": 21, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 31, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 42, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 52, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 63, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 73, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 83, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 94, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 104, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 115, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 125, "y": 15, "flags": 4}, + {"matrix": [1, 13], "x": 141, "y": 15, "flags": 1}, + {"matrix": [1, 14], "x": 159, "y": 15, "flags": 1}, + {"matrix": [1, 15], "x": 169, "y": 15, "flags": 1}, + {"matrix": [1, 16], "x": 180, "y": 15, "flags": 1}, + {"matrix": [1, 17], "x": 193, "y": 15, "flags": 4}, + {"matrix": [1, 18], "x": 203, "y": 15, "flags": 4}, + {"matrix": [1, 19], "x": 214, "y": 15, "flags": 4}, + {"matrix": [1, 20], "x": 224, "y": 15, "flags": 4}, + + {"matrix": [2, 0], "x": 3, "y": 27, "flags": 1}, + {"matrix": [2, 1], "x": 16, "y": 27, "flags": 4}, + {"matrix": [2, 2], "x": 26, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 36, "y": 27, "flags": 4}, + {"matrix": [2, 4], "x": 47, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 57, "y": 27, "flags": 4}, + {"matrix": [2, 6], "x": 68, "y": 27, "flags": 4}, + {"matrix": [2, 7], "x": 78, "y": 27, "flags": 4}, + {"matrix": [2, 8], "x": 89, "y": 27, "flags": 4}, + {"matrix": [2, 9], "x": 99, "y": 27, "flags": 4}, + {"matrix": [2, 10], "x": 109, "y": 27, "flags": 4}, + {"matrix": [2, 11], "x": 120, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 130, "y": 27, "flags": 4}, + {"matrix": [2, 13], "x": 143, "y": 27, "flags": 1}, + {"matrix": [2, 14], "x": 159, "y": 27, "flags": 1}, + {"matrix": [2, 15], "x": 169, "y": 27, "flags": 1}, + {"matrix": [2, 16], "x": 180, "y": 27, "flags": 1}, + {"matrix": [2, 17], "x": 193, "y": 27, "flags": 4}, + {"matrix": [2, 18], "x": 203, "y": 27, "flags": 4}, + {"matrix": [2, 19], "x": 214, "y": 27, "flags": 4}, + {"matrix": [2, 20], "x": 224, "y": 34, "flags": 4}, + + {"matrix": [3, 0], "x": 4, "y": 40, "flags": 8}, + {"matrix": [3, 1], "x": 18, "y": 40, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 40, "flags": 4}, + {"matrix": [3, 3], "x": 39, "y": 40, "flags": 4}, + {"matrix": [3, 4], "x": 50, "y": 40, "flags": 4}, + {"matrix": [3, 5], "x": 60, "y": 40, "flags": 4}, + {"matrix": [3, 6], "x": 70, "y": 40, "flags": 4}, + {"matrix": [3, 7], "x": 81, "y": 40, "flags": 4}, + {"matrix": [3, 8], "x": 91, "y": 40, "flags": 4}, + {"matrix": [3, 9], "x": 102, "y": 40, "flags": 4}, + {"matrix": [3, 10], "x": 112, "y": 40, "flags": 4}, + {"matrix": [3, 11], "x": 123, "y": 40, "flags": 4}, + {"matrix": [3, 13], "x": 139, "y": 40, "flags": 1}, + {"matrix": [3, 17], "x": 193, "y": 40, "flags": 4}, + {"matrix": [3, 18], "x": 203, "y": 40, "flags": 4}, + {"matrix": [3, 19], "x": 214, "y": 40, "flags": 4}, + + {"matrix": [4, 0], "x": 7, "y": 52, "flags": 1}, + {"matrix": [4, 2], "x": 23, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 34, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 44, "y": 52, "flags": 4}, + {"matrix": [4, 5], "x": 55, "y": 52, "flags": 4}, + {"matrix": [4, 6], "x": 65, "y": 52, "flags": 4}, + {"matrix": [4, 7], "x": 76, "y": 52, "flags": 4}, + {"matrix": [4, 8], "x": 86, "y": 52, "flags": 4}, + {"matrix": [4, 9], "x": 96, "y": 52, "flags": 4}, + {"matrix": [4, 10], "x": 107, "y": 52, "flags": 4}, + {"matrix": [4, 11], "x": 117, "y": 52, "flags": 4}, + {"matrix": [4, 13], "x": 137, "y": 52, "flags": 1}, + {"matrix": [4, 15], "x": 169, "y": 52, "flags": 1}, + {"matrix": [4, 17], "x": 193, "y": 52, "flags": 4}, + {"matrix": [4, 18], "x": 203, "y": 52, "flags": 4}, + {"matrix": [4, 19], "x": 214, "y": 52, "flags": 4}, + {"matrix": [4, 20], "x": 224, "y": 58, "flags": 4}, + + {"matrix": [5, 0], "x": 1, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 14, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 27, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 66, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 105, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 118, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 131, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 145, "y": 64, "flags": 1}, + {"matrix": [5, 14], "x": 159, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 169, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 180, "y": 64, "flags": 1}, + {"matrix": [5, 17], "x": 198, "y": 64, "flags": 4}, + {"matrix": [5, 18], "x": 214, "y": 64, "flags": 4} + ], + "sleep": true + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0529" + } +} diff --git a/keyboards/keychron/c2_pro_v2/ansi/white/keymaps/default/keymap.c b/keyboards/keychron/c2_pro_v2/ansi/white/keymaps/default/keymap.c new file mode 100644 index 0000000000..da212f3d54 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/white/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_104_ansi( + KC_ESC, KC_BRID, KC_BRIU, _______, _______, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, LM_NEXT, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, MO(MAC_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + + [MAC_FN] = LAYOUT_104_ansi( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + LM_TOGG, LM_NEXT, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), + + [WIN_BASE] = LAYOUT_104_ansi( + 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_PSCR, KC_NO, BL_STEP, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LWIN, KC_LALT, KC_SPC, KC_RALT, KC_RWIN, MO(WIN_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), + + [WIN_FN] = LAYOUT_104_ansi( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, LM_BRID, LM_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, LM_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + LM_TOGG, LM_NEXT, LM_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, LM_BRID, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), +}; + +// clang-format on + diff --git a/keyboards/keychron/c2_pro_v2/ansi/white/white.c b/keyboards/keychron/c2_pro_v2/ansi/white/white.c new file mode 100644 index 0000000000..3ba0274e6a --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/ansi/white/white.c @@ -0,0 +1,138 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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" + +// clang-format off +#ifdef LED_MATRIX_ENABLE +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, CB1_CA16}, + {0, CB1_CA15}, + {0, CB1_CA14}, + {0, CB1_CA13}, + {0, CB1_CA12}, + {0, CB1_CA11}, + {0, CB1_CA10}, + {0, CB1_CA9 }, + {0, CB1_CA8 }, + {0, CB1_CA7 }, + {0, CB1_CA6 }, + {0, CB1_CA5 }, + {0, CB1_CA4 }, + {0, CB1_CA2 }, + {0, CB1_CA1 }, + {0, CB7_CA1 }, + + {0, CB2_CA16}, + {0, CB2_CA15}, + {0, CB2_CA14}, + {0, CB2_CA13}, + {0, CB2_CA12}, + {0, CB2_CA11}, + {0, CB2_CA10}, + {0, CB2_CA9 }, + {0, CB2_CA8 }, + {0, CB2_CA7 }, + {0, CB2_CA6 }, + {0, CB2_CA5 }, + {0, CB2_CA4 }, + {0, CB2_CA3 }, + {0, CB2_CA2 }, + {0, CB2_CA1 }, + {0, CB8_CA1 }, + {0, CB8_CA2 }, + {0, CB8_CA3 }, + {0, CB8_CA4 }, + {0, CB8_CA5 }, + + {0, CB3_CA16}, + {0, CB3_CA15}, + {0, CB3_CA14}, + {0, CB3_CA13}, + {0, CB3_CA12}, + {0, CB3_CA11}, + {0, CB3_CA10}, + {0, CB3_CA9 }, + {0, CB3_CA8 }, + {0, CB3_CA7 }, + {0, CB3_CA6 }, + {0, CB3_CA5 }, + {0, CB3_CA4 }, + {0, CB3_CA3 }, + {0, CB3_CA2 }, + {0, CB3_CA1 }, + {0, CB7_CA6 }, + {0, CB7_CA7 }, + {0, CB7_CA8 }, + {0, CB7_CA9 }, + {0, CB7_CA10}, + + {0, CB4_CA16}, + {0, CB4_CA15}, + {0, CB4_CA14}, + {0, CB4_CA13}, + {0, CB4_CA12}, + {0, CB4_CA11}, + {0, CB4_CA10}, + {0, CB4_CA9 }, + {0, CB4_CA8 }, + {0, CB4_CA7 }, + {0, CB4_CA6 }, + {0, CB4_CA5 }, + {0, CB4_CA3 }, + {0, CB8_CA7 }, + {0, CB8_CA8 }, + {0, CB8_CA9 }, + + {0, CB5_CA16}, + {0, CB5_CA14}, + {0, CB5_CA13}, + {0, CB5_CA12}, + {0, CB5_CA11}, + {0, CB5_CA10}, + {0, CB5_CA9 }, + {0, CB5_CA8 }, + {0, CB5_CA7 }, + {0, CB5_CA6 }, + {0, CB5_CA5 }, + {0, CB5_CA3 }, + {0, CB5_CA1 }, + {0, CB8_CA6 }, + {0, CB8_CA11}, + {0, CB8_CA12}, + {0, CB8_CA10}, + + {0, CB6_CA16}, + {0, CB6_CA15}, + {0, CB6_CA14}, + {0, CB6_CA10}, + {0, CB6_CA6 }, + {0, CB6_CA5 }, + {0, CB6_CA4 }, + {0, CB6_CA3 }, + {0, CB6_CA2 }, + {0, CB6_CA1 }, + {0, CB7_CA13}, + {0, CB7_CA11}, + {0, CB7_CA12}, +}; +#endif + +// clang-format on diff --git a/keyboards/keychron/c2_pro_v2/c2_pro_v2.c b/keyboards/keychron/c2_pro_v2/c2_pro_v2.c new file mode 100644 index 0000000000..d4ff5eb9dc --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/c2_pro_v2.c @@ -0,0 +1,104 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 DIP_SWITCH_ENABLE +bool dip_switch_update_kb(uint8_t index, bool active) { + if (!dip_switch_update_user(index, active)) { + return false; + } + if (index == 0) { + default_layer_set(1UL << (active ? 0 : 2)); + } + return true; +} +#endif + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { +#ifdef RGB_MATRIX_ENABLE + case QK_RGB_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_set_color_all(0, 0, 0); + } break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!rgb_matrix_is_enabled()) { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable(); + } + return false; +#endif +#ifdef LED_MATRIX_ENABLE + case QK_LED_MATRIX_TOGGLE: + if (record->event.pressed) { + switch (led_matrix_get_flags()) { + case LED_FLAG_ALL: { + led_matrix_set_flags(LED_FLAG_NONE); + led_matrix_set_value_all(0); + } break; + default: { + led_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!led_matrix_is_enabled()) { + led_matrix_set_flags(LED_FLAG_ALL); + led_matrix_enable(); + } + return false; +#endif + default: + return true; + } +} + +void keyboard_post_init_kb(void) { + gpio_set_pin_output_push_pull(LED_MAC_OS_PIN); + gpio_set_pin_output_push_pull(LED_WIN_OS_PIN); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + + keyboard_post_init_user(); +} + +void housekeeping_task_kb(void) { + if (default_layer_state == (1U << 0)) { + gpio_write_pin(LED_MAC_OS_PIN, LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + } + if (default_layer_state == (1U << 2)) { + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, LED_OS_PIN_ON_STATE); + } +} + +void suspend_power_down_kb(void) { + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + + suspend_power_down_user(); +} diff --git a/keyboards/keychron/c2_pro_v2/config.h b/keyboards/keychron/c2_pro_v2/config.h new file mode 100644 index 0000000000..cde450aa68 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/config.h @@ -0,0 +1,29 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +/* DIP switch */ +#define DIP_SWITCH_PINS { D2 } + +/* Indication led */ +#define LED_MAC_OS_PIN C10 +#define LED_WIN_OS_PIN C11 +#define LED_OS_PIN_ON_STATE 1 + +/* The I2C Driver Configuration */ +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 diff --git a/keyboards/keychron/c2_pro_v2/halconf.h b/keyboards/keychron/c2_pro_v2/halconf.h new file mode 100644 index 0000000000..d0a9933637 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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 + +#include_next diff --git a/keyboards/keychron/c2_pro_v2/info.json b/keyboards/keychron/c2_pro_v2/info.json new file mode 100644 index 0000000000..06a592a060 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/info.json @@ -0,0 +1,148 @@ +{ + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "usb": { + "vid": "0x3434" + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "dip_switch": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "processor": "STM32F401", + "bootloader": "stm32-dfu", + "matrix_pins": { + "cols": ["A0", "A1", "A2", "A3", "C0", "C1", "C2", "C3", "A8", "C12", "B9", "C6", "C7", "C4", "C5","A15", "B10", "B12", "B13", "B14", "B15"], + "rows": ["B0", "B1", "B8", "B3", "B4", "B5"] + }, + "diode_direction": "COL2ROW", + "indicators": { + "caps_lock": "C9", + "num_lock": "C8" + }, + "layouts": { + "LAYOUT_104_ansi": { + "layout": [ + {"matrix":[0,0], "x":0, "y":0}, + {"matrix":[0,1], "x":2, "y":0}, + {"matrix":[0,2], "x":3, "y":0}, + {"matrix":[0,3], "x":4, "y":0}, + {"matrix":[0,4], "x":5, "y":0}, + {"matrix":[0,5], "x":6.5, "y":0}, + {"matrix":[0,6], "x":7.5, "y":0}, + {"matrix":[0,7], "x":8.5, "y":0}, + {"matrix":[0,8], "x":9.5, "y":0}, + {"matrix":[0,9], "x":11, "y":0}, + {"matrix":[0,10], "x":12, "y":0}, + {"matrix":[0,11], "x":13, "y":0}, + {"matrix":[0,12], "x":14, "y":0}, + {"matrix":[0,14], "x":15.25, "y":0}, + {"matrix":[0,15], "x":16.25, "y":0}, + {"matrix":[0,16], "x":17.25, "y":0}, + + {"matrix":[1,0], "x":0, "y":1.25}, + {"matrix":[1,1], "x":1, "y":1.25}, + {"matrix":[1,2], "x":2, "y":1.25}, + {"matrix":[1,3], "x":3, "y":1.25}, + {"matrix":[1,4], "x":4, "y":1.25}, + {"matrix":[1,5], "x":5, "y":1.25}, + {"matrix":[1,6], "x":6, "y":1.25}, + {"matrix":[1,7], "x":7, "y":1.25}, + {"matrix":[1,8], "x":8, "y":1.25}, + {"matrix":[1,9], "x":9, "y":1.25}, + {"matrix":[1,10], "x":10, "y":1.25}, + {"matrix":[1,11], "x":11, "y":1.25}, + {"matrix":[1,12], "x":12, "y":1.25}, + {"matrix":[1,13], "x":13, "y":1.25, "w":2}, + {"matrix":[1,14], "x":15.25, "y":1.25}, + {"matrix":[1,15], "x":16.25, "y":1.25}, + {"matrix":[1,16], "x":17.25, "y":1.25}, + {"matrix":[1,17], "x":18.5, "y":1.25}, + {"matrix":[1,18], "x":19.5, "y":1.25}, + {"matrix":[1,19], "x":20.5, "y":1.25}, + {"matrix":[1,20], "x":21.5, "y":1.25}, + + {"matrix":[2,0], "x":0, "y":2.25, "w":1.5}, + {"matrix":[2,1], "x":1.5, "y":2.25}, + {"matrix":[2,2], "x":2.5, "y":2.25}, + {"matrix":[2,3], "x":3.5, "y":2.25}, + {"matrix":[2,4], "x":4.5, "y":2.25}, + {"matrix":[2,5], "x":5.5, "y":2.25}, + {"matrix":[2,6], "x":6.5, "y":2.25}, + {"matrix":[2,7], "x":7.5, "y":2.25}, + {"matrix":[2,8], "x":8.5, "y":2.25}, + {"matrix":[2,9], "x":9.5, "y":2.25}, + {"matrix":[2,10], "x":10.5, "y":2.25}, + {"matrix":[2,11], "x":11.5, "y":2.25}, + {"matrix":[2,12], "x":12.5, "y":2.25}, + {"matrix":[2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix":[2,14], "x":15.25, "y":2.25}, + {"matrix":[2,15], "x":16.25, "y":2.25}, + {"matrix":[2,16], "x":17.25, "y":2.25}, + {"matrix":[2,17], "x":18.5, "y":2.25}, + {"matrix":[2,18], "x":19.5, "y":2.25}, + {"matrix":[2,19], "x":20.5, "y":2.25}, + {"matrix":[2,20], "x":21.5, "y":2.25, "h":2}, + + {"matrix":[3,0], "x":0, "y":3.25, "w":1.75}, + {"matrix":[3,1], "x":1.75, "y":3.25}, + {"matrix":[3,2], "x":2.75, "y":3.25}, + {"matrix":[3,3], "x":3.75, "y":3.25}, + {"matrix":[3,4], "x":4.75, "y":3.25}, + {"matrix":[3,5], "x":5.75, "y":3.25}, + {"matrix":[3,6], "x":6.75, "y":3.25}, + {"matrix":[3,7], "x":7.75, "y":3.25}, + {"matrix":[3,8], "x":8.75, "y":3.25}, + {"matrix":[3,9], "x":9.75, "y":3.25}, + {"matrix":[3,10], "x":10.75, "y":3.25}, + {"matrix":[3,11], "x":11.75, "y":3.25}, + {"matrix":[3,13], "x":12.75, "y":3.25, "w":2.25}, + {"matrix":[3,17], "x":18.5, "y":3.25}, + {"matrix":[3,18], "x":19.5, "y":3.25}, + {"matrix":[3,19], "x":20.5, "y":3.25}, + + {"matrix":[4,0], "x":0, "y":4.25, "w":2.25}, + {"matrix":[4,2], "x":2.25, "y":4.25}, + {"matrix":[4,3], "x":3.25, "y":4.25}, + {"matrix":[4,4], "x":4.25, "y":4.25}, + {"matrix":[4,5], "x":5.25, "y":4.25}, + {"matrix":[4,6], "x":6.25, "y":4.25}, + {"matrix":[4,7], "x":7.25, "y":4.25}, + {"matrix":[4,8], "x":8.25, "y":4.25}, + {"matrix":[4,9], "x":9.25, "y":4.25}, + {"matrix":[4,10], "x":10.25, "y":4.25}, + {"matrix":[4,11], "x":11.25, "y":4.25}, + {"matrix":[4,13], "x":12.25, "y":4.25, "w":2.75}, + {"matrix":[4,15], "x":16.25, "y":4.25}, + {"matrix":[4,17], "x":18.5, "y":4.25}, + {"matrix":[4,18], "x":19.5, "y":4.25}, + {"matrix":[4,19], "x":20.5, "y":4.25}, + {"matrix":[4,20], "x":21.5, "y":4.25, "h":2}, + + {"matrix":[5,0], "x":0, "y":5.25, "w":1.25}, + {"matrix":[5,1], "x":1.25, "y":5.25, "w":1.25}, + {"matrix":[5,2], "x":2.5, "y":5.25, "w":1.25}, + {"matrix":[5,6], "x":3.75, "y":5.25, "w":6.25}, + {"matrix":[5,10], "x":10, "y":5.25, "w":1.25}, + {"matrix":[5,11], "x":11.25, "y":5.25, "w":1.25}, + {"matrix":[5,12], "x":12.5, "y":5.25, "w":1.25}, + {"matrix":[5,13], "x":13.75, "y":5.25, "w":1.25}, + {"matrix":[5,14], "x":15.25, "y":5.25}, + {"matrix":[5,15], "x":16.25, "y":5.25}, + {"matrix":[5,16], "x":17.25, "y":5.25}, + {"matrix":[5,17], "x":18.5, "y":5.25, "w":2}, + {"matrix":[5,18], "x":20.5, "y":5.25} + ] + } + } +} diff --git a/keyboards/keychron/c2_pro_v2/mcuconf.h b/keyboards/keychron/c2_pro_v2/mcuconf.h new file mode 100644 index 0000000000..ca470fb5b3 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/mcuconf.h @@ -0,0 +1,28 @@ +/* Copyright 2025 @ Keychron (https://www.keychron.com) + * + * 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_HSECLK +#define STM32_HSECLK 16000000U + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/c2_pro_v2/readme.md b/keyboards/keychron/c2_pro_v2/readme.md new file mode 100644 index 0000000000..4c9462260e --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/readme.md @@ -0,0 +1,30 @@ +# Keychron C2 Pro V2 + +![Keychron C2 Pro](https://i.imgur.com/BQE1tFO.jpg) + +A customizable 100% keyboard. + +Rev1 is based on STM32L432 and rev2 is based on STM32F402. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Keychron C2 Pro +* Hardware Availability: [Keychron C2 Pro QMK/VIA Wired Mechanical Keyboard](https://www.keychron.com/products/keychron-c2-pro-qmk-via-wired-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make keychron/c2_pro_v2/ansi/rgb:default + make keychron/c2_pro_v2/ansi/white:default + +Flashing example for this keyboard: + + make keychron/c2_pro_v2/ansi/rgb:default:flash + make keychron/c2_pro_v2/ansi/white:default:flash + +## bootloader + +Enter the bootloader in two ways: + +* **Bootmagic reset**: Hold down the key located at *K00*, commonly programmed as *Esc* while plugging in the keyboard. +* **Physical reset button**: Briefly press the RESET button under the spacebar. + +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). From 563eb6fdc9224a772d19e2d5714e903fa7c021c6 Mon Sep 17 00:00:00 2001 From: Xelus22 <17491233+Xelus22@users.noreply.github.com> Date: Mon, 3 Mar 2025 08:04:33 +1100 Subject: [PATCH 205/592] [Keyboard] Valor Rev3 (#22581) * initial valor * update * fixup and move to info.json * clean up keymap * code review from lesshonor * Update keyboards/xelus/valor/rev3/readme.md Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> * Update readme.md * Update keyboards/xelus/valor/rev3/rev3.c Co-authored-by: Drashna Jaelre * Update rev3.c * Remove custom rev3.c * remove via keymap * remove empty rules.mk * Update keyboards/xelus/valor/rev3/keymaps/default/keymap.c Co-authored-by: jack --------- Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Co-authored-by: Drashna Jaelre Co-authored-by: Xelus22 <> Co-authored-by: jack --- keyboards/xelus/valor/rev3/info.json | 130 ++++++++++++++++++ .../xelus/valor/rev3/keymaps/default/keymap.c | 34 +++++ keyboards/xelus/valor/rev3/readme.md | 25 ++++ 3 files changed, 189 insertions(+) create mode 100644 keyboards/xelus/valor/rev3/info.json create mode 100644 keyboards/xelus/valor/rev3/keymaps/default/keymap.c create mode 100644 keyboards/xelus/valor/rev3/readme.md diff --git a/keyboards/xelus/valor/rev3/info.json b/keyboards/xelus/valor/rev3/info.json new file mode 100644 index 0000000000..52954fb784 --- /dev/null +++ b/keyboards/xelus/valor/rev3/info.json @@ -0,0 +1,130 @@ +{ + "manufacturer": "Xelus", + "keyboard_name": "Valor Rev3", + "maintainer": "Xelus22", + "bootloader": "atmel-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["E6", "F0", "F1", "F4", "F5", "F6", "F7", "B5", "B4", "D7", "D6", "D4", "D5", "D3", "D2"], + "rows": ["B1", "B2", "C7", "C6", "B6"] + }, + "processor": "atmega32u4", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "rgblight": { + "default": { + "animation": "rainbow_swirl" + }, + "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": 32, + "max_brightness": 200, + "saturation_steps": 8 + }, + "url": "", + "usb": { + "device_version": "0.0.1", + "pid": "0x5652", + "vid": "0x5845" + }, + "ws2812": { + "pin": "B0" + }, + "community_layouts": ["alice_split_bs"], + "layouts": { + "LAYOUT_alice_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.25, "y": 0}, + {"matrix": [0, 6], "x": 6.25, "y": 0}, + {"matrix": [0, 7], "x": 7.25, "y": 0}, + {"matrix": [0, 8], "x": 10.25, "y": 0}, + {"matrix": [0, 9], "x": 11.25, "y": 0}, + {"matrix": [0, 10], "x": 12.25, "y": 0}, + {"matrix": [0, 11], "x": 13.25, "y": 0}, + {"matrix": [0, 12], "x": 14.25, "y": 0}, + {"matrix": [0, 13], "x": 15.25, "y": 0}, + {"matrix": [0, 14], "x": 16.25, "y": 0}, + {"matrix": [2, 14], "x": 17.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1.25, "y": 1, "w": 1.5}, + {"matrix": [1, 2], "x": 2.75, "y": 1}, + {"matrix": [1, 3], "x": 3.75, "y": 1}, + {"matrix": [1, 4], "x": 4.75, "y": 1}, + {"matrix": [1, 5], "x": 5.75, "y": 1}, + {"matrix": [1, 6], "x": 6.75, "y": 1}, + {"matrix": [1, 7], "x": 9.75, "y": 1}, + {"matrix": [1, 8], "x": 10.75, "y": 1}, + {"matrix": [1, 9], "x": 11.75, "y": 1}, + {"matrix": [1, 10], "x": 12.75, "y": 1}, + {"matrix": [1, 11], "x": 13.75, "y": 1}, + {"matrix": [1, 12], "x": 14.75, "y": 1}, + {"matrix": [1, 13], "x": 15.75, "y": 1}, + {"matrix": [1, 14], "x": 16.75, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1.25, "y": 2, "w": 1.75}, + {"matrix": [2, 2], "x": 3, "y": 2}, + {"matrix": [2, 3], "x": 4, "y": 2}, + {"matrix": [2, 4], "x": 5, "y": 2}, + {"matrix": [2, 5], "x": 6, "y": 2}, + {"matrix": [2, 6], "x": 7, "y": 2}, + {"matrix": [2, 7], "x": 10, "y": 2}, + {"matrix": [2, 8], "x": 11, "y": 2}, + {"matrix": [2, 9], "x": 12, "y": 2}, + {"matrix": [2, 10], "x": 13, "y": 2}, + {"matrix": [2, 11], "x": 14, "y": 2}, + {"matrix": [2, 12], "x": 15, "y": 2}, + {"matrix": [2, 13], "x": 16, "y": 2, "w": 2.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 3.5, "y": 3}, + {"matrix": [3, 3], "x": 4.5, "y": 3}, + {"matrix": [3, 4], "x": 5.5, "y": 3}, + {"matrix": [3, 5], "x": 6.5, "y": 3}, + {"matrix": [3, 6], "x": 7.5, "y": 3}, + {"matrix": [3, 7], "x": 9.5, "y": 3}, + {"matrix": [3, 8], "x": 10.5, "y": 3}, + {"matrix": [3, 9], "x": 11.5, "y": 3}, + {"matrix": [3, 10], "x": 12.5, "y": 3}, + {"matrix": [3, 11], "x": 13.5, "y": 3}, + {"matrix": [3, 12], "x": 14.5, "y": 3}, + {"matrix": [3, 13], "x": 15.5, "y": 3, "w": 1.75}, + {"matrix": [3, 14], "x": 17.25, "y": 3}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.5}, + {"matrix": [4, 3], "x": 4.25, "y": 4, "w": 1.5}, + {"matrix": [4, 5], "x": 5.75, "y": 4, "w": 2}, + {"matrix": [4, 6], "x": 7.75, "y": 4, "w": 1.25}, + {"matrix": [4, 8], "x": 9.5, "y": 4, "w": 2.75}, + {"matrix": [4, 10], "x": 12.25, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 16.75, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/xelus/valor/rev3/keymaps/default/keymap.c b/keyboards/xelus/valor/rev3/keymaps/default/keymap.c new file mode 100644 index 0000000000..f663bc9589 --- /dev/null +++ b/keyboards/xelus/valor/rev3/keymaps/default/keymap.c @@ -0,0 +1,34 @@ +/* Copyright 2023 Harrison Chan (Xelus) + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_alice_split_bs( + KC_ESC, 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_DEL, KC_BSPC, + KC_PGUP, 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_PGDN, 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_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RGUI, + KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RCTL + ), + + [1] = LAYOUT_alice_split_bs( + UG_TOGG, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + UG_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/xelus/valor/rev3/readme.md b/keyboards/xelus/valor/rev3/readme.md new file mode 100644 index 0000000000..63b938003e --- /dev/null +++ b/keyboards/xelus/valor/rev3/readme.md @@ -0,0 +1,25 @@ +# Valor Rev 3 + +An Alice replacement keyboard PCB. + +* Keyboard Maintainer: [Xelus22](https://github.com/Xelus22) +* Hardware Supported: Valor Rev 3 +* Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make xelus/valor/rev3:default + +Flashing example for this keyboard: + + make xelus/valor/rev3: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 top left key and plug in the keyboard +* **Physical Reset**: The AVR ISP is exposed. Short the RST pad with GND. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` From cb6e1c1af54790e778062ba7203aa23370c263b0 Mon Sep 17 00:00:00 2001 From: leah-splitkb <103112489+leah-splitkb@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:33:03 +0100 Subject: [PATCH 206/592] Add splitkb.com's Elora (#22557) * Add splitkb's Elora * WIP * Make requested changes * fix missing call to keyboard init user for elora * sync vial_qmk with qmk * Add fixes * Add encoder quadrature and update files * Update Readme * Implement changes * Remove encoder driver from keyboard.json * make requested changed * Implement changes and remove myriad_task as it wasn't actually doing anything. * Remove myriad.h from matrix.c * Simplify OLED code debug * Update RGB keycodes (qmk#24484) * remove rules.mk (qmk#23281) * Add matrix state sync --------- Co-authored-by: NapOli1084 <10320176+NapOli1084@users.noreply.github.com> Co-authored-by: harveysch <126267034+harvey-splitkb@users.noreply.github.com> Co-authored-by: harvey Co-authored-by: VeyPatch <126267034+VeyPatch@users.noreply.github.com> --- keyboards/splitkb/elora/info.json | 172 ++++++++++ .../splitkb/elora/keymaps/debug/config.h | 9 + .../splitkb/elora/keymaps/debug/keymap.c | 71 ++++ .../splitkb/elora/keymaps/debug/readme.md | 22 ++ .../splitkb/elora/keymaps/debug/rules.mk | 2 + .../splitkb/elora/keymaps/default/config.h | 7 + .../splitkb/elora/keymaps/default/keymap.c | 320 ++++++++++++++++++ .../splitkb/elora/keymaps/default/readme.md | 50 +++ keyboards/splitkb/elora/readme.md | 43 +++ keyboards/splitkb/elora/rev1/config.h | 60 ++++ keyboards/splitkb/elora/rev1/halconf.h | 13 + keyboards/splitkb/elora/rev1/keyboard.json | 108 ++++++ keyboards/splitkb/elora/rev1/matrix.c | 57 ++++ keyboards/splitkb/elora/rev1/mcuconf.h | 18 + keyboards/splitkb/elora/rev1/myriad.c | 315 +++++++++++++++++ keyboards/splitkb/elora/rev1/myriad.h | 52 +++ keyboards/splitkb/elora/rev1/rev1.c | 214 ++++++++++++ keyboards/splitkb/elora/rev1/rev1.h | 14 + keyboards/splitkb/elora/rev1/rules.mk | 7 + 19 files changed, 1554 insertions(+) create mode 100644 keyboards/splitkb/elora/info.json create mode 100644 keyboards/splitkb/elora/keymaps/debug/config.h create mode 100644 keyboards/splitkb/elora/keymaps/debug/keymap.c create mode 100644 keyboards/splitkb/elora/keymaps/debug/readme.md create mode 100644 keyboards/splitkb/elora/keymaps/debug/rules.mk create mode 100644 keyboards/splitkb/elora/keymaps/default/config.h create mode 100644 keyboards/splitkb/elora/keymaps/default/keymap.c create mode 100644 keyboards/splitkb/elora/keymaps/default/readme.md create mode 100644 keyboards/splitkb/elora/readme.md create mode 100644 keyboards/splitkb/elora/rev1/config.h create mode 100644 keyboards/splitkb/elora/rev1/halconf.h create mode 100644 keyboards/splitkb/elora/rev1/keyboard.json create mode 100644 keyboards/splitkb/elora/rev1/matrix.c create mode 100644 keyboards/splitkb/elora/rev1/mcuconf.h create mode 100644 keyboards/splitkb/elora/rev1/myriad.c create mode 100644 keyboards/splitkb/elora/rev1/myriad.h create mode 100644 keyboards/splitkb/elora/rev1/rev1.c create mode 100644 keyboards/splitkb/elora/rev1/rev1.h create mode 100644 keyboards/splitkb/elora/rev1/rules.mk diff --git a/keyboards/splitkb/elora/info.json b/keyboards/splitkb/elora/info.json new file mode 100644 index 0000000000..2ed11bfd19 --- /dev/null +++ b/keyboards/splitkb/elora/info.json @@ -0,0 +1,172 @@ +{ + "manufacturer": "splitkb.com", + "keyboard_name": "Elora", + "maintainer": "splitkb", + "build": { + "lto": true + }, + "split": { + "enabled": true + }, + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "MX101", "matrix": [4, 1], "x": 0, "y": 0.75}, + {"label": "MX105", "matrix": [4, 2], "x": 1, "y": 0.75}, + {"label": "MX109", "matrix": [3, 1], "x": 2, "y": 0.25}, + {"label": "MX113", "matrix": [3, 2], "x": 3, "y": 0}, + {"label": "MX117", "matrix": [2, 1], "x": 4, "y": 0.25}, + {"label": "MX121", "matrix": [2, 2], "x": 5, "y": 0.5}, + {"label": "LPED1", "matrix": [0, 1], "x": 7, "y": 0}, + {"label": "RPED1", "matrix": [6, 6], "x": 8.5, "y": 0}, + {"label": "MX221", "matrix": [8, 5], "x": 10.5, "y": 0.5}, + {"label": "MX217", "matrix": [8, 6], "x": 11.5, "y": 0.25}, + {"label": "MX213", "matrix": [9, 5], "x": 12.5, "y": 0}, + {"label": "MX209", "matrix": [9, 6], "x": 13.5, "y": 0.25}, + {"label": "MX205", "matrix": [10, 5], "x": 14.5, "y": 0.75}, + {"label": "MX201", "matrix": [10, 6], "x": 15.5, "y": 0.75}, + {"label": "MX102", "matrix": [4, 0], "x": 0, "y": 1.75}, + {"label": "MX106", "matrix": [4, 3], "x": 1, "y": 1.75}, + {"label": "MX110", "matrix": [3, 0], "x": 2, "y": 1.25}, + {"label": "MX114", "matrix": [3, 3], "x": 3, "y": 1}, + {"label": "MX118", "matrix": [2, 0], "x": 4, "y": 1.25}, + {"label": "MX122", "matrix": [2, 3], "x": 5, "y": 1.5}, + {"label": "LPED2", "matrix": [0, 2], "x": 7, "y": 1}, + {"label": "RPED2", "matrix": [6, 5], "x": 8.5, "y": 1}, + {"label": "MX222", "matrix": [8, 4], "x": 10.5, "y": 1.5}, + {"label": "MX218", "matrix": [8, 7], "x": 11.5, "y": 1.25}, + {"label": "MX214", "matrix": [9, 4], "x": 12.5, "y": 1}, + {"label": "MX210", "matrix": [9, 7], "x": 13.5, "y": 1.25}, + {"label": "MX206", "matrix": [10, 4], "x": 14.5, "y": 1.75}, + {"label": "MX202", "matrix": [10, 7], "x": 15.5, "y": 1.75}, + {"label": "MX103", "matrix": [4, 7], "x": 0, "y": 2.75}, + {"label": "MX107", "matrix": [4, 4], "x": 1, "y": 2.75}, + {"label": "MX111", "matrix": [3, 7], "x": 2, "y": 2.25}, + {"label": "MX115", "matrix": [3, 4], "x": 3, "y": 2}, + {"label": "MX119", "matrix": [2, 7], "x": 4, "y": 2.25}, + {"label": "MX123", "matrix": [2, 4], "x": 5, "y": 2.5}, + {"label": "LPED3", "matrix": [0, 3], "x": 7, "y": 2}, + {"label": "RPED3", "matrix": [6, 4], "x": 8.5, "y": 2}, + {"label": "MX223", "matrix": [8, 3], "x": 10.5, "y": 2.5}, + {"label": "MX219", "matrix": [8, 0], "x": 11.5, "y": 2.25}, + {"label": "MX215", "matrix": [9, 3], "x": 12.5, "y": 2}, + {"label": "MX211", "matrix": [9, 0], "x": 13.5, "y": 2.25}, + {"label": "MX207", "matrix": [10, 3], "x": 14.5, "y": 2.75}, + {"label": "MX203", "matrix": [10, 0], "x": 15.5, "y": 2.75}, + {"label": "MX104", "matrix": [4, 6], "x": 0, "y": 3.75}, + {"label": "MX108", "matrix": [4, 5], "x": 1, "y": 3.75}, + {"label": "MX112", "matrix": [3, 6], "x": 2, "y": 3.25}, + {"label": "MX116", "matrix": [3, 5], "x": 3, "y": 3}, + {"label": "MX120", "matrix": [2, 6], "x": 4, "y": 3.25}, + {"label": "MX124", "matrix": [2, 5], "x": 5, "y": 3.5}, + {"label": "MX131", "matrix": [0, 0], "x": 6, "y": 4}, + {"label": "MX130", "matrix": [0, 4], "x": 7, "y": 4.25}, + {"label": "MX230", "matrix": [6, 3], "x": 8.5, "y": 4.25}, + {"label": "MX231", "matrix": [6, 7], "x": 9.5, "y": 4}, + {"label": "MX224", "matrix": [8, 2], "x": 10.5, "y": 3.5}, + {"label": "MX220", "matrix": [8, 1], "x": 11.5, "y": 3.25}, + {"label": "MX216", "matrix": [9, 2], "x": 12.5, "y": 3}, + {"label": "MX212", "matrix": [9, 1], "x": 13.5, "y": 3.25}, + {"label": "MX208", "matrix": [10, 2], "x": 14.5, "y": 3.75}, + {"label": "MX204", "matrix": [10, 1], "x": 15.5, "y": 3.75}, + {"label": "MX125", "matrix": [1, 7], "x": 2.5, "y": 4.25}, + {"label": "MX126", "matrix": [1, 6], "x": 3.5, "y": 4.25}, + {"label": "MX127", "matrix": [1, 5], "x": 4.5, "y": 4.5}, + {"label": "MX128", "matrix": [1, 4], "x": 5.5, "y": 5}, + {"label": "MX129", "matrix": [0, 5], "x": 6.5, "y": 5.25}, + {"label": "MX229", "matrix": [6, 2], "x": 9, "y": 5.25}, + {"label": "MX228", "matrix": [7, 3], "x": 10, "y": 5}, + {"label": "MX227", "matrix": [7, 2], "x": 11, "y": 4.5}, + {"label": "MX226", "matrix": [7, 1], "x": 12, "y": 4.25}, + {"label": "MX225", "matrix": [7, 0], "x": 13, "y": 4.25} + ] + }, + "LAYOUT_myr": { + "layout": [ + {"label": "MX101", "matrix": [4, 1], "x": 0, "y": 0.75}, + {"label": "MX105", "matrix": [4, 2], "x": 1, "y": 0.75}, + {"label": "MX109", "matrix": [3, 1], "x": 2, "y": 0.25}, + {"label": "MX113", "matrix": [3, 2], "x": 3, "y": 0}, + {"label": "MX117", "matrix": [2, 1], "x": 4, "y": 0.25}, + {"label": "MX121", "matrix": [2, 2], "x": 5, "y": 0.5}, + {"label": "LPED1", "matrix": [0, 1], "x": 7, "y": 0}, + {"label": "RPED1", "matrix": [6, 6], "x": 8.5, "y": 0}, + {"label": "MX221", "matrix": [8, 5], "x": 10.5, "y": 0.5}, + {"label": "MX217", "matrix": [8, 6], "x": 11.5, "y": 0.25}, + {"label": "MX213", "matrix": [9, 5], "x": 12.5, "y": 0}, + {"label": "MX209", "matrix": [9, 6], "x": 13.5, "y": 0.25}, + {"label": "MX205", "matrix": [10, 5], "x": 14.5, "y": 0.75}, + {"label": "MX201", "matrix": [10, 6], "x": 15.5, "y": 0.75}, + {"label": "MX102", "matrix": [4, 0], "x": 0, "y": 1.75}, + {"label": "MX106", "matrix": [4, 3], "x": 1, "y": 1.75}, + {"label": "MX110", "matrix": [3, 0], "x": 2, "y": 1.25}, + {"label": "MX114", "matrix": [3, 3], "x": 3, "y": 1}, + {"label": "MX118", "matrix": [2, 0], "x": 4, "y": 1.25}, + {"label": "MX122", "matrix": [2, 3], "x": 5, "y": 1.5}, + {"label": "LPED2", "matrix": [0, 2], "x": 7, "y": 1}, + {"label": "RPED2", "matrix": [6, 5], "x": 8.5, "y": 1}, + {"label": "MX222", "matrix": [8, 4], "x": 10.5, "y": 1.5}, + {"label": "MX218", "matrix": [8, 7], "x": 11.5, "y": 1.25}, + {"label": "MX214", "matrix": [9, 4], "x": 12.5, "y": 1}, + {"label": "MX210", "matrix": [9, 7], "x": 13.5, "y": 1.25}, + {"label": "MX206", "matrix": [10, 4], "x": 14.5, "y": 1.75}, + {"label": "MX202", "matrix": [10, 7], "x": 15.5, "y": 1.75}, + {"label": "MX103", "matrix": [4, 7], "x": 0, "y": 2.75}, + {"label": "MX107", "matrix": [4, 4], "x": 1, "y": 2.75}, + {"label": "MX111", "matrix": [3, 7], "x": 2, "y": 2.25}, + {"label": "MX115", "matrix": [3, 4], "x": 3, "y": 2}, + {"label": "MX119", "matrix": [2, 7], "x": 4, "y": 2.25}, + {"label": "MX123", "matrix": [2, 4], "x": 5, "y": 2.5}, + {"label": "LPED3", "matrix": [0, 3], "x": 7, "y": 2}, + {"label": "RPED3", "matrix": [6, 4], "x": 8.5, "y": 2}, + {"label": "MX223", "matrix": [8, 3], "x": 10.5, "y": 2.5}, + {"label": "MX219", "matrix": [8, 0], "x": 11.5, "y": 2.25}, + {"label": "MX215", "matrix": [9, 3], "x": 12.5, "y": 2}, + {"label": "MX211", "matrix": [9, 0], "x": 13.5, "y": 2.25}, + {"label": "MX207", "matrix": [10, 3], "x": 14.5, "y": 2.75}, + {"label": "MX203", "matrix": [10, 0], "x": 15.5, "y": 2.75}, + {"label": "MX104", "matrix": [4, 6], "x": 0, "y": 3.75}, + {"label": "MX108", "matrix": [4, 5], "x": 1, "y": 3.75}, + {"label": "MX112", "matrix": [3, 6], "x": 2, "y": 3.25}, + {"label": "MX116", "matrix": [3, 5], "x": 3, "y": 3}, + {"label": "MX120", "matrix": [2, 6], "x": 4, "y": 3.25}, + {"label": "MX124", "matrix": [2, 5], "x": 5, "y": 3.5}, + {"label": "MX131", "matrix": [0, 0], "x": 6, "y": 4}, + {"label": "MX130", "matrix": [0, 4], "x": 7, "y": 4.25}, + {"label": "MX230", "matrix": [6, 3], "x": 8.5, "y": 4.25}, + {"label": "MX231", "matrix": [6, 7], "x": 9.5, "y": 4}, + {"label": "MX224", "matrix": [8, 2], "x": 10.5, "y": 3.5}, + {"label": "MX220", "matrix": [8, 1], "x": 11.5, "y": 3.25}, + {"label": "MX216", "matrix": [9, 2], "x": 12.5, "y": 3}, + {"label": "MX212", "matrix": [9, 1], "x": 13.5, "y": 3.25}, + {"label": "MX208", "matrix": [10, 2], "x": 14.5, "y": 3.75}, + {"label": "MX204", "matrix": [10, 1], "x": 15.5, "y": 3.75}, + {"label": "MX125", "matrix": [1, 7], "x": 2.5, "y": 4.25}, + {"label": "MX126", "matrix": [1, 6], "x": 3.5, "y": 4.25}, + {"label": "MX127", "matrix": [1, 5], "x": 4.5, "y": 4.5}, + {"label": "MX128", "matrix": [1, 4], "x": 5.5, "y": 5}, + {"label": "MX129", "matrix": [0, 5], "x": 6.5, "y": 5.25}, + {"label": "MX229", "matrix": [6, 2], "x": 9, "y": 5.25}, + {"label": "MX228", "matrix": [7, 3], "x": 10, "y": 5}, + {"label": "MX227", "matrix": [7, 2], "x": 11, "y": 4.5}, + {"label": "MX226", "matrix": [7, 1], "x": 12, "y": 4.25}, + {"label": "MX225", "matrix": [7, 0], "x": 13, "y": 4.25}, + {"label": "MYRL1", "matrix": [5, 0], "x": 0, "y": 6}, + {"label": "MYRL2", "matrix": [5, 1], "x": 1, "y": 6}, + {"label": "MYRL3", "matrix": [5, 2], "x": 2, "y": 6}, + {"label": "MYRL4", "matrix": [5, 3], "x": 3, "y": 6}, + {"label": "MYRL5", "matrix": [5, 4], "x": 5, "y": 6}, + {"label": "MYRR1", "matrix": [11, 0], "x": 8, "y": 6}, + {"label": "MYRR2", "matrix": [11, 1], "x": 9, "y": 6}, + {"label": "MYRR3", "matrix": [11, 2], "x": 10, "y": 6}, + {"label": "MYRR4", "matrix": [11, 3], "x": 11, "y": 6}, + {"label": "MYRR5", "matrix": [11, 4], "x": 13, "y": 6} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/splitkb/elora/keymaps/debug/config.h b/keyboards/splitkb/elora/keymaps/debug/config.h new file mode 100644 index 0000000000..0024fe4dfe --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/debug/config.h @@ -0,0 +1,9 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Myriad boilerplate +#define MYRIAD_ENABLE + +#define RGBLIGHT_EFFECT_BREATHING \ No newline at end of file diff --git a/keyboards/splitkb/elora/keymaps/debug/keymap.c b/keyboards/splitkb/elora/keymaps/debug/keymap.c new file mode 100644 index 0000000000..a8a5973b00 --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/debug/keymap.c @@ -0,0 +1,71 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + _DEFAULT = 0, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_DEFAULT] = LAYOUT_myr( + KC_A, KC_E, KC_I, KC_M, KC_Q, KC_U, KC_9, KC_9, S(KC_U), S(KC_Q), S(KC_M), S(KC_I), S(KC_E), S(KC_A), + KC_B, KC_F, KC_J, KC_N, KC_R, KC_V, KC_8, KC_8, S(KC_V), S(KC_R), S(KC_N), S(KC_J), S(KC_F), S(KC_B), + KC_C, KC_G, KC_K, KC_O, KC_S, KC_W, KC_7, KC_7, S(KC_W), S(KC_S), S(KC_O), S(KC_K), S(KC_G), S(KC_C), + KC_D, KC_H, KC_L, KC_P, KC_T, KC_X, KC_5, KC_6, KC_6, KC_5, S(KC_X), S(KC_T), S(KC_P), S(KC_L), S(KC_H), S(KC_D), + KC_0, KC_1, KC_2, KC_3, KC_4, KC_4, KC_3, KC_2, KC_1, KC_0, + + KC_A, KC_B, KC_C, KC_D, KC_E, KC_A, KC_B, KC_C, KC_D, KC_E + ), +}; + +void keyboard_post_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_enable_noeeprom(); // enables RGB, without saving settings + rgblight_sethsv_noeeprom(HSV_RED); // sets the color to red without saving + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // sets mode to Fast breathing without saving + #endif +} + +#ifdef ENCODER_ENABLE +bool encoder_update_user(uint8_t index, bool clockwise) { + // 0-3 left-half encoders + // 4-7 are right-half encoders + if (index == 0) { + tap_code(KC_0); + } else if (index == 1) { + tap_code(KC_1); + } else if (index == 2) { + tap_code(KC_2); + } else if (index == 3) { + // Myriad + tap_code(KC_3); + } else if (index == 4) { + tap_code(KC_4); + } else if (index == 5) { + tap_code(KC_5); + } else if (index == 6) { + tap_code(KC_6); + } else if (index == 7) { + // Myriad + tap_code(KC_7); + } + + if (clockwise) { + tap_code16(KC_PLUS); + } else { + tap_code(KC_MINUS); + } + + return false; +} +#endif + +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // A 128x32 OLED rotated 90 degrees is 5 characters wide and 16 characters tall + // This example string should fill that neatly + oled_write_P(PSTR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!@#$%^&*()[]{}-=_+?"), is_keyboard_master()); + return false; +} +#endif diff --git a/keyboards/splitkb/elora/keymaps/debug/readme.md b/keyboards/splitkb/elora/keymaps/debug/readme.md new file mode 100644 index 0000000000..ec5705070c --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/debug/readme.md @@ -0,0 +1,22 @@ +# Elora's Debug Keymap + +To make debugging your build as easy as possible, we have provided a special debugging keymap. It is not intended to actually type on, it is just here to make sure that your hardware is working correctly. + +## Keys + +The left side uses lowercase letters, the right side uses uppercase ones. + +## Encoders + +Encoders output a number, depending on the installed position. +These correspond to the index used for custom encoder code. + +The number is followed by either a `+` or a `-`, depending on the direction turned. + +## LEDs + +Underglow RGB should be fading between red and off. + +## OLEDs + +Both the primary and secondary side should be filled with characters. diff --git a/keyboards/splitkb/elora/keymaps/debug/rules.mk b/keyboards/splitkb/elora/keymaps/debug/rules.mk new file mode 100644 index 0000000000..6c52b64847 --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/debug/rules.mk @@ -0,0 +1,2 @@ +RGB_MATRIX_ENABLE = no +RGBLIGHT_ENABLE = yes \ No newline at end of file diff --git a/keyboards/splitkb/elora/keymaps/default/config.h b/keyboards/splitkb/elora/keymaps/default/config.h new file mode 100644 index 0000000000..e35c193957 --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/default/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Myriad boilerplate +#define MYRIAD_ENABLE \ No newline at end of file diff --git a/keyboards/splitkb/elora/keymaps/default/keymap.c b/keyboards/splitkb/elora/keymaps/default/keymap.c new file mode 100644 index 0000000000..84f53561fd --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/default/keymap.c @@ -0,0 +1,320 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + _QWERTY = 0, + _DVORAK, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST, +}; + +// Aliases for readability +#define QWERTY DF(_QWERTY) +#define COLEMAK DF(_COLEMAK_DH) +#define DVORAK DF(_DVORAK) + +#define SYM MO(_SYM) +#define NAV MO(_NAV) +#define FKEYS MO(_FUNCTION) +#define ADJUST MO(_ADJUST) + +#define CTL_ESC MT(MOD_LCTL, KC_ESC) +#define CTL_QUOT MT(MOD_RCTL, KC_QUOTE) +#define CTL_MINS MT(MOD_RCTL, KC_MINUS) +#define ALT_ENT MT(MOD_LALT, KC_ENT) + +// Note: LAlt/Enter (ALT_ENT) is not the same thing as the keyboard shortcut Alt+Enter. +// The notation `mod/tap` denotes a key that activates the modifier `mod` when held down, and +// produces the key `tap` when tapped (i.e. pressed and released). + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * Base Layer: QWERTY + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | |LCtrl | | RCtrl| | Y | U | I | O | P | Bksp | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | S | D | F | G | | LAlt | | RAlt | | H | J | K | L | ; : |Ctrl/' "| + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,----------------------------. ,------. ,----------------------------. ,------. + * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute | + * `----------------------------' `------' `----------------------------' '------' + */ + [_QWERTY] = LAYOUT_myr( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC, + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_LCTL, KC_RCTL, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC, + CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_LALT, KC_RALT, KC_H , KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N , KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP, + + KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE + ), + +/* + * Base Layer: Dvorak + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | Tab | ' " | , < | . > | P | Y | |LCtrl | | RCtrl| | F | G | C | R | L | Bksp | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | O | E | U | I | | LAlt | | RAlt | | D | H | T | N | S |Ctrl/- _| + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | LShift | ; : | Q | J | K | X | [ { |CapsLk| |F-keys| ] } | B | M | W | V | Z | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,----------------------------. ,------. ,----------------------------. ,------. + * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute | + * `----------------------------' `------' `----------------------------' '------' + */ + [_DVORAK] = LAYOUT_myr( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC, + KC_TAB ,KC_QUOTE,KC_COMM, KC_DOT, KC_P , KC_Y , KC_LCTL, KC_RCTL, KC_F, KC_G , KC_C , KC_R , KC_L , KC_BSPC, + CTL_ESC , KC_A , KC_O , KC_E , KC_U , KC_I , KC_LALT, KC_RALT, KC_D, KC_H , KC_T , KC_N , KC_S , CTL_MINS, + KC_LSFT ,KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_B, KC_M , KC_W , KC_V , KC_Z , KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP, + + KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE + ), + +/* + * Base Layer: Colemak DH + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | |LShift| |RShift| | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | Tab | Q | W | F | P | B | |LCtrl | | RCtrl| | J | L | U | Y | ; : | Bksp | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | R | S | T | G | | LAlt | | RAlt | | M | N | E | I | O |Ctrl/' "| + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | [ { |CapsLk| |F-keys| ] } | K | H | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,----------------------------. ,------. ,----------------------------. ,------. + * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute | + * `----------------------------' `------' `----------------------------' '------' + */ + [_COLEMAK_DH] = LAYOUT_myr( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LSFT, KC_RSFT, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC, + KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_LCTL, KC_RCTL, KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC, + CTL_ESC , KC_A , KC_R , KC_S , KC_T , KC_G , KC_LALT, KC_RALT, KC_M, KC_N , KC_E , KC_I , KC_O , CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_D , KC_V , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_K, KC_H ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP, + + KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_MUTE + ), + +/* + * Nav Layer: Media, navigation + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | | | | | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | GUI | Alt | Ctrl | Shift| | | | | | | PgDn | ← | ↓ | → | VolDn| Insert | + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,----------------------------. ,------. ,----------------------------. ,------. + * | Prev | Next | Pause | Stop | | Mute | | Prev | Next | Pause | Stop | | Mute | + * `----------------------------' `------' `----------------------------' '------' + */ + [_NAV] = LAYOUT_myr( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL, + _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, _______, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS, + _______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Sym Layer: Numbers and symbols + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | ` | 1 | 2 | 3 | 4 | 5 | | | | | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | ~ | ! | @ | # | $ | % | | | | | | ^ | & | * | ( | ) | + | + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,-----------------------------. ,------. ,---------------------------. ,------. + * | | | | | | | | | | | | | | + * `-----------------------------' `------' `---------------------------' '------' + */ + [_SYM] = LAYOUT_myr( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , _______, _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL , + KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, + KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, KC_LCBR, _______, _______, KC_RCBR, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Function Layer: Function keys + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | F9 | F10 | F11 | F12 | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | | | | | | | | Shift| Ctrl | Alt | GUI | | + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,-----------------------------. ,------. ,---------------------------. ,------. + * | | | | | | | | | | | | | | + * `-----------------------------' `------' `---------------------------' '------' + */ + [_FUNCTION] = LAYOUT_myr( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______, + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Adjust Layer: Default layer settings, RGB + * + * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | | |QWERTY| | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| + * | | | |Dvorak| | | | | | | | TOG | SAI | HUI | VAI | MOD | | + * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| + * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * + * ,-----------------------------. ,------. ,---------------------------. ,------. + * | | | | | | | | | | | | | | + * `-----------------------------' `------' `---------------------------' '------' + */ + [_ADJUST] = LAYOUT_myr( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, DVORAK , _______, _______, _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______, + _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______, + _______, _______, _______,_______, _______, _______, _______, _______, _______, _______, + + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + + ), + +// /* +// * Layer template - LAYOUT +// * +// * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), + +// /* +// * Layer template - LAYOUT_myr +// * +// * ,-------------------------------------------. ,------. ,------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------| |------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+------+------| |------|------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// * +// * ,-----------------------------. ,------. ,---------------------------. ,------. +// * | | | | | | | | | | | | | | +// * `-----------------------------' `------' `---------------------------' '------' +// */ +// [_LAYERINDEX] = LAYOUT_myr( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +}; + +/* The default OLED and rotary encoder code can be found at the bottom of qmk_firmware/keyboards/splitkb/elora/rev1/rev1.c + * These default settings can be overriden by your own settings in your keymap.c + * DO NOT edit the rev1.c file; instead override the weakly defined default functions by your own. + */ + +/* DELETE THIS LINE TO UNCOMMENT (1/2) +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // Your code goes here +} +#endif + +#ifdef ENCODER_ENABLE +bool encoder_update_user(uint8_t index, bool clockwise) { + // Your code goes here +} +#endif +DELETE THIS LINE TO UNCOMMENT (2/2) */ diff --git a/keyboards/splitkb/elora/keymaps/default/readme.md b/keyboards/splitkb/elora/keymaps/default/readme.md new file mode 100644 index 0000000000..7e95db3938 --- /dev/null +++ b/keyboards/splitkb/elora/keymaps/default/readme.md @@ -0,0 +1,50 @@ +# Elora's Default Keymap +The default keymap contains 5 layers which allows it to include all keys found on an ANSI layout TKL keyboard plus media keys. +Hardware features of the Elora such as OLEDs, rotary encoders and underglow are also supported. + +The Elora keymap is in essence identical to the [Kyria keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/splitkb/kyria/keymaps/default/readme.md), just with an additional number row. A deep dive into the keymap is provided there. + +The five different layers are the following: +1. Base layer (QWERTY, Colemak-DH or Dvorak) +2. Navigation layer +3. Symbols/Numbers layer +4. Function layer +5. Adjust layer + +## Base layer(s) +### Qwerty +![Qwerty](https://i.imgur.com/SZB1Z5gh.jpg) + +### Dvorak +![Dvorak](https://i.imgur.com/RWB5Qhnh.jpg) + +### Colemak-DH +![Colemak](https://i.imgur.com/4DjdGsGh.jpg) + +## Navigation layer +![Navigation](https://i.imgur.com/tDM1MZeh.jpg) + +## Symbols layer +![Symbol](https://i.imgur.com/9LsxnLRh.jpg) + +## Function layer +![Function](https://i.imgur.com/KMCqh7Ch.jpg) + +## Adjust layer +![Adjust](https://i.imgur.com/6WtMo8ih.jpg) + +# Hardware Features + +## Rotary Encoder +The left rotary encoders are programmed to send Left or Right whereas the right encoder sends PgUp or PgDn on every turn. + +## OLEDs +The OLEDs display the current layer at the top of the active layers stack, the Elora logo and lock status (caps lock, num lock, scroll lock). + +## Underglow +The underglow LEDs should default red. + +## Going further… +This default keymap can be used as is, unchanged, as a daily driver for your Elora but you're invited to treat your keymap like a bonsai. At the beginning, it's just like the default keymap but from time to time, you can tweak it a little. Cut a little key here, let another combo grow there. Slowly but surely it will be a unique keymap that will fit you like a glove. + +Check out the #keymap-ideas channel on the official splitkb Discord server for inspiration. \ No newline at end of file diff --git a/keyboards/splitkb/elora/readme.md b/keyboards/splitkb/elora/readme.md new file mode 100644 index 0000000000..2935b7bd7d --- /dev/null +++ b/keyboards/splitkb/elora/readme.md @@ -0,0 +1,43 @@ +![Elora](https://i.imgur.com/AUCjyBuh.jpg) + +# Elora +The Elora is a 62-key keyboard, based on the Kyria by splitkb.com. It comes preassembled, is compatible with Vial so you don't need to program or compile your firmware, and accepts Myriad modules so you can add cool features with just a screwdriver. + +Keyboard Maintainer: [splitkb.com](https://github.com/splitkb) +Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/elora/rev1:default + +The keyboard can be flashed by copying the resulting `splitkb_elora_rev1_default.uf2` file onto the `RPI-RP2` flash drive. + +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 +You can enter the bootloader in 3 ways: + +* **Reset button**: Double-tap the reset button on the side of the PCB. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. +* **Bootloader reset**: As a last resort, hold down the small "Boot" button near the USB connector while plugging in the keyboard. + +# Features +The Elora is an evolved version of the Kyria that comes with a number row, and has an emphasis on ease of use for beginners, as well as being hackable for advanced customers. It comes preassembled: the only tool you need is a screwdriver. + +- A comfortable 62 keys, including a number row. It's perfect for beginners who want to feel what a split keyboard feels like without the layout feeling cramped, and a nice option for people who know they frequently use the number row, like typists, gamers, some software engineers and Excel warriors. +- Powered by an RP2040 controller, it’s quick enough to handle anything a keyboard should be able to do… and much more. +- 16 megabytes of flash memory ensure that it’s ready for just about everything. Putting a sped-up movie on an RGB display you’ve wired up to your prototyping Myriad module? Say no more. +- Supports MX switches with preassembled hot-swap sockets. No soldering iron needed. You can solder them to the alternative set of pads if you'd prefer to, though. +- Supports Choc switches by soldering. This does require assembly with tools like a soldering iron. Hot swap is still possible using Mill-Max sockets, which too require soldering. +- Subtle RGB underglow with 6 LEDs per half to personalise the colour of your keyboard. It can be disabled for those who don't want it. +- Supports the tenting puck, which allows you to mount it to most camera tripods so you can place your keyboard at exactly the angle you want it. +- Supports up to one Myriad module per half, so you can add a myriad of available modules without having to solder. +- Supports up to one 128x64 pixel OLED display per half, which doesn't require soldering. +- There's a TRRS jack for foot pedal or external switch support. You can use one such switch per half by default, but the wiring supports up to three external switches per half. Great for accessibility purposes, or just plain fun if you want to hook up a digital foot pedal to your voice chat software, game or whatever else you can think of. +- If you're into soldering, you can put up to three encoders per half on seven predefined locations: near the top of the thumb cluster, at the innermost thumb cluster button, or each location on the outer columns. If you don't want to solder, you can of course still use a rotary encoder Myriad module. + +# What's Myriad? + +![A collection of Myriad modules](https://i.imgur.com/86u7BLMl.jpg) + +Myriad is a system that allows you to plug in modules to add new functionality to your keyboard, all without having to solder. It's an [open standard](https://myriad.splitkb.com/), meaning that anyone will be able to create their own modules, which you can then plug into your keyboard. It's a very capable standard, so we're very curious to see what other modules you will come up with! diff --git a/keyboards/splitkb/elora/rev1/config.h b/keyboards/splitkb/elora/rev1/config.h new file mode 100644 index 0000000000..7633cf00af --- /dev/null +++ b/keyboards/splitkb/elora/rev1/config.h @@ -0,0 +1,60 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// I2C0, onboard SSD1306 socket and I2C to Myriad module +#define I2C_DRIVER I2CD0 +#define I2C1_SDA_PIN GP0 +#define I2C1_SCL_PIN GP1 +// We need to slow down the I2C clock because the default of 400.000 +// fails to communicate with Zetta ZD24C02A EEPROM on a Myriad card. +#define I2C1_CLOCK_SPEED 100000 + +// SPI1, both for onboard matrix data and SPI to Myriad module +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP10 +#define SPI_MOSI_PIN GP11 +#define SPI_MISO_PIN GP12 + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_DRIVER SIOD1 +#define SERIAL_USART_TX_PIN GP20 +#define SERIAL_USART_RX_PIN GP21 + +// Potential onboard speaker, not populated by default +#define AUDIO_PIN GP23 + +// Transmitting pointing device status to the master side +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_COMBINED + +// VBUS detection +#define USB_VBUS_PIN GP25 + +// Define matrix size +#define MATRIX_COLS 8 +#define MATRIX_ROWS 12 + +// Encoders +// 3 onboard, 1 for Myriad +#define NUM_ENCODERS_LEFT 4 +#define NUM_ENCODERS_RIGHT 4 +#define ENCODER_RESOLUTION 2 + +// OLED display +#define OLED_DISPLAY_128X64 +// If someone has only one OLED display +// and that display was on the slave side. +// It wouldn't work at all. This fixes that +// including some code in rev1.c but makes +// it so the timeout's are not synced +// between halves. +#undef SPLIT_OLED_ENABLE +#define OLED_TIMEOUT 0 + diff --git a/keyboards/splitkb/elora/rev1/halconf.h b/keyboards/splitkb/elora/rev1/halconf.h new file mode 100644 index 0000000000..9798aa34f9 --- /dev/null +++ b/keyboards/splitkb/elora/rev1/halconf.h @@ -0,0 +1,13 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SIO TRUE +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD +#define HAL_USE_ADC TRUE + +#include_next diff --git a/keyboards/splitkb/elora/rev1/keyboard.json b/keyboards/splitkb/elora/rev1/keyboard.json new file mode 100644 index 0000000000..a2d02a9a49 --- /dev/null +++ b/keyboards/splitkb/elora/rev1/keyboard.json @@ -0,0 +1,108 @@ +{ + "keyboard_name": "Elora rev1", + "bootloader": "rp2040", + "features": { + "pointing_device": true, + "rgb_matrix": true, + "rgblight": false, + "encoder": true, + "oled": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "audio": false + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "solid_color": 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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"x": 90, "y": 0, "flags": 2}, + {"x": 45, "y": 0, "flags": 2}, + {"x": 0, "y": 0, "flags": 2}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 45, "y": 64, "flags": 2}, + {"x": 90, "y": 64, "flags": 2}, + {"x": 134, "y": 0, "flags": 2}, + {"x": 179, "y": 0, "flags": 2}, + {"x": 224, "y": 0, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 179, "y": 64, "flags": 2}, + {"x": 134, "y": 64, "flags": 2} + ], + "max_brightness": 150, + "split_count": [6, 6] + }, + "rgblight": { + "led_count": 12, + "split": true + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP14" + }, + "serial": { + "driver": "usart" + }, + "transport": { + "sync": { + "matrix_state": true + }, + "watchdog": true, + "watchdog_timeout": 3000 + } + }, + "usb": { + "pid": "0x9D9D" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP15" + } +} diff --git a/keyboards/splitkb/elora/rev1/matrix.c b/keyboards/splitkb/elora/rev1/matrix.c new file mode 100644 index 0000000000..625eafcd85 --- /dev/null +++ b/keyboards/splitkb/elora/rev1/matrix.c @@ -0,0 +1,57 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "matrix.h" +#include "spi_master.h" + +// The matrix is hooked up to a chain of 74xx165 shift registers. +// Pin F0 acts as Chip Select (active-low) +// The signal goes to a NOT gate, whose output is wired to +// a) the latch pin of the shift registers +// b) the "enable" pin of a tri-state buffer, +// attached between the shift registers and MISO +// F0 has an external pull-up. +// SCK works as usual. +// +// Note that the matrix contains a variety of data. +// In addition to the keys, it also reads the rotary encoders +// and whether the board is the left/right half. + +void matrix_init_custom(void) { + // Note: `spi_init` has already been called + // in `keyboard_pre_init_kb()`, so nothing to do here +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + // Enough to hold the shift registers + uint16_t length = 5; + uint8_t data[length]; + + // Matrix SPI config + // 1) Pin + // 2) Mode: Register shifts on rising clock, and clock idles low + // pol = 0 & pha = 0 => mode 0 + // 3) LSB first: Register outputs H first, and we want H as MSB, + // as this result in a neat A-H order in the layout macro. + // 4) Divisor: 2 is the fastest possible, at Fclk / 2. + // range is 2-128 + spi_start(GP13, false, 0, 128); + spi_receive(data, length); + spi_stop(); + + bool matrix_has_changed = false; + for (uint8_t i = 0; i < length; i++) { + // Bitwise NOT because we use pull-ups, + // and switches short the pin to ground, + // but the matrix uses 1 to indicate a pressed switch + uint8_t word = ~data[i]; + matrix_has_changed |= current_matrix[i] ^ word; + current_matrix[i] = word; + } +#ifdef MYRIAD_ENABLE + bool myriad_hook_matrix(matrix_row_t current_matrix[]); + return matrix_has_changed || myriad_hook_matrix(current_matrix); +#else + return matrix_has_changed; +#endif +} \ No newline at end of file diff --git a/keyboards/splitkb/elora/rev1/mcuconf.h b/keyboards/splitkb/elora/rev1/mcuconf.h new file mode 100644 index 0000000000..58290187cf --- /dev/null +++ b/keyboards/splitkb/elora/rev1/mcuconf.h @@ -0,0 +1,18 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef RP_SIO_USE_UART1 +#define RP_SIO_USE_UART1 TRUE + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE + +#undef RP_ADC_USE_ADC1 +#define RP_ADC_USE_ADC1 TRUE diff --git a/keyboards/splitkb/elora/rev1/myriad.c b/keyboards/splitkb/elora/rev1/myriad.c new file mode 100644 index 0000000000..8bb6054df9 --- /dev/null +++ b/keyboards/splitkb/elora/rev1/myriad.c @@ -0,0 +1,315 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +#include "myriad.h" + +#include "i2c_master.h" +#include "analog.h" + +typedef struct __attribute__((__packed__)) { + char magic_numbers[3]; + uint8_t version_major; + uint8_t version_minor; + uint8_t version_patch; + uint32_t checksum; + uint16_t payload_length; +} myriad_header_t; + +typedef struct __attribute__((__packed__)) { + uint16_t vendor_id; + uint16_t product_id; + uint8_t revision; +} identity_record_t; + +static bool myriad_reader(uint8_t *data, uint16_t length) { + const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit + const uint16_t i2c_timeout = 100; // in milliseconds + + uint8_t num_pages = (length / 256) + 1; + uint8_t last_page_size = length % 256; + + for (int i = 0; i < num_pages; i++) { + uint8_t reg = 0; // We always start on a page boundary, so this is always zero + uint16_t read_length; + if (i == num_pages - 1) { + read_length = last_page_size; + } else { + read_length = 256; + } + i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i*256]), read_length, i2c_timeout); + if (s != I2C_STATUS_SUCCESS) { return false; } + } + return true; +} + +static bool verify_header(myriad_header_t *header) { + char magic_numbers[] = {'M', 'Y', 'R'}; + uint8_t version_major = 1; + uint16_t version_minor = 0; + + for (int i = 0; i < sizeof(magic_numbers); i++) { + // Check that the header starts with 'MYR', indicating that this is indeed a Myriad card. + if (header->magic_numbers[i] != magic_numbers[i]) { + return false; + } + } + + if (header->version_major != version_major || header->version_minor > version_minor) { + // We obviously don't support cards with a different major version, because that indicates a breaking change. + // We also don't support cards with HIGHER minor version, + // as we are not guaranteed to be able to properly use all its features. + return false; + } + + if (header->payload_length > (2048 - sizeof(myriad_header_t))) { + // The EEPROM chips are *at most* 16kb / 2kB large, + // and some of that is taken up by the header. + // We obviously can't have a payload which exceeds the EEPROM's size. + return false; + } + + return true; +} + +// Sourced from https://en.wikipedia.org/wiki/Adler-32#Example_implementation +static bool verify_checksum(uint8_t *data, uint16_t length, uint32_t checksum) { + // Skip the header + data += sizeof(myriad_header_t); + length -= sizeof(myriad_header_t); + + const uint32_t MOD_ADLER = 65521; + + uint32_t a = 1, b = 0; + size_t index; + + // Process each byte of the data in order + for (index = 0; index < length; ++index) + { + a = (a + data[index]) % MOD_ADLER; + b = (b + a) % MOD_ADLER; + } + uint32_t calculated = ((b << 16) | a); + + return calculated == checksum; +} + +// Locates a specific entry by type +// Returns the offset of the PAYLOAD. +static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8_t *data, uint16_t minimum, uint16_t maximum) { + if (minimum < sizeof(myriad_header_t)) { + // Records must start *after* the header. + // We silently allow this so the caller can just specify `0` as minimum for the first entry. + minimum = sizeof(myriad_header_t); + } + + uint16_t offset = minimum; + while (offset < maximum) { + if (data[offset] == entry_type) { + // Type matches! + if (data[offset+1] == entry_data_length) { + // We found what we are looking for, so return payload reference. + return offset+2; + } else { + // The entry is the wrong length? + return -2; + } + } else { + // No type match, so skip this one + // We skip the type byte, the length byte, and any potential data (with length stored in the length byte) + offset += 2 + data[offset+1]; + } + } + + // We hit the maximum and didn't find what we are looking for + return -1; +} + +static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t *record) { + const uint8_t identity_type = 0x01; + const uint8_t entry_data_length = sizeof(identity_record_t); + int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length); + if (result < 0) { return false; } + + for (int i = 0; i < sizeof(identity_record_t); i++) { + ((uint8_t*)record)[i] = data[result + i]; + } + return true; +} + +static myriad_card_t _detect_myriad(void) { + gpio_set_pin_input(MYRIAD_PRESENT); + wait_ms(100); + // The pin has an external pull-up, and a Myriad card shorts it to ground. + #ifndef MYRIAD_OVERRIDE_PRESENCE + if (gpio_read_pin(MYRIAD_PRESENT)) { + return NONE; + } + #endif + + // Attempt to read header + myriad_header_t header; + if (!myriad_reader((uint8_t*)&header, sizeof(header))) { return INVALID; } + if (!verify_header(&header)) { return INVALID; } + + // Now that we have determined that the header is valid + // and we know the payload length, read the entire thing + uint8_t data[2048]; // Guaranteed to be large enough. + uint16_t data_size = sizeof(header)+header.payload_length; + if (!myriad_reader(data, data_size)) { return INVALID; } + if (!verify_checksum(data, data_size, header.checksum)) { return INVALID; } + + identity_record_t identity; + if (!read_card_identity(data, data_size, &identity)) { return INVALID; } + + if (identity.vendor_id == 0x0001 && identity.product_id == 0x0001) { + return SKB_ENCODER; + } else if (identity.vendor_id == 0x0001 && identity.product_id == 0x0002) { + return SKB_JOYSTICK; + } else if (identity.vendor_id == 0x0001 && identity.product_id == 0x0003) { + return SKB_SWITCHES; + } + + return UNKNOWN; +} + +// Determine card presence & identity +// Does NOT initialize the card for use! +myriad_card_t detect_myriad(void) { + static myriad_card_t card = UNINITIALIZED; + + if (card == UNINITIALIZED) { + i2c_init(); + card = _detect_myriad(); + } + + return card; +} + +static void myr_switches_init(void) { + gpio_set_pin_input_high(MYRIAD_GPIO1); // S4 + gpio_set_pin_input_high(MYRIAD_GPIO2); // S2 + gpio_set_pin_input_high(MYRIAD_GPIO3); // S1 + gpio_set_pin_input_high(MYRIAD_GPIO4); // S3 +} + +static void myr_encoder_init(void) { + gpio_set_pin_input_high(MYRIAD_GPIO1); // Press + gpio_set_pin_input_high(MYRIAD_GPIO2); // A + gpio_set_pin_input_high(MYRIAD_GPIO3); // B +} + +static uint16_t myr_joystick_timer; +static void myr_joystick_init(void) { + gpio_set_pin_input_high(MYRIAD_GPIO1); // Press + + myr_joystick_timer = timer_read(); +} + +// Make sure any card present is ready for use +static myriad_card_t myriad_card_init(void) { + static bool initialized = false; + + myriad_card_t card = detect_myriad(); + if (initialized) { + return card; + } + initialized = true; + + switch (card) { + case SKB_SWITCHES: + myr_switches_init(); + break; + case SKB_ENCODER: + myr_encoder_init(); + break; + case SKB_JOYSTICK: + myr_joystick_init(); + break; + default: + break; + } + return card; +} + +bool myriad_hook_matrix(matrix_row_t current_matrix[]) { + myriad_card_t card = myriad_card_init(); + uint8_t word = 0; + + if (card == SKB_SWITCHES) { + word |= ((!gpio_read_pin(MYRIAD_GPIO3)) & 1) << 0; + word |= ((!gpio_read_pin(MYRIAD_GPIO2)) & 1) << 1; + word |= ((!gpio_read_pin(MYRIAD_GPIO4)) & 1) << 2; + word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 3; + } else if (card == SKB_ENCODER) { + word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 4; + } else if (card == SKB_JOYSTICK) { + word |= ((!gpio_read_pin(MYRIAD_GPIO1)) & 1) << 4; + } else { + return false; + } + + // 5 bytes of on-board keys, so we are the 6th + bool matrix_has_changed = current_matrix[5] ^ word; + current_matrix[5] = word; + + return matrix_has_changed; +} + +static pin_t encoders_pad_a[NUM_ENCODERS_MAX_PER_SIDE]; +static pin_t encoders_pad_b[NUM_ENCODERS_MAX_PER_SIDE]; + +uint8_t myriad_hook_encoder(uint8_t index, bool pad_b) { + if (myriad_card_init() != SKB_ENCODER) { return 0; } + // 3 onboard encoders, so we are number 4 + pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index]; + encoders_pad_a[3] = MYRIAD_GPIO2; + encoders_pad_b[3] = MYRIAD_GPIO3; + return gpio_read_pin(pin) ? 1 : 0; +} + +report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { + if (myriad_card_init() != SKB_JOYSTICK) { return mouse_report; } + + if (timer_elapsed(myr_joystick_timer) < 10) { + wait_ms(2); + return mouse_report; + } + + myr_joystick_timer = timer_read(); + + // `analogReadPin` returns 0..1023 + int32_t y = (analogReadPin(MYRIAD_ADC1) - 512) * -1; // Note: axis is flipped + int32_t x = analogReadPin(MYRIAD_ADC2) - 512; + // Values are now -512..512 + + // Create a dead zone in the middle where the mouse doesn't move + const int16_t dead_zone = 10; + if ((y < 0 && y > -1*dead_zone) || (y > 0 && y < dead_zone)) { + y = 0; + } + if ((x < 0 && x > -1*dead_zone) || (x > 0 && x < dead_zone)) { + x = 0; + } + + // quadratic movement + x = abs(x) * x / 5000; + y = abs(y) * y / 5000; + + // Clamp final value to make sure we don't under/overflow + if (y < -127) { y = -127; } + if (y > 127) { y = 127; } + if (x < -127) { x = -127; } + if (x > 127) { x = 127; } + + mouse_report.x = x; + mouse_report.y = y; + + return mouse_report; +} + +void pointing_device_driver_init(void) { + gpio_set_pin_input(MYRIAD_ADC1); // Y + gpio_set_pin_input(MYRIAD_ADC2); // X +} \ No newline at end of file diff --git a/keyboards/splitkb/elora/rev1/myriad.h b/keyboards/splitkb/elora/rev1/myriad.h new file mode 100644 index 0000000000..03fe2b5e6b --- /dev/null +++ b/keyboards/splitkb/elora/rev1/myriad.h @@ -0,0 +1,52 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "matrix.h" + +typedef enum { UNINITIALIZED, NONE, INVALID, UNKNOWN, SKB_SWITCHES, SKB_ENCODER, SKB_JOYSTICK } myriad_card_t; + +bool myriad_hook_matrix(matrix_row_t current_matrix[]); +uint8_t myriad_hook_encoder(uint8_t index, bool pad_b); +myriad_card_t detect_myriad(void); + +//// Elora-specific pinout + +// Control signals +#define MYRIAD_PRESENT GP3 +#define MYRIAD_MCU_OVERRIDE GP2 + +// General I/O +#define MYRIAD_ADC1 GP26 +#define MYRIAD_ADC2 GP27 +#define MYRIAD_ADC1_CHANNEL 0 +#define MYRIAD_ADC2_CHANNEL 1 +#define MYRIAD_PWM1 GP23 +#define MYRIAD_PWM2 GP24 +#define MYRIAD_GPIO1 GP4 +#define MYRIAD_GPIO2 GP5 +#define MYRIAD_GPIO3 GP6 +#define MYRIAD_GPIO4 GP8 + +// UART +#define MYRIAD_RX GP17 +#define MYRIAD_TX GP16 +#define MYRIAD_CTS GP18 +#define MYRIAD_RTS GP19 + +// SPI +#define MYRIAD_MISO GP12 +#define MYRIAD_MOSI GP11 +#define MYRIAD_SCK GP10 +#define MYRIAD_MODULE_CS GP9 +#define MYRIAD_MATRIX_CS GP13 + +// I2C +#define MYRIAD_SDA GP0 +#define MYRIAD_SCL GP1 + +// RGB +#define MYRIAD_RGB GP15 diff --git a/keyboards/splitkb/elora/rev1/rev1.c b/keyboards/splitkb/elora/rev1/rev1.c new file mode 100644 index 0000000000..6ffc23a4cf --- /dev/null +++ b/keyboards/splitkb/elora/rev1/rev1.c @@ -0,0 +1,214 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rev1.h" +#include "spi_master.h" +#include "myriad.h" + +bool is_oled_enabled = true; + +//// HW init + +// Make sure all external hardware is +// in a known-good state on powerup +void keyboard_pre_init_kb(void) { + /// SPI Chip Select pins for various hardware + // Matrix CS + gpio_set_pin_output(GP13); + gpio_write_pin_high(GP13); + // Myriad Module CS + gpio_set_pin_output(GP9); + gpio_write_pin_high(GP9); + + gpio_set_pin_output(ELORA_CC1_PIN); + gpio_write_pin_low(ELORA_CC1_PIN); + + gpio_set_pin_output(ELORA_CC2_PIN); + gpio_write_pin_low(ELORA_CC2_PIN); + + // We have to get the SPI interface working quite early, + // So make sure it is available well before we need it + spi_init(); + + keyboard_pre_init_user(); +} + +//// Encoder functionality + +// The encoders are hooked in to the same shift registers as the switch matrix, so we can just piggyback on that. + +// Clone of a variant in quantum/matrix_common.c, but matrix-agnostic +bool mat_is_on(matrix_row_t mat[], uint8_t row, uint8_t col) { + return (mat[row] & ((matrix_row_t)1 << col)); +} + +uint8_t encoder_read_pads_from(uint8_t index, bool pad_b, matrix_row_t mat[]) { + // First two matrix rows: + // + // Pin A B C D E F G H + // Left: + // { __, __, __, __, __, __, A1, B1 }, + // { A3, B3, A2, B2, __, __, __, __ } + // Right: + // { A1, B1, __, __, __, __, __, __ }, + // { __, __, __, __, A2, B2, A3, B3 } + // + // See also rev1.h + + bool pad_value = false; + + if (is_keyboard_left()) { + if (index == 0) { + pad_value = pad_b ? mat_is_on(mat, 0, 7) : mat_is_on(mat, 0, 6); // B1, A1 + } else if (index == 1) { + pad_value = pad_b ? mat_is_on(mat, 1, 3) : mat_is_on(mat, 1, 2); // B2, A2 + } else if (index == 2) { + pad_value = pad_b ? mat_is_on(mat, 1, 1) : mat_is_on(mat, 1, 0); // B3, A3 + } + } else { + if (index == 0) { + pad_value = pad_b ? mat_is_on(mat, 0, 1) : mat_is_on(mat, 0, 0); // B1, A1 + } else if (index == 1) { + pad_value = pad_b ? mat_is_on(mat, 1, 5) : mat_is_on(mat, 1, 4); // B2, A2 + } else if (index == 2) { + pad_value = pad_b ? mat_is_on(mat, 1, 7) : mat_is_on(mat, 1, 6); // B3, A3 + } + } + + return pad_value ? 1 : 0; +} + +void encoder_quadrature_init_pin(uint8_t index, bool pad_b) { + // At this point the first matrix scan hasn't happened yet, + // so we can't use raw_matrix to initialize our encoder state + // as it contains all zeroes - so we have to do our own first scan + // The pins for myriad are initialized in myriad.c + + matrix_row_t mat[MATRIX_ROWS]; + + encoder_read_pads_from(index, pad_b, mat); +} + +extern matrix_row_t raw_matrix[MATRIX_ROWS]; // From quantum/matrix_common.c + +uint8_t encoder_quadrature_read_pin(uint8_t index, bool pad_b) { + // The matrix code already keeps the raw matrix up-to-date, + // so we only have to read the values from it + if(index <= 2) { + return encoder_read_pads_from(index, pad_b, raw_matrix); + } else { + #ifdef MYRIAD_ENABLE + return myriad_hook_encoder(index, pad_b); + #endif + return 0; + } + return 0; +} + +//// Default functionality + +#ifdef OLED_ENABLE +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + if (is_keyboard_left()) { + return OLED_ROTATION_270; + } else { + return OLED_ROTATION_90; + } +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + + if (!is_oled_enabled) { + oled_off(); + return false; + } else { + oled_on(); + } + + if (is_keyboard_master()) { + oled_write_P(PSTR("Elora rev1\n\n"), false); + + // Keyboard Layer Status + // Ideally we'd print the layer name, but no way to know that for sure + // Fallback option: just print the layer number + uint8_t layer = get_highest_layer(layer_state | default_layer_state); + oled_write_P(PSTR("Layer: "), false); + oled_write(get_u8_str(layer, ' '), false); + + // Keyboard LED Status + led_t led_state = host_keyboard_led_state(); + oled_write_P(led_state.num_lock ? PSTR(" NUM") : PSTR(" "), false); + oled_write_P(led_state.caps_lock ? PSTR("CAP") : PSTR(" "), false); + oled_write_P(led_state.scroll_lock ? PSTR("SCR") : PSTR(" "), false); + + // QMK Logo + // clang-format off + static const char PROGMEM qmk_logo[] = { + 0x81,0x82,0x83,0x84,0x0a, + 0xa1,0xa2,0xa3,0xa4,0x85,0x86,0x87,0x88,0x89,0x0a, + 0xc1,0xc2,0xc3,0xc4,0xa5,0xa6,0xa7,0xa8,0xa9,0x0a, + 0x8a,0x8b,0x8c,0x8d,0xc5,0xc6,0xc7,0xc8,0xc9,0x0a, + 0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0x00 + }; + // clang-format on + oled_set_cursor(0, oled_max_lines()-5); + oled_write_P(qmk_logo, false); + } else { + // Elora sigil + // clang-format off + static const char PROGMEM elora_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,224,240,248,120, 56, 60,188,158,158,222,206,207,207,207,239,239,239,239,239,239,207,207,207,206,222,158,158,188, 60, 56,120,248,240,224,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,224,248,252,126, 31,143,199,227,243,249,124, 60, 30, 31, 15, 7, 7, 3, 3, 3,131,193,225,241,249,253,255,255,255,255,127, 63, 31, 15, 7, 7, 7,143,223,254,252,252,249,243,227,199,143, 31,126,252,248,224,192, 0, 0, 0, 0, 0, + 0,192,240,254,255, 63, 7,227,248,252,127, 31, 15, 3, 1, 0, 0, 0,128,192,224,240,248,252,254,255,255,255,127, 63, 31, 15, 7, 3, 1,128,192,224,240,248,252,254,255,255,255,255,127, 63, 31, 15, 7, 15, 31,255,252,248,227, 7, 63,255,254,240,192, 0,252,255,255,255, 1,224,255,255,255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 31, 31, 31, 15, 7, 3, 1, 0, 0, 0,240,248,252,254,255,255,255,255,127, 63, 31, 15, 7, 3, 1,128,192,224,240,248,252,254,255,255,255,255,255,255,224, 1,255,255,255,252, + 63,255,255,255,128, 7,255,255,255,224, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,224,240,248,248,248,248,248,248, 0, 3, 3, 3, 3, 3, 3, 1,128,192,224,240,248,252,254,255,255,255,127, 63, 31, 15, 7, 3, 1,224,255,255,255, 7,128,255,255,255, 63, 0, 3, 15,127,255,252,224,199, 31, 63,254,248,240,192,128, 0, 0, 0, 0, 31, 31, 31, 31, 31, 31, 15, 7, 3, 1, 0, 0, 0, 0, 0, 0, 62, 63, 63, 63, 63, 63, 31, 15, 7, 3, 1, 0, 0, 0,128,192,240,248,254, 63, 31,199,224,252,255,127, 15, 3, 0, + 0, 0, 0, 0, 0, 3, 7, 31, 63,126,248,241,227,199,207,159, 62, 60,120,248,240,224,224,192,192,192,192,128,128,128,128,128,128,128,128,128,128,192,192,192,192,224,224,240,248,120, 60, 62,159,207,199,227,241,248,126, 63, 31, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 7, 7, 15, 31, 30, 28, 60, 61,121,121,123,115,243,243,243,247,247,247,247,247,247,243,243,243,115,123,121,121, 61, 60, 28, 30, 31, 15, 7, 7, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + // clang-format on + oled_set_cursor(0, (oled_max_lines()/2)-4); // logo is 8 lines high, so center vertically + oled_write_raw_P(elora_logo, sizeof(elora_logo)); + } + + return false; +} + +void housekeeping_task_kb(void) { + is_oled_enabled = last_input_activity_elapsed() < 60000; +} +#endif + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + + if (index == 0 || index == 1 || index == 2) { + // Left side + // Arrow keys + if (clockwise) { + tap_code(KC_RIGHT); + } else { + tap_code(KC_LEFT); + } + } else if (index == 4 || index == 5 || index == 6) { + // Right side + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } else if (index == 3 || index == 7) { + // Myriad + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } + return true; +} +#endif diff --git a/keyboards/splitkb/elora/rev1/rev1.h b/keyboards/splitkb/elora/rev1/rev1.h new file mode 100644 index 0000000000..d4c1ffedb2 --- /dev/null +++ b/keyboards/splitkb/elora/rev1/rev1.h @@ -0,0 +1,14 @@ +// Copyright 2024 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +//// Custom pins, might be useful in a keymap +// Wired to input of last shift register, overrides 10k pullup/pulldown +#define ELORA_SELFTEST_PIN GP14 + +// Can be used for USB current detection +#define ELORA_CC1_PIN GP28 +#define ELORA_CC2_PIN GP29 diff --git a/keyboards/splitkb/elora/rev1/rules.mk b/keyboards/splitkb/elora/rev1/rules.mk new file mode 100644 index 0000000000..643fdc9a1b --- /dev/null +++ b/keyboards/splitkb/elora/rev1/rules.mk @@ -0,0 +1,7 @@ +SPI_DRIVER_REQUIRED = yes +CUSTOM_MATRIX = lite + +# Myriad boilerplate +SRC += myriad.c matrix.c +ANALOG_DRIVER_REQUIRED = yes +POINTING_DEVICE_DRIVER = custom \ No newline at end of file From a585bd08a3febcedc4743ac7612f06a59a39b817 Mon Sep 17 00:00:00 2001 From: yiancar Date: Mon, 3 Mar 2025 03:32:25 +0000 Subject: [PATCH 207/592] Keycult Zero (#24927) * Initial Commit for Keycult Zero * Update keyboards/keycult/keycult_zero/keycult_zero.c Co-authored-by: Drashna Jaelre * Update keyboards/keycult/keycult_zero/rules.mk Co-authored-by: Drashna Jaelre --------- Co-authored-by: yiancar Co-authored-by: Drashna Jaelre --- keyboards/keycult/keycult_zero/keyboard.json | 603 ++++++++++++++++++ keyboards/keycult/keycult_zero/keycult_zero.c | 21 + .../keycult_zero/keymaps/default/keymap.c | 32 + keyboards/keycult/keycult_zero/readme.md | 32 + keyboards/keycult/keycult_zero/rules.mk | 2 + 5 files changed, 690 insertions(+) create mode 100755 keyboards/keycult/keycult_zero/keyboard.json create mode 100755 keyboards/keycult/keycult_zero/keycult_zero.c create mode 100644 keyboards/keycult/keycult_zero/keymaps/default/keymap.c create mode 100755 keyboards/keycult/keycult_zero/readme.md create mode 100644 keyboards/keycult/keycult_zero/rules.mk diff --git a/keyboards/keycult/keycult_zero/keyboard.json b/keyboards/keycult/keycult_zero/keyboard.json new file mode 100755 index 0000000000..4da493202f --- /dev/null +++ b/keyboards/keycult/keycult_zero/keyboard.json @@ -0,0 +1,603 @@ +{ + "keyboard_name": "Keycult Zero", + "manufacturer": "Yiancar-Designs", + "url": "https://yiancar-designs.com", + "maintainer": "Yiancar-Designs", + "usb": { + "vid": "0x8968", + "pid": "0x6337", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "B6", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["A1", "B1", "B0", "A7", "A6", "A5", "A4", "A3", "B2", "B10", "B11", "B12", "B13", "B14"], + "rows": ["A2", "B9", "B8", "B5", "B4"] + }, + "diode_direction": "COL2ROW", + "processor": "STM32F072", + "bootloader": "stm32-dfu", + "community_layouts": [ + "60_ansi", + "60_ansi_split_bs_rshift", + "60_ansi_tsangan", + "60_ansi_tsangan_split_bs_rshift", + "60_iso", + "60_iso_split_bs_rshift", + "60_iso_tsangan" + ], + "layout_aliases": { + "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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": 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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": { + "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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, 6], "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} + ] + } + } +} diff --git a/keyboards/keycult/keycult_zero/keycult_zero.c b/keyboards/keycult/keycult_zero/keycult_zero.c new file mode 100755 index 0000000000..fdbfa8f272 --- /dev/null +++ b/keyboards/keycult/keycult_zero/keycult_zero.c @@ -0,0 +1,21 @@ +/* Copyright 2024 Yiancar-Designs + * + * 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" + +void led_init_ports(void) { + // Set our LED pins as open drain outputs + gpio_set_pin_output_open_drain(LED_CAPS_LOCK_PIN); +} diff --git a/keyboards/keycult/keycult_zero/keymaps/default/keymap.c b/keyboards/keycult/keycult_zero/keymaps/default/keymap.c new file mode 100644 index 0000000000..998d514e29 --- /dev/null +++ b/keyboards/keycult/keycult_zero/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +/* Copyright 2024 Yiancar-Designs + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_all( /* Base */ + 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_NUBS, 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, MO(1), KC_APP, KC_RCTL), + +[1] = LAYOUT_all( /* FN */ + 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_TRNS, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; diff --git a/keyboards/keycult/keycult_zero/readme.md b/keyboards/keycult/keycult_zero/readme.md new file mode 100755 index 0000000000..f558808b16 --- /dev/null +++ b/keyboards/keycult/keycult_zero/readme.md @@ -0,0 +1,32 @@ +# Keycult Zero + +This is a standard 60% layout PCB. It supports VIA. + +* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) +* Hardware Supported: A 60% keyboard with STM32F072CB +* Hardware Availability: https://novelkeys.com/ + +## Instructions + +### Build + +Make example for this keyboard (after setting up your build environment): + + make keycult/keycult_zero:default + +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). + +### Reset + +- Unplug +- Hold Escape +- Plug In +- Unplug +- Release Escape + +### Flash + +- Unplug +- Hold Escape +- Plug In +- Flash using QMK Toolbox or CLI (`make keycult/keycult_zero::flash`) diff --git a/keyboards/keycult/keycult_zero/rules.mk b/keyboards/keycult/keycult_zero/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/keycult/keycult_zero/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From cc09f171116ba09ef65a82edd96619e21b3420ca Mon Sep 17 00:00:00 2001 From: floookay <33830863+floookay@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:34:16 +0100 Subject: [PATCH 208/592] add keyboard: zwerg (#24918) Co-authored-by: jack Co-authored-by: Joel Challis --- keyboards/zwerg/keyboard.json | 99 ++++++++++++++++++++++++ keyboards/zwerg/keymaps/default/keymap.c | 48 ++++++++++++ keyboards/zwerg/readme.md | 27 +++++++ 3 files changed, 174 insertions(+) create mode 100644 keyboards/zwerg/keyboard.json create mode 100644 keyboards/zwerg/keymaps/default/keymap.c create mode 100644 keyboards/zwerg/readme.md diff --git a/keyboards/zwerg/keyboard.json b/keyboards/zwerg/keyboard.json new file mode 100644 index 0000000000..a039d0fa39 --- /dev/null +++ b/keyboards/zwerg/keyboard.json @@ -0,0 +1,99 @@ +{ + "manufacturer": "floookay", + "keyboard_name": "zwerg", + "maintainer": "floookay", + "bootloader_instructions": "Press the reset button on the Gemini controller or right-side-bottom-right + esc", + "tags": ["ortho", "split", "40%", "OSHW"], + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP8", "GP7", "GP6", "GP5", "GP4", "GP3"], + "rows": ["GP28", "GP27", "GP26", "GP15", "GP14"] + }, + "split": { + "enabled": true, + "serial": { + "driver": "vendor", + "pin": "GP13" + } + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x7EEE", + "vid": "0xF100" + }, + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + + {"matrix": [5, 5], "x": 8, "y": 0}, + {"matrix": [5, 4], "x": 9, "y": 0}, + {"matrix": [5, 3], "x": 10, "y": 0}, + {"matrix": [5, 2], "x": 11, "y": 0}, + {"matrix": [5, 1], "x": 12, "y": 0}, + {"matrix": [5, 0], "x": 13, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [6, 5], "x": 8, "y": 1}, + {"matrix": [6, 4], "x": 9, "y": 1}, + {"matrix": [6, 3], "x": 10, "y": 1}, + {"matrix": [6, 2], "x": 11, "y": 1}, + {"matrix": [6, 1], "x": 12, "y": 1}, + {"matrix": [6, 0], "x": 13, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [7, 5], "x": 8, "y": 2}, + {"matrix": [7, 4], "x": 9, "y": 2}, + {"matrix": [7, 3], "x": 10, "y": 2}, + {"matrix": [7, 2], "x": 11, "y": 2}, + {"matrix": [7, 1], "x": 12, "y": 2}, + {"matrix": [7, 0], "x": 13, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + + {"matrix": [8, 4], "x": 9, "y": 3}, + {"matrix": [8, 3], "x": 10, "y": 3}, + {"matrix": [8, 2], "x": 11, "y": 3}, + {"matrix": [8, 1], "x": 12, "y": 3}, + {"matrix": [8, 0], "x": 13, "y": 3}, + + {"matrix": [4, 4], "x": 5, "y": 5, "h": 1.5}, + {"matrix": [4, 5], "x": 6, "y": 5, "h": 1.5}, + + {"matrix": [9, 5], "x": 8, "y": 5, "h": 1.5}, + {"matrix": [9, 4], "x": 9, "y": 5, "h": 1.5} + ] + } + } +} diff --git a/keyboards/zwerg/keymaps/default/keymap.c b/keyboards/zwerg/keymaps/default/keymap.c new file mode 100644 index 0000000000..81132bbe96 --- /dev/null +++ b/keyboards/zwerg/keymaps/default/keymap.c @@ -0,0 +1,48 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┐ + * │Tab│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │Bsp│ + * ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤ + * │Ctl│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ; │ ' │ + * ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┤ + * │Sft│ Z │ X │ C │ V │ B │ │ N │ M │ , │ . │ / │Sft│ + * ├───┼───┼───┼───┼───┼───┘ └───┼───┼───┼───┼───┼───┤ + * │Esc│lsu│rcl│Alt│Rai| ┌───┬───┐ ┌───┬───┐ │Low│AGr│Men│rcl│Cnf│ + * └───┴───┴───┴───┴───┘ │Spc│Del│ │Ent│Spc│ └───┴───┴───┴───┴───┘ + * │ │ │ │ │ │ + * └───┴───┘ └───┴───┘ + */ + [0] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + 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_ESC, KC_LGUI, KC_RCTL, KC_LALT, MO(2), MO(1), KC_RALT, KC_APP, KC_RCTL, MO(3), + KC_SPC, KC_DEL, KC_ENT, KC_SPC + ), + [1] = LAYOUT( + _______, _______, KC_VOLU, KC_MUTE, KC_VOLD, _______, _______, KC_PGUP, KC_UP, KC_PGDN, _______, _______, + _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, + _______, _______, _______, KC_MSTP, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______ + ), + [2] = LAYOUT( + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______ + ), + [3] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______ + ) +}; diff --git a/keyboards/zwerg/readme.md b/keyboards/zwerg/readme.md new file mode 100644 index 0000000000..5fe045bffc --- /dev/null +++ b/keyboards/zwerg/readme.md @@ -0,0 +1,27 @@ +# zwerg + +![zwerg](https://i.imgur.com/hkFLvd2.jpeg) + +A 40% ortholinear split keyboard. + +* Keyboard Maintainer: [floookay](https://github.com/floookay) +* Hardware Supported: zwerg pcbs with 0xcb Gemini +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + + make zwerg:default + +Flashing example for this keyboard: + + make zwerg: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 Gemini controller +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From b2ee1612fadd7b413122ad2d07af7f9e0907a35e Mon Sep 17 00:00:00 2001 From: Armand du Parc Locmaria Date: Mon, 3 Mar 2025 11:18:33 -0800 Subject: [PATCH 209/592] Fix Lily58 Lite Rev3 reversed columns (#24968) --- keyboards/lily58/lite_rev3/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lily58/lite_rev3/keyboard.json b/keyboards/lily58/lite_rev3/keyboard.json index 2073c0661e..ddb1f1877e 100644 --- a/keyboards/lily58/lite_rev3/keyboard.json +++ b/keyboards/lily58/lite_rev3/keyboard.json @@ -18,7 +18,7 @@ } }, "matrix_pins": { - "cols": ["GP8", "GP7", "GP6", "GP5", "GP4", "GP3"], + "cols": ["GP3", "GP4", "GP5", "GP6", "GP7", "GP8"], "rows": ["GP13", "GP12", "GP11", "GP10", "GP9"] }, "features": { From c2979e309f9c4cc758d9f1b1f37a5a9ff33b6426 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Tue, 4 Mar 2025 04:21:47 +0900 Subject: [PATCH 210/592] Add new keyboard "Palmslave" (#24814) Co-authored-by: Duncan Sutherland Co-authored-by: Drashna Jaelre --- keyboards/takashicompany/palmslave/config.h | 6 ++ .../takashicompany/palmslave/keyboard.json | 84 +++++++++++++++++++ .../palmslave/keymaps/default/keymap.c | 70 ++++++++++++++++ keyboards/takashicompany/palmslave/readme.md | 39 +++++++++ 4 files changed, 199 insertions(+) create mode 100644 keyboards/takashicompany/palmslave/config.h create mode 100644 keyboards/takashicompany/palmslave/keyboard.json create mode 100644 keyboards/takashicompany/palmslave/keymaps/default/keymap.c create mode 100644 keyboards/takashicompany/palmslave/readme.md diff --git a/keyboards/takashicompany/palmslave/config.h b/keyboards/takashicompany/palmslave/config.h new file mode 100644 index 0000000000..d9d98bf85f --- /dev/null +++ b/keyboards/takashicompany/palmslave/config.h @@ -0,0 +1,6 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define EE_HANDS diff --git a/keyboards/takashicompany/palmslave/keyboard.json b/keyboards/takashicompany/palmslave/keyboard.json new file mode 100644 index 0000000000..03d3f3e849 --- /dev/null +++ b/keyboards/takashicompany/palmslave/keyboard.json @@ -0,0 +1,84 @@ +{ + "manufacturer": "takashicompany", + "keyboard_name": "Palmslave", + "maintainer": "takashicompany", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["D4", "C6", "D7", "E6", "B4"], + "rows": ["F4", "F5", "F6", "F7"] + }, + "split": { + "enabled": true, + "matrix_pins": { + "right": { + "cols": ["B4", "E6", "D7", "C6", "D4"], + "rows": ["F4", "F5", "F6", "F7"] + } + }, + "serial": { + "pin": "D2" + } + }, + "url": "", + "usb": { + "device_version": "0.0.1", + "pid": "0x0063", + "vid": "0x7463" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.42, "w": 0.84, "h":0.84 }, + {"matrix": [0, 1], "x": 0.84, "y": 0.21, "w": 0.84, "h":0.84 }, + {"matrix": [0, 2], "x": 1.68, "y": 0, "w": 0.84, "h":0.84 }, + {"matrix": [0, 3], "x": 2.52, "y": 0.21, "w": 0.84, "h":0.84 }, + {"matrix": [0, 4], "x": 3.36, "y": 0.42, "w": 0.84, "h":0.84 }, + {"matrix": [4, 0], "x": 6.3, "y": 0.42, "w": 0.84, "h":0.84 }, + {"matrix": [4, 1], "x": 7.14, "y": 0.21, "w": 0.84, "h":0.84 }, + {"matrix": [4, 2], "x": 7.98, "y": 0, "w": 0.84, "h":0.84 }, + {"matrix": [4, 3], "x": 8.82, "y": 0.21, "w": 0.84, "h":0.84 }, + {"matrix": [4, 4], "x": 9.66, "y": 0.42, "w": 0.84, "h":0.84 }, + {"matrix": [1, 0], "x": 0, "y": 1.26, "w": 0.84, "h":0.84 }, + {"matrix": [1, 1], "x": 0.84, "y": 1.05, "w": 0.84, "h":0.84 }, + {"matrix": [1, 2], "x": 1.68, "y": 0.84, "w": 0.84, "h":0.84 }, + {"matrix": [1, 3], "x": 2.52, "y": 1.05, "w": 0.84, "h":0.84 }, + {"matrix": [1, 4], "x": 3.36, "y": 1.26, "w": 0.84, "h":0.84 }, + {"matrix": [5, 0], "x": 6.3, "y": 1.26, "w": 0.84, "h":0.84 }, + {"matrix": [5, 1], "x": 7.14, "y": 1.05, "w": 0.84, "h":0.84 }, + {"matrix": [5, 2], "x": 7.98, "y": 0.84, "w": 0.84, "h":0.84 }, + {"matrix": [5, 3], "x": 8.82, "y": 1.05, "w": 0.84, "h":0.84 }, + {"matrix": [5, 4], "x": 9.66, "y": 1.26, "w": 0.84, "h":0.84 }, + {"matrix": [2, 0], "x": 0, "y": 2.1, "w": 0.84, "h":0.84 }, + {"matrix": [2, 1], "x": 0.84, "y": 1.89, "w": 0.84, "h":0.84 }, + {"matrix": [2, 2], "x": 1.68, "y": 1.68, "w": 0.84, "h":0.84 }, + {"matrix": [2, 3], "x": 2.52, "y": 1.89, "w": 0.84, "h":0.84 }, + {"matrix": [2, 4], "x": 3.36, "y": 2.1, "w": 0.84, "h":0.84 }, + {"matrix": [6, 0], "x": 6.3, "y": 2.1, "w": 0.84, "h":0.84 }, + {"matrix": [6, 1], "x": 7.14, "y": 1.89, "w": 0.84, "h":0.84 }, + {"matrix": [6, 2], "x": 7.98, "y": 1.68, "w": 0.84, "h":0.84 }, + {"matrix": [6, 3], "x": 8.82, "y": 1.89, "w": 0.84, "h":0.84 }, + {"matrix": [6, 4], "x": 9.66, "y": 2.1, "w": 0.84, "h":0.84 }, + {"matrix": [3, 1], "x": 1.68, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [3, 2], "x": 2.52, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [3, 3], "x": 3.36, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [3, 4], "x": 4.2, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [7, 0], "x": 5.46, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [7, 1], "x": 6.3, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [7, 2], "x": 7.14, "y": 3.15, "w": 0.84, "h":0.84 }, + {"matrix": [7, 3], "x": 7.98, "y": 3.15, "w": 0.84, "h":0.84 } + ] + } + } +} diff --git a/keyboards/takashicompany/palmslave/keymaps/default/keymap.c b/keyboards/takashicompany/palmslave/keymaps/default/keymap.c new file mode 100644 index 0000000000..02747c0881 --- /dev/null +++ b/keyboards/takashicompany/palmslave/keymaps/default/keymap.c @@ -0,0 +1,70 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, + LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3, + LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT( + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3), + KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), + KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [3] = LAYOUT( + LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, + LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RGUI, KC_RCTL + ), + + [4] = LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3, + LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT( + KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS, + KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, + KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [6] = LAYOUT( + KC_ESC, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, + KC_LCTL, KC_TRNS, KC_QUES, KC_EXLM, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, + KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [7] = LAYOUT( + KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [8] = LAYOUT( + UG_TOGG, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, KC_NO, KC_NO, KC_NO, DF(0), DF(3), + RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/takashicompany/palmslave/readme.md b/keyboards/takashicompany/palmslave/readme.md new file mode 100644 index 0000000000..ea51a41ef7 --- /dev/null +++ b/keyboards/takashicompany/palmslave/readme.md @@ -0,0 +1,39 @@ +# Palmslave + +![Palmslave](https://i.imgur.com/oDluHBC.jpeg) + +Palmslave is a split keyboard with 0.8u (16mm) key pitch. +The size of a single key is 80% of the size of a key on a conventional keyboard. +Although the key size is more compact than usual, it has the advantage of requiring minimal finger movement. +The number of keys is 19 keys for one hand and 38 keys for two hands. +Keyswitches are compatible with Choc v1 and Choc v2. +The board can be fitted with a key switch socket, allowing the keyswitch to be replaced according to mood or fashion. + +Palmslaveは0.8u(16mm)キーピッチの分割型のキーボードです。 +一つのキーの大きさが従来のキーボードのキーと比較すると80%のサイズとなっています。 +通常よりコンパクトなキーサイズですが、指の動きが最小限で済むという強みがあります。 +キー数は片手で19キー、両手で38キーとなります。 +キースイッチはChoc v1とChoc v2に対応しています。 +基板はキースイッチソケットの取り付けが可能で、気分や流行でキースイッチを付け替えることが可能です。 + +* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany) +* Hardware Supported: Palmslave PCB(s), x2 Pro Micro development board +* Hardware Availability: https://github.com/takashicompany/palmslave + +Make example for this keyboard (after setting up your build environment): + + make takashicompany/palmslave:default + +Flashing example for this keyboard: + + make takashicompany/palmslave: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 f0a5db96c8a128bdf7f8321fdc1e0011160aeb3a Mon Sep 17 00:00:00 2001 From: dnlnm <80830846+dnlnm@users.noreply.github.com> Date: Tue, 4 Mar 2025 03:22:37 +0800 Subject: [PATCH 211/592] Add keyboard Cloak (#24858) Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/dnlnm/cloak/keyboard.json | 115 ++++++++++++++++++ .../dnlnm/cloak/keymaps/default/keymap.c | 68 +++++++++++ .../dnlnm/cloak/keymaps/default/rules.mk | 1 + keyboards/dnlnm/cloak/readme.md | 25 ++++ 4 files changed, 209 insertions(+) create mode 100644 keyboards/dnlnm/cloak/keyboard.json create mode 100644 keyboards/dnlnm/cloak/keymaps/default/keymap.c create mode 100644 keyboards/dnlnm/cloak/keymaps/default/rules.mk create mode 100644 keyboards/dnlnm/cloak/readme.md diff --git a/keyboards/dnlnm/cloak/keyboard.json b/keyboards/dnlnm/cloak/keyboard.json new file mode 100644 index 0000000000..fb429e789a --- /dev/null +++ b/keyboards/dnlnm/cloak/keyboard.json @@ -0,0 +1,115 @@ +{ + "manufacturer": "dnlnm", + "keyboard_name": "Cloak", + "maintainer": "dnlnm", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A9", "pin_b": "A10", "resolution": 2}, + {"pin_a": "B4", "pin_b": "B6", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A8", "B15", "B14", "B13", "B11", "B10", "B2", "B1", "B0", "A7", "A6", "A5", "A4", "B8"], + "rows": ["B3", "B12", "A15", "B7", "B9"] + }, + "processor": "STM32F072", + "rgblight": { + "default": { + "on": false + }, + "driver": "ws2812", + "layers": { + "blink": true, + "enabled": true, + "override_rgb": true + }, + "led_count": 12 + }, + "url": "https://github.com/dnlnm/cloak-xt-stm32", + "usb": { + "device_version": "1.0.0", + "pid": "0xFCD4", + "vid": "0x7E7E" + }, + "ws2812": { + "pin": "B5" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.63, "y": 0}, + {"matrix": [0, 6], "x": 6.63, "y": 0}, + {"matrix": [0, 7], "x": 7.63, "y": 0}, + {"matrix": [0, 8], "x": 8.63, "y": 0}, + {"matrix": [0, 9], "x": 10, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14.25, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1.25}, + {"matrix": [1, 2], "x": 2.5, "y": 1.25}, + {"matrix": [1, 3], "x": 3.5, "y": 1.25}, + {"matrix": [1, 4], "x": 4.5, "y": 1.25}, + {"matrix": [1, 5], "x": 5.5, "y": 1.25}, + {"matrix": [1, 6], "x": 6.5, "y": 1.25}, + {"matrix": [1, 7], "x": 7.5, "y": 1.25}, + {"matrix": [1, 8], "x": 8.5, "y": 1.25}, + {"matrix": [1, 9], "x": 9.5, "y": 1.25}, + {"matrix": [1, 10], "x": 10.5, "y": 1.25}, + {"matrix": [1, 11], "x": 11.5, "y": 1.25}, + {"matrix": [1, 12], "x": 12.5, "y": 1.25, "w": 1.5}, + {"matrix": [1, 13], "x": 14.25, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2.25}, + {"matrix": [2, 2], "x": 2.75, "y": 2.25}, + {"matrix": [2, 3], "x": 3.75, "y": 2.25}, + {"matrix": [2, 4], "x": 4.75, "y": 2.25}, + {"matrix": [2, 5], "x": 5.75, "y": 2.25}, + {"matrix": [2, 6], "x": 6.75, "y": 2.25}, + {"matrix": [2, 7], "x": 7.75, "y": 2.25}, + {"matrix": [2, 8], "x": 8.75, "y": 2.25}, + {"matrix": [2, 9], "x": 9.75, "y": 2.25}, + {"matrix": [2, 10], "x": 10.75, "y": 2.25}, + {"matrix": [2, 11], "x": 11.75, "y": 2.25, "w": 2.25}, + {"matrix": [2, 12], "x": 14.25, "y": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 2.25}, + {"matrix": [3, 1], "x": 2.25, "y": 3.25}, + {"matrix": [3, 2], "x": 3.25, "y": 3.25}, + {"matrix": [3, 3], "x": 4.25, "y": 3.25}, + {"matrix": [3, 4], "x": 5.25, "y": 3.25}, + {"matrix": [3, 5], "x": 6.25, "y": 3.25}, + {"matrix": [3, 6], "x": 7.25, "y": 3.25}, + {"matrix": [3, 7], "x": 8.25, "y": 3.25}, + {"matrix": [3, 8], "x": 9.25, "y": 3.25}, + {"matrix": [3, 9], "x": 10.25, "y": 3.25}, + {"matrix": [3, 10], "x": 11.25, "y": 3.25}, + {"matrix": [3, 11], "x": 12.25, "y": 3.25, "w": 1.75}, + {"matrix": [3, 12], "x": 14.25, "y": 3.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25, "w": 1.25}, + {"matrix": [4, 6], "x": 3.5, "y": 4.25, "w": 7}, + {"matrix": [4, 10], "x": 10.5, "y": 4.25, "w": 1.25}, + {"matrix": [4, 11], "x": 11.75, "y": 4.25}, + {"matrix": [4, 12], "x": 12.75, "y": 4.25, "w": 1.25}, + {"matrix": [4, 13], "x": 14.25, "y": 4.25} + ] + } + } +} diff --git a/keyboards/dnlnm/cloak/keymaps/default/keymap.c b/keyboards/dnlnm/cloak/keymaps/default/keymap.c new file mode 100644 index 0000000000..61733d2bba --- /dev/null +++ b/keyboards/dnlnm/cloak/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +// Copyright (C) 2025 dnlnm +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [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_MINS, KC_EQL, KC_MPLY, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_BSPC, KC_VOLU, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, KC_VOLD, + 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_MUTE, + KC_LCTL, KC_LGUI, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_PSCR), + + [1] = LAYOUT( + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [1] = {ENCODER_CCW_CW(UG_HUED, UG_HUEU), ENCODER_CCW_CW(UG_SATD, UG_SATU)}, +}; +#endif + +#ifdef RGBLIGHT_ENABLE + +// Light LEDs 10 & 11 in blue when caps lock is active. +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {10, 2, HSV_BLUE} // Light 4 LEDs, starting with LED 6 +); +// Light LEDs 0 & 1 in blue when keyboard layer 1 is active +const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {0, 2, HSV_BLUE} +); +// Light LEDs 4 & 5 in blue when keyboard layer 2 is active +const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {4, 2, HSV_BLUE} +); + +// 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, + my_layer1_layer, // Overrides caps lock layer + my_layer2_layer // Overrides other layers +); + +void keyboard_post_init_user(void) { + // Enable the LED layers + rgblight_layers = my_rgb_layers; +} + +bool led_update_user(led_t led_state) { + rgblight_set_layer_state(0, led_state.caps_lock); + return true; +} + +layer_state_t layer_state_set_user(layer_state_t state) { + rgblight_set_layer_state(1, layer_state_cmp(state, 1)); + rgblight_set_layer_state(2, layer_state_cmp(state, 2)); + return state; +} + +#endif diff --git a/keyboards/dnlnm/cloak/keymaps/default/rules.mk b/keyboards/dnlnm/cloak/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/dnlnm/cloak/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/dnlnm/cloak/readme.md b/keyboards/dnlnm/cloak/readme.md new file mode 100644 index 0000000000..99c50c8d43 --- /dev/null +++ b/keyboards/dnlnm/cloak/readme.md @@ -0,0 +1,25 @@ +# dnlnm/cloak + +![dnlnm/cloak](https://i.imgur.com/eZCUPvK.jpeg) + +* Keyboard Maintainer: [Daniel Naim](https://github.com/dnlnm) +* Hardware Supported: Cloak-XT +* Hardware Availability: https://github.com/dnlnm/cloak-xt-stm32 + +Make example for this keyboard (after setting up your build environment): + + make dnlnm/cloak:default + +Flashing example for this keyboard: + + make dnlnm/cloak: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**: Hold the boot button and tap the reset button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From fcfe0e8a952382e4fda442321090a07b09b607c0 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 4 Mar 2025 23:40:08 +0000 Subject: [PATCH 212/592] Fix `xelus/valor/rev3` compilation (#24976) --- keyboards/xelus/valor/rev3/{info.json => keyboard.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboards/xelus/valor/rev3/{info.json => keyboard.json} (100%) diff --git a/keyboards/xelus/valor/rev3/info.json b/keyboards/xelus/valor/rev3/keyboard.json similarity index 100% rename from keyboards/xelus/valor/rev3/info.json rename to keyboards/xelus/valor/rev3/keyboard.json From 0302171facfa2992bfa9871e23c446d843d6a7bb Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 4 Mar 2025 23:40:28 +0000 Subject: [PATCH 213/592] Remove invalid RGB Matrix effects (#24977) --- keyboards/cipulot/ec_980c/keyboard.json | 3 +-- keyboards/gkeyboard/greatpad/keyboard.json | 1 - keyboards/splitkb/elora/rev1/keyboard.json | 1 - keyboards/splitkb/halcyon/kyria/rev4/keyboard.json | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/keyboards/cipulot/ec_980c/keyboard.json b/keyboards/cipulot/ec_980c/keyboard.json index 35946fa623..9be58d294c 100644 --- a/keyboards/cipulot/ec_980c/keyboard.json +++ b/keyboards/cipulot/ec_980c/keyboard.json @@ -30,8 +30,7 @@ "rgb_matrix": { "animations": { "breathing": true, - "cycle_left_right": true, - "solid_color": true + "cycle_left_right": true }, "driver": "ws2812", "layout": [ diff --git a/keyboards/gkeyboard/greatpad/keyboard.json b/keyboards/gkeyboard/greatpad/keyboard.json index 6f55141333..62edd1aef3 100644 --- a/keyboards/gkeyboard/greatpad/keyboard.json +++ b/keyboards/gkeyboard/greatpad/keyboard.json @@ -62,7 +62,6 @@ "rainbow_moving_chevron": true, "rainbow_pinwheels": true, "raindrops": true, - "solid_color": true, "solid_multisplash": true, "solid_reactive": true, "solid_reactive_cross": true, diff --git a/keyboards/splitkb/elora/rev1/keyboard.json b/keyboards/splitkb/elora/rev1/keyboard.json index a2d02a9a49..7996fdccb9 100644 --- a/keyboards/splitkb/elora/rev1/keyboard.json +++ b/keyboards/splitkb/elora/rev1/keyboard.json @@ -46,7 +46,6 @@ "rainbow_moving_chevron": true, "rainbow_pinwheels": true, "raindrops": true, - "solid_color": true, "solid_multisplash": true, "solid_reactive": true, "solid_reactive_cross": true, diff --git a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json index c9e891964b..aca43a8a16 100755 --- a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json +++ b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json @@ -52,7 +52,6 @@ "rainbow_moving_chevron": true, "rainbow_pinwheels": true, "raindrops": true, - "solid_color": true, "solid_multisplash": true, "solid_reactive": true, "solid_reactive_cross": true, From 3c6a69112690d32b83ed75d77896d7baa3924458 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 6 Mar 2025 23:17:21 +0000 Subject: [PATCH 214/592] keychron/c*_pro_v2: Migrate DIP_SWITCH_PINS (#24978) --- keyboards/keychron/c1_pro_v2/config.h | 3 --- keyboards/keychron/c1_pro_v2/info.json | 3 +++ keyboards/keychron/c2_pro_v2/config.h | 3 --- keyboards/keychron/c2_pro_v2/info.json | 3 +++ 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/keychron/c1_pro_v2/config.h b/keyboards/keychron/c1_pro_v2/config.h index eb8ee47a96..71c3121877 100644 --- a/keyboards/keychron/c1_pro_v2/config.h +++ b/keyboards/keychron/c1_pro_v2/config.h @@ -16,9 +16,6 @@ #pragma once -/* DIP switch */ -#define DIP_SWITCH_PINS { D2 } - /* Increase I2C speed to 1000 KHz */ #define I2C1_CLOCK_SPEED 400000 #define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 diff --git a/keyboards/keychron/c1_pro_v2/info.json b/keyboards/keychron/c1_pro_v2/info.json index af4e6017e4..bec58b2a8d 100644 --- a/keyboards/keychron/c1_pro_v2/info.json +++ b/keyboards/keychron/c1_pro_v2/info.json @@ -20,6 +20,9 @@ "indicators": { "caps_lock": "C9" }, + "dip_switch": { + "pins": ["D2"] + }, "matrix_pins": { "cols": ["A0", "A1", "A2", "A3", "C0", "C1", "C2", "C3", "A8", "C12", "B9", "C6", "C7", "C4", "C5", "A15", "B10"], "rows": ["B0", "B1", "B8", "B3", "B4", "B5"] diff --git a/keyboards/keychron/c2_pro_v2/config.h b/keyboards/keychron/c2_pro_v2/config.h index cde450aa68..2c1468fa62 100644 --- a/keyboards/keychron/c2_pro_v2/config.h +++ b/keyboards/keychron/c2_pro_v2/config.h @@ -16,9 +16,6 @@ #pragma once -/* DIP switch */ -#define DIP_SWITCH_PINS { D2 } - /* Indication led */ #define LED_MAC_OS_PIN C10 #define LED_WIN_OS_PIN C11 diff --git a/keyboards/keychron/c2_pro_v2/info.json b/keyboards/keychron/c2_pro_v2/info.json index 06a592a060..b210151800 100644 --- a/keyboards/keychron/c2_pro_v2/info.json +++ b/keyboards/keychron/c2_pro_v2/info.json @@ -30,6 +30,9 @@ "caps_lock": "C9", "num_lock": "C8" }, + "dip_switch": { + "pins": ["D2"] + }, "layouts": { "LAYOUT_104_ansi": { "layout": [ From 6e1d3d6d077f50cb61d37f8310162b38b109fa87 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 6 Mar 2025 23:17:51 +0000 Subject: [PATCH 215/592] Add EOL to non-keyboard files (#24990) --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_french_0.0.1.hjson | 2 +- .../constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_german_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_serbian_latin_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_us_international_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_us_international_linux_0.0.1.hjson | 2 +- data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson | 2 +- .../keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson | 2 +- data/constants/keycodes/keycodes_0.0.1.hjson | 2 +- data/constants/keycodes/keycodes_0.0.1_joystick.hjson | 2 +- data/constants/keycodes/keycodes_0.0.1_magic.hjson | 2 +- .../constants/keycodes/keycodes_0.0.1_programmable_button.hjson | 2 +- data/constants/keycodes/keycodes_0.0.1_sequencer.hjson | 2 +- data/constants/keycodes/keycodes_0.0.2_basic.hjson | 2 +- data/constants/keycodes/keycodes_0.0.2_magic.hjson | 2 +- data/constants/keycodes/keycodes_0.0.2_sequencer.hjson | 2 +- docs/configurator_diagram.drawio | 2 +- docs/configurator_diagram.svg | 2 +- docs/public/badge-community-dark.svg | 2 +- docs/public/badge-community-light.svg | 2 +- drivers/painter/gc9xxx/qp_gc9a01_opcodes.h | 2 +- drivers/painter/ld7032/qp_ld7032.h | 2 +- drivers/painter/ld7032/qp_ld7032_opcodes.h | 2 +- drivers/usbpd.h | 2 +- layouts/community/75_ansi/layout.json | 2 +- layouts/community/ortho_1x4/layout.json | 2 +- layouts/community/ortho_4x12/layout.json | 2 +- layouts/default/60_ansi_arrow/layout.json | 2 +- layouts/default/ortho_5x5/readme.md | 2 +- platforms/avr/drivers/i2c_master.c | 2 +- platforms/chibios/boards/BONSAI_C4/configs/board.h | 2 +- platforms/chibios/boards/BONSAI_C4/configs/config.h | 2 +- platforms/chibios/boards/BONSAI_C4/configs/halconf.h | 2 +- platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk | 2 +- platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk | 2 +- platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h | 2 +- platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h | 2 +- platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h | 2 +- platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h | 2 +- platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h | 2 +- platforms/chibios/bootloaders/stm32duino.c | 2 +- platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h | 2 +- .../chibios/converters/promicro_to_bonsai_c4/post_converter.mk | 2 +- platforms/chibios/drivers/i2c_master.c | 2 +- platforms/chibios/drivers/usbpd_stm32g4.c | 2 +- platforms/chibios/platform.c | 2 +- platforms/test/platform.c | 2 +- quantum/rgb_matrix/animations/rgb_matrix_effects.inc | 2 +- quantum/split_common/split_util.h | 2 +- quantum/via.h | 2 +- quantum/wear_leveling/tests/rules.mk | 2 +- tests/basic/test_one_shot_keys.cpp | 2 +- tests/no_tapping/no_action_tapping/test.mk | 2 +- tests/no_tapping/no_mod_tap_mods/test.mk | 2 +- users/_example/_example.c | 2 +- users/_example/_example.h | 2 +- users/_example/readme.md | 2 +- users/_example/rules.mk | 2 +- users/readme.md | 2 +- util/usb_detach/usb_detach.c | 2 +- 119 files changed, 119 insertions(+), 119 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index a5d185e1dd..3e32f4d994 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -38,4 +38,4 @@ body: - type: textarea attributes: label: Additional Context - description: Add any other relevant information about the problem here. \ No newline at end of file + description: Add any other relevant information about the problem here. diff --git a/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson index d2b8c1d7d9..11b68d16a0 100644 --- a/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson @@ -372,4 +372,4 @@ "label": "~", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson index 713f3f2829..7a9dea9d13 100644 --- a/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson @@ -629,4 +629,4 @@ "label": "(narrow non-breaking space)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson index 17006a64df..e28970ed33 100644 --- a/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson @@ -376,4 +376,4 @@ "label": "₢", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson index bfe5d5b54c..a663088e22 100644 --- a/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson @@ -638,4 +638,4 @@ "label": "÷", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson index 1dc091584b..0bf0f3b221 100644 --- a/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson @@ -299,4 +299,4 @@ "label": "?", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson index 82632aa637..50464921fa 100644 --- a/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson @@ -400,4 +400,4 @@ "label": "§", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson index 9cfb88c489..8b1572bfcb 100644 --- a/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson @@ -432,4 +432,4 @@ "label": "*", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson index fffcd9f9ad..0e8f7a75c6 100644 --- a/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson index 534f99c8e6..485d86aa21 100644 --- a/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson @@ -299,4 +299,4 @@ "label": ":", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson index 70c0b3c0aa..69ce14486e 100644 --- a/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson @@ -314,4 +314,4 @@ "label": "@", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson index 8a70dae7ef..6fa9868e4c 100644 --- a/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson @@ -299,4 +299,4 @@ "label": "\"", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson index bbf7512581..276d3fe664 100644 --- a/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson @@ -364,4 +364,4 @@ "label": "ž", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson index 9ff217cff2..9b4fa33053 100644 --- a/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson @@ -593,4 +593,4 @@ "label": "…", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson index b284192962..a4d3c99a6f 100644 --- a/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson index 8ba7b35d2e..351dfe89d8 100644 --- a/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson @@ -364,4 +364,4 @@ "label": "¤", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson index 90981d085d..92646c4de8 100644 --- a/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson @@ -620,4 +620,4 @@ "label": "≠", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson index b698018d5b..bb924e9852 100644 --- a/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson @@ -673,4 +673,4 @@ "label": "±", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson index a1cfd44956..015438abb2 100644 --- a/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson index 366ed5b9d1..fa3b8d67b5 100644 --- a/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson @@ -653,4 +653,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson index 9c7f8796bf..b61a317b19 100644 --- a/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson @@ -388,4 +388,4 @@ "label": "©", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson index b519229f35..aaf0563623 100644 --- a/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson @@ -344,4 +344,4 @@ "label": "÷", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson index d4fc908dc0..e7ae0d340c 100644 --- a/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson @@ -432,4 +432,4 @@ "label": "*", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson index f4d6025a77..59478a1018 100644 --- a/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson @@ -352,4 +352,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson index 94e553469e..99487a5b90 100644 --- a/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson @@ -352,4 +352,4 @@ "label": "´ (dead)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson index 951c564f62..8b859d6de8 100644 --- a/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson @@ -361,4 +361,4 @@ "label": "}", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson index 328755ca67..551f094974 100644 --- a/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson @@ -681,4 +681,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson index 4beccd804a..aed90f203d 100644 --- a/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson @@ -685,4 +685,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson index d95712abd9..779eef8a84 100644 --- a/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson @@ -327,4 +327,4 @@ "label": "_", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson index 5ee19c9e4e..8e04d8ed2a 100644 --- a/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson @@ -307,4 +307,4 @@ "label": "?", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson index ab80f0fdd9..510a2c83a7 100644 --- a/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson @@ -437,4 +437,4 @@ "label": "¨ (dead)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson index dfb527878e..f6140d7f93 100644 --- a/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson @@ -372,4 +372,4 @@ "label": "\\", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson index a4ea30d592..2ab6f83c94 100644 --- a/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson @@ -365,4 +365,4 @@ "label": "+", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson index 980bddbf7a..88ede311a6 100644 --- a/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson @@ -214,4 +214,4 @@ "label": "(layer 4)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson index fb3d1bc84b..8536a004de 100644 --- a/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson @@ -113,4 +113,4 @@ "key": "NO_MU" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson index 98ea7e6aab..45cd26ae1c 100644 --- a/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson @@ -299,4 +299,4 @@ "label": "?", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson index 4e8cbb5d0e..0cc79c5631 100644 --- a/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson @@ -352,4 +352,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson index fb00ef0c62..78cfe9dd41 100644 --- a/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson @@ -83,4 +83,4 @@ "key": "PV_U" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson index 9656dd9821..8e1fe29f8b 100644 --- a/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson @@ -70,4 +70,4 @@ "key": "PD_U" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson index 609011b1f7..f09f2c9b64 100644 --- a/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson @@ -352,4 +352,4 @@ "label": "Ń", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson index c8e43065d2..ec773ddbb5 100644 --- a/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson @@ -352,4 +352,4 @@ "label": "€", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson index b1c9aaad98..503a3e92a6 100644 --- a/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson @@ -617,4 +617,4 @@ "label": "–", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson index 42b1e89d3b..f388523146 100644 --- a/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson @@ -441,4 +441,4 @@ "label": "»", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson index d83fc0f61f..41904be634 100644 --- a/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson @@ -288,4 +288,4 @@ "label": "₽", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson index 98957930a0..3ddd7f15df 100644 --- a/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson @@ -304,4 +304,4 @@ "label": "€", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson index ca4746b646..eec0877aa7 100644 --- a/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson @@ -404,4 +404,4 @@ "label": "§", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson index 14eb4b783a..dbf39b5f49 100644 --- a/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson @@ -440,4 +440,4 @@ "label": "}", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson index fd1a4eb4fc..d264d3d392 100644 --- a/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson @@ -400,4 +400,4 @@ "label": "§", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson index db3b068e97..9656e35674 100644 --- a/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "}", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson index 39119a6a91..fa0a93ff85 100644 --- a/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "}", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson index fb1de29e6e..51ad69a55a 100644 --- a/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson @@ -340,4 +340,4 @@ "label": "`", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson index 6db71ea241..f538a81bd9 100644 --- a/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson @@ -356,4 +356,4 @@ "label": "µ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson index ab7c3ad8d1..59f0173e89 100644 --- a/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson @@ -639,4 +639,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson index cafd815776..cf2c0d9fdf 100644 --- a/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson @@ -637,4 +637,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson index c82c79c711..911cbc2be8 100644 --- a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson @@ -639,4 +639,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson index 4555739ccd..d8e532f792 100644 --- a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson @@ -637,4 +637,4 @@ "label": "—", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson index ae260a5e56..e4a5f91158 100644 --- a/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson @@ -376,4 +376,4 @@ "label": "\\", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson index 83fb86e49c..e518658314 100644 --- a/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson @@ -376,4 +376,4 @@ "label": "\\", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson index 2689f10dbe..0f527e04d6 100644 --- a/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson @@ -477,4 +477,4 @@ "label": "º", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson index e00cee9ce3..e736bb52a2 100644 --- a/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson @@ -372,4 +372,4 @@ "label": "` (dead)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson index 006bf5c59e..aa97e11fa9 100644 --- a/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson @@ -350,4 +350,4 @@ "label": "Á" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson index 2e8629f58b..3596dc14e0 100644 --- a/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson @@ -292,4 +292,4 @@ "label": "ґ", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson index ecac6ca161..15b21dd526 100644 --- a/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson @@ -585,4 +585,4 @@ "label": "̉ (dead)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson index 36a574a4ad..34328be8b8 100644 --- a/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson @@ -505,4 +505,4 @@ "label": "¢", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson index d6bdf2e02d..fcf848dd87 100644 --- a/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson @@ -573,4 +573,4 @@ "label": "̉ (dead)", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson index 27471a15e4..14220e560e 100644 --- a/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson @@ -299,4 +299,4 @@ "label": "?", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson index 86f6a5bffb..f05ec1a3ea 100644 --- a/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson +++ b/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson @@ -299,4 +299,4 @@ "label": "?", } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.1.hjson b/data/constants/keycodes/keycodes_0.0.1.hjson index 7ba1ecf201..c40baf13dc 100644 --- a/data/constants/keycodes/keycodes_0.0.1.hjson +++ b/data/constants/keycodes/keycodes_0.0.1.hjson @@ -93,4 +93,4 @@ "key": "SAFE_RANGE" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson index 0bda7c29f3..b851d72eef 100644 --- a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson @@ -225,4 +225,4 @@ ] } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.1_magic.hjson b/data/constants/keycodes/keycodes_0.0.1_magic.hjson index 7ee1f2bce9..0e3e8dc55f 100644 --- a/data/constants/keycodes/keycodes_0.0.1_magic.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_magic.hjson @@ -246,4 +246,4 @@ ] } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson index 645bcd6a39..7d031728a6 100644 --- a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson @@ -225,4 +225,4 @@ ] } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson index 039d09b2fa..85844ae99c 100644 --- a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson +++ b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson @@ -37,4 +37,4 @@ "key": "SQ_SCLR" } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.2_basic.hjson b/data/constants/keycodes/keycodes_0.0.2_basic.hjson index 2b5df85d99..d9cefe7e93 100644 --- a/data/constants/keycodes/keycodes_0.0.2_basic.hjson +++ b/data/constants/keycodes/keycodes_0.0.2_basic.hjson @@ -17,4 +17,4 @@ ] } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.2_magic.hjson b/data/constants/keycodes/keycodes_0.0.2_magic.hjson index 81758975e3..2fc8ba038d 100644 --- a/data/constants/keycodes/keycodes_0.0.2_magic.hjson +++ b/data/constants/keycodes/keycodes_0.0.2_magic.hjson @@ -248,4 +248,4 @@ ] } } -} \ No newline at end of file +} diff --git a/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson index eedaed166c..445a2c9328 100644 --- a/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson +++ b/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson @@ -66,4 +66,4 @@ ] } } -} \ No newline at end of file +} diff --git a/docs/configurator_diagram.drawio b/docs/configurator_diagram.drawio index 091a3a76b8..661f884def 100644 --- a/docs/configurator_diagram.drawio +++ b/docs/configurator_diagram.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 diff --git a/docs/configurator_diagram.svg b/docs/configurator_diagram.svg index bcf0bf76d1..1e540d70a6 100644 --- a/docs/configurator_diagram.svg +++ b/docs/configurator_diagram.svg @@ -1,3 +1,3 @@ -
Clients Supported:
Chrome, Firefox
Desktop Only
Clients Supported:...
https://config.qmk.fm
Single Page Site
JavaScript/VUE
Source: qmk/qmk_configurator
Host: Github Pages
https://config.qmk.fm...
https://keyboards.qmk.fm
Keyboard Metadata
Source: qmk/qmk_firmware
GH Action: Update API Data
Host: DigitalOcean Spaces
https://keyboards.qmk.fm...
QMK API
QMK API
https://api.qmk.fm
RESTful API
Source: qmk/qmk_api
Host: Rancher on DO VM's
https://api.qmk.fm...
Digital Ocean
Spaces
(S3)
Digital Ocean...
https://qmk-api.nyc3.cdn.digitaloceanspaces.com
Space: qmk-api
Host: Digital Ocean
https://qmk-api.nyc3.cdn.digitaloceanspaces.com...
RQ
RQ
Redis / RQ
Job Queue
Source: qmk/qmk_redis
Host: Rancher on DO VM's
Redis / RQ...
qmk_complier
qmk_complier
QMK Compiler
Job Runners
Source: qmk/qmk_compiler
Host: Rancher on DO VM's
QMK Compiler...
Viewer does not support full SVG 1.1
\ No newline at end of file +
Clients Supported:
Chrome, Firefox
Desktop Only
Clients Supported:...
https://config.qmk.fm
Single Page Site
JavaScript/VUE
Source: qmk/qmk_configurator
Host: Github Pages
https://config.qmk.fm...
https://keyboards.qmk.fm
Keyboard Metadata
Source: qmk/qmk_firmware
GH Action: Update API Data
Host: DigitalOcean Spaces
https://keyboards.qmk.fm...
QMK API
QMK API
https://api.qmk.fm
RESTful API
Source: qmk/qmk_api
Host: Rancher on DO VM's
https://api.qmk.fm...
Digital Ocean
Spaces
(S3)
Digital Ocean...
https://qmk-api.nyc3.cdn.digitaloceanspaces.com
Space: qmk-api
Host: Digital Ocean
https://qmk-api.nyc3.cdn.digitaloceanspaces.com...
RQ
RQ
Redis / RQ
Job Queue
Source: qmk/qmk_redis
Host: Rancher on DO VM's
Redis / RQ...
qmk_complier
qmk_complier
QMK Compiler
Job Runners
Source: qmk/qmk_compiler
Host: Rancher on DO VM's
QMK Compiler...
Viewer does not support full SVG 1.1
diff --git a/docs/public/badge-community-dark.svg b/docs/public/badge-community-dark.svg index dba561dda1..5236cf1696 100644 --- a/docs/public/badge-community-dark.svg +++ b/docs/public/badge-community-dark.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/docs/public/badge-community-light.svg b/docs/public/badge-community-light.svg index de4e0cf149..08c49f05b5 100644 --- a/docs/public/badge-community-light.svg +++ b/docs/public/badge-community-light.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h b/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h index 5853902e68..31de5ee9e3 100644 --- a/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h +++ b/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h @@ -101,4 +101,4 @@ #define GC9A01_GRAM_INTERFACE_RGB 0b00000010 #define GC9A01_RGB_INTERFACE_MODE_1_TRANSFER 0b00000000 -#define GC9A01_RGB_INTERFACE_MODE_3_TRANSFER 0b00000001 \ No newline at end of file +#define GC9A01_RGB_INTERFACE_MODE_3_TRANSFER 0b00000001 diff --git a/drivers/painter/ld7032/qp_ld7032.h b/drivers/painter/ld7032/qp_ld7032.h index 967eb7999c..9af80dd468 100644 --- a/drivers/painter/ld7032/qp_ld7032.h +++ b/drivers/painter/ld7032/qp_ld7032.h @@ -63,4 +63,4 @@ painter_device_t qp_ld7032_make_spi_device(uint16_t panel_width, uint16_t panel_ */ painter_device_t qp_ld7032_make_i2c_device(uint16_t panel_width, uint16_t panel_height, uint8_t i2c_address); -#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE \ No newline at end of file +#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE diff --git a/drivers/painter/ld7032/qp_ld7032_opcodes.h b/drivers/painter/ld7032/qp_ld7032_opcodes.h index 08ab77d6f8..ed8b397c67 100644 --- a/drivers/painter/ld7032/qp_ld7032_opcodes.h +++ b/drivers/painter/ld7032/qp_ld7032_opcodes.h @@ -42,4 +42,4 @@ typedef enum { LD7032_S_START_STOP = 0xCD, LD7032_S_SELECT = 0xCE, LD7032_TESTCNT1 = 0xF0, //-0xFF -} ld7032_opcodes; \ No newline at end of file +} ld7032_opcodes; diff --git a/drivers/usbpd.h b/drivers/usbpd.h index df4f29bb9d..e9dca67f66 100644 --- a/drivers/usbpd.h +++ b/drivers/usbpd.h @@ -26,4 +26,4 @@ typedef enum { void usbpd_init(void); // Gets the current state of the USBPD allowance -usbpd_allowance_t usbpd_get_allowance(void); \ No newline at end of file +usbpd_allowance_t usbpd_get_allowance(void); diff --git a/layouts/community/75_ansi/layout.json b/layouts/community/75_ansi/layout.json index 4b7c5a0d88..72be23b486 100644 --- a/layouts/community/75_ansi/layout.json +++ b/layouts/community/75_ansi/layout.json @@ -3,4 +3,4 @@ [{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""], [{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""], [{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""], -[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""] \ No newline at end of file +[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""] diff --git a/layouts/community/ortho_1x4/layout.json b/layouts/community/ortho_1x4/layout.json index 6103c7e248..833ff19d4f 100644 --- a/layouts/community/ortho_1x4/layout.json +++ b/layouts/community/ortho_1x4/layout.json @@ -1 +1 @@ -["","","",""] \ No newline at end of file +["","","",""] diff --git a/layouts/community/ortho_4x12/layout.json b/layouts/community/ortho_4x12/layout.json index 9439b6e0be..961b080642 100644 --- a/layouts/community/ortho_4x12/layout.json +++ b/layouts/community/ortho_4x12/layout.json @@ -1,4 +1,4 @@ ["","","","","","","","","","","",""], ["","","","","","","","","","","",""], ["","","","","","","","","","","",""], -["","","","","","","","","","","",""] \ No newline at end of file +["","","","","","","","","","","",""] diff --git a/layouts/default/60_ansi_arrow/layout.json b/layouts/default/60_ansi_arrow/layout.json index 7fc631c3d1..163107fda4 100644 --- a/layouts/default/60_ansi_arrow/layout.json +++ b/layouts/default/60_ansi_arrow/layout.json @@ -3,4 +3,4 @@ [{w:1.75},"","","","","","","","","","","","",{w:2.25},""], [{w:2.25},"","","","","","","","","","",{w:1.75},"","",""], [{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","",""] - \ No newline at end of file + diff --git a/layouts/default/ortho_5x5/readme.md b/layouts/default/ortho_5x5/readme.md index 3dd75765d1..2922976d3a 100644 --- a/layouts/default/ortho_5x5/readme.md +++ b/layouts/default/ortho_5x5/readme.md @@ -1,3 +1,3 @@ # ortho_5x5 - LAYOUT_ortho_5x5 \ No newline at end of file + LAYOUT_ortho_5x5 diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c index 64083d862a..9136f4a7b9 100644 --- a/platforms/avr/drivers/i2c_master.c +++ b/platforms/avr/drivers/i2c_master.c @@ -315,4 +315,4 @@ __attribute__((weak)) i2c_status_t i2c_ping_address(uint8_t address, uint16_t ti i2c_status_t status = i2c_start(address, timeout); i2c_stop(); return status; -} \ No newline at end of file +} diff --git a/platforms/chibios/boards/BONSAI_C4/configs/board.h b/platforms/chibios/boards/BONSAI_C4/configs/board.h index 372b9bb8bc..81c80b2773 100644 --- a/platforms/chibios/boards/BONSAI_C4/configs/board.h +++ b/platforms/chibios/boards/BONSAI_C4/configs/board.h @@ -17,4 +17,4 @@ #include_next -#undef STM32_HSE_BYPASS \ No newline at end of file +#undef STM32_HSE_BYPASS diff --git a/platforms/chibios/boards/BONSAI_C4/configs/config.h b/platforms/chibios/boards/BONSAI_C4/configs/config.h index e933cd6fd1..e0e95eda25 100644 --- a/platforms/chibios/boards/BONSAI_C4/configs/config.h +++ b/platforms/chibios/boards/BONSAI_C4/configs/config.h @@ -87,4 +87,4 @@ #ifndef USB_VBUS_PIN # define USB_VBUS_PIN PAL_LINE(GPIOA, 9) -#endif \ No newline at end of file +#endif diff --git a/platforms/chibios/boards/BONSAI_C4/configs/halconf.h b/platforms/chibios/boards/BONSAI_C4/configs/halconf.h index 6bab6fbcff..55bafe5cfa 100644 --- a/platforms/chibios/boards/BONSAI_C4/configs/halconf.h +++ b/platforms/chibios/boards/BONSAI_C4/configs/halconf.h @@ -46,4 +46,4 @@ # define SPI_USE_WAIT TRUE #endif -#include_next \ No newline at end of file +#include_next diff --git a/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk b/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk index 6c837bb8ee..00cc9b20b2 100644 --- a/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk +++ b/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk @@ -6,4 +6,4 @@ BOARDINC = $(CHIBIOS)/os/hal/boards/ST_STM32F4_DISCOVERY # Shared variables ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) \ No newline at end of file +ALLINC += $(BOARDINC) diff --git a/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk b/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk index 6c837bb8ee..00cc9b20b2 100644 --- a/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk +++ b/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk @@ -6,4 +6,4 @@ BOARDINC = $(CHIBIOS)/os/hal/boards/ST_STM32F4_DISCOVERY # Shared variables ALLCSRC += $(BOARDSRC) -ALLINC += $(BOARDINC) \ No newline at end of file +ALLINC += $(BOARDINC) diff --git a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h index a0d53d86e7..c2f25db810 100644 --- a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h +++ b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h @@ -21,4 +21,4 @@ #include_next -#undef STM32_HSE_BYPASS \ No newline at end of file +#undef STM32_HSE_BYPASS diff --git a/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h index eb74d68e85..da0a634bb5 100644 --- a/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h +++ b/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h @@ -27,4 +27,4 @@ #if 0 #define STM32_BOOTLOADER_DUAL_BANK TRUE #define STM32_BOOTLOADER_DUAL_BANK_GPIO B7 -#endif \ No newline at end of file +#endif diff --git a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h b/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h index e4afddb6a5..fa0b6f11d0 100644 --- a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h +++ b/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h @@ -23,4 +23,4 @@ #define CH_CFG_ST_TIMEDELTA 0 -#include_next \ No newline at end of file +#include_next diff --git a/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h b/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h index e4afddb6a5..fa0b6f11d0 100644 --- a/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h +++ b/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h @@ -23,4 +23,4 @@ #define CH_CFG_ST_TIMEDELTA 0 -#include_next \ No newline at end of file +#include_next diff --git a/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h b/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h index 6e5adb0fe1..ca0348e4e0 100644 --- a/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h +++ b/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h @@ -20,4 +20,4 @@ struct _reent; #endif -#include_next \ No newline at end of file +#include_next diff --git a/platforms/chibios/bootloaders/stm32duino.c b/platforms/chibios/bootloaders/stm32duino.c index e2db7fa16c..cc3f6be2df 100644 --- a/platforms/chibios/bootloaders/stm32duino.c +++ b/platforms/chibios/bootloaders/stm32duino.c @@ -25,4 +25,4 @@ __attribute__((weak)) void bootloader_jump(void) { __attribute__((weak)) void mcu_reset(void) { BKP->DR10 = RTC_BOOTLOADER_JUST_UPLOADED; NVIC_SystemReset(); -} \ No newline at end of file +} diff --git a/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h b/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h index 7e6b8ddaf2..deb0628ef8 100644 --- a/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h +++ b/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h @@ -37,4 +37,4 @@ // If this is undesirable, either B0 or B5 can be redefined by // using #undef and #define to change its assignment #define B0 PAL_LINE(GPIOB, 2) -#define D5 PAL_LINE(GPIOB, 2) \ No newline at end of file +#define D5 PAL_LINE(GPIOB, 2) diff --git a/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk b/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk index 5f49b17f8a..beefb9de23 100644 --- a/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk +++ b/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk @@ -2,4 +2,4 @@ BACKLIGHT_DRIVER ?= pwm WS2812_DRIVER ?= pwm SERIAL_DRIVER ?= usart FLASH_DRIVER ?= spi -EEPROM_DRIVER ?= spi \ No newline at end of file +EEPROM_DRIVER ?= spi diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c index 1d7fe27633..20850859b5 100644 --- a/platforms/chibios/drivers/i2c_master.c +++ b/platforms/chibios/drivers/i2c_master.c @@ -206,4 +206,4 @@ __attribute__((weak)) i2c_status_t i2c_ping_address(uint8_t address, uint16_t ti // This approach may produce false negative results for I2C devices that do not respond to a register 0 read request. uint8_t data = 0; return i2c_read_register(address, 0, &data, sizeof(data), timeout); -} \ No newline at end of file +} diff --git a/platforms/chibios/drivers/usbpd_stm32g4.c b/platforms/chibios/drivers/usbpd_stm32g4.c index 21b8f6db95..7603b5627b 100644 --- a/platforms/chibios/drivers/usbpd_stm32g4.c +++ b/platforms/chibios/drivers/usbpd_stm32g4.c @@ -76,4 +76,4 @@ __attribute__((weak)) usbpd_allowance_t usbpd_get_allowance(void) { } return USBPD_500MA; -} \ No newline at end of file +} diff --git a/platforms/chibios/platform.c b/platforms/chibios/platform.c index d4a229f278..e559f178cd 100644 --- a/platforms/chibios/platform.c +++ b/platforms/chibios/platform.c @@ -19,4 +19,4 @@ void platform_setup(void) { halInit(); chSysInit(); -} \ No newline at end of file +} diff --git a/platforms/test/platform.c b/platforms/test/platform.c index 8ddceeda8f..3e35b4fe4c 100644 --- a/platforms/test/platform.c +++ b/platforms/test/platform.c @@ -18,4 +18,4 @@ void platform_setup(void) { // do nothing -} \ No newline at end of file +} diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc index a02238a2d1..e8b7a2bcde 100644 --- a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc +++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc @@ -42,4 +42,4 @@ #include "starlight_anim.h" #include "starlight_dual_sat_anim.h" #include "starlight_dual_hue_anim.h" -#include "riverflow_anim.h" \ No newline at end of file +#include "riverflow_anim.h" diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h index f83b05b6a6..6f4c4dc660 100644 --- a/quantum/split_common/split_util.h +++ b/quantum/split_common/split_util.h @@ -15,4 +15,4 @@ bool is_transport_connected(void); void split_watchdog_update(bool done); void split_watchdog_task(void); -bool split_watchdog_check(void); \ No newline at end of file +bool split_watchdog_check(void); diff --git a/quantum/via.h b/quantum/via.h index 01d4c48b37..f9d3b3314c 100644 --- a/quantum/via.h +++ b/quantum/via.h @@ -202,4 +202,4 @@ void via_qmk_audio_command(uint8_t *data, uint8_t length); void via_qmk_audio_set_value(uint8_t *data); void via_qmk_audio_get_value(uint8_t *data); void via_qmk_audio_save(void); -#endif \ No newline at end of file +#endif diff --git a/quantum/wear_leveling/tests/rules.mk b/quantum/wear_leveling/tests/rules.mk index 4d7a964049..f5f36e5b6e 100644 --- a/quantum/wear_leveling/tests/rules.mk +++ b/quantum/wear_leveling/tests/rules.mk @@ -63,4 +63,4 @@ wear_leveling_8byte_SRC := \ $(wear_leveling_common_SRC) \ $(QUANTUM_PATH)/wear_leveling/tests/wear_leveling_8byte.cpp wear_leveling_8byte_INC := \ - $(wear_leveling_common_INC) \ No newline at end of file + $(wear_leveling_common_INC) diff --git a/tests/basic/test_one_shot_keys.cpp b/tests/basic/test_one_shot_keys.cpp index 92db52f811..4784c86694 100644 --- a/tests/basic/test_one_shot_keys.cpp +++ b/tests/basic/test_one_shot_keys.cpp @@ -686,4 +686,4 @@ TEST_F(OneShot, OSLWithLongModTapKeyAndRegularKey) { regular_key.release(); run_one_scan_loop(); VERIFY_AND_CLEAR(driver); -} \ No newline at end of file +} diff --git a/tests/no_tapping/no_action_tapping/test.mk b/tests/no_tapping/no_action_tapping/test.mk index 29690d1adf..6ec384609c 100644 --- a/tests/no_tapping/no_action_tapping/test.mk +++ b/tests/no_tapping/no_action_tapping/test.mk @@ -15,4 +15,4 @@ # -------------------------------------------------------------------------------- # Keep this file, even if it is empty, as a marker that this folder contains tests -# -------------------------------------------------------------------------------- \ No newline at end of file +# -------------------------------------------------------------------------------- diff --git a/tests/no_tapping/no_mod_tap_mods/test.mk b/tests/no_tapping/no_mod_tap_mods/test.mk index 29690d1adf..6ec384609c 100644 --- a/tests/no_tapping/no_mod_tap_mods/test.mk +++ b/tests/no_tapping/no_mod_tap_mods/test.mk @@ -15,4 +15,4 @@ # -------------------------------------------------------------------------------- # Keep this file, even if it is empty, as a marker that this folder contains tests -# -------------------------------------------------------------------------------- \ No newline at end of file +# -------------------------------------------------------------------------------- diff --git a/users/_example/_example.c b/users/_example/_example.c index 8e0778b122..5f9580d8e9 100644 --- a/users/_example/_example.c +++ b/users/_example/_example.c @@ -2,4 +2,4 @@ void my_custom_function(void) { -} \ No newline at end of file +} diff --git a/users/_example/_example.h b/users/_example/_example.h index f7c7990257..72907d06d7 100644 --- a/users/_example/_example.h +++ b/users/_example/_example.h @@ -5,4 +5,4 @@ void my_custom_function(void); -#endif \ No newline at end of file +#endif diff --git a/users/_example/readme.md b/users/_example/readme.md index fdea33b67a..d6ead7efd2 100644 --- a/users/_example/readme.md +++ b/users/_example/readme.md @@ -11,4 +11,4 @@ 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 . \ No newline at end of file +along with this program. If not, see . diff --git a/users/_example/rules.mk b/users/_example/rules.mk index 250adc3d0d..af076dd7fe 100644 --- a/users/_example/rules.mk +++ b/users/_example/rules.mk @@ -1 +1 @@ -SRC += _example.c \ No newline at end of file +SRC += _example.c diff --git a/users/readme.md b/users/readme.md index d8f14d8beb..8a490c28ce 100644 --- a/users/readme.md +++ b/users/readme.md @@ -1,3 +1,3 @@ # User space -This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places. \ No newline at end of file +This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places. diff --git a/util/usb_detach/usb_detach.c b/util/usb_detach/usb_detach.c index 786ab5e674..8047c37ba3 100644 --- a/util/usb_detach/usb_detach.c +++ b/util/usb_detach/usb_detach.c @@ -31,4 +31,4 @@ int main(int argc, char**argv) printf ("usage: %s /dev/bus/usb/BUS/DEVICE\n",argv[0]); printf("Release all interfaces of this usb device for usage in virtualisation\n"); } -} \ No newline at end of file +} From a70288bc4a22385325eaaec081bd4139b5b56f90 Mon Sep 17 00:00:00 2001 From: "Christian C. Berclaz" Date: Sun, 9 Mar 2025 08:59:02 +0100 Subject: [PATCH 216/592] New standard layout for Mechlovin' Zed60 (60_tsangan_hhkb) (#24801) * Added a default firmware and layout for the WindStudio Wind X R1 keyboard. * Wind X R1: cleaned-up the folders to make clear that this firmware is for the release 1 of this keyboard. * Delete keyboards/windstudio/wind_x/R1 directory Removing the uppercase R1 folder * feat(mechlovin/zed60): Added the missing standard 60_tsangan_hhkb * style(mechlovin/zed60): Ran qmk format-json -i on keyboard.json --- keyboards/mechlovin/zed60/keyboard.json | 258 ++++++++++++++---------- 1 file changed, 156 insertions(+), 102 deletions(-) diff --git a/keyboards/mechlovin/zed60/keyboard.json b/keyboards/mechlovin/zed60/keyboard.json index 39a8ae7ea7..136170eec6 100644 --- a/keyboards/mechlovin/zed60/keyboard.json +++ b/keyboards/mechlovin/zed60/keyboard.json @@ -1,13 +1,9 @@ { - "keyboard_name": "Zed60", "manufacturer": "Mechlovin Studio", - "url": "", + "keyboard_name": "Zed60", "maintainer": "Mechlovin' Studio", - "usb": { - "vid": "0x4D4C", - "pid": "0x0602", - "device_version": "0.0.1" - }, + "bootloader": "stm32duino", + "diode_direction": "COL2ROW", "features": { "bootmagic": true, "command": true, @@ -17,41 +13,110 @@ "nkro": false, "rgblight": true }, + "indicators": { + "caps_lock": "A4" + }, "matrix_pins": { "cols": ["A10", "A3", "A9", "A8", "B15", "B14", "B13", "B12", "B5", "B4", "B3", "A15", "B7", "B6"], "rows": ["B10", "B2", "B1", "B0", "A2"] }, - "diode_direction": "COL2ROW", - "indicators": { - "caps_lock": "A4" - }, + "processor": "STM32F103", "rgblight": { - "saturation_steps": 8, - "brightness_steps": 8, - "led_count": 22, - "sleep": true, "animations": { + "alternating": true, "breathing": true, + "christmas": true, + "knight": true, "rainbow_mood": true, "rainbow_swirl": true, - "snake": true, - "knight": true, - "christmas": true, - "static_gradient": true, "rgb_test": true, - "alternating": true - } + "snake": true, + "static_gradient": true + }, + "brightness_steps": 8, + "led_count": 22, + "saturation_steps": 8, + "sleep": true + }, + "url": "", + "usb": { + "device_version": "0.0.1", + "pid": "0x0602", + "vid": "0x4D4C" }, "ws2812": { - "pin": "A7", - "driver": "spi" + "driver": "spi", + "pin": "A7" }, - "processor": "STM32F103", - "bootloader": "stm32duino", "layout_aliases": { "LAYOUT_all": "LAYOUT_60_ansi_split_bs_rshift" }, "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, 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, "LAYOUT_60_ansi_split_bs_rshift": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, @@ -69,7 +134,6 @@ {"matrix": [0, 12], "x": 12, "y": 0}, {"matrix": [0, 13], "x": 13, "y": 0}, {"matrix": [2, 12], "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}, @@ -84,7 +148,6 @@ {"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}, @@ -98,7 +161,6 @@ {"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}, @@ -112,76 +174,6 @@ {"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.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, 10], "x": 10, "y": 4, "w": 1.25}, - {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, - {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, - {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} - ] - }, - "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, 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.25}, {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, @@ -208,7 +200,6 @@ {"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}, @@ -223,7 +214,6 @@ {"matrix": [1, 11], "x": 11.5, "y": 1}, {"matrix": [1, 12], "x": 12.5, "y": 1}, {"matrix": [1, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, - {"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}, @@ -237,7 +227,6 @@ {"matrix": [2, 10], "x": 10.75, "y": 2}, {"matrix": [2, 11], "x": 11.75, "y": 2}, {"matrix": [2, 13], "x": 12.75, "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}, @@ -251,7 +240,6 @@ {"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.25}, {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, @@ -261,6 +249,72 @@ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} ] + }, + "LAYOUT_60_tsangan_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": [2, 12], "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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] } } } From 30daeaf09f33c02979b3a1803dfdbcb4c436b1ed Mon Sep 17 00:00:00 2001 From: Matthijs Muller <38044391+SmollChungus@users.noreply.github.com> Date: Sun, 9 Mar 2025 09:51:29 +0100 Subject: [PATCH 217/592] Add Icebreaker keyboard (#24723) Co-authored-by: jack Co-authored-by: Ryan Co-authored-by: Drashna Jaelre --- keyboards/icebreaker/hotswap/keyboard.json | 240 ++++++++++++++++++ .../hotswap/keymaps/default/keymap.c | 43 ++++ .../hotswap/keymaps/default/rules.mk | 1 + keyboards/icebreaker/readme.md | 26 ++ 4 files changed, 310 insertions(+) create mode 100644 keyboards/icebreaker/hotswap/keyboard.json create mode 100644 keyboards/icebreaker/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/icebreaker/hotswap/keymaps/default/rules.mk create mode 100644 keyboards/icebreaker/readme.md diff --git a/keyboards/icebreaker/hotswap/keyboard.json b/keyboards/icebreaker/hotswap/keyboard.json new file mode 100644 index 0000000000..ab55c5ae5f --- /dev/null +++ b/keyboards/icebreaker/hotswap/keyboard.json @@ -0,0 +1,240 @@ +{ + "manufacturer": "Serene Studio", + "keyboard_name": "Icebreaker HS", + "maintainer": "Matthijs Muller", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP26", "pin_b": "GP27"} + ] + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP24", "GP19", "GP18", "GP17", "GP29", "GP0", "GP12", "GP11", "GP10", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2"], + "rows": ["GP25", "GP22", "GP28", "GP23", "GP1"] + }, + "processor": "RP2040", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "rgb_matrix": { + "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, + "fractal": 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_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": 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, + "typing_heatmap": true + }, + "default": { + "sat": 100, + "val": 80 + }, + "driver": "ws2812", + "layout": [ + {"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": 208, "y": 0, "flags": 4}, + {"matrix": [2, 13], "x": 224, "y": 0, "flags": 4}, + {"matrix": [0, 14], "x": 240, "y": 0, "flags": 4}, + {"matrix": [1, 14], "x": 0, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 24, "y": 16, "flags": 4}, + {"matrix": [1, 12], "x": 40, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 56, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 72, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 88, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 104, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 120, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 136, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 152, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 168, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 184, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 200, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 216, "y": 16, "flags": 4}, + {"matrix": [1, 0], "x": 240, "y": 16, "flags": 4}, + {"matrix": [2, 0], "x": 0, "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": 204, "y": 32, "flags": 4}, + {"matrix": [2, 14], "x": 240, "y": 32, "flags": 4}, + {"matrix": [3, 14], "x": 0, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 36, "y": 48, "flags": 4}, + {"matrix": [3, 12], "x": 52, "y": 48, "flags": 4}, + {"matrix": [3, 11], "x": 68, "y": 48, "flags": 4}, + {"matrix": [3, 10], "x": 84, "y": 48, "flags": 4}, + {"matrix": [3, 9], "x": 100, "y": 48, "flags": 4}, + {"matrix": [3, 8], "x": 116, "y": 48, "flags": 4}, + {"matrix": [3, 7], "x": 132, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 148, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 164, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 180, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 196, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 0], "x": 240, "y": 48, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 24, "y": 64, "flags": 4}, + {"matrix": [4, 6], "x": 48, "y": 64, "flags": 4}, + {"matrix": [4, 10], "x": 160, "y": 64, "flags": 4}, + {"matrix": [4, 11], "x": 184, "y": 64, "flags": 4}, + {"matrix": [4, 12], "x": 208, "y": 64, "flags": 4}, + {"matrix": [4, 13], "x": 224, "y": 64, "flags": 4}, + {"matrix": [4, 14], "x": 240, "y": 64, "flags": 4} + ], + "max_brightness": 120 + }, + "url": "", + "usb": { + "device_version": "0.0.1", + "pid": "0x6503", + "vid": "0x5363" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP13" + }, + "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}, + {"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": [2, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15, "y": 0}, + {"label": "encoder", "matrix": [3, 1], "x": 16, "y": 0, "encoder": 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": [1, 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, "w": 2.25}, + {"matrix": [2, 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": [3, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4, "w": 1}, + {"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}, + {"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/icebreaker/hotswap/keymaps/default/keymap.c b/keyboards/icebreaker/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..058210fff4 --- /dev/null +++ b/keyboards/icebreaker/hotswap/keymaps/default/keymap.c @@ -0,0 +1,43 @@ +/* +Copyright 2024 Matthijs Muller + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [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_MINS, KC_EQL, KC_BSLS, KC_DEL, KC_GRV, KC_MUTE, + 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_BSPC, 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_ENT, 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_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, RM_TOGG, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, _______, + _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT + ) +}; + +#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(RM_SATD, RM_SATU) }, +}; +#endif diff --git a/keyboards/icebreaker/hotswap/keymaps/default/rules.mk b/keyboards/icebreaker/hotswap/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/icebreaker/hotswap/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/icebreaker/readme.md b/keyboards/icebreaker/readme.md new file mode 100644 index 0000000000..439756f1b3 --- /dev/null +++ b/keyboards/icebreaker/readme.md @@ -0,0 +1,26 @@ +# Icebreaker + +![Icebreaker](https://i.imgur.com/vSRfEOD.png) + + + +* Keyboard Maintainer: [Matthijs Muller](https://github.com/SmollChungus) +* Hardware Supported: Icebreaker Hotswap PCB + +Make example for this keyboard (after setting up your build environment): + + make icebreaker:default + +Flashing example for this keyboard: + + make icebreaker: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 \ No newline at end of file From 21c1fd5e5b0cfcb3823843857d47600c39b97f0a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 9 Mar 2025 23:40:59 +0000 Subject: [PATCH 218/592] Require 'x'/'y' properties for LED/RGB Matrix layout (#24997) --- data/schemas/keyboard.jsonschema | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 9b63f62d45..eee2915fcb 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -554,6 +554,7 @@ "items": { "type": "object", "additionalProperties": false, + "required": ["x", "y"], "properties": { "matrix": { "type": "array", @@ -640,6 +641,7 @@ "items": { "type": "object", "additionalProperties": false, + "required": ["x", "y"], "properties": { "matrix": { "type": "array", From 67934546ea59f9e7782e55985281d07319f21639 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 9 Mar 2025 23:41:24 +0000 Subject: [PATCH 219/592] Only configure `STM32_HSECLK` within `board.h` (#25001) --- .../lilith/config.h => akb/vero/board.h} | 7 +++--- keyboards/akb/vero/config.h | 23 ------------------- .../model_m_4th_gen/overnumpad_1xb/board.h | 8 +++++++ .../model_m_4th_gen/overnumpad_1xb/config.h | 2 -- keyboards/keychron/c1_pro_v2/board.h | 8 +++++++ keyboards/keychron/c1_pro_v2/mcuconf.h | 3 --- keyboards/keychron/c2_pro_v2/board.h | 8 +++++++ keyboards/keychron/c2_pro_v2/mcuconf.h | 3 --- keyboards/keychron/c3_pro/board.h | 8 +++++++ keyboards/keychron/c3_pro/mcuconf.h | 3 --- keyboards/neson_design/810e/board.h | 8 +++++++ keyboards/neson_design/810e/config.h | 21 ----------------- keyboards/nix_studio/lilith/board.h | 8 +++++++ keyboards/teleport/native/board.h | 8 +++++++ keyboards/teleport/native/config.h | 3 --- .../overnumpad_1xb/board.h | 8 +++++++ .../overnumpad_1xb/config.h | 2 -- .../overnumpad_1xb/board.h | 8 +++++++ .../overnumpad_1xb/config.h | 2 -- .../unicomp/pc122/overnumpad_1xb/board.h | 8 +++++++ .../unicomp/pc122/overnumpad_1xb/config.h | 2 -- .../overnumpad_1xb/board.h | 8 +++++++ .../overnumpad_1xb/config.h | 2 -- .../overnumpad_1xb/board.h | 8 +++++++ .../overnumpad_1xb/config.h | 2 -- keyboards/werk_technica/one/board.h | 8 +++++++ keyboards/werk_technica/one/config.h | 7 ------ keyboards/xelus/rs108/board.h | 8 +++++++ keyboards/xelus/rs108/config.h | 3 --- keyboards/xelus/rs60/rev2_0/board.h | 8 +++++++ keyboards/xelus/rs60/rev2_0/config.h | 3 --- keyboards/xelus/valor_frl_tkl/rev2_0/board.h | 8 +++++++ keyboards/xelus/valor_frl_tkl/rev2_0/config.h | 19 --------------- keyboards/xelus/valor_frl_tkl/rev2_1/board.h | 8 +++++++ keyboards/xelus/valor_frl_tkl/rev2_1/config.h | 19 --------------- 35 files changed, 140 insertions(+), 122 deletions(-) rename keyboards/{nix_studio/lilith/config.h => akb/vero/board.h} (55%) delete mode 100644 keyboards/akb/vero/config.h create mode 100644 keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h create mode 100644 keyboards/keychron/c1_pro_v2/board.h create mode 100644 keyboards/keychron/c2_pro_v2/board.h create mode 100644 keyboards/keychron/c3_pro/board.h create mode 100644 keyboards/neson_design/810e/board.h delete mode 100644 keyboards/neson_design/810e/config.h create mode 100644 keyboards/nix_studio/lilith/board.h create mode 100644 keyboards/teleport/native/board.h create mode 100644 keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h create mode 100644 keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h create mode 100644 keyboards/unicomp/pc122/overnumpad_1xb/board.h create mode 100644 keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h create mode 100644 keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h create mode 100644 keyboards/werk_technica/one/board.h delete mode 100644 keyboards/werk_technica/one/config.h create mode 100644 keyboards/xelus/rs108/board.h create mode 100644 keyboards/xelus/rs60/rev2_0/board.h create mode 100644 keyboards/xelus/valor_frl_tkl/rev2_0/board.h delete mode 100644 keyboards/xelus/valor_frl_tkl/rev2_0/config.h create mode 100644 keyboards/xelus/valor_frl_tkl/rev2_1/board.h delete mode 100644 keyboards/xelus/valor_frl_tkl/rev2_1/config.h diff --git a/keyboards/nix_studio/lilith/config.h b/keyboards/akb/vero/board.h similarity index 55% rename from keyboards/nix_studio/lilith/config.h rename to keyboards/akb/vero/board.h index 225e6ac51b..2a370fe2e0 100644 --- a/keyboards/nix_studio/lilith/config.h +++ b/keyboards/akb/vero/board.h @@ -1,7 +1,8 @@ // Copyright 2022 Martin Arnstad (@arnstadm) // SPDX-License-Identifier: GPL-2.0-or-later - #pragma once -/* Set HSE clock since it differs from F411 default */ -#define STM32_HSECLK 16000000 +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/akb/vero/config.h b/keyboards/akb/vero/config.h deleted file mode 100644 index bb6d15d92c..0000000000 --- a/keyboards/akb/vero/config.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 Martin Arnstad (@arnstadm) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -//#define NO_DEBUG - -/* disable print */ -//#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT - -/* Set HSE clock since it differs from F411 default */ -#define STM32_HSECLK 16000000 diff --git a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h +++ b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/keychron/c1_pro_v2/board.h b/keyboards/keychron/c1_pro_v2/board.h new file mode 100644 index 0000000000..e6cf0b2856 --- /dev/null +++ b/keyboards/keychron/c1_pro_v2/board.h @@ -0,0 +1,8 @@ +// Copyright 2025 @ Keychron (https://www.keychron.com) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/keychron/c1_pro_v2/mcuconf.h b/keyboards/keychron/c1_pro_v2/mcuconf.h index ca470fb5b3..95966a32ce 100644 --- a/keyboards/keychron/c1_pro_v2/mcuconf.h +++ b/keyboards/keychron/c1_pro_v2/mcuconf.h @@ -18,9 +18,6 @@ #include_next -#undef STM32_HSECLK -#define STM32_HSECLK 16000000U - #undef STM32_PLLM_VALUE #define STM32_PLLM_VALUE 8 diff --git a/keyboards/keychron/c2_pro_v2/board.h b/keyboards/keychron/c2_pro_v2/board.h new file mode 100644 index 0000000000..e6cf0b2856 --- /dev/null +++ b/keyboards/keychron/c2_pro_v2/board.h @@ -0,0 +1,8 @@ +// Copyright 2025 @ Keychron (https://www.keychron.com) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/keychron/c2_pro_v2/mcuconf.h b/keyboards/keychron/c2_pro_v2/mcuconf.h index ca470fb5b3..95966a32ce 100644 --- a/keyboards/keychron/c2_pro_v2/mcuconf.h +++ b/keyboards/keychron/c2_pro_v2/mcuconf.h @@ -18,9 +18,6 @@ #include_next -#undef STM32_HSECLK -#define STM32_HSECLK 16000000U - #undef STM32_PLLM_VALUE #define STM32_PLLM_VALUE 8 diff --git a/keyboards/keychron/c3_pro/board.h b/keyboards/keychron/c3_pro/board.h new file mode 100644 index 0000000000..60d25b93b8 --- /dev/null +++ b/keyboards/keychron/c3_pro/board.h @@ -0,0 +1,8 @@ +// Copyright 2024 @ Keychron (https://www.keychron.com) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/keychron/c3_pro/mcuconf.h b/keyboards/keychron/c3_pro/mcuconf.h index b2b81df855..ad75926a14 100644 --- a/keyboards/keychron/c3_pro/mcuconf.h +++ b/keyboards/keychron/c3_pro/mcuconf.h @@ -18,9 +18,6 @@ #include_next -#undef STM32_HSECLK -#define STM32_HSECLK 16000000U - #undef STM32_PLLM_VALUE #define STM32_PLLM_VALUE 8 diff --git a/keyboards/neson_design/810e/board.h b/keyboards/neson_design/810e/board.h new file mode 100644 index 0000000000..681350a0ea --- /dev/null +++ b/keyboards/neson_design/810e/board.h @@ -0,0 +1,8 @@ +// Copyright 2024 astro +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/neson_design/810e/config.h b/keyboards/neson_design/810e/config.h deleted file mode 100644 index c6409b1ece..0000000000 --- a/keyboards/neson_design/810e/config.h +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright 2024 astro - * - * 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 BOARD_OTG_NOVBUSSENS 1 -#define STM32_HSECLK 16000000U diff --git a/keyboards/nix_studio/lilith/board.h b/keyboards/nix_studio/lilith/board.h new file mode 100644 index 0000000000..2a370fe2e0 --- /dev/null +++ b/keyboards/nix_studio/lilith/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Martin Arnstad (@arnstadm) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/teleport/native/board.h b/keyboards/teleport/native/board.h new file mode 100644 index 0000000000..41efeb2c1a --- /dev/null +++ b/keyboards/teleport/native/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Moritz Plattner +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/teleport/native/config.h b/keyboards/teleport/native/config.h index 31d0025883..cd823d725e 100644 --- a/keyboards/teleport/native/config.h +++ b/keyboards/teleport/native/config.h @@ -67,6 +67,3 @@ along with this program. If not, see . #ifdef ENABLE_RGB_MATRIX_TYPING_HEATMAP #define RGB_MATRIX_TYPING_HEATMAP_SLIM #endif - -/* Set HSE clock since it differs from F411 default */ -#define STM32_HSECLK 16000000 diff --git a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h +++ b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h +++ b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/unicomp/pc122/overnumpad_1xb/board.h b/keyboards/unicomp/pc122/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/unicomp/pc122/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/unicomp/pc122/overnumpad_1xb/config.h b/keyboards/unicomp/pc122/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/unicomp/pc122/overnumpad_1xb/config.h +++ b/keyboards/unicomp/pc122/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h +++ b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h new file mode 100644 index 0000000000..5b80eb2230 --- /dev/null +++ b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h @@ -0,0 +1,8 @@ +// Copyright 2020 Purdea Andrei +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h index 71e60e9cfe..c10d26b9b2 100644 --- a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h +++ b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h @@ -21,8 +21,6 @@ #define SERIAL_NUMBER DEF_SERIAL_NUMBER #endif -#define STM32_HSECLK 16000000 - #define SOLENOID_PIN B5 #define HAPTIC_ENABLE_PIN C13 #define SOLENOID_DEFAULT_DWELL 20 diff --git a/keyboards/werk_technica/one/board.h b/keyboards/werk_technica/one/board.h new file mode 100644 index 0000000000..3ad450d023 --- /dev/null +++ b/keyboards/werk_technica/one/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/werk_technica/one/config.h b/keyboards/werk_technica/one/config.h deleted file mode 100644 index 765e70851b..0000000000 --- a/keyboards/werk_technica/one/config.h +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2022 QMK -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -/* Set HSE clock since it differs from F411 default */ -#define STM32_HSECLK 16000000 \ No newline at end of file diff --git a/keyboards/xelus/rs108/board.h b/keyboards/xelus/rs108/board.h new file mode 100644 index 0000000000..cce4af40f9 --- /dev/null +++ b/keyboards/xelus/rs108/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Harrison Chan (Xelus) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/xelus/rs108/config.h b/keyboards/xelus/rs108/config.h index 3d3bc49228..883ed2b9aa 100644 --- a/keyboards/xelus/rs108/config.h +++ b/keyboards/xelus/rs108/config.h @@ -28,6 +28,3 @@ // Hardware Defines #define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE - -// HSE CLK -#define STM32_HSECLK 16000000 diff --git a/keyboards/xelus/rs60/rev2_0/board.h b/keyboards/xelus/rs60/rev2_0/board.h new file mode 100644 index 0000000000..cce4af40f9 --- /dev/null +++ b/keyboards/xelus/rs60/rev2_0/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Harrison Chan (Xelus) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/xelus/rs60/rev2_0/config.h b/keyboards/xelus/rs60/rev2_0/config.h index 3d3bc49228..883ed2b9aa 100644 --- a/keyboards/xelus/rs60/rev2_0/config.h +++ b/keyboards/xelus/rs60/rev2_0/config.h @@ -28,6 +28,3 @@ // Hardware Defines #define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE - -// HSE CLK -#define STM32_HSECLK 16000000 diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/board.h b/keyboards/xelus/valor_frl_tkl/rev2_0/board.h new file mode 100644 index 0000000000..cce4af40f9 --- /dev/null +++ b/keyboards/xelus/valor_frl_tkl/rev2_0/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Harrison Chan (Xelus) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/config.h b/keyboards/xelus/valor_frl_tkl/rev2_0/config.h deleted file mode 100644 index b085b99d88..0000000000 --- a/keyboards/xelus/valor_frl_tkl/rev2_0/config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright 2022 Harrison Chan (Xelus) - * - * 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 STM32_HSECLK 16000000 diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/board.h b/keyboards/xelus/valor_frl_tkl/rev2_1/board.h new file mode 100644 index 0000000000..cce4af40f9 --- /dev/null +++ b/keyboards/xelus/valor_frl_tkl/rev2_1/board.h @@ -0,0 +1,8 @@ +// Copyright 2022 Harrison Chan (Xelus) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/config.h b/keyboards/xelus/valor_frl_tkl/rev2_1/config.h deleted file mode 100644 index b085b99d88..0000000000 --- a/keyboards/xelus/valor_frl_tkl/rev2_1/config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Copyright 2022 Harrison Chan (Xelus) - * - * 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 STM32_HSECLK 16000000 From 808c4d4e383a0592e073e75a4b13ba4aa472d365 Mon Sep 17 00:00:00 2001 From: Duncan Sutherland Date: Mon, 10 Mar 2025 07:48:35 +0000 Subject: [PATCH 220/592] add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon (#22459) * expand mechlovin/olly/octagon * Update info.json * Rename info.json to keyboard.json * correct matrix position for key * remove VIA --- .../mechlovin/olly/octagon/keyboard.json | 751 +++++++++++++++++- .../olly/octagon/keymaps/default/keymap.c | 6 +- .../mechlovin/olly/octagon/matrix_diagram.md | 26 + 3 files changed, 777 insertions(+), 6 deletions(-) create mode 100644 keyboards/mechlovin/olly/octagon/matrix_diagram.md diff --git a/keyboards/mechlovin/olly/octagon/keyboard.json b/keyboards/mechlovin/olly/octagon/keyboard.json index 4bc7d88ed7..9c580a664e 100644 --- a/keyboards/mechlovin/olly/octagon/keyboard.json +++ b/keyboards/mechlovin/olly/octagon/keyboard.json @@ -170,11 +170,12 @@ "processor": "STM32F103", "bootloader": "stm32duino", "layout_aliases": { - "LAYOUT": "LAYOUT_split_bs", - "LAYOUT_all": "LAYOUT_split_bs" + "LAYOUT": "LAYOUT_all", + "LAYOUT_split_bs": "LAYOUT_all" }, + "community_layouts": ["75_ansi", "75_iso"], "layouts": { - "LAYOUT_split_bs": { + "LAYOUT_all": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, {"matrix": [0, 1], "x": 1, "y": 0}, @@ -269,6 +270,750 @@ {"matrix": [5, 14], "x": 14, "y": 5}, {"matrix": [5, 15], "x": 15, "y": 5} ] + }, + "LAYOUT_75_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}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5}, + {"matrix": [5, 11], "x": 11, "y": 5}, + {"matrix": [5, 12], "x": 12, "y": 5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_ansi_split_bs": { + "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": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + {"matrix": [1, 14], "x": 14, "y": 1}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5}, + {"matrix": [5, 11], "x": 11, "y": 5}, + {"matrix": [5, 12], "x": 12, "y": 5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_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}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5}, + {"matrix": [5, 6], "x": 3, "y": 5, "w": 7}, + {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5}, + {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_ansi_wkl_split_bs": { + "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": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + {"matrix": [1, 14], "x": 14, "y": 1}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5}, + {"matrix": [5, 6], "x": 3, "y": 5, "w": 7}, + {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5}, + {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_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], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 12], "x": 12.75, "y": 3}, + {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5}, + {"matrix": [5, 11], "x": 11, "y": 5}, + {"matrix": [5, 12], "x": 12, "y": 5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_iso_split_bs": { + "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": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + {"matrix": [1, 14], "x": 14, "y": 1}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 12], "x": 12.75, "y": 3}, + {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5}, + {"matrix": [5, 11], "x": 11, "y": 5}, + {"matrix": [5, 12], "x": 12, "y": 5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_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}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 12], "x": 12.75, "y": 3}, + {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5}, + {"matrix": [5, 6], "x": 3, "y": 5, "w": 7}, + {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5}, + {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] + }, + "LAYOUT_75_iso_wkl_split_bs": { + "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": [0, 15], "x": 15, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + {"matrix": [1, 14], "x": 14, "y": 1}, + {"matrix": [1, 15], "x": 15, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 15], "x": 15, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 12], "x": 12.75, "y": 3}, + {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2}, + {"matrix": [3, 15], "x": 15, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4}, + {"matrix": [4, 2], "x": 2.25, "y": 4}, + {"matrix": [4, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 4], "x": 4.25, "y": 4}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [4, 8], "x": 8.25, "y": 4}, + {"matrix": [4, 9], "x": 9.25, "y": 4}, + {"matrix": [4, 10], "x": 10.25, "y": 4}, + {"matrix": [4, 11], "x": 11.25, "y": 4}, + {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5}, + {"matrix": [5, 6], "x": 3, "y": 5, "w": 7}, + {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5}, + {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5}, + {"matrix": [5, 13], "x": 13, "y": 5}, + {"matrix": [5, 14], "x": 14, "y": 5}, + {"matrix": [5, 15], "x": 15, "y": 5} + ] } } } diff --git a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c index 353f5f5d6d..19cd554ac3 100644 --- a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c +++ b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c @@ -16,12 +16,12 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_split_bs( + [0] = LAYOUT_all( 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_PSCR, KC_PAUS, KC_DEL, 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_DEL, KC_HOME, 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_ENT, 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_LSFT, KC_UP, KC_END, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT - ) + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), }; diff --git a/keyboards/mechlovin/olly/octagon/matrix_diagram.md b/keyboards/mechlovin/olly/octagon/matrix_diagram.md new file mode 100644 index 0000000000..426e0691d1 --- /dev/null +++ b/keyboards/mechlovin/olly/octagon/matrix_diagram.md @@ -0,0 +1,26 @@ +# Matrix Diagram for Mechlovin Olly Octagon + +``` +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │0F │ +├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ ┌───────┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │1F │ │1D │ 2u Backspace +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ └─┬─────┤ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2E │2F │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐2E │ ISO Enter +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │3F │ │3C │ │ +├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘ +│40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4E │4F │ +├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┼───┼───┤ +│50 │51 │52 │56 │5A │5B │5C │5D │5E │5F │ +└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘ +┌────────┐ +│40 │ 2.25u LShift +└────────┘ +┌────┬───┬────┬────────────────────────┬────┬───┬───┬───┬───┬───┐ +│50 │51 │52 │56 │5A │5B │5C │5D │5E │5F │ Alternative +└────┴───┴────┴────────────────────────┴────┴───┴───┴───┴───┴───┘ +┌─────┬─────┬───────────────────────────┬─────┬─────┬───┬───┬───┐ +│50 │51 │56 │5A │5C │5D │5E │5F │ WKL +└─────┴─────┴───────────────────────────┴─────┴─────┴───┴───┴───┘ +``` From 84f9b6dd3e979cefe89271ca1356f9e3d6614998 Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Tue, 11 Mar 2025 09:42:33 +0000 Subject: [PATCH 221/592] Add Mechboards Sofle (#25004) * add sofle * fix readme --- keyboards/mechboards/sofle/pro/config.h | 6 + keyboards/mechboards/sofle/pro/keyboard.json | 203 ++++++++++++++++++ .../sofle/pro/keymaps/default/keymap.c | 47 ++++ .../sofle/pro/keymaps/default/rules.mk | 1 + keyboards/mechboards/sofle/pro/post_rules.mk | 1 + keyboards/mechboards/sofle/pro/pro.c | 15 ++ keyboards/mechboards/sofle/pro/readme.md | 25 +++ 7 files changed, 298 insertions(+) create mode 100644 keyboards/mechboards/sofle/pro/config.h create mode 100644 keyboards/mechboards/sofle/pro/keyboard.json create mode 100644 keyboards/mechboards/sofle/pro/keymaps/default/keymap.c create mode 100644 keyboards/mechboards/sofle/pro/keymaps/default/rules.mk create mode 100644 keyboards/mechboards/sofle/pro/post_rules.mk create mode 100644 keyboards/mechboards/sofle/pro/pro.c create mode 100644 keyboards/mechboards/sofle/pro/readme.md diff --git a/keyboards/mechboards/sofle/pro/config.h b/keyboards/mechboards/sofle/pro/config.h new file mode 100644 index 0000000000..43a4b3eb9f --- /dev/null +++ b/keyboards/mechboards/sofle/pro/config.h @@ -0,0 +1,6 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "keyboards/mechboards/common/rgb_effects.h" diff --git a/keyboards/mechboards/sofle/pro/keyboard.json b/keyboards/mechboards/sofle/pro/keyboard.json new file mode 100644 index 0000000000..dbc339d9a1 --- /dev/null +++ b/keyboards/mechboards/sofle/pro/keyboard.json @@ -0,0 +1,203 @@ +{ + "manufacturer": "Mechboards", + "keyboard_name": "Sofle Pro", + "maintainer": "dasky", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "F5", "pin_b": "F4"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "os_detection": true, + "rgb_matrix": true, + "wpm": true + }, + "matrix_pins": { + "cols": ["F6", "F7", "B1", "B3", "B2", "B6"], + "rows": ["C6", "D7", "E6", "B4", "B5"] + }, + "rgb_matrix": { + "animations": { + "cycle_left_right": true + }, + "default": { + "animation": "cycle_left_right" + }, + "driver": "ws2812", + "layout": [ + {"matrix": [4, 0], "x": 32, "y": 57, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 36, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 24, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 12, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 12, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 36, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4}, + {"matrix": [4, 1], "x": 48, "y": 55, "flags": 4}, + {"matrix": [4, 2], "x": 64, "y": 57, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 45, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 33, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 21, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 9, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 7, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 19, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 31, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 43, "flags": 4}, + {"matrix": [4, 3], "x": 80, "y": 59, "flags": 4}, + {"matrix": [4, 4], "x": 96, "y": 64, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 45, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 33, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 21, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 9, "flags": 4}, + {"matrix": [0, 5], "x": 80, "y": 10, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 22, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 34, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 47, "flags": 4}, + {"x": 84, "y": 45, "flags": 2}, + {"x": 68, "y": 7, "flags": 2}, + {"x": 20, "y": 14, "flags": 2}, + {"x": 28, "y": 49, "flags": 2}, + {"x": 62, "y": 57, "flags": 2}, + {"matrix": [9, 0], "x": 192, "y": 57, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 48, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 36, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 24, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 12, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 12, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 36, "flags": 4}, + {"matrix": [8, 1], "x": 208, "y": 48, "flags": 4}, + {"matrix": [9, 1], "x": 176, "y": 55, "flags": 4}, + {"matrix": [9, 2], "x": 160, "y": 57, "flags": 4}, + {"matrix": [8, 2], "x": 192, "y": 45, "flags": 4}, + {"matrix": [7, 2], "x": 192, "y": 33, "flags": 4}, + {"matrix": [6, 2], "x": 192, "y": 21, "flags": 4}, + {"matrix": [5, 2], "x": 192, "y": 9, "flags": 4}, + {"matrix": [5, 3], "x": 176, "y": 7, "flags": 4}, + {"matrix": [6, 3], "x": 176, "y": 19, "flags": 4}, + {"matrix": [7, 3], "x": 176, "y": 31, "flags": 4}, + {"matrix": [8, 3], "x": 176, "y": 43, "flags": 4}, + {"matrix": [9, 3], "x": 144, "y": 59, "flags": 4}, + {"matrix": [9, 4], "x": 128, "y": 64, "flags": 4}, + {"matrix": [8, 4], "x": 160, "y": 45, "flags": 4}, + {"matrix": [7, 4], "x": 160, "y": 33, "flags": 4}, + {"matrix": [6, 4], "x": 160, "y": 21, "flags": 4}, + {"matrix": [5, 4], "x": 160, "y": 9, "flags": 4}, + {"matrix": [5, 5], "x": 144, "y": 10, "flags": 4}, + {"matrix": [6, 5], "x": 144, "y": 22, "flags": 4}, + {"matrix": [7, 5], "x": 144, "y": 34, "flags": 4}, + {"matrix": [8, 5], "x": 144, "y": 47, "flags": 4} + {"x": 140, "y": 45, "flags": 2}, + {"x": 156, "y": 7, "flags": 2}, + {"x": 204, "y": 14, "flags": 2}, + {"x": 196, "y": 49, "flags": 2}, + {"x": 162, "y": 57, "flags": 2} + ], + "max_brightness": 120, + "split_count": [34, 34] + }, + "rgblight": { + "led_count": 68, + "max_brightness": 120, + "split_count": [34, 34] + }, + "split": { + "enabled": true, + "serial": { + "pin": "D2" + }, + "transport": { + "sync": { + "matrix_state": true, + "oled": true, + "wpm": true + } + } + }, + "url": "mechboards.co.uk", + "usb": { + "device_version": "1.0.0", + "pid": "0x0004", + "vid": "0x7171" + }, + "ws2812": { + "pin": "D3" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.5}, + {"matrix": [0, 1], "x": 1, "y": 0.375}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [5, 5], "x": 10.5, "y": 0.25}, + {"matrix": [5, 4], "x": 11.5, "y": 0.125}, + {"matrix": [5, 3], "x": 12.5, "y": 0}, + {"matrix": [5, 2], "x": 13.5, "y": 0.125}, + {"matrix": [5, 1], "x": 14.5, "y": 0.375}, + {"matrix": [5, 0], "x": 15.5, "y": 0.5}, + {"matrix": [1, 0], "x": 0, "y": 1.5}, + {"matrix": [1, 1], "x": 1, "y": 1.375}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [6, 5], "x": 10.5, "y": 1.25}, + {"matrix": [6, 4], "x": 11.5, "y": 1.125}, + {"matrix": [6, 3], "x": 12.5, "y": 1}, + {"matrix": [6, 2], "x": 13.5, "y": 1.125}, + {"matrix": [6, 1], "x": 14.5, "y": 1.375}, + {"matrix": [6, 0], "x": 15.5, "y": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2.5}, + {"matrix": [2, 1], "x": 1, "y": 2.375}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.25}, + {"matrix": [7, 5], "x": 10.5, "y": 2.25}, + {"matrix": [7, 4], "x": 11.5, "y": 2.125}, + {"matrix": [7, 3], "x": 12.5, "y": 2}, + {"matrix": [7, 2], "x": 13.5, "y": 2.125}, + {"matrix": [7, 1], "x": 14.5, "y": 2.375}, + {"matrix": [7, 0], "x": 15.5, "y": 2.5}, + {"matrix": [3, 0], "x": 0, "y": 3.5}, + {"matrix": [3, 1], "x": 1, "y": 3.375}, + {"matrix": [3, 2], "x": 2, "y": 3.125}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3.125}, + {"matrix": [3, 5], "x": 5, "y": 3.25}, + {"matrix": [4, 5], "x": 6, "y": 2.75}, + {"matrix": [9, 5], "x": 9.5, "y": 2.75}, + {"matrix": [8, 5], "x": 10.5, "y": 3.25}, + {"matrix": [8, 4], "x": 11.5, "y": 3.125}, + {"matrix": [8, 3], "x": 12.5, "y": 3}, + {"matrix": [8, 2], "x": 13.5, "y": 3.125}, + {"matrix": [8, 1], "x": 14.5, "y": 3.375}, + {"matrix": [8, 0], "x": 15.5, "y": 3.5}, + {"matrix": [4, 0], "x": 1.5, "y": 4.375}, + {"matrix": [4, 1], "x": 2.5, "y": 4.125}, + {"matrix": [4, 2], "x": 3.5, "y": 4.15}, + {"matrix": [4, 3], "x": 4.5, "y": 4.25}, + {"matrix": [4, 4], "x": 6, "y": 4.25, "h": 1.5}, + {"matrix": [9, 4], "x": 9.5, "y": 4.25, "h": 1.5}, + {"matrix": [9, 3], "x": 11, "y": 4.25}, + {"matrix": [9, 2], "x": 12, "y": 4.15}, + {"matrix": [9, 1], "x": 13, "y": 4.125}, + {"matrix": [9, 0], "x": 14, "y": 4.375} + ] + } + } +} diff --git a/keyboards/mechboards/sofle/pro/keymaps/default/keymap.c b/keyboards/mechboards/sofle/pro/keymaps/default/keymap.c new file mode 100644 index 0000000000..dac2331fd7 --- /dev/null +++ b/keyboards/mechboards/sofle/pro/keymaps/default/keymap.c @@ -0,0 +1,47 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// clang-format off + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, 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_MUTE, KC_MPLY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, KC_LALT, KC_LCTL, MO(1), KC_ENT, KC_SPC, MO(2), KC_RCTL, KC_RALT, KC_RGUI + ), + [1] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, + _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______, + _______, _______, _______, _______, _______, _______, MO(3), _______, _______, _______ + ), + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,_______, + _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, KC_BSPC, + _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, XXXXXXX, + _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, MO(3), _______, _______, _______, _______, _______, _______ + ), + [3] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX ,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { +[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT)}, +[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, +[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, +[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)} +}; +#endif +// clang-format on diff --git a/keyboards/mechboards/sofle/pro/keymaps/default/rules.mk b/keyboards/mechboards/sofle/pro/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/mechboards/sofle/pro/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/mechboards/sofle/pro/post_rules.mk b/keyboards/mechboards/sofle/pro/post_rules.mk new file mode 100644 index 0000000000..4bfdc8ca89 --- /dev/null +++ b/keyboards/mechboards/sofle/pro/post_rules.mk @@ -0,0 +1 @@ +include keyboards/mechboards/common/post_rules.mk diff --git a/keyboards/mechboards/sofle/pro/pro.c b/keyboards/mechboards/sofle/pro/pro.c new file mode 100644 index 0000000000..df377eb28a --- /dev/null +++ b/keyboards/mechboards/sofle/pro/pro.c @@ -0,0 +1,15 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE +void render_logo(void) { + static const char PROGMEM pro_logo[] = { + 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 31, 31, 31, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 252, 0, 0, 0, 240, 248, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 248, 24, 24, 24, 24, 16, 0, 0, 248, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 4, 4, 4, 4, 4, 255, + 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 255, 255, 0, 0, 0, 3, 7, 6, 6, 6, 6, 254, 252, 0, 0, 254, 255, 3, 3, 3, 3, 255, 254, 0, 0, 3, 255, 255, 3, 3, 3, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 254, 255, 51, 51, 51, 51, 63, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 65, 65, 65, 65, 65, 255, 127, 127, 127, 127, 127, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 1, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 0, 0, 1, 3, 3, 3, 3, 3, 3, 1, 0, 0, 224, 240, 48, 176, 176, 112, 240, 48, 176, 176, 112, 240, 112, 176, 176, 112, 240, 224, 0, 0, 63, 127, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 255, 255, 127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 63, 48, 61, 61, 62, 63, 48, 61, 61, 50, 63, 56, 55, 55, 56, 63, 31, 0, 0, + }; + oled_write_raw_P(pro_logo, sizeof(pro_logo)); +} +#endif diff --git a/keyboards/mechboards/sofle/pro/readme.md b/keyboards/mechboards/sofle/pro/readme.md new file mode 100644 index 0000000000..7e1a772759 --- /dev/null +++ b/keyboards/mechboards/sofle/pro/readme.md @@ -0,0 +1,25 @@ +# Sofle Pro + +A refreshed PCB with per key RGB, battery, power switch support. + +* Keyboard Maintainer: [dasky](https://github.com/daskygit) +* Hardware Supported: Controllers using promicro footprint. +* Hardware Availability: https://mechboards.co.uk + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb mechboards/sofle/pro -km default + +Flashing example for this keyboard: + + qmk flash -kb mechboards/sofle/pro -km default + +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 top left key or the top right key depending on which side you're connecting to USB. +* **Physical reset button**: Double press the button below the TRRS socket. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 25af20bef42173925b4f6154480ec79c0d03dea0 Mon Sep 17 00:00:00 2001 From: Ivan Gromov <38141348+key10iq@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:20:56 +0400 Subject: [PATCH 222/592] [Keyboard] Add kt60-MU PCB (#24797) * Add kt60-MU * Adding some license headers * Update keyboards/keyten/kt60_mu/keyboard.json Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60_mu/keyboard.json Co-authored-by: Sergey Vlasov * Update keyboard.json * Update keyboard.json * Update keyboards/keyten/kt60_mu/keyboard.json Co-authored-by: Duncan Sutherland * Update keyboards/keyten/kt60_mu/keyboard.json Co-authored-by: Sergey Vlasov --------- Co-authored-by: Sergey Vlasov Co-authored-by: Duncan Sutherland --- keyboards/keyten/kt60_mu/chconf.h | 9 + keyboards/keyten/kt60_mu/config.h | 6 + keyboards/keyten/kt60_mu/halconf.h | 8 + keyboards/keyten/kt60_mu/keyboard.json | 300 ++++++++++++++++++ .../keyten/kt60_mu/keymaps/default/keymap.c | 24 ++ keyboards/keyten/kt60_mu/mcuconf.h | 12 + keyboards/keyten/kt60_mu/readme.md | 42 +++ 7 files changed, 401 insertions(+) create mode 100644 keyboards/keyten/kt60_mu/chconf.h create mode 100644 keyboards/keyten/kt60_mu/config.h create mode 100644 keyboards/keyten/kt60_mu/halconf.h create mode 100644 keyboards/keyten/kt60_mu/keyboard.json create mode 100644 keyboards/keyten/kt60_mu/keymaps/default/keymap.c create mode 100644 keyboards/keyten/kt60_mu/mcuconf.h create mode 100644 keyboards/keyten/kt60_mu/readme.md diff --git a/keyboards/keyten/kt60_mu/chconf.h b/keyboards/keyten/kt60_mu/chconf.h new file mode 100644 index 0000000000..2166f7dd9e --- /dev/null +++ b/keyboards/keyten/kt60_mu/chconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef CH_CFG_ST_RESOLUTION +#define CH_CFG_ST_RESOLUTION 16 diff --git a/keyboards/keyten/kt60_mu/config.h b/keyboards/keyten/kt60_mu/config.h new file mode 100644 index 0000000000..7547e9ed28 --- /dev/null +++ b/keyboards/keyten/kt60_mu/config.h @@ -0,0 +1,6 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#define BACKLIGHT_PWM_DRIVER PWMD2 +#define BACKLIGHT_PWM_CHANNEL 4 +#define BACKLIGHT_PAL_MODE 2 diff --git a/keyboards/keyten/kt60_mu/halconf.h b/keyboards/keyten/kt60_mu/halconf.h new file mode 100644 index 0000000000..835310a770 --- /dev/null +++ b/keyboards/keyten/kt60_mu/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/keyten/kt60_mu/keyboard.json b/keyboards/keyten/kt60_mu/keyboard.json new file mode 100644 index 0000000000..dcf5035b8e --- /dev/null +++ b/keyboards/keyten/kt60_mu/keyboard.json @@ -0,0 +1,300 @@ +{ + "manufacturer": "keyten", + "keyboard_name": "kt60-MU", + "maintainer": "key10iq", + "processor": "STM32F072", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0xEB69", + "pid": "0x6006", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "backlight": true + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "rows": ["B2", "B1", "B7", "B6", "B5"], + "cols": ["A15", "A4", "F1", "A5", "F0", "A6", "C15", "A7", "C14", "B0", "C13", "B10", "B4", "B3"] + }, + "indicators": { + "caps_lock": "A14" + }, + "backlight": { + "pin": "B11", + "levels": 15 + }, + "community_layouts": [ + "60_ansi_wkl_split_bs_rshift", + "60_hhkb", + "60_ansi_tsangan_split_bs_rshift" + ], + "layout_aliases": { + "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift" + }, + "layouts": { + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4} + ] + }, + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan_split_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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/keyten/kt60_mu/keymaps/default/keymap.c b/keyboards/keyten/kt60_mu/keymaps/default/keymap.c new file mode 100644 index 0000000000..c13c720145 --- /dev/null +++ b/keyboards/keyten/kt60_mu/keymaps/default/keymap.c @@ -0,0 +1,24 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_60_ansi_tsangan_split_bs_rshift( + 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_GRV, 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_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_60_ansi_tsangan_split_bs_rshift( + KC_TRNS, 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_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) + +}; diff --git a/keyboards/keyten/kt60_mu/mcuconf.h b/keyboards/keyten/kt60_mu/mcuconf.h new file mode 100644 index 0000000000..a3ac64bb32 --- /dev/null +++ b/keyboards/keyten/kt60_mu/mcuconf.h @@ -0,0 +1,12 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM2 +#define STM32_PWM_USE_TIM2 TRUE + +#undef STM32_ST_USE_TIMER +#define STM32_ST_USE_TIMER 3 diff --git a/keyboards/keyten/kt60_mu/readme.md b/keyboards/keyten/kt60_mu/readme.md new file mode 100644 index 0000000000..937215ad34 --- /dev/null +++ b/keyboards/keyten/kt60_mu/readme.md @@ -0,0 +1,42 @@ +# keyten kt60-MU + +PCB supporting multiple 60% keyboards. +Outline is compatible with: + +* All common O-Ring mount keyboards +* Polaris V2 (In theory. At the time of PCB design, this keyboard is in IC stage) + +Supports two Type-C connector position: + +* Standard left position +* Central position like Aksara 60 + +Supports three JST connector position like the following PCBs or keyboards: + +* hiney h60 +* Singa Unikorn +* Polaris V2 + +![kt60-MU](https://i.imgur.com/72uSWLx.jpg) + +* Keyboard Maintainer: [keyten](https://github.com/key10iq) +* Hardware Supported: keyten kt60-MU +* Hardware Availability: private GB + +Make example for this keyboard (after setting up your build environment): + + make keyten/kt60_mu:default + +Flashing example for this keyboard: + + make keyten/kt60_mu: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 +* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available +* Physical reset button: Hold the button on the back of the PCB From 8ae5d34c0db1cabe2a8de9aa5213a769b1d4ef8d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 13 Mar 2025 21:00:58 +0000 Subject: [PATCH 223/592] keyten/kt60_mu - Add missing header guard (#25011) --- keyboards/keyten/kt60_mu/config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/keyten/kt60_mu/config.h b/keyboards/keyten/kt60_mu/config.h index 7547e9ed28..aa1736d36b 100644 --- a/keyboards/keyten/kt60_mu/config.h +++ b/keyboards/keyten/kt60_mu/config.h @@ -1,6 +1,8 @@ // Copyright 2024 QMK // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #define BACKLIGHT_PWM_DRIVER PWMD2 #define BACKLIGHT_PWM_CHANNEL 4 #define BACKLIGHT_PAL_MODE 2 From 65aef7be95025a8a26fa8fe0c4af3ce0d36f47f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Cruz?= Date: Thu, 13 Mar 2025 21:04:32 +0000 Subject: [PATCH 224/592] [Keyboard] Add Sofle Choc Prog from keebart (#24974) --- keyboards/keebart/sofle_choc_pro/config.h | 10 + .../keebart/sofle_choc_pro/keyboard.json | 235 ++++++++++++++++++ .../sofle_choc_pro/keymaps/default/keymap.c | 49 ++++ .../sofle_choc_pro/keymaps/default/rules.mk | 1 + keyboards/keebart/sofle_choc_pro/readme.md | 28 +++ 5 files changed, 323 insertions(+) create mode 100644 keyboards/keebart/sofle_choc_pro/config.h create mode 100644 keyboards/keebart/sofle_choc_pro/keyboard.json create mode 100644 keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c create mode 100644 keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk create mode 100644 keyboards/keebart/sofle_choc_pro/readme.md diff --git a/keyboards/keebart/sofle_choc_pro/config.h b/keyboards/keebart/sofle_choc_pro/config.h new file mode 100644 index 0000000000..5c9b6ff8f1 --- /dev/null +++ b/keyboards/keebart/sofle_choc_pro/config.h @@ -0,0 +1,10 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define USB_VBUS_PIN GP13 + +/* RP2040- and hardware-specific config */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/keyboards/keebart/sofle_choc_pro/keyboard.json b/keyboards/keebart/sofle_choc_pro/keyboard.json new file mode 100644 index 0000000000..a1ba222388 --- /dev/null +++ b/keyboards/keebart/sofle_choc_pro/keyboard.json @@ -0,0 +1,235 @@ +{ + "manufacturer": "Keebart", + "keyboard_name": "sofle_choc_pro", + "maintainer": "Keebart", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP23", "pin_b": "GP22"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP27", "GP26", "GP25", "GP24", "GP19", "GP18"], + "rows": ["GP0", "GP1", "GP2", "GP3", "GP4"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [4, 5], "x": 99, "y": 38, "flags": 4}, + {"matrix": [4, 4], "x": 91, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 77, "y": 60, "flags": 4}, + {"matrix": [3, 5], "x": 82, "y": 45, "flags": 4}, + {"matrix": [2, 5], "x": 82, "y": 31, "flags": 4}, + {"matrix": [1, 5], "x": 82, "y": 17, "flags": 4}, + {"matrix": [0, 5], "x": 82, "y": 3, "flags": 4}, + {"matrix": [0, 4], "x": 66, "y": 2, "flags": 4}, + {"matrix": [1, 4], "x": 66, "y": 16, "flags": 4}, + {"matrix": [2, 4], "x": 66, "y": 29, "flags": 4}, + {"matrix": [3, 4], "x": 66, "y": 43, "flags": 4}, + {"matrix": [4, 2], "x": 58, "y": 59, "flags": 4}, + {"matrix": [4, 1], "x": 41, "y": 59, "flags": 4}, + {"matrix": [3, 3], "x": 49, "y": 41, "flags": 4}, + {"matrix": [2, 3], "x": 49, "y": 28, "flags": 4}, + {"matrix": [1, 3], "x": 49, "y": 16, "flags": 4}, + {"matrix": [0, 3], "x": 49, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 33, "y": 2, "flags": 4}, + {"matrix": [1, 2], "x": 33, "y": 16, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 29, "flags": 4}, + {"matrix": [3, 2], "x": 33, "y": 43, "flags": 4}, + {"matrix": [4, 0], "x": 25, "y": 60, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 47, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 33, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 19, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 5, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 5, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 19, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 33, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 47, "flags": 4}, + {"matrix": [9, 5], "x": 125, "y": 38, "flags": 4}, + {"matrix": [9, 4], "x": 134, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 147, "y": 60, "flags": 4}, + {"matrix": [8, 5], "x": 142, "y": 45, "flags": 4}, + {"matrix": [7, 5], "x": 142, "y": 31, "flags": 4}, + {"matrix": [6, 5], "x": 142, "y": 17, "flags": 4}, + {"matrix": [5, 5], "x": 142, "y": 3, "flags": 4}, + {"matrix": [5, 4], "x": 158, "y": 2, "flags": 4}, + {"matrix": [6, 4], "x": 158, "y": 16, "flags": 4}, + {"matrix": [7, 4], "x": 158, "y": 29, "flags": 4}, + {"matrix": [8, 4], "x": 158, "y": 43, "flags": 4}, + {"matrix": [9, 2], "x": 166, "y": 59, "flags": 4}, + {"matrix": [9, 1], "x": 183, "y": 59, "flags": 4}, + {"matrix": [8, 3], "x": 175, "y": 41, "flags": 4}, + {"matrix": [7, 3], "x": 175, "y": 28, "flags": 4}, + {"matrix": [6, 3], "x": 175, "y": 16, "flags": 4}, + {"matrix": [5, 3], "x": 175, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 191, "y": 2, "flags": 4}, + {"matrix": [6, 2], "x": 191, "y": 16, "flags": 4}, + {"matrix": [7, 2], "x": 191, "y": 29, "flags": 4}, + {"matrix": [8, 2], "x": 191, "y": 43, "flags": 4}, + {"matrix": [9, 0], "x": 199, "y": 60, "flags": 4}, + {"matrix": [8, 1], "x": 208, "y": 47, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 33, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 19, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 5, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 5, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 19, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 33, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 47, "flags": 4} + ], + "max_brightness": 50, + "sleep": true, + "split_count": [30, 30] + }, + "split": { + "bootmagic": { + "matrix": [5, 0] + }, + "enabled": true, + "handedness": { + "pin": "GP21" + }, + "serial": { + "driver": "vendor", + "pin": "GP12" + }, + "transport": { + "sync": { + "indicators": true, + "layer_state": true, + "matrix_state": true + } + } + }, + "url": "https://keebart.com/products/sofle", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "suspend_wakeup_delay": 200, + "vid": "0xFEED" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP10" + }, + "layouts": { + "LAYOUT_split_4x6_5": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.375}, + {"matrix": [0, 1], "x": 1, "y": 0.375}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [5, 5], "x": 9, "y": 0.25}, + {"matrix": [5, 4], "x": 10, "y": 0.125}, + {"matrix": [5, 3], "x": 11, "y": 0}, + {"matrix": [5, 2], "x": 12, "y": 0.125}, + {"matrix": [5, 1], "x": 13, "y": 0.375}, + {"matrix": [5, 0], "x": 14, "y": 0.375}, + {"matrix": [1, 0], "x": 0, "y": 1.375}, + {"matrix": [1, 1], "x": 1, "y": 1.375}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [6, 5], "x": 9, "y": 1.25}, + {"matrix": [6, 4], "x": 10, "y": 1.125}, + {"matrix": [6, 3], "x": 11, "y": 1}, + {"matrix": [6, 2], "x": 12, "y": 1.125}, + {"matrix": [6, 1], "x": 13, "y": 1.375}, + {"matrix": [6, 0], "x": 14, "y": 1.375}, + {"matrix": [2, 0], "x": 0, "y": 2.375}, + {"matrix": [2, 1], "x": 1, "y": 2.375}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.25}, + {"matrix": [7, 5], "x": 9, "y": 2.25}, + {"matrix": [7, 4], "x": 10, "y": 2.125}, + {"matrix": [7, 3], "x": 11, "y": 2}, + {"matrix": [7, 2], "x": 12, "y": 2.125}, + {"matrix": [7, 1], "x": 13, "y": 2.375}, + {"matrix": [7, 0], "x": 14, "y": 2.375}, + {"matrix": [3, 0], "x": 0, "y": 3.375}, + {"matrix": [3, 1], "x": 1, "y": 3.375}, + {"matrix": [3, 2], "x": 2, "y": 3.125}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3.125}, + {"matrix": [3, 5], "x": 5, "y": 3.25}, + {"matrix": [4, 5], "x": 6, "y": 2.75}, + {"matrix": [9, 5], "x": 8, "y": 2.75}, + {"matrix": [8, 5], "x": 9, "y": 3.25}, + {"matrix": [8, 4], "x": 10, "y": 3.125}, + {"matrix": [8, 3], "x": 11, "y": 3}, + {"matrix": [8, 2], "x": 12, "y": 3.125}, + {"matrix": [8, 1], "x": 13, "y": 3.375}, + {"matrix": [8, 0], "x": 14, "y": 3.375}, + {"matrix": [4, 0], "x": 1.5, "y": 4.375}, + {"matrix": [4, 1], "x": 2.5, "y": 4.25}, + {"matrix": [4, 2], "x": 3.5, "y": 4.25}, + {"matrix": [4, 3], "x": 4.5, "y": 4.375}, + {"matrix": [4, 4], "x": 6, "y": 4.375, "h": 1.5}, + {"matrix": [9, 4], "x": 8, "y": 4.375, "h": 1.5}, + {"matrix": [9, 3], "x": 9.5, "y": 4.375}, + {"matrix": [9, 2], "x": 10.5, "y": 4.25}, + {"matrix": [9, 1], "x": 11.5, "y": 4.25}, + {"matrix": [9, 0], "x": 12.5, "y": 4.375} + ] + } + } +} diff --git a/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c b/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c new file mode 100644 index 0000000000..c6f33d9c56 --- /dev/null +++ b/keyboards/keebart/sofle_choc_pro/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + BASE, // default layer + MDIA, // media keys +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bspc | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | CAPS | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| Mute | | Pause |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LCTL | LALT | LCMD | LGUI | /Enter / \Space \ | RGUI | DEL | RALT | RCTL | + * | | | | LT1 |/ / \ \ | LT1 | | | | + * `----------------------------------' '------''---------------------------' + */ + +[BASE] = LAYOUT_split_4x6_5( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_MPLY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LALT, KC_LCMD, LT(MDIA,KC_LGUI), KC_ENT, KC_SPC, LT(MDIA,KC_RGUI), KC_DEL, KC_RALT, KC_RCTL +), +[MDIA] = LAYOUT_split_4x6_5( + KC_MUTE,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______, + RM_TOGG,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______, + RM_NEXT,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______, + RM_HUEU,_______,_______,_______,_______,_______, _______, _______, _______,_______,_______,_______,_______,_______, + _______,_______,_______,_______, _______, _______, _______,_______,_______,_______ +) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) }, + [MDIA] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) } +}; +#endif diff --git a/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk b/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/keebart/sofle_choc_pro/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/keebart/sofle_choc_pro/readme.md b/keyboards/keebart/sofle_choc_pro/readme.md new file mode 100644 index 0000000000..8f0e797be0 --- /dev/null +++ b/keyboards/keebart/sofle_choc_pro/readme.md @@ -0,0 +1,28 @@ +# Sofle Choc Pro + +![sofle_choc_pro](https://i.imgur.com/q9A2HMe.jpeg) + +A complete remake of the Sofle Choc Keyboard by Josef Adamčík. Featuring an onboard RP2040 with 128 MB flash +memory and choc-spaced keys for a more compact keyboard. + +- Keyboard Maintainer: [Keebart](https://github.com/Keebart) +- Hardware Supported: RP2040 +- Hardware Availability: [Keebart Shop](https://keebart.com/products/sofle) + +Make example for this keyboard (after setting up your build environment): + + make keebart/sofle_choc_pro:default + +Flashing example for this keyboard: + + make keebart/sofle_choc_pro: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 top left key of the left side of the keyboard while connecting the left side to the computer. Similarly, hold down the top right key of the right side of the keyboard while connecting the right side to the computer. +- **Physical reset button**: Briefly press the button on the back of the PCB +- **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From c6446aeaf9b234a492d3320524df95da69a83255 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 16 Mar 2025 08:44:31 +0000 Subject: [PATCH 225/592] Bump tj-actions/changed-files from 45 to 46 (#25020) --- .github/workflows/format.yml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index b4e32f981b..309b9eeda1 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -36,7 +36,7 @@ jobs: - name: Get changed files id: file_changes - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: use_rest_api: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 829ca6392c..581fe02156 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -27,7 +27,7 @@ jobs: - name: Get changed files id: file_changes - uses: tj-actions/changed-files@v45 + uses: tj-actions/changed-files@v46 with: use_rest_api: true From 95223aa8721ee7abdb23550362810a37bd7a8871 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 18 Mar 2025 06:07:24 +1100 Subject: [PATCH 226/592] Latest batch of license violations as per #24085. (#25023) * Latest batch of license violations as per #24085. * No links. --- docs/license_violations.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/license_violations.md b/docs/license_violations.md index 81a6ba517f..98cf0e9499 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -19,9 +19,13 @@ If you own a board from one of the following vendors already, consider asking th | Vendor | Reason | |------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Ajazz | Selling tri-mode boards based on QMK without sources. | +| Alpaca / Apos | Selling wireless boards with "open" source code, but linking against closed-source wireless libraries. Crippled source code already unknowingly merged to QMK. | +| Attack Shark | Selling tri-mode boards based on QMK without sources. (Clones of Ajazz?) | | BBB Keyboard | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. | | CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | +| ColorReco | Selling tri-mode boards based on QMK without sources. | | Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | | Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | | Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. | @@ -36,6 +40,7 @@ If you own a board from one of the following vendors already, consider asking th | pressplayid | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided | | qwertykeys | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | | Redragon | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | +| Riccks | Selling tri-mode boards based on QMK without sources. | | Royal Kludge | PRs for fake boards in order to attain VIA compatibility identified. Lots of other keyboards with `via.json` but no corresponding sources, attempted upstreaming crippled firmware without wireless. Wireless code for some provided, pending core cleanup for QMK upstreaming. PRs including different manufacturer names as well. | | Shenzhen Hangsheng | PR submissions with crippled firmware, debating with maintainers about wireless despite marketing material clearly stating tri-mode. | | Tacworks | Selling tri-mode boards based on QMK, crippled firmware already merged into QMK without wireless without QMK team realising. | From 271efeb8bc99922e6ce1a664f82bc922cd2e8121 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 19 Mar 2025 02:48:27 +1100 Subject: [PATCH 227/592] Latest batch of license violations. (#25031) --- docs/license_violations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/license_violations.md b/docs/license_violations.md index 98cf0e9499..cf7850effc 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -50,6 +50,7 @@ If you own a board from one of the following vendors already, consider asking th | Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | | XVX | Ambiguity on PRs -- marketing says wireless, PR author said wired-only. Seemingly intentionally deceptive. | +| Yunzii | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | | Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | ::: danger Violations From 386a5019a8147136c2732452cd87954378e0ec16 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 19 Mar 2025 12:45:28 +1100 Subject: [PATCH 228/592] Fixup MSYS + unix-style paths in Community Modules. (#25012) Fixup MSYS + unix-style paths. --- lib/python/qmk/cli/generate/rules_mk.py | 4 ++-- lib/python/qmk/path.py | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index cae9b07c3e..ef4101d77f 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -10,7 +10,7 @@ from qmk.info import info_json, get_modules from qmk.json_schema import json_load from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines, parse_configurator_json -from qmk.path import normpath, FileType +from qmk.path import normpath, unix_style_path, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE from qmk.community_modules import find_module_path, load_module_jsons @@ -63,7 +63,7 @@ def generate_modules_rules(keyboard, filename): lines.append('') lines.append('OPT_DEFS += -DCOMMUNITY_MODULES_ENABLE=TRUE') for module in modules: - module_path = find_module_path(module) + module_path = unix_style_path(find_module_path(module)) if not module_path: raise FileNotFoundError(f"Module '{module}' not found.") lines.append('') diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py index 61daad585f..c47ed18362 100644 --- a/lib/python/qmk/path.py +++ b/lib/python/qmk/path.py @@ -3,7 +3,7 @@ import logging import os import argparse -from pathlib import Path +from pathlib import Path, PureWindowsPath, PurePosixPath from qmk.constants import MAX_KEYBOARD_SUBFOLDERS, QMK_FIRMWARE, QMK_USERSPACE, HAS_QMK_USERSPACE from qmk.errors import NoSuchKeyboardError @@ -146,6 +146,28 @@ def normpath(path): return Path(os.environ['ORIG_CWD']) / path +def unix_style_path(path): + """Converts a Windows-style path with drive letter to a Unix path. + + Path().as_posix() normally returns the path with drive letter and forward slashes, so is inappropriate for `Makefile` paths. + + Passes through unadulterated if the path is not a Windows-style path. + + Args: + + path + The path to convert. + + Returns: + The input path converted to Unix format. + """ + if isinstance(path, PureWindowsPath): + p = list(path.parts) + p[0] = f'/{p[0][0].lower()}' # convert from `X:/` to `/x` + path = PurePosixPath(*p) + return path + + class FileType(argparse.FileType): def __init__(self, *args, **kwargs): # Use UTF8 by default for stdin From 46829663aa976fa730c70083114b5d7933fe42b4 Mon Sep 17 00:00:00 2001 From: Wilson Pika Choo Date: Thu, 20 Mar 2025 01:33:53 +0900 Subject: [PATCH 229/592] [Keyboard] Change uzu42 `usb.vid` (#25014) change generic vendor code --- keyboards/uzu42/rev1/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/uzu42/rev1/keyboard.json b/keyboards/uzu42/rev1/keyboard.json index f96327daea..6f4f080e67 100644 --- a/keyboards/uzu42/rev1/keyboard.json +++ b/keyboards/uzu42/rev1/keyboard.json @@ -4,7 +4,7 @@ "url": "https://github.com/nrtkbb/Keyboards/tree/master/uzu42", "maintainer": "nrtkbb", "usb": { - "vid": "0xFEED", + "vid": "0x6E74", "pid": "0x3060", "device_version": "0.0.1" }, From 3484f0a0dffd264ae3bef70ce2a8961489c16f50 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Wed, 19 Mar 2025 12:45:56 -0700 Subject: [PATCH 230/592] [Core] get_keycode_string(): function to format keycodes as strings, for more readable debug logging. (#24787) * keycode_string(): Format keycodes as strings. This adds the `keycode_string()` function described in https://getreuer.info/posts/keyboards/keycode-string/index.html as a core feature. * Fix formatting. * keycode_string review revisions. * Rename keycode_string() -> get_keycode_string() for consistency with existing string utils like get_u8_str(). * Revise custom keycode names with separate _user and _kb tables. * Correct indent in builddefs/generic_features.mk. Co-authored-by: Ryan * Add KC_NUHS, KC_NUBS, and KC_CAPS. * Fix linking error with custom names. * Attempt at simplifying interface. * Formatting fix. * Several fixes and revisions. * Don't use PSTR in KEYCODE_STRING_NAME, since this fails to build on AVR. Store custom names in RAM. * Revise the internal table of common keycode names to use its own storage representation, still in PROGMEM, and now more efficiently stored flat in 8 bytes per entry. * Support Swap Hands keycodes and a few other keycodes. * Revert "Formatting fix." This reverts commit 2a2771068c7ee545ffac4103aa07e847a9ec3816. * Revert "Attempt at simplifying interface." This reverts commit 8eaf67de76e75bc92d106a8b0decc893fbc65fa5. * Simplify custom names API by sigprof's suggestion. * Support more keycodes. * Add QK_LOCK keycode. * Add Secure keycodes. * Add Joystick keycodes. * Add Programmable Button keycodes. * Add macro MC_ keycodes. * For remaining keys in known code ranges, stringify them as "QK_+". For instance, "QK_MIDI+7". * Bug fix and a few improvements. * Fix missing right-hand bit when displaying 5-bit mods numerically. * Support KC_HYPR, KC_MEH, HYPR_T(kc), MEH_T(kc). * Exclude one-shot keycodes when NO_ACTION_ONESHOT is defined. --------- Co-authored-by: Ryan --- builddefs/generic_features.mk | 1 + docs/faq_debug.md | 11 + docs/unit_testing.md | 28 + quantum/keycode_string.c | 564 +++++++++++++++++++ quantum/keycode_string.h | 134 +++++ quantum/quantum.h | 1 + tests/keycode_string/config.h | 19 + tests/keycode_string/test.mk | 22 + tests/keycode_string/test_keycode_string.cpp | 153 +++++ 9 files changed, 933 insertions(+) create mode 100644 quantum/keycode_string.c create mode 100644 quantum/keycode_string.h create mode 100644 tests/keycode_string/config.h create mode 100644 tests/keycode_string/test.mk create mode 100644 tests/keycode_string/test_keycode_string.cpp diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk index f14f440877..015a804d91 100644 --- a/builddefs/generic_features.mk +++ b/builddefs/generic_features.mk @@ -34,6 +34,7 @@ GENERIC_FEATURES = \ DYNAMIC_TAPPING_TERM \ GRAVE_ESC \ HAPTIC \ + KEYCODE_STRING \ KEY_LOCK \ KEY_OVERRIDE \ LAYER_LOCK \ diff --git a/docs/faq_debug.md b/docs/faq_debug.md index 35a4160e27..269049afb8 100644 --- a/docs/faq_debug.md +++ b/docs/faq_debug.md @@ -77,6 +77,17 @@ KL: kc: 172, col: 2, row: 0, pressed: 1, time: 16303, int: 0, count: 0 KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0 ``` +### Which keycode is this keypress? + +Keycodes are logged in the example above as numerical codes, which may be difficult to interpret. For more readable logging, add `KEYCODE_STRING_ENABLE = yes` in your `rules.mk` and use `get_keycode_string(kc)`. For example: + +```c +uprintf("kc: %s\n", get_keycode_string(keycode)); +``` + +This logs the keycode as a human-readable string like "`LT(2,KC_D)`" rather than a numerical code like "`0x4207`." See the [Keycode String](unit_testing#keycode-string) section of the Unit Testing page for more information. + + ### How long did it take to scan for a keypress? When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h` diff --git a/docs/unit_testing.md b/docs/unit_testing.md index 3e4c914bf1..aec4ec8334 100644 --- a/docs/unit_testing.md +++ b/docs/unit_testing.md @@ -58,6 +58,34 @@ It's not yet possible to do a full integration test, where you would compile the In that model you would emulate the input, and expect a certain output from the emulated keyboard. +# Keycode String {#keycode-string} + +It's much nicer to read keycodes as names like "`LT(2,KC_D)`" than numerical codes like "`0x4207`." To convert keycodes to human-readable strings, add `KEYCODE_STRING_ENABLE = yes` to the `rules.mk` file, then use the `get_keycode_string(kc)` function to convert a given 16-bit keycode to a string. + +```c +const char *key_name = get_keycode_string(keycode); +dprintf("kc: %s\n", key_name); +``` + +The stringified keycode may then be logged to console output with `dprintf()` or elsewhere. + +::: warning +Use the result of `get_keycode_string()` immediately. Subsequent invocations reuse the same static buffer and overwrite the previous contents. +::: + +Many common QMK keycodes are recognized by `get_keycode_string()`, but not all. These include some common basic keycodes, layer switch keycodes, mod-taps, one-shot keycodes, tap dance keycodes, and Unicode keycodes. As a fallback, an unrecognized keycode is written as a hex number. + +Optionally, `KEYCODE_STRING_NAMES_USER` may be defined to add names for additional keycodes. For example, supposing keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes, the following adds their names: + +```c +KEYCODE_STRING_NAMES_USER( + KEYCODE_STRING_NAME(MYMACRO1), + KEYCODE_STRING_NAME(MYMACRO2), +); +``` + +Similarly, `KEYCODE_STRING_NAMES_KB` may be defined to add names at the keyboard level. + # Tracing Variables {#tracing-variables} Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption. diff --git a/quantum/keycode_string.c b/quantum/keycode_string.c new file mode 100644 index 0000000000..18044f2ef6 --- /dev/null +++ b/quantum/keycode_string.c @@ -0,0 +1,564 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keycode_string.h" + +#include +#include "bitwise.h" +#include "keycode.h" +#include "progmem.h" +#include "quantum_keycodes.h" +#include "util.h" + +typedef int_fast8_t index_t; + +// clang-format off +/** Packs a 7-char keycode name, ignoring the third char, as 3 words. */ +#define KEYCODE_NAME7(c0, c1, unused_c2, c3, c4, c5, c6) \ + ((uint16_t)c0) | (((uint16_t)c1) << 8), \ + ((uint16_t)c3) | (((uint16_t)c4) << 8), \ + ((uint16_t)c5) | (((uint16_t)c6) << 8) + +/** + * @brief Names of some common keycodes. + * + * Each (keycode, name) entry is stored flat in 8 bytes in PROGMEM. Names in + * this table must be at most 7 chars long and have an underscore '_' for the + * third char. This underscore is assumed and not actually stored. + * + * To save memory, feature-specific key entries are ifdef'd to include them only + * when their feature is enabled. + */ +static const uint16_t common_names[] PROGMEM = { + KC_TRNS, KEYCODE_NAME7('K', 'C', '_', 'T', 'R', 'N', 'S'), + KC_ENT , KEYCODE_NAME7('K', 'C', '_', 'E', 'N', 'T', 0 ), + KC_ESC , KEYCODE_NAME7('K', 'C', '_', 'E', 'S', 'C', 0 ), + KC_BSPC, KEYCODE_NAME7('K', 'C', '_', 'B', 'S', 'P', 'C'), + KC_TAB , KEYCODE_NAME7('K', 'C', '_', 'T', 'A', 'B', 0 ), + KC_SPC , KEYCODE_NAME7('K', 'C', '_', 'S', 'P', 'C', 0 ), + KC_MINS, KEYCODE_NAME7('K', 'C', '_', 'M', 'I', 'N', 'S'), + KC_EQL , KEYCODE_NAME7('K', 'C', '_', 'E', 'Q', 'L', 0 ), + KC_LBRC, KEYCODE_NAME7('K', 'C', '_', 'L', 'B', 'R', 'C'), + KC_RBRC, KEYCODE_NAME7('K', 'C', '_', 'R', 'B', 'R', 'C'), + KC_BSLS, KEYCODE_NAME7('K', 'C', '_', 'B', 'S', 'L', 'S'), + KC_NUHS, KEYCODE_NAME7('K', 'C', '_', 'N', 'U', 'H', 'S'), + KC_SCLN, KEYCODE_NAME7('K', 'C', '_', 'S', 'C', 'L', 'N'), + KC_QUOT, KEYCODE_NAME7('K', 'C', '_', 'Q', 'U', 'O', 'T'), + KC_GRV , KEYCODE_NAME7('K', 'C', '_', 'G', 'R', 'V', 0 ), + KC_COMM, KEYCODE_NAME7('K', 'C', '_', 'C', 'O', 'M', 'M'), + KC_DOT , KEYCODE_NAME7('K', 'C', '_', 'D', 'O', 'T', 0 ), + KC_SLSH, KEYCODE_NAME7('K', 'C', '_', 'S', 'L', 'S', 'H'), + KC_CAPS, KEYCODE_NAME7('K', 'C', '_', 'C', 'A', 'P', 'S'), + KC_PSCR, KEYCODE_NAME7('K', 'C', '_', 'P', 'S', 'C', 'R'), + KC_PAUS, KEYCODE_NAME7('K', 'C', '_', 'P', 'A', 'U', 'S'), + KC_INS , KEYCODE_NAME7('K', 'C', '_', 'I', 'N', 'S', 0 ), + KC_HOME, KEYCODE_NAME7('K', 'C', '_', 'H', 'O', 'M', 'E'), + KC_PGUP, KEYCODE_NAME7('K', 'C', '_', 'P', 'G', 'U', 'P'), + KC_DEL , KEYCODE_NAME7('K', 'C', '_', 'D', 'E', 'L', 0 ), + KC_END , KEYCODE_NAME7('K', 'C', '_', 'E', 'N', 'D', 0 ), + KC_PGDN, KEYCODE_NAME7('K', 'C', '_', 'P', 'G', 'D', 'N'), + KC_RGHT, KEYCODE_NAME7('K', 'C', '_', 'R', 'G', 'H', 'T'), + KC_LEFT, KEYCODE_NAME7('K', 'C', '_', 'L', 'E', 'F', 'T'), + KC_DOWN, KEYCODE_NAME7('K', 'C', '_', 'D', 'O', 'W', 'N'), + KC_UP , KEYCODE_NAME7('K', 'C', '_', 'U', 'P', 0 , 0 ), + KC_NUBS, KEYCODE_NAME7('K', 'C', '_', 'N', 'U', 'B', 'S'), + KC_HYPR, KEYCODE_NAME7('K', 'C', '_', 'H', 'Y', 'P', 'R'), + KC_MEH , KEYCODE_NAME7('K', 'C', '_', 'M', 'E', 'H', 0 ), +#ifdef EXTRAKEY_ENABLE + KC_WHOM, KEYCODE_NAME7('K', 'C', '_', 'W', 'H', 'O', 'M'), + KC_WBAK, KEYCODE_NAME7('K', 'C', '_', 'W', 'B', 'A', 'K'), + KC_WFWD, KEYCODE_NAME7('K', 'C', '_', 'W', 'F', 'W', 'D'), + KC_WSTP, KEYCODE_NAME7('K', 'C', '_', 'W', 'S', 'T', 'P'), + KC_WREF, KEYCODE_NAME7('K', 'C', '_', 'W', 'R', 'E', 'F'), + KC_MNXT, KEYCODE_NAME7('K', 'C', '_', 'M', 'N', 'X', 'T'), + KC_MPRV, KEYCODE_NAME7('K', 'C', '_', 'M', 'P', 'R', 'V'), + KC_MPLY, KEYCODE_NAME7('K', 'C', '_', 'M', 'P', 'L', 'Y'), + KC_MUTE, KEYCODE_NAME7('K', 'C', '_', 'M', 'U', 'T', 'E'), + KC_VOLU, KEYCODE_NAME7('K', 'C', '_', 'V', 'O', 'L', 'U'), + KC_VOLD, KEYCODE_NAME7('K', 'C', '_', 'V', 'O', 'L', 'D'), +#endif // EXTRAKEY_ENABLE +#ifdef MOUSEKEY_ENABLE + MS_LEFT, KEYCODE_NAME7('M', 'S', '_', 'L', 'E', 'F', 'T'), + MS_RGHT, KEYCODE_NAME7('M', 'S', '_', 'R', 'G', 'H', 'T'), + MS_UP , KEYCODE_NAME7('M', 'S', '_', 'U', 'P', 0 , 0 ), + MS_DOWN, KEYCODE_NAME7('M', 'S', '_', 'D', 'O', 'W', 'N'), + MS_WHLL, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'L'), + MS_WHLR, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'R'), + MS_WHLU, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'U'), + MS_WHLD, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'D'), +#endif // MOUSEKEY_ENABLE +#ifdef SWAP_HANDS_ENABLE + SH_ON , KEYCODE_NAME7('S', 'H', '_', 'O', 'N', 0 , 0 ), + SH_OFF , KEYCODE_NAME7('S', 'H', '_', 'O', 'F', 'F', 0 ), + SH_MON , KEYCODE_NAME7('S', 'H', '_', 'M', 'O', 'N', 0 ), + SH_MOFF, KEYCODE_NAME7('S', 'H', '_', 'M', 'O', 'F', 'F'), + SH_TOGG, KEYCODE_NAME7('S', 'H', '_', 'T', 'O', 'G', 'G'), + SH_TT , KEYCODE_NAME7('S', 'H', '_', 'T', 'T', 0 , 0 ), +# if !defined(NO_ACTION_ONESHOT) + SH_OS , KEYCODE_NAME7('S', 'H', '_', 'O', 'S', 0 , 0 ), +# endif // !defined(NO_ACTION_ONESHOT) +#endif // SWAP_HANDS_ENABLE +#ifdef LEADER_ENABLE + QK_LEAD, KEYCODE_NAME7('Q', 'K', '_', 'L', 'E', 'A', 'D'), +#endif // LEADER_ENABLE +#ifdef KEY_LOCK_ENABLE + QK_LOCK, KEYCODE_NAME7('Q', 'K', '_', 'L', 'O', 'C', 'K'), +#endif // KEY_LOCK_ENABLE +#ifdef TRI_LAYER_ENABLE + TL_LOWR, KEYCODE_NAME7('T', 'L', '_', 'L', 'O', 'W', 'R'), + TL_UPPR, KEYCODE_NAME7('T', 'L', '_', 'U', 'P', 'P', 'R'), +#endif // TRI_LAYER_ENABLE +#ifdef GRAVE_ESC_ENABLE + QK_GESC, KEYCODE_NAME7('Q', 'K', '_', 'G', 'E', 'S', 'C'), +#endif // GRAVE_ESC_ENABLE +#ifdef CAPS_WORD_ENABLE + CW_TOGG, KEYCODE_NAME7('C', 'W', '_', 'T', 'O', 'G', 'G'), +#endif // CAPS_WORD_ENABLE +#ifdef SECURE_ENABLE + SE_LOCK, KEYCODE_NAME7('S', 'E', '_', 'L', 'O', 'C', 'K'), + SE_UNLK, KEYCODE_NAME7('S', 'E', '_', 'U', 'N', 'L', 'K'), + SE_TOGG, KEYCODE_NAME7('S', 'E', '_', 'T', 'O', 'G', 'G'), + SE_REQ , KEYCODE_NAME7('S', 'E', '_', 'R', 'E', 'Q', 0 ), +#endif // SECURE_ENABLE +#ifdef LAYER_LOCK_ENABLE + QK_LLCK, KEYCODE_NAME7('Q', 'K', '_', 'L', 'L', 'C', 'K'), +#endif // LAYER_LOCK_ENABLE + EE_CLR , KEYCODE_NAME7('E', 'E', '_', 'C', 'L', 'R', 0 ), + QK_BOOT, KEYCODE_NAME7('Q', 'K', '_', 'B', 'O', 'O', 'T'), + DB_TOGG, KEYCODE_NAME7('D', 'B', '_', 'T', 'O', 'G', 'G'), +}; +// clang-format on + +/** Users can override this to define names of additional keycodes. */ +__attribute__((weak)) const keycode_string_name_t* keycode_string_names_data_user = NULL; +__attribute__((weak)) uint16_t keycode_string_names_size_user = 0; +/** Keyboard vendors can override this to define names of additional keycodes. */ +__attribute__((weak)) const keycode_string_name_t* keycode_string_names_data_kb = NULL; +__attribute__((weak)) uint16_t keycode_string_names_size_kb = 0; +/** Names of the 4 mods on each hand. */ +static const char mod_names[] PROGMEM = "CTL\0SFT\0ALT\0GUI"; +/** Internal buffer for holding a stringified keycode. */ +static char buffer[32]; +#define BUFFER_MAX_LEN (sizeof(buffer) - 1) +static index_t buffer_len; + +/** Finds the name of a keycode in `common_names` or returns NULL. */ +static const char* search_common_names(uint16_t keycode) { + static uint8_t buffer[8]; + + for (int_fast16_t offset = 0; offset < ARRAY_SIZE(common_names); offset += 4) { + if (keycode == pgm_read_word(common_names + offset)) { + const uint16_t w0 = pgm_read_word(common_names + offset + 1); + const uint16_t w1 = pgm_read_word(common_names + offset + 2); + const uint16_t w2 = pgm_read_word(common_names + offset + 3); + buffer[0] = (uint8_t)w0; + buffer[1] = (uint8_t)(w0 >> 8); + buffer[2] = '_'; + buffer[3] = (uint8_t)w1; + buffer[4] = (uint8_t)(w1 >> 8); + buffer[5] = (uint8_t)w2; + buffer[6] = (uint8_t)(w2 >> 8); + buffer[7] = 0; + return (const char*)buffer; + } + } + + return NULL; +} + +/** + * @brief Finds the name of a keycode in table or returns NULL. + * + * @param data Pointer to table to be searched. + * @param size Numer of entries in the table. + * @return Name string for the keycode, or NULL if not found. + */ +static const char* search_table(const keycode_string_name_t* data, uint16_t size, uint16_t keycode) { + if (data != NULL) { + for (uint16_t i = 0; i < size; ++i) { + if (data[i].keycode == keycode) { + return data[i].name; + } + } + } + return NULL; +} + +/** Formats `number` in `base`, either 10 or 16. */ +static char* number_string(uint16_t number, int8_t base) { + static char result[7]; + result[sizeof(result) - 1] = '\0'; + index_t i = sizeof(result) - 1; + do { + const uint8_t digit = number % base; + number /= base; + result[--i] = (digit < 10) ? (char)(digit + UINT8_C('0')) : (char)(digit + (UINT8_C('A') - 10)); + } while (number > 0 && i > 0); + + if (base == 16 && i >= 2) { + result[--i] = 'x'; + result[--i] = '0'; + } + return result + i; +} + +/** Appends `str` to `buffer`, truncating if the result would overflow. */ +static void append(const char* str) { + char* dest = buffer + buffer_len; + index_t i; + for (i = 0; buffer_len + i < BUFFER_MAX_LEN && str[i]; ++i) { + dest[i] = str[i]; + } + buffer_len += i; + buffer[buffer_len] = '\0'; +} + +/** Same as append(), but where `str` is a PROGMEM string. */ +static void append_P(const char* str) { + char* dest = buffer + buffer_len; + index_t i; + for (i = 0; buffer_len + i < BUFFER_MAX_LEN; ++i) { + const char c = pgm_read_byte(&str[i]); + if (c == '\0') { + break; + } + dest[i] = c; + } + buffer_len += i; + buffer[buffer_len] = '\0'; +} + +/** Appends a single char to `buffer` if there is space. */ +static void append_char(char c) { + if (buffer_len < BUFFER_MAX_LEN) { + buffer[buffer_len] = c; + buffer[++buffer_len] = '\0'; + } +} + +/** Formats `number` in `base`, either 10 or 16, and appends it to `buffer`. */ +static void append_number(uint16_t number, int8_t base) { + append(number_string(number, base)); +} + +/** Stringifies 5-bit mods and appends it to `buffer`. */ +static void append_5_bit_mods(uint8_t mods) { + const bool is_rhs = mods > 15; + const uint8_t csag = mods & 15; + if (csag != 0 && (csag & (csag - 1)) == 0) { // One mod is set. + append_P(PSTR("MOD_")); + append_char(is_rhs ? 'R' : 'L'); + append_P(&mod_names[4 * biton(csag)]); + } else { // Fallback: write the mod as a hex value. + append_number(mods, 16); + } +} + +/** + * @brief Writes a keycode of the format `name` + "(" + `param` + ")". + * @note `name` is a PROGMEM string, `param` is not. + */ +static void append_unary_keycode(const char* name, const char* param) { + append_P(name); + append_char('('); + append(param); + append_char(')'); +} + +/** + * @brief Writes a keycode of the format `name` + `number`. + * @note `name` is a PROGMEM string. + */ +static void append_numbered_keycode(const char* name, uint16_t number) { + append_P(name); + append_number(number, 10); +} + +/** Stringifies `keycode` and appends it to `buffer`. */ +static void append_keycode(uint16_t keycode) { + // In case there is overlap among tables, search `keycode_string_names_user` + // first so that it takes precedence. + const char* keycode_name = search_table(keycode_string_names_data_user, keycode_string_names_size_user, keycode); + if (keycode_name) { + append(keycode_name); + return; + } + keycode_name = search_table(keycode_string_names_data_kb, keycode_string_names_size_kb, keycode); + if (keycode_name) { + append(keycode_name); + return; + } + keycode_name = search_common_names(keycode); + if (keycode_name) { + append(keycode_name); + return; + } + + if (keycode <= 255) { // Basic keycodes. + switch (keycode) { + // Modifiers KC_LSFT, KC_RCTL, etc. + case MODIFIER_KEYCODE_RANGE: { + const uint8_t i = keycode - KC_LCTL; + const bool is_rhs = i > 3; + append_P(PSTR("KC_")); + append_char(is_rhs ? 'R' : 'L'); + append_P(&mod_names[4 * (i & 3)]); + } + return; + + // Letters A-Z. + case KC_A ... KC_Z: + append_P(PSTR("KC_")); + append_char((char)(keycode + (UINT8_C('A') - KC_A))); + return; + + // Digits 0-9 (NOTE: Unlike the ASCII order, KC_0 comes *after* KC_9.) + case KC_1 ... KC_0: + append_numbered_keycode(PSTR("KC_"), (keycode - (KC_1 - 1)) % 10); + return; + + // Keypad digits. + case KC_KP_1 ... KC_KP_0: + append_numbered_keycode(PSTR("KC_KP_"), (keycode - (KC_KP_1 - 1)) % 10); + return; + + // Function keys. F1-F12 and F13-F24 are coded in separate ranges. + case KC_F1 ... KC_F12: + append_numbered_keycode(PSTR("KC_F"), keycode - (KC_F1 - 1)); + return; + + case KC_F13 ... KC_F24: + append_numbered_keycode(PSTR("KC_F"), keycode - (KC_F13 - 13)); + return; + } + } + + // clang-format off + switch (keycode) { + // A modified keycode, like S(KC_1) for Shift + 1 = !. This implementation + // only covers modified keycodes where one modifier is applied, e.g. a + // Ctrl + Shift + kc or Hyper + kc keycode is not formatted. + case QK_MODS ... QK_MODS_MAX: { + uint8_t mods = QK_MODS_GET_MODS(keycode); + const bool is_rhs = mods > 15; + mods &= 15; + if (mods != 0 && (mods & (mods - 1)) == 0) { // One mod is set. + const char* name = &mod_names[4 * biton(mods)]; + if (is_rhs) { + append_char('R'); + append_P(name); + } else { + append_char(pgm_read_byte(&name[0])); + } + append_char('('); + append_keycode(QK_MODS_GET_BASIC_KEYCODE(keycode)); + append_char(')'); + return; + } + } break; + +#if !defined(NO_ACTION_ONESHOT) + case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: // One-shot mod OSM(mod) key. + append_P(PSTR("OSM(")); + append_5_bit_mods(QK_ONE_SHOT_MOD_GET_MODS(keycode)); + append_char(')'); + return; +#endif // !defined(NO_ACTION_ONESHOT) + + // Various layer switch keys. + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // Layer-tap LT(layer,kc) key. + append_P(PSTR("LT(")); + append_number(QK_LAYER_TAP_GET_LAYER(keycode), 10); + append_char(','); + append_keycode(QK_LAYER_TAP_GET_TAP_KEYCODE(keycode)); + append_char(')'); + return; + + case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: // LM(layer,mod) key. + append_P(PSTR("LM(")); + append_number(QK_LAYER_MOD_GET_LAYER(keycode), 10); + append_char(','); + append_5_bit_mods(QK_LAYER_MOD_GET_MODS(keycode)); + append_char(')'); + return; + + case QK_TO ... QK_TO_MAX: // TO(layer) key. + append_unary_keycode(PSTR("TO"), number_string(QK_TO_GET_LAYER(keycode), 10)); + return; + + case QK_MOMENTARY ... QK_MOMENTARY_MAX: // MO(layer) key. + append_unary_keycode(PSTR("MO"), number_string(QK_MOMENTARY_GET_LAYER(keycode), 10)); + return; + + case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: // DF(layer) key. + append_unary_keycode(PSTR("DF"), number_string(QK_DEF_LAYER_GET_LAYER(keycode), 10)); + return; + + case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: // TG(layer) key. + append_unary_keycode(PSTR("TG"), number_string(QK_TOGGLE_LAYER_GET_LAYER(keycode), 10)); + return; + +#if !defined(NO_ACTION_ONESHOT) + case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: // OSL(layer) key. + append_unary_keycode(PSTR("OSL"), number_string(QK_ONE_SHOT_LAYER_GET_LAYER(keycode), 10)); + return; +#endif // !defined(NO_ACTION_ONESHOT) + + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: // TT(layer) key. + append_unary_keycode(PSTR("TT"), number_string(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode), 10)); + return; + + case QK_PERSISTENT_DEF_LAYER ... QK_PERSISTENT_DEF_LAYER_MAX: // PDF(layer) key. + append_unary_keycode(PSTR("PDF"), number_string(QK_PERSISTENT_DEF_LAYER_GET_LAYER(keycode), 10)); + return; + + // Mod-tap MT(mod,kc) key. This implementation formats the MT keys where + // one modifier is applied. For MT keys with multiple modifiers, the mod + // arg is written numerically as a hex code. + case QK_MOD_TAP ... QK_MOD_TAP_MAX: { + uint8_t mods = QK_MOD_TAP_GET_MODS(keycode); + const bool is_rhs = mods > 15; + const uint8_t csag = mods & 15; + if (csag != 0 && (csag & (csag - 1)) == 0) { // One mod is set. + append_char(is_rhs ? 'R' : 'L'); + append_P(&mod_names[4 * biton(csag)]); + append_P(PSTR("_T(")); + } else if (mods == MOD_HYPR) { + append_P(PSTR("HYPR_T(")); + } else if (mods == MOD_MEH) { + append_P(PSTR("MEH_T(")); + } else { + append_P(PSTR("MT(")); + append_number(mods, 16); + append_char(','); + } + append_keycode(QK_MOD_TAP_GET_TAP_KEYCODE(keycode)); + append_char(')'); + } return; + + case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: // Tap dance TD(i) key. + append_unary_keycode(PSTR("TD"), number_string(QK_TAP_DANCE_GET_INDEX(keycode), 10)); + return; + +#ifdef UNICODE_ENABLE + case QK_UNICODE ... QK_UNICODE_MAX: // Unicode UC(codepoint) key. + append_unary_keycode(PSTR("UC"), number_string(QK_UNICODE_GET_CODE_POINT(keycode), 16)); + return; +#elif defined(UNICODEMAP_ENABLE) + case QK_UNICODEMAP ... QK_UNICODEMAP_MAX: // Unicode Map UM(i) key. + append_unary_keycode(PSTR("UM"), number_string(QK_UNICODEMAP_GET_INDEX(keycode), 10)); + return; + + case QK_UNICODEMAP_PAIR ... QK_UNICODEMAP_PAIR_MAX: { // UP(i,j) key. + const uint8_t i = QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(keycode); + const uint8_t j = QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(keycode); + append_P(PSTR("UP(")); + append_number(i, 10); + append_char(','); + append_number(j, 10); + append_char(')'); + } return; +#endif +#ifdef MOUSEKEY_ENABLE + case MS_BTN1 ... MS_BTN8: // Mouse button keycode. + append_numbered_keycode(PSTR("MS_BTN"), keycode - (MS_BTN1 - 1)); + return; +#endif // MOUSEKEY_ENABLE +#ifdef SWAP_HANDS_ENABLE + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: // Swap Hands SH_T(kc) key. + if (!IS_SWAP_HANDS_KEYCODE(keycode)) { + append_P(PSTR("SH_T(")); + append_keycode(QK_SWAP_HANDS_GET_TAP_KEYCODE(keycode)); + append_char(')'); + return; + } + break; +#endif // SWAP_HANDS_ENABLE +#ifdef JOYSTICK_ENABLE + case JOYSTICK_KEYCODE_RANGE: // Joystick JS_ key. + append_numbered_keycode(PSTR("JS_"), keycode - JS_0); + return; +#endif // JOYSTICK_ENABLE +#ifdef PROGRAMMABLE_BUTTON_ENABLE + case PROGRAMMABLE_BUTTON_KEYCODE_RANGE: // Programmable button PB_ key. + append_numbered_keycode(PSTR("PB_"), keycode - (PB_1 - 1)); + return; +#endif // PROGRAMMABLE_BUTTON_ENABLE + + case MACRO_KEYCODE_RANGE: // Macro range MC_ keycode. + append_numbered_keycode(PSTR("MC_"), keycode - MC_0); + return; + + case KB_KEYCODE_RANGE: // Keyboard range keycode. + append_numbered_keycode(PSTR("QK_KB_"), keycode - QK_KB_0); + return; + + case USER_KEYCODE_RANGE: // User range keycode. + append_numbered_keycode(PSTR("QK_USER_"), keycode - QK_USER_0); + return; + + // It would take a nontrivial amount of string data to cover some + // feature-specific keycodes, such as those for MIDI and lighting. As a + // fallback while still providing some information, we stringify + // remaining keys in known code ranges as "QK_+". +#ifdef MAGIC_ENABLE + case MAGIC_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_MAGIC+"), keycode - QK_MAGIC); + return; +#endif // MAGIC_ENABLE +#ifdef MIDI_ENABLE + case MIDI_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_MIDI+"), keycode - QK_MIDI); + return; +#endif // MIDI_ENABLE +#ifdef SEQUENCER_ENABLE + case SEQUENCER_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_SEQUENCER+"), keycode - QK_SEQUENCER); + return; +#endif // SEQUENCER_ENABLE +#ifdef AUDIO_ENABLE + case AUDIO_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_AUDIO+"), keycode - QK_AUDIO); + return; +#endif // AUDIO_ENABLE +#if defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLED) || defined(RGB_MATRIX_ENABLE) // Lighting-related features. + case QK_LIGHTING ... QK_LIGHTING_MAX: + append_numbered_keycode(PSTR("QK_LIGHTING+"), keycode - QK_LIGHTING); + return; +#endif // defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLED) || defined(RGB_MATRIX_ENABLE) +#ifdef STENO_ENABLE + case STENO_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_STENO+"), keycode - QK_STENO); + return; +#endif // AUDIO_ENABLE +#ifdef BLUETOOTH_ENABLE + case CONNECTION_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_CONNECTION+"), keycode - QK_CONNECTION); + return; +#endif // BLUETOOTH_ENABLE + case QUANTUM_KEYCODE_RANGE: + append_numbered_keycode(PSTR("QK_QUANTUM+"), keycode - QK_QUANTUM); + return; + } + // clang-format on + + append_number(keycode, 16); // Fallback: write keycode as hex value. +} + +const char* get_keycode_string(uint16_t keycode) { + buffer_len = 0; + buffer[0] = '\0'; + append_keycode(keycode); + return buffer; +} diff --git a/quantum/keycode_string.h b/quantum/keycode_string.h new file mode 100644 index 0000000000..1315613a80 --- /dev/null +++ b/quantum/keycode_string.h @@ -0,0 +1,134 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#if KEYCODE_STRING_ENABLE + +/** + * @brief Formats a QMK keycode as a human-readable string. + * + * Given a keycode, like `KC_A`, this function returns a formatted string, like + * "KC_A". This is useful for debugging and diagnostics so that keys are more + * easily identified than they would be by raw numerical codes. + * + * @note The returned char* string should be used right away. The string memory + * is reused and will be overwritten by the next call to `keycode_string()`. + * + * Many common QMK keycodes are understood by this function, but not all. + * Recognized keycodes include: + * + * - Most basic keycodes, including letters `KC_A` - `KC_Z`, digits `KC_0` - + * `KC_9`, function keys `KC_F1` - `KC_F24`, and modifiers like `KC_LSFT`. + * + * - Modified basic keycodes, like `S(KC_1)` (Shift + 1 = !). + * + * - `MO`, `TO`, `TG`, `OSL`, `LM(layer,mod)`, `LT(layer,kc)` layer switches. + * + * - One-shot mod `OSM(mod)` keycodes. + * + * - Mod-tap `MT(mod, kc)` keycodes. + * + * - Tap dance keycodes `TD(i)`. + * + * - Swap hands keycodes `SH_T(kc)`, `SH_TOGG`, etc. + * + * - Joystick keycodes `JS_n`. + * + * - Programmable button keycodes `PB_n`. + * + * - Unicode `UC(codepoint)` and Unicode Map `UM(i)` and `UP(i,j)` keycodes. + * + * - Keyboard range keycodes `QK_KB_*`. + * + * - User range (SAFE_RANGE) keycodes `QK_USER_*`. + * + * Keycodes involving mods like `OSM`, `LM`, `MT` are fully supported only where + * a single mod is applied. + * + * Unrecognized keycodes are printed numerically as hex values like `0x1ABC`. + * + * Optionally, use `keycode_string_names_user` or `keycode_string_names_kb` to + * define names for additional keycodes or override how any of the above are + * formatted. + * + * @param keycode QMK keycode. + * @return Stringified keycode. + */ +const char* get_keycode_string(uint16_t keycode); + +/** Defines a human-readable name for a keycode. */ +typedef struct { + uint16_t keycode; + const char* name; +} keycode_string_name_t; + +// clang-format off +/** + * @brief Defines names for additional keycodes for `get_keycode_string()`. + * + * Define `KEYCODE_STRING_NAMES_USER` in your keymap.c to add names for + * additional keycodes to `keycode_string()`. This table may also be used to + * override how `keycode_string()` formats a keycode. For example, supposing + * keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes: + * + * KEYCODE_STRING_NAMES_USER( + * KEYCODE_STRING_NAME(MYMACRO1), + * KEYCODE_STRING_NAME(MYMACRO2), + * KEYCODE_STRING_NAME(KC_EXLM), + * ); + * + * The above defines names for `MYMACRO1` and `MYMACRO2`, and overrides + * `KC_EXLM` to format as "KC_EXLM" instead of the default "S(KC_1)". + */ +# define KEYCODE_STRING_NAMES_USER(...) \ + static const keycode_string_name_t keycode_string_names_user[] = {__VA_ARGS__}; \ + uint16_t keycode_string_names_size_user = \ + sizeof(keycode_string_names_user) / sizeof(keycode_string_name_t); \ + const keycode_string_name_t* keycode_string_names_data_user = \ + keycode_string_names_user + +/** Same as above, but defines keycode string names at the keyboard level. */ +# define KEYCODE_STRING_NAMES_KB(...) \ + static const keycode_string_name_t keycode_string_names_kb[] = {__VA_ARGS__}; \ + uint16_t keycode_string_names_size_kb = \ + sizeof(keycode_string_names_kb) / sizeof(keycode_string_name_t); \ + const keycode_string_name_t* keycode_string_names_data_kb = \ + keycode_string_names_kb + +/** Helper to define a keycode_string_name_t. */ +# define KEYCODE_STRING_NAME(kc) \ + { (kc), #kc } +// clang-format on + +extern const keycode_string_name_t* keycode_string_names_data_user; +extern uint16_t keycode_string_names_size_user; +extern const keycode_string_name_t* keycode_string_names_data_kb; +extern uint16_t keycode_string_names_size_kb; + +#else + +// When keycode_string is disabled, fall back to printing keycodes numerically +// as decimal values, using get_u16_str() from quantum.c. +# define get_keycode_string(kc) get_u16_str(kc, ' ') + +const char* get_u16_str(uint16_t curr_num, char curr_pad); + +# define KEYCODE_STRING_NAMES_USER(...) +# define KEYCODE_STRING_NAMES_KB(...) +# define KEYCODE_STRING_NAME(kc) + +#endif // KEYCODE_STRING_ENABLE diff --git a/quantum/quantum.h b/quantum/quantum.h index 59a415ead4..3a994e9a03 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -39,6 +39,7 @@ #include "keymap_common.h" #include "quantum_keycodes.h" #include "keycode_config.h" +#include "keycode_string.h" #include "action_layer.h" #include "eeconfig.h" #include "bootloader.h" diff --git a/tests/keycode_string/config.h b/tests/keycode_string/config.h new file mode 100644 index 0000000000..7fc76d7c2e --- /dev/null +++ b/tests/keycode_string/config.h @@ -0,0 +1,19 @@ +/* Copyright 2017 Fred Sundvik + * + * 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 "test_common.h" diff --git a/tests/keycode_string/test.mk b/tests/keycode_string/test.mk new file mode 100644 index 0000000000..aa255a1b6b --- /dev/null +++ b/tests/keycode_string/test.mk @@ -0,0 +1,22 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +EXTRAKEY_ENABLE = yes +KEYCODE_STRING_ENABLE = yes +KEY_LOCK_ENABLE = yes +MAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +PROGRAMMABLE_BUTTON_ENABLE = yes +SECURE_ENABLE = yes +SWAP_HANDS_ENABLE = yes diff --git a/tests/keycode_string/test_keycode_string.cpp b/tests/keycode_string/test_keycode_string.cpp new file mode 100644 index 0000000000..e1dec70e7a --- /dev/null +++ b/tests/keycode_string/test_keycode_string.cpp @@ -0,0 +1,153 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "test_common.hpp" + +enum { + MYMACRO1 = SAFE_RANGE, + MYMACRO2, +}; + +// clang-format off +extern "C" { + +KEYCODE_STRING_NAMES_KB( + KEYCODE_STRING_NAME(MYMACRO1), +); + +KEYCODE_STRING_NAMES_USER( + KEYCODE_STRING_NAME(MYMACRO2), + KEYCODE_STRING_NAME(KC_EXLM), +); + +const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}}, + {{9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}}, + {{9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}}, + {{9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, +}; + +} // extern "C" +// clang-format on + +class KeycodeStringTest : public TestFixture {}; + +TEST_F(KeycodeStringTest, get_keycode_string) { + struct TestParams { + uint16_t keycode; + std::string expected; + }; + for (const auto [keycode, expected] : std::vector({ + {KC_TRNS, "KC_TRNS"}, + {KC_ESC, "KC_ESC"}, + {KC_A, "KC_A"}, + {KC_Z, "KC_Z"}, + {KC_0, "KC_0"}, + {KC_9, "KC_9"}, + {KC_KP_0, "KC_KP_0"}, + {KC_KP_9, "KC_KP_9"}, + {KC_LBRC, "KC_LBRC"}, + {KC_NUHS, "KC_NUHS"}, + {KC_NUBS, "KC_NUBS"}, + {KC_CAPS, "KC_CAPS"}, + {DB_TOGG, "DB_TOGG"}, + {KC_LCTL, "KC_LCTL"}, + {KC_LSFT, "KC_LSFT"}, + {KC_RALT, "KC_RALT"}, + {KC_RGUI, "KC_RGUI"}, + {KC_UP, "KC_UP"}, + {KC_HYPR, "KC_HYPR"}, + {KC_MEH, "KC_MEH"}, + // F1-F24 keycodes. + {KC_F1, "KC_F1"}, + {KC_F12, "KC_F12"}, + {KC_F13, "KC_F13"}, + {KC_F24, "KC_F24"}, + // Macro keycodes. + {MC_0, "MC_0"}, + {MC_31, "MC_31"}, + // Keyboard range keycodes. + {QK_KB_0, "QK_KB_0"}, + {QK_KB_31, "QK_KB_31"}, + // User range keycodes. + {QK_USER_2, "QK_USER_2"}, + {QK_USER_31, "QK_USER_31"}, + // Modified keycodes. + {KC_COLN, "S(KC_SCLN)"}, + {C(KC_PGUP), "C(KC_PGUP)"}, + {RALT(KC_BSPC), "RALT(KC_BSPC)"}, + // One-shot mods. + {OSM(MOD_LSFT), "OSM(MOD_LSFT)"}, + {OSM(MOD_RGUI), "OSM(MOD_RGUI)"}, + {OSM(MOD_RCTL | MOD_RGUI), "OSM(0x19)"}, + // Layer switch keycodes. + {DF(2), "DF(2)"}, + {PDF(12), "PDF(12)"}, + {MO(3), "MO(3)"}, + {TO(0), "TO(0)"}, + {TT(1), "TT(1)"}, + {TG(3), "TG(3)"}, + {OSL(3), "OSL(3)"}, + {LM(3, MOD_RALT), "LM(3,MOD_RALT)"}, + {LT(15, KC_QUOT), "LT(15,KC_QUOT)"}, + // Tap dance keycodes. + {TD(0), "TD(0)"}, + {TD(31), "TD(31)"}, + // Mod-tap keycodes. + {LSFT_T(KC_ENT), "LSFT_T(KC_ENT)"}, + {RCTL_T(KC_RGHT), "RCTL_T(KC_RGHT)"}, + {HYPR_T(KC_GRV), "HYPR_T(KC_GRV)"}, + {MEH_T(KC_EQL), "MEH_T(KC_EQL)"}, + {RSA_T(KC_LBRC), "MT(0x16,KC_LBRC)"}, + // Extrakey keycodes. + {KC_WBAK, "KC_WBAK"}, + {KC_WFWD, "KC_WFWD"}, + {KC_WREF, "KC_WREF"}, + {KC_VOLU, "KC_VOLU"}, + {KC_VOLD, "KC_VOLD"}, + // Mouse Key keycodes. + {MS_LEFT, "MS_LEFT"}, + {MS_RGHT, "MS_RGHT"}, + {MS_UP, "MS_UP"}, + {MS_WHLU, "MS_WHLU"}, + {MS_WHLD, "MS_WHLD"}, + {MS_BTN1, "MS_BTN1"}, + {MS_BTN8, "MS_BTN8"}, + // Swap Hands keycodes. + {SH_MON, "SH_MON"}, + {SH_TOGG, "SH_TOGG"}, + {SH_T(KC_PSCR), "SH_T(KC_PSCR)"}, + // Secure keycodes. + {SE_LOCK, "SE_LOCK"}, + {SE_UNLK, "SE_UNLK"}, + {SE_TOGG, "SE_TOGG"}, + {SE_REQ, "SE_REQ"}, + // Programmable button keycodes. + {PB_1, "PB_1"}, + {PB_32, "PB_32"}, + // Magic button keycodes. + {QK_MAGIC + 7, "QK_MAGIC+7"}, + // Quantum keycodes. + {QK_LOCK, "QK_LOCK"}, + {QK_QUANTUM + 7, "QK_QUANTUM+7"}, + // Custom keycode names. + {MYMACRO1, "MYMACRO1"}, + {MYMACRO2, "MYMACRO2"}, + {KC_EXLM, "KC_EXLM"}, + })) { + EXPECT_EQ(get_keycode_string(keycode), expected) << "where keycode = 0x" << std::hex << keycode; + } +} From f820a186d489911b7da3907163c319385176f6d9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 20 Mar 2025 03:04:10 +0000 Subject: [PATCH 231/592] Align to latest CLI dependencies (#24553) * Align to latest CLI dependencies * Update docs --- docs/cli.md | 4 ++-- docs/cli_development.md | 6 +++--- docs/coding_conventions_python.md | 4 ++-- lib/python/qmk/cli/__init__.py | 2 +- requirements.txt | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 7d4c10cedd..36983d5e00 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar ### Requirements {#requirements} -QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI. +QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI. ### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew} @@ -20,7 +20,7 @@ qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build ### Install Using pip {#install-using-easy_install-or-pip} -If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command: +If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command: ``` python3 -m pip install qmk diff --git a/docs/cli_development.md b/docs/cli_development.md index 2e74220d4b..74ac53d327 100644 --- a/docs/cli_development.md +++ b/docs/cli_development.md @@ -44,7 +44,7 @@ def hello(cli): First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function. -Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator. +Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator. # User Interaction @@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below. -Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example. +Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.9/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example. You should never use the format operator (`%`) directly, always pass values as arguments. ### Logging (`cli.log`) -The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong. +The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong. The default log level is `INFO`. If the user runs `qmk -v ` the default log level will be set to `DEBUG`. diff --git a/docs/coding_conventions_python.md b/docs/coding_conventions_python.md index 502ee9102e..b25466bf82 100644 --- a/docs/coding_conventions_python.md +++ b/docs/coding_conventions_python.md @@ -2,7 +2,7 @@ Most of our style follows PEP8 with some local modifications to make things less nit-picky. -* We target Python 3.7 for compatibility with all supported platforms. +* We target Python 3.9 for compatibility with all supported platforms. * We indent using four (4) spaces (soft tabs) * We encourage liberal use of comments * Think of them as a story describing the feature @@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the ## Integration Tests -Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened. +Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.9/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened. ## Unit Tests diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 3f2ba9ce3c..cb949d9a71 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -215,7 +215,7 @@ if sys.version_info[0] != 3 or sys.version_info[1] < 9: milc_version = __VERSION__.split('.') -if int(milc_version[0]) < 2 and int(milc_version[1]) < 4: +if int(milc_version[0]) < 2 and int(milc_version[1]) < 9: requirements = Path('requirements.txt').resolve() _eprint(f'Your MILC library is too old! Please upgrade: python3 -m pip install -U -r {str(requirements)}') diff --git a/requirements.txt b/requirements.txt index fbee51ee57..68b05d64e6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ dotty-dict hid hjson jsonschema>=4 -milc>=1.4.2 +milc>=1.9.0 pygments pyserial pyusb From e7c5695a0c09d9d673b2185548cae43a38026085 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Thu, 20 Mar 2025 01:06:54 -0400 Subject: [PATCH 232/592] Minor keymap fix on Cerberus HS (#25043) --- .../cannonkeys/cerberus/hotswap/keymaps/default/keymap.c | 4 ++-- .../cannonkeys/cerberus/solderable/keymaps/default/keymap.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c b/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c index 865dbff400..779070197a 100644 --- a/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c +++ b/keyboards/cannonkeys/cerberus/hotswap/keymaps/default/keymap.c @@ -12,8 +12,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_GRV, KC_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LSFT, MO(1), KC_UP, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(1), KC_LGUI, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT + 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_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [_FN1] = LAYOUT_all( diff --git a/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c b/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c index 2b87af0e99..782e9a138f 100644 --- a/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c +++ b/keyboards/cannonkeys/cerberus/solderable/keymaps/default/keymap.c @@ -11,8 +11,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_GRV, KC_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(1), KC_UP, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(1), KC_LGUI, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT + 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, MO(1), KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), [_FN1] = LAYOUT_all( From c5232ba6996f89b62a53496e95271cb9052c50ee Mon Sep 17 00:00:00 2001 From: Anthony Abruzzini Date: Thu, 20 Mar 2025 14:35:58 -0700 Subject: [PATCH 233/592] Fix typo in docs: split_keyboard.md SPLIT_USB_DETECT ("theres's -> "there's") (#24984) * Fix typo "theres's" * Update docs/features/split_keyboard.md Co-authored-by: jack --------- Co-authored-by: jack --- docs/features/split_keyboard.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/split_keyboard.md b/docs/features/split_keyboard.md index 49582c3946..fbf5d3d3e2 100644 --- a/docs/features/split_keyboard.md +++ b/docs/features/split_keyboard.md @@ -444,7 +444,7 @@ This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable #define SPLIT_USB_DETECT ``` -Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and theres's USB communication, then that half assumes it is the master, otherwise it assumes it is the slave. +Enabling this option changes the startup behavior to listen for an active USB communication to delegate which part is master and which is slave. With this option enabled and active USB communication, then that half assumes it is the master, otherwise it assumes it is the slave. Without this option, the master is the half that can detect voltage on the physical USB connection (VBUS detection). From 96882c6a67c95bd5d59873d0921f15a3903dd6dc Mon Sep 17 00:00:00 2001 From: Duncan Sutherland Date: Thu, 20 Mar 2025 21:44:19 +0000 Subject: [PATCH 234/592] Correct json for Fullsize JIS Community Layouts (#23660) initial commit --- layouts/default/fullsize_extended_jis/info.json | 7 ++++--- layouts/default/fullsize_jis/info.json | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/layouts/default/fullsize_extended_jis/info.json b/layouts/default/fullsize_extended_jis/info.json index 8267b4c54f..b410273cd9 100644 --- a/layouts/default/fullsize_extended_jis/info.json +++ b/layouts/default/fullsize_extended_jis/info.json @@ -48,8 +48,8 @@ {"x": 19.5, "y": 1.25}, {"x": 20.5, "y": 1.25}, {"x": 21.5, "y": 1.25}, - {"x": 0, "y": 2.25, "w": 1.5}, + {"x": 0, "y": 2.25, "w": 1.5}, {"x": 1.5, "y": 2.25}, {"x": 2.5, "y": 2.25}, {"x": 3.5, "y": 2.25}, @@ -62,7 +62,7 @@ {"x": 10.5, "y": 2.25}, {"x": 11.5, "y": 2.25}, {"x": 12.5, "y": 2.25}, - {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, + {"x": 15.25, "y": 2.25}, {"x": 16.25, "y": 2.25}, {"x": 17.25, "y": 2.25}, @@ -84,6 +84,7 @@ {"x": 10.75, "y": 3.25}, {"x": 11.75, "y": 3.25}, {"x": 12.75, "y": 3.25}, + {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, {"x": 18.5, "y": 3.25}, {"x": 19.5, "y": 3.25}, {"x": 20.5, "y": 3.25}, @@ -106,7 +107,7 @@ {"x": 19.5, "y": 4.25}, {"x": 20.5, "y": 4.25}, {"x": 21.5, "y": 4.25, "h": 2}, - + {"x": 0, "y": 5.25, "w": 1.25}, {"x": 1.25, "y": 5.25, "w": 1.25}, {"x": 2.5, "y": 5.25, "w": 1.25}, diff --git a/layouts/default/fullsize_jis/info.json b/layouts/default/fullsize_jis/info.json index 8acd5f2fe3..f573125a08 100644 --- a/layouts/default/fullsize_jis/info.json +++ b/layouts/default/fullsize_jis/info.json @@ -44,8 +44,8 @@ {"x": 19.5, "y": 1.25}, {"x": 20.5, "y": 1.25}, {"x": 21.5, "y": 1.25}, - {"x": 0, "y": 2.25, "w": 1.5}, + {"x": 0, "y": 2.25, "w": 1.5}, {"x": 1.5, "y": 2.25}, {"x": 2.5, "y": 2.25}, {"x": 3.5, "y": 2.25}, @@ -58,7 +58,6 @@ {"x": 10.5, "y": 2.25}, {"x": 11.5, "y": 2.25}, {"x": 12.5, "y": 2.25}, - {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, {"x": 15.25, "y": 2.25}, {"x": 16.25, "y": 2.25}, {"x": 17.25, "y": 2.25}, @@ -80,6 +79,7 @@ {"x": 10.75, "y": 3.25}, {"x": 11.75, "y": 3.25}, {"x": 12.75, "y": 3.25}, + {"x": 13.75, "y": 2.25, "w": 1.25, "h": 2}, {"x": 18.5, "y": 3.25}, {"x": 19.5, "y": 3.25}, {"x": 20.5, "y": 3.25}, @@ -102,7 +102,7 @@ {"x": 19.5, "y": 4.25}, {"x": 20.5, "y": 4.25}, {"x": 21.5, "y": 4.25, "h": 2}, - + {"x": 0, "y": 5.25, "w": 1.25}, {"x": 1.25, "y": 5.25, "w": 1.25}, {"x": 2.5, "y": 5.25, "w": 1.25}, From 14ef6c9830d232f4d59f2f4067585a5503a3cd3c Mon Sep 17 00:00:00 2001 From: Duncan Sutherland Date: Thu, 20 Mar 2025 21:44:59 +0000 Subject: [PATCH 235/592] Add Community Layout support to daskeyboard4 (#23884) add ansi CL --- .../daskeyboard/daskeyboard4/keyboard.json | 329 ++++++++++++------ 1 file changed, 224 insertions(+), 105 deletions(-) diff --git a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json index 8308506512..d40ef0210b 100644 --- a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json +++ b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json @@ -43,114 +43,233 @@ "tapping": { "toggle": 2 }, + "community_layouts": ["fullsize_ansi", "fullsize_iso"], "layouts": { + "LAYOUT_fullsize_ansi": { + "layout": [ + {"matrix": [5, 16], "x": 0, "y": 0}, + {"matrix": [2, 4], "x": 2, "y": 0}, + {"matrix": [2, 5], "x": 3, "y": 0}, + {"matrix": [3, 5], "x": 4, "y": 0}, + {"matrix": [5, 5], "x": 5, "y": 0}, + {"matrix": [0, 1], "x": 6.5, "y": 0}, + {"matrix": [5, 8], "x": 7.5, "y": 0}, + {"matrix": [3, 3], "x": 8.5, "y": 0}, + {"matrix": [2, 3], "x": 9.5, "y": 0}, + {"matrix": [2, 2], "x": 11, "y": 0}, + {"matrix": [0, 2], "x": 12, "y": 0}, + {"matrix": [5, 2], "x": 13, "y": 0}, + {"matrix": [6, 2], "x": 14, "y": 0}, + {"matrix": [0, 0], "x": 15.25, "y": 0}, + {"matrix": [1, 0], "x": 16.25, "y": 0}, + {"matrix": [1, 1], "x": 17.25, "y": 0}, + + {"matrix": [2, 16], "x": 0, "y": 1.25}, + {"matrix": [0, 16], "x": 1, "y": 1.25}, + {"matrix": [0, 4], "x": 2, "y": 1.25}, + {"matrix": [0, 5], "x": 3, "y": 1.25}, + {"matrix": [0, 6], "x": 4, "y": 1.25}, + {"matrix": [2, 6], "x": 5, "y": 1.25}, + {"matrix": [2, 7], "x": 6, "y": 1.25}, + {"matrix": [0, 7], "x": 7, "y": 1.25}, + {"matrix": [0, 8], "x": 8, "y": 1.25}, + {"matrix": [0, 3], "x": 9, "y": 1.25}, + {"matrix": [0, 9], "x": 10, "y": 1.25}, + {"matrix": [2, 9], "x": 11, "y": 1.25}, + {"matrix": [2, 8], "x": 12, "y": 1.25}, + {"matrix": [3, 2], "w": 2, "x": 13, "y": 1.25}, + {"matrix": [2, 11], "x": 15.25, "y": 1.25}, + {"matrix": [2, 15], "x": 16.25, "y": 1.25}, + {"matrix": [2, 14], "x": 17.25, "y": 1.25}, + {"matrix": [4, 10], "x": 18.5, "y": 1.25}, + {"matrix": [4, 11], "x": 19.5, "y": 1.25}, + {"matrix": [4, 14], "x": 20.5, "y": 1.25}, + {"matrix": [6, 14], "x": 21.5, "y": 1.25}, + + {"matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25}, + {"matrix": [1, 16], "x": 1.5, "y": 2.25}, + {"matrix": [1, 4], "x": 2.5, "y": 2.25}, + {"matrix": [1, 5], "x": 3.5, "y": 2.25}, + {"matrix": [1, 6], "x": 4.5, "y": 2.25}, + {"matrix": [3, 6], "x": 5.5, "y": 2.25}, + {"matrix": [3, 7], "x": 6.5, "y": 2.25}, + {"matrix": [1, 7], "x": 7.5, "y": 2.25}, + {"matrix": [1, 8], "x": 8.5, "y": 2.25}, + {"matrix": [1, 3], "x": 9.5, "y": 2.25}, + {"matrix": [1, 9], "x": 10.5, "y": 2.25}, + {"matrix": [3, 9], "x": 11.5, "y": 2.25}, + {"matrix": [3, 8], "x": 12.5, "y": 2.25}, + {"matrix": [7, 2], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 10], "x": 15.25, "y": 2.25}, + {"matrix": [0, 15], "x": 16.25, "y": 2.25}, + {"matrix": [0, 14], "x": 17.25, "y": 2.25}, + {"matrix": [1, 10], "x": 18.5, "y": 2.25}, + {"matrix": [1, 11], "x": 19.5, "y": 2.25}, + {"matrix": [1, 14], "x": 20.5, "y": 2.25}, + {"matrix": [1, 15], "x": 21.5, "y": 2.25, "h": 2}, + + {"matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25}, + {"matrix": [7, 16], "x": 1.75, "y": 3.25}, + {"matrix": [7, 4], "x": 2.75, "y": 3.25}, + {"matrix": [7, 5], "x": 3.75, "y": 3.25}, + {"matrix": [7, 6], "x": 4.75, "y": 3.25}, + {"matrix": [5, 6], "x": 5.75, "y": 3.25}, + {"matrix": [5, 7], "x": 6.75, "y": 3.25}, + {"matrix": [7, 7], "x": 7.75, "y": 3.25}, + {"matrix": [7, 8], "x": 8.75, "y": 3.25}, + {"matrix": [7, 3], "x": 9.75, "y": 3.25}, + {"matrix": [7, 9], "x": 10.75, "y": 3.25}, + {"matrix": [5, 9], "x": 11.75, "y": 3.25}, + {"matrix": [4, 2], "w": 2.25, "x": 12.75, "y": 3.25}, + {"matrix": [3, 10], "x": 18.5, "y": 3.25}, + {"matrix": [3, 11], "x": 19.5, "y": 3.25}, + {"matrix": [3, 14], "x": 20.5, "y": 3.25}, + + {"matrix": [3, 13], "w": 2.25, "x": 0, "y": 4.25}, + {"matrix": [4, 16], "x": 2.25, "y": 4.25}, + {"matrix": [4, 4], "x": 3.25, "y": 4.25}, + {"matrix": [4, 5], "x": 4.25, "y": 4.25}, + {"matrix": [4, 6], "x": 5.25, "y": 4.25}, + {"matrix": [6, 6], "x": 6.25, "y": 4.25}, + {"matrix": [6, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 7], "x": 8.25, "y": 4.25}, + {"matrix": [4, 8], "x": 9.25, "y": 4.25}, + {"matrix": [4, 3], "x": 10.25, "y": 4.25}, + {"matrix": [6, 9], "x": 11.25, "y": 4.25}, + {"matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25}, + {"matrix": [5, 15], "x": 16.25, "y": 4.25}, + {"matrix": [7, 10], "x": 18.5, "y": 4.25}, + {"matrix": [7, 11], "x": 19.5, "y": 4.25}, + {"matrix": [7, 14], "x": 20.5, "y": 4.25}, + {"matrix": [7, 15], "x": 21.5, "y": 4.25, "h": 2}, + + {"matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25}, + {"matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25}, + {"matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25}, + {"matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25}, + {"matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25}, + {"matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25}, + {"matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25}, + {"matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25}, + {"matrix": [6, 15], "x": 15.25, "y": 5.25}, + {"matrix": [6, 10], "x": 16.25, "y": 5.25}, + {"matrix": [6, 11], "x": 17.25, "y": 5.25}, + {"matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25}, + {"matrix": [5, 14], "x": 20.5, "y": 5.25} + ] + }, "LAYOUT_fullsize_iso": { "layout": [ - {"label": "Esc", "matrix": [5, 16], "x": 0, "y": 0}, - {"label": "F1", "matrix": [2, 4], "x": 2, "y": 0}, - {"label": "F2", "matrix": [2, 5], "x": 3, "y": 0}, - {"label": "F3", "matrix": [3, 5], "x": 4, "y": 0}, - {"label": "F4", "matrix": [5, 5], "x": 5, "y": 0}, - {"label": "F5", "matrix": [0, 1], "x": 6.5, "y": 0}, - {"label": "F6", "matrix": [5, 8], "x": 7.5, "y": 0}, - {"label": "F7", "matrix": [3, 3], "x": 8.5, "y": 0}, - {"label": "F8", "matrix": [2, 3], "x": 9.5, "y": 0}, - {"label": "F9", "matrix": [2, 2], "x": 11, "y": 0}, - {"label": "F10", "matrix": [0, 2], "x": 12, "y": 0}, - {"label": "F11", "matrix": [5, 2], "x": 13, "y": 0}, - {"label": "F12", "matrix": [6, 2], "x": 14, "y": 0}, - {"label": "Prt Sc", "matrix": [0, 0], "x": 15.25, "y": 0}, - {"label": "Scr Lk", "matrix": [1, 0], "x": 16.25, "y": 0}, - {"label": "Pause", "matrix": [1, 1], "x": 17.25, "y": 0}, - {"label": "`", "matrix": [2, 16], "x": 0, "y": 1.25}, - {"label": "1", "matrix": [0, 16], "x": 1, "y": 1.25}, - {"label": "2", "matrix": [0, 4], "x": 2, "y": 1.25}, - {"label": "3", "matrix": [0, 5], "x": 3, "y": 1.25}, - {"label": "4", "matrix": [0, 6], "x": 4, "y": 1.25}, - {"label": "5", "matrix": [2, 6], "x": 5, "y": 1.25}, - {"label": "6", "matrix": [2, 7], "x": 6, "y": 1.25}, - {"label": "7", "matrix": [0, 7], "x": 7, "y": 1.25}, - {"label": "8", "matrix": [0, 8], "x": 8, "y": 1.25}, - {"label": "9", "matrix": [0, 3], "x": 9, "y": 1.25}, - {"label": "0", "matrix": [0, 9], "x": 10, "y": 1.25}, - {"label": "-", "matrix": [2, 9], "x": 11, "y": 1.25}, - {"label": "=", "matrix": [2, 8], "x": 12, "y": 1.25}, - {"label": "Backspace", "matrix": [3, 2], "w": 2, "x": 13, "y": 1.25}, - {"label": "Ins", "matrix": [2, 11], "x": 15.25, "y": 1.25}, - {"label": "Home", "matrix": [2, 15], "x": 16.25, "y": 1.25}, - {"label": "Page Up", "matrix": [2, 14], "x": 17.25, "y": 1.25}, - {"label": "Num Lk", "matrix": [4, 10], "x": 18.5, "y": 1.25}, - {"label": "/", "matrix": [4, 11], "x": 19.5, "y": 1.25}, - {"label": "*", "matrix": [4, 14], "x": 20.5, "y": 1.25}, - {"label": "-", "matrix": [6, 14], "x": 21.5, "y": 1.25}, - {"label": "Tab", "matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25}, - {"label": "Q", "matrix": [1, 16], "x": 1.5, "y": 2.25}, - {"label": "W", "matrix": [1, 4], "x": 2.5, "y": 2.25}, - {"label": "E", "matrix": [1, 5], "x": 3.5, "y": 2.25}, - {"label": "R", "matrix": [1, 6], "x": 4.5, "y": 2.25}, - {"label": "T", "matrix": [3, 6], "x": 5.5, "y": 2.25}, - {"label": "Y", "matrix": [3, 7], "x": 6.5, "y": 2.25}, - {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 2.25}, - {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 2.25}, - {"label": "O", "matrix": [1, 3], "x": 9.5, "y": 2.25}, - {"label": "P", "matrix": [1, 9], "x": 10.5, "y": 2.25}, - {"label": "[", "matrix": [3, 9], "x": 11.5, "y": 2.25}, - {"label": "]", "matrix": [3, 8], "x": 12.5, "y": 2.25}, - {"label": "Del", "matrix": [2, 10], "x": 15.25, "y": 2.25}, - {"label": "End", "matrix": [0, 15], "x": 16.25, "y": 2.25}, - {"label": "Page Down", "matrix": [0, 14], "x": 17.25, "y": 2.25}, - {"label": "7", "matrix": [1, 10], "x": 18.5, "y": 2.25}, - {"label": "8", "matrix": [1, 11], "x": 19.5, "y": 2.25}, - {"label": "9", "matrix": [1, 14], "x": 20.5, "y": 2.25}, - {"label": "+", "h": 2, "matrix": [1, 15], "x": 21.5, "y": 2.25}, - {"label": "Caps Lock", "matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25}, - {"label": "A", "matrix": [7, 16], "x": 1.75, "y": 3.25}, - {"label": "S", "matrix": [7, 4], "x": 2.75, "y": 3.25}, - {"label": "D", "matrix": [7, 5], "x": 3.75, "y": 3.25}, - {"label": "F", "matrix": [7, 6], "x": 4.75, "y": 3.25}, - {"label": "G", "matrix": [5, 6], "x": 5.75, "y": 3.25}, - {"label": "H", "matrix": [5, 7], "x": 6.75, "y": 3.25}, - {"label": "J", "matrix": [7, 7], "x": 7.75, "y": 3.25}, - {"label": "K", "matrix": [7, 8], "x": 8.75, "y": 3.25}, - {"label": "L", "matrix": [7, 3], "x": 9.75, "y": 3.25}, - {"label": ";", "matrix": [7, 9], "x": 10.75, "y": 3.25}, - {"label": "'", "matrix": [5, 9], "x": 11.75, "y": 3.25}, - {"label": "#", "matrix": [1, 2], "x": 12.75, "y": 3.25}, - {"label": "Return", "h": 2, "matrix": [4, 2], "w": 1.25, "x": 13.75, "y": 2.25}, - {"label": "4", "matrix": [3, 10], "x": 18.5, "y": 3.25}, - {"label": "5", "matrix": [3, 11], "x": 19.5, "y": 3.25}, - {"label": "6", "matrix": [3, 14], "x": 20.5, "y": 3.25}, - {"label": "Shift L", "matrix": [3, 13], "w": 1.25, "x": 0, "y": 4.25}, - {"label": "\\", "matrix": [5, 4], "x": 1.25, "y": 4.25}, - {"label": "Z", "matrix": [4, 16], "x": 2.25, "y": 4.25}, - {"label": "X", "matrix": [4, 4], "x": 3.25, "y": 4.25}, - {"label": "C", "matrix": [4, 5], "x": 4.25, "y": 4.25}, - {"label": "V", "matrix": [4, 6], "x": 5.25, "y": 4.25}, - {"label": "B", "matrix": [6, 6], "x": 6.25, "y": 4.25}, - {"label": "N", "matrix": [6, 7], "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, 3], "x": 10.25, "y": 4.25}, - {"label": "/", "matrix": [6, 9], "x": 11.25, "y": 4.25}, - {"label": "Shift R", "matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25}, - {"label": "Up", "matrix": [5, 15], "x": 16.25, "y": 4.25}, - {"label": "1", "matrix": [7, 10], "x": 18.5, "y": 4.25}, - {"label": "2", "matrix": [7, 11], "x": 19.5, "y": 4.25}, - {"label": "3", "matrix": [7, 14], "x": 20.5, "y": 4.25}, - {"label": "Enter", "h": 2, "matrix": [7, 15], "x": 21.5, "y": 4.25}, - {"label": "Control L", "matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25}, - {"label": "Super L", "matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25}, - {"label": "Alt L", "matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25}, - {"label": " ", "matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25}, - {"label": "Alt R", "matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25}, - {"label": "Super R", "matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25}, - {"label": "Menu", "matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25}, - {"label": "Control R", "matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25}, - {"label": "Left", "matrix": [6, 15], "x": 15.25, "y": 5.25}, - {"label": "Down", "matrix": [6, 10], "x": 16.25, "y": 5.25}, - {"label": "Right", "matrix": [6, 11], "x": 17.25, "y": 5.25}, - {"label": "0", "matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25}, - {"label": "Del", "matrix": [5, 14], "x": 20.5, "y": 5.25} + {"matrix": [5, 16], "x": 0, "y": 0}, + {"matrix": [2, 4], "x": 2, "y": 0}, + {"matrix": [2, 5], "x": 3, "y": 0}, + {"matrix": [3, 5], "x": 4, "y": 0}, + {"matrix": [5, 5], "x": 5, "y": 0}, + {"matrix": [0, 1], "x": 6.5, "y": 0}, + {"matrix": [5, 8], "x": 7.5, "y": 0}, + {"matrix": [3, 3], "x": 8.5, "y": 0}, + {"matrix": [2, 3], "x": 9.5, "y": 0}, + {"matrix": [2, 2], "x": 11, "y": 0}, + {"matrix": [0, 2], "x": 12, "y": 0}, + {"matrix": [5, 2], "x": 13, "y": 0}, + {"matrix": [6, 2], "x": 14, "y": 0}, + {"matrix": [0, 0], "x": 15.25, "y": 0}, + {"matrix": [1, 0], "x": 16.25, "y": 0}, + {"matrix": [1, 1], "x": 17.25, "y": 0}, + + {"matrix": [2, 16], "x": 0, "y": 1.25}, + {"matrix": [0, 16], "x": 1, "y": 1.25}, + {"matrix": [0, 4], "x": 2, "y": 1.25}, + {"matrix": [0, 5], "x": 3, "y": 1.25}, + {"matrix": [0, 6], "x": 4, "y": 1.25}, + {"matrix": [2, 6], "x": 5, "y": 1.25}, + {"matrix": [2, 7], "x": 6, "y": 1.25}, + {"matrix": [0, 7], "x": 7, "y": 1.25}, + {"matrix": [0, 8], "x": 8, "y": 1.25}, + {"matrix": [0, 3], "x": 9, "y": 1.25}, + {"matrix": [0, 9], "x": 10, "y": 1.25}, + {"matrix": [2, 9], "x": 11, "y": 1.25}, + {"matrix": [2, 8], "x": 12, "y": 1.25}, + {"matrix": [3, 2], "w": 2, "x": 13, "y": 1.25}, + {"matrix": [2, 11], "x": 15.25, "y": 1.25}, + {"matrix": [2, 15], "x": 16.25, "y": 1.25}, + {"matrix": [2, 14], "x": 17.25, "y": 1.25}, + {"matrix": [4, 10], "x": 18.5, "y": 1.25}, + {"matrix": [4, 11], "x": 19.5, "y": 1.25}, + {"matrix": [4, 14], "x": 20.5, "y": 1.25}, + {"matrix": [6, 14], "x": 21.5, "y": 1.25}, + + {"matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25}, + {"matrix": [1, 16], "x": 1.5, "y": 2.25}, + {"matrix": [1, 4], "x": 2.5, "y": 2.25}, + {"matrix": [1, 5], "x": 3.5, "y": 2.25}, + {"matrix": [1, 6], "x": 4.5, "y": 2.25}, + {"matrix": [3, 6], "x": 5.5, "y": 2.25}, + {"matrix": [3, 7], "x": 6.5, "y": 2.25}, + {"matrix": [1, 7], "x": 7.5, "y": 2.25}, + {"matrix": [1, 8], "x": 8.5, "y": 2.25}, + {"matrix": [1, 3], "x": 9.5, "y": 2.25}, + {"matrix": [1, 9], "x": 10.5, "y": 2.25}, + {"matrix": [3, 9], "x": 11.5, "y": 2.25}, + {"matrix": [3, 8], "x": 12.5, "y": 2.25}, + {"matrix": [2, 10], "x": 15.25, "y": 2.25}, + {"matrix": [0, 15], "x": 16.25, "y": 2.25}, + {"matrix": [0, 14], "x": 17.25, "y": 2.25}, + {"matrix": [1, 10], "x": 18.5, "y": 2.25}, + {"matrix": [1, 11], "x": 19.5, "y": 2.25}, + {"matrix": [1, 14], "x": 20.5, "y": 2.25}, + {"matrix": [1, 15], "x": 21.5, "y": 2.25, "h": 2}, + + {"matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25}, + {"matrix": [7, 16], "x": 1.75, "y": 3.25}, + {"matrix": [7, 4], "x": 2.75, "y": 3.25}, + {"matrix": [7, 5], "x": 3.75, "y": 3.25}, + {"matrix": [7, 6], "x": 4.75, "y": 3.25}, + {"matrix": [5, 6], "x": 5.75, "y": 3.25}, + {"matrix": [5, 7], "x": 6.75, "y": 3.25}, + {"matrix": [7, 7], "x": 7.75, "y": 3.25}, + {"matrix": [7, 8], "x": 8.75, "y": 3.25}, + {"matrix": [7, 3], "x": 9.75, "y": 3.25}, + {"matrix": [7, 9], "x": 10.75, "y": 3.25}, + {"matrix": [5, 9], "x": 11.75, "y": 3.25}, + {"matrix": [1, 2], "x": 12.75, "y": 3.25}, + {"matrix": [4, 2], "w": 1.25, "x": 13.75, "y": 2.25, "h": 2}, + {"matrix": [3, 10], "x": 18.5, "y": 3.25}, + {"matrix": [3, 11], "x": 19.5, "y": 3.25}, + {"matrix": [3, 14], "x": 20.5, "y": 3.25}, + + {"matrix": [3, 13], "w": 1.25, "x": 0, "y": 4.25}, + {"matrix": [5, 4], "x": 1.25, "y": 4.25}, + {"matrix": [4, 16], "x": 2.25, "y": 4.25}, + {"matrix": [4, 4], "x": 3.25, "y": 4.25}, + {"matrix": [4, 5], "x": 4.25, "y": 4.25}, + {"matrix": [4, 6], "x": 5.25, "y": 4.25}, + {"matrix": [6, 6], "x": 6.25, "y": 4.25}, + {"matrix": [6, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 7], "x": 8.25, "y": 4.25}, + {"matrix": [4, 8], "x": 9.25, "y": 4.25}, + {"matrix": [4, 3], "x": 10.25, "y": 4.25}, + {"matrix": [6, 9], "x": 11.25, "y": 4.25}, + {"matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25}, + {"matrix": [5, 15], "x": 16.25, "y": 4.25}, + {"matrix": [7, 10], "x": 18.5, "y": 4.25}, + {"matrix": [7, 11], "x": 19.5, "y": 4.25}, + {"matrix": [7, 14], "x": 20.5, "y": 4.25}, + {"matrix": [7, 15], "x": 21.5, "y": 4.25, "h": 2}, + + {"matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25}, + {"matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25}, + {"matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25}, + {"matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25}, + {"matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25}, + {"matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25}, + {"matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25}, + {"matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25}, + {"matrix": [6, 15], "x": 15.25, "y": 5.25}, + {"matrix": [6, 10], "x": 16.25, "y": 5.25}, + {"matrix": [6, 11], "x": 17.25, "y": 5.25}, + {"matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25}, + {"matrix": [5, 14], "x": 20.5, "y": 5.25} ] } } From ea238d5a8a52564e492355e1ab7258d693c0d0f2 Mon Sep 17 00:00:00 2001 From: Ramon Imbao Date: Fri, 21 Mar 2025 05:53:27 +0800 Subject: [PATCH 236/592] Add the plywrks ply8x hotswap variant. (#23558) * Add hotswap variant * Update RGB matrix * Move files around to target develop * Revert rules.mk for keyboards/jaykeeb/joker/rules.mk * Update keyboards/plywrks/ply8x/hotswap/keyboard.json Co-authored-by: Drashna Jaelre * Apply suggestions from code review Co-authored-by: Duncan Sutherland * Add missing community layouts * Delete keyboards/plywrks/ply8x/rules.mk * Update missing keys in RGB matrix * Add missing key in RGB matrix for hotswap ver * Remove via keymaps * Add keyboard alias for plywrks/ply8x to plywrks/ply8x/solder * Fix typo * Fix another typo --------- Co-authored-by: Drashna Jaelre Co-authored-by: Duncan Sutherland --- data/mappings/keyboard_aliases.hjson | 3 + .../plywrks/ply8x/{ => hotswap}/config.h | 0 .../plywrks/ply8x/{ => hotswap}/halconf.h | 0 keyboards/plywrks/ply8x/hotswap/keyboard.json | 560 ++++++++++++++++++ .../ply8x/hotswap/keymaps/default/keymap.c | 32 + .../plywrks/ply8x/{ => hotswap}/mcuconf.h | 0 keyboards/plywrks/ply8x/solder/config.h | 10 + keyboards/plywrks/ply8x/solder/halconf.h | 8 + .../plywrks/ply8x/{ => solder}/keyboard.json | 494 ++++++++++++++- .../{ => solder}/keymaps/default/keymap.c | 0 keyboards/plywrks/ply8x/solder/mcuconf.h | 9 + 11 files changed, 1107 insertions(+), 9 deletions(-) rename keyboards/plywrks/ply8x/{ => hotswap}/config.h (100%) rename keyboards/plywrks/ply8x/{ => hotswap}/halconf.h (100%) create mode 100644 keyboards/plywrks/ply8x/hotswap/keyboard.json create mode 100644 keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c rename keyboards/plywrks/ply8x/{ => hotswap}/mcuconf.h (100%) create mode 100644 keyboards/plywrks/ply8x/solder/config.h create mode 100644 keyboards/plywrks/ply8x/solder/halconf.h rename keyboards/plywrks/ply8x/{ => solder}/keyboard.json (65%) rename keyboards/plywrks/ply8x/{ => solder}/keymaps/default/keymap.c (100%) create mode 100644 keyboards/plywrks/ply8x/solder/mcuconf.h diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index b601a42761..c8d9bff052 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -581,6 +581,9 @@ "ploopyco/trackball": { "target": "ploopyco/trackball/rev1_005" }, + "plywrks/ply8x": { + "target": "plywrks/ply8x/solder" + }, "polilla": { "target": "polilla/rev1" }, diff --git a/keyboards/plywrks/ply8x/config.h b/keyboards/plywrks/ply8x/hotswap/config.h similarity index 100% rename from keyboards/plywrks/ply8x/config.h rename to keyboards/plywrks/ply8x/hotswap/config.h diff --git a/keyboards/plywrks/ply8x/halconf.h b/keyboards/plywrks/ply8x/hotswap/halconf.h similarity index 100% rename from keyboards/plywrks/ply8x/halconf.h rename to keyboards/plywrks/ply8x/hotswap/halconf.h diff --git a/keyboards/plywrks/ply8x/hotswap/keyboard.json b/keyboards/plywrks/ply8x/hotswap/keyboard.json new file mode 100644 index 0000000000..2dc2ac5c35 --- /dev/null +++ b/keyboards/plywrks/ply8x/hotswap/keyboard.json @@ -0,0 +1,560 @@ +{ + "manufacturer": "plywrks", + "keyboard_name": "ply8x", + "maintainer": "ramonimbao", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "rows": ["B2", "B1", "B0", "A7", "A10", "A2"], + "cols": ["A9", "A8", "B12", "B11", "B10", "A6", "A5", "A4", "A15", "C14", "C13", "B9", "B6", "B7", "B5", "B4", "B3"] + }, + "processor": "STM32F072", + "url": "", + "usb": { + "device_version": "1.0.0", + "vid": "0x706C", + "pid": "0x7915" + }, + "ws2812": { + "pin": "B15", + "driver": "spi" + }, + "rgb_matrix": { + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "rainbow_moving_chevron": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_rain": true, + "pixel_flow": true, + "pixel_fractal": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true + }, + "driver": "ws2812", + "layout": [ + {"flags": 2, "x":224, "y":37}, + {"flags": 2, "x":224, "y":43}, + {"flags": 2, "x":218, "y":43}, + {"flags": 2, "x":218, "y":37}, + + {"flags": 2, "matrix": [0, 0], "x":0, "y": 0}, + {"flags": 2, "matrix": [0, 2], "x":26, "y": 0}, + {"flags": 2, "matrix": [0, 3], "x":38, "y": 0}, + {"flags": 2, "matrix": [0, 4], "x":51, "y": 0}, + {"flags": 2, "matrix": [0, 5], "x":64, "y": 0}, + {"flags": 2, "matrix": [0, 6], "x":83, "y": 0}, + {"flags": 2, "matrix": [0, 7], "x":96, "y": 0}, + {"flags": 2, "matrix": [0, 8], "x":109, "y": 0}, + {"flags": 2, "matrix": [0, 9], "x":122, "y": 0}, + {"flags": 2, "matrix": [0,10], "x":141, "y": 0}, + {"flags": 2, "matrix": [0,11], "x":154, "y": 0}, + {"flags": 2, "matrix": [0,12], "x":166, "y": 0}, + {"flags": 2, "matrix": [0,13], "x":179, "y": 0}, + {"flags": 2, "matrix": [0,14], "x":195, "y": 0}, + {"flags": 2, "matrix": [0,15], "x":208, "y": 0}, + {"flags": 2, "matrix": [0,16], "x":221, "y": 0}, + + {"flags": 2, "matrix": [1, 0], "x":0, "y": 15}, + {"flags": 2, "matrix": [1, 1], "x":13, "y": 15}, + {"flags": 2, "matrix": [1, 2], "x":26, "y": 15}, + {"flags": 2, "matrix": [1, 3], "x":38, "y": 15}, + {"flags": 2, "matrix": [1, 4], "x":51, "y": 15}, + {"flags": 2, "matrix": [1, 5], "x":64, "y": 15}, + {"flags": 2, "matrix": [1, 6], "x":77, "y": 15}, + {"flags": 2, "matrix": [1, 7], "x":90, "y": 15}, + {"flags": 2, "matrix": [1, 8], "x":102, "y": 15}, + {"flags": 2, "matrix": [1, 9], "x":115, "y": 15}, + {"flags": 2, "matrix": [1,10], "x":128, "y": 15}, + {"flags": 2, "matrix": [1,11], "x":141, "y": 15}, + {"flags": 2, "matrix": [1,12], "x":154, "y": 15}, + {"flags": 2, "matrix": [1,13], "x":166, "y": 15}, + {"flags": 2, "matrix": [3,13], "x":179, "y": 15}, + {"flags": 2, "matrix": [1,14], "x":195, "y": 15}, + {"flags": 2, "matrix": [1,15], "x":208, "y": 15}, + {"flags": 2, "matrix": [1,16], "x":221, "y": 15}, + + {"flags": 2, "matrix": [2, 0], "x":3, "y": 27}, + {"flags": 2, "matrix": [2, 1], "x":19, "y": 27}, + {"flags": 2, "matrix": [2, 2], "x":32, "y": 27}, + {"flags": 2, "matrix": [2, 3], "x":45, "y": 27}, + {"flags": 2, "matrix": [2, 4], "x":58, "y": 27}, + {"flags": 2, "matrix": [2, 5], "x":70, "y": 27}, + {"flags": 2, "matrix": [2, 6], "x":83, "y": 27}, + {"flags": 2, "matrix": [2, 7], "x":96, "y": 27}, + {"flags": 2, "matrix": [2, 8], "x":109, "y": 27}, + {"flags": 2, "matrix": [2, 9], "x":122, "y": 27}, + {"flags": 2, "matrix": [2,10], "x":134, "y": 27}, + {"flags": 2, "matrix": [2,11], "x":147, "y": 27}, + {"flags": 2, "matrix": [2,12], "x":160, "y": 27}, + {"flags": 2, "matrix": [2,13], "x":176, "y": 27}, + {"flags": 2, "matrix": [2,14], "x":195, "y": 27}, + {"flags": 2, "matrix": [2,15], "x":208, "y": 27}, + {"flags": 2, "matrix": [2,16], "x":221, "y": 27}, + + {"flags": 2, "matrix": [3, 0], "x":5, "y":40}, + {"flags": 2, "matrix": [3, 1], "x":23, "y": 40}, + {"flags": 2, "matrix": [3, 2], "x":36, "y": 40}, + {"flags": 2, "matrix": [3, 3], "x":49, "y": 40}, + {"flags": 2, "matrix": [3, 4], "x":62, "y": 40}, + {"flags": 2, "matrix": [3, 5], "x":75, "y": 40}, + {"flags": 2, "matrix": [3, 6], "x":88, "y": 40}, + {"flags": 2, "matrix": [3, 7], "x":101, "y": 40}, + {"flags": 2, "matrix": [3, 8], "x":114, "y": 40}, + {"flags": 2, "matrix": [3, 9], "x":127, "y": 40}, + {"flags": 2, "matrix": [3,10], "x":140, "y": 40}, + {"flags": 2, "matrix": [3,11], "x":153, "y": 40}, + {"flags": 2, "matrix": [3,12], "x":166, "y": 40}, + + {"flags": 2, "matrix": [4, 0], "x":8, "y": 52}, + {"flags": 2, "matrix": [4, 2], "x":29, "y": 52}, + {"flags": 2, "matrix": [4, 3], "x":42, "y": 52}, + {"flags": 2, "matrix": [4, 4], "x":54, "y": 52}, + {"flags": 2, "matrix": [4, 5], "x":67, "y": 52}, + {"flags": 2, "matrix": [4, 6], "x":80, "y": 52}, + {"flags": 2, "matrix": [4, 7], "x":93, "y": 52}, + {"flags": 2, "matrix": [4, 8], "x":106, "y": 52}, + {"flags": 2, "matrix": [4, 9], "x":118, "y": 52}, + {"flags": 2, "matrix": [4,10], "x":131, "y": 52}, + {"flags": 2, "matrix": [4,11], "x":144, "y": 52}, + {"flags": 2, "matrix": [4,12], "x":162, "y": 52}, + {"flags": 2, "matrix": [4,13], "x":179, "y": 52}, + {"flags": 2, "matrix": [4,15], "x":208, "y": 52}, + + {"flags": 2, "matrix": [5, 0], "x":2, "y": 64}, + {"flags": 2, "matrix": [5, 1], "x":18, "y": 64}, + {"flags": 2, "matrix": [5, 2], "x":34, "y": 64}, + {"flags": 2, "matrix": [5, 7], "x":82, "y": 64}, + {"flags": 2, "matrix": [5,11], "x":146, "y": 64}, + {"flags": 2, "matrix": [5,12], "x":162, "y": 64}, + {"flags": 2, "matrix": [5,13], "x":178, "y": 64}, + {"flags": 2, "matrix": [5,14], "x":195, "y": 64}, + {"flags": 2, "matrix": [5,15], "x":208, "y": 64}, + {"flags": 2, "matrix": [5,16], "x":221, "y": 64} + ] + }, + "community_layouts": ["tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift", "tkl_ansi_wkl", "tkl_ansi_wkl_split_bs_rshift"], + "layouts": { + "LAYOUT_tkl_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25, "w":2}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 1], "x":1.5, "y":5.25}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 7], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,12], "x":12.5, "y":5.25}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, + "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25}, + {"matrix": [3,13], "x":14, "y":1.25}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75}, + {"matrix": [4,13], "x":14, "y":4.25}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 1], "x":1.5, "y":5.25}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 7], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,12], "x":12.5, "y":5.25}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, + "LAYOUT_tkl_ansi_wkl": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25, "w":2}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 7], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, + "LAYOUT_tkl_ansi_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25}, + {"matrix": [3,13], "x":14, "y":1.25}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75}, + {"matrix": [4,13], "x":14, "y":4.25}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 7], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + } + } +} diff --git a/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c b/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..0da2588ea7 --- /dev/null +++ b/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ + * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│ + * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ + * │Ctrl│GUI │Alt │ │ Alt│ GUI│Ctrl│ │ ← │ ↓ │ → │ + * └────┴────┴────┴─────────────────────────────┴────┴────┴────┘ └───┴───┴───┘ + */ + [0] = LAYOUT_tkl_ansi_tsangan( + 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_PSCR, KC_SCRL, KC_PAUS, + + 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_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + 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, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/plywrks/ply8x/mcuconf.h b/keyboards/plywrks/ply8x/hotswap/mcuconf.h similarity index 100% rename from keyboards/plywrks/ply8x/mcuconf.h rename to keyboards/plywrks/ply8x/hotswap/mcuconf.h diff --git a/keyboards/plywrks/ply8x/solder/config.h b/keyboards/plywrks/ply8x/solder/config.h new file mode 100644 index 0000000000..3fc4de978d --- /dev/null +++ b/keyboards/plywrks/ply8x/solder/config.h @@ -0,0 +1,10 @@ +// Copyright 2023 Ramon Imbao (@ramonimbao) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define WS2812_SPI_DRIVER SPID2 +#define WS2812_SPI_MOSI_PAL_MODE 0 +#define WS2812_SPI_SCK_PIN B13 +#define WS2812_SPI_SCK_PAL_MODE 0 +#define WS2812_EXTERNAL_PULLUP diff --git a/keyboards/plywrks/ply8x/solder/halconf.h b/keyboards/plywrks/ply8x/solder/halconf.h new file mode 100644 index 0000000000..e215e323c5 --- /dev/null +++ b/keyboards/plywrks/ply8x/solder/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2023 Ramon Imbao (@ramonimbao) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/plywrks/ply8x/keyboard.json b/keyboards/plywrks/ply8x/solder/keyboard.json similarity index 65% rename from keyboards/plywrks/ply8x/keyboard.json rename to keyboards/plywrks/ply8x/solder/keyboard.json index 7c0717ade0..8bae31a1f1 100644 --- a/keyboards/plywrks/ply8x/keyboard.json +++ b/keyboards/plywrks/ply8x/solder/keyboard.json @@ -21,8 +21,8 @@ "url": "", "usb": { "device_version": "1.0.0", - "pid": "0x7905", - "vid": "0x706C" + "vid": "0x706C", + "pid": "0x7905" }, "ws2812": { "pin": "B15", @@ -76,12 +76,106 @@ }, "driver": "ws2812", "layout": [ - {"flags": 8, "matrix": [3, 0], "x":2, "y":27}, - {"flags": 8, "matrix": [0,15], "x":211, "y":0}, - {"flags": 2, "x":0, "y":0}, - {"flags": 2, "x":10, "y":0}, - {"flags": 2, "x":20, "y":0}, - {"flags": 2, "x":30, "y":0} + {"flags": 8, "matrix": [3, 0], "x":5, "y":40}, + {"flags": 8, "matrix": [0,15], "x":208, "y":0}, + {"flags": 2, "x":224, "y":37}, + {"flags": 2, "x":224, "y":43}, + {"flags": 2, "x":218, "y":43}, + {"flags": 2, "x":218, "y":37}, + + {"flags": 2, "matrix": [0, 0], "x":0, "y": 0}, + {"flags": 2, "matrix": [0, 2], "x":26, "y": 0}, + {"flags": 2, "matrix": [0, 3], "x":38, "y": 0}, + {"flags": 2, "matrix": [0, 4], "x":51, "y": 0}, + {"flags": 2, "matrix": [0, 5], "x":64, "y": 0}, + {"flags": 2, "matrix": [0, 6], "x":83, "y": 0}, + {"flags": 2, "matrix": [0, 7], "x":96, "y": 0}, + {"flags": 2, "matrix": [0, 8], "x":109, "y": 0}, + {"flags": 2, "matrix": [0, 9], "x":122, "y": 0}, + {"flags": 2, "matrix": [0,10], "x":141, "y": 0}, + {"flags": 2, "matrix": [0,11], "x":154, "y": 0}, + {"flags": 2, "matrix": [0,12], "x":166, "y": 0}, + {"flags": 2, "matrix": [0,13], "x":179, "y": 0}, + {"flags": 2, "matrix": [0,14], "x":195, "y": 0}, + {"flags": 2, "matrix": [0,16], "x":221, "y": 0}, + + {"flags": 2, "matrix": [1, 0], "x":0, "y": 15}, + {"flags": 2, "matrix": [1, 1], "x":13, "y": 15}, + {"flags": 2, "matrix": [1, 2], "x":26, "y": 15}, + {"flags": 2, "matrix": [1, 3], "x":38, "y": 15}, + {"flags": 2, "matrix": [1, 4], "x":51, "y": 15}, + {"flags": 2, "matrix": [1, 5], "x":64, "y": 15}, + {"flags": 2, "matrix": [1, 6], "x":77, "y": 15}, + {"flags": 2, "matrix": [1, 7], "x":90, "y": 15}, + {"flags": 2, "matrix": [1, 8], "x":102, "y": 15}, + {"flags": 2, "matrix": [1, 9], "x":115, "y": 15}, + {"flags": 2, "matrix": [1,10], "x":128, "y": 15}, + {"flags": 2, "matrix": [1,11], "x":141, "y": 15}, + {"flags": 2, "matrix": [1,12], "x":154, "y": 15}, + {"flags": 2, "matrix": [1,13], "x":166, "y": 15}, + {"flags": 2, "matrix": [3,13], "x":179, "y": 15}, + {"flags": 2, "matrix": [1,14], "x":195, "y": 15}, + {"flags": 2, "matrix": [1,15], "x":208, "y": 15}, + {"flags": 2, "matrix": [1,16], "x":221, "y": 15}, + + {"flags": 2, "matrix": [2, 0], "x":3, "y": 27}, + {"flags": 2, "matrix": [2, 1], "x":19, "y": 27}, + {"flags": 2, "matrix": [2, 2], "x":32, "y": 27}, + {"flags": 2, "matrix": [2, 3], "x":45, "y": 27}, + {"flags": 2, "matrix": [2, 4], "x":58, "y": 27}, + {"flags": 2, "matrix": [2, 5], "x":70, "y": 27}, + {"flags": 2, "matrix": [2, 6], "x":83, "y": 27}, + {"flags": 2, "matrix": [2, 7], "x":96, "y": 27}, + {"flags": 2, "matrix": [2, 8], "x":109, "y": 27}, + {"flags": 2, "matrix": [2, 9], "x":122, "y": 27}, + {"flags": 2, "matrix": [2,10], "x":134, "y": 27}, + {"flags": 2, "matrix": [2,11], "x":147, "y": 27}, + {"flags": 2, "matrix": [2,12], "x":160, "y": 27}, + {"flags": 2, "matrix": [2,13], "x":176, "y": 27}, + {"flags": 2, "matrix": [2,14], "x":195, "y": 27}, + {"flags": 2, "matrix": [2,15], "x":208, "y": 27}, + {"flags": 2, "matrix": [2,16], "x":221, "y": 27}, + + {"flags": 2, "matrix": [3, 1], "x":23, "y": 40}, + {"flags": 2, "matrix": [3, 2], "x":36, "y": 40}, + {"flags": 2, "matrix": [3, 3], "x":49, "y": 40}, + {"flags": 2, "matrix": [3, 4], "x":62, "y": 40}, + {"flags": 2, "matrix": [3, 5], "x":75, "y": 40}, + {"flags": 2, "matrix": [3, 6], "x":88, "y": 40}, + {"flags": 2, "matrix": [3, 7], "x":101, "y": 40}, + {"flags": 2, "matrix": [3, 8], "x":114, "y": 40}, + {"flags": 2, "matrix": [3, 9], "x":127, "y": 40}, + {"flags": 2, "matrix": [3,10], "x":140, "y": 40}, + {"flags": 2, "matrix": [3,11], "x":153, "y": 40}, + {"flags": 2, "matrix": [3,12], "x":166, "y": 40}, + + {"flags": 2, "matrix": [4, 0], "x":2, "y": 52}, + {"flags": 2, "matrix": [4, 1], "x":16, "y": 52}, + {"flags": 2, "matrix": [4, 2], "x":29, "y": 52}, + {"flags": 2, "matrix": [4, 3], "x":42, "y": 52}, + {"flags": 2, "matrix": [4, 4], "x":54, "y": 52}, + {"flags": 2, "matrix": [4, 5], "x":67, "y": 52}, + {"flags": 2, "matrix": [4, 6], "x":80, "y": 52}, + {"flags": 2, "matrix": [4, 7], "x":93, "y": 52}, + {"flags": 2, "matrix": [4, 8], "x":106, "y": 52}, + {"flags": 2, "matrix": [4, 9], "x":118, "y": 52}, + {"flags": 2, "matrix": [4,10], "x":131, "y": 52}, + {"flags": 2, "matrix": [4,11], "x":144, "y": 52}, + {"flags": 2, "matrix": [4,12], "x":162, "y": 52}, + {"flags": 2, "matrix": [4,13], "x":179, "y": 52}, + {"flags": 2, "matrix": [4,15], "x":208, "y": 52}, + + {"flags": 2, "matrix": [5, 0], "x":2, "y": 64}, + {"flags": 2, "matrix": [5, 1], "x":18, "y": 64}, + {"flags": 2, "matrix": [5, 2], "x":34, "y": 64}, + {"flags": 2, "matrix": [5, 6], "x":82, "y": 64}, + {"flags": 2, "matrix": [5,10], "x":130, "y": 64}, + {"flags": 2, "matrix": [5,11], "x":146, "y": 64}, + {"flags": 2, "matrix": [5,12], "x":162, "y": 64}, + {"flags": 2, "matrix": [5,13], "x":178, "y": 64}, + {"flags": 2, "matrix": [5,14], "x":195, "y": 64}, + {"flags": 2, "matrix": [5,15], "x":208, "y": 64}, + {"flags": 2, "matrix": [5,16], "x":221, "y": 64} ] }, "layout_aliases": { @@ -92,11 +186,15 @@ "tkl_ansi", "tkl_ansi_split_bs_rshift", "tkl_ansi_tsangan", + "tkl_ansi_wkl", "tkl_ansi_tsangan_split_bs_rshift", + "tkl_ansi_wkl_split_bs_rshift", "tkl_iso", "tkl_iso_split_bs_rshift", "tkl_iso_tsangan", - "tkl_iso_tsangan_split_bs_rshift" + "tkl_iso_wkl", + "tkl_iso_tsangan_split_bs_rshift", + "tkl_iso_wkl_split_bs_rshift" ], "layouts": { "LAYOUT_tkl_ansi": { @@ -388,6 +486,99 @@ {"matrix": [5,16], "x":17.25, "y":5.25} ] }, + "LAYOUT_tkl_ansi_wkl": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25, "w":2}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 6], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": { "layout": [ {"matrix": [0, 0], "x":0, "y":0}, @@ -485,6 +676,101 @@ {"matrix": [5,16], "x":17.25, "y":5.25} ] }, + "LAYOUT_tkl_ansi_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25}, + {"matrix": [3,13], "x":14, "y":1.25}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75}, + {"matrix": [4,13], "x":14, "y":4.25}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 6], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, "LAYOUT_tkl_iso": { "layout": [ {"matrix": [0, 0], "x":0, "y":0}, @@ -777,6 +1063,100 @@ {"matrix": [5,16], "x":17.25, "y":5.25} ] }, + "LAYOUT_tkl_iso_wkl": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25, "w":2}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25}, + {"matrix": [2,13], "x":13.75, "y":2.25, "w":1.25, "h":2}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":1.25}, + {"matrix": [4, 1], "x":1.25, "y":4.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 6], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, "LAYOUT_tkl_iso_tsangan_split_bs_rshift": { "layout": [ {"matrix": [0, 0], "x":0, "y":0}, @@ -875,6 +1255,102 @@ {"matrix": [5,16], "x":17.25, "y":5.25} ] }, + "LAYOUT_tkl_iso_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x":0, "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.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0,10], "x":11, "y":0}, + {"matrix": [0,11], "x":12, "y":0}, + {"matrix": [0,12], "x":13, "y":0}, + {"matrix": [0,13], "x":14, "y":0}, + {"matrix": [0,14], "x":15.25, "y":0}, + {"matrix": [0,15], "x":16.25, "y":0}, + {"matrix": [0,16], "x":17.25, "y":0}, + + {"matrix": [1, 0], "x":0, "y":1.25}, + {"matrix": [1, 1], "x":1, "y":1.25}, + {"matrix": [1, 2], "x":2, "y":1.25}, + {"matrix": [1, 3], "x":3, "y":1.25}, + {"matrix": [1, 4], "x":4, "y":1.25}, + {"matrix": [1, 5], "x":5, "y":1.25}, + {"matrix": [1, 6], "x":6, "y":1.25}, + {"matrix": [1, 7], "x":7, "y":1.25}, + {"matrix": [1, 8], "x":8, "y":1.25}, + {"matrix": [1, 9], "x":9, "y":1.25}, + {"matrix": [1,10], "x":10, "y":1.25}, + {"matrix": [1,11], "x":11, "y":1.25}, + {"matrix": [1,12], "x":12, "y":1.25}, + {"matrix": [1,13], "x":13, "y":1.25}, + {"matrix": [3,13], "x":14, "y":1.25}, + {"matrix": [1,14], "x":15.25, "y":1.25}, + {"matrix": [1,15], "x":16.25, "y":1.25}, + {"matrix": [1,16], "x":17.25, "y":1.25}, + + {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5}, + {"matrix": [2, 1], "x":1.5, "y":2.25}, + {"matrix": [2, 2], "x":2.5, "y":2.25}, + {"matrix": [2, 3], "x":3.5, "y":2.25}, + {"matrix": [2, 4], "x":4.5, "y":2.25}, + {"matrix": [2, 5], "x":5.5, "y":2.25}, + {"matrix": [2, 6], "x":6.5, "y":2.25}, + {"matrix": [2, 7], "x":7.5, "y":2.25}, + {"matrix": [2, 8], "x":8.5, "y":2.25}, + {"matrix": [2, 9], "x":9.5, "y":2.25}, + {"matrix": [2,10], "x":10.5, "y":2.25}, + {"matrix": [2,11], "x":11.5, "y":2.25}, + {"matrix": [2,12], "x":12.5, "y":2.25}, + {"matrix": [2,14], "x":15.25, "y":2.25}, + {"matrix": [2,15], "x":16.25, "y":2.25}, + {"matrix": [2,16], "x":17.25, "y":2.25}, + + {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75}, + {"matrix": [3, 1], "x":1.75, "y":3.25}, + {"matrix": [3, 2], "x":2.75, "y":3.25}, + {"matrix": [3, 3], "x":3.75, "y":3.25}, + {"matrix": [3, 4], "x":4.75, "y":3.25}, + {"matrix": [3, 5], "x":5.75, "y":3.25}, + {"matrix": [3, 6], "x":6.75, "y":3.25}, + {"matrix": [3, 7], "x":7.75, "y":3.25}, + {"matrix": [3, 8], "x":8.75, "y":3.25}, + {"matrix": [3, 9], "x":9.75, "y":3.25}, + {"matrix": [3,10], "x":10.75, "y":3.25}, + {"matrix": [3,11], "x":11.75, "y":3.25}, + {"matrix": [3,12], "x":12.75, "y":3.25}, + {"matrix": [2,13], "x":13.75, "y":2.25, "w":1.25, "h":2}, + + {"matrix": [4, 0], "x":0, "y":4.25, "w":1.25}, + {"matrix": [4, 1], "x":1.25, "y":4.25}, + {"matrix": [4, 2], "x":2.25, "y":4.25}, + {"matrix": [4, 3], "x":3.25, "y":4.25}, + {"matrix": [4, 4], "x":4.25, "y":4.25}, + {"matrix": [4, 5], "x":5.25, "y":4.25}, + {"matrix": [4, 6], "x":6.25, "y":4.25}, + {"matrix": [4, 7], "x":7.25, "y":4.25}, + {"matrix": [4, 8], "x":8.25, "y":4.25}, + {"matrix": [4, 9], "x":9.25, "y":4.25}, + {"matrix": [4,10], "x":10.25, "y":4.25}, + {"matrix": [4,11], "x":11.25, "y":4.25}, + {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75}, + {"matrix": [4,13], "x":14, "y":4.25}, + {"matrix": [4,15], "x":16.25, "y":4.25}, + + {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5}, + {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5}, + {"matrix": [5, 6], "x":4, "y":5.25, "w":7}, + {"matrix": [5,11], "x":11, "y":5.25, "w":1.5}, + {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5}, + {"matrix": [5,14], "x":15.25, "y":5.25}, + {"matrix": [5,15], "x":16.25, "y":5.25}, + {"matrix": [5,16], "x":17.25, "y":5.25} + ] + }, "LAYOUT_all": { "layout": [ {"matrix": [0, 0], "x":0, "y":0}, diff --git a/keyboards/plywrks/ply8x/keymaps/default/keymap.c b/keyboards/plywrks/ply8x/solder/keymaps/default/keymap.c similarity index 100% rename from keyboards/plywrks/ply8x/keymaps/default/keymap.c rename to keyboards/plywrks/ply8x/solder/keymaps/default/keymap.c diff --git a/keyboards/plywrks/ply8x/solder/mcuconf.h b/keyboards/plywrks/ply8x/solder/mcuconf.h new file mode 100644 index 0000000000..aceb2e3dfc --- /dev/null +++ b/keyboards/plywrks/ply8x/solder/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2023 Ramon Imbao (@ramonimbao) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE From 3a8c76fae59387df3435948a424cdd0fcda7d66f Mon Sep 17 00:00:00 2001 From: mikiya418 <64995478+mikiya418@users.noreply.github.com> Date: Fri, 21 Mar 2025 06:54:54 +0900 Subject: [PATCH 237/592] Develop 5keys (#24555) * [Keyboard]Add 5keys * Add files via upload * Delete 5keys.json * Add files via upload * Delete 5keys_default.hex * Add keyboard 5keys * Add Copylight * Update keyboards/5keys/keyboard.json Co-authored-by: Drashna Jaelre * Update keyboards/5keys/keyboard.json Co-authored-by: Drashna Jaelre * Update readme.md --------- Co-authored-by: Drashna Jaelre --- keyboards/5keys/keyboard.json | 34 ++++++++++++++++++++++++ keyboards/5keys/keymaps/default/keymap.c | 21 +++++++++++++++ keyboards/5keys/readme.md | 27 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 keyboards/5keys/keyboard.json create mode 100644 keyboards/5keys/keymaps/default/keymap.c create mode 100644 keyboards/5keys/readme.md diff --git a/keyboards/5keys/keyboard.json b/keyboards/5keys/keyboard.json new file mode 100644 index 0000000000..7a40d1014d --- /dev/null +++ b/keyboards/5keys/keyboard.json @@ -0,0 +1,34 @@ +{ + "manufacturer": "mikiya418", + "keyboard_name": "5keys", + "maintainer": "mikiya418", + "development_board": "promicro", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "matrix_pins": { + "direct": [ + ["F4","F5","F6","F7","B1"] + ] + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x4D4B" + }, + "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/5keys/keymaps/default/keymap.c b/keyboards/5keys/keymaps/default/keymap.c new file mode 100644 index 0000000000..878ae4286b --- /dev/null +++ b/keyboards/5keys/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +/* Copylight 2024 mikiya418. + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + KC_WBAK, KC_WFWD, LSG_T(KC_S), G(KC_L), MO(1) + ) +}; diff --git a/keyboards/5keys/readme.md b/keyboards/5keys/readme.md new file mode 100644 index 0000000000..e14792d82b --- /dev/null +++ b/keyboards/5keys/readme.md @@ -0,0 +1,27 @@ +# 5keys + +![5keys](https://imgur.com/yOkI4HT) + +This keyboard is a macro keyboard with five keys. + +* Keyboard Maintainer: [mikiya418](https://github.com/mikiya418) +* Hardware Supported: 5keys PCBs, Pro Micro +* Hardware Availability: [Thingiverse](https://www.thingiverse.com/thing:6834908) + +Make example for this keyboard (after setting up your build environment): + + make 5keys:default + +Flashing example for this keyboard: + + make 5keys: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 7fd12c2b98f00b7e70bfc70a74654a23c2b04d16 Mon Sep 17 00:00:00 2001 From: Akshay Atam Date: Thu, 20 Mar 2025 18:00:01 -0400 Subject: [PATCH 238/592] Ducky one2mini ansi tsangan layout (#24909) * Added ANSI Tsangan keymap for Ducky One2 Mini * Updated keyboard.json to support ANSI Tsangan layout for Ducky One2 Mini --- keyboards/ducky/one2mini/1861st/keyboard.json | 69 ++++++++++++++++++ .../one2mini/keymaps/ansi_tsangan/keymap.c | 70 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c diff --git a/keyboards/ducky/one2mini/1861st/keyboard.json b/keyboards/ducky/one2mini/1861st/keyboard.json index a39945d68c..e1ab218846 100644 --- a/keyboards/ducky/one2mini/1861st/keyboard.json +++ b/keyboards/ducky/one2mini/1861st/keyboard.json @@ -235,6 +235,75 @@ {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} ] + }, + "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, 13], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 12], "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, 5], "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} + ] } } } diff --git a/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c b/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c new file mode 100644 index 0000000000..259df16ab1 --- /dev/null +++ b/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c @@ -0,0 +1,70 @@ +/* Copyright 2019 /u/KeepItUnder + * + * 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 + +// LAYERS +enum Layer { + _QWERTY = 0, // Standard QWERTY layer + _FUNCTION, // Function key layer + _COLOUR // RGB key layer +}; +#define _QW _QWERTY +#define _FN _FUNCTION +#define _CLR _COLOUR + + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────────┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬──────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴──────┤ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬────┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ Fn │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┼───┴┬────┬┴────┤ + * │Ctrl│GUI │Alt │ │Alt │GUI │Ctrl │ + * └────┴────┴────┴─────────────────────────────┴────┴────┴─────┘ + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_60_ansi_tsangan( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 + 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_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(_FN), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL + ), + + [_FUNCTION] = LAYOUT_60_ansi_tsangan( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 + 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, + _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_ENT, + _______, _______, KC_APP, _______, _______, _______, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, KC_APP, MO(_CLR), _______, KC_APP, _______, _______ + ), + + [_COLOUR] = LAYOUT_60_ansi_tsangan( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, _______, _______, _______, _______, _______, _______, _______, + _______, RM_HUED, RM_SATD, RM_VALD, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RM_TOGG, _______, _______, _______ + ), +}; From a958276a764af481f5626cafb2f0c6ec00894ff2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 20 Mar 2025 15:12:46 -0700 Subject: [PATCH 239/592] Add Super Alt-Tab macro example as module (#24970) * Add Super Alt-Tab macro example as module * Make module more configurable * remove unneeded comments Co-authored-by: jack * Update modules/qmk/super_alt_tab/super_alt_tab.c Co-authored-by: Nick Brassel --------- Co-authored-by: jack Co-authored-by: Nick Brassel --- modules/qmk/super_alt_tab/qmk_module.json | 10 +++++ modules/qmk/super_alt_tab/super_alt_tab.c | 50 +++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 modules/qmk/super_alt_tab/qmk_module.json create mode 100644 modules/qmk/super_alt_tab/super_alt_tab.c diff --git a/modules/qmk/super_alt_tab/qmk_module.json b/modules/qmk/super_alt_tab/qmk_module.json new file mode 100644 index 0000000000..002f7fb69e --- /dev/null +++ b/modules/qmk/super_alt_tab/qmk_module.json @@ -0,0 +1,10 @@ +{ + "module_name": "Super Alt Tab", + "maintainer": "QMK Maintainers", + "keycodes": [ + { + "key": "COMMUNITY_MODULE_SUPER_ALT_TAB", + "aliases": ["CM_S_AT"] + } + ] +} diff --git a/modules/qmk/super_alt_tab/super_alt_tab.c b/modules/qmk/super_alt_tab/super_alt_tab.c new file mode 100644 index 0000000000..dfeb4b5773 --- /dev/null +++ b/modules/qmk/super_alt_tab/super_alt_tab.c @@ -0,0 +1,50 @@ +// Copyright 2025 Christopher Courtney, aka Drashna Jael're (@drashna) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1, 0, 0); + +static bool is_alt_tab_active = false; +static uint16_t alt_tab_timer = 0; + +#ifndef COMMUNITY_MODULE_SUPER_ALT_TAB_TIMEOUT +# define COMMUNITY_MODULE_SUPER_ALT_TAB_TIMEOUT 1000 +#endif // COMMUNITY_MODULE_SUPER_ALT_TAB_TIMEOUT +#ifndef COMMUNITY_MODULE_SUPER_ALT_TAB_MODIFIER +# define COMMUNITY_MODULE_SUPER_ALT_TAB_MODIFIER MOD_LALT +#endif // COMMUNITY_MODULE_SUPER_ALT_TAB_MODIFIER +#ifndef COMMUNITY_MODULE_SUPER_ALT_TAB_KEY +# define COMMUNITY_MODULE_SUPER_ALT_TAB_KEY KC_TAB +#endif // COMMUNITY_MODULE_SUPER_ALT_TAB_KEY + +bool process_record_super_alt_tab(uint16_t keycode, keyrecord_t *record) { + if (!process_record_super_alt_tab_kb(keycode, record)) { + return false; + } + + switch (keycode) { // This will do most of the grunt work with the keycodes. + case COMMUNITY_MODULE_SUPER_ALT_TAB: + if (record->event.pressed) { + if (!is_alt_tab_active) { + is_alt_tab_active = true; + register_mods(COMMUNITY_MODULE_SUPER_ALT_TAB_MODIFIER); + } + alt_tab_timer = timer_read(); + register_code(COMMUNITY_MODULE_SUPER_ALT_TAB_KEY); + } else { + unregister_code(COMMUNITY_MODULE_SUPER_ALT_TAB_KEY); + } + break; + } + return true; +} + +void housekeeping_task_super_alt_tab(void) { + if (is_alt_tab_active) { + if (timer_elapsed(alt_tab_timer) > COMMUNITY_MODULE_SUPER_ALT_TAB_TIMEOUT) { + unregister_mods(COMMUNITY_MODULE_SUPER_ALT_TAB_MODIFIER); + is_alt_tab_active = false; + } + } +} From 9f44488bb172f454b231518ddccc580f05784c24 Mon Sep 17 00:00:00 2001 From: Icy Avocado Date: Thu, 20 Mar 2025 16:21:18 -0600 Subject: [PATCH 240/592] Add directpins 21 keys pico (#24919) * Add directpins 21 keys pico - https://learn.adafruit.com/diy-pico-mechanical-keyboard-with-fritzing-circuitpython/21-key-pico-keyboard * Rename from 21keys to pico_pad * Add pico_pad readme * Update bootloader instruction --------- Co-authored-by: Dai --- keyboards/adafruit/pico_pad/keyboard.json | 53 +++++++++++++++++++ .../pico_pad/keymaps/default/keymap.json | 12 +++++ keyboards/adafruit/pico_pad/readme.md | 25 +++++++++ 3 files changed, 90 insertions(+) create mode 100644 keyboards/adafruit/pico_pad/keyboard.json create mode 100644 keyboards/adafruit/pico_pad/keymaps/default/keymap.json create mode 100644 keyboards/adafruit/pico_pad/readme.md diff --git a/keyboards/adafruit/pico_pad/keyboard.json b/keyboards/adafruit/pico_pad/keyboard.json new file mode 100644 index 0000000000..aacb7a9c00 --- /dev/null +++ b/keyboards/adafruit/pico_pad/keyboard.json @@ -0,0 +1,53 @@ +{ + "manufacturer": "Raspberry Pi", + "keyboard_name": "DirectPins Pico Pad 21 keys RP2040", + "maintainer": "icyavocado", + "bootloader": "rp2040", + "usb": { + "vid": "0x2326", + "pid": "0xFEED", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true + }, + "processor": "RP2040", + "matrix_pins": { + "direct": [ + [ "GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6" ], + [ "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13"], + [ "GP14", "GP16", "GP17", "GP18", "GP19", "GP20", "GP21"] + ] + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "GP0", "x": 0, "y": 0, "matrix": [0, 0]}, + {"label": "GP1", "x": 0, "y": 1, "matrix": [0, 1]}, + {"label": "GP2", "x": 0, "y": 2, "matrix": [0, 2]}, + {"label": "GP3", "x": 0, "y": 3, "matrix": [0, 3]}, + {"label": "GP4", "x": 0, "y": 4, "matrix": [0, 4]}, + {"label": "GP5", "x": 0, "y": 5, "matrix": [0, 5]}, + {"label": "GP6", "x": 0, "y": 6, "matrix": [0, 6]}, + + {"label": "GP7", "x": 1, "y": 0, "matrix": [1, 0]}, + {"label": "GP8", "x": 1, "y": 1, "matrix": [1, 1]}, + {"label": "GP9", "x": 1, "y": 2, "matrix": [1, 2]}, + {"label": "GP10", "x": 1, "y": 3, "matrix": [1, 3]}, + {"label": "GP11", "x": 1, "y": 4, "matrix": [1, 4]}, + {"label": "GP12", "x": 1, "y": 5, "matrix": [1, 5]}, + {"label": "GP13", "x": 1, "y": 6, "matrix": [1, 6]}, + + {"label": "GP14", "x": 2, "y": 0, "matrix": [2, 0]}, + {"label": "GP16", "x": 2, "y": 1, "matrix": [2, 1]}, + {"label": "GP17", "x": 2, "y": 2, "matrix": [2, 2]}, + {"label": "GP18", "x": 2, "y": 3, "matrix": [2, 3]}, + {"label": "GP19", "x": 2, "y": 4, "matrix": [2, 4]}, + {"label": "GP20", "x": 2, "y": 5, "matrix": [2, 5]}, + {"label": "GP21", "x": 2, "y": 6, "matrix": [2, 6]} + ] + } + } +} diff --git a/keyboards/adafruit/pico_pad/keymaps/default/keymap.json b/keyboards/adafruit/pico_pad/keymaps/default/keymap.json new file mode 100644 index 0000000000..33e2979a09 --- /dev/null +++ b/keyboards/adafruit/pico_pad/keymaps/default/keymap.json @@ -0,0 +1,12 @@ +{ + "keyboard": "adafruit/pico_pad", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_A", "KC_B", "KC_C", "KC_D", "KC_E", "KC_F", "KC_G", + "KC_H", "KC_I", "KC_J", "KC_K", "KC_L", "KC_M", "KC_N", + "KC_O", "KC_P", "KC_Q", "KC_R", "KC_S", "KC_T", "KC_U" + ] + ] +} diff --git a/keyboards/adafruit/pico_pad/readme.md b/keyboards/adafruit/pico_pad/readme.md new file mode 100644 index 0000000000..4a834fbf4d --- /dev/null +++ b/keyboards/adafruit/pico_pad/readme.md @@ -0,0 +1,25 @@ +# PICO PAD + +![PICO PAD](https://imgur.com/Nl4tZPl.jpg) + +A RP2040 powered direct pins QMK keyboard in 3x7 layout. + +A guide can be found here: [Pico Mechanical Keyboard](https://learn.adafruit.com/diy-pico-mechanical-keyboard-with-fritzing-circuitpython/overview) + +* Keyboard Maintainer: [IcyAvocado](https://github.com/icyavocado) +* Hardware Supported: [Pico 1 Microcontrollers - RP2040](https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html#pico-1-family) +* Hardware Availability: [The PiHut](https://thepihut.com/products/raspberry-pi-pico) | [Adafruit Parts](https://learn.adafruit.com/diy-pico-mechanical-keyboard-with-fritzing-circuitpython/overview) + +Make example for this board (after setting up your build environment): + +```sh +qmk compile -kb adafruit/pico_pad -km default +``` + +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: +* **Physical reset button**: Briefly press the reset button on the left of the PCB - some may have pads you must short instead +* **Boot button**: Press and hold the BOOTSEL button on the pico when powered on From 894b9c458d91e0ecb5c482e8071315db8842e2b8 Mon Sep 17 00:00:00 2001 From: Max Rumpf Date: Thu, 20 Mar 2025 23:22:02 +0100 Subject: [PATCH 241/592] Enable mouse key feature and disable leader key on Maxr1998/Phoebe (#24982) * Enable mousekey support on Maxr1998/Phoebe * Add GPLv2 license header --- keyboards/maxr1998/phoebe/keyboard.json | 6 ++-- .../maxr1998/phoebe/keymaps/default/config.h | 15 ++++++++++ .../maxr1998/phoebe/keymaps/default/keymap.c | 28 +++++++++++-------- keyboards/maxr1998/phoebe/phoebe.c | 15 ++++++++++ 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/keyboards/maxr1998/phoebe/keyboard.json b/keyboards/maxr1998/phoebe/keyboard.json index 86407414fa..d678e3b74e 100644 --- a/keyboards/maxr1998/phoebe/keyboard.json +++ b/keyboards/maxr1998/phoebe/keyboard.json @@ -9,10 +9,10 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "nkro": true, - "rgblight": true, "key_lock": true, - "leader": true + "mousekey": true, + "nkro": true, + "rgblight": true }, "qmk": { "locking": { diff --git a/keyboards/maxr1998/phoebe/keymaps/default/config.h b/keyboards/maxr1998/phoebe/keymaps/default/config.h index 593ac440c1..b8f6676468 100644 --- a/keyboards/maxr1998/phoebe/keymaps/default/config.h +++ b/keyboards/maxr1998/phoebe/keymaps/default/config.h @@ -1,3 +1,18 @@ +/* Copyright 2019 Max Rumpf (@Maxr1998) + * + * 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 RSPC_KEYS KC_RSFT, KC_RALT, KC_7 diff --git a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c index 8b4f31644c..de5fe3a67c 100644 --- a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c +++ b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c @@ -1,3 +1,18 @@ +/* Copyright 2019 Max Rumpf (@Maxr1998) + * + * 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 #include "keymap_german.h" @@ -35,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, DE_PLUS, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, SC_RSPC, - KC_LCTL, KC_LGUI, KC_LALT, QK_LEAD, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, KC_LGUI, KC_LALT, KC_BTN1, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT ), /* Special characters @@ -77,7 +92,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, DE_UDIA, KC_F9, DE_ODIA, KC_PSCR, KC_DEL, QK_LOCK, DE_ADIA, DE_SS, _______, _______, G_1, _______, RGB_M_P, RGB_M_SW,RGB_M_SN,_______, _______, _______, _______, _______, _______, _______, _______, _______, UG_HUED, UG_TOGG, UG_HUEU, KC_PGUP, _______, - XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END + XXXXXXX, _______, XXXXXXX, KC_BTN2, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END ), /* Gaming @@ -128,13 +143,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; } return true; -}; - -void leader_end_user(void) { - if (leader_sequence_two_keys(KC_G, KC_P)) { - SEND_STRING("git push"); - } - if (leader_sequence_three_keys(KC_G, KC_F, KC_P)) { - SEND_STRING("git push --force-with-lease"); - } } diff --git a/keyboards/maxr1998/phoebe/phoebe.c b/keyboards/maxr1998/phoebe/phoebe.c index b05f9b3235..0451f9177e 100644 --- a/keyboards/maxr1998/phoebe/phoebe.c +++ b/keyboards/maxr1998/phoebe/phoebe.c @@ -1,3 +1,18 @@ +/* Copyright 2019 Max Rumpf (@Maxr1998) + * + * 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" const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {50, 50, 50}; From f6dbb56a10d1886945f2f79f4cc46b7bb56aeab0 Mon Sep 17 00:00:00 2001 From: uv777bk <147540311+uv777bk@users.noreply.github.com> Date: Thu, 20 Mar 2025 18:22:43 -0400 Subject: [PATCH 242/592] Update Lighting Mode Animations on Monsgeek M5 (#24981) Update keyboard.json --- keyboards/monsgeek/m5/keyboard.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/keyboards/monsgeek/m5/keyboard.json b/keyboards/monsgeek/m5/keyboard.json index b9ef0099bc..3927181e2d 100644 --- a/keyboards/monsgeek/m5/keyboard.json +++ b/keyboards/monsgeek/m5/keyboard.json @@ -49,7 +49,16 @@ "driver": "snled27351", "max_brightness": 180, "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, "cycle_all": true, "cycle_left_right": true, "cycle_up_down": true, @@ -60,12 +69,29 @@ "cycle_spiral": true, "dual_beacon": true, "rainbow_beacon": true, + "rainbow_pinwheels": true, "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_rain": true, + "pixel_flow": true, + "pixel_fractal": true, "typing_heatmap": true, + "digital_rain": true, "solid_reactive_simple": true, "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, "solid_reactive_cross": true, - "multisplash": true + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true }, "layout":[ { "flags": 4, "matrix": [0, 0], "x": 0, "y": 0 }, From f4dfa218ff924f0e9f964f81706474a765c88cc2 Mon Sep 17 00:00:00 2001 From: plodah <127351418+plodah@users.noreply.github.com> Date: Thu, 20 Mar 2025 22:34:14 +0000 Subject: [PATCH 243/592] fix swapped encoder pins on ploopy thumb rev1_001 (#25044) fix swapped pins on ploopy thumb rev1_001 encoder --- keyboards/ploopyco/trackball_thumb/rev1_001/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ploopyco/trackball_thumb/rev1_001/config.h b/keyboards/ploopyco/trackball_thumb/rev1_001/config.h index 108a104cdc..fb2f9431cc 100644 --- a/keyboards/ploopyco/trackball_thumb/rev1_001/config.h +++ b/keyboards/ploopyco/trackball_thumb/rev1_001/config.h @@ -26,5 +26,5 @@ /* PMW33XX Settings */ #define PMW33XX_CS_PIN B0 -#define ENCODER_A_PINS { F0 } -#define ENCODER_B_PINS { F4 } +#define ENCODER_A_PINS { F4 } +#define ENCODER_B_PINS { F0 } From c9d62ddc78e879053241202b288d0129073b07dc Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Fri, 21 Mar 2025 08:47:22 +0100 Subject: [PATCH 244/592] [Core] use `keycode_string` in unit tests (#25042) * tests: use keycode_string feature With a proper keycode to string implementation in qmk there is no need to use the unit tests only implementation anymore. Signed-off-by: Stefan Kerkmann * tests: remove keycode_util feature This feature is no longer used as we switched the tests to the keycode string implementation. Signed-off-by: Stefan Kerkmann --- builddefs/build_full_test.mk | 2 - lib/python/qmk/cli/__init__.py | 1 - lib/python/qmk/cli/generate/keycodes_tests.py | 39 - tests/basic/test_keycode_util.cpp | 52 -- tests/combo/combo_repress/test_combo.cpp | 2 +- tests/combo/test_combo.cpp | 1 - .../alt_repeat_key/test_alt_repeat_key.cpp | 2 +- tests/test_common/build.mk | 1 + tests/test_common/keyboard_report_util.cpp | 8 +- tests/test_common/keycode_table.cpp | 767 ------------------ tests/test_common/keycode_util.cpp | 130 --- tests/test_common/keycode_util.hpp | 6 - tests/test_common/test_driver.hpp | 8 +- tests/test_common/test_keymap_key.hpp | 6 +- util/regen.sh | 1 - 15 files changed, 17 insertions(+), 1009 deletions(-) delete mode 100644 lib/python/qmk/cli/generate/keycodes_tests.py delete mode 100644 tests/basic/test_keycode_util.cpp delete mode 100644 tests/test_common/keycode_table.cpp delete mode 100644 tests/test_common/keycode_util.cpp delete mode 100644 tests/test_common/keycode_util.hpp diff --git a/builddefs/build_full_test.mk b/builddefs/build_full_test.mk index 5cae327c6c..82bb9387a6 100644 --- a/builddefs/build_full_test.mk +++ b/builddefs/build_full_test.mk @@ -25,8 +25,6 @@ $(TEST_OUTPUT)_SRC := \ tests/test_common/test_driver.cpp \ tests/test_common/keyboard_report_util.cpp \ tests/test_common/mouse_report_util.cpp \ - tests/test_common/keycode_util.cpp \ - tests/test_common/keycode_table.cpp \ tests/test_common/test_fixture.cpp \ tests/test_common/test_keymap_key.cpp \ tests/test_common/test_logger.cpp \ diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index cb949d9a71..26905ec134 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -58,7 +58,6 @@ subcommands = [ 'qmk.cli.generate.keyboard_c', 'qmk.cli.generate.keyboard_h', 'qmk.cli.generate.keycodes', - 'qmk.cli.generate.keycodes_tests', 'qmk.cli.generate.keymap_h', 'qmk.cli.generate.make_dependencies', 'qmk.cli.generate.rgb_breathe_table', diff --git a/lib/python/qmk/cli/generate/keycodes_tests.py b/lib/python/qmk/cli/generate/keycodes_tests.py deleted file mode 100644 index 453b4693a7..0000000000 --- a/lib/python/qmk/cli/generate/keycodes_tests.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Used by the make system to generate a keycode lookup table from keycodes_{version}.json -""" -from milc import cli - -from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE -from qmk.commands import dump_lines -from qmk.path import normpath -from qmk.keycodes import load_spec - - -def _generate_defines(lines, keycodes): - lines.append('') - lines.append('std::map KEYCODE_ID_TABLE = {') - for key, value in keycodes["keycodes"].items(): - lines.append(f' {{{value.get("key")}, "{value.get("key")}"}},') - lines.append('};') - - -@cli.argument('-v', '--version', arg_only=True, required=True, help='Version of keycodes to generate.') -@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') -@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") -@cli.subcommand('Used by the make system to generate a keycode lookup table from keycodes_{version}.json', hidden=True) -def generate_keycodes_tests(cli): - """Generates a keycode to identifier lookup table for unit test output. - """ - - # Build the keycodes.h file. - keycodes_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '// clang-format off'] - keycodes_h_lines.append('extern "C" {\n#include \n}') - keycodes_h_lines.append('#include ') - keycodes_h_lines.append('#include ') - keycodes_h_lines.append('#include ') - - keycodes = load_spec(cli.args.version) - - _generate_defines(keycodes_h_lines, keycodes) - - # Show the results - dump_lines(cli.args.output, keycodes_h_lines, cli.args.quiet) diff --git a/tests/basic/test_keycode_util.cpp b/tests/basic/test_keycode_util.cpp deleted file mode 100644 index 693334676e..0000000000 --- a/tests/basic/test_keycode_util.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2022 Stefan Kerkmann -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "test_common.hpp" - -class KeycodeToIdentifierSuite : public ::testing::TestWithParam> {}; - -TEST_P(KeycodeToIdentifierSuite, ConversionTests) { - ASSERT_EQ(get_keycode_identifier_or_default(GetParam().first), GetParam().second); -} - -INSTANTIATE_TEST_CASE_P(ConversionTestsP, KeycodeToIdentifierSuite, - // clang-format off -::testing::Values( - // Goto layer - std::make_pair(TO(0), "TO(0)"), - std::make_pair(TO(0x1F), "TO(31)"), - // Momentary switch layer - std::make_pair(MO(0), "MO(0)"), - std::make_pair(MO(0x1F), "MO(31)"), - // Set default layer - std::make_pair(DF(0), "DF(0)"), - std::make_pair(DF(0x1F), "DF(31)"), - // Toggle layer - std::make_pair(TG(0), "TG(0)"), - std::make_pair(TG(0x1F), "TG(31)"), - // One-shot layer - std::make_pair(OSL(0), "OSL(0)"), - std::make_pair(OSL(0x1F), "OSL(31)"), - // One-shot mod - std::make_pair(OSM(MOD_LSFT), "OSM(MOD_LSFT)"), - std::make_pair(OSM(MOD_LSFT | MOD_LCTL), "OSM(MOD_LCTL | MOD_LSFT)"), - // Layer Mod - std::make_pair(LM(0, MOD_LSFT), "LM(0, MOD_LSFT)"), - std::make_pair(LM(0xF, MOD_LSFT), "LM(15, MOD_LSFT)"), - std::make_pair(LM(0xF, MOD_LSFT | MOD_LCTL), "LM(15, MOD_LCTL | MOD_LSFT)"), - // Layer tap toggle - std::make_pair(TT(0), "TT(0)"), - std::make_pair(TT(0x1F), "TT(31)"), - // Layer tap - std::make_pair(LT(0, KC_A), "LT(0, KC_A)"), - std::make_pair(LT(0xF, KC_SPACE), "LT(15, KC_SPACE)"), - std::make_pair(LT(1, KC_SPC), "LT(1, KC_SPACE)"), - // Mod tap - std::make_pair(MT(MOD_LCTL, KC_A), "MT(MOD_LCTL, KC_A)"), - std::make_pair(MT(MOD_LCTL | MOD_LSFT, KC_A), "MT(MOD_LCTL | MOD_LSFT, KC_A)"), - std::make_pair(ALT_T(KC_TAB), "MT(MOD_LALT, KC_TAB)"), - // Mods - std::make_pair(LCTL(KC_A), "QK_MODS(KC_A, QK_LCTL)"), - std::make_pair(HYPR(KC_SPACE), "QK_MODS(KC_SPACE, QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI)") -)); -// clang-format on diff --git a/tests/combo/combo_repress/test_combo.cpp b/tests/combo/combo_repress/test_combo.cpp index 1488d5c1bd..b1a2d36cb3 100644 --- a/tests/combo/combo_repress/test_combo.cpp +++ b/tests/combo/combo_repress/test_combo.cpp @@ -2,9 +2,9 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "keyboard_report_util.hpp" -#include "quantum.h" #include "keycode.h" #include "test_common.h" +#include "test_common.hpp" #include "test_driver.hpp" #include "test_fixture.hpp" #include "test_keymap_key.hpp" diff --git a/tests/combo/test_combo.cpp b/tests/combo/test_combo.cpp index ac852f9d16..d78ec55990 100644 --- a/tests/combo/test_combo.cpp +++ b/tests/combo/test_combo.cpp @@ -3,7 +3,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "keyboard_report_util.hpp" -#include "quantum.h" #include "keycode.h" #include "test_common.h" #include "test_driver.hpp" diff --git a/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp b/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp index ae525acb45..e2eed3dbb6 100644 --- a/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp +++ b/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp @@ -210,7 +210,7 @@ TEST_F(AltRepeatKey, GetAltRepeatKeyKeycode) { {MO(1), 0, KC_NO}, // clang-format on })) { - SCOPED_TRACE(std::string("Input keycode: ") + get_keycode_identifier_or_default(params.keycode)); + SCOPED_TRACE(std::string("Input keycode: ") + get_keycode_string(params.keycode)); set_last_keycode(params.keycode); set_last_mods(params.mods); diff --git a/tests/test_common/build.mk b/tests/test_common/build.mk index d7423bc78a..385da7adf9 100644 --- a/tests/test_common/build.mk +++ b/tests/test_common/build.mk @@ -14,3 +14,4 @@ # along with this program. If not, see . CUSTOM_MATRIX=yes +KEYCODE_STRING_ENABLE = yes diff --git a/tests/test_common/keyboard_report_util.cpp b/tests/test_common/keyboard_report_util.cpp index 18e0574277..5e40323669 100644 --- a/tests/test_common/keyboard_report_util.cpp +++ b/tests/test_common/keyboard_report_util.cpp @@ -19,6 +19,10 @@ #include #include +extern "C" { +#include "keycode_string.h" +} + using namespace testing; extern std::map KEYCODE_ID_TABLE; @@ -72,7 +76,7 @@ std::ostream& operator<<(std::ostream& os, const report_keyboard_t& report) { os << "("; for (auto key = keys.cbegin(); key != keys.cend();) { - os << KEYCODE_ID_TABLE.at(*key); + os << get_keycode_string(*key); key++; if (key != keys.cend()) { os << ", "; @@ -82,7 +86,7 @@ std::ostream& operator<<(std::ostream& os, const report_keyboard_t& report) { os << ") ["; for (auto mod = mods.cbegin(); mod != mods.cend();) { - os << KEYCODE_ID_TABLE.at(*mod); + os << get_keycode_string(*mod); mod++; if (mod != mods.cend()) { os << ", "; diff --git a/tests/test_common/keycode_table.cpp b/tests/test_common/keycode_table.cpp deleted file mode 100644 index 26d0919619..0000000000 --- a/tests/test_common/keycode_table.cpp +++ /dev/null @@ -1,767 +0,0 @@ -// Copyright 2025 QMK -// SPDX-License-Identifier: GPL-2.0-or-later - -/******************************************************************************* - 88888888888 888 d8b .d888 d8b 888 d8b - 888 888 Y8P d88P" Y8P 888 Y8P - 888 888 888 888 - 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b - 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K - 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b. - 888 888 888 888 X88 888 888 888 Y8b. 888 X88 - 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P' - 888 888 - 888 888 - 888 888 - .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888 - d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888 - 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888 - Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888 - "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888 - 888 - Y8b d88P - "Y88P" -*******************************************************************************/ - -// clang-format off -extern "C" { -#include -} -#include -#include -#include - -std::map KEYCODE_ID_TABLE = { - {KC_NO, "KC_NO"}, - {KC_TRANSPARENT, "KC_TRANSPARENT"}, - {KC_A, "KC_A"}, - {KC_B, "KC_B"}, - {KC_C, "KC_C"}, - {KC_D, "KC_D"}, - {KC_E, "KC_E"}, - {KC_F, "KC_F"}, - {KC_G, "KC_G"}, - {KC_H, "KC_H"}, - {KC_I, "KC_I"}, - {KC_J, "KC_J"}, - {KC_K, "KC_K"}, - {KC_L, "KC_L"}, - {KC_M, "KC_M"}, - {KC_N, "KC_N"}, - {KC_O, "KC_O"}, - {KC_P, "KC_P"}, - {KC_Q, "KC_Q"}, - {KC_R, "KC_R"}, - {KC_S, "KC_S"}, - {KC_T, "KC_T"}, - {KC_U, "KC_U"}, - {KC_V, "KC_V"}, - {KC_W, "KC_W"}, - {KC_X, "KC_X"}, - {KC_Y, "KC_Y"}, - {KC_Z, "KC_Z"}, - {KC_1, "KC_1"}, - {KC_2, "KC_2"}, - {KC_3, "KC_3"}, - {KC_4, "KC_4"}, - {KC_5, "KC_5"}, - {KC_6, "KC_6"}, - {KC_7, "KC_7"}, - {KC_8, "KC_8"}, - {KC_9, "KC_9"}, - {KC_0, "KC_0"}, - {KC_ENTER, "KC_ENTER"}, - {KC_ESCAPE, "KC_ESCAPE"}, - {KC_BACKSPACE, "KC_BACKSPACE"}, - {KC_TAB, "KC_TAB"}, - {KC_SPACE, "KC_SPACE"}, - {KC_MINUS, "KC_MINUS"}, - {KC_EQUAL, "KC_EQUAL"}, - {KC_LEFT_BRACKET, "KC_LEFT_BRACKET"}, - {KC_RIGHT_BRACKET, "KC_RIGHT_BRACKET"}, - {KC_BACKSLASH, "KC_BACKSLASH"}, - {KC_NONUS_HASH, "KC_NONUS_HASH"}, - {KC_SEMICOLON, "KC_SEMICOLON"}, - {KC_QUOTE, "KC_QUOTE"}, - {KC_GRAVE, "KC_GRAVE"}, - {KC_COMMA, "KC_COMMA"}, - {KC_DOT, "KC_DOT"}, - {KC_SLASH, "KC_SLASH"}, - {KC_CAPS_LOCK, "KC_CAPS_LOCK"}, - {KC_F1, "KC_F1"}, - {KC_F2, "KC_F2"}, - {KC_F3, "KC_F3"}, - {KC_F4, "KC_F4"}, - {KC_F5, "KC_F5"}, - {KC_F6, "KC_F6"}, - {KC_F7, "KC_F7"}, - {KC_F8, "KC_F8"}, - {KC_F9, "KC_F9"}, - {KC_F10, "KC_F10"}, - {KC_F11, "KC_F11"}, - {KC_F12, "KC_F12"}, - {KC_PRINT_SCREEN, "KC_PRINT_SCREEN"}, - {KC_SCROLL_LOCK, "KC_SCROLL_LOCK"}, - {KC_PAUSE, "KC_PAUSE"}, - {KC_INSERT, "KC_INSERT"}, - {KC_HOME, "KC_HOME"}, - {KC_PAGE_UP, "KC_PAGE_UP"}, - {KC_DELETE, "KC_DELETE"}, - {KC_END, "KC_END"}, - {KC_PAGE_DOWN, "KC_PAGE_DOWN"}, - {KC_RIGHT, "KC_RIGHT"}, - {KC_LEFT, "KC_LEFT"}, - {KC_DOWN, "KC_DOWN"}, - {KC_UP, "KC_UP"}, - {KC_NUM_LOCK, "KC_NUM_LOCK"}, - {KC_KP_SLASH, "KC_KP_SLASH"}, - {KC_KP_ASTERISK, "KC_KP_ASTERISK"}, - {KC_KP_MINUS, "KC_KP_MINUS"}, - {KC_KP_PLUS, "KC_KP_PLUS"}, - {KC_KP_ENTER, "KC_KP_ENTER"}, - {KC_KP_1, "KC_KP_1"}, - {KC_KP_2, "KC_KP_2"}, - {KC_KP_3, "KC_KP_3"}, - {KC_KP_4, "KC_KP_4"}, - {KC_KP_5, "KC_KP_5"}, - {KC_KP_6, "KC_KP_6"}, - {KC_KP_7, "KC_KP_7"}, - {KC_KP_8, "KC_KP_8"}, - {KC_KP_9, "KC_KP_9"}, - {KC_KP_0, "KC_KP_0"}, - {KC_KP_DOT, "KC_KP_DOT"}, - {KC_NONUS_BACKSLASH, "KC_NONUS_BACKSLASH"}, - {KC_APPLICATION, "KC_APPLICATION"}, - {KC_KB_POWER, "KC_KB_POWER"}, - {KC_KP_EQUAL, "KC_KP_EQUAL"}, - {KC_F13, "KC_F13"}, - {KC_F14, "KC_F14"}, - {KC_F15, "KC_F15"}, - {KC_F16, "KC_F16"}, - {KC_F17, "KC_F17"}, - {KC_F18, "KC_F18"}, - {KC_F19, "KC_F19"}, - {KC_F20, "KC_F20"}, - {KC_F21, "KC_F21"}, - {KC_F22, "KC_F22"}, - {KC_F23, "KC_F23"}, - {KC_F24, "KC_F24"}, - {KC_EXECUTE, "KC_EXECUTE"}, - {KC_HELP, "KC_HELP"}, - {KC_MENU, "KC_MENU"}, - {KC_SELECT, "KC_SELECT"}, - {KC_STOP, "KC_STOP"}, - {KC_AGAIN, "KC_AGAIN"}, - {KC_UNDO, "KC_UNDO"}, - {KC_CUT, "KC_CUT"}, - {KC_COPY, "KC_COPY"}, - {KC_PASTE, "KC_PASTE"}, - {KC_FIND, "KC_FIND"}, - {KC_KB_MUTE, "KC_KB_MUTE"}, - {KC_KB_VOLUME_UP, "KC_KB_VOLUME_UP"}, - {KC_KB_VOLUME_DOWN, "KC_KB_VOLUME_DOWN"}, - {KC_LOCKING_CAPS_LOCK, "KC_LOCKING_CAPS_LOCK"}, - {KC_LOCKING_NUM_LOCK, "KC_LOCKING_NUM_LOCK"}, - {KC_LOCKING_SCROLL_LOCK, "KC_LOCKING_SCROLL_LOCK"}, - {KC_KP_COMMA, "KC_KP_COMMA"}, - {KC_KP_EQUAL_AS400, "KC_KP_EQUAL_AS400"}, - {KC_INTERNATIONAL_1, "KC_INTERNATIONAL_1"}, - {KC_INTERNATIONAL_2, "KC_INTERNATIONAL_2"}, - {KC_INTERNATIONAL_3, "KC_INTERNATIONAL_3"}, - {KC_INTERNATIONAL_4, "KC_INTERNATIONAL_4"}, - {KC_INTERNATIONAL_5, "KC_INTERNATIONAL_5"}, - {KC_INTERNATIONAL_6, "KC_INTERNATIONAL_6"}, - {KC_INTERNATIONAL_7, "KC_INTERNATIONAL_7"}, - {KC_INTERNATIONAL_8, "KC_INTERNATIONAL_8"}, - {KC_INTERNATIONAL_9, "KC_INTERNATIONAL_9"}, - {KC_LANGUAGE_1, "KC_LANGUAGE_1"}, - {KC_LANGUAGE_2, "KC_LANGUAGE_2"}, - {KC_LANGUAGE_3, "KC_LANGUAGE_3"}, - {KC_LANGUAGE_4, "KC_LANGUAGE_4"}, - {KC_LANGUAGE_5, "KC_LANGUAGE_5"}, - {KC_LANGUAGE_6, "KC_LANGUAGE_6"}, - {KC_LANGUAGE_7, "KC_LANGUAGE_7"}, - {KC_LANGUAGE_8, "KC_LANGUAGE_8"}, - {KC_LANGUAGE_9, "KC_LANGUAGE_9"}, - {KC_ALTERNATE_ERASE, "KC_ALTERNATE_ERASE"}, - {KC_SYSTEM_REQUEST, "KC_SYSTEM_REQUEST"}, - {KC_CANCEL, "KC_CANCEL"}, - {KC_CLEAR, "KC_CLEAR"}, - {KC_PRIOR, "KC_PRIOR"}, - {KC_RETURN, "KC_RETURN"}, - {KC_SEPARATOR, "KC_SEPARATOR"}, - {KC_OUT, "KC_OUT"}, - {KC_OPER, "KC_OPER"}, - {KC_CLEAR_AGAIN, "KC_CLEAR_AGAIN"}, - {KC_CRSEL, "KC_CRSEL"}, - {KC_EXSEL, "KC_EXSEL"}, - {KC_SYSTEM_POWER, "KC_SYSTEM_POWER"}, - {KC_SYSTEM_SLEEP, "KC_SYSTEM_SLEEP"}, - {KC_SYSTEM_WAKE, "KC_SYSTEM_WAKE"}, - {KC_AUDIO_MUTE, "KC_AUDIO_MUTE"}, - {KC_AUDIO_VOL_UP, "KC_AUDIO_VOL_UP"}, - {KC_AUDIO_VOL_DOWN, "KC_AUDIO_VOL_DOWN"}, - {KC_MEDIA_NEXT_TRACK, "KC_MEDIA_NEXT_TRACK"}, - {KC_MEDIA_PREV_TRACK, "KC_MEDIA_PREV_TRACK"}, - {KC_MEDIA_STOP, "KC_MEDIA_STOP"}, - {KC_MEDIA_PLAY_PAUSE, "KC_MEDIA_PLAY_PAUSE"}, - {KC_MEDIA_SELECT, "KC_MEDIA_SELECT"}, - {KC_MEDIA_EJECT, "KC_MEDIA_EJECT"}, - {KC_MAIL, "KC_MAIL"}, - {KC_CALCULATOR, "KC_CALCULATOR"}, - {KC_MY_COMPUTER, "KC_MY_COMPUTER"}, - {KC_WWW_SEARCH, "KC_WWW_SEARCH"}, - {KC_WWW_HOME, "KC_WWW_HOME"}, - {KC_WWW_BACK, "KC_WWW_BACK"}, - {KC_WWW_FORWARD, "KC_WWW_FORWARD"}, - {KC_WWW_STOP, "KC_WWW_STOP"}, - {KC_WWW_REFRESH, "KC_WWW_REFRESH"}, - {KC_WWW_FAVORITES, "KC_WWW_FAVORITES"}, - {KC_MEDIA_FAST_FORWARD, "KC_MEDIA_FAST_FORWARD"}, - {KC_MEDIA_REWIND, "KC_MEDIA_REWIND"}, - {KC_BRIGHTNESS_UP, "KC_BRIGHTNESS_UP"}, - {KC_BRIGHTNESS_DOWN, "KC_BRIGHTNESS_DOWN"}, - {KC_CONTROL_PANEL, "KC_CONTROL_PANEL"}, - {KC_ASSISTANT, "KC_ASSISTANT"}, - {KC_MISSION_CONTROL, "KC_MISSION_CONTROL"}, - {KC_LAUNCHPAD, "KC_LAUNCHPAD"}, - {QK_MOUSE_CURSOR_UP, "QK_MOUSE_CURSOR_UP"}, - {QK_MOUSE_CURSOR_DOWN, "QK_MOUSE_CURSOR_DOWN"}, - {QK_MOUSE_CURSOR_LEFT, "QK_MOUSE_CURSOR_LEFT"}, - {QK_MOUSE_CURSOR_RIGHT, "QK_MOUSE_CURSOR_RIGHT"}, - {QK_MOUSE_BUTTON_1, "QK_MOUSE_BUTTON_1"}, - {QK_MOUSE_BUTTON_2, "QK_MOUSE_BUTTON_2"}, - {QK_MOUSE_BUTTON_3, "QK_MOUSE_BUTTON_3"}, - {QK_MOUSE_BUTTON_4, "QK_MOUSE_BUTTON_4"}, - {QK_MOUSE_BUTTON_5, "QK_MOUSE_BUTTON_5"}, - {QK_MOUSE_BUTTON_6, "QK_MOUSE_BUTTON_6"}, - {QK_MOUSE_BUTTON_7, "QK_MOUSE_BUTTON_7"}, - {QK_MOUSE_BUTTON_8, "QK_MOUSE_BUTTON_8"}, - {QK_MOUSE_WHEEL_UP, "QK_MOUSE_WHEEL_UP"}, - {QK_MOUSE_WHEEL_DOWN, "QK_MOUSE_WHEEL_DOWN"}, - {QK_MOUSE_WHEEL_LEFT, "QK_MOUSE_WHEEL_LEFT"}, - {QK_MOUSE_WHEEL_RIGHT, "QK_MOUSE_WHEEL_RIGHT"}, - {QK_MOUSE_ACCELERATION_0, "QK_MOUSE_ACCELERATION_0"}, - {QK_MOUSE_ACCELERATION_1, "QK_MOUSE_ACCELERATION_1"}, - {QK_MOUSE_ACCELERATION_2, "QK_MOUSE_ACCELERATION_2"}, - {KC_LEFT_CTRL, "KC_LEFT_CTRL"}, - {KC_LEFT_SHIFT, "KC_LEFT_SHIFT"}, - {KC_LEFT_ALT, "KC_LEFT_ALT"}, - {KC_LEFT_GUI, "KC_LEFT_GUI"}, - {KC_RIGHT_CTRL, "KC_RIGHT_CTRL"}, - {KC_RIGHT_SHIFT, "KC_RIGHT_SHIFT"}, - {KC_RIGHT_ALT, "KC_RIGHT_ALT"}, - {KC_RIGHT_GUI, "KC_RIGHT_GUI"}, - {QK_SWAP_HANDS_TOGGLE, "QK_SWAP_HANDS_TOGGLE"}, - {QK_SWAP_HANDS_TAP_TOGGLE, "QK_SWAP_HANDS_TAP_TOGGLE"}, - {QK_SWAP_HANDS_MOMENTARY_ON, "QK_SWAP_HANDS_MOMENTARY_ON"}, - {QK_SWAP_HANDS_MOMENTARY_OFF, "QK_SWAP_HANDS_MOMENTARY_OFF"}, - {QK_SWAP_HANDS_OFF, "QK_SWAP_HANDS_OFF"}, - {QK_SWAP_HANDS_ON, "QK_SWAP_HANDS_ON"}, - {QK_SWAP_HANDS_ONE_SHOT, "QK_SWAP_HANDS_ONE_SHOT"}, - {QK_MAGIC_SWAP_CONTROL_CAPS_LOCK, "QK_MAGIC_SWAP_CONTROL_CAPS_LOCK"}, - {QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK, "QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK"}, - {QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK, "QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK"}, - {QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF, "QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF"}, - {QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON, "QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON"}, - {QK_MAGIC_SWAP_LALT_LGUI, "QK_MAGIC_SWAP_LALT_LGUI"}, - {QK_MAGIC_UNSWAP_LALT_LGUI, "QK_MAGIC_UNSWAP_LALT_LGUI"}, - {QK_MAGIC_SWAP_RALT_RGUI, "QK_MAGIC_SWAP_RALT_RGUI"}, - {QK_MAGIC_UNSWAP_RALT_RGUI, "QK_MAGIC_UNSWAP_RALT_RGUI"}, - {QK_MAGIC_GUI_ON, "QK_MAGIC_GUI_ON"}, - {QK_MAGIC_GUI_OFF, "QK_MAGIC_GUI_OFF"}, - {QK_MAGIC_TOGGLE_GUI, "QK_MAGIC_TOGGLE_GUI"}, - {QK_MAGIC_SWAP_GRAVE_ESC, "QK_MAGIC_SWAP_GRAVE_ESC"}, - {QK_MAGIC_UNSWAP_GRAVE_ESC, "QK_MAGIC_UNSWAP_GRAVE_ESC"}, - {QK_MAGIC_SWAP_BACKSLASH_BACKSPACE, "QK_MAGIC_SWAP_BACKSLASH_BACKSPACE"}, - {QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE, "QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE"}, - {QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE, "QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE"}, - {QK_MAGIC_NKRO_ON, "QK_MAGIC_NKRO_ON"}, - {QK_MAGIC_NKRO_OFF, "QK_MAGIC_NKRO_OFF"}, - {QK_MAGIC_TOGGLE_NKRO, "QK_MAGIC_TOGGLE_NKRO"}, - {QK_MAGIC_SWAP_ALT_GUI, "QK_MAGIC_SWAP_ALT_GUI"}, - {QK_MAGIC_UNSWAP_ALT_GUI, "QK_MAGIC_UNSWAP_ALT_GUI"}, - {QK_MAGIC_TOGGLE_ALT_GUI, "QK_MAGIC_TOGGLE_ALT_GUI"}, - {QK_MAGIC_SWAP_LCTL_LGUI, "QK_MAGIC_SWAP_LCTL_LGUI"}, - {QK_MAGIC_UNSWAP_LCTL_LGUI, "QK_MAGIC_UNSWAP_LCTL_LGUI"}, - {QK_MAGIC_SWAP_RCTL_RGUI, "QK_MAGIC_SWAP_RCTL_RGUI"}, - {QK_MAGIC_UNSWAP_RCTL_RGUI, "QK_MAGIC_UNSWAP_RCTL_RGUI"}, - {QK_MAGIC_SWAP_CTL_GUI, "QK_MAGIC_SWAP_CTL_GUI"}, - {QK_MAGIC_UNSWAP_CTL_GUI, "QK_MAGIC_UNSWAP_CTL_GUI"}, - {QK_MAGIC_TOGGLE_CTL_GUI, "QK_MAGIC_TOGGLE_CTL_GUI"}, - {QK_MAGIC_EE_HANDS_LEFT, "QK_MAGIC_EE_HANDS_LEFT"}, - {QK_MAGIC_EE_HANDS_RIGHT, "QK_MAGIC_EE_HANDS_RIGHT"}, - {QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK, "QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK"}, - {QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK, "QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK"}, - {QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK, "QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK"}, - {QK_MIDI_ON, "QK_MIDI_ON"}, - {QK_MIDI_OFF, "QK_MIDI_OFF"}, - {QK_MIDI_TOGGLE, "QK_MIDI_TOGGLE"}, - {QK_MIDI_NOTE_C_0, "QK_MIDI_NOTE_C_0"}, - {QK_MIDI_NOTE_C_SHARP_0, "QK_MIDI_NOTE_C_SHARP_0"}, - {QK_MIDI_NOTE_D_0, "QK_MIDI_NOTE_D_0"}, - {QK_MIDI_NOTE_D_SHARP_0, "QK_MIDI_NOTE_D_SHARP_0"}, - {QK_MIDI_NOTE_E_0, "QK_MIDI_NOTE_E_0"}, - {QK_MIDI_NOTE_F_0, "QK_MIDI_NOTE_F_0"}, - {QK_MIDI_NOTE_F_SHARP_0, "QK_MIDI_NOTE_F_SHARP_0"}, - {QK_MIDI_NOTE_G_0, "QK_MIDI_NOTE_G_0"}, - {QK_MIDI_NOTE_G_SHARP_0, "QK_MIDI_NOTE_G_SHARP_0"}, - {QK_MIDI_NOTE_A_0, "QK_MIDI_NOTE_A_0"}, - {QK_MIDI_NOTE_A_SHARP_0, "QK_MIDI_NOTE_A_SHARP_0"}, - {QK_MIDI_NOTE_B_0, "QK_MIDI_NOTE_B_0"}, - {QK_MIDI_NOTE_C_1, "QK_MIDI_NOTE_C_1"}, - {QK_MIDI_NOTE_C_SHARP_1, "QK_MIDI_NOTE_C_SHARP_1"}, - {QK_MIDI_NOTE_D_1, "QK_MIDI_NOTE_D_1"}, - {QK_MIDI_NOTE_D_SHARP_1, "QK_MIDI_NOTE_D_SHARP_1"}, - {QK_MIDI_NOTE_E_1, "QK_MIDI_NOTE_E_1"}, - {QK_MIDI_NOTE_F_1, "QK_MIDI_NOTE_F_1"}, - {QK_MIDI_NOTE_F_SHARP_1, "QK_MIDI_NOTE_F_SHARP_1"}, - {QK_MIDI_NOTE_G_1, "QK_MIDI_NOTE_G_1"}, - {QK_MIDI_NOTE_G_SHARP_1, "QK_MIDI_NOTE_G_SHARP_1"}, - {QK_MIDI_NOTE_A_1, "QK_MIDI_NOTE_A_1"}, - {QK_MIDI_NOTE_A_SHARP_1, "QK_MIDI_NOTE_A_SHARP_1"}, - {QK_MIDI_NOTE_B_1, "QK_MIDI_NOTE_B_1"}, - {QK_MIDI_NOTE_C_2, "QK_MIDI_NOTE_C_2"}, - {QK_MIDI_NOTE_C_SHARP_2, "QK_MIDI_NOTE_C_SHARP_2"}, - {QK_MIDI_NOTE_D_2, "QK_MIDI_NOTE_D_2"}, - {QK_MIDI_NOTE_D_SHARP_2, "QK_MIDI_NOTE_D_SHARP_2"}, - {QK_MIDI_NOTE_E_2, "QK_MIDI_NOTE_E_2"}, - {QK_MIDI_NOTE_F_2, "QK_MIDI_NOTE_F_2"}, - {QK_MIDI_NOTE_F_SHARP_2, "QK_MIDI_NOTE_F_SHARP_2"}, - {QK_MIDI_NOTE_G_2, "QK_MIDI_NOTE_G_2"}, - {QK_MIDI_NOTE_G_SHARP_2, "QK_MIDI_NOTE_G_SHARP_2"}, - {QK_MIDI_NOTE_A_2, "QK_MIDI_NOTE_A_2"}, - {QK_MIDI_NOTE_A_SHARP_2, "QK_MIDI_NOTE_A_SHARP_2"}, - {QK_MIDI_NOTE_B_2, "QK_MIDI_NOTE_B_2"}, - {QK_MIDI_NOTE_C_3, "QK_MIDI_NOTE_C_3"}, - {QK_MIDI_NOTE_C_SHARP_3, "QK_MIDI_NOTE_C_SHARP_3"}, - {QK_MIDI_NOTE_D_3, "QK_MIDI_NOTE_D_3"}, - {QK_MIDI_NOTE_D_SHARP_3, "QK_MIDI_NOTE_D_SHARP_3"}, - {QK_MIDI_NOTE_E_3, "QK_MIDI_NOTE_E_3"}, - {QK_MIDI_NOTE_F_3, "QK_MIDI_NOTE_F_3"}, - {QK_MIDI_NOTE_F_SHARP_3, "QK_MIDI_NOTE_F_SHARP_3"}, - {QK_MIDI_NOTE_G_3, "QK_MIDI_NOTE_G_3"}, - {QK_MIDI_NOTE_G_SHARP_3, "QK_MIDI_NOTE_G_SHARP_3"}, - {QK_MIDI_NOTE_A_3, "QK_MIDI_NOTE_A_3"}, - {QK_MIDI_NOTE_A_SHARP_3, "QK_MIDI_NOTE_A_SHARP_3"}, - {QK_MIDI_NOTE_B_3, "QK_MIDI_NOTE_B_3"}, - {QK_MIDI_NOTE_C_4, "QK_MIDI_NOTE_C_4"}, - {QK_MIDI_NOTE_C_SHARP_4, "QK_MIDI_NOTE_C_SHARP_4"}, - {QK_MIDI_NOTE_D_4, "QK_MIDI_NOTE_D_4"}, - {QK_MIDI_NOTE_D_SHARP_4, "QK_MIDI_NOTE_D_SHARP_4"}, - {QK_MIDI_NOTE_E_4, "QK_MIDI_NOTE_E_4"}, - {QK_MIDI_NOTE_F_4, "QK_MIDI_NOTE_F_4"}, - {QK_MIDI_NOTE_F_SHARP_4, "QK_MIDI_NOTE_F_SHARP_4"}, - {QK_MIDI_NOTE_G_4, "QK_MIDI_NOTE_G_4"}, - {QK_MIDI_NOTE_G_SHARP_4, "QK_MIDI_NOTE_G_SHARP_4"}, - {QK_MIDI_NOTE_A_4, "QK_MIDI_NOTE_A_4"}, - {QK_MIDI_NOTE_A_SHARP_4, "QK_MIDI_NOTE_A_SHARP_4"}, - {QK_MIDI_NOTE_B_4, "QK_MIDI_NOTE_B_4"}, - {QK_MIDI_NOTE_C_5, "QK_MIDI_NOTE_C_5"}, - {QK_MIDI_NOTE_C_SHARP_5, "QK_MIDI_NOTE_C_SHARP_5"}, - {QK_MIDI_NOTE_D_5, "QK_MIDI_NOTE_D_5"}, - {QK_MIDI_NOTE_D_SHARP_5, "QK_MIDI_NOTE_D_SHARP_5"}, - {QK_MIDI_NOTE_E_5, "QK_MIDI_NOTE_E_5"}, - {QK_MIDI_NOTE_F_5, "QK_MIDI_NOTE_F_5"}, - {QK_MIDI_NOTE_F_SHARP_5, "QK_MIDI_NOTE_F_SHARP_5"}, - {QK_MIDI_NOTE_G_5, "QK_MIDI_NOTE_G_5"}, - {QK_MIDI_NOTE_G_SHARP_5, "QK_MIDI_NOTE_G_SHARP_5"}, - {QK_MIDI_NOTE_A_5, "QK_MIDI_NOTE_A_5"}, - {QK_MIDI_NOTE_A_SHARP_5, "QK_MIDI_NOTE_A_SHARP_5"}, - {QK_MIDI_NOTE_B_5, "QK_MIDI_NOTE_B_5"}, - {QK_MIDI_OCTAVE_N2, "QK_MIDI_OCTAVE_N2"}, - {QK_MIDI_OCTAVE_N1, "QK_MIDI_OCTAVE_N1"}, - {QK_MIDI_OCTAVE_0, "QK_MIDI_OCTAVE_0"}, - {QK_MIDI_OCTAVE_1, "QK_MIDI_OCTAVE_1"}, - {QK_MIDI_OCTAVE_2, "QK_MIDI_OCTAVE_2"}, - {QK_MIDI_OCTAVE_3, "QK_MIDI_OCTAVE_3"}, - {QK_MIDI_OCTAVE_4, "QK_MIDI_OCTAVE_4"}, - {QK_MIDI_OCTAVE_5, "QK_MIDI_OCTAVE_5"}, - {QK_MIDI_OCTAVE_6, "QK_MIDI_OCTAVE_6"}, - {QK_MIDI_OCTAVE_7, "QK_MIDI_OCTAVE_7"}, - {QK_MIDI_OCTAVE_DOWN, "QK_MIDI_OCTAVE_DOWN"}, - {QK_MIDI_OCTAVE_UP, "QK_MIDI_OCTAVE_UP"}, - {QK_MIDI_TRANSPOSE_N6, "QK_MIDI_TRANSPOSE_N6"}, - {QK_MIDI_TRANSPOSE_N5, "QK_MIDI_TRANSPOSE_N5"}, - {QK_MIDI_TRANSPOSE_N4, "QK_MIDI_TRANSPOSE_N4"}, - {QK_MIDI_TRANSPOSE_N3, "QK_MIDI_TRANSPOSE_N3"}, - {QK_MIDI_TRANSPOSE_N2, "QK_MIDI_TRANSPOSE_N2"}, - {QK_MIDI_TRANSPOSE_N1, "QK_MIDI_TRANSPOSE_N1"}, - {QK_MIDI_TRANSPOSE_0, "QK_MIDI_TRANSPOSE_0"}, - {QK_MIDI_TRANSPOSE_1, "QK_MIDI_TRANSPOSE_1"}, - {QK_MIDI_TRANSPOSE_2, "QK_MIDI_TRANSPOSE_2"}, - {QK_MIDI_TRANSPOSE_3, "QK_MIDI_TRANSPOSE_3"}, - {QK_MIDI_TRANSPOSE_4, "QK_MIDI_TRANSPOSE_4"}, - {QK_MIDI_TRANSPOSE_5, "QK_MIDI_TRANSPOSE_5"}, - {QK_MIDI_TRANSPOSE_6, "QK_MIDI_TRANSPOSE_6"}, - {QK_MIDI_TRANSPOSE_DOWN, "QK_MIDI_TRANSPOSE_DOWN"}, - {QK_MIDI_TRANSPOSE_UP, "QK_MIDI_TRANSPOSE_UP"}, - {QK_MIDI_VELOCITY_0, "QK_MIDI_VELOCITY_0"}, - {QK_MIDI_VELOCITY_1, "QK_MIDI_VELOCITY_1"}, - {QK_MIDI_VELOCITY_2, "QK_MIDI_VELOCITY_2"}, - {QK_MIDI_VELOCITY_3, "QK_MIDI_VELOCITY_3"}, - {QK_MIDI_VELOCITY_4, "QK_MIDI_VELOCITY_4"}, - {QK_MIDI_VELOCITY_5, "QK_MIDI_VELOCITY_5"}, - {QK_MIDI_VELOCITY_6, "QK_MIDI_VELOCITY_6"}, - {QK_MIDI_VELOCITY_7, "QK_MIDI_VELOCITY_7"}, - {QK_MIDI_VELOCITY_8, "QK_MIDI_VELOCITY_8"}, - {QK_MIDI_VELOCITY_9, "QK_MIDI_VELOCITY_9"}, - {QK_MIDI_VELOCITY_10, "QK_MIDI_VELOCITY_10"}, - {QK_MIDI_VELOCITY_DOWN, "QK_MIDI_VELOCITY_DOWN"}, - {QK_MIDI_VELOCITY_UP, "QK_MIDI_VELOCITY_UP"}, - {QK_MIDI_CHANNEL_1, "QK_MIDI_CHANNEL_1"}, - {QK_MIDI_CHANNEL_2, "QK_MIDI_CHANNEL_2"}, - {QK_MIDI_CHANNEL_3, "QK_MIDI_CHANNEL_3"}, - {QK_MIDI_CHANNEL_4, "QK_MIDI_CHANNEL_4"}, - {QK_MIDI_CHANNEL_5, "QK_MIDI_CHANNEL_5"}, - {QK_MIDI_CHANNEL_6, "QK_MIDI_CHANNEL_6"}, - {QK_MIDI_CHANNEL_7, "QK_MIDI_CHANNEL_7"}, - {QK_MIDI_CHANNEL_8, "QK_MIDI_CHANNEL_8"}, - {QK_MIDI_CHANNEL_9, "QK_MIDI_CHANNEL_9"}, - {QK_MIDI_CHANNEL_10, "QK_MIDI_CHANNEL_10"}, - {QK_MIDI_CHANNEL_11, "QK_MIDI_CHANNEL_11"}, - {QK_MIDI_CHANNEL_12, "QK_MIDI_CHANNEL_12"}, - {QK_MIDI_CHANNEL_13, "QK_MIDI_CHANNEL_13"}, - {QK_MIDI_CHANNEL_14, "QK_MIDI_CHANNEL_14"}, - {QK_MIDI_CHANNEL_15, "QK_MIDI_CHANNEL_15"}, - {QK_MIDI_CHANNEL_16, "QK_MIDI_CHANNEL_16"}, - {QK_MIDI_CHANNEL_DOWN, "QK_MIDI_CHANNEL_DOWN"}, - {QK_MIDI_CHANNEL_UP, "QK_MIDI_CHANNEL_UP"}, - {QK_MIDI_ALL_NOTES_OFF, "QK_MIDI_ALL_NOTES_OFF"}, - {QK_MIDI_SUSTAIN, "QK_MIDI_SUSTAIN"}, - {QK_MIDI_PORTAMENTO, "QK_MIDI_PORTAMENTO"}, - {QK_MIDI_SOSTENUTO, "QK_MIDI_SOSTENUTO"}, - {QK_MIDI_SOFT, "QK_MIDI_SOFT"}, - {QK_MIDI_LEGATO, "QK_MIDI_LEGATO"}, - {QK_MIDI_MODULATION, "QK_MIDI_MODULATION"}, - {QK_MIDI_MODULATION_SPEED_DOWN, "QK_MIDI_MODULATION_SPEED_DOWN"}, - {QK_MIDI_MODULATION_SPEED_UP, "QK_MIDI_MODULATION_SPEED_UP"}, - {QK_MIDI_PITCH_BEND_DOWN, "QK_MIDI_PITCH_BEND_DOWN"}, - {QK_MIDI_PITCH_BEND_UP, "QK_MIDI_PITCH_BEND_UP"}, - {QK_SEQUENCER_ON, "QK_SEQUENCER_ON"}, - {QK_SEQUENCER_OFF, "QK_SEQUENCER_OFF"}, - {QK_SEQUENCER_TOGGLE, "QK_SEQUENCER_TOGGLE"}, - {QK_SEQUENCER_TEMPO_DOWN, "QK_SEQUENCER_TEMPO_DOWN"}, - {QK_SEQUENCER_TEMPO_UP, "QK_SEQUENCER_TEMPO_UP"}, - {QK_SEQUENCER_RESOLUTION_DOWN, "QK_SEQUENCER_RESOLUTION_DOWN"}, - {QK_SEQUENCER_RESOLUTION_UP, "QK_SEQUENCER_RESOLUTION_UP"}, - {QK_SEQUENCER_STEPS_ALL, "QK_SEQUENCER_STEPS_ALL"}, - {QK_SEQUENCER_STEPS_CLEAR, "QK_SEQUENCER_STEPS_CLEAR"}, - {QK_JOYSTICK_BUTTON_0, "QK_JOYSTICK_BUTTON_0"}, - {QK_JOYSTICK_BUTTON_1, "QK_JOYSTICK_BUTTON_1"}, - {QK_JOYSTICK_BUTTON_2, "QK_JOYSTICK_BUTTON_2"}, - {QK_JOYSTICK_BUTTON_3, "QK_JOYSTICK_BUTTON_3"}, - {QK_JOYSTICK_BUTTON_4, "QK_JOYSTICK_BUTTON_4"}, - {QK_JOYSTICK_BUTTON_5, "QK_JOYSTICK_BUTTON_5"}, - {QK_JOYSTICK_BUTTON_6, "QK_JOYSTICK_BUTTON_6"}, - {QK_JOYSTICK_BUTTON_7, "QK_JOYSTICK_BUTTON_7"}, - {QK_JOYSTICK_BUTTON_8, "QK_JOYSTICK_BUTTON_8"}, - {QK_JOYSTICK_BUTTON_9, "QK_JOYSTICK_BUTTON_9"}, - {QK_JOYSTICK_BUTTON_10, "QK_JOYSTICK_BUTTON_10"}, - {QK_JOYSTICK_BUTTON_11, "QK_JOYSTICK_BUTTON_11"}, - {QK_JOYSTICK_BUTTON_12, "QK_JOYSTICK_BUTTON_12"}, - {QK_JOYSTICK_BUTTON_13, "QK_JOYSTICK_BUTTON_13"}, - {QK_JOYSTICK_BUTTON_14, "QK_JOYSTICK_BUTTON_14"}, - {QK_JOYSTICK_BUTTON_15, "QK_JOYSTICK_BUTTON_15"}, - {QK_JOYSTICK_BUTTON_16, "QK_JOYSTICK_BUTTON_16"}, - {QK_JOYSTICK_BUTTON_17, "QK_JOYSTICK_BUTTON_17"}, - {QK_JOYSTICK_BUTTON_18, "QK_JOYSTICK_BUTTON_18"}, - {QK_JOYSTICK_BUTTON_19, "QK_JOYSTICK_BUTTON_19"}, - {QK_JOYSTICK_BUTTON_20, "QK_JOYSTICK_BUTTON_20"}, - {QK_JOYSTICK_BUTTON_21, "QK_JOYSTICK_BUTTON_21"}, - {QK_JOYSTICK_BUTTON_22, "QK_JOYSTICK_BUTTON_22"}, - {QK_JOYSTICK_BUTTON_23, "QK_JOYSTICK_BUTTON_23"}, - {QK_JOYSTICK_BUTTON_24, "QK_JOYSTICK_BUTTON_24"}, - {QK_JOYSTICK_BUTTON_25, "QK_JOYSTICK_BUTTON_25"}, - {QK_JOYSTICK_BUTTON_26, "QK_JOYSTICK_BUTTON_26"}, - {QK_JOYSTICK_BUTTON_27, "QK_JOYSTICK_BUTTON_27"}, - {QK_JOYSTICK_BUTTON_28, "QK_JOYSTICK_BUTTON_28"}, - {QK_JOYSTICK_BUTTON_29, "QK_JOYSTICK_BUTTON_29"}, - {QK_JOYSTICK_BUTTON_30, "QK_JOYSTICK_BUTTON_30"}, - {QK_JOYSTICK_BUTTON_31, "QK_JOYSTICK_BUTTON_31"}, - {QK_PROGRAMMABLE_BUTTON_1, "QK_PROGRAMMABLE_BUTTON_1"}, - {QK_PROGRAMMABLE_BUTTON_2, "QK_PROGRAMMABLE_BUTTON_2"}, - {QK_PROGRAMMABLE_BUTTON_3, "QK_PROGRAMMABLE_BUTTON_3"}, - {QK_PROGRAMMABLE_BUTTON_4, "QK_PROGRAMMABLE_BUTTON_4"}, - {QK_PROGRAMMABLE_BUTTON_5, "QK_PROGRAMMABLE_BUTTON_5"}, - {QK_PROGRAMMABLE_BUTTON_6, "QK_PROGRAMMABLE_BUTTON_6"}, - {QK_PROGRAMMABLE_BUTTON_7, "QK_PROGRAMMABLE_BUTTON_7"}, - {QK_PROGRAMMABLE_BUTTON_8, "QK_PROGRAMMABLE_BUTTON_8"}, - {QK_PROGRAMMABLE_BUTTON_9, "QK_PROGRAMMABLE_BUTTON_9"}, - {QK_PROGRAMMABLE_BUTTON_10, "QK_PROGRAMMABLE_BUTTON_10"}, - {QK_PROGRAMMABLE_BUTTON_11, "QK_PROGRAMMABLE_BUTTON_11"}, - {QK_PROGRAMMABLE_BUTTON_12, "QK_PROGRAMMABLE_BUTTON_12"}, - {QK_PROGRAMMABLE_BUTTON_13, "QK_PROGRAMMABLE_BUTTON_13"}, - {QK_PROGRAMMABLE_BUTTON_14, "QK_PROGRAMMABLE_BUTTON_14"}, - {QK_PROGRAMMABLE_BUTTON_15, "QK_PROGRAMMABLE_BUTTON_15"}, - {QK_PROGRAMMABLE_BUTTON_16, "QK_PROGRAMMABLE_BUTTON_16"}, - {QK_PROGRAMMABLE_BUTTON_17, "QK_PROGRAMMABLE_BUTTON_17"}, - {QK_PROGRAMMABLE_BUTTON_18, "QK_PROGRAMMABLE_BUTTON_18"}, - {QK_PROGRAMMABLE_BUTTON_19, "QK_PROGRAMMABLE_BUTTON_19"}, - {QK_PROGRAMMABLE_BUTTON_20, "QK_PROGRAMMABLE_BUTTON_20"}, - {QK_PROGRAMMABLE_BUTTON_21, "QK_PROGRAMMABLE_BUTTON_21"}, - {QK_PROGRAMMABLE_BUTTON_22, "QK_PROGRAMMABLE_BUTTON_22"}, - {QK_PROGRAMMABLE_BUTTON_23, "QK_PROGRAMMABLE_BUTTON_23"}, - {QK_PROGRAMMABLE_BUTTON_24, "QK_PROGRAMMABLE_BUTTON_24"}, - {QK_PROGRAMMABLE_BUTTON_25, "QK_PROGRAMMABLE_BUTTON_25"}, - {QK_PROGRAMMABLE_BUTTON_26, "QK_PROGRAMMABLE_BUTTON_26"}, - {QK_PROGRAMMABLE_BUTTON_27, "QK_PROGRAMMABLE_BUTTON_27"}, - {QK_PROGRAMMABLE_BUTTON_28, "QK_PROGRAMMABLE_BUTTON_28"}, - {QK_PROGRAMMABLE_BUTTON_29, "QK_PROGRAMMABLE_BUTTON_29"}, - {QK_PROGRAMMABLE_BUTTON_30, "QK_PROGRAMMABLE_BUTTON_30"}, - {QK_PROGRAMMABLE_BUTTON_31, "QK_PROGRAMMABLE_BUTTON_31"}, - {QK_PROGRAMMABLE_BUTTON_32, "QK_PROGRAMMABLE_BUTTON_32"}, - {QK_AUDIO_ON, "QK_AUDIO_ON"}, - {QK_AUDIO_OFF, "QK_AUDIO_OFF"}, - {QK_AUDIO_TOGGLE, "QK_AUDIO_TOGGLE"}, - {QK_AUDIO_CLICKY_TOGGLE, "QK_AUDIO_CLICKY_TOGGLE"}, - {QK_AUDIO_CLICKY_ON, "QK_AUDIO_CLICKY_ON"}, - {QK_AUDIO_CLICKY_OFF, "QK_AUDIO_CLICKY_OFF"}, - {QK_AUDIO_CLICKY_UP, "QK_AUDIO_CLICKY_UP"}, - {QK_AUDIO_CLICKY_DOWN, "QK_AUDIO_CLICKY_DOWN"}, - {QK_AUDIO_CLICKY_RESET, "QK_AUDIO_CLICKY_RESET"}, - {QK_MUSIC_ON, "QK_MUSIC_ON"}, - {QK_MUSIC_OFF, "QK_MUSIC_OFF"}, - {QK_MUSIC_TOGGLE, "QK_MUSIC_TOGGLE"}, - {QK_MUSIC_MODE_NEXT, "QK_MUSIC_MODE_NEXT"}, - {QK_AUDIO_VOICE_NEXT, "QK_AUDIO_VOICE_NEXT"}, - {QK_AUDIO_VOICE_PREVIOUS, "QK_AUDIO_VOICE_PREVIOUS"}, - {QK_STENO_BOLT, "QK_STENO_BOLT"}, - {QK_STENO_GEMINI, "QK_STENO_GEMINI"}, - {QK_STENO_COMB, "QK_STENO_COMB"}, - {QK_STENO_COMB_MAX, "QK_STENO_COMB_MAX"}, - {QK_MACRO_0, "QK_MACRO_0"}, - {QK_MACRO_1, "QK_MACRO_1"}, - {QK_MACRO_2, "QK_MACRO_2"}, - {QK_MACRO_3, "QK_MACRO_3"}, - {QK_MACRO_4, "QK_MACRO_4"}, - {QK_MACRO_5, "QK_MACRO_5"}, - {QK_MACRO_6, "QK_MACRO_6"}, - {QK_MACRO_7, "QK_MACRO_7"}, - {QK_MACRO_8, "QK_MACRO_8"}, - {QK_MACRO_9, "QK_MACRO_9"}, - {QK_MACRO_10, "QK_MACRO_10"}, - {QK_MACRO_11, "QK_MACRO_11"}, - {QK_MACRO_12, "QK_MACRO_12"}, - {QK_MACRO_13, "QK_MACRO_13"}, - {QK_MACRO_14, "QK_MACRO_14"}, - {QK_MACRO_15, "QK_MACRO_15"}, - {QK_MACRO_16, "QK_MACRO_16"}, - {QK_MACRO_17, "QK_MACRO_17"}, - {QK_MACRO_18, "QK_MACRO_18"}, - {QK_MACRO_19, "QK_MACRO_19"}, - {QK_MACRO_20, "QK_MACRO_20"}, - {QK_MACRO_21, "QK_MACRO_21"}, - {QK_MACRO_22, "QK_MACRO_22"}, - {QK_MACRO_23, "QK_MACRO_23"}, - {QK_MACRO_24, "QK_MACRO_24"}, - {QK_MACRO_25, "QK_MACRO_25"}, - {QK_MACRO_26, "QK_MACRO_26"}, - {QK_MACRO_27, "QK_MACRO_27"}, - {QK_MACRO_28, "QK_MACRO_28"}, - {QK_MACRO_29, "QK_MACRO_29"}, - {QK_MACRO_30, "QK_MACRO_30"}, - {QK_MACRO_31, "QK_MACRO_31"}, - {QK_OUTPUT_AUTO, "QK_OUTPUT_AUTO"}, - {QK_OUTPUT_NEXT, "QK_OUTPUT_NEXT"}, - {QK_OUTPUT_PREV, "QK_OUTPUT_PREV"}, - {QK_OUTPUT_NONE, "QK_OUTPUT_NONE"}, - {QK_OUTPUT_USB, "QK_OUTPUT_USB"}, - {QK_OUTPUT_2P4GHZ, "QK_OUTPUT_2P4GHZ"}, - {QK_OUTPUT_BLUETOOTH, "QK_OUTPUT_BLUETOOTH"}, - {QK_BLUETOOTH_PROFILE_NEXT, "QK_BLUETOOTH_PROFILE_NEXT"}, - {QK_BLUETOOTH_PROFILE_PREV, "QK_BLUETOOTH_PROFILE_PREV"}, - {QK_BLUETOOTH_UNPAIR, "QK_BLUETOOTH_UNPAIR"}, - {QK_BLUETOOTH_PROFILE1, "QK_BLUETOOTH_PROFILE1"}, - {QK_BLUETOOTH_PROFILE2, "QK_BLUETOOTH_PROFILE2"}, - {QK_BLUETOOTH_PROFILE3, "QK_BLUETOOTH_PROFILE3"}, - {QK_BLUETOOTH_PROFILE4, "QK_BLUETOOTH_PROFILE4"}, - {QK_BLUETOOTH_PROFILE5, "QK_BLUETOOTH_PROFILE5"}, - {QK_BACKLIGHT_ON, "QK_BACKLIGHT_ON"}, - {QK_BACKLIGHT_OFF, "QK_BACKLIGHT_OFF"}, - {QK_BACKLIGHT_TOGGLE, "QK_BACKLIGHT_TOGGLE"}, - {QK_BACKLIGHT_DOWN, "QK_BACKLIGHT_DOWN"}, - {QK_BACKLIGHT_UP, "QK_BACKLIGHT_UP"}, - {QK_BACKLIGHT_STEP, "QK_BACKLIGHT_STEP"}, - {QK_BACKLIGHT_TOGGLE_BREATHING, "QK_BACKLIGHT_TOGGLE_BREATHING"}, - {QK_LED_MATRIX_ON, "QK_LED_MATRIX_ON"}, - {QK_LED_MATRIX_OFF, "QK_LED_MATRIX_OFF"}, - {QK_LED_MATRIX_TOGGLE, "QK_LED_MATRIX_TOGGLE"}, - {QK_LED_MATRIX_MODE_NEXT, "QK_LED_MATRIX_MODE_NEXT"}, - {QK_LED_MATRIX_MODE_PREVIOUS, "QK_LED_MATRIX_MODE_PREVIOUS"}, - {QK_LED_MATRIX_BRIGHTNESS_UP, "QK_LED_MATRIX_BRIGHTNESS_UP"}, - {QK_LED_MATRIX_BRIGHTNESS_DOWN, "QK_LED_MATRIX_BRIGHTNESS_DOWN"}, - {QK_LED_MATRIX_SPEED_UP, "QK_LED_MATRIX_SPEED_UP"}, - {QK_LED_MATRIX_SPEED_DOWN, "QK_LED_MATRIX_SPEED_DOWN"}, - {QK_UNDERGLOW_TOGGLE, "QK_UNDERGLOW_TOGGLE"}, - {QK_UNDERGLOW_MODE_NEXT, "QK_UNDERGLOW_MODE_NEXT"}, - {QK_UNDERGLOW_MODE_PREVIOUS, "QK_UNDERGLOW_MODE_PREVIOUS"}, - {QK_UNDERGLOW_HUE_UP, "QK_UNDERGLOW_HUE_UP"}, - {QK_UNDERGLOW_HUE_DOWN, "QK_UNDERGLOW_HUE_DOWN"}, - {QK_UNDERGLOW_SATURATION_UP, "QK_UNDERGLOW_SATURATION_UP"}, - {QK_UNDERGLOW_SATURATION_DOWN, "QK_UNDERGLOW_SATURATION_DOWN"}, - {QK_UNDERGLOW_VALUE_UP, "QK_UNDERGLOW_VALUE_UP"}, - {QK_UNDERGLOW_VALUE_DOWN, "QK_UNDERGLOW_VALUE_DOWN"}, - {QK_UNDERGLOW_SPEED_UP, "QK_UNDERGLOW_SPEED_UP"}, - {QK_UNDERGLOW_SPEED_DOWN, "QK_UNDERGLOW_SPEED_DOWN"}, - {RGB_MODE_PLAIN, "RGB_MODE_PLAIN"}, - {RGB_MODE_BREATHE, "RGB_MODE_BREATHE"}, - {RGB_MODE_RAINBOW, "RGB_MODE_RAINBOW"}, - {RGB_MODE_SWIRL, "RGB_MODE_SWIRL"}, - {RGB_MODE_SNAKE, "RGB_MODE_SNAKE"}, - {RGB_MODE_KNIGHT, "RGB_MODE_KNIGHT"}, - {RGB_MODE_XMAS, "RGB_MODE_XMAS"}, - {RGB_MODE_GRADIENT, "RGB_MODE_GRADIENT"}, - {RGB_MODE_RGBTEST, "RGB_MODE_RGBTEST"}, - {RGB_MODE_TWINKLE, "RGB_MODE_TWINKLE"}, - {QK_RGB_MATRIX_ON, "QK_RGB_MATRIX_ON"}, - {QK_RGB_MATRIX_OFF, "QK_RGB_MATRIX_OFF"}, - {QK_RGB_MATRIX_TOGGLE, "QK_RGB_MATRIX_TOGGLE"}, - {QK_RGB_MATRIX_MODE_NEXT, "QK_RGB_MATRIX_MODE_NEXT"}, - {QK_RGB_MATRIX_MODE_PREVIOUS, "QK_RGB_MATRIX_MODE_PREVIOUS"}, - {QK_RGB_MATRIX_HUE_UP, "QK_RGB_MATRIX_HUE_UP"}, - {QK_RGB_MATRIX_HUE_DOWN, "QK_RGB_MATRIX_HUE_DOWN"}, - {QK_RGB_MATRIX_SATURATION_UP, "QK_RGB_MATRIX_SATURATION_UP"}, - {QK_RGB_MATRIX_SATURATION_DOWN, "QK_RGB_MATRIX_SATURATION_DOWN"}, - {QK_RGB_MATRIX_VALUE_UP, "QK_RGB_MATRIX_VALUE_UP"}, - {QK_RGB_MATRIX_VALUE_DOWN, "QK_RGB_MATRIX_VALUE_DOWN"}, - {QK_RGB_MATRIX_SPEED_UP, "QK_RGB_MATRIX_SPEED_UP"}, - {QK_RGB_MATRIX_SPEED_DOWN, "QK_RGB_MATRIX_SPEED_DOWN"}, - {QK_BOOTLOADER, "QK_BOOTLOADER"}, - {QK_REBOOT, "QK_REBOOT"}, - {QK_DEBUG_TOGGLE, "QK_DEBUG_TOGGLE"}, - {QK_CLEAR_EEPROM, "QK_CLEAR_EEPROM"}, - {QK_MAKE, "QK_MAKE"}, - {QK_AUTO_SHIFT_DOWN, "QK_AUTO_SHIFT_DOWN"}, - {QK_AUTO_SHIFT_UP, "QK_AUTO_SHIFT_UP"}, - {QK_AUTO_SHIFT_REPORT, "QK_AUTO_SHIFT_REPORT"}, - {QK_AUTO_SHIFT_ON, "QK_AUTO_SHIFT_ON"}, - {QK_AUTO_SHIFT_OFF, "QK_AUTO_SHIFT_OFF"}, - {QK_AUTO_SHIFT_TOGGLE, "QK_AUTO_SHIFT_TOGGLE"}, - {QK_GRAVE_ESCAPE, "QK_GRAVE_ESCAPE"}, - {QK_VELOCIKEY_TOGGLE, "QK_VELOCIKEY_TOGGLE"}, - {QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN"}, - {QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE"}, - {QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN"}, - {QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE"}, - {QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN"}, - {QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE"}, - {QK_SPACE_CADET_RIGHT_SHIFT_ENTER, "QK_SPACE_CADET_RIGHT_SHIFT_ENTER"}, - {QK_UNICODE_MODE_NEXT, "QK_UNICODE_MODE_NEXT"}, - {QK_UNICODE_MODE_PREVIOUS, "QK_UNICODE_MODE_PREVIOUS"}, - {QK_UNICODE_MODE_MACOS, "QK_UNICODE_MODE_MACOS"}, - {QK_UNICODE_MODE_LINUX, "QK_UNICODE_MODE_LINUX"}, - {QK_UNICODE_MODE_WINDOWS, "QK_UNICODE_MODE_WINDOWS"}, - {QK_UNICODE_MODE_BSD, "QK_UNICODE_MODE_BSD"}, - {QK_UNICODE_MODE_WINCOMPOSE, "QK_UNICODE_MODE_WINCOMPOSE"}, - {QK_UNICODE_MODE_EMACS, "QK_UNICODE_MODE_EMACS"}, - {QK_HAPTIC_ON, "QK_HAPTIC_ON"}, - {QK_HAPTIC_OFF, "QK_HAPTIC_OFF"}, - {QK_HAPTIC_TOGGLE, "QK_HAPTIC_TOGGLE"}, - {QK_HAPTIC_RESET, "QK_HAPTIC_RESET"}, - {QK_HAPTIC_FEEDBACK_TOGGLE, "QK_HAPTIC_FEEDBACK_TOGGLE"}, - {QK_HAPTIC_BUZZ_TOGGLE, "QK_HAPTIC_BUZZ_TOGGLE"}, - {QK_HAPTIC_MODE_NEXT, "QK_HAPTIC_MODE_NEXT"}, - {QK_HAPTIC_MODE_PREVIOUS, "QK_HAPTIC_MODE_PREVIOUS"}, - {QK_HAPTIC_CONTINUOUS_TOGGLE, "QK_HAPTIC_CONTINUOUS_TOGGLE"}, - {QK_HAPTIC_CONTINUOUS_UP, "QK_HAPTIC_CONTINUOUS_UP"}, - {QK_HAPTIC_CONTINUOUS_DOWN, "QK_HAPTIC_CONTINUOUS_DOWN"}, - {QK_HAPTIC_DWELL_UP, "QK_HAPTIC_DWELL_UP"}, - {QK_HAPTIC_DWELL_DOWN, "QK_HAPTIC_DWELL_DOWN"}, - {QK_COMBO_ON, "QK_COMBO_ON"}, - {QK_COMBO_OFF, "QK_COMBO_OFF"}, - {QK_COMBO_TOGGLE, "QK_COMBO_TOGGLE"}, - {QK_DYNAMIC_MACRO_RECORD_START_1, "QK_DYNAMIC_MACRO_RECORD_START_1"}, - {QK_DYNAMIC_MACRO_RECORD_START_2, "QK_DYNAMIC_MACRO_RECORD_START_2"}, - {QK_DYNAMIC_MACRO_RECORD_STOP, "QK_DYNAMIC_MACRO_RECORD_STOP"}, - {QK_DYNAMIC_MACRO_PLAY_1, "QK_DYNAMIC_MACRO_PLAY_1"}, - {QK_DYNAMIC_MACRO_PLAY_2, "QK_DYNAMIC_MACRO_PLAY_2"}, - {QK_LEADER, "QK_LEADER"}, - {QK_LOCK, "QK_LOCK"}, - {QK_ONE_SHOT_ON, "QK_ONE_SHOT_ON"}, - {QK_ONE_SHOT_OFF, "QK_ONE_SHOT_OFF"}, - {QK_ONE_SHOT_TOGGLE, "QK_ONE_SHOT_TOGGLE"}, - {QK_KEY_OVERRIDE_TOGGLE, "QK_KEY_OVERRIDE_TOGGLE"}, - {QK_KEY_OVERRIDE_ON, "QK_KEY_OVERRIDE_ON"}, - {QK_KEY_OVERRIDE_OFF, "QK_KEY_OVERRIDE_OFF"}, - {QK_SECURE_LOCK, "QK_SECURE_LOCK"}, - {QK_SECURE_UNLOCK, "QK_SECURE_UNLOCK"}, - {QK_SECURE_TOGGLE, "QK_SECURE_TOGGLE"}, - {QK_SECURE_REQUEST, "QK_SECURE_REQUEST"}, - {QK_DYNAMIC_TAPPING_TERM_PRINT, "QK_DYNAMIC_TAPPING_TERM_PRINT"}, - {QK_DYNAMIC_TAPPING_TERM_UP, "QK_DYNAMIC_TAPPING_TERM_UP"}, - {QK_DYNAMIC_TAPPING_TERM_DOWN, "QK_DYNAMIC_TAPPING_TERM_DOWN"}, - {QK_CAPS_WORD_TOGGLE, "QK_CAPS_WORD_TOGGLE"}, - {QK_AUTOCORRECT_ON, "QK_AUTOCORRECT_ON"}, - {QK_AUTOCORRECT_OFF, "QK_AUTOCORRECT_OFF"}, - {QK_AUTOCORRECT_TOGGLE, "QK_AUTOCORRECT_TOGGLE"}, - {QK_TRI_LAYER_LOWER, "QK_TRI_LAYER_LOWER"}, - {QK_TRI_LAYER_UPPER, "QK_TRI_LAYER_UPPER"}, - {QK_REPEAT_KEY, "QK_REPEAT_KEY"}, - {QK_ALT_REPEAT_KEY, "QK_ALT_REPEAT_KEY"}, - {QK_LAYER_LOCK, "QK_LAYER_LOCK"}, - {QK_KB_0, "QK_KB_0"}, - {QK_KB_1, "QK_KB_1"}, - {QK_KB_2, "QK_KB_2"}, - {QK_KB_3, "QK_KB_3"}, - {QK_KB_4, "QK_KB_4"}, - {QK_KB_5, "QK_KB_5"}, - {QK_KB_6, "QK_KB_6"}, - {QK_KB_7, "QK_KB_7"}, - {QK_KB_8, "QK_KB_8"}, - {QK_KB_9, "QK_KB_9"}, - {QK_KB_10, "QK_KB_10"}, - {QK_KB_11, "QK_KB_11"}, - {QK_KB_12, "QK_KB_12"}, - {QK_KB_13, "QK_KB_13"}, - {QK_KB_14, "QK_KB_14"}, - {QK_KB_15, "QK_KB_15"}, - {QK_KB_16, "QK_KB_16"}, - {QK_KB_17, "QK_KB_17"}, - {QK_KB_18, "QK_KB_18"}, - {QK_KB_19, "QK_KB_19"}, - {QK_KB_20, "QK_KB_20"}, - {QK_KB_21, "QK_KB_21"}, - {QK_KB_22, "QK_KB_22"}, - {QK_KB_23, "QK_KB_23"}, - {QK_KB_24, "QK_KB_24"}, - {QK_KB_25, "QK_KB_25"}, - {QK_KB_26, "QK_KB_26"}, - {QK_KB_27, "QK_KB_27"}, - {QK_KB_28, "QK_KB_28"}, - {QK_KB_29, "QK_KB_29"}, - {QK_KB_30, "QK_KB_30"}, - {QK_KB_31, "QK_KB_31"}, - {QK_USER_0, "QK_USER_0"}, - {QK_USER_1, "QK_USER_1"}, - {QK_USER_2, "QK_USER_2"}, - {QK_USER_3, "QK_USER_3"}, - {QK_USER_4, "QK_USER_4"}, - {QK_USER_5, "QK_USER_5"}, - {QK_USER_6, "QK_USER_6"}, - {QK_USER_7, "QK_USER_7"}, - {QK_USER_8, "QK_USER_8"}, - {QK_USER_9, "QK_USER_9"}, - {QK_USER_10, "QK_USER_10"}, - {QK_USER_11, "QK_USER_11"}, - {QK_USER_12, "QK_USER_12"}, - {QK_USER_13, "QK_USER_13"}, - {QK_USER_14, "QK_USER_14"}, - {QK_USER_15, "QK_USER_15"}, - {QK_USER_16, "QK_USER_16"}, - {QK_USER_17, "QK_USER_17"}, - {QK_USER_18, "QK_USER_18"}, - {QK_USER_19, "QK_USER_19"}, - {QK_USER_20, "QK_USER_20"}, - {QK_USER_21, "QK_USER_21"}, - {QK_USER_22, "QK_USER_22"}, - {QK_USER_23, "QK_USER_23"}, - {QK_USER_24, "QK_USER_24"}, - {QK_USER_25, "QK_USER_25"}, - {QK_USER_26, "QK_USER_26"}, - {QK_USER_27, "QK_USER_27"}, - {QK_USER_28, "QK_USER_28"}, - {QK_USER_29, "QK_USER_29"}, - {QK_USER_30, "QK_USER_30"}, - {QK_USER_31, "QK_USER_31"}, -}; diff --git a/tests/test_common/keycode_util.cpp b/tests/test_common/keycode_util.cpp deleted file mode 100644 index 539cab819a..0000000000 --- a/tests/test_common/keycode_util.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "keycode_util.hpp" -#include -extern "C" { -#include "action_code.h" -#include "keycode.h" -#include "quantum_keycodes.h" -#include "util.h" -} -#include -#include -#include - -extern std::map KEYCODE_ID_TABLE; - -std::string get_mods(uint8_t mods) { - std::stringstream s; - if ((mods & MOD_RCTL) == MOD_RCTL) { - s << XSTR(MOD_RCTL) << " | "; - } else if ((mods & MOD_LCTL) == MOD_LCTL) { - s << XSTR(MOD_LCTL) << " | "; - } - - if ((mods & MOD_RSFT) == MOD_RSFT) { - s << XSTR(MOD_RSFT) << " | "; - } else if ((mods & MOD_LSFT) == MOD_LSFT) { - s << XSTR(MOD_LSFT) << " | "; - } - - if ((mods & MOD_RALT) == MOD_RALT) { - s << XSTR(MOD_RALT) << " | "; - } else if ((mods & MOD_LALT) == MOD_LALT) { - s << XSTR(MOD_LALT) << " | "; - } - - if ((mods & MOD_RGUI) == MOD_RGUI) { - s << XSTR(MOD_RGUI) << " | "; - } else if ((mods & MOD_LGUI) == MOD_LGUI) { - s << XSTR(MOD_LGUI) << " | "; - } - - auto _mods = s.str(); - - if (_mods.size()) { - _mods.resize(_mods.size() - 3); - } - - return std::string(_mods); -} - -std::string get_qk_mods(uint16_t keycode) { - std::stringstream s; - if ((keycode & QK_RCTL) == QK_RCTL) { - s << XSTR(QK_RCTL) << " | "; - } else if ((keycode & QK_LCTL) == QK_LCTL) { - s << XSTR(QK_LCTL) << " | "; - } - - if ((keycode & QK_RSFT) == QK_RSFT) { - s << XSTR(QK_RSFT) << " | "; - } else if ((keycode & QK_LSFT) == QK_LSFT) { - s << XSTR(QK_LSFT) << " | "; - } - - if ((keycode & QK_RALT) == QK_RALT) { - s << XSTR(QK_RALT) << " | "; - } else if ((keycode & QK_LALT) == QK_LALT) { - s << XSTR(QK_LALT) << " | "; - } - - if ((keycode & QK_RGUI) == QK_RGUI) { - s << XSTR(QK_RGUI) << " | "; - } else if ((keycode & QK_LGUI) == QK_LGUI) { - s << XSTR(QK_LGUI) << " | "; - } - - auto _mods = s.str(); - - if (_mods.size()) { - _mods.resize(_mods.size() - 3); - } - - return std::string(_mods); -} - -std::string generate_identifier(uint16_t kc) { - std::stringstream s; - if (IS_QK_MOD_TAP(kc)) { - s << "MT(" << get_mods(QK_MOD_TAP_GET_MODS(kc)) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")"; - } else if (IS_QK_LAYER_TAP(kc)) { - s << "LT(" << +QK_LAYER_TAP_GET_LAYER(kc) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")"; - } else if (IS_QK_TO(kc)) { - s << "TO(" << +QK_TO_GET_LAYER(kc) << ")"; - } else if (IS_QK_MOMENTARY(kc)) { - s << "MO(" << +QK_MOMENTARY_GET_LAYER(kc) << ")"; - } else if (IS_QK_DEF_LAYER(kc)) { - s << "DF(" << +QK_DEF_LAYER_GET_LAYER(kc) << ")"; - } else if (IS_QK_PERSISTENT_DEF_LAYER(kc)) { - s << "PDF(" << +QK_PERSISTENT_DEF_LAYER_GET_LAYER(kc) << ")"; - } else if (IS_QK_TOGGLE_LAYER(kc)) { - s << "TG(" << +QK_TOGGLE_LAYER_GET_LAYER(kc) << ")"; - } else if (IS_QK_LAYER_TAP_TOGGLE(kc)) { - s << "TT(" << +QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) << ")"; - } else if (IS_QK_ONE_SHOT_LAYER(kc)) { - s << "OSL(" << +QK_ONE_SHOT_LAYER_GET_LAYER(kc) << ")"; - } else if (IS_QK_LAYER_MOD(kc)) { - s << "LM(" << +QK_LAYER_MOD_GET_LAYER(kc) << ", " << get_mods(QK_LAYER_MOD_GET_MODS(kc)) << ")"; - } else if (IS_QK_ONE_SHOT_MOD(kc)) { - s << "OSM(" << get_mods(QK_ONE_SHOT_MOD_GET_MODS(kc)) << ")"; - } else if (IS_QK_MODS(kc)) { - s << "QK_MODS(" << KEYCODE_ID_TABLE.at(QK_MODS_GET_BASIC_KEYCODE(kc)) << ", " << get_qk_mods(kc) << ")"; - } else if (IS_QK_TAP_DANCE(kc)) { - s << "TD(" << +(kc & 0xFF) << ")"; - } else { - // Fallback - we didn't found any matching keycode, generate the hex representation. - s << "unknown keycode: 0x" << std::hex << kc << ". Add conversion to " << XSTR(generate_identifier); - } - - return std::string(s.str()); -} - -std::string get_keycode_identifier_or_default(uint16_t keycode) { - auto identifier = KEYCODE_ID_TABLE.find(keycode); - if (identifier != KEYCODE_ID_TABLE.end()) { - return identifier->second; - } - - KEYCODE_ID_TABLE[keycode] = generate_identifier(keycode); - - return KEYCODE_ID_TABLE[keycode]; -} diff --git a/tests/test_common/keycode_util.hpp b/tests/test_common/keycode_util.hpp deleted file mode 100644 index 3143ab364e..0000000000 --- a/tests/test_common/keycode_util.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include -#include - -std::string get_keycode_identifier_or_default(uint16_t keycode); diff --git a/tests/test_common/test_driver.hpp b/tests/test_common/test_driver.hpp index fea8225953..5c36c80dfc 100644 --- a/tests/test_common/test_driver.hpp +++ b/tests/test_common/test_driver.hpp @@ -20,7 +20,9 @@ #include #include "host.h" #include "keyboard_report_util.hpp" -#include "keycode_util.hpp" +extern "C" { +#include "keycode_string.h" +} #include "test_logger.hpp" class TestDriver { @@ -146,11 +148,11 @@ class TestDriver { /** @brief Tests whether keycode `actual` is equal to `expected`. */ #define EXPECT_KEYCODE_EQ(actual, expected) EXPECT_THAT((actual), KeycodeEq((expected))) -MATCHER_P(KeycodeEq, expected_keycode, "is equal to " + testing::PrintToString(expected_keycode) + ", keycode " + get_keycode_identifier_or_default(expected_keycode)) { +MATCHER_P(KeycodeEq, expected_keycode, "is equal to " + testing::PrintToString(expected_keycode) + ", keycode " + get_keycode_string(expected_keycode)) { if (arg == expected_keycode) { return true; } - *result_listener << "keycode " << get_keycode_identifier_or_default(arg); + *result_listener << "keycode " << get_keycode_string(arg); return false; } diff --git a/tests/test_common/test_keymap_key.hpp b/tests/test_common/test_keymap_key.hpp index 37b4c827e4..ba2c2912e3 100644 --- a/tests/test_common/test_keymap_key.hpp +++ b/tests/test_common/test_keymap_key.hpp @@ -18,10 +18,10 @@ #include #include -#include "keycode_util.hpp" extern "C" { #include "keyboard.h" #include "test_matrix.h" +#include "keycode_string.h" } #include @@ -29,11 +29,11 @@ extern "C" { typedef uint8_t layer_t; struct KeymapKey { - KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(keycode), name(get_keycode_identifier_or_default(keycode)) { + KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(keycode), name(get_keycode_string(keycode)) { validate(); } - KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode, uint16_t report_code) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(report_code), name{get_keycode_identifier_or_default(keycode)} { + KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode, uint16_t report_code) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(report_code), name{get_keycode_string(keycode)} { validate(); } diff --git a/util/regen.sh b/util/regen.sh index ab03018893..df40444f80 100755 --- a/util/regen.sh +++ b/util/regen.sh @@ -3,7 +3,6 @@ set -e qmk generate-rgb-breathe-table -o quantum/rgblight/rgblight_breathe_table.h qmk generate-keycodes --version latest -o quantum/keycodes.h -qmk generate-keycodes-tests --version latest -o tests/test_common/keycode_table.cpp for lang in $(find data/constants/keycodes/extras/ -type f -exec basename '{}' \; | sed "s/keycodes_\(.*\)_[0-9].*/\1/"); do qmk generate-keycode-extras --version latest --lang $lang -o quantum/keymap_extras/keymap_$lang.h From 2b00b846dce1d1267dfdb2a3c2972a367cc0dd44 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 21 Mar 2025 23:38:34 +1100 Subject: [PATCH 245/592] Non-volatile memory data repository pattern (#24356) * First batch of eeconfig conversions. * Offset and length for datablocks. * `via`, `dynamic_keymap`. * Fix filename. * Commentary. * wilba leds * satisfaction75 * satisfaction75 * more keyboard whack-a-mole * satisfaction75 * omnikeyish * more whack-a-mole * `generic_features.mk` to automatically pick up nvm repositories * thievery * deferred variable resolve * whitespace * convert api to structs/unions * convert api to structs/unions * convert api to structs/unions * fixups * code-side docs * code size fix * rollback * nvm_xxxxx_erase * Updated location of eeconfig magic numbers so non-EEPROM nvm drivers can use them too. * Fixup build. * Fixup compilation error with encoders. * Build fixes. * Add `via_ci` keymap to onekey to exercise VIA bindings (and thus dynamic keymap et.al.), fixup compilation errors based on preprocessor+sizeof. * Build failure rectification. --- builddefs/common_features.mk | 2 + builddefs/generic_features.mk | 1 + drivers/eeprom/eeprom_transient.h | 2 +- keyboards/akko/5087/5087.c | 2 +- .../lib/satisfaction75/satisfaction_core.c | 105 ++--- .../lib/satisfaction75/satisfaction_core.h | 11 +- .../lib/satisfaction75/satisfaction_encoder.c | 17 +- .../lib/satisfaction75/satisfaction_oled.c | 2 +- keyboards/cannonkeys/satisfaction75/config.h | 5 +- .../cannonkeys/satisfaction75_hs/config.h | 5 + keyboards/cipulot/common/ec_board.c | 4 +- keyboards/cipulot/common/eeprom_tools.h | 26 -- keyboards/cipulot/common/via_ec.c | 7 +- keyboards/cipulot/ec_980c/ec_980c.c | 4 +- keyboards/cipulot/ec_typek/ec_typek.c | 4 +- keyboards/contra/keymaps/default/keymap.c | 4 +- .../dm9records/plaid/keymaps/default/keymap.c | 4 +- .../handwired/onekey/keymaps/via_ci/config.h | 4 + .../handwired/onekey/keymaps/via_ci/keymap.c | 30 ++ .../onekey/keymaps/via_ci/keymap.json | 7 + keyboards/handwired/onekey/teensy_32/rules.mk | 1 + keyboards/handwired/onekey/teensy_lc/rules.mk | 2 +- .../ortho_brass/keymaps/default/keymap.c | 4 +- keyboards/helix/rev2/rev2.c | 2 +- keyboards/helix/rev3_4rows/rev3_4rows.c | 2 +- keyboards/helix/rev3_5rows/rev3_5rows.c | 2 +- .../nyx/rev1/lib/startup_swirl_anim.h | 3 +- keyboards/inland/kb83/kb83.c | 2 +- keyboards/jian/keymaps/advanced/keymap.c | 4 +- keyboards/monsgeek/m1/m1.c | 2 +- keyboards/monsgeek/m3/m3.c | 2 +- keyboards/omnikeyish/dynamic_macro.c | 1 + keyboards/planck/keymaps/default/keymap.c | 4 +- .../planck/rev7/keymaps/default/keymap.c | 4 +- keyboards/rocketboard_16/keycode_lookup.c | 1 + .../splitography/keymaps/default/keymap.c | 4 +- .../keymap.c | 4 +- .../splitography/keymaps/dvorak/keymap.c | 4 +- keyboards/system76/launch_1/launch_1.c | 3 +- keyboards/vitamins_included/rev2/rev2.c | 2 +- keyboards/wilba_tech/wt_main.c | 59 +-- keyboards/wilba_tech/wt_mono_backlight.c | 2 + keyboards/wilba_tech/wt_rgb_backlight.c | 2 + keyboards/xelus/la_plus/rgb_matrix_kb.inc | 2 +- quantum/action_util.c | 2 +- quantum/audio/audio.c | 12 +- quantum/audio/audio.h | 2 +- quantum/backlight/backlight.c | 31 +- quantum/backlight/backlight.h | 8 +- quantum/command.c | 6 +- quantum/dynamic_keymap.c | 203 ++------ quantum/dynamic_keymap.h | 9 +- quantum/eeconfig.c | 432 +++++++++--------- quantum/eeconfig.h | 156 +++---- quantum/haptic.c | 26 +- quantum/haptic.h | 2 +- quantum/keyboard.c | 6 +- quantum/keycode_config.h | 2 +- quantum/led_matrix/led_matrix.c | 4 +- quantum/led_matrix/led_matrix.h | 2 +- quantum/led_matrix/led_matrix_types.h | 2 +- quantum/logging/debug.h | 2 +- quantum/nvm/eeprom/nvm_dynamic_keymap.c | 193 ++++++++ quantum/nvm/eeprom/nvm_eeconfig.c | 292 ++++++++++++ .../nvm/eeprom/nvm_eeprom_eeconfig_internal.h | 59 +++ quantum/nvm/eeprom/nvm_eeprom_via_internal.h | 22 + quantum/nvm/eeprom/nvm_via.c | 77 ++++ quantum/nvm/nvm_dynamic_keymap.h | 27 ++ quantum/nvm/nvm_eeconfig.h | 105 +++++ quantum/nvm/nvm_via.h | 17 + quantum/nvm/readme.md | 30 ++ quantum/nvm/rules.mk | 31 ++ quantum/os_detection.h | 3 + quantum/process_keycode/process_autocorrect.c | 6 +- quantum/process_keycode/process_clicky.c | 6 +- quantum/process_keycode/process_magic.c | 4 +- quantum/process_keycode/process_steno.c | 7 +- quantum/rgb_matrix/rgb_matrix.c | 4 +- quantum/rgb_matrix/rgb_matrix.h | 4 +- quantum/rgb_matrix/rgb_matrix_types.h | 2 +- quantum/rgblight/rgblight.c | 45 +- quantum/rgblight/rgblight.h | 5 +- quantum/unicode/unicode.c | 4 +- quantum/unicode/unicode.h | 2 +- quantum/via.c | 60 +-- quantum/via.h | 25 +- tests/test_common/test_fixture.cpp | 2 +- 87 files changed, 1464 insertions(+), 839 deletions(-) delete mode 100644 keyboards/cipulot/common/eeprom_tools.h create mode 100644 keyboards/handwired/onekey/keymaps/via_ci/config.h create mode 100644 keyboards/handwired/onekey/keymaps/via_ci/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/via_ci/keymap.json create mode 100644 keyboards/handwired/onekey/teensy_32/rules.mk create mode 100644 quantum/nvm/eeprom/nvm_dynamic_keymap.c create mode 100644 quantum/nvm/eeprom/nvm_eeconfig.c create mode 100644 quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h create mode 100644 quantum/nvm/eeprom/nvm_eeprom_via_internal.h create mode 100644 quantum/nvm/eeprom/nvm_via.c create mode 100644 quantum/nvm/nvm_dynamic_keymap.h create mode 100644 quantum/nvm/nvm_eeconfig.h create mode 100644 quantum/nvm/nvm_via.h create mode 100644 quantum/nvm/readme.md create mode 100644 quantum/nvm/rules.mk diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index cbfbbcced5..802e01de43 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -30,6 +30,8 @@ QUANTUM_SRC += \ $(QUANTUM_DIR)/logging/sendchar.c \ $(QUANTUM_DIR)/process_keycode/process_default_layer.c \ +include $(QUANTUM_DIR)/nvm/rules.mk + VPATH += $(QUANTUM_DIR)/logging # Fall back to lib/printf if there is no platform provided print ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","") diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk index 015a804d91..d39727f23b 100644 --- a/builddefs/generic_features.mk +++ b/builddefs/generic_features.mk @@ -61,6 +61,7 @@ define HANDLE_GENERIC_FEATURE SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c) SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c) SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c) + SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c) VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/) OPT_DEFS += -D$1_ENABLE endef diff --git a/drivers/eeprom/eeprom_transient.h b/drivers/eeprom/eeprom_transient.h index 687b8619fe..0483fd58b9 100644 --- a/drivers/eeprom/eeprom_transient.h +++ b/drivers/eeprom/eeprom_transient.h @@ -20,6 +20,6 @@ The size of the transient EEPROM buffer size. */ #ifndef TRANSIENT_EEPROM_SIZE -# include "eeconfig.h" +# include "nvm_eeprom_eeconfig_internal.h" # define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO #endif diff --git a/keyboards/akko/5087/5087.c b/keyboards/akko/5087/5087.c index 996f8c2585..27439c20ef 100644 --- a/keyboards/akko/5087/5087.c +++ b/keyboards/akko/5087/5087.c @@ -164,7 +164,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) { if (record->event.pressed) { set_single_persistent_default_layer(MAC_B); keymap_config.no_gui = 0; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; case QK_RGB_MATRIX_TOGGLE: diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c index 6f76582e4b..a410480d7d 100644 --- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c +++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c @@ -53,10 +53,26 @@ void board_init(void) { SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP); } +uint32_t read_custom_config(void *data, uint32_t offset, uint32_t length) { +#ifdef VIA_ENABLE + return via_read_custom_config(data, offset, length); +#else + return eeconfig_read_kb_datablock(data, offset, length); +#endif +} + +uint32_t write_custom_config(const void *data, uint32_t offset, uint32_t length) { +#ifdef VIA_ENABLE + return via_update_custom_config(data, offset, length); +#else + return eeconfig_update_kb_datablock(data, offset, length); +#endif +} + void keyboard_post_init_kb(void) { /* This is a workaround to some really weird behavior - Without this code, the OLED will turn on, but not when you initially plug the keyboard in. + Without this code, the OLED will turn on, but not when you initially plug the keyboard in. You have to manually trigger a user reset to get the OLED to initialize properly I'm not sure what the root cause is at this time, but this workaround fixes it. */ @@ -74,11 +90,11 @@ void keyboard_post_init_kb(void) { void custom_set_value(uint8_t *data) { uint8_t *value_id = &(data[0]); uint8_t *value_data = &(data[1]); - + switch ( *value_id ) { case id_oled_default_mode: { - eeprom_update_byte((uint8_t*)EEPROM_DEFAULT_OLED, value_data[0]); + write_custom_config(&value_data[0], EEPROM_DEFAULT_OLED_OFFSET, 1); break; } case id_oled_mode: @@ -92,7 +108,7 @@ void custom_set_value(uint8_t *data) { uint8_t index = value_data[0]; uint8_t enable = value_data[1]; enabled_encoder_modes = (enabled_encoder_modes & ~(1< #include +#include + #include "via.h" // only for EEPROM address #include "satisfaction_keycodes.h" -#define EEPROM_ENABLED_ENCODER_MODES (VIA_EEPROM_CUSTOM_CONFIG_ADDR) -#define EEPROM_DEFAULT_OLED (VIA_EEPROM_CUSTOM_CONFIG_ADDR+1) -#define EEPROM_CUSTOM_ENCODER (VIA_EEPROM_CUSTOM_CONFIG_ADDR+2) +#define EEPROM_ENABLED_ENCODER_MODES_OFFSET 0 +#define EEPROM_DEFAULT_OLED_OFFSET 1 +#define EEPROM_CUSTOM_ENCODER_OFFSET 2 enum s75_keyboard_value_id { id_encoder_modes = 1, @@ -94,3 +96,6 @@ void oled_request_repaint(void); bool oled_task_needs_to_repaint(void); void custom_config_load(void); + +uint32_t read_custom_config(void *data, uint32_t offset, uint32_t length); +uint32_t write_custom_config(const void *data, uint32_t offset, uint32_t length); diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c index 7e0b82e9e7..87ff87ea66 100644 --- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c +++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c @@ -215,10 +215,13 @@ uint16_t handle_encoder_press(void){ uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){ #ifdef DYNAMIC_KEYMAP_ENABLE - void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2)); + uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2); //big endian - uint16_t keycode = eeprom_read_byte(addr) << 8; - keycode |= eeprom_read_byte(addr + 1); + uint8_t hi, lo; + read_custom_config(&hi, offset+0, 1); + read_custom_config(&lo, offset+1, 1); + uint16_t keycode = hi << 8; + keycode |= lo; return keycode; #else return 0; @@ -227,8 +230,10 @@ uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){ void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){ #ifdef DYNAMIC_KEYMAP_ENABLE - void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2)); - eeprom_update_byte(addr, (uint8_t)(new_code >> 8)); - eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF)); + uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2); + uint8_t hi = new_code >> 8; + uint8_t lo = new_code & 0xFF; + write_custom_config(&hi, offset+0, 1); + write_custom_config(&lo, offset+1, 1); #endif } diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c index 0361453c52..815e84901d 100644 --- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c +++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c @@ -8,7 +8,6 @@ #include "matrix.h" #include "led.h" #include "host.h" -#include "oled_driver.h" #include "progmem.h" #include @@ -16,6 +15,7 @@ void draw_default(void); void draw_clock(void); #ifdef OLED_ENABLE +#include "oled_driver.h" oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return OLED_ROTATION_0; } diff --git a/keyboards/cannonkeys/satisfaction75/config.h b/keyboards/cannonkeys/satisfaction75/config.h index 969206b19a..28bc6b286a 100644 --- a/keyboards/cannonkeys/satisfaction75/config.h +++ b/keyboards/cannonkeys/satisfaction75/config.h @@ -42,4 +42,7 @@ // 6 for 3x custom encoder settings, left, right, and press (18 bytes) #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 20 - +// And if VIA isn't enabled, fall back to using standard QMK for configuration +#ifndef VIA_ENABLE +#define EECONFIG_KB_DATA_SIZE VIA_EEPROM_CUSTOM_CONFIG_SIZE +#endif diff --git a/keyboards/cannonkeys/satisfaction75_hs/config.h b/keyboards/cannonkeys/satisfaction75_hs/config.h index 658babd3c0..26c3e4080c 100644 --- a/keyboards/cannonkeys/satisfaction75_hs/config.h +++ b/keyboards/cannonkeys/satisfaction75_hs/config.h @@ -40,5 +40,10 @@ // 6 for 3x custom encoder settings, left, right, and press (18 bytes) #define VIA_EEPROM_CUSTOM_CONFIG_SIZE 20 +// And if VIA isn't enabled, fall back to using standard QMK for configuration +#ifndef VIA_ENABLE +#define EECONFIG_KB_DATA_SIZE VIA_EEPROM_CUSTOM_CONFIG_SIZE +#endif + // VIA lighting is handled by the keyboard-level code #define VIA_CUSTOM_LIGHTING_ENABLE diff --git a/keyboards/cipulot/common/ec_board.c b/keyboards/cipulot/common/ec_board.c index 0ccb9f6d3c..b15543e49e 100644 --- a/keyboards/cipulot/common/ec_board.c +++ b/keyboards/cipulot/common/ec_board.c @@ -36,7 +36,7 @@ void eeconfig_init_kb(void) { } } // Write default value to EEPROM now - eeconfig_update_kb_datablock(&eeprom_ec_config); + eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); eeconfig_init_user(); } @@ -44,7 +44,7 @@ void eeconfig_init_kb(void) { // On Keyboard startup void keyboard_post_init_kb(void) { // Read custom menu variables from memory - eeconfig_read_kb_datablock(&eeprom_ec_config); + eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); // Set runtime values to EEPROM values ec_config.actuation_mode = eeprom_ec_config.actuation_mode; diff --git a/keyboards/cipulot/common/eeprom_tools.h b/keyboards/cipulot/common/eeprom_tools.h deleted file mode 100644 index b3c90d8759..0000000000 --- a/keyboards/cipulot/common/eeprom_tools.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright 2023 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 "eeprom.h" - -#if (EECONFIG_KB_DATA_SIZE) > 0 -# define EEPROM_KB_PARTIAL_UPDATE(__struct, __field) eeprom_update_block(&(__struct.__field), (void *)((void *)(EECONFIG_KB_DATABLOCK) + offsetof(typeof(__struct), __field)), sizeof(__struct.__field)) -#endif - -#if (EECONFIG_USER_DATA_SIZE) > 0 -# define EEPROM_USER_PARTIAL_UPDATE(__struct, __field) eeprom_update_block(&(__struct.__field), (void *)((void *)(EECONFIG_USER_DATABLOCK) + offsetof(typeof(__struct), __field)), sizeof(__struct.__field)) -#endif diff --git a/keyboards/cipulot/common/via_ec.c b/keyboards/cipulot/common/via_ec.c index ed34a579b2..7be6edd026 100644 --- a/keyboards/cipulot/common/via_ec.c +++ b/keyboards/cipulot/common/via_ec.c @@ -13,7 +13,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "eeprom_tools.h" #include "ec_switch_matrix.h" #include "action.h" #include "print.h" @@ -73,7 +72,7 @@ void via_config_set_value(uint8_t *data) { uprintf("# Actuation Mode: Rapid Trigger #\n"); uprintf("#################################\n"); } - EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, actuation_mode); + eeconfig_update_kb_datablock_field(eeprom_ec_config, actuation_mode); break; } case id_mode_0_actuation_threshold: { @@ -293,7 +292,7 @@ void ec_save_threshold_data(uint8_t option) { ec_rescale_values(3); ec_rescale_values(4); } - eeconfig_update_kb_datablock(&eeprom_ec_config); + eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); uprintf("####################################\n"); uprintf("# New thresholds applied and saved #\n"); uprintf("####################################\n"); @@ -321,7 +320,7 @@ void ec_save_bottoming_reading(void) { ec_rescale_values(2); ec_rescale_values(3); ec_rescale_values(4); - eeconfig_update_kb_datablock(&eeprom_ec_config); + eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); } // Show the calibration data diff --git a/keyboards/cipulot/ec_980c/ec_980c.c b/keyboards/cipulot/ec_980c/ec_980c.c index eaa636ede6..7a2062a4e4 100644 --- a/keyboards/cipulot/ec_980c/ec_980c.c +++ b/keyboards/cipulot/ec_980c/ec_980c.c @@ -44,7 +44,7 @@ void eeconfig_init_kb(void) { } } // Write default value to EEPROM now - eeconfig_update_kb_datablock(&eeprom_ec_config); + eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); eeconfig_init_user(); } @@ -52,7 +52,7 @@ void eeconfig_init_kb(void) { // On Keyboard startup void keyboard_post_init_kb(void) { // Read custom menu variables from memory - eeconfig_read_kb_datablock(&eeprom_ec_config); + eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); // Set runtime values to EEPROM values ec_config.actuation_mode = eeprom_ec_config.actuation_mode; diff --git a/keyboards/cipulot/ec_typek/ec_typek.c b/keyboards/cipulot/ec_typek/ec_typek.c index d4241f66f1..31616afc02 100644 --- a/keyboards/cipulot/ec_typek/ec_typek.c +++ b/keyboards/cipulot/ec_typek/ec_typek.c @@ -44,7 +44,7 @@ void eeconfig_init_kb(void) { } } // Write default value to EEPROM now - eeconfig_update_kb_datablock(&eeprom_ec_config); + eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); eeconfig_init_user(); } @@ -52,7 +52,7 @@ void eeconfig_init_kb(void) { // On Keyboard startup void keyboard_post_init_kb(void) { // Read custom menu variables from memory - eeconfig_read_kb_datablock(&eeprom_ec_config); + eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE); // Set runtime values to EEPROM values ec_config.actuation_mode = eeprom_ec_config.actuation_mode; diff --git a/keyboards/contra/keymaps/default/keymap.c b/keyboards/contra/keymaps/default/keymap.c index 415e22e81a..645005769a 100644 --- a/keyboards/contra/keymaps/default/keymap.c +++ b/keyboards/contra/keymaps/default/keymap.c @@ -222,9 +222,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; break; diff --git a/keyboards/dm9records/plaid/keymaps/default/keymap.c b/keyboards/dm9records/plaid/keymaps/default/keymap.c index 0d8d24c575..3ee327f65e 100644 --- a/keyboards/dm9records/plaid/keymaps/default/keymap.c +++ b/keyboards/dm9records/plaid/keymaps/default/keymap.c @@ -311,9 +311,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; break; diff --git a/keyboards/handwired/onekey/keymaps/via_ci/config.h b/keyboards/handwired/onekey/keymaps/via_ci/config.h new file mode 100644 index 0000000000..ec6f1e1ec0 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/via_ci/config.h @@ -0,0 +1,4 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#define TRANSIENT_EEPROM_SIZE 160 diff --git a/keyboards/handwired/onekey/keymaps/via_ci/keymap.c b/keyboards/handwired/onekey/keymaps/via_ci/keymap.c new file mode 100644 index 0000000000..8261fc6329 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/via_ci/keymap.c @@ -0,0 +1,30 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +enum custom_keycodes { + KC_HELLO = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(KC_HELLO) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_HELLO: + if (record->event.pressed) { + send_string_P("Hello world!"); + } + return false; + } + return true; +} + +void keyboard_post_init_user(void) { + // Customise these values to desired behaviour + debug_enable=true; + debug_matrix=true; + //debug_keyboard=true; + //debug_mouse=true; +} diff --git a/keyboards/handwired/onekey/keymaps/via_ci/keymap.json b/keyboards/handwired/onekey/keymaps/via_ci/keymap.json new file mode 100644 index 0000000000..edb78b5742 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/via_ci/keymap.json @@ -0,0 +1,7 @@ +{ + "config": { + "features": { + "via": true + } + } +} diff --git a/keyboards/handwired/onekey/teensy_32/rules.mk b/keyboards/handwired/onekey/teensy_32/rules.mk new file mode 100644 index 0000000000..d5978ba6f5 --- /dev/null +++ b/keyboards/handwired/onekey/teensy_32/rules.mk @@ -0,0 +1 @@ +EEPROM_DRIVER = transient diff --git a/keyboards/handwired/onekey/teensy_lc/rules.mk b/keyboards/handwired/onekey/teensy_lc/rules.mk index abd2f7fce9..d1a53e95d7 100644 --- a/keyboards/handwired/onekey/teensy_lc/rules.mk +++ b/keyboards/handwired/onekey/teensy_lc/rules.mk @@ -1,2 +1,2 @@ USE_CHIBIOS_CONTRIB = yes - +EEPROM_DRIVER = transient diff --git a/keyboards/handwired/ortho_brass/keymaps/default/keymap.c b/keyboards/handwired/ortho_brass/keymaps/default/keymap.c index fc43167211..47f731c2c9 100644 --- a/keyboards/handwired/ortho_brass/keymaps/default/keymap.c +++ b/keyboards/handwired/ortho_brass/keymaps/default/keymap.c @@ -182,9 +182,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; break; diff --git a/keyboards/helix/rev2/rev2.c b/keyboards/helix/rev2/rev2.c index ded22bbe93..7502ad0552 100644 --- a/keyboards/helix/rev2/rev2.c +++ b/keyboards/helix/rev2/rev2.c @@ -32,7 +32,7 @@ void set_mac_mode_kb(bool macmode) { * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 */ keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } void matrix_init_kb(void) { diff --git a/keyboards/helix/rev3_4rows/rev3_4rows.c b/keyboards/helix/rev3_4rows/rev3_4rows.c index ff61027a96..7f655b6852 100644 --- a/keyboards/helix/rev3_4rows/rev3_4rows.c +++ b/keyboards/helix/rev3_4rows/rev3_4rows.c @@ -27,7 +27,7 @@ void set_mac_mode(bool macmode) { * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 */ keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } #ifdef DIP_SWITCH_ENABLE diff --git a/keyboards/helix/rev3_5rows/rev3_5rows.c b/keyboards/helix/rev3_5rows/rev3_5rows.c index 28fa314a7b..af7276a2b5 100644 --- a/keyboards/helix/rev3_5rows/rev3_5rows.c +++ b/keyboards/helix/rev3_5rows/rev3_5rows.c @@ -27,7 +27,7 @@ void set_mac_mode(bool macmode) { * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 */ keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } #ifdef DIP_SWITCH_ENABLE diff --git a/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h b/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h index f26f07fe12..87e2e813a4 100644 --- a/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h +++ b/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h @@ -18,6 +18,7 @@ #include #include #include +#include "eeconfig.h" #define LED_TRAIL 10 @@ -105,7 +106,7 @@ static void swirl_set_color(hsv_t hsv) { traverse_matrix(); if (!(top <= bottom && left <= right)) { - eeprom_read_block(&rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_matrix_config)); + eeconfig_read_rgb_matrix(&rgb_matrix_config); rgb_matrix_mode_noeeprom(rgb_matrix_config.mode); return; } diff --git a/keyboards/inland/kb83/kb83.c b/keyboards/inland/kb83/kb83.c index 1052131a91..41a3ad8df7 100644 --- a/keyboards/inland/kb83/kb83.c +++ b/keyboards/inland/kb83/kb83.c @@ -317,7 +317,7 @@ bool dip_switch_update_kb(uint8_t index, bool active) { } if(active){ keymap_config.no_gui = 0; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return true; } diff --git a/keyboards/jian/keymaps/advanced/keymap.c b/keyboards/jian/keymaps/advanced/keymap.c index eaf57cdd78..e3e58a0e9f 100644 --- a/keyboards/jian/keymaps/advanced/keymap.c +++ b/keyboards/jian/keymaps/advanced/keymap.c @@ -472,9 +472,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; case EXT_PLV: diff --git a/keyboards/monsgeek/m1/m1.c b/keyboards/monsgeek/m1/m1.c index 60479ab801..2f7365e562 100644 --- a/keyboards/monsgeek/m1/m1.c +++ b/keyboards/monsgeek/m1/m1.c @@ -190,7 +190,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { set_single_persistent_default_layer(MAC_B); layer_state_set(1<event.pressed) { set_single_persistent_default_layer(MAC_B); keymap_config.no_gui = 0; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; case GU_TOGG: diff --git a/keyboards/omnikeyish/dynamic_macro.c b/keyboards/omnikeyish/dynamic_macro.c index b990a09a13..99b6d173b8 100644 --- a/keyboards/omnikeyish/dynamic_macro.c +++ b/keyboards/omnikeyish/dynamic_macro.c @@ -1,5 +1,6 @@ #include "omnikeyish.h" #include +#include "eeprom.h" dynamic_macro_t dynamic_macros[DYNAMIC_MACRO_COUNT]; diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index cc8a69ceca..c08e58653a 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -215,9 +215,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; break; diff --git a/keyboards/planck/rev7/keymaps/default/keymap.c b/keyboards/planck/rev7/keymaps/default/keymap.c index 47ded8aba5..6880e2fa94 100644 --- a/keyboards/planck/rev7/keymaps/default/keymap.c +++ b/keyboards/planck/rev7/keymaps/default/keymap.c @@ -255,9 +255,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } return false; break; diff --git a/keyboards/rocketboard_16/keycode_lookup.c b/keyboards/rocketboard_16/keycode_lookup.c index 41fd5c8537..a29808d04d 100644 --- a/keyboards/rocketboard_16/keycode_lookup.c +++ b/keyboards/rocketboard_16/keycode_lookup.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include "keycode_lookup.h" #include "quantum_keycodes.h" #include "keymap_us.h" diff --git a/keyboards/splitography/keymaps/default/keymap.c b/keyboards/splitography/keymaps/default/keymap.c index 9c6c7d6b26..5d26eb9682 100644 --- a/keyboards/splitography/keymaps/default/keymap.c +++ b/keyboards/splitography/keymaps/default/keymap.c @@ -214,9 +214,9 @@ void plover(keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } } diff --git a/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c b/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c index 787f448ffb..a3cb183758 100644 --- a/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c +++ b/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c @@ -214,9 +214,9 @@ void plover(keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } } diff --git a/keyboards/splitography/keymaps/dvorak/keymap.c b/keyboards/splitography/keymaps/dvorak/keymap.c index 992cfd0abb..0edec7043c 100644 --- a/keyboards/splitography/keymaps/dvorak/keymap.c +++ b/keyboards/splitography/keymaps/dvorak/keymap.c @@ -214,9 +214,9 @@ void plover(keyrecord_t *record) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } } diff --git a/keyboards/system76/launch_1/launch_1.c b/keyboards/system76/launch_1/launch_1.c index c9af479bf5..c01fb7b01d 100644 --- a/keyboards/system76/launch_1/launch_1.c +++ b/keyboards/system76/launch_1/launch_1.c @@ -16,6 +16,7 @@ */ #include "quantum.h" +#include "eeprom.h" #include "usb_mux.h" @@ -73,7 +74,7 @@ led_config_t g_led_config = { { } }; #endif // RGB_MATRIX_ENABLE -bool eeprom_is_valid(void) { +bool eeprom_is_valid(void) { return ( eeprom_read_word(((void *)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && eeprom_read_byte(((void *)EEPROM_VERSION_ADDR)) == EEPROM_VERSION diff --git a/keyboards/vitamins_included/rev2/rev2.c b/keyboards/vitamins_included/rev2/rev2.c index e445a3da45..28bd73cc75 100644 --- a/keyboards/vitamins_included/rev2/rev2.c +++ b/keyboards/vitamins_included/rev2/rev2.c @@ -12,7 +12,7 @@ bool is_keyboard_left(void) { gpio_set_pin_input(SPLIT_HAND_PIN); return x; #elif defined(EE_HANDS) - return eeprom_read_byte(EECONFIG_HANDEDNESS); + return eeconfig_read_handedness(); #endif return is_keyboard_master(); diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index 92c43c794d..7e56d98356 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -33,7 +33,7 @@ // Called from via_init() if VIA_ENABLE // Called from matrix_init_kb() if not VIA_ENABLE -void via_init_kb(void) +void wt_main_init(void) { // This checks both an EEPROM reset (from bootmagic lite, keycodes) // and also firmware build date (from via_eeprom_is_valid()) @@ -64,11 +64,9 @@ void via_init_kb(void) void matrix_init_kb(void) { // If VIA is disabled, we still need to load backlight settings. - // Call via_init_kb() the same way as via_init(), with setting - // EEPROM valid afterwards. + // Call via_init_kb() the same way as via_init_kb() does. #ifndef VIA_ENABLE - via_init_kb(); - via_eeprom_set_valid(true); + wt_main_init(); #endif // VIA_ENABLE matrix_init_user(); @@ -109,6 +107,10 @@ void suspend_wakeup_init_kb(void) // Moving this to the bottom of this source file is a workaround // for an intermittent compiler error for Atmel compiler. #ifdef VIA_ENABLE +void via_init_kb(void) { + wt_main_init(); +} + void via_custom_value_command_kb(uint8_t *data, uint8_t length) { uint8_t *command_id = &(data[0]); uint8_t *channel_id = &(data[1]); @@ -159,50 +161,3 @@ void via_set_device_indication(uint8_t value) } #endif // VIA_ENABLE - -// -// In the case of VIA being disabled, we still need to check if -// keyboard level EEPROM memory is valid before loading. -// Thus these are copies of the same functions in VIA, since -// the backlight settings reuse VIA's EEPROM magic/version, -// and the ones in via.c won't be compiled in. -// -// Yes, this is sub-optimal, and is only here for completeness -// (i.e. catering to the 1% of people that want wilba.tech LED bling -// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA). -// -#ifndef VIA_ENABLE - -bool via_eeprom_is_valid(void) -{ - char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54" - uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F ); - uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F ); - uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F ); - - return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 && - eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 && - eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 ); -} - -void via_eeprom_set_valid(bool valid) -{ - char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54" - uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F ); - uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F ); - uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F ); - - eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF); - eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF); - eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF); -} - -void via_eeprom_reset(void) -{ - // Set the VIA specific EEPROM state as invalid. - via_eeprom_set_valid(false); - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); -} - -#endif // VIA_ENABLE diff --git a/keyboards/wilba_tech/wt_mono_backlight.c b/keyboards/wilba_tech/wt_mono_backlight.c index 01fefc8ecc..8359aab135 100644 --- a/keyboards/wilba_tech/wt_mono_backlight.c +++ b/keyboards/wilba_tech/wt_mono_backlight.c @@ -25,6 +25,8 @@ #include "progmem.h" #include "eeprom.h" +#include "nvm_eeprom_eeconfig_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm +#include "nvm_eeprom_via_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm #include "via.h" // uses EEPROM address, lighting value IDs #define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR) diff --git a/keyboards/wilba_tech/wt_rgb_backlight.c b/keyboards/wilba_tech/wt_rgb_backlight.c index e52d002060..744bcb262d 100644 --- a/keyboards/wilba_tech/wt_rgb_backlight.c +++ b/keyboards/wilba_tech/wt_rgb_backlight.c @@ -66,6 +66,8 @@ #include "quantum/color.h" #include "eeprom.h" +#include "nvm_eeprom_eeconfig_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm +#include "nvm_eeprom_via_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm #include "via.h" // uses EEPROM address, lighting value IDs #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR) diff --git a/keyboards/xelus/la_plus/rgb_matrix_kb.inc b/keyboards/xelus/la_plus/rgb_matrix_kb.inc index 88dd2ab0a2..93d52ec9d0 100644 --- a/keyboards/xelus/la_plus/rgb_matrix_kb.inc +++ b/keyboards/xelus/la_plus/rgb_matrix_kb.inc @@ -31,7 +31,7 @@ static void startup_animation_setleds(effect_params_t* params, bool dots) { } else if (num == 0 || num == 1 || num == 2) { return; } else if (num >= 22) { - eeprom_read_block(&rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_matrix_config)); + eeconfig_read_rgb_matrix(&rgb_matrix_config); rgb_matrix_mode_noeeprom(rgb_matrix_config.mode); return; } diff --git a/quantum/action_util.c b/quantum/action_util.c index c0dc4f3822..9fe17f2124 100644 --- a/quantum/action_util.c +++ b/quantum/action_util.c @@ -220,7 +220,7 @@ bool is_oneshot_layer_active(void) { void oneshot_set(bool active) { if (keymap_config.oneshot_enable != active) { keymap_config.oneshot_enable = active; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); dprintf("Oneshot: active: %d\n", active); } diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 2cc3c2d661..4e223f0c9a 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -149,14 +149,14 @@ void audio_driver_start(void) { } void eeconfig_update_audio_current(void) { - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } void eeconfig_update_audio_default(void) { audio_config.valid = true; audio_config.enable = AUDIO_DEFAULT_ON; audio_config.clicky_enable = AUDIO_DEFAULT_CLICKY_ON; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } void audio_init(void) { @@ -164,7 +164,7 @@ void audio_init(void) { return; } - audio_config.raw = eeconfig_read_audio(); + eeconfig_read_audio(&audio_config); if (!audio_config.valid) { dprintf("audio_init audio_config.valid = 0. Write default values to EEPROM.\n"); eeconfig_update_audio_default(); @@ -196,7 +196,7 @@ void audio_toggle(void) { stop_all_notes(); } audio_config.enable ^= 1; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); if (audio_config.enable) { audio_on_user(); } else { @@ -206,7 +206,7 @@ void audio_toggle(void) { void audio_on(void) { audio_config.enable = 1; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); audio_on_user(); PLAY_SONG(audio_on_song); } @@ -217,7 +217,7 @@ void audio_off(void) { wait_ms(100); audio_stop_all(); audio_config.enable = 0; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } bool audio_is_on(void) { diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 054331d6f3..93dc6f62b1 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -28,7 +28,7 @@ # include "audio_dac.h" #endif -typedef union { +typedef union audio_config_t { uint8_t raw; struct { bool enable : 1; diff --git a/quantum/backlight/backlight.c b/quantum/backlight/backlight.c index eb64dd71e8..a7d2a45a51 100644 --- a/quantum/backlight/backlight.c +++ b/quantum/backlight/backlight.c @@ -16,7 +16,6 @@ along with this program. If not, see . */ #include "backlight.h" -#include "eeprom.h" #include "eeconfig.h" #include "debug.h" @@ -55,7 +54,7 @@ static void backlight_check_config(void) { * FIXME: needs doc */ void backlight_init(void) { - backlight_config.raw = eeconfig_read_backlight(); + eeconfig_read_backlight(&backlight_config); if (!backlight_config.valid) { dprintf("backlight_init backlight_config.valid = 0. Write default values to EEPROM.\n"); eeconfig_update_backlight_default(); @@ -74,7 +73,7 @@ void backlight_increase(void) { backlight_config.level++; } backlight_config.enable = 1; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight increase: %u\n", backlight_config.level); backlight_set(backlight_config.level); } @@ -87,7 +86,7 @@ void backlight_decrease(void) { if (backlight_config.level > 0) { backlight_config.level--; backlight_config.enable = !!backlight_config.level; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); } dprintf("backlight decrease: %u\n", backlight_config.level); backlight_set(backlight_config.level); @@ -116,7 +115,7 @@ void backlight_enable(void) { backlight_config.enable = true; if (backlight_config.raw == 1) // enabled but level == 0 backlight_config.level = 1; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight enable\n"); backlight_set(backlight_config.level); } @@ -129,7 +128,7 @@ void backlight_disable(void) { if (!backlight_config.enable) return; // do nothing if backlight is already off backlight_config.enable = false; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight disable\n"); backlight_set(0); } @@ -152,7 +151,7 @@ void backlight_step(void) { backlight_config.level = 0; } backlight_config.enable = !!backlight_config.level; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight step: %u\n", backlight_config.level); backlight_set(backlight_config.level); } @@ -173,19 +172,11 @@ void backlight_level_noeeprom(uint8_t level) { */ void backlight_level(uint8_t level) { backlight_level_noeeprom(level); - eeconfig_update_backlight(backlight_config.raw); -} - -uint8_t eeconfig_read_backlight(void) { - return eeprom_read_byte(EECONFIG_BACKLIGHT); -} - -void eeconfig_update_backlight(uint8_t val) { - eeprom_update_byte(EECONFIG_BACKLIGHT, val); + eeconfig_update_backlight(&backlight_config); } void eeconfig_update_backlight_current(void) { - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); } void eeconfig_update_backlight_default(void) { @@ -193,7 +184,7 @@ void eeconfig_update_backlight_default(void) { backlight_config.enable = BACKLIGHT_DEFAULT_ON; backlight_config.breathing = BACKLIGHT_DEFAULT_BREATHING; backlight_config.level = BACKLIGHT_DEFAULT_LEVEL; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); } /** \brief Get backlight level @@ -226,7 +217,7 @@ void backlight_enable_breathing(void) { if (backlight_config.breathing) return; // do nothing if breathing is already on backlight_config.breathing = true; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight breathing enable\n"); breathing_enable(); } @@ -239,7 +230,7 @@ void backlight_disable_breathing(void) { if (!backlight_config.breathing) return; // do nothing if breathing is already off backlight_config.breathing = false; - eeconfig_update_backlight(backlight_config.raw); + eeconfig_update_backlight(&backlight_config); dprintf("backlight breathing disable\n"); breathing_disable(); } diff --git a/quantum/backlight/backlight.h b/quantum/backlight/backlight.h index c34fb5858d..561c7f8a94 100644 --- a/quantum/backlight/backlight.h +++ b/quantum/backlight/backlight.h @@ -34,7 +34,7 @@ along with this program. If not, see . # define BREATHING_PERIOD 6 #endif -typedef union { +typedef union backlight_config_t { uint8_t raw; struct { bool enable : 1; @@ -58,10 +58,8 @@ void backlight_level_noeeprom(uint8_t level); void backlight_level(uint8_t level); uint8_t get_backlight_level(void); -uint8_t eeconfig_read_backlight(void); -void eeconfig_update_backlight(uint8_t val); -void eeconfig_update_backlight_current(void); -void eeconfig_update_backlight_default(void); +void eeconfig_update_backlight_current(void); +void eeconfig_update_backlight_default(void); // implementation specific void backlight_init_ports(void); diff --git a/quantum/command.c b/quantum/command.c index 024d96917d..96b637f842 100644 --- a/quantum/command.c +++ b/quantum/command.c @@ -246,7 +246,7 @@ static void print_eeconfig(void) { xprintf("eeconfig:\ndefault_layer: %u\n", eeconfig_read_default_layer()); debug_config_t dc; - dc.raw = eeconfig_read_debug(); + eeconfig_read_debug(&dc); xprintf(/* clang-format off */ "debug_config.raw: %02X\n" @@ -263,7 +263,7 @@ static void print_eeconfig(void) { ); /* clang-format on */ keymap_config_t kc; - kc.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&kc); xprintf(/* clang-format off */ "keymap_config.raw: %02X\n" @@ -296,7 +296,7 @@ static void print_eeconfig(void) { # ifdef BACKLIGHT_ENABLE backlight_config_t bc; - bc.raw = eeconfig_read_backlight(); + eeconfig_read_backlight(&bc); xprintf(/* clang-format off */ "backlight_config" diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index beb7f9d18f..756b232f59 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -1,4 +1,5 @@ /* Copyright 2017 Jason Williams (Wilba) + * Copyright 2024-2025 Nick Brassel (@tzarc) * * 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 @@ -21,14 +22,7 @@ #include "progmem.h" #include "send_string.h" #include "keycodes.h" - -#ifdef VIA_ENABLE -# include "via.h" -# define DYNAMIC_KEYMAP_EEPROM_START (VIA_EEPROM_CONFIG_END) -#else -# include "eeconfig.h" -# define DYNAMIC_KEYMAP_EEPROM_START (EECONFIG_SIZE) -#endif +#include "nvm_dynamic_keymap.h" #ifdef ENCODER_ENABLE # include "encoder.h" @@ -36,67 +30,6 @@ # define NUM_ENCODERS 0 #endif -#ifndef DYNAMIC_KEYMAP_LAYER_COUNT -# define DYNAMIC_KEYMAP_LAYER_COUNT 4 -#endif - -#ifndef DYNAMIC_KEYMAP_MACRO_COUNT -# define DYNAMIC_KEYMAP_MACRO_COUNT 16 -#endif - -#ifndef TOTAL_EEPROM_BYTE_COUNT -# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps. -#endif - -#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR -# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1) -#endif - -#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > (TOTAL_EEPROM_BYTE_COUNT - 1) -# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > " STR((TOTAL_EEPROM_BYTE_COUNT - 1)) -# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver -#endif - -// Due to usage of uint16_t check for max 65535 -#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535 -# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > 65535" -# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536 -#endif - -// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h, -#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR -# define DYNAMIC_KEYMAP_EEPROM_ADDR DYNAMIC_KEYMAP_EEPROM_START -#endif - -// Dynamic encoders starts after dynamic keymaps -#ifndef DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR -# define DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2)) -#endif - -// Dynamic macro starts after dynamic encoders, but only when using ENCODER_MAP -#ifdef ENCODER_MAP_ENABLE -# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR -# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * NUM_ENCODERS * 2 * 2)) -# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR -#else // ENCODER_MAP_ENABLE -# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR -# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) -# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR -#endif // ENCODER_MAP_ENABLE - -// Sanity check that dynamic keymaps fit in available EEPROM -// If there's not 100 bytes available for macros, then something is wrong. -// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it, -// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has -// more than the default. -_Static_assert((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); - -// Dynamic macros are stored after the keymaps and use what is available -// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR. -#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE -# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1) -#endif - #ifndef DYNAMIC_KEYMAP_MACRO_DELAY # define DYNAMIC_KEYMAP_MACRO_DELAY TAP_CODE_DELAY #endif @@ -105,52 +38,28 @@ uint8_t dynamic_keymap_get_layer_count(void) { return DYNAMIC_KEYMAP_LAYER_COUNT; } -void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { - // TODO: optimize this with some left shifts - return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2); -} - uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) { - if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return KC_NO; - void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); - // Big endian, so we can read/write EEPROM directly from host if we want - uint16_t keycode = eeprom_read_byte(address) << 8; - keycode |= eeprom_read_byte(address + 1); - return keycode; + return nvm_dynamic_keymap_read_keycode(layer, row, column); } void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) { - if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return; - void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); - // Big endian, so we can read/write EEPROM directly from host if we want - eeprom_update_byte(address, (uint8_t)(keycode >> 8)); - eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF)); + nvm_dynamic_keymap_update_keycode(layer, row, column, keycode); } #ifdef ENCODER_MAP_ENABLE -void *dynamic_keymap_encoder_to_eeprom_address(uint8_t layer, uint8_t encoder_id) { - return ((void *)DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) + (layer * NUM_ENCODERS * 2 * 2) + (encoder_id * 2 * 2); -} - uint16_t dynamic_keymap_get_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise) { - if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return KC_NO; - void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id); - // Big endian, so we can read/write EEPROM directly from host if we want - uint16_t keycode = ((uint16_t)eeprom_read_byte(address + (clockwise ? 0 : 2))) << 8; - keycode |= eeprom_read_byte(address + (clockwise ? 0 : 2) + 1); - return keycode; + return nvm_dynamic_keymap_read_encoder(layer, encoder_id, clockwise); } void dynamic_keymap_set_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode) { - if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return; - void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id); - // Big endian, so we can read/write EEPROM directly from host if we want - eeprom_update_byte(address + (clockwise ? 0 : 2), (uint8_t)(keycode >> 8)); - eeprom_update_byte(address + (clockwise ? 0 : 2) + 1, (uint8_t)(keycode & 0xFF)); + nvm_dynamic_keymap_update_encoder(layer, encoder_id, clockwise, keycode); } #endif // ENCODER_MAP_ENABLE void dynamic_keymap_reset(void) { + // Erase the keymaps, if necessary. + nvm_dynamic_keymap_erase(); + // Reset the keymaps in EEPROM to what is in flash. for (int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) { for (int row = 0; row < MATRIX_ROWS; row++) { @@ -168,31 +77,11 @@ void dynamic_keymap_reset(void) { } void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) { - uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; - void * source = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset); - uint8_t *target = data; - for (uint16_t i = 0; i < size; i++) { - if (offset + i < dynamic_keymap_eeprom_size) { - *target = eeprom_read_byte(source); - } else { - *target = 0x00; - } - source++; - target++; - } + nvm_dynamic_keymap_read_buffer(offset, size, data); } void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) { - uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; - void * target = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset); - uint8_t *source = data; - for (uint16_t i = 0; i < size; i++) { - if (offset + i < dynamic_keymap_eeprom_size) { - eeprom_update_byte(target, *source); - } - source++; - target++; - } + nvm_dynamic_keymap_update_buffer(offset, size, data); } uint16_t keycode_at_keymap_location(uint8_t layer_num, uint8_t row, uint8_t column) { @@ -216,53 +105,38 @@ uint8_t dynamic_keymap_macro_get_count(void) { } uint16_t dynamic_keymap_macro_get_buffer_size(void) { - return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; + return (uint16_t)nvm_dynamic_keymap_macro_size(); } void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) { - void * source = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset); - uint8_t *target = data; - for (uint16_t i = 0; i < size; i++) { - if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) { - *target = eeprom_read_byte(source); - } else { - *target = 0x00; - } - source++; - target++; - } + nvm_dynamic_keymap_macro_read_buffer(offset, size, data); } void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) { - void * target = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset); - uint8_t *source = data; - for (uint16_t i = 0; i < size; i++) { - if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) { - eeprom_update_byte(target, *source); - } - source++; - target++; - } + nvm_dynamic_keymap_macro_update_buffer(offset, size, data); } -typedef struct send_string_eeprom_state_t { - const uint8_t *ptr; -} send_string_eeprom_state_t; +static uint8_t dynamic_keymap_read_byte(uint32_t offset) { + uint8_t d; + nvm_dynamic_keymap_macro_read_buffer(offset, 1, &d); + return d; +} -char send_string_get_next_eeprom(void *arg) { - send_string_eeprom_state_t *state = (send_string_eeprom_state_t *)arg; - char ret = eeprom_read_byte(state->ptr); - state->ptr++; +typedef struct send_string_nvm_state_t { + uint32_t offset; +} send_string_nvm_state_t; + +char send_string_get_next_nvm(void *arg) { + send_string_nvm_state_t *state = (send_string_nvm_state_t *)arg; + char ret = dynamic_keymap_read_byte(state->offset); + state->offset++; return ret; } void dynamic_keymap_macro_reset(void) { - void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); - void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); - while (p != end) { - eeprom_update_byte(p, 0); - ++p; - } + // Erase the macros, if necessary. + nvm_dynamic_keymap_macro_erase(); + nvm_dynamic_keymap_macro_reset(); } void dynamic_keymap_macro_send(uint8_t id) { @@ -274,27 +148,26 @@ void dynamic_keymap_macro_send(uint8_t id) { // If it's not zero, then we are in the middle // of buffer writing, possibly an aborted buffer // write. So do nothing. - void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE - 1); - if (eeprom_read_byte(p) != 0) { + if (dynamic_keymap_read_byte(nvm_dynamic_keymap_macro_size() - 1) != 0) { return; } // Skip N null characters // p will then point to the Nth macro - p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); - void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + uint32_t offset = 0; + uint32_t end = nvm_dynamic_keymap_macro_size(); while (id > 0) { // If we are past the end of the buffer, then there is // no Nth macro in the buffer. - if (p == end) { + if (offset == end) { return; } - if (eeprom_read_byte(p) == 0) { + if (dynamic_keymap_read_byte(offset) == 0) { --id; } - ++p; + ++offset; } - send_string_eeprom_state_t state = {p}; - send_string_with_delay_impl(send_string_get_next_eeprom, &state, DYNAMIC_KEYMAP_MACRO_DELAY); + send_string_nvm_state_t state = {.offset = 0}; + send_string_with_delay_impl(send_string_get_next_nvm, &state, DYNAMIC_KEYMAP_MACRO_DELAY); } diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h index 806342efa3..f1d8077b12 100644 --- a/quantum/dynamic_keymap.h +++ b/quantum/dynamic_keymap.h @@ -18,8 +18,15 @@ #include #include +#ifndef DYNAMIC_KEYMAP_LAYER_COUNT +# define DYNAMIC_KEYMAP_LAYER_COUNT 4 +#endif + +#ifndef DYNAMIC_KEYMAP_MACRO_COUNT +# define DYNAMIC_KEYMAP_MACRO_COUNT 16 +#endif + uint8_t dynamic_keymap_get_layer_count(void); -void * dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); #ifdef ENCODER_MAP_ENABLE diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index e27f604f12..9aa60fc968 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -1,355 +1,333 @@ #include #include #include +#include "debug.h" #include "eeprom.h" #include "eeconfig.h" +#include "action_layer.h" +#include "nvm_eeconfig.h" +#include "keycode_config.h" -#if defined(EEPROM_DRIVER) +#ifdef EEPROM_DRIVER # include "eeprom_driver.h" -#endif +#endif // EEPROM_DRIVER -#if defined(HAPTIC_ENABLE) +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif // BACKLIGHT_ENABLE + +#ifdef AUDIO_ENABLE +# include "audio.h" +#endif // AUDIO_ENABLE + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif // RGBLIGHT_ENABLE + +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_types.h" +#endif // RGB_MATRIX_ENABLE + +#ifdef LED_MATRIX_ENABLE +# include "led_matrix_types.h" +#endif // LED_MATRIX_ENABLE + +#ifdef UNICODE_COMMON_ENABLE +# include "unicode.h" +#endif // UNICODE_COMMON_ENABLE + +#ifdef HAPTIC_ENABLE # include "haptic.h" -#endif +#endif // HAPTIC_ENABLE -#if defined(VIA_ENABLE) +#ifdef VIA_ENABLE bool via_eeprom_is_valid(void); void via_eeprom_set_valid(bool valid); void eeconfig_init_via(void); -#endif +#else +void dynamic_keymap_reset(void); +#endif // VIA_ENABLE -_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect"); - -/** \brief eeconfig enable - * - * FIXME: needs doc - */ __attribute__((weak)) void eeconfig_init_user(void) { #if (EECONFIG_USER_DATA_SIZE) == 0 // Reset user EEPROM value to blank, rather than to a set value eeconfig_update_user(0); -#endif +#endif // (EECONFIG_USER_DATA_SIZE) == 0 } __attribute__((weak)) void eeconfig_init_kb(void) { #if (EECONFIG_KB_DATA_SIZE) == 0 // Reset Keyboard EEPROM value to blank, rather than to a set value eeconfig_update_kb(0); -#endif +#endif // (EECONFIG_KB_DATA_SIZE) == 0 eeconfig_init_user(); } -/* - * FIXME: needs doc - */ void eeconfig_init_quantum(void) { -#if defined(EEPROM_DRIVER) - eeprom_driver_format(false); -#endif + nvm_eeconfig_erase(); + + eeconfig_enable(); + + debug_config_t debug_config = {0}; + eeconfig_update_debug(&debug_config); - eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); - eeprom_update_byte(EECONFIG_DEBUG, 0); default_layer_state = (layer_state_t)1 << 0; eeconfig_update_default_layer(default_layer_state); - // Enable oneshot and autocorrect by default: 0b0001 0100 0000 0000 - eeprom_update_word(EECONFIG_KEYMAP, 0x1400); - eeprom_update_byte(EECONFIG_BACKLIGHT, 0); - eeprom_update_byte(EECONFIG_AUDIO, 0); - eeprom_update_dword(EECONFIG_RGBLIGHT, 0); - eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0); - eeprom_update_byte(EECONFIG_UNICODEMODE, 0); - eeprom_update_byte(EECONFIG_STENOMODE, 0); - eeprom_write_qword(EECONFIG_RGB_MATRIX, 0); - eeprom_update_dword(EECONFIG_HAPTIC, 0); -#if defined(HAPTIC_ENABLE) - haptic_reset(); + + keymap_config_t keymap_config = { + .swap_control_capslock = false, + .capslock_to_control = false, + .swap_lalt_lgui = false, + .swap_ralt_rgui = false, + .no_gui = false, + .swap_grave_esc = false, + .swap_backslash_backspace = false, + .nkro = false, + .swap_lctl_lgui = false, + .swap_rctl_rgui = false, + .oneshot_enable = true, // Enable oneshot by default + .swap_escape_capslock = false, + .autocorrect_enable = true, // Enable autocorrect by default + }; + eeconfig_update_keymap(&keymap_config); + +#ifdef BACKLIGHT_ENABLE + backlight_config_t backlight_config = {0}; + eeconfig_update_backlight(&backlight_config); +#endif // BACKLIGHT_ENABLE + +#ifdef AUDIO_ENABLE + audio_config_t audio_config = {0}; + eeconfig_update_audio(&audio_config); +#endif // AUDIO_ENABLE + +#ifdef RGBLIGHT_ENABLE + rgblight_config_t rgblight_config = {0}; + eeconfig_update_rgblight(&rgblight_config); +#endif // RGBLIGHT_ENABLE + +#ifdef UNICODE_COMMON_ENABLE + unicode_config_t unicode_config = {0}; + eeconfig_update_unicode_mode(&unicode_config); +#endif // UNICODE_COMMON_ENABLE + +#ifdef STENO_ENABLE + eeconfig_update_steno_mode(0); +#endif // STENO_ENABLE + +#ifdef RGB_MATRIX_ENABLE + rgb_config_t rgb_matrix_config = {0}; + eeconfig_update_rgb_matrix(&rgb_matrix_config); #endif +#ifdef LED_MATRIX_ENABLE + led_eeconfig_t led_matrix_config = {0}; + eeconfig_update_led_matrix(&led_matrix_config); +#endif // LED_MATRIX_ENABLE + +#ifdef HAPTIC_ENABLE + haptic_config_t haptic_config = {0}; + eeconfig_update_haptic(&haptic_config); + haptic_reset(); +#endif // HAPTIC_ENABLE + #if (EECONFIG_KB_DATA_SIZE) > 0 eeconfig_init_kb_datablock(); -#endif +#endif // (EECONFIG_KB_DATA_SIZE) > 0 #if (EECONFIG_USER_DATA_SIZE) > 0 eeconfig_init_user_datablock(); -#endif +#endif // (EECONFIG_USER_DATA_SIZE) > 0 #if defined(VIA_ENABLE) // Invalidate VIA eeprom config, and then reset. - // Just in case if power is lost mid init, this makes sure that it pets + // Just in case if power is lost mid init, this makes sure that it gets // properly re-initialized. - via_eeprom_set_valid(false); eeconfig_init_via(); +#elif defined(DYNAMIC_KEYMAP_ENABLE) + dynamic_keymap_reset(); #endif eeconfig_init_kb(); } -/** \brief eeconfig initialization - * - * FIXME: needs doc - */ void eeconfig_init(void) { eeconfig_init_quantum(); } -/** \brief eeconfig enable - * - * FIXME: needs doc - */ void eeconfig_enable(void) { - eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); + nvm_eeconfig_enable(); } -/** \brief eeconfig disable - * - * FIXME: needs doc - */ void eeconfig_disable(void) { -#if defined(EEPROM_DRIVER) - eeprom_driver_format(false); -#endif - eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); + nvm_eeconfig_disable(); } -/** \brief eeconfig is enabled - * - * FIXME: needs doc - */ bool eeconfig_is_enabled(void) { - bool is_eeprom_enabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); + bool is_eeprom_enabled = nvm_eeconfig_is_enabled(); #ifdef VIA_ENABLE if (is_eeprom_enabled) { is_eeprom_enabled = via_eeprom_is_valid(); } -#endif +#endif // VIA_ENABLE return is_eeprom_enabled; } -/** \brief eeconfig is disabled - * - * FIXME: needs doc - */ bool eeconfig_is_disabled(void) { - bool is_eeprom_disabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF); + bool is_eeprom_disabled = nvm_eeconfig_is_disabled(); #ifdef VIA_ENABLE if (!is_eeprom_disabled) { is_eeprom_disabled = !via_eeprom_is_valid(); } -#endif +#endif // VIA_ENABLE return is_eeprom_disabled; } -/** \brief eeconfig read debug - * - * FIXME: needs doc - */ -uint8_t eeconfig_read_debug(void) { - return eeprom_read_byte(EECONFIG_DEBUG); +void eeconfig_read_debug(debug_config_t *debug_config) { + nvm_eeconfig_read_debug(debug_config); } -/** \brief eeconfig update debug - * - * FIXME: needs doc - */ -void eeconfig_update_debug(uint8_t val) { - eeprom_update_byte(EECONFIG_DEBUG, val); +void eeconfig_update_debug(const debug_config_t *debug_config) { + nvm_eeconfig_update_debug(debug_config); } -/** \brief eeconfig read default layer - * - * FIXME: needs doc - */ layer_state_t eeconfig_read_default_layer(void) { - uint8_t val = eeprom_read_byte(EECONFIG_DEFAULT_LAYER); - -#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK - // stored as a layer number, so convert back to bitmask - return 1 << val; -#else - // stored as 8-bit-wide bitmask, so read the value directly - handling padding to 16/32 bit layer_state_t - return val; -#endif + return nvm_eeconfig_read_default_layer(); } -/** \brief eeconfig update default layer - * - * FIXME: needs doc - */ void eeconfig_update_default_layer(layer_state_t state) { -#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK - // stored as a layer number, so only store the highest layer - uint8_t val = get_highest_layer(state); -#else - // stored as 8-bit-wide bitmask, so write the value directly - handling truncation from 16/32 bit layer_state_t - uint8_t val = state; -#endif - - eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); + nvm_eeconfig_update_default_layer(state); } -/** \brief eeconfig read keymap - * - * FIXME: needs doc - */ -uint16_t eeconfig_read_keymap(void) { - return eeprom_read_word(EECONFIG_KEYMAP); +void eeconfig_read_keymap(keymap_config_t *keymap_config) { + nvm_eeconfig_read_keymap(keymap_config); } -/** \brief eeconfig update keymap - * - * FIXME: needs doc - */ -void eeconfig_update_keymap(uint16_t val) { - eeprom_update_word(EECONFIG_KEYMAP, val); +void eeconfig_update_keymap(const keymap_config_t *keymap_config) { + nvm_eeconfig_update_keymap(keymap_config); } -/** \brief eeconfig read audio - * - * FIXME: needs doc - */ -uint8_t eeconfig_read_audio(void) { - return eeprom_read_byte(EECONFIG_AUDIO); +#ifdef AUDIO_ENABLE +void eeconfig_read_audio(audio_config_t *audio_config) { + nvm_eeconfig_read_audio(audio_config); } -/** \brief eeconfig update audio - * - * FIXME: needs doc - */ -void eeconfig_update_audio(uint8_t val) { - eeprom_update_byte(EECONFIG_AUDIO, val); +void eeconfig_update_audio(const audio_config_t *audio_config) { + nvm_eeconfig_update_audio(audio_config); } +#endif // AUDIO_ENABLE + +#ifdef UNICODE_COMMON_ENABLE +void eeconfig_read_unicode_mode(unicode_config_t *unicode_config) { + return nvm_eeconfig_read_unicode_mode(unicode_config); +} +void eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) { + nvm_eeconfig_update_unicode_mode(unicode_config); +} +#endif // UNICODE_COMMON_ENABLE + +#ifdef BACKLIGHT_ENABLE +void eeconfig_read_backlight(backlight_config_t *backlight_config) { + nvm_eeconfig_read_backlight(backlight_config); +} +void eeconfig_update_backlight(const backlight_config_t *backlight_config) { + nvm_eeconfig_update_backlight(backlight_config); +} +#endif // BACKLIGHT_ENABLE + +#ifdef STENO_ENABLE +uint8_t eeconfig_read_steno_mode(void) { + return nvm_eeconfig_read_steno_mode(); +} +void eeconfig_update_steno_mode(uint8_t val) { + nvm_eeconfig_update_steno_mode(val); +} +#endif // STENO_ENABLE + +#ifdef RGB_MATRIX_ENABLE +void eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) { + nvm_eeconfig_read_rgb_matrix(rgb_matrix_config); +} +void eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) { + nvm_eeconfig_update_rgb_matrix(rgb_matrix_config); +} +#endif // RGB_MATRIX_ENABLE + +#ifdef LED_MATRIX_ENABLE +void eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) { + nvm_eeconfig_read_led_matrix(led_matrix_config); +} +void eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) { + nvm_eeconfig_update_led_matrix(led_matrix_config); +} +#endif // LED_MATRIX_ENABLE + +#ifdef RGBLIGHT_ENABLE +void eeconfig_read_rgblight(rgblight_config_t *rgblight_config) { + nvm_eeconfig_read_rgblight(rgblight_config); +} +void eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) { + nvm_eeconfig_update_rgblight(rgblight_config); +} +#endif // RGBLIGHT_ENABLE #if (EECONFIG_KB_DATA_SIZE) == 0 -/** \brief eeconfig read kb - * - * FIXME: needs doc - */ uint32_t eeconfig_read_kb(void) { - return eeprom_read_dword(EECONFIG_KEYBOARD); + return nvm_eeconfig_read_kb(); } -/** \brief eeconfig update kb - * - * FIXME: needs doc - */ void eeconfig_update_kb(uint32_t val) { - eeprom_update_dword(EECONFIG_KEYBOARD, val); + nvm_eeconfig_update_kb(val); } #endif // (EECONFIG_KB_DATA_SIZE) == 0 #if (EECONFIG_USER_DATA_SIZE) == 0 -/** \brief eeconfig read user - * - * FIXME: needs doc - */ uint32_t eeconfig_read_user(void) { - return eeprom_read_dword(EECONFIG_USER); + return nvm_eeconfig_read_user(); } -/** \brief eeconfig update user - * - * FIXME: needs doc - */ void eeconfig_update_user(uint32_t val) { - eeprom_update_dword(EECONFIG_USER, val); + nvm_eeconfig_update_user(val); } #endif // (EECONFIG_USER_DATA_SIZE) == 0 -/** \brief eeconfig read haptic - * - * FIXME: needs doc - */ -uint32_t eeconfig_read_haptic(void) { - return eeprom_read_dword(EECONFIG_HAPTIC); +#ifdef HAPTIC_ENABLE +void eeconfig_read_haptic(haptic_config_t *haptic_config) { + nvm_eeconfig_read_haptic(haptic_config); } -/** \brief eeconfig update haptic - * - * FIXME: needs doc - */ -void eeconfig_update_haptic(uint32_t val) { - eeprom_update_dword(EECONFIG_HAPTIC, val); +void eeconfig_update_haptic(const haptic_config_t *haptic_config) { + nvm_eeconfig_update_haptic(haptic_config); } +#endif // HAPTIC_ENABLE -/** \brief eeconfig read split handedness - * - * FIXME: needs doc - */ bool eeconfig_read_handedness(void) { - return !!eeprom_read_byte(EECONFIG_HANDEDNESS); + return nvm_eeconfig_read_handedness(); } -/** \brief eeconfig update split handedness - * - * FIXME: needs doc - */ void eeconfig_update_handedness(bool val) { - eeprom_update_byte(EECONFIG_HANDEDNESS, !!val); + nvm_eeconfig_update_handedness(val); } #if (EECONFIG_KB_DATA_SIZE) > 0 -/** \brief eeconfig assert keyboard data block version - * - * FIXME: needs doc - */ bool eeconfig_is_kb_datablock_valid(void) { - return eeprom_read_dword(EECONFIG_KEYBOARD) == (EECONFIG_KB_DATA_VERSION); + return nvm_eeconfig_is_kb_datablock_valid(); } -/** \brief eeconfig read keyboard data block - * - * FIXME: needs doc - */ -void eeconfig_read_kb_datablock(void *data) { - if (eeconfig_is_kb_datablock_valid()) { - eeprom_read_block(data, EECONFIG_KB_DATABLOCK, (EECONFIG_KB_DATA_SIZE)); - } else { - memset(data, 0, (EECONFIG_KB_DATA_SIZE)); - } +uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) { + return nvm_eeconfig_read_kb_datablock(data, offset, length); } -/** \brief eeconfig update keyboard data block - * - * FIXME: needs doc - */ -void eeconfig_update_kb_datablock(const void *data) { - eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION)); - eeprom_update_block(data, EECONFIG_KB_DATABLOCK, (EECONFIG_KB_DATA_SIZE)); +uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) { + return nvm_eeconfig_update_kb_datablock(data, offset, length); } -/** \brief eeconfig init keyboard data block - * - * FIXME: needs doc - */ __attribute__((weak)) void eeconfig_init_kb_datablock(void) { - uint8_t dummy_kb[(EECONFIG_KB_DATA_SIZE)] = {0}; - eeconfig_update_kb_datablock(dummy_kb); + nvm_eeconfig_init_kb_datablock(); } #endif // (EECONFIG_KB_DATA_SIZE) > 0 #if (EECONFIG_USER_DATA_SIZE) > 0 -/** \brief eeconfig assert user data block version - * - * FIXME: needs doc - */ bool eeconfig_is_user_datablock_valid(void) { - return eeprom_read_dword(EECONFIG_USER) == (EECONFIG_USER_DATA_VERSION); + return nvm_eeconfig_is_user_datablock_valid(); } -/** \brief eeconfig read user data block - * - * FIXME: needs doc - */ -void eeconfig_read_user_datablock(void *data) { - if (eeconfig_is_user_datablock_valid()) { - eeprom_read_block(data, EECONFIG_USER_DATABLOCK, (EECONFIG_USER_DATA_SIZE)); - } else { - memset(data, 0, (EECONFIG_USER_DATA_SIZE)); - } +uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) { + return nvm_eeconfig_read_user_datablock(data, offset, length); } -/** \brief eeconfig update user data block - * - * FIXME: needs doc - */ -void eeconfig_update_user_datablock(const void *data) { - eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION)); - eeprom_update_block(data, EECONFIG_USER_DATABLOCK, (EECONFIG_USER_DATA_SIZE)); +uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) { + return nvm_eeconfig_update_user_datablock(data, offset, length); } -/** \brief eeconfig init user data block - * - * FIXME: needs doc - */ __attribute__((weak)) void eeconfig_init_user_datablock(void) { - uint8_t dummy_user[(EECONFIG_USER_DATA_SIZE)] = {0}; - eeconfig_update_user_datablock(dummy_user); + nvm_eeconfig_init_user_datablock(); } #endif // (EECONFIG_USER_DATA_SIZE) > 0 diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index 11cf1ccbca..4044f1c294 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -19,59 +19,9 @@ along with this program. If not, see . #include #include -#include // offsetof -#include "eeprom.h" -#include "util.h" +#include // offsetof #include "action_layer.h" // layer_state_t -#ifndef EECONFIG_MAGIC_NUMBER -# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues -#endif -#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF - -// Dummy struct only used to calculate offsets -typedef struct PACKED { - uint16_t magic; - uint8_t debug; - uint8_t default_layer; - uint16_t keymap; - uint8_t backlight; - uint8_t audio; - uint32_t rgblight; - uint8_t unicode; - uint8_t steno; - uint8_t handedness; - uint32_t keyboard; - uint32_t user; - union { // Mutually exclusive - uint32_t led_matrix; - uint64_t rgb_matrix; - }; - uint32_t haptic; - uint8_t rgblight_ext; -} eeprom_core_t; - -/* EEPROM parameter address */ -#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic)) -#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug)) -#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer)) -#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap)) -#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight)) -#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio)) -#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight)) -#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode)) -#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno)) -#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness)) -#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard)) -#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user)) -#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix)) -#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix)) -#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic)) -#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext)) - -// Size of EEPROM being used for core data storage -#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t)) - // Size of EEPROM dedicated to keyboard- and user-specific data #ifndef EECONFIG_KB_DATA_SIZE # define EECONFIG_KB_DATA_SIZE 0 @@ -86,12 +36,6 @@ typedef struct PACKED { # define EECONFIG_USER_DATA_VERSION (EECONFIG_USER_DATA_SIZE) #endif -#define EECONFIG_KB_DATABLOCK ((uint8_t *)(EECONFIG_BASE_SIZE)) -#define EECONFIG_USER_DATABLOCK ((uint8_t *)((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE))) - -// Size of EEPROM being used, other code can refer to this for available EEPROM -#define EECONFIG_SIZE ((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE) + (EECONFIG_USER_DATA_SIZE)) - /* debug bit */ #define EECONFIG_DEBUG_ENABLE (1 << 0) #define EECONFIG_DEBUG_MATRIX (1 << 1) @@ -117,22 +61,59 @@ void eeconfig_init_kb(void); void eeconfig_init_user(void); void eeconfig_enable(void); - void eeconfig_disable(void); -uint8_t eeconfig_read_debug(void); -void eeconfig_update_debug(uint8_t val); +typedef union debug_config_t debug_config_t; +void eeconfig_read_debug(debug_config_t *debug_config) __attribute__((nonnull)); +void eeconfig_update_debug(const debug_config_t *debug_config) __attribute__((nonnull)); layer_state_t eeconfig_read_default_layer(void); -void eeconfig_update_default_layer(layer_state_t val); +void eeconfig_update_default_layer(layer_state_t state); -uint16_t eeconfig_read_keymap(void); -void eeconfig_update_keymap(uint16_t val); +typedef union keymap_config_t keymap_config_t; +void eeconfig_read_keymap(keymap_config_t *keymap_config) __attribute__((nonnull)); +void eeconfig_update_keymap(const keymap_config_t *keymap_config) __attribute__((nonnull)); #ifdef AUDIO_ENABLE -uint8_t eeconfig_read_audio(void); -void eeconfig_update_audio(uint8_t val); -#endif +typedef union audio_config_t audio_config_t; +void eeconfig_read_audio(audio_config_t *audio_config) __attribute__((nonnull)); +void eeconfig_update_audio(const audio_config_t *audio_config) __attribute__((nonnull)); +#endif // AUDIO_ENABLE + +#ifdef UNICODE_COMMON_ENABLE +typedef union unicode_config_t unicode_config_t; +void eeconfig_read_unicode_mode(unicode_config_t *unicode_config) __attribute__((nonnull)); +void eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) __attribute__((nonnull)); +#endif // UNICODE_COMMON_ENABLE + +#ifdef BACKLIGHT_ENABLE +typedef union backlight_config_t backlight_config_t; +void eeconfig_read_backlight(backlight_config_t *backlight_config) __attribute__((nonnull)); +void eeconfig_update_backlight(const backlight_config_t *backlight_config) __attribute__((nonnull)); +#endif // BACKLIGHT_ENABLE + +#ifdef STENO_ENABLE +uint8_t eeconfig_read_steno_mode(void); +void eeconfig_update_steno_mode(uint8_t val); +#endif // STENO_ENABLE + +#ifdef RGB_MATRIX_ENABLE +typedef union rgb_config_t rgb_config_t; +void eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) __attribute__((nonnull)); +void eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) __attribute__((nonnull)); +#endif // RGB_MATRIX_ENABLE + +#ifdef LED_MATRIX_ENABLE +typedef union led_eeconfig_t led_eeconfig_t; +void eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) __attribute__((nonnull)); +void eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) __attribute__((nonnull)); +#endif // LED_MATRIX_ENABLE + +#ifdef RGBLIGHT_ENABLE +typedef union rgblight_config_t rgblight_config_t; +void eeconfig_read_rgblight(rgblight_config_t *rgblight_config) __attribute__((nonnull)); +void eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) __attribute__((nonnull)); +#endif // RGBLIGHT_ENABLE #if (EECONFIG_KB_DATA_SIZE) == 0 uint32_t eeconfig_read_kb(void); @@ -145,31 +126,36 @@ void eeconfig_update_user(uint32_t val); #endif // (EECONFIG_USER_DATA_SIZE) == 0 #ifdef HAPTIC_ENABLE -uint32_t eeconfig_read_haptic(void); -void eeconfig_update_haptic(uint32_t val); +typedef union haptic_config_t haptic_config_t; +void eeconfig_read_haptic(haptic_config_t *haptic_config) __attribute__((nonnull)); +void eeconfig_update_haptic(const haptic_config_t *haptic_config) __attribute__((nonnull)); #endif bool eeconfig_read_handedness(void); void eeconfig_update_handedness(bool val); #if (EECONFIG_KB_DATA_SIZE) > 0 -bool eeconfig_is_kb_datablock_valid(void); -void eeconfig_read_kb_datablock(void *data); -void eeconfig_update_kb_datablock(const void *data); -void eeconfig_init_kb_datablock(void); +bool eeconfig_is_kb_datablock_valid(void); +uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); +uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); +void eeconfig_init_kb_datablock(void); +# define eeconfig_read_kb_datablock_field(__object, __field) eeconfig_read_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field)) +# define eeconfig_update_kb_datablock_field(__object, __field) eeconfig_update_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field)) #endif // (EECONFIG_KB_DATA_SIZE) > 0 #if (EECONFIG_USER_DATA_SIZE) > 0 -bool eeconfig_is_user_datablock_valid(void); -void eeconfig_read_user_datablock(void *data); -void eeconfig_update_user_datablock(const void *data); -void eeconfig_init_user_datablock(void); +bool eeconfig_is_user_datablock_valid(void); +uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); +uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); +void eeconfig_init_user_datablock(void); +# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field)) +# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field)) #endif // (EECONFIG_USER_DATA_SIZE) > 0 // Any "checked" debounce variant used requires implementation of: // -- bool eeconfig_check_valid_##name(void) // -- void eeconfig_post_flush_##name(void) -#define EECONFIG_DEBOUNCE_HELPER_CHECKED(name, offset, config) \ +#define EECONFIG_DEBOUNCE_HELPER_CHECKED(name, config) \ static uint8_t dirty_##name = false; \ \ bool eeconfig_check_valid_##name(void); \ @@ -178,13 +164,13 @@ void eeconfig_init_user_datablock(void); static inline void eeconfig_init_##name(void) { \ dirty_##name = true; \ if (eeconfig_check_valid_##name()) { \ - eeprom_read_block(&config, offset, sizeof(config)); \ + eeconfig_read_##name(&config); \ dirty_##name = false; \ } \ } \ static inline void eeconfig_flush_##name(bool force) { \ if (force || dirty_##name) { \ - eeprom_update_block(&config, offset, sizeof(config)); \ + eeconfig_update_##name(&config); \ eeconfig_post_flush_##name(); \ dirty_##name = false; \ } \ @@ -206,10 +192,10 @@ void eeconfig_init_user_datablock(void); } \ } -#define EECONFIG_DEBOUNCE_HELPER(name, offset, config) \ - EECONFIG_DEBOUNCE_HELPER_CHECKED(name, offset, config) \ - \ - bool eeconfig_check_valid_##name(void) { \ - return true; \ - } \ +#define EECONFIG_DEBOUNCE_HELPER(name, config) \ + EECONFIG_DEBOUNCE_HELPER_CHECKED(name, config) \ + \ + bool eeconfig_check_valid_##name(void) { \ + return true; \ + } \ void eeconfig_post_flush_##name(void) {} diff --git a/quantum/haptic.c b/quantum/haptic.c index 81bad469b3..8a743480ff 100644 --- a/quantum/haptic.c +++ b/quantum/haptic.c @@ -67,7 +67,7 @@ void haptic_init(void) { if (!eeconfig_is_enabled()) { eeconfig_init(); } - haptic_config.raw = eeconfig_read_haptic(); + eeconfig_read_haptic(&haptic_config); #ifdef HAPTIC_SOLENOID solenoid_set_dwell(haptic_config.dwell); #endif @@ -122,13 +122,13 @@ void eeconfig_debug_haptic(void) { void haptic_enable(void) { set_haptic_config_enable(true); dprintf("haptic_config.enable = %u\n", haptic_config.enable); - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); } void haptic_disable(void) { set_haptic_config_enable(false); dprintf("haptic_config.enable = %u\n", haptic_config.enable); - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); } void haptic_toggle(void) { @@ -137,14 +137,14 @@ void haptic_toggle(void) { } else { haptic_enable(); } - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); } void haptic_feedback_toggle(void) { haptic_config.feedback++; if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX) haptic_config.feedback = KEY_PRESS; dprintf("haptic_config.feedback = %u\n", !haptic_config.feedback); - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); } void haptic_buzz_toggle(void) { @@ -225,26 +225,26 @@ void haptic_reset(void) { haptic_config.dwell = 0; haptic_config.buzz = 0; #endif - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.feedback = %u\n", haptic_config.feedback); dprintf("haptic_config.mode = %u\n", haptic_config.mode); } void haptic_set_feedback(uint8_t feedback) { haptic_config.feedback = feedback; - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.feedback = %u\n", haptic_config.feedback); } void haptic_set_mode(uint8_t mode) { haptic_config.mode = mode; - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.mode = %u\n", haptic_config.mode); } void haptic_set_amplitude(uint8_t amp) { haptic_config.amplitude = amp; - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.amplitude = %u\n", haptic_config.amplitude); #ifdef HAPTIC_DRV2605L drv2605l_amplitude(amp); @@ -253,13 +253,13 @@ void haptic_set_amplitude(uint8_t amp) { void haptic_set_buzz(uint8_t buzz) { haptic_config.buzz = buzz; - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.buzz = %u\n", haptic_config.buzz); } void haptic_set_dwell(uint8_t dwell) { haptic_config.dwell = dwell; - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); dprintf("haptic_config.dwell = %u\n", haptic_config.dwell); } @@ -291,7 +291,7 @@ uint8_t haptic_get_dwell(void) { void haptic_enable_continuous(void) { haptic_config.cont = 1; dprintf("haptic_config.cont = %u\n", haptic_config.cont); - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); #ifdef HAPTIC_DRV2605L drv2605l_rtp_init(); #endif @@ -300,7 +300,7 @@ void haptic_enable_continuous(void) { void haptic_disable_continuous(void) { haptic_config.cont = 0; dprintf("haptic_config.cont = %u\n", haptic_config.cont); - eeconfig_update_haptic(haptic_config.raw); + eeconfig_update_haptic(&haptic_config); #ifdef HAPTIC_DRV2605L drv2605l_write(DRV2605L_REG_MODE, 0x00); #endif diff --git a/quantum/haptic.h b/quantum/haptic.h index b283d5d268..e27f546d40 100644 --- a/quantum/haptic.h +++ b/quantum/haptic.h @@ -28,7 +28,7 @@ #endif /* EEPROM config settings */ -typedef union { +typedef union haptic_config_t { uint32_t raw; struct { bool enable : 1; diff --git a/quantum/keyboard.c b/quantum/keyboard.c index fccdaf2990..0671b0461f 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -432,8 +432,8 @@ void quantum_init(void) { } /* init globals */ - debug_config.raw = eeconfig_read_debug(); - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_debug(&debug_config); + eeconfig_read_keymap(&keymap_config); #ifdef BOOTMAGIC_ENABLE bootmagic(); @@ -504,7 +504,7 @@ void keyboard_init(void) { #endif #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); #endif #ifdef DIP_SWITCH_ENABLE dip_switch_init(); diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h index d1352c302e..529cd0e127 100644 --- a/quantum/keycode_config.h +++ b/quantum/keycode_config.h @@ -28,7 +28,7 @@ uint16_t keycode_config(uint16_t keycode); uint8_t mod_config(uint8_t mod); /* NOTE: Not portable. Bit field order depends on implementation */ -typedef union { +typedef union keymap_config_t { uint16_t raw; struct { bool swap_control_capslock : 1; diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index 58263c62e3..2e107a66e9 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -86,9 +86,9 @@ static last_hit_t last_hit_buffer; const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT; #endif -EECONFIG_DEBOUNCE_HELPER(led_matrix, EECONFIG_LED_MATRIX, led_matrix_eeconfig); +EECONFIG_DEBOUNCE_HELPER(led_matrix, led_matrix_eeconfig); -void eeconfig_update_led_matrix(void) { +void eeconfig_force_flush_led_matrix(void) { eeconfig_flush_led_matrix(true); } diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h index a3468a2003..0006d487e9 100644 --- a/quantum/led_matrix/led_matrix.h +++ b/quantum/led_matrix/led_matrix.h @@ -115,7 +115,7 @@ enum led_matrix_effects { }; void eeconfig_update_led_matrix_default(void); -void eeconfig_update_led_matrix(void); +void eeconfig_force_flush_led_matrix(void); void eeconfig_debug_led_matrix(void); uint8_t led_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i); diff --git a/quantum/led_matrix/led_matrix_types.h b/quantum/led_matrix/led_matrix_types.h index 5a516ceb10..810420f46f 100644 --- a/quantum/led_matrix/led_matrix_types.h +++ b/quantum/led_matrix/led_matrix_types.h @@ -71,7 +71,7 @@ typedef struct PACKED { uint8_t flags[LED_MATRIX_LED_COUNT]; } led_config_t; -typedef union { +typedef union led_eeconfig_t { uint32_t raw; struct PACKED { uint8_t enable : 2; diff --git a/quantum/logging/debug.h b/quantum/logging/debug.h index b0d9b9a10e..6675680ec7 100644 --- a/quantum/logging/debug.h +++ b/quantum/logging/debug.h @@ -28,7 +28,7 @@ extern "C" { /* * Debug output control */ -typedef union { +typedef union debug_config_t { struct { bool enable : 1; bool matrix : 1; diff --git a/quantum/nvm/eeprom/nvm_dynamic_keymap.c b/quantum/nvm/eeprom/nvm_dynamic_keymap.c new file mode 100644 index 0000000000..5f514acc1a --- /dev/null +++ b/quantum/nvm/eeprom/nvm_dynamic_keymap.c @@ -0,0 +1,193 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "keycodes.h" +#include "eeprom.h" +#include "dynamic_keymap.h" +#include "nvm_dynamic_keymap.h" +#include "nvm_eeprom_eeconfig_internal.h" +#include "nvm_eeprom_via_internal.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef ENCODER_ENABLE +# include "encoder.h" +#endif + +#ifdef VIA_ENABLE +# include "via.h" +# define DYNAMIC_KEYMAP_EEPROM_START (VIA_EEPROM_CONFIG_END) +#else +# define DYNAMIC_KEYMAP_EEPROM_START (EECONFIG_SIZE) +#endif + +#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR +# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1) +#endif + +_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= (TOTAL_EEPROM_BYTE_COUNT - 1), "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver"); + +// Due to usage of uint16_t check for max 65535 +_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536"); + +// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h, +#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR +# define DYNAMIC_KEYMAP_EEPROM_ADDR DYNAMIC_KEYMAP_EEPROM_START +#endif + +// Dynamic encoders starts after dynamic keymaps +#ifndef DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR +# define DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2)) +#endif + +// Dynamic macro starts after dynamic encoders, but only when using ENCODER_MAP +#ifdef ENCODER_MAP_ENABLE +# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * NUM_ENCODERS * 2 * 2)) +# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +#else // ENCODER_MAP_ENABLE +# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) +# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +#endif // ENCODER_MAP_ENABLE + +// Sanity check that dynamic keymaps fit in available EEPROM +// If there's not 100 bytes available for macros, then something is wrong. +// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it, +// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has +// more than the default. +_Static_assert((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); + +#ifndef TOTAL_EEPROM_BYTE_COUNT +# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps. +#endif +// Dynamic macros are stored after the keymaps and use what is available +// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR. +#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE +# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1) +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void nvm_dynamic_keymap_erase(void) { + // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary. +} + +void nvm_dynamic_keymap_macro_erase(void) { + // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary. +} + +static inline void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { + return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2); +} + +uint16_t nvm_dynamic_keymap_read_keycode(uint8_t layer, uint8_t row, uint8_t column) { + if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return KC_NO; + void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); + // Big endian, so we can read/write EEPROM directly from host if we want + uint16_t keycode = eeprom_read_byte(address) << 8; + keycode |= eeprom_read_byte(address + 1); + return keycode; +} + +void nvm_dynamic_keymap_update_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) { + if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return; + void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column); + // Big endian, so we can read/write EEPROM directly from host if we want + eeprom_update_byte(address, (uint8_t)(keycode >> 8)); + eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF)); +} + +#ifdef ENCODER_MAP_ENABLE +static void *dynamic_keymap_encoder_to_eeprom_address(uint8_t layer, uint8_t encoder_id) { + return ((void *)DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) + (layer * NUM_ENCODERS * 2 * 2) + (encoder_id * 2 * 2); +} + +uint16_t nvm_dynamic_keymap_read_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise) { + if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return KC_NO; + void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id); + // Big endian, so we can read/write EEPROM directly from host if we want + uint16_t keycode = ((uint16_t)eeprom_read_byte(address + (clockwise ? 0 : 2))) << 8; + keycode |= eeprom_read_byte(address + (clockwise ? 0 : 2) + 1); + return keycode; +} + +void nvm_dynamic_keymap_update_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode) { + if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return; + void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id); + // Big endian, so we can read/write EEPROM directly from host if we want + eeprom_update_byte(address + (clockwise ? 0 : 2), (uint8_t)(keycode >> 8)); + eeprom_update_byte(address + (clockwise ? 0 : 2) + 1, (uint8_t)(keycode & 0xFF)); +} +#endif // ENCODER_MAP_ENABLE + +void nvm_dynamic_keymap_read_buffer(uint32_t offset, uint32_t size, uint8_t *data) { + uint32_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void * source = (void *)(uintptr_t)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset); + uint8_t *target = data; + for (uint32_t i = 0; i < size; i++) { + if (offset + i < dynamic_keymap_eeprom_size) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void nvm_dynamic_keymap_update_buffer(uint32_t offset, uint32_t size, uint8_t *data) { + uint32_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void * target = (void *)(uintptr_t)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset); + uint8_t *source = data; + for (uint32_t i = 0; i < size; i++) { + if (offset + i < dynamic_keymap_eeprom_size) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + +uint32_t nvm_dynamic_keymap_macro_size(void) { + return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; +} + +void nvm_dynamic_keymap_macro_read_buffer(uint32_t offset, uint32_t size, uint8_t *data) { + void * source = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset); + uint8_t *target = data; + for (uint16_t i = 0; i < size; i++) { + if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void nvm_dynamic_keymap_macro_update_buffer(uint32_t offset, uint32_t size, uint8_t *data) { + void * target = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset); + uint8_t *source = data; + for (uint16_t i = 0; i < size; i++) { + if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + +void nvm_dynamic_keymap_macro_reset(void) { + void * start = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); + void * end = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + long remaining = end - start; + uint8_t dummy[16] = {0}; + for (int i = 0; i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; i += sizeof(dummy)) { + int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy); + eeprom_update_block(dummy, start, this_loop); + start += this_loop; + remaining -= this_loop; + } +} diff --git a/quantum/nvm/eeprom/nvm_eeconfig.c b/quantum/nvm/eeprom/nvm_eeconfig.c new file mode 100644 index 0000000000..d6c388f3bc --- /dev/null +++ b/quantum/nvm/eeprom/nvm_eeconfig.c @@ -0,0 +1,292 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include "nvm_eeconfig.h" +#include "nvm_eeprom_eeconfig_internal.h" +#include "util.h" +#include "eeconfig.h" +#include "debug.h" +#include "eeprom.h" +#include "keycode_config.h" + +#ifdef EEPROM_DRIVER +# include "eeprom_driver.h" +#endif + +#ifdef AUDIO_ENABLE +# include "audio.h" +#endif + +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif + +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_types.h" +#endif + +#ifdef LED_MATRIX_ENABLE +# include "led_matrix_types.h" +#endif + +#ifdef UNICODE_COMMON_ENABLE +# include "unicode.h" +#endif + +#ifdef HAPTIC_ENABLE +# include "haptic.h" +#endif + +void nvm_eeconfig_erase(void) { +#ifdef EEPROM_DRIVER + eeprom_driver_format(false); +#endif // EEPROM_DRIVER +} + +bool nvm_eeconfig_is_enabled(void) { + return eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER; +} + +bool nvm_eeconfig_is_disabled(void) { + return eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF; +} + +void nvm_eeconfig_enable(void) { + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); +} + +void nvm_eeconfig_disable(void) { +#if defined(EEPROM_DRIVER) + eeprom_driver_format(false); +#endif + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); +} + +void nvm_eeconfig_read_debug(debug_config_t *debug_config) { + debug_config->raw = eeprom_read_byte(EECONFIG_DEBUG); +} +void nvm_eeconfig_update_debug(const debug_config_t *debug_config) { + eeprom_update_byte(EECONFIG_DEBUG, debug_config->raw); +} + +layer_state_t nvm_eeconfig_read_default_layer(void) { + uint8_t val = eeprom_read_byte(EECONFIG_DEFAULT_LAYER); +#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK + // stored as a layer number, so convert back to bitmask + return (layer_state_t)1 << val; +#else + // stored as 8-bit-wide bitmask, so read the value directly - handling padding to 16/32 bit layer_state_t + return (layer_state_t)val; +#endif +} +void nvm_eeconfig_update_default_layer(layer_state_t state) { +#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK + // stored as a layer number, so only store the highest layer + uint8_t val = get_highest_layer(state); +#else + // stored as 8-bit-wide bitmask, so write the value directly - handling truncation from 16/32 bit layer_state_t + uint8_t val = (uint8_t)state; +#endif + eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); +} + +void nvm_eeconfig_read_keymap(keymap_config_t *keymap_config) { + keymap_config->raw = eeprom_read_word(EECONFIG_KEYMAP); +} +void nvm_eeconfig_update_keymap(const keymap_config_t *keymap_config) { + eeprom_update_word(EECONFIG_KEYMAP, keymap_config->raw); +} + +#ifdef AUDIO_ENABLE +void nvm_eeconfig_read_audio(audio_config_t *audio_config) { + audio_config->raw = eeprom_read_byte(EECONFIG_AUDIO); +} +void nvm_eeconfig_update_audio(const audio_config_t *audio_config) { + eeprom_update_byte(EECONFIG_AUDIO, audio_config->raw); +} +#endif // AUDIO_ENABLE + +#ifdef UNICODE_COMMON_ENABLE +void nvm_eeconfig_read_unicode_mode(unicode_config_t *unicode_config) { + unicode_config->raw = eeprom_read_byte(EECONFIG_UNICODEMODE); +} +void nvm_eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) { + eeprom_update_byte(EECONFIG_UNICODEMODE, unicode_config->raw); +} +#endif // UNICODE_COMMON_ENABLE + +#ifdef BACKLIGHT_ENABLE +void nvm_eeconfig_read_backlight(backlight_config_t *backlight_config) { + backlight_config->raw = eeprom_read_byte(EECONFIG_BACKLIGHT); +} +void nvm_eeconfig_update_backlight(const backlight_config_t *backlight_config) { + eeprom_update_byte(EECONFIG_BACKLIGHT, backlight_config->raw); +} +#endif // BACKLIGHT_ENABLE + +#ifdef STENO_ENABLE +uint8_t nvm_eeconfig_read_steno_mode(void) { + return eeprom_read_byte(EECONFIG_STENOMODE); +} +void nvm_eeconfig_update_steno_mode(uint8_t val) { + eeprom_update_byte(EECONFIG_STENOMODE, val); +} +#endif // STENO_ENABLE + +#ifdef RGBLIGHT_ENABLE +#endif // RGBLIGHT_ENABLE + +#ifdef RGB_MATRIX_ENABLE +void nvm_eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) { + eeprom_read_block(rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_config_t)); +} +void nvm_eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) { + eeprom_update_block(rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_config_t)); +} +#endif // RGB_MATRIX_ENABLE + +#ifdef LED_MATRIX_ENABLE +void nvm_eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) { + eeprom_read_block(led_matrix_config, EECONFIG_LED_MATRIX, sizeof(led_eeconfig_t)); +} +void nvm_eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) { + eeprom_update_block(led_matrix_config, EECONFIG_LED_MATRIX, sizeof(led_eeconfig_t)); +} +#endif // LED_MATRIX_ENABLE + +#ifdef RGBLIGHT_ENABLE +void nvm_eeconfig_read_rgblight(rgblight_config_t *rgblight_config) { + rgblight_config->raw = eeprom_read_dword(EECONFIG_RGBLIGHT); + rgblight_config->raw |= ((uint64_t)eeprom_read_byte(EECONFIG_RGBLIGHT_EXTENDED) << 32); +} +void nvm_eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) { + eeprom_update_dword(EECONFIG_RGBLIGHT, rgblight_config->raw & 0xFFFFFFFF); + eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, (rgblight_config->raw >> 32) & 0xFF); +} +#endif // RGBLIGHT_ENABLE + +#if (EECONFIG_KB_DATA_SIZE) == 0 +uint32_t nvm_eeconfig_read_kb(void) { + return eeprom_read_dword(EECONFIG_KEYBOARD); +} +void nvm_eeconfig_update_kb(uint32_t val) { + eeprom_update_dword(EECONFIG_KEYBOARD, val); +} +#endif // (EECONFIG_KB_DATA_SIZE) == 0 + +#if (EECONFIG_USER_DATA_SIZE) == 0 +uint32_t nvm_eeconfig_read_user(void) { + return eeprom_read_dword(EECONFIG_USER); +} +void nvm_eeconfig_update_user(uint32_t val) { + eeprom_update_dword(EECONFIG_USER, val); +} +#endif // (EECONFIG_USER_DATA_SIZE) == 0 + +#ifdef HAPTIC_ENABLE +void nvm_eeconfig_read_haptic(haptic_config_t *haptic_config) { + haptic_config->raw = eeprom_read_dword(EECONFIG_HAPTIC); +} +void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config) { + eeprom_update_dword(EECONFIG_HAPTIC, haptic_config->raw); +} +#endif // HAPTIC_ENABLE + +bool nvm_eeconfig_read_handedness(void) { + return !!eeprom_read_byte(EECONFIG_HANDEDNESS); +} +void nvm_eeconfig_update_handedness(bool val) { + eeprom_update_byte(EECONFIG_HANDEDNESS, !!val); +} + +#if (EECONFIG_KB_DATA_SIZE) > 0 + +bool nvm_eeconfig_is_kb_datablock_valid(void) { + return eeprom_read_dword(EECONFIG_KEYBOARD) == (EECONFIG_KB_DATA_VERSION); +} + +uint32_t nvm_eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) { + if (eeconfig_is_kb_datablock_valid()) { + void *ee_start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + offset); + void *ee_end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + MIN(EECONFIG_KB_DATA_SIZE, offset + length)); + eeprom_read_block(data, ee_start, ee_end - ee_start); + return ee_end - ee_start; + } else { + memset(data, 0, length); + return length; + } +} + +uint32_t nvm_eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) { + eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION)); + + void *ee_start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + offset); + void *ee_end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + MIN(EECONFIG_KB_DATA_SIZE, offset + length)); + eeprom_update_block(data, ee_start, ee_end - ee_start); + return ee_end - ee_start; +} + +void nvm_eeconfig_init_kb_datablock(void) { + eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION)); + + void * start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK); + void * end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + EECONFIG_KB_DATA_SIZE); + long remaining = end - start; + uint8_t dummy[16] = {0}; + for (int i = 0; i < EECONFIG_KB_DATA_SIZE; i += sizeof(dummy)) { + int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy); + eeprom_update_block(dummy, start, this_loop); + start += this_loop; + remaining -= this_loop; + } +} + +#endif // (EECONFIG_KB_DATA_SIZE) > 0 + +#if (EECONFIG_USER_DATA_SIZE) > 0 + +bool nvm_eeconfig_is_user_datablock_valid(void) { + return eeprom_read_dword(EECONFIG_USER) == (EECONFIG_USER_DATA_VERSION); +} + +uint32_t nvm_eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) { + if (eeconfig_is_user_datablock_valid()) { + void *ee_start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + offset); + void *ee_end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + MIN(EECONFIG_USER_DATA_SIZE, offset + length)); + eeprom_read_block(data, ee_start, ee_end - ee_start); + return ee_end - ee_start; + } else { + memset(data, 0, length); + return length; + } +} + +uint32_t nvm_eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) { + eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION)); + + void *ee_start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + offset); + void *ee_end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + MIN(EECONFIG_USER_DATA_SIZE, offset + length)); + eeprom_update_block(data, ee_start, ee_end - ee_start); + return ee_end - ee_start; +} + +void nvm_eeconfig_init_user_datablock(void) { + eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION)); + + void * start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK); + void * end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + EECONFIG_USER_DATA_SIZE); + long remaining = end - start; + uint8_t dummy[16] = {0}; + for (int i = 0; i < EECONFIG_USER_DATA_SIZE; i += sizeof(dummy)) { + int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy); + eeprom_update_block(dummy, start, this_loop); + start += this_loop; + remaining -= this_loop; + } +} + +#endif // (EECONFIG_USER_DATA_SIZE) > 0 diff --git a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h new file mode 100644 index 0000000000..6efbf9480b --- /dev/null +++ b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h @@ -0,0 +1,59 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include // offsetof +#include "eeconfig.h" +#include "util.h" + +// Dummy struct only used to calculate offsets +typedef struct PACKED { + uint16_t magic; + uint8_t debug; + uint8_t default_layer; + uint16_t keymap; + uint8_t backlight; + uint8_t audio; + uint32_t rgblight; + uint8_t unicode; + uint8_t steno; + uint8_t handedness; + uint32_t keyboard; + uint32_t user; + union { // Mutually exclusive + uint32_t led_matrix; + uint64_t rgb_matrix; + }; + uint32_t haptic; + uint8_t rgblight_ext; +} eeprom_core_t; + +/* EEPROM parameter address */ +#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic)) +#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug)) +#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer)) +#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap)) +#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight)) +#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio)) +#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight)) +#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode)) +#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno)) +#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness)) +#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard)) +#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user)) +#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix)) +#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix)) +#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic)) +#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext)) + +// Size of EEPROM being used for core data storage +#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t)) + +#define EECONFIG_KB_DATABLOCK ((uint8_t *)(EECONFIG_BASE_SIZE)) +#define EECONFIG_USER_DATABLOCK ((uint8_t *)((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE))) + +// Size of EEPROM being used, other code can refer to this for available EEPROM +#define EECONFIG_SIZE ((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE) + (EECONFIG_USER_DATA_SIZE)) + +_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect"); diff --git a/quantum/nvm/eeprom/nvm_eeprom_via_internal.h b/quantum/nvm/eeprom/nvm_eeprom_via_internal.h new file mode 100644 index 0000000000..bf0d38e2ac --- /dev/null +++ b/quantum/nvm/eeprom/nvm_eeprom_via_internal.h @@ -0,0 +1,22 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +// Keyboard level code can change where VIA stores the magic. +// The magic is the build date YYMMDD encoded as BCD in 3 bytes, +// thus installing firmware built on a different date to the one +// already installed can be detected and the EEPROM data is reset. +// The only reason this is important is in case EEPROM usage changes +// and the EEPROM was not explicitly reset by bootmagic lite. +#ifndef VIA_EEPROM_MAGIC_ADDR +# define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE) +#endif + +#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3) + +// The end of the EEPROM memory used by VIA +// By default, dynamic keymaps will start at this if there is no +// custom config +#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE) + +#define VIA_EEPROM_CONFIG_END (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE) diff --git a/quantum/nvm/eeprom/nvm_via.c b/quantum/nvm/eeprom/nvm_via.c new file mode 100644 index 0000000000..5372791fb7 --- /dev/null +++ b/quantum/nvm/eeprom/nvm_via.c @@ -0,0 +1,77 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "eeprom.h" +#include "util.h" +#include "via.h" +#include "nvm_via.h" +#include "nvm_eeprom_eeconfig_internal.h" +#include "nvm_eeprom_via_internal.h" + +void nvm_via_erase(void) { + // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary. +} + +void nvm_via_read_magic(uint8_t *magic0, uint8_t *magic1, uint8_t *magic2) { + if (magic0) { + *magic0 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0); + } + + if (magic1) { + *magic1 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1); + } + + if (magic2) { + *magic2 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2); + } +} + +void nvm_via_update_magic(uint8_t magic0, uint8_t magic1, uint8_t magic2) { + eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0, magic0); + eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1, magic1); + eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, magic2); +} + +uint32_t nvm_via_read_layout_options(void) { + uint32_t value = 0; + // Start at the most significant byte + void *source = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR); + for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) { + value = value << 8; + value |= eeprom_read_byte(source); + source++; + } + return value; +} + +void nvm_via_update_layout_options(uint32_t val) { + // Start at the least significant byte + void *target = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE - 1); + for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) { + eeprom_update_byte(target, val & 0xFF); + val = val >> 8; + target--; + } +} + +uint32_t nvm_via_read_custom_config(void *buf, uint32_t offset, uint32_t length) { +#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0 + void *ee_start = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + offset); + void *ee_end = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + MIN(VIA_EEPROM_CUSTOM_CONFIG_SIZE, offset + length)); + eeprom_read_block(buf, ee_start, ee_end - ee_start); + return ee_end - ee_start; +#else + return 0; +#endif +} + +uint32_t nvm_via_update_custom_config(const void *buf, uint32_t offset, uint32_t length) { +#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0 + void *ee_start = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + offset); + void *ee_end = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + MIN(VIA_EEPROM_CUSTOM_CONFIG_SIZE, offset + length)); + eeprom_update_block(buf, ee_start, ee_end - ee_start); + return ee_end - ee_start; +#else + return 0; +#endif +} diff --git a/quantum/nvm/nvm_dynamic_keymap.h b/quantum/nvm/nvm_dynamic_keymap.h new file mode 100644 index 0000000000..d6e4aaee51 --- /dev/null +++ b/quantum/nvm/nvm_dynamic_keymap.h @@ -0,0 +1,27 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include + +void nvm_dynamic_keymap_erase(void); +void nvm_dynamic_keymap_macro_erase(void); + +uint16_t nvm_dynamic_keymap_read_keycode(uint8_t layer, uint8_t row, uint8_t column); +void nvm_dynamic_keymap_update_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); + +#ifdef ENCODER_MAP_ENABLE +uint16_t nvm_dynamic_keymap_read_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise); +void nvm_dynamic_keymap_update_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode); +#endif // ENCODER_MAP_ENABLE + +void nvm_dynamic_keymap_read_buffer(uint32_t offset, uint32_t size, uint8_t *data); +void nvm_dynamic_keymap_update_buffer(uint32_t offset, uint32_t size, uint8_t *data); + +uint32_t nvm_dynamic_keymap_macro_size(void); + +void nvm_dynamic_keymap_macro_read_buffer(uint32_t offset, uint32_t size, uint8_t *data); +void nvm_dynamic_keymap_macro_update_buffer(uint32_t offset, uint32_t size, uint8_t *data); + +void nvm_dynamic_keymap_macro_reset(void); diff --git a/quantum/nvm/nvm_eeconfig.h b/quantum/nvm/nvm_eeconfig.h new file mode 100644 index 0000000000..131f61d534 --- /dev/null +++ b/quantum/nvm/nvm_eeconfig.h @@ -0,0 +1,105 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include +#include "action_layer.h" // layer_state_t + +#ifndef EECONFIG_MAGIC_NUMBER +# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE3 // When changing, decrement this value to avoid future re-init issues +#endif +#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF + +void nvm_eeconfig_erase(void); + +bool nvm_eeconfig_is_enabled(void); +bool nvm_eeconfig_is_disabled(void); + +void nvm_eeconfig_enable(void); +void nvm_eeconfig_disable(void); + +typedef union debug_config_t debug_config_t; +void nvm_eeconfig_read_debug(debug_config_t *debug_config); +void nvm_eeconfig_update_debug(const debug_config_t *debug_config); + +layer_state_t nvm_eeconfig_read_default_layer(void); +void nvm_eeconfig_update_default_layer(layer_state_t state); + +typedef union keymap_config_t keymap_config_t; +void nvm_eeconfig_read_keymap(keymap_config_t *keymap_config); +void nvm_eeconfig_update_keymap(const keymap_config_t *keymap_config); + +#ifdef AUDIO_ENABLE +typedef union audio_config_t audio_config_t; +void nvm_eeconfig_read_audio(audio_config_t *audio_config); +void nvm_eeconfig_update_audio(const audio_config_t *audio_config); +#endif // AUDIO_ENABLE + +#ifdef UNICODE_COMMON_ENABLE +typedef union unicode_config_t unicode_config_t; +void nvm_eeconfig_read_unicode_mode(unicode_config_t *unicode_config); +void nvm_eeconfig_update_unicode_mode(const unicode_config_t *unicode_config); +#endif // UNICODE_COMMON_ENABLE + +#ifdef BACKLIGHT_ENABLE +typedef union backlight_config_t backlight_config_t; +void nvm_eeconfig_read_backlight(backlight_config_t *backlight_config); +void nvm_eeconfig_update_backlight(const backlight_config_t *backlight_config); +#endif // BACKLIGHT_ENABLE + +#ifdef STENO_ENABLE +uint8_t nvm_eeconfig_read_steno_mode(void); +void nvm_eeconfig_update_steno_mode(uint8_t val); +#endif // STENO_ENABLE + +#ifdef RGB_MATRIX_ENABLE +typedef union rgb_config_t rgb_config_t; +void nvm_eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config); +void nvm_eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config); +#endif + +#ifdef LED_MATRIX_ENABLE +typedef union led_eeconfig_t led_eeconfig_t; +void nvm_eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config); +void nvm_eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config); +#endif // LED_MATRIX_ENABLE + +#ifdef RGBLIGHT_ENABLE +typedef union rgblight_config_t rgblight_config_t; +void nvm_eeconfig_read_rgblight(rgblight_config_t *rgblight_config); +void nvm_eeconfig_update_rgblight(const rgblight_config_t *rgblight_config); +#endif // RGBLIGHT_ENABLE + +#if (EECONFIG_KB_DATA_SIZE) == 0 +uint32_t nvm_eeconfig_read_kb(void); +void nvm_eeconfig_update_kb(uint32_t val); +#endif // (EECONFIG_KB_DATA_SIZE) == 0 + +#if (EECONFIG_USER_DATA_SIZE) == 0 +uint32_t nvm_eeconfig_read_user(void); +void nvm_eeconfig_update_user(uint32_t val); +#endif // (EECONFIG_USER_DATA_SIZE) == 0 + +#ifdef HAPTIC_ENABLE +typedef union haptic_config_t haptic_config_t; +void nvm_eeconfig_read_haptic(haptic_config_t *haptic_config); +void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config); +#endif // HAPTIC_ENABLE + +bool nvm_eeconfig_read_handedness(void); +void nvm_eeconfig_update_handedness(bool val); + +#if (EECONFIG_KB_DATA_SIZE) > 0 +bool nvm_eeconfig_is_kb_datablock_valid(void); +uint32_t nvm_eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length); +uint32_t nvm_eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length); +void nvm_eeconfig_init_kb_datablock(void); +#endif // (EECONFIG_KB_DATA_SIZE) > 0 + +#if (EECONFIG_USER_DATA_SIZE) > 0 +bool nvm_eeconfig_is_user_datablock_valid(void); +uint32_t nvm_eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length); +uint32_t nvm_eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length); +void nvm_eeconfig_init_user_datablock(void); +#endif // (EECONFIG_USER_DATA_SIZE) > 0 diff --git a/quantum/nvm/nvm_via.h b/quantum/nvm/nvm_via.h new file mode 100644 index 0000000000..90c5e67421 --- /dev/null +++ b/quantum/nvm/nvm_via.h @@ -0,0 +1,17 @@ +// Copyright 2024 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include + +void nvm_via_erase(void); + +void nvm_via_read_magic(uint8_t *magic0, uint8_t *magic1, uint8_t *magic2); +void nvm_via_update_magic(uint8_t magic0, uint8_t magic1, uint8_t magic2); + +uint32_t nvm_via_read_layout_options(void); +void nvm_via_update_layout_options(uint32_t val); + +uint32_t nvm_via_read_custom_config(void *buf, uint32_t offset, uint32_t length); +uint32_t nvm_via_update_custom_config(const void *buf, uint32_t offset, uint32_t length); diff --git a/quantum/nvm/readme.md b/quantum/nvm/readme.md new file mode 100644 index 0000000000..0731695e92 --- /dev/null +++ b/quantum/nvm/readme.md @@ -0,0 +1,30 @@ +# Non-volatile Memory - Data Repositories + +This area is intentionally structured in the following way: + +``` +╰- quantum + ╰- nvm + ├- readme.md + ├- rules.mk + | + ├- nvm_eeconfig.h + ├- nvm_<>.h + | + ├- eeprom + | ├- nvm_eeconfig.c + | ├- nvm_<>.c + | ╰- ... + | + ├- <> + | ├- nvm_eeconfig.c + | ├- nvm_<>.c + | ╰- ... + ╰- ... +``` + +At the base `nvm` level, for every QMK core system which requires persistence there must be a corresponding `nvm_<>.h` header file. This provides the data repository API to the "owner" system, and allows the underlying data persistence mechanism to be abstracted away from upper code. Any conversion to/from a `.raw` field should occur inside the `nvm_<>.c` layer, with the API using values, such as structs or unions exposed to the rest of QMK. + +Each `nvm` "provider" is a corresponding child directory consisting of its name, such as `eeprom`, and corresponding `nvm_<>.c` implementation files which provide the concrete implementation of the upper `nvm_<>.h`. + +New systems requiring persistence can add the corresponding `nvm_<>.h` file, and in most circumstances must also implement equivalent `nvm_<>.c` files for every `nvm` provider. If persistence is not possible for that system, a `nvm_<>.c` file with simple stubs which ignore writes and provide sane defaults must be used instead. \ No newline at end of file diff --git a/quantum/nvm/rules.mk b/quantum/nvm/rules.mk new file mode 100644 index 0000000000..c9c1fabfd4 --- /dev/null +++ b/quantum/nvm/rules.mk @@ -0,0 +1,31 @@ +# Copyright 2024 Nick Brassel (@tzarc) +# SPDX-License-Identifier: GPL-2.0-or-later + +VPATH += $(QUANTUM_DIR)/nvm + +VALID_NVM_DRIVERS := eeprom custom none + +NVM_DRIVER ?= eeprom + +ifeq ($(filter $(NVM_DRIVER),$(VALID_NVM_DRIVERS)),) + $(call CATASTROPHIC_ERROR,Invalid NVM_DRIVER,NVM_DRIVER="$(NVM_DRIVER)" is not a valid NVM driver) +else + + # If we don't want one, fake it with transient eeprom. + ifeq ($(NVM_DRIVER),none) + NVM_DRIVER := eeprom + EEPROM_DRIVER := transient + endif + + NVM_DRIVER_UPPER := $(shell echo $(NVM_DRIVER) | tr '[:lower:]' '[:upper:]') + NVM_DRIVER_LOWER := $(shell echo $(NVM_DRIVER) | tr '[:upper:]' '[:lower:]') + + OPT_DEFS += -DNVM_DRIVER_$(NVM_DRIVER_UPPER) -DNVM_DRIVER="$(NVM_DRIVER)" + + ifneq ("$(wildcard $(QUANTUM_DIR)/nvm/$(NVM_DRIVER_LOWER))","") + COMMON_VPATH += $(QUANTUM_DIR)/nvm/$(NVM_DRIVER_LOWER) + endif + + QUANTUM_SRC += nvm_eeconfig.c + +endif diff --git a/quantum/os_detection.h b/quantum/os_detection.h index 98a8e805e4..e9e7b25f1d 100644 --- a/quantum/os_detection.h +++ b/quantum/os_detection.h @@ -43,6 +43,9 @@ void slave_update_detected_host_os(os_variant_t os); #endif #ifdef OS_DETECTION_DEBUG_ENABLE +# if defined(DYNAMIC_KEYMAP_ENABLE) || defined(VIA_ENABLE) +# error Cannot enable OS Detection debug mode simultaneously with DYNAMIC_KEYMAP or VIA +# endif void print_stored_setups(void); void store_setups_in_eeprom(void); #endif diff --git a/quantum/process_keycode/process_autocorrect.c b/quantum/process_keycode/process_autocorrect.c index b7f9132acf..0cde520778 100644 --- a/quantum/process_keycode/process_autocorrect.c +++ b/quantum/process_keycode/process_autocorrect.c @@ -38,7 +38,7 @@ bool autocorrect_is_enabled(void) { */ void autocorrect_enable(void) { keymap_config.autocorrect_enable = true; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } /** @@ -48,7 +48,7 @@ void autocorrect_enable(void) { void autocorrect_disable(void) { keymap_config.autocorrect_enable = false; typo_buffer_size = 0; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } /** @@ -58,7 +58,7 @@ void autocorrect_disable(void) { void autocorrect_toggle(void) { keymap_config.autocorrect_enable = !keymap_config.autocorrect_enable; typo_buffer_size = 0; - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); } /** diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index 82000db9b3..f50761268a 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -66,17 +66,17 @@ void clicky_freq_reset(void) { void clicky_toggle(void) { audio_config.clicky_enable ^= 1; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } void clicky_on(void) { audio_config.clicky_enable = 1; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } void clicky_off(void) { audio_config.clicky_enable = 0; - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } bool is_clicky_on(void) { diff --git a/quantum/process_keycode/process_magic.c b/quantum/process_keycode/process_magic.c index 3b35884d68..d5280105de 100644 --- a/quantum/process_keycode/process_magic.c +++ b/quantum/process_keycode/process_magic.c @@ -47,7 +47,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { if (IS_MAGIC_KEYCODE(keycode)) { /* keymap config */ - keymap_config.raw = eeconfig_read_keymap(); + eeconfig_read_keymap(&keymap_config); switch (keycode) { case QK_MAGIC_SWAP_CONTROL_CAPS_LOCK: keymap_config.swap_control_capslock = true; @@ -187,7 +187,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) { break; } - eeconfig_update_keymap(keymap_config.raw); + eeconfig_update_keymap(&keymap_config); clear_keyboard(); // clear to prevent stuck keys return false; diff --git a/quantum/process_keycode/process_steno.c b/quantum/process_keycode/process_steno.c index c491d6f1d8..4789461352 100644 --- a/quantum/process_keycode/process_steno.c +++ b/quantum/process_keycode/process_steno.c @@ -20,9 +20,6 @@ #ifdef VIRTSER_ENABLE # include "virtser.h" #endif -#ifdef STENO_ENABLE_ALL -# include "eeprom.h" -#endif // All steno keys that have been pressed to form this chord, // stored in MAX_STROKE_SIZE groups of 8-bit arrays. @@ -128,13 +125,13 @@ static const uint16_t combinedmap_second[] PROGMEM = {STN_S2, STN_KL, STN_WL, ST #ifdef STENO_ENABLE_ALL void steno_init(void) { - mode = eeprom_read_byte(EECONFIG_STENOMODE); + mode = eeconfig_read_steno_mode(); } void steno_set_mode(steno_mode_t new_mode) { steno_clear_chord(); mode = new_mode; - eeprom_update_byte(EECONFIG_STENOMODE, mode); + eeconfig_update_steno_mode(mode); } #endif // STENO_ENABLE_ALL diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 484d177546..a18105c9b3 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -88,9 +88,9 @@ static last_hit_t last_hit_buffer; const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; #endif -EECONFIG_DEBOUNCE_HELPER(rgb_matrix, EECONFIG_RGB_MATRIX, rgb_matrix_config); +EECONFIG_DEBOUNCE_HELPER(rgb_matrix, rgb_matrix_config); -void eeconfig_update_rgb_matrix(void) { +void eeconfig_force_flush_rgb_matrix(void) { eeconfig_flush_rgb_matrix(true); } diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h index 33f7e06a63..e00e3927c7 100644 --- a/quantum/rgb_matrix/rgb_matrix.h +++ b/quantum/rgb_matrix/rgb_matrix.h @@ -140,7 +140,7 @@ enum rgb_matrix_effects { }; void eeconfig_update_rgb_matrix_default(void); -void eeconfig_update_rgb_matrix(void); +void eeconfig_force_flush_rgb_matrix(void); uint8_t rgb_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i); uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i); @@ -215,7 +215,7 @@ void rgb_matrix_set_flags_noeeprom(led_flags_t flags); void rgb_matrix_update_pwm_buffers(void); #ifndef RGBLIGHT_ENABLE -# define eeconfig_update_rgblight_current eeconfig_update_rgb_matrix +# define eeconfig_update_rgblight_current eeconfig_force_flush_rgb_matrix # define rgblight_reload_from_eeprom rgb_matrix_reload_from_eeprom # define rgblight_toggle rgb_matrix_toggle # define rgblight_toggle_noeeprom rgb_matrix_toggle_noeeprom diff --git a/quantum/rgb_matrix/rgb_matrix_types.h b/quantum/rgb_matrix/rgb_matrix_types.h index 0834a7067c..62005ebea9 100644 --- a/quantum/rgb_matrix/rgb_matrix_types.h +++ b/quantum/rgb_matrix/rgb_matrix_types.h @@ -73,7 +73,7 @@ typedef struct PACKED { uint8_t flags[RGB_MATRIX_LED_COUNT]; } led_config_t; -typedef union { +typedef union rgb_config_t { uint64_t raw; struct PACKED { uint8_t enable : 2; diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c index ddccc9bae3..83f97c8114 100644 --- a/quantum/rgblight/rgblight.c +++ b/quantum/rgblight/rgblight.c @@ -24,9 +24,7 @@ #include "util.h" #include "led_tables.h" #include -#ifdef EEPROM_ENABLE -# include "eeprom.h" -#endif +#include "eeconfig.h" #ifdef RGBLIGHT_SPLIT /* for split keyboard */ @@ -176,24 +174,9 @@ void rgblight_check_config(void) { } } -uint64_t eeconfig_read_rgblight(void) { -#ifdef EEPROM_ENABLE - return (uint64_t)((eeprom_read_dword(EECONFIG_RGBLIGHT)) | ((uint64_t)eeprom_read_byte(EECONFIG_RGBLIGHT_EXTENDED) << 32)); -#else - return 0; -#endif -} - -void eeconfig_update_rgblight(uint64_t val) { -#ifdef EEPROM_ENABLE - rgblight_check_config(); - eeprom_update_dword(EECONFIG_RGBLIGHT, val & 0xFFFFFFFF); - eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, (val >> 32) & 0xFF); -#endif -} - void eeconfig_update_rgblight_current(void) { - eeconfig_update_rgblight(rgblight_config.raw); + rgblight_check_config(); + eeconfig_update_rgblight(&rgblight_config); } void eeconfig_update_rgblight_default(void) { @@ -205,7 +188,7 @@ void eeconfig_update_rgblight_default(void) { rgblight_config.val = RGBLIGHT_DEFAULT_VAL; rgblight_config.speed = RGBLIGHT_DEFAULT_SPD; RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS; - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); } void eeconfig_debug_rgblight(void) { @@ -228,12 +211,12 @@ void rgblight_init(void) { } dprintf("rgblight_init start!\n"); - rgblight_config.raw = eeconfig_read_rgblight(); + eeconfig_read_rgblight(&rgblight_config); RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS; if (!rgblight_config.mode) { dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n"); eeconfig_update_rgblight_default(); - rgblight_config.raw = eeconfig_read_rgblight(); + eeconfig_read_rgblight(&rgblight_config); } rgblight_check_config(); @@ -252,7 +235,7 @@ void rgblight_init(void) { void rgblight_reload_from_eeprom(void) { /* Reset back to what we have in eeprom */ - rgblight_config.raw = eeconfig_read_rgblight(); + eeconfig_read_rgblight(&rgblight_config); RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS; rgblight_check_config(); eeconfig_debug_rgblight(); // display current eeprom values @@ -341,7 +324,7 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { } RGBLIGHT_SPLIT_SET_CHANGE_MODE; if (write_to_eeprom) { - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); dprintf("rgblight mode [EEPROM]: %u\n", rgblight_config.mode); } else { dprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode); @@ -386,7 +369,7 @@ void rgblight_toggle_noeeprom(void) { void rgblight_enable(void) { rgblight_config.enable = 1; // No need to update EEPROM here. rgblight_mode() will do that, actually - // eeconfig_update_rgblight(rgblight_config.raw); + // eeconfig_update_rgblight(&rgblight_config); dprintf("rgblight enable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); rgblight_mode(rgblight_config.mode); } @@ -399,7 +382,7 @@ void rgblight_enable_noeeprom(void) { void rgblight_disable(void) { rgblight_config.enable = 0; - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); dprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); rgblight_timer_disable(); RGBLIGHT_SPLIT_SET_CHANGE_MODE; @@ -487,7 +470,7 @@ void rgblight_increase_speed_helper(bool write_to_eeprom) { if (rgblight_config.speed < 3) rgblight_config.speed++; // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED? if (write_to_eeprom) { - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); } } void rgblight_increase_speed(void) { @@ -501,7 +484,7 @@ void rgblight_decrease_speed_helper(bool write_to_eeprom) { if (rgblight_config.speed > 0) rgblight_config.speed--; // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED?? if (write_to_eeprom) { - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); } } void rgblight_decrease_speed(void) { @@ -585,7 +568,7 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w rgblight_config.sat = sat; rgblight_config.val = val; if (write_to_eeprom) { - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); } else { dprintf("rgblight set hsv [NOEEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); @@ -608,7 +591,7 @@ uint8_t rgblight_get_speed(void) { void rgblight_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) { rgblight_config.speed = speed; if (write_to_eeprom) { - eeconfig_update_rgblight(rgblight_config.raw); + eeconfig_update_rgblight(&rgblight_config); dprintf("rgblight set speed [EEPROM]: %u\n", rgblight_config.speed); } else { dprintf("rgblight set speed [NOEEPROM]: %u\n", rgblight_config.speed); diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h index f4b6e621e4..f5fd450d4c 100644 --- a/quantum/rgblight/rgblight.h +++ b/quantum/rgblight/rgblight.h @@ -168,7 +168,6 @@ enum RGBLIGHT_EFFECT_MODE { #include #include "rgblight_drivers.h" #include "progmem.h" -#include "eeconfig.h" #include "color.h" #ifdef RGBLIGHT_LAYERS @@ -248,7 +247,7 @@ extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM; extern const uint8_t RGBLED_TWINKLE_INTERVALS[3] PROGMEM; extern bool is_rgblight_initialized; -typedef union { +typedef union rgblight_config_t { uint64_t raw; struct { bool enable : 1; @@ -370,8 +369,6 @@ void rgblight_suspend(void); void rgblight_wakeup(void); uint64_t rgblight_read_qword(void); void rgblight_update_qword(uint64_t qword); -uint64_t eeconfig_read_rgblight(void); -void eeconfig_update_rgblight(uint64_t val); void eeconfig_update_rgblight_current(void); void eeconfig_update_rgblight_default(void); void eeconfig_debug_rgblight(void); diff --git a/quantum/unicode/unicode.c b/quantum/unicode/unicode.c index 78a4cad585..b0729335f0 100644 --- a/quantum/unicode/unicode.c +++ b/quantum/unicode/unicode.c @@ -136,7 +136,7 @@ static void unicode_play_song(uint8_t mode) { #endif void unicode_input_mode_init(void) { - unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE); + eeconfig_read_unicode_mode(&unicode_config); #if UNICODE_SELECTED_MODES != -1 # if UNICODE_CYCLE_PERSIST // Find input_mode in selected modes @@ -165,7 +165,7 @@ uint8_t get_unicode_input_mode(void) { } static void persist_unicode_input_mode(void) { - eeprom_update_byte(EECONFIG_UNICODEMODE, unicode_config.input_mode); + eeconfig_update_unicode_mode(&unicode_config); } void set_unicode_input_mode(uint8_t mode) { diff --git a/quantum/unicode/unicode.h b/quantum/unicode/unicode.h index 90a54c8b18..f19d803335 100644 --- a/quantum/unicode/unicode.h +++ b/quantum/unicode/unicode.h @@ -26,7 +26,7 @@ * \{ */ -typedef union { +typedef union unicode_config_t { uint8_t raw; struct { uint8_t input_mode : 8; diff --git a/quantum/via.c b/quantum/via.c index 643d7aa3c3..c746d9a608 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -32,6 +32,7 @@ #include "timer.h" #include "wait.h" #include "version.h" // for QMK_BUILDDATE used in EEPROM magic +#include "nvm_via.h" #if defined(AUDIO_ENABLE) # include "audio.h" @@ -65,20 +66,26 @@ bool via_eeprom_is_valid(void) { uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F); uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F); - return (eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0) == magic0 && eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1) == magic1 && eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2) == magic2); + uint8_t ee_magic0; + uint8_t ee_magic1; + uint8_t ee_magic2; + nvm_via_read_magic(&ee_magic0, &ee_magic1, &ee_magic2); + + return ee_magic0 == magic0 && ee_magic1 == magic1 && ee_magic2 == magic2; } // Sets VIA/keyboard level usage of EEPROM to valid/invalid // Keyboard level code (eg. via_init_kb()) should not call this void via_eeprom_set_valid(bool valid) { - char * p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54" - uint8_t magic0 = ((p[2] & 0x0F) << 4) | (p[3] & 0x0F); - uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F); - uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F); - - eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0, valid ? magic0 : 0xFF); - eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1, valid ? magic1 : 0xFF); - eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, valid ? magic2 : 0xFF); + if (valid) { + char * p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54" + uint8_t magic0 = ((p[2] & 0x0F) << 4) | (p[3] & 0x0F); + uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F); + uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F); + nvm_via_update_magic(magic0, magic1, magic2); + } else { + nvm_via_update_magic(0xFF, 0xFF, 0xFF); + } } // Override this at the keyboard code level to check @@ -104,6 +111,8 @@ void via_init(void) { } void eeconfig_init_via(void) { + // Erase any NVM storage if necessary + nvm_via_erase(); // set the magic number to false, in case this gets interrupted via_eeprom_set_valid(false); // This resets the layout options @@ -119,30 +128,25 @@ void eeconfig_init_via(void) { // This is generalized so the layout options EEPROM usage can be // variable, between 1 and 4 bytes. uint32_t via_get_layout_options(void) { - uint32_t value = 0; - // Start at the most significant byte - void *source = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR); - for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) { - value = value << 8; - value |= eeprom_read_byte(source); - source++; - } - return value; + return nvm_via_read_layout_options(); } __attribute__((weak)) void via_set_layout_options_kb(uint32_t value) {} void via_set_layout_options(uint32_t value) { via_set_layout_options_kb(value); - // Start at the least significant byte - void *target = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE - 1); - for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) { - eeprom_update_byte(target, value & 0xFF); - value = value >> 8; - target--; - } + nvm_via_update_layout_options(value); } +#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0 +uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length) { + return nvm_via_read_custom_config(buf, offset, length); +} +uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length) { + return nvm_via_update_custom_config(buf, offset, length); +} +#endif + #if defined(AUDIO_ENABLE) float via_device_indication_song[][2] = SONG(STARTUP_SOUND); #endif // AUDIO_ENABLE @@ -715,7 +719,7 @@ void via_qmk_rgb_matrix_set_value(uint8_t *data) { } void via_qmk_rgb_matrix_save(void) { - eeconfig_update_rgb_matrix(); + eeconfig_force_flush_rgb_matrix(); } #endif // RGB_MATRIX_ENABLE @@ -794,7 +798,7 @@ void via_qmk_led_matrix_set_value(uint8_t *data) { } void via_qmk_led_matrix_save(void) { - eeconfig_update_led_matrix(); + eeconfig_force_flush_led_matrix(); } #endif // LED_MATRIX_ENABLE @@ -861,7 +865,7 @@ void via_qmk_audio_set_value(uint8_t *data) { } void via_qmk_audio_save(void) { - eeconfig_update_audio(audio_config.raw); + eeconfig_update_audio(&audio_config); } #endif // QMK_AUDIO_ENABLE diff --git a/quantum/via.h b/quantum/via.h index f9d3b3314c..9f0eef10f7 100644 --- a/quantum/via.h +++ b/quantum/via.h @@ -16,21 +16,8 @@ #pragma once -#include "eeconfig.h" // for EECONFIG_SIZE #include "action.h" -// Keyboard level code can change where VIA stores the magic. -// The magic is the build date YYMMDD encoded as BCD in 3 bytes, -// thus installing firmware built on a different date to the one -// already installed can be detected and the EEPROM data is reset. -// The only reason this is important is in case EEPROM usage changes -// and the EEPROM was not explicitly reset by bootmagic lite. -#ifndef VIA_EEPROM_MAGIC_ADDR -# define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE) -#endif - -#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3) - // Changing the layout options size after release will invalidate EEPROM, // but this is something that should be set correctly on initial implementation. // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary ) @@ -46,17 +33,10 @@ # define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000 #endif -// The end of the EEPROM memory used by VIA -// By default, dynamic keymaps will start at this if there is no -// custom config -#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE) - #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE # define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0 #endif -#define VIA_EEPROM_CONFIG_END (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE) - // This is changed only when the command IDs change, // so VIA Configurator can detect compatible firmware. #define VIA_PROTOCOL_VERSION 0x000C @@ -160,6 +140,11 @@ uint32_t via_get_layout_options(void); void via_set_layout_options(uint32_t value); void via_set_layout_options_kb(uint32_t value); +#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0 +uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length); +uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length); +#endif + // Used by VIA to tell a device to flash LEDs (or do something else) when that // device becomes the active device being configured, on startup or switching // between devices. diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp index 81806b0e6d..00084721d6 100644 --- a/tests/test_common/test_fixture.cpp +++ b/tests/test_common/test_fixture.cpp @@ -46,7 +46,7 @@ void TestFixture::SetUpTestCase() { // The following is enough to bootstrap the values set in main eeconfig_init_quantum(); - eeconfig_update_debug(debug_config.raw); + eeconfig_update_debug(&debug_config); TestDriver driver; keyboard_init(); From 6a947fa5345b47f8d41c5ab13c0c6dac79cb3bc9 Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:00:28 +0000 Subject: [PATCH 246/592] Add Mechboards Crkbd (#24993) --- keyboards/mechboards/crkbd/pro/config.h | 6 + keyboards/mechboards/crkbd/pro/keyboard.json | 171 ++++++++++++++++++ .../crkbd/pro/keymaps/default/keymap.c | 47 +++++ .../crkbd/pro/keymaps/default/rules.mk | 1 + keyboards/mechboards/crkbd/pro/post_rules.mk | 1 + keyboards/mechboards/crkbd/pro/pro.c | 15 ++ keyboards/mechboards/crkbd/pro/readme.md | 25 +++ 7 files changed, 266 insertions(+) create mode 100644 keyboards/mechboards/crkbd/pro/config.h create mode 100644 keyboards/mechboards/crkbd/pro/keyboard.json create mode 100644 keyboards/mechboards/crkbd/pro/keymaps/default/keymap.c create mode 100644 keyboards/mechboards/crkbd/pro/keymaps/default/rules.mk create mode 100644 keyboards/mechboards/crkbd/pro/post_rules.mk create mode 100644 keyboards/mechboards/crkbd/pro/pro.c create mode 100644 keyboards/mechboards/crkbd/pro/readme.md diff --git a/keyboards/mechboards/crkbd/pro/config.h b/keyboards/mechboards/crkbd/pro/config.h new file mode 100644 index 0000000000..43a4b3eb9f --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/config.h @@ -0,0 +1,6 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "keyboards/mechboards/common/rgb_effects.h" diff --git a/keyboards/mechboards/crkbd/pro/keyboard.json b/keyboards/mechboards/crkbd/pro/keyboard.json new file mode 100644 index 0000000000..05bca63993 --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/keyboard.json @@ -0,0 +1,171 @@ +{ + "manufacturer": "Mechboards", + "keyboard_name": "CRKBD Pro", + "maintainer": "dasky", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "B6", "pin_b": "B2"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "os_detection": true, + "rgb_matrix": true, + "wpm": true + }, + "matrix_pins": { + "cols": ["F4", "F5", "F6", "F7", "B1", "B3"], + "rows": ["D4", "C6", "D7", "E6"] + }, + "rgb_matrix": { + "animations": { + "cycle_left_right": true + }, + "default": { + "animation": "cycle_left_right" + }, + "driver": "ws2812", + "layout": [ + {"x": 85, "y": 16, "flags": 2}, + {"x": 50, "y": 13, "flags": 2}, + {"x": 16, "y": 20, "flags": 2}, + {"x": 16, "y": 38, "flags": 2}, + {"x": 50, "y": 48, "flags": 2}, + {"x": 85, "y": 52, "flags": 2}, + {"matrix": [3, 5], "x": 95, "y": 63, "flags": 1}, + {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4}, + {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4}, + {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4}, + {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4}, + {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4}, + {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4}, + {"matrix": [3, 4], "x": 80, "y": 58, "flags": 1}, + {"matrix": [3, 3], "x": 60, "y": 55, "flags": 1}, + {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4}, + {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4}, + {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4}, + {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 7, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 24, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 41, "flags": 1}, + {"x": 139, "y": 16, "flags": 2}, + {"x": 174, "y": 13, "flags": 2}, + {"x": 208, "y": 20, "flags": 2}, + {"x": 208, "y": 38, "flags": 2}, + {"x": 174, "y": 48, "flags": 2}, + {"x": 139, "y": 52, "flags": 2}, + {"matrix": [7, 5], "x": 129, "y": 63, "flags": 1}, + {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4}, + {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4}, + {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4}, + {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4}, + {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4}, + {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4}, + {"matrix": [7, 4], "x": 144, "y": 58, "flags": 1}, + {"matrix": [7, 3], "x": 164, "y": 55, "flags": 1}, + {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4}, + {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4}, + {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4}, + {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4}, + {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 7, "flags": 1}, + {"matrix": [5, 0], "x": 224, "y": 24, "flags": 1}, + {"matrix": [6, 0], "x": 224, "y": 41, "flags": 1} + ], + "max_brightness": 120, + "split_count": [27, 27] + }, + "rgblight": { + "led_count": 54, + "max_brightness": 120, + "split_count": [27, 27] + }, + "split": { + "enabled": true, + "serial": { + "pin": "D2" + }, + "transport": { + "sync": { + "matrix_state": true, + "oled": true, + "wpm": true + } + } + }, + "url": "mechboards.co.uk", + "usb": { + "device_version": "1.0.0", + "pid": "0x0003", + "vid": "0x7171" + }, + "ws2812": { + "pin": "D3" + }, + "layouts": { + "LAYOUT_split_3x6_3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.25}, + {"matrix": [0, 1], "x": 1, "y": 0.25}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [4, 5], "x": 8, "y": 0.25}, + {"matrix": [4, 4], "x": 9, "y": 0.125}, + {"matrix": [4, 3], "x": 10, "y": 0}, + {"matrix": [4, 2], "x": 11, "y": 0.125}, + {"matrix": [4, 1], "x": 12, "y": 0.25}, + {"matrix": [4, 0], "x": 13, "y": 0.25}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [5, 5], "x": 8, "y": 1.25}, + {"matrix": [5, 4], "x": 9, "y": 1.125}, + {"matrix": [5, 3], "x": 10, "y": 1}, + {"matrix": [5, 2], "x": 11, "y": 1.125}, + {"matrix": [5, 1], "x": 12, "y": 1.25}, + {"matrix": [5, 0], "x": 13, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25}, + {"matrix": [2, 1], "x": 1, "y": 2.25}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.25}, + {"matrix": [6, 5], "x": 8, "y": 2.25}, + {"matrix": [6, 4], "x": 9, "y": 2.125}, + {"matrix": [6, 3], "x": 10, "y": 2}, + {"matrix": [6, 2], "x": 11, "y": 2.125}, + {"matrix": [6, 1], "x": 12, "y": 2.25}, + {"matrix": [6, 0], "x": 13, "y": 2.25}, + {"matrix": [3, 3], "x": 3.5, "y": 3.25}, + {"matrix": [3, 4], "x": 4.5, "y": 3.5}, + {"matrix": [3, 5], "x": 5.5, "y": 3.75}, + {"matrix": [7, 5], "x": 7.5, "y": 3.75}, + {"matrix": [7, 4], "x": 8.5, "y": 3.5}, + {"matrix": [7, 3], "x": 9.5, "y": 3.25} + ] + } + } +} diff --git a/keyboards/mechboards/crkbd/pro/keymaps/default/keymap.c b/keyboards/mechboards/crkbd/pro/keymaps/default/keymap.c new file mode 100644 index 0000000000..2e70e3091e --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/keymaps/default/keymap.c @@ -0,0 +1,47 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split_3x6_3( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + 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_ESC, + KC_LGUI, MO(1), KC_SPC, KC_ENT, MO(2), KC_RALT + +), + + [1] = LAYOUT_split_3x6_3( + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LGUI, _______, KC_SPC, KC_ENT, MO(3), KC_RALT +), + + [2] = LAYOUT_split_3x6_3( + KC_TAB, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_GRV, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_TILD, + KC_LGUI, MO(3), KC_SPC, KC_ENT, _______, KC_RALT +), + + [3] = LAYOUT_split_3x6_3( + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LGUI, _______, KC_SPC, KC_ENT, _______, KC_RALT +) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { +[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT)}, +[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, +[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)}, +[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS)} +}; +#endif + +// clang-format on diff --git a/keyboards/mechboards/crkbd/pro/keymaps/default/rules.mk b/keyboards/mechboards/crkbd/pro/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/mechboards/crkbd/pro/post_rules.mk b/keyboards/mechboards/crkbd/pro/post_rules.mk new file mode 100644 index 0000000000..4bfdc8ca89 --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/post_rules.mk @@ -0,0 +1 @@ +include keyboards/mechboards/common/post_rules.mk diff --git a/keyboards/mechboards/crkbd/pro/pro.c b/keyboards/mechboards/crkbd/pro/pro.c new file mode 100644 index 0000000000..05c41d3612 --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/pro.c @@ -0,0 +1,15 @@ +// Copyright 2025 Dasky (@daskygit) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE +void render_logo(void) { + static const char PROGMEM pro_logo[] = { + 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 31, 31, 31, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 252, 0, 0, 0, 248, 248, 24, 24, 24, 24, 24, 24, 0, 0, 248, 248, 24, 24, 24, 24, 248, 240, 0, 0, 248, 248, 0, 0, 0, 128, 248, 248, 0, 0, 248, 248, 24, 24, 24, 24, 248, 240, 0, 0, 248, 248, 24, 24, 24, 24, 248, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 4, 4, 4, 4, 4, 255, + 7, 7, 7, 7, 7, 255, 7, 7, 7, 7, 7, 255, 255, 255, 255, 255, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 6, 6, 6, 6, 255, 251, 0, 0, 255, 255, 6, 6, 15, 31, 249, 240, 0, 0, 255, 255, 6, 6, 6, 6, 255, 251, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 255, 255, 65, 65, 65, 65, 65, 255, 255, 255, 65, 65, 65, 65, 65, 255, 127, 127, 127, 127, 127, 255, 65, 65, 65, 65, 65, 255, 255, 255, 255, 255, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 3, 3, 0, 0, + 0, 0, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 3, 3, 3, 3, 3, 3, 227, 241, 48, 176, 176, 112, 240, 48, 176, 176, 112, 240, 112, 176, 176, 112, 240, 224, 0, 0, 63, 127, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 255, 255, 255, 255, 240, 240, 240, 240, 240, 255, 255, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 240, 240, 240, 240, 240, 255, 255, 255, 127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 63, 48, 61, 61, 62, 63, 48, 61, 61, 50, 63, 56, 55, 55, 56, 63, 31, 0, 0, + }; + oled_write_raw_P(pro_logo, sizeof(pro_logo)); +} +#endif diff --git a/keyboards/mechboards/crkbd/pro/readme.md b/keyboards/mechboards/crkbd/pro/readme.md new file mode 100644 index 0000000000..52fc199d5c --- /dev/null +++ b/keyboards/mechboards/crkbd/pro/readme.md @@ -0,0 +1,25 @@ +# CRKBD Pro + +A refreshed CRKBD (Corne) PCB with RGB, battery, power switch and encoder support. + +* Keyboard Maintainer: [dasky](https://github.com/daskygit) +* Hardware Supported: Controllers using promicro footprint. +* Hardware Availability: https://mechboards.co.uk + +Make example for this keyboard (after setting up your build environment): + + qmk compile -kb mechboards/crkbd/pro -km default + +Flashing example for this keyboard: + + qmk flash -kb mechboards/crkbd/pro -km default + +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 top left key/encoder or the top right key/encoder depending on which side you're connecting to usb. +* **Physical reset button**: Double press the button below the TRRS socket. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 2d37e80ac9c85ccbb16ee580edd335c1e44044a9 Mon Sep 17 00:00:00 2001 From: jack Date: Sat, 22 Mar 2025 09:58:33 -0600 Subject: [PATCH 247/592] Migrate remaining `split.soft_serial_pin` to `split.serial.pin` (#25046) * Migrate keyboards/bastardkb * Migrate keyboards/handwired * Migrate keyboards/helix * Fix duplicate serial key --- keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json | 4 +++- keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json | 4 +++- keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json | 4 +++- keyboards/bastardkb/dilemma/3x5_3/keyboard.json | 4 +++- keyboards/bastardkb/dilemma/4x6_4/keyboard.json | 4 +++- keyboards/bastardkb/scylla/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/scylla/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/scylla/v2/stemcell/keyboard.json | 4 +++- keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json | 4 +++- keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json | 4 +++- keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json | 4 +++- keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json | 4 +++- keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json | 4 +++- keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json | 4 +++- keyboards/handwired/dactyl_cc/keyboard.json | 4 +++- keyboards/handwired/dactyl_kinesis/keyboard.json | 4 +++- keyboards/handwired/dactyl_lightcycle/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/4x5/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/4x6/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x6/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/5x7/keyboard.json | 4 +++- .../handwired/dactyl_manuform/6x6/promicro/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json | 4 +++- keyboards/handwired/dactyl_manuform/6x7/keyboard.json | 4 +++- keyboards/handwired/dactyl_maximus/keyboard.json | 4 +++- keyboards/handwired/dactyl_minidox/keyboard.json | 4 +++- keyboards/handwired/dactyl_promicro/keyboard.json | 4 +++- keyboards/handwired/dactyl_rah/keyboard.json | 4 +++- keyboards/handwired/dactyl_tracer/keyboard.json | 4 +++- keyboards/handwired/jankrp2040dactyl/keyboard.json | 4 ++-- keyboards/handwired/skakunm_dactyl/keyboard.json | 4 +++- keyboards/handwired/splittest/promicro/keyboard.json | 4 +++- keyboards/handwired/splittest/teensy_2/keyboard.json | 4 +++- keyboards/handwired/symmetric70_proto/promicro/info.json | 4 +++- keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json | 4 +++- .../tractyl_manuform/5x6_right/arduinomicro/keyboard.json | 4 +++- .../tractyl_manuform/5x6_right/elite_c/keyboard.json | 4 +++- .../tractyl_manuform/5x6_right/teensy2pp/keyboard.json | 4 +++- keyboards/helix/pico/info.json | 4 +++- keyboards/helix/rev2/info.json | 4 +++- keyboards/helix/rev3_4rows/keyboard.json | 4 +++- keyboards/helix/rev3_5rows/keyboard.json | 4 +++- 69 files changed, 206 insertions(+), 70 deletions(-) diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json index 4a94d023d4..2fd99fb5ab 100644 --- a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2", + "serial": { + "pin": "D2" + }, "matrix_pins": { "right": { "cols": ["C7", "B7", "D7", "E6", "B4"], diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json index bc95061ced..51f6cedf51 100644 --- a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json index cc990d3f21..cf800062b3 100644 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json index 6719b21196..d9039f7591 100644 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json index 2de77b07f0..ca48cc0f3c 100644 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json @@ -30,7 +30,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json index dcc454366c..cef4eab72f 100644 --- a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2", + "serial": { + "pin": "D2" + }, "matrix_pins": { "right": { "cols": ["F1", "C7", "B7", "D7", "E6", "B4"], diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json index ce74b2dc6d..fdfd2c38f9 100644 --- a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json index 825508475c..650bf46481 100644 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json index 4d9cfb616d..b2a4890f56 100644 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json index 05d82b2445..a405395438 100644 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json @@ -30,7 +30,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json index b90b144c8b..6b0caff82e 100644 --- a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2", + "serial": { + "pin": "D2" + }, "matrix_pins": { "right": { "cols": ["F1", "C7", "B7", "D7", "E6", "B4"], diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json index 8ae66d083b..4163f9d476 100644 --- a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json index b0c98389f7..0da7d0b442 100644 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json index 1e072db85b..026684eb92 100644 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json @@ -20,7 +20,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json index ab145e0f95..ed929f7fb7 100644 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json @@ -30,7 +30,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json index ac52a86eb5..366deac293 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json @@ -13,7 +13,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "processor": "RP2040", "bootloader": "rp2040" diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json index 3c4c559cb6..e954f4f657 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json @@ -13,7 +13,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "processor": "RP2040", "bootloader": "rp2040" diff --git a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json index 12e336f023..3ae31d0b46 100644 --- a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json @@ -14,7 +14,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1", + "serial": { + "pin": "GP1" + }, "bootmagic": { "matrix": [4, 0] }, diff --git a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json index 7e40208a5d..4f0ea648c8 100644 --- a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json +++ b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json @@ -14,7 +14,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1", + "serial": { + "pin": "GP1" + }, "bootmagic": { "matrix": [5, 0] }, diff --git a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json b/keyboards/bastardkb/scylla/v1/elitec/keyboard.json index 17b6b7fc36..25963f006c 100644 --- a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/scylla/v1/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json b/keyboards/bastardkb/scylla/v2/elitec/keyboard.json index 7bfb7ff5a4..316606b17b 100644 --- a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/scylla/v2/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json index 2b9022d24e..2c0beb5c1d 100644 --- a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json index cd4da3ac41..ed92be5a45 100644 --- a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json b/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json index 06bfeda7d2..80325bfea3 100644 --- a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json index 2910d80b2f..3bbba6d310 100644 --- a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json index dec2537b65..43675db36d 100644 --- a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json index 897f195a31..32030dbd00 100644 --- a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json index 06a93dfbeb..51227f5065 100644 --- a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json b/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json index 6dd86bcc12..2e9745b7f2 100644 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json index 59988074ba..5110ea0d74 100644 --- a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json +++ b/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json index 01679bcff9..701ec6af28 100644 --- a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json +++ b/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json @@ -22,7 +22,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu" diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json index 2048db6251..15db3db6e8 100644 --- a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json +++ b/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json index 8dd21b7591..3936b9368a 100644 --- a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json +++ b/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json @@ -19,7 +19,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "GP1" + "serial": { + "pin": "GP1" + } }, "ws2812": { "pin": "GP0", diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json b/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json index 41abba96cb..2cbee7fe17 100644 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json +++ b/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "A3" + "serial": { + "pin": "A3" + } }, "development_board": "stemcell" } diff --git a/keyboards/handwired/dactyl_cc/keyboard.json b/keyboards/handwired/dactyl_cc/keyboard.json index e607bfad1a..f4097b0487 100644 --- a/keyboards/handwired/dactyl_cc/keyboard.json +++ b/keyboards/handwired/dactyl_cc/keyboard.json @@ -23,7 +23,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "layouts": { diff --git a/keyboards/handwired/dactyl_kinesis/keyboard.json b/keyboards/handwired/dactyl_kinesis/keyboard.json index ee68a2c515..26993fc974 100644 --- a/keyboards/handwired/dactyl_kinesis/keyboard.json +++ b/keyboards/handwired/dactyl_kinesis/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "layouts": { diff --git a/keyboards/handwired/dactyl_lightcycle/keyboard.json b/keyboards/handwired/dactyl_lightcycle/keyboard.json index 1b5f2dd39a..6e56b18f6f 100644 --- a/keyboards/handwired/dactyl_lightcycle/keyboard.json +++ b/keyboards/handwired/dactyl_lightcycle/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "community_layouts": ["split_3x6_3", "split_3x5_3"], diff --git a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json index e0a1b531a5..ce4b6c648b 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json index 7efc4718ad..134793cac8 100644 --- a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "layouts": { diff --git a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json index d589c532a8..0d8af5eed1 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json index c0c24a8966..1846f2a661 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json @@ -32,7 +32,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "layouts": { diff --git a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json index 47ad7aa920..ab916b0353 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json index 353b148126..1bcba1b648 100644 --- a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json index 620ffdec06..7a0cff5e6c 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0", + "serial": { + "pin": "D0" + }, "bootmagic": { "matrix": [6, 5] } diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json index fc7676aa4b..0694447ee9 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0", + "serial": { + "pin": "D0" + }, "bootmagic": { "matrix": [6, 5] } diff --git a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json index 974f1b8bc3..ae73995d49 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D3" + "serial": { + "pin": "D3" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json index 5b6bdfb86e..7d51a06c7c 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json @@ -25,7 +25,9 @@ }, "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "matrix_pins": { "cols": ["D4", "C6", "D7", "E6", "B4", "B5"], diff --git a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json index d40a45dfa7..cf5f579057 100644 --- a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json index 213a3c29f5..44ae441270 100644 --- a/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json @@ -6,7 +6,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "rgblight": { "led_count": 12 diff --git a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json index 98e96c9639..a011a2cc3b 100644 --- a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json @@ -35,7 +35,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json index 153b6c75c4..bb016647da 100644 --- a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json @@ -32,7 +32,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "rgblight": { "led_count": 12 diff --git a/keyboards/handwired/dactyl_maximus/keyboard.json b/keyboards/handwired/dactyl_maximus/keyboard.json index 081fab571a..57e91cc3f4 100644 --- a/keyboards/handwired/dactyl_maximus/keyboard.json +++ b/keyboards/handwired/dactyl_maximus/keyboard.json @@ -26,7 +26,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D1" + "serial": { + "pin": "D1" + } }, "development_board": "promicro", "layouts": { diff --git a/keyboards/handwired/dactyl_minidox/keyboard.json b/keyboards/handwired/dactyl_minidox/keyboard.json index 5bd5c5c05a..b488bac4b0 100644 --- a/keyboards/handwired/dactyl_minidox/keyboard.json +++ b/keyboards/handwired/dactyl_minidox/keyboard.json @@ -67,7 +67,9 @@ "diode_direction": "ROW2COL", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "development_board": "promicro", "community_layouts": ["split_3x5_3"], diff --git a/keyboards/handwired/dactyl_promicro/keyboard.json b/keyboards/handwired/dactyl_promicro/keyboard.json index 824ffe7e7e..df82505d94 100644 --- a/keyboards/handwired/dactyl_promicro/keyboard.json +++ b/keyboards/handwired/dactyl_promicro/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "rgblight": { "led_count": 12 diff --git a/keyboards/handwired/dactyl_rah/keyboard.json b/keyboards/handwired/dactyl_rah/keyboard.json index 3bc5dc0854..903aafc973 100644 --- a/keyboards/handwired/dactyl_rah/keyboard.json +++ b/keyboards/handwired/dactyl_rah/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/dactyl_tracer/keyboard.json b/keyboards/handwired/dactyl_tracer/keyboard.json index 29e5990666..92a8a2c76b 100644 --- a/keyboards/handwired/dactyl_tracer/keyboard.json +++ b/keyboards/handwired/dactyl_tracer/keyboard.json @@ -24,7 +24,9 @@ "development_board": "promicro", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "layouts": { "LAYOUT" : { diff --git a/keyboards/handwired/jankrp2040dactyl/keyboard.json b/keyboards/handwired/jankrp2040dactyl/keyboard.json index 0d155a70bd..485da14b66 100644 --- a/keyboards/handwired/jankrp2040dactyl/keyboard.json +++ b/keyboards/handwired/jankrp2040dactyl/keyboard.json @@ -6,9 +6,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "GP0", "serial": { - "driver": "vendor" + "driver": "vendor", + "pin": "GP0" } }, diff --git a/keyboards/handwired/skakunm_dactyl/keyboard.json b/keyboards/handwired/skakunm_dactyl/keyboard.json index cc6f70b482..5d87f23f7b 100644 --- a/keyboards/handwired/skakunm_dactyl/keyboard.json +++ b/keyboards/handwired/skakunm_dactyl/keyboard.json @@ -29,7 +29,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/handwired/splittest/promicro/keyboard.json b/keyboards/handwired/splittest/promicro/keyboard.json index 8aca1c3de7..93f09a47ca 100644 --- a/keyboards/handwired/splittest/promicro/keyboard.json +++ b/keyboards/handwired/splittest/promicro/keyboard.json @@ -8,7 +8,9 @@ "handedness": { "pin": "F6" }, - "soft_serial_pin": "D1" + "serial": { + "pin": "D1" + } }, "ws2812": { "pin": "D3" diff --git a/keyboards/handwired/splittest/teensy_2/keyboard.json b/keyboards/handwired/splittest/teensy_2/keyboard.json index c10b20a173..78d6c5f9a3 100644 --- a/keyboards/handwired/splittest/teensy_2/keyboard.json +++ b/keyboards/handwired/splittest/teensy_2/keyboard.json @@ -8,7 +8,9 @@ "handedness": { "pin": "F0" }, - "soft_serial_pin": "D1" + "serial": { + "pin": "D1" + } }, "ws2812": { "pin": "D3" diff --git a/keyboards/handwired/symmetric70_proto/promicro/info.json b/keyboards/handwired/symmetric70_proto/promicro/info.json index f143f518eb..43ecb4c1c0 100644 --- a/keyboards/handwired/symmetric70_proto/promicro/info.json +++ b/keyboards/handwired/symmetric70_proto/promicro/info.json @@ -12,7 +12,9 @@ } }, "split": { - "soft_serial_pin": "D0" + "serial": { + "pin": "D0" + } }, "processor": "atmega32u4", "bootloader": "caterina" diff --git a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json index e5730a4586..37633e5a56 100644 --- a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json +++ b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json @@ -22,7 +22,9 @@ "handedness": { "pin": "A6" }, - "soft_serial_pin": "D3", + "serial": { + "pin": "D3" + }, "bootmagic": { "matrix": [4, 5] } diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json index df810f2881..bd4c41e17b 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json +++ b/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json @@ -6,7 +6,9 @@ }, "diode_direction": "COL2ROW", "split": { - "soft_serial_pin": "D0", + "serial": { + "pin": "D0" + }, "matrix_pins": { "right": { "cols": ["D6", "D7", "B4", "D3", "C6", "C7"], diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json index e6c0e42bde..739aad07ba 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json +++ b/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json @@ -11,7 +11,9 @@ ] }, "split": { - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "ws2812": { "pin": "D3" diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json index a131ac085b..5a091996b6 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json +++ b/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json @@ -11,7 +11,9 @@ ] }, "split": { - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "ws2812": { "pin": "E7" diff --git a/keyboards/helix/pico/info.json b/keyboards/helix/pico/info.json index d4fabc756e..7909bb0b30 100644 --- a/keyboards/helix/pico/info.json +++ b/keyboards/helix/pico/info.json @@ -10,7 +10,9 @@ }, "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "tapping": { "term": 100 diff --git a/keyboards/helix/rev2/info.json b/keyboards/helix/rev2/info.json index fd829782c0..a8bdb23e41 100644 --- a/keyboards/helix/rev2/info.json +++ b/keyboards/helix/rev2/info.json @@ -15,7 +15,9 @@ "diode_direction": "COL2ROW", "split": { "enabled": true, - "soft_serial_pin": "D2", + "serial": { + "pin": "D2" + }, "transport": { "sync": { "indicators": true, diff --git a/keyboards/helix/rev3_4rows/keyboard.json b/keyboards/helix/rev3_4rows/keyboard.json index 5e9fd2dcd8..537c332d5c 100644 --- a/keyboards/helix/rev3_4rows/keyboard.json +++ b/keyboards/helix/rev3_4rows/keyboard.json @@ -33,7 +33,9 @@ }, "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "ws2812": { "pin": "D3" diff --git a/keyboards/helix/rev3_5rows/keyboard.json b/keyboards/helix/rev3_5rows/keyboard.json index b61db7df86..485cfd924f 100644 --- a/keyboards/helix/rev3_5rows/keyboard.json +++ b/keyboards/helix/rev3_5rows/keyboard.json @@ -99,7 +99,9 @@ }, "split": { "enabled": true, - "soft_serial_pin": "D2" + "serial": { + "pin": "D2" + } }, "ws2812": { "pin": "D3" From ce2f7d86be171f7273299720ba739b8c85d4c267 Mon Sep 17 00:00:00 2001 From: Grigory Avdyushin Date: Sun, 23 Mar 2025 06:17:05 +0100 Subject: [PATCH 248/592] Franky36 handwired keyboard (#25029) --- keyboards/handwired/franky36/config.h | 21 +++ keyboards/handwired/franky36/franky36.c | 68 ++++++++++ keyboards/handwired/franky36/halconf.h | 21 +++ keyboards/handwired/franky36/keyboard.json | 72 ++++++++++ .../franky36/keymaps/default/keymap.c | 123 ++++++++++++++++++ keyboards/handwired/franky36/mcuconf.h | 24 ++++ keyboards/handwired/franky36/readme.md | 25 ++++ 7 files changed, 354 insertions(+) create mode 100644 keyboards/handwired/franky36/config.h create mode 100644 keyboards/handwired/franky36/franky36.c create mode 100644 keyboards/handwired/franky36/halconf.h create mode 100644 keyboards/handwired/franky36/keyboard.json create mode 100644 keyboards/handwired/franky36/keymaps/default/keymap.c create mode 100644 keyboards/handwired/franky36/mcuconf.h create mode 100644 keyboards/handwired/franky36/readme.md diff --git a/keyboards/handwired/franky36/config.h b/keyboards/handwired/franky36/config.h new file mode 100644 index 0000000000..3749ff5785 --- /dev/null +++ b/keyboards/handwired/franky36/config.h @@ -0,0 +1,21 @@ +/* Copyright 2024-2025 Grigory Avdyushin + * + * 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 I2C_DRIVER I2CD0 +#define I2C1_SDA_PIN GP0 +#define I2C1_SCL_PIN GP1 diff --git a/keyboards/handwired/franky36/franky36.c b/keyboards/handwired/franky36/franky36.c new file mode 100644 index 0000000000..50e4d38b52 --- /dev/null +++ b/keyboards/handwired/franky36/franky36.c @@ -0,0 +1,68 @@ +/* Copyright 2024-2025 Grigory Avdyushin + * + * 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 + +#ifdef OLED_ENABLE + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0x00, 0x0A, 0x0A + }; + + oled_write_P(qmk_logo, false); +} + +static void render_mod_status(uint8_t modifiers) { + oled_write_P(PSTR("MODS:"), false); + oled_write_P(PSTR("S"), (modifiers & MOD_MASK_SHIFT)); + oled_write_P(PSTR("C"), (modifiers & MOD_MASK_CTRL)); + oled_write_P(PSTR("A"), (modifiers & MOD_MASK_ALT)); + oled_write_ln_P(PSTR("G"), (modifiers & MOD_MASK_GUI)); + oled_write_ln_P(PSTR(" "), false); +} + +static void render_layer_state(void) { + oled_write_ln_P(PSTR(" "), false); + oled_write_P("BASE ", layer_state_is(0)); + oled_write_P("LOWER", layer_state_is(1)); + oled_write_P("RAISE", layer_state_is(2)); + oled_write_P("NAV ", layer_state_is(3)); + oled_write_ln_P(PSTR(" "), false); +} + +static void render_capsword_state(bool on) { + oled_write_ln_P("CAPSW", on); +} + +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_270; +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + render_logo(); + render_layer_state(); + render_mod_status(get_mods() | get_oneshot_mods()); + render_capsword_state(is_caps_word_on()); + return false; +} + + #endif diff --git a/keyboards/handwired/franky36/halconf.h b/keyboards/handwired/franky36/halconf.h new file mode 100644 index 0000000000..3c594066b6 --- /dev/null +++ b/keyboards/handwired/franky36/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2024-2025 Grigory Avdyushin + * + * 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 + +#include_next diff --git a/keyboards/handwired/franky36/keyboard.json b/keyboards/handwired/franky36/keyboard.json new file mode 100644 index 0000000000..038fc1eb67 --- /dev/null +++ b/keyboards/handwired/franky36/keyboard.json @@ -0,0 +1,72 @@ +{ + "manufacturer": "Grigory Avdyushin", + "keyboard_name": "franky36", + "maintainer": "Grigory Avdyushin", + "bootloader": "rp2040", + "caps_word": { + "both_shifts_turns_on": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "caps_word": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true + }, + "matrix_pins": { + "cols": ["GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP26", "GP27", "GP28"], + "rows": ["GP5", "GP4", "GP3", "GP2"] + }, + "processor": "RP2040", + "url": "https://github.com/avdyushin/franky36", + "usb": { + "device_version": "0.2.0", + "pid": "0x0001", + "vid": "0xFEED" + }, + "community_layouts": ["split_3x5_3"], + "layouts": { + "LAYOUT_split_3x5_3": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3} + ] + } + } +} diff --git a/keyboards/handwired/franky36/keymaps/default/keymap.c b/keyboards/handwired/franky36/keymaps/default/keymap.c new file mode 100644 index 0000000000..1b281124f9 --- /dev/null +++ b/keyboards/handwired/franky36/keymaps/default/keymap.c @@ -0,0 +1,123 @@ +/* Copyright 2024-2025 Grigory Avdyushin + * + * 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 + +enum my_layers { + _BASE = 0, + _LOWER, + _RAISE, + _NAV, +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define NAV MO(_NAV) + +#define OSM_LSFT OSM(MOD_LSFT) // One Shot Right Shift + +#define KC_SFT_Z SFT_T(KC_Z) // Left Shift when held, Z when tapped +#define KC_SFT_SL RSFT_T(KC_SLSH) // Right Shift when held, / when tapped + +#define KC_SFT_BSLS RSFT_T(KC_BSLS) // Right Shift when held, \ when tapped + +#define KC_LWR_SPC LT(_LOWER, KC_SPC) // Lower layer when held, Space when tapped +#define KC_RSE_BSPC LT(_RAISE, KC_BSPC) // Raise layer when held, Backspace when tapped +#define KC_NAV_A LT(_NAV,KC_A) // Navigation layer when held, A when tapped + +#define KC_CMD_TAB CMD_T(KC_TAB) // Left Command when held, Tab when tapped +#define KC_CMD_ENT RCMD_T(KC_ENT) // Right Command when held, Enter when tapped + +#define KC_CTL_ESC CTL_T(KC_ESC) // Left Control when held, Escape when tapped +#define KC_OPT_OSM_SFT ROPT_T(OSM_LSFT) // Right Option when held, One Shot Shift when tapped + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ + * │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ;:│ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │⇧/Z│ X │ C │ V │ B │ │ N │ M │ ,<│ .>│⇧/?│ + * └───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ + * ┌───┬───┬───┐ ┌───┬───┬───┐ + * │CTL│CMD│SPC│ │ENT│CMD│OPT│ + * └───┴───┴───┘ └───┴───┴───┘ + */ + [_BASE] = LAYOUT_split_3x5_3( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_NAV_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + KC_SFT_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SFT_SL, + KC_CTL_ESC, KC_CMD_TAB, KC_LWR_SPC, KC_RSE_BSPC, KC_CMD_ENT, KC_ROPT + ), + + /* + * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ + * │ 1!│ 2@│ 3#│ 4$│ 5%│ │ 6^│ 7&│ 8*│ 9(│ 0)│ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ `~│ │ │ │ │ │ ← │ ↓ │ ↑ │ → │ '"│ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ ⇧ │ │ │ │ │ │ -_│ =+│ [{│ ]}│ \|│ + * └───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ + * ┌───┬───┬───┐ ┌───┬───┬───┐ + * │ │ │ │ │ │ │ │ + * └───┴───┴───┘ └───┴───┴───┘ + */ + [_LOWER] = LAYOUT_split_3x5_3( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_GRV, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_QUOT, + KC_LSFT, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_SFT_BSLS, + _______, _______, _______, _______, _______, _______ + ), + + /* + * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ + * │ F1│ F2│ F3│ F4│ F5│ │ F6│ F7│ F8│ F9│F10│ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ │ + * └───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ + * ┌───┬───┬───┐ ┌───┬───┬───┐ + * │ │ │ │ │ │ │ │ + * └───┴───┴───┘ └───┴───┴───┘ + */ + [_RAISE] = LAYOUT_split_3x5_3( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______ + ), + + /* + * ┌───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┐ + * │ │ │ │ │ │ │HOM│ │ │END│ │ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │ ← │ ↓ │ ↑ │ → │ │ + * ├───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┤ + * │ │ │ │ │ │ │PUP│ │ │PDN│ │ + * └───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┘ + * ┌───┬───┬───┐ ┌───┬───┬───┐ + * │ │ │ │ │ │ │ │ + * └───┴───┴───┘ └───┴───┴───┘ + */ + [_NAV] = LAYOUT_split_3x5_3( + _______, _______, _______, _______, _______, KC_HOME, _______, _______, KC_END, _______, + _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, + _______, _______, _______, _______, _______, KC_PGUP, _______, _______, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/handwired/franky36/mcuconf.h b/keyboards/handwired/franky36/mcuconf.h new file mode 100644 index 0000000000..8d47159177 --- /dev/null +++ b/keyboards/handwired/franky36/mcuconf.h @@ -0,0 +1,24 @@ +/* Copyright 2024-2025 Grigory Avdyushin + * + * 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 RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE +#undef RP_I2C_USE_I2C1 +#define RP_I2C_USE_I2C1 FALSE diff --git a/keyboards/handwired/franky36/readme.md b/keyboards/handwired/franky36/readme.md new file mode 100644 index 0000000000..62d1bfd5c3 --- /dev/null +++ b/keyboards/handwired/franky36/readme.md @@ -0,0 +1,25 @@ +# franky36 + +Franky36 is 36 key compact handwired split keyboard that uses single RP2040-Zero controller. + +* Keyboard Maintainer: [Grigory Avdyushin](https://github.com/avdyushin) +* Hardware Supported: RP2040-Zero +* Hardware Availability: Handwired [franky36](https://github.com/avdyushin/franky36) + +Make example for this keyboard (after setting up your build environment): + + make franky36:default + +Flashing example for this keyboard: + + make franky36: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**: Hold down the reset button on the controller and plug in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 86c22a15aba8c7146b7c55ccdaf70b8f965a0caa Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 26 Mar 2025 01:51:56 -0600 Subject: [PATCH 249/592] Fix outdated GPIO control function usage (#25060) --- drivers/painter/ili9xxx/qp_ili9486.c | 16 ++++++++-------- keyboards/zsa/moonlander/matrix.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/painter/ili9xxx/qp_ili9486.c b/drivers/painter/ili9xxx/qp_ili9486.c index c4f3c15cec..48db779c04 100644 --- a/drivers/painter/ili9xxx/qp_ili9486.c +++ b/drivers/painter/ili9xxx/qp_ili9486.c @@ -75,9 +75,9 @@ static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t dev painter_driver_t * driver = (painter_driver_t *)device; qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config; - writePinLow(comms_config->spi_config.chip_select_pin); + gpio_write_pin_low(comms_config->spi_config.chip_select_pin); qp_comms_spi_dc_reset_send_command(device, cmd); - writePinHigh(comms_config->spi_config.chip_select_pin); + gpio_write_pin_high(comms_config->spi_config.chip_select_pin); } static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) { @@ -88,20 +88,20 @@ static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, con const uint8_t *p = (const uint8_t *)data; uint32_t max_msg_length = 1024; - writePinHigh(comms_config->dc_pin); + gpio_write_pin_high(comms_config->dc_pin); while (bytes_remaining > 0) { uint32_t bytes_this_loop = QP_MIN(bytes_remaining, max_msg_length); bool odd_bytes = bytes_this_loop & 1; // send data - writePinLow(comms_config->spi_config.chip_select_pin); + gpio_write_pin_low(comms_config->spi_config.chip_select_pin); spi_transmit(p, bytes_this_loop); p += bytes_this_loop; // extra CS toggle, for alignment if (odd_bytes) { - writePinHigh(comms_config->spi_config.chip_select_pin); - writePinLow(comms_config->spi_config.chip_select_pin); + gpio_write_pin_high(comms_config->spi_config.chip_select_pin); + gpio_write_pin_low(comms_config->spi_config.chip_select_pin); } bytes_remaining -= bytes_this_loop; @@ -116,9 +116,9 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin uint32_t ret; for (uint8_t j = 0; j < byte_count; ++j) { - writePinLow(comms_config->spi_config.chip_select_pin); + gpio_write_pin_low(comms_config->spi_config.chip_select_pin); ret = qp_comms_spi_dc_reset_send_data(device, &data[j], 1); - writePinHigh(comms_config->spi_config.chip_select_pin); + gpio_write_pin_high(comms_config->spi_config.chip_select_pin); } return ret; diff --git a/keyboards/zsa/moonlander/matrix.c b/keyboards/zsa/moonlander/matrix.c index 867fa85a66..4e5c120950 100644 --- a/keyboards/zsa/moonlander/matrix.c +++ b/keyboards/zsa/moonlander/matrix.c @@ -127,7 +127,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) { matrix_io_delay(); } // read col data - data = ((readPin(A0) << 0) | (readPin(A1) << 1) | (readPin(A2) << 2) | (readPin(A3) << 3) | (readPin(A6) << 4) | (readPin(A7) << 5) | (readPin(B0) << 6)); + data = ((gpio_read_pin(A0) << 0) | (gpio_read_pin(A1) << 1) | (gpio_read_pin(A2) << 2) | (gpio_read_pin(A3) << 3) | (gpio_read_pin(A6) << 4) | (gpio_read_pin(A7) << 5) | (gpio_read_pin(B0) << 6)); // unstrobe row switch (row) { case 0: From 1a6a9a7c770b06866199caaa1022d7d01fc98e6b Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 26 Mar 2025 21:30:45 +1100 Subject: [PATCH 250/592] [Modules] Provide access to current path in `rules.mk`. (#25061) --- lib/python/qmk/cli/generate/rules_mk.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index ef4101d77f..01d71d277f 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -72,6 +72,8 @@ def generate_modules_rules(keyboard, filename): lines.append(f'COMMUNITY_MODULE_PATHS += {module_path}') lines.append(f'VPATH += {module_path}') lines.append(f'SRC += $(wildcard {module_path}/{module_path.name}.c)') + lines.append(f'MODULE_NAME_{module_path.name.upper()} := {module_path.name}') + lines.append(f'MODULE_PATH_{module_path.name.upper()} := {module_path}') lines.append(f'-include {module_path}/rules.mk') module_jsons = load_module_jsons(modules) From a3c39bde0edf5c96f339fdfba801b6c249a75abf Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 26 Mar 2025 19:23:28 +0000 Subject: [PATCH 251/592] Create tags when `lib/python` changes (#25064) Create tags when lib/python changes --- .github/workflows/auto_tag.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/auto_tag.yml b/.github/workflows/auto_tag.yml index b4465277b0..4afca6c66d 100644 --- a/.github/workflows/auto_tag.yml +++ b/.github/workflows/auto_tag.yml @@ -15,6 +15,7 @@ on: - quantum/**/* - tests/**/* - tmk_core/**/* + - lib/python/**/* - util/**/* - Makefile - '*.mk' From a02ed6a36d677b7c2e45fbc3d63336194cef77bf Mon Sep 17 00:00:00 2001 From: yiancar Date: Thu, 27 Mar 2025 23:25:46 +0000 Subject: [PATCH 252/592] Update keymap for keycult 1800 (#25070) Update keymap Co-authored-by: yiancar --- keyboards/keycult/keycult1800/keyboard.json | 3 ++- keyboards/keycult/keycult1800/keymaps/default/keymap.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/keycult/keycult1800/keyboard.json b/keyboards/keycult/keycult1800/keyboard.json index a50b77d104..8ed6e6e2fa 100644 --- a/keyboards/keycult/keycult1800/keyboard.json +++ b/keyboards/keycult/keycult1800/keyboard.json @@ -96,7 +96,8 @@ { "matrix": [3, 15], "x": 16.5, "y": 3.5 }, { "matrix": [3, 16], "x": 17.5, "y": 3.5 }, { "matrix": [3, 17], "x": 18.5, "y": 3.5 }, - { "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 }, + { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4.5 }, + { "matrix": [4, 1], "x": 1.25, "y": 4.5 }, { "matrix": [4, 2], "x": 2.25, "y": 4.5 }, { "matrix": [4, 3], "x": 3.25, "y": 4.5 }, { "matrix": [4, 4], "x": 4.25, "y": 4.5 }, diff --git a/keyboards/keycult/keycult1800/keymaps/default/keymap.c b/keyboards/keycult/keycult1800/keymaps/default/keymap.c index e596ff2db0..79570b73a2 100644 --- a/keyboards/keycult/keycult1800/keymaps/default/keymap.c +++ b/keyboards/keycult/keycult1800/keymaps/default/keymap.c @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_DEL, 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_PPLS, - 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_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_P1, KC_P2, KC_P3, KC_PENT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), [1] = LAYOUT( /* FN */ @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), }; From 64fe4aff31c11fac3095bcb3b766a786912c5278 Mon Sep 17 00:00:00 2001 From: Erik Peyronson Date: Fri, 28 Mar 2025 07:25:39 +0100 Subject: [PATCH 253/592] Add handwired/erikpeyronson/erkbd (#25030) Co-authored-by: Erik Peyronson Co-authored-by: jack Co-authored-by: Drashna Jaelre --- .../handwired/erikpeyronson/erkbd/config.h | 13 +++ .../handwired/erikpeyronson/erkbd/erkbd.c | 63 +++++++++++ .../erikpeyronson/erkbd/keyboard.json | 107 ++++++++++++++++++ .../erkbd/keymaps/debug/keymap.c | 52 +++++++++ .../erkbd/keymaps/debug/rules.mk | 2 + .../erkbd/keymaps/default/keymap.json | 24 ++++ .../handwired/erikpeyronson/erkbd/readme.md | 28 +++++ 7 files changed, 289 insertions(+) create mode 100644 keyboards/handwired/erikpeyronson/erkbd/config.h create mode 100644 keyboards/handwired/erikpeyronson/erkbd/erkbd.c create mode 100644 keyboards/handwired/erikpeyronson/erkbd/keyboard.json create mode 100644 keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/keymap.c create mode 100644 keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/rules.mk create mode 100644 keyboards/handwired/erikpeyronson/erkbd/keymaps/default/keymap.json create mode 100644 keyboards/handwired/erikpeyronson/erkbd/readme.md diff --git a/keyboards/handwired/erikpeyronson/erkbd/config.h b/keyboards/handwired/erikpeyronson/erkbd/config.h new file mode 100644 index 0000000000..acbafbfaa7 --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/config.h @@ -0,0 +1,13 @@ +// Copyright 2025 Erik Peyronson @erikpeyronson +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U + +#define I2C_DRIVER I2CD1 +#define OLED_IC OLED_IC_SH1106 +#define OLED_COLUMN_OFFSET 2 + +#define OLED_DISPLAY_128X64 diff --git a/keyboards/handwired/erikpeyronson/erkbd/erkbd.c b/keyboards/handwired/erikpeyronson/erkbd/erkbd.c new file mode 100644 index 0000000000..af236df93c --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/erkbd.c @@ -0,0 +1,63 @@ +// Copyright 2025 Erik Peyronson @erikpeyronson +// SPDX-License-Identifier: GPL-3.0-or-later +#include QMK_KEYBOARD_H + +static void oled_render_logo(void) { + // clang-format off + static const char PROGMEM qmk_logo[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 + }; + // clang-format on + + oled_write_P(qmk_logo, false); +} + +static void render_layer(void) { + oled_write_P(PSTR("Layer: "), false); + oled_write_ln(get_u8_str(get_highest_layer(layer_state), ' '), false); +} + +static void render_locks(void) { + led_t led_config = host_keyboard_led_state(); + oled_write_P(PSTR("Caps "), led_config.caps_lock); + oled_write_P(PSTR("Scrl "), led_config.scroll_lock); + oled_write_P(PSTR("Num "), led_config.num_lock); +#ifdef CAPS_WORD_ENABLE + oled_write_P(PSTR("Word "), is_caps_word_on()); +#endif + oled_advance_page(true); +} + +static void render_mods(void) { + uint8_t mod_state = get_mods(); + oled_write_P("Ctrl ", mod_state & MOD_MASK_CTRL); + oled_write_P("Shift ", mod_state & MOD_MASK_SHIFT); + oled_write_P("Alt ", mod_state & MOD_MASK_ALT); + oled_write_P("Gui", mod_state & MOD_MASK_GUI); + oled_advance_page(true); +} + +static void render_delimeter(void) { + oled_write_ln_P(PSTR("------------------"), false); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (is_keyboard_left()) { + oled_render_logo(); + } else { + render_delimeter(); + render_locks(); + render_delimeter(); + render_mods(); + render_delimeter(); + render_layer(); + render_delimeter(); + } + + return false; +} diff --git a/keyboards/handwired/erikpeyronson/erkbd/keyboard.json b/keyboards/handwired/erikpeyronson/erkbd/keyboard.json new file mode 100644 index 0000000000..d3ef5147f4 --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/keyboard.json @@ -0,0 +1,107 @@ +{ + "manufacturer": "Erik Peyronson", + "keyboard_name": "erkbd", + "maintainer": "erikpeyronson", + "bootloader": "rp2040", + "bootloader_instructions": "Double tap the reset button on the controller board if accessable. If not hold down bootmagic key while powering on. Left side: row 0 column 0. (The tab key on regular keyboard). Right side: row 5 column 4 (the Backspace key on regular keyboard)", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP7", "pin_b": "GP8"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "oled": true + }, + "matrix_pins": { + "cols": ["GP8", "GP9", "GP10", "GP11", "GP12", "GP13"], + "rows": ["GP4", "GP5", "GP6", "GP7"] + }, + "processor": "RP2040", + "split": { + "bootmagic": { + "matrix": [4, 5] + }, + "enabled": true, + "encoder": { + "right": { + "rotary": [ + {"pin_a": "GP7", "pin_b": "GP8"} + ] + } + }, + "handedness": { + "pin": "GP1" + }, + "matrix_pins": { + "right": { + "cols": ["GP9", "GP10", "GP11", "GP12", "GP13", "GP14"], + "rows": ["GP28", "GP27", "GP26", "GP15"] + } + }, + "serial": { + "driver": "vendor", + "pin": "GP0" + } + }, + "url": "https://github.com/erikpeyronson/erkbd", + "usb": { + "device_version": "1.0.0", + "pid": "0x1234", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT_split_3x6_5": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.4}, + {"matrix": [0, 1], "x": 1, "y": 0.3}, + {"matrix": [0, 2], "x": 2, "y": 0.1}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.1}, + {"matrix": [0, 5], "x": 5, "y": 0.2}, + {"matrix": [4, 0], "x": 9, "y": 0.2}, + {"matrix": [4, 1], "x": 10, "y": 0.1}, + {"matrix": [4, 2], "x": 11, "y": 0}, + {"matrix": [4, 3], "x": 12, "y": 0.1}, + {"matrix": [4, 4], "x": 13, "y": 0.3}, + {"matrix": [4, 5], "x": 14, "y": 0.4}, + {"matrix": [1, 0], "x": 0, "y": 1.4}, + {"matrix": [1, 1], "x": 1, "y": 1.3}, + {"matrix": [1, 2], "x": 2, "y": 1.1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.1}, + {"matrix": [1, 5], "x": 5, "y": 1.2}, + {"matrix": [5, 0], "x": 9, "y": 1.2}, + {"matrix": [5, 1], "x": 10, "y": 1.1}, + {"matrix": [5, 2], "x": 11, "y": 1}, + {"matrix": [5, 3], "x": 12, "y": 1.1}, + {"matrix": [5, 4], "x": 13, "y": 1.3}, + {"matrix": [5, 5], "x": 14, "y": 1.4}, + {"matrix": [2, 0], "x": 0, "y": 2.4}, + {"matrix": [2, 1], "x": 1, "y": 2.3}, + {"matrix": [2, 2], "x": 2, "y": 2.1}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.1}, + {"matrix": [2, 5], "x": 5, "y": 2.2}, + {"matrix": [6, 0], "x": 9, "y": 2.2}, + {"matrix": [6, 1], "x": 10, "y": 2.1}, + {"matrix": [6, 2], "x": 11, "y": 2}, + {"matrix": [6, 3], "x": 12, "y": 2.1}, + {"matrix": [6, 4], "x": 13, "y": 2.3}, + {"matrix": [6, 5], "x": 14, "y": 2.4}, + {"matrix": [3, 1], "x": 3, "y": 3.4}, + {"matrix": [3, 2], "x": 4, "y": 3.4}, + {"matrix": [3, 3], "x": 5, "y": 3.5}, + {"matrix": [3, 4], "x": 6, "y": 3.7}, + {"matrix": [3, 5], "x": 6, "y": 2.7}, + {"matrix": [7, 0], "x": 8, "y": 2.7}, + {"matrix": [7, 1], "x": 8, "y": 3.7}, + {"matrix": [7, 2], "x": 9, "y": 3.5}, + {"matrix": [7, 3], "x": 10, "y": 3.4}, + {"matrix": [7, 4], "x": 11, "y": 3.4} + ] + } + } +} diff --git a/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/keymap.c b/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/keymap.c new file mode 100644 index 0000000000..8884702c81 --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/keymap.c @@ -0,0 +1,52 @@ +// Copyright 2025 Qmk, Erik Peyronson @erikpeyronson +// SPDX-License-Identifier: GPL-3.0-or-later + +// NOTE: This keymap is for debugging purposes to have firmware to test the matrix when building the keyboard. If you intend to build this keyboard +// you should copy this to your fork or userspace repository and create your own. + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split_3x6_5( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + 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_LBRC, KC_RBRC, KC_LGUI, KC_BSPC, KC_SPC, KC_SPC, KC_ENT, KC_RALT, KC_LPRN, KC_RPRN + ) +}; +// clang-format on + +void keyboard_post_init_user(void) { +#ifdef CONSOLE_ENABLE + debug_enable = true; + debug_matrix = true; +#endif +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // If console is enabled, it will print the matrix position and status of each key pressed +#ifdef CONSOLE_ENABLE + uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %u, time: %5u, int: %u, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); +#endif + return true; +} + +// This function prints which half the keyboard considers itself to be which is +// useful for verify if the handedness pin and display is correctly set up when building +#ifdef OLED_ENABLE +bool oled_task_user(void) { + if (is_keyboard_left()) { + oled_write_P(PSTR("left"), false); + } else { + oled_write_P(PSTR("right"), false); + } + return false; +} +#endif + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = {ENCODER_CCW_CW(KC_UP, KC_DOWN), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT)} +}; +#endif diff --git a/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/rules.mk b/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/rules.mk new file mode 100644 index 0000000000..14094ea22c --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/keymaps/debug/rules.mk @@ -0,0 +1,2 @@ +ENCODER_MAP_ENABLE = yes +CONSOLE_ENABLE = yes diff --git a/keyboards/handwired/erikpeyronson/erkbd/keymaps/default/keymap.json b/keyboards/handwired/erikpeyronson/erkbd/keymaps/default/keymap.json new file mode 100644 index 0000000000..0b733d9fb6 --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/keymaps/default/keymap.json @@ -0,0 +1,24 @@ +{ + "keyboard": "handwired/erikpeyronson/erkbd", + "keymap": "default", + "layout": "LAYOUT_split_3x6_5", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_LBRC", "KC_RBRC", "KC_LGUI", "KC_BSPC", "KC_SPC", "KC_SPC", "KC_ENT", "KC_RALT", "KC_LPRN", "KC_RPRN" + ] + ], + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [ + { "ccw": "KC_UP", "cw": "KC_DOWN" }, + { "ccw": "KC_RIGHT", "cw": "KC_LEFT" } + ] + ] +} diff --git a/keyboards/handwired/erikpeyronson/erkbd/readme.md b/keyboards/handwired/erikpeyronson/erkbd/readme.md new file mode 100644 index 0000000000..3f4fe0175e --- /dev/null +++ b/keyboards/handwired/erikpeyronson/erkbd/readme.md @@ -0,0 +1,28 @@ +# handwired/erikpeyronson/erkbd + +![Erkbd](https://i.imgur.com/VViiXIN.jpeg) + +3D printed, handwired 44 key split keyboard featuring two encoders, two 1.3" 128x64 oled displays using the waveshare rp2040zero development board. + +* Keyboard Maintainer: [Erik Peyronson](https://github.com/erikpeyronson) +* Hardware Supported: See keyboard repository on [github](https://github.com/erikpeyronson/erkbd) +* Hardware Availability: See keyboard repository on [github](https://github.com/erikpeyronson/erkbd) + +Make example for this keyboard (after setting up your build environment): + + make handwired/erikpeyronson/erkbd:default + +Flashing example for this keyboard: + + Enter bootloader, drag and drop .uft2 file on the removable storage + +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**: For left half hold down the key at (0,0) in the matrix (correspons with the tab key) and plug in the keyboard. +For left half half the key is (4,5) (corresponds with the backspace key) +* **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 +Enter the bootloader in 3 ways: From ce9713c47d840380d5647335a9cb819d373139e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=E1=BA=AFn?= <59417802+MaiTheSan@users.noreply.github.com> Date: Fri, 28 Mar 2025 15:27:36 +0700 Subject: [PATCH 254/592] Add support for Starry FRL (#24626) Co-authored-by: jack Co-authored-by: Drashna Jaelre Co-authored-by: Ryan --- keyboards/salane/starryfrl/config.h | 17 +++ keyboards/salane/starryfrl/keyboard.json | 143 ++++++++++++++++++ .../salane/starryfrl/keymaps/default/keymap.c | 46 ++++++ .../salane/starryfrl/keymaps/default/rules.mk | 1 + keyboards/salane/starryfrl/readme.md | 29 ++++ 5 files changed, 236 insertions(+) create mode 100644 keyboards/salane/starryfrl/config.h create mode 100644 keyboards/salane/starryfrl/keyboard.json create mode 100644 keyboards/salane/starryfrl/keymaps/default/keymap.c create mode 100644 keyboards/salane/starryfrl/keymaps/default/rules.mk create mode 100644 keyboards/salane/starryfrl/readme.md diff --git a/keyboards/salane/starryfrl/config.h b/keyboards/salane/starryfrl/config.h new file mode 100644 index 0000000000..cc6fb298f4 --- /dev/null +++ b/keyboards/salane/starryfrl/config.h @@ -0,0 +1,17 @@ +/* +Copyright 2024 Salane +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 RP2040_FLASH_GENERIC_03H diff --git a/keyboards/salane/starryfrl/keyboard.json b/keyboards/salane/starryfrl/keyboard.json new file mode 100644 index 0000000000..43e434cb02 --- /dev/null +++ b/keyboards/salane/starryfrl/keyboard.json @@ -0,0 +1,143 @@ +{ + "keyboard_name": "Starry FRL", + "manufacturer": "Salane", + "url": "", + "maintainer": "Mai The San", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0x534C", + "pid": "0x0A01", + "device_version": "0.0.1" + }, + "matrix_pins": { + "rows": ["GP25", "GP0", "GP18", "GP23", "GP24"], + "cols": ["GP27", "GP26", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP22", "GP21", "GP20"] + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "console": false, + "command": false, + "nkro": false, + "rgblight": true, + "encoder": true + }, + "encoder": { + "rotary": [ + {"pin_a": "GP29", "pin_b": "GP28"} + ] + }, + "rgblight": { + "led_count": 2, + "saturation_steps": 8, + "brightness_steps": 8, + "sleep": true, + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + } + }, + "ws2812": { + "pin": "GP19", + "driver": "vendor" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "K00", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "K01", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "K02", "matrix": [0, 2], "x": 2.25, "y": 0}, + {"label": "K03", "matrix": [0, 3], "x": 3.25, "y": 0}, + {"label": "K04", "matrix": [0, 4], "x": 4.25, "y": 0}, + {"label": "K05", "matrix": [0, 5], "x": 5.25, "y": 0}, + {"label": "K06", "matrix": [0, 6], "x": 6.25, "y": 0}, + {"label": "K07", "matrix": [0, 7], "x": 7.25, "y": 0}, + {"label": "K08", "matrix": [0, 8], "x": 8.25, "y": 0}, + {"label": "K09", "matrix": [0, 9], "x": 9.25, "y": 0}, + {"label": "K0A", "matrix": [0, 10], "x": 10.25, "y": 0}, + {"label": "K0B", "matrix": [0, 11], "x": 11.25, "y": 0}, + {"label": "K0C", "matrix": [0, 12], "x": 12.25, "y": 0}, + {"label": "K0D", "matrix": [0, 13], "x": 13.25, "y": 0}, + {"label": "K0E", "matrix": [0, 14], "x": 14.25, "y": 0}, + {"label": "K0F", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "K2F", "matrix": [2, 15], "x": 16.25, "y": 0}, + {"label": "K0G", "matrix": [0, 16], "x": 17.5, "y": 0}, + {"label": "K0H", "matrix": [0, 17], "x": 18.5, "y": 0}, + {"label": "K0I", "matrix": [0, 18], "x": 19.5, "y": 0}, + {"label": "K12", "matrix": [1, 2], "x": 2.25, "y": 1, "w": 1.5}, + {"label": "K13", "matrix": [1, 3], "x": 3.75, "y": 1}, + {"label": "K14", "matrix": [1, 4], "x": 4.75, "y": 1}, + {"label": "K15", "matrix": [1, 5], "x": 5.75, "y": 1}, + {"label": "K16", "matrix": [1, 6], "x": 6.75, "y": 1}, + {"label": "K17", "matrix": [1, 7], "x": 7.75, "y": 1}, + {"label": "K18", "matrix": [1, 8], "x": 8.75, "y": 1}, + {"label": "K19", "matrix": [1, 9], "x": 9.75, "y": 1}, + {"label": "K1A", "matrix": [1, 10], "x": 10.75, "y": 1}, + {"label": "K1B", "matrix": [1, 11], "x": 11.75, "y": 1}, + {"label": "K1C", "matrix": [1, 12], "x": 12.75, "y": 1}, + {"label": "K1D", "matrix": [1, 13], "x": 13.75, "y": 1}, + {"label": "K1E", "matrix": [1, 14], "x": 14.75, "y": 1}, + {"label": "K1F", "matrix": [1, 15], "x": 15.75, "y": 1, "w": 1.5}, + {"label": "K1G", "matrix": [1, 16], "x": 17.5, "y": 1}, + {"label": "K1H", "matrix": [1, 17], "x": 18.5, "y": 1}, + {"label": "K1I", "matrix": [1, 18], "x": 19.5, "y": 1}, + {"label": "K21", "matrix": [2, 1], "x": 0.25, "y": 1.25, "w": 1.5, "h": 1.5}, + {"label": "K22", "matrix": [2, 2], "x": 2.25, "y": 2, "w": 1.75}, + {"label": "K23", "matrix": [2, 3], "x": 4, "y": 2}, + {"label": "K24", "matrix": [2, 4], "x": 5, "y": 2}, + {"label": "K25", "matrix": [2, 5], "x": 6, "y": 2}, + {"label": "K26", "matrix": [2, 6], "x": 7, "y": 2}, + {"label": "K27", "matrix": [2, 7], "x": 8, "y": 2}, + {"label": "K28", "matrix": [2, 8], "x": 9, "y": 2}, + {"label": "K29", "matrix": [2, 9], "x": 10, "y": 2}, + {"label": "K2A", "matrix": [2, 10], "x": 11, "y": 2}, + {"label": "K2B", "matrix": [2, 11], "x": 12, "y": 2}, + {"label": "K2C", "matrix": [2, 12], "x": 13, "y": 2}, + {"label": "K2D", "matrix": [2, 13], "x": 14, "y": 2}, + {"label": "K2E", "matrix": [2, 14], "x": 15, "y": 2, "w": 2.25}, + {"label": "K30", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "K31", "matrix": [3, 1], "x": 1, "y": 3}, + {"label": "K32", "matrix": [3, 2], "x": 2.25, "y": 3, "w": 1.25}, + {"label": "K33", "matrix": [3, 3], "x": 3.5, "y": 3}, + {"label": "K34", "matrix": [3, 4], "x": 4.5, "y": 3}, + {"label": "K35", "matrix": [3, 5], "x": 5.5, "y": 3}, + {"label": "K36", "matrix": [3, 6], "x": 6.5, "y": 3}, + {"label": "K37", "matrix": [3, 7], "x": 7.5, "y": 3}, + {"label": "K38", "matrix": [3, 8], "x": 8.5, "y": 3}, + {"label": "K39", "matrix": [3, 9], "x": 9.5, "y": 3}, + {"label": "K3A", "matrix": [3, 10], "x": 10.5, "y": 3}, + {"label": "K3B", "matrix": [3, 11], "x": 11.5, "y": 3}, + {"label": "K3C", "matrix": [3, 12], "x": 12.5, "y": 3}, + {"label": "K3D", "matrix": [3, 13], "x": 13.5, "y": 3}, + {"label": "K3E", "matrix": [3, 14], "x": 14.5, "y": 3, "w": 1.75}, + {"label": "K3F", "matrix": [3, 15], "x": 16.25, "y": 3}, + {"label": "K3H", "matrix": [3, 17], "x": 18.5, "y": 3}, + {"label": "K40", "matrix": [4, 0], "x": 0, "y": 4}, + {"label": "K41", "matrix": [4, 1], "x": 1, "y": 4}, + {"label": "K42", "matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.5}, + {"label": "K43", "matrix": [4, 3], "x": 3.75, "y": 4}, + {"label": "K44", "matrix": [4, 4], "x": 4.75, "y": 4, "w": 1.5}, + {"label": "K47", "matrix": [4, 7], "x": 6.25, "y": 4, "w": 3}, + {"label": "K49", "matrix": [4, 9], "x": 9.25, "y": 4}, + {"label": "K4B", "matrix": [4, 11], "x": 10.25, "y": 4, "w": 2}, + {"label": "K4C", "matrix": [4, 12], "x": 12.25, "y": 4}, + {"label": "K4D", "matrix": [4, 13], "x": 13.25, "y": 4, "w": 1.5}, + {"label": "K4E", "matrix": [4, 14], "x": 14.75, "y": 4}, + {"label": "K4F", "matrix": [4, 15], "x": 15.75, "y": 4, "w": 1.5}, + {"label": "K4G", "matrix": [4, 16], "x": 17.5, "y": 4}, + {"label": "K4H", "matrix": [4, 17], "x": 18.5, "y": 4}, + {"label": "K4I", "matrix": [4, 18], "x": 19.5, "y": 4} + ] + } + } +} diff --git a/keyboards/salane/starryfrl/keymaps/default/keymap.c b/keyboards/salane/starryfrl/keymaps/default/keymap.c new file mode 100644 index 0000000000..5b3235afe5 --- /dev/null +++ b/keyboards/salane/starryfrl/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2023 SawnsProjects + * + * 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 + +enum { + _BASE, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_F1, KC_F2, 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_DEL, KC_END, KC_PGDN, + KC_MUTE, 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_F3, KC_F4, KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(_FN), KC_UP, + KC_F5, KC_F6, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [_FN] = LAYOUT( + KC_F7, KC_F8, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_PREV, UG_TOGG, UG_NEXT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F9, KC_F10, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP) }, + [_FN] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } +}; +#endif // ENCODER_MAP_ENABLE diff --git a/keyboards/salane/starryfrl/keymaps/default/rules.mk b/keyboards/salane/starryfrl/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/salane/starryfrl/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/salane/starryfrl/readme.md b/keyboards/salane/starryfrl/readme.md new file mode 100644 index 0000000000..da2920797d --- /dev/null +++ b/keyboards/salane/starryfrl/readme.md @@ -0,0 +1,29 @@ +# Starry FRL + +![Starry FRL](https://i.imgur.com/eRYlEe7.jpeg) + + This firmware support for both Solder and Hotswap PCB of Starry FRL + + **Firmware files are SPECIFIC to each board. Firmware files from one, will not work on the other.** Please use the `uf2` appropriate for your board. + +* Keyboard Maintainer: [Mai The San](https://github.com/MaiTheSan) +* Hardware Supported: Starry FRL +* Hardware Availability: [Waifu.works Discord](https://discord.gg/waifuworks) + +Make examples for this keyboard (after setting up your build environment): + + make salane/starryfrl:default + +Flashing example for this keyboard: + + make salane/starryfrl:default:flash + +## 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**: Press the key `BOOT` in the back of PCB and plug in keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available + +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). \ No newline at end of file From d4120b1def0734e060a341cbe2789168ab078814 Mon Sep 17 00:00:00 2001 From: Hyphen-ated Date: Fri, 28 Mar 2025 01:27:54 -0700 Subject: [PATCH 255/592] Add "Large Lad" keyboard (#24727) Co-authored-by: jack --- keyboards/large_lad/keyboard.json | 188 +++++++++++++++++++ keyboards/large_lad/keymaps/default/keymap.c | 42 +++++ keyboards/large_lad/keymaps/default/rules.mk | 1 + keyboards/large_lad/readme.md | 23 +++ 4 files changed, 254 insertions(+) create mode 100644 keyboards/large_lad/keyboard.json create mode 100644 keyboards/large_lad/keymaps/default/keymap.c create mode 100644 keyboards/large_lad/keymaps/default/rules.mk create mode 100644 keyboards/large_lad/readme.md diff --git a/keyboards/large_lad/keyboard.json b/keyboards/large_lad/keyboard.json new file mode 100644 index 0000000000..665a279799 --- /dev/null +++ b/keyboards/large_lad/keyboard.json @@ -0,0 +1,188 @@ +{ + "manufacturer": "DIY (open source)", + "keyboard_name": "Large Lad", + "maintainer": "Hyphen-ated", + "bootmagic": { + "matrix": [11, 12] + }, + "development_board": "blackpill_f411", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "B7", "pin_b": "A0"} + ] + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "encoder": true + }, + "matrix_pins": { + "cols": ["A2", "A1", "C13", "C14", "C15", "A5", "A6", "B0", "B3", "B8", "A15", "A8", "B15"], + "rows": ["B5", "B6", "B4", "B9", "A4", "A3", "A7", "B1", "B10", "B12", "B13", "B14"] + }, + "url": "https://github.com/Hyphen-ated/large-lad-keyboard", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "L1", "matrix": [11, 12], "x": 0, "y": 0}, + {"label": "L2", "matrix": [11, 11], "x": 1, "y": 0}, + {"label": "L3", "matrix": [11, 6], "x": 2, "y": 0}, + {"label": "F13", "matrix": [11, 5], "x": 5.25, "y": 0}, + {"label": "F14", "matrix": [11, 4], "x": 6.25, "y": 0}, + {"label": "F15", "matrix": [11, 3], "x": 7.25, "y": 0}, + {"label": "F16", "matrix": [11, 2], "x": 8.25, "y": 0}, + {"label": "F17", "matrix": [11, 1], "x": 9.75, "y": 0}, + {"label": "F18", "matrix": [11, 0], "x": 10.75, "y": 0}, + {"label": "F19", "matrix": [0, 12], "x": 11.75, "y": 0}, + {"label": "F20", "matrix": [0, 11], "x": 12.75, "y": 0}, + {"label": "F21", "matrix": [0, 10], "x": 14.25, "y": 0}, + {"label": "F22", "matrix": [0, 9], "x": 15.25, "y": 0}, + {"label": "F23", "matrix": [0, 8], "x": 16.25, "y": 0}, + {"label": "F24", "matrix": [0, 7], "x": 17.25, "y": 0}, + {"label": "R1", "matrix": [0, 6], "x": 18.5, "y": 0}, + {"label": "R2", "matrix": [0, 5], "x": 19.5, "y": 0}, + {"label": "R3", "matrix": [0, 4], "x": 20.5, "y": 0}, + {"label": "R4", "matrix": [0, 3], "x": 21.75, "y": 0}, + {"label": "R5", "matrix": [0, 2], "x": 22.75, "y": 0}, + {"label": "R6", "matrix": [0, 1], "x": 23.75, "y": 0}, + {"label": "R7", "matrix": [0, 0], "x": 24.75, "y": 0}, + {"label": "L4", "matrix": [11, 7], "x": 0, "y": 1}, + {"label": "L5", "matrix": [10, 12], "x": 1, "y": 1}, + {"label": "L6", "matrix": [10, 11], "x": 2, "y": 1}, + {"label": "Esc", "matrix": [10, 6], "x": 3.25, "y": 1}, + {"label": "F1", "matrix": [10, 5], "x": 5.25, "y": 1}, + {"label": "F2", "matrix": [10, 4], "x": 6.25, "y": 1}, + {"label": "F3", "matrix": [10, 3], "x": 7.25, "y": 1}, + {"label": "F4", "matrix": [10, 2], "x": 8.25, "y": 1}, + {"label": "F5", "matrix": [10, 1], "x": 9.75, "y": 1}, + {"label": "F6", "matrix": [10, 0], "x": 10.75, "y": 1}, + {"label": "F7", "matrix": [1, 12], "x": 11.75, "y": 1}, + {"label": "F8", "matrix": [1, 11], "x": 12.75, "y": 1}, + {"label": "F9", "matrix": [1, 10], "x": 14.25, "y": 1}, + {"label": "F10", "matrix": [1, 9], "x": 15.25, "y": 1}, + {"label": "F11", "matrix": [1, 8], "x": 16.25, "y": 1}, + {"label": "F12", "matrix": [1, 7], "x": 17.25, "y": 1}, + {"label": "PrtSc", "matrix": [1, 6], "x": 18.5, "y": 1}, + {"label": "Scroll Lock", "matrix": [1, 5], "x": 19.5, "y": 1}, + {"label": "Pause", "matrix": [1, 4], "x": 20.5, "y": 1}, + {"label": "R8", "matrix": [1, 3], "x": 21.75, "y": 1}, + {"label": "R9", "matrix": [1, 2], "x": 22.75, "y": 1}, + {"label": "R10", "matrix": [1, 1], "x": 23.75, "y": 1}, + {"label": "R11", "matrix": [1, 0], "x": 24.75, "y": 1}, + {"label": "L7", "matrix": [11, 8], "x": 0, "y": 2.25}, + {"label": "L8", "matrix": [10, 7], "x": 1, "y": 2.25}, + {"label": "L9", "matrix": [9, 12], "x": 2, "y": 2.25}, + {"label": "~", "matrix": [9, 11], "x": 3.25, "y": 2.5}, + {"label": "!", "matrix": [9, 6], "x": 4.25, "y": 2.5}, + {"label": "@", "matrix": [9, 5], "x": 5.25, "y": 2.5}, + {"label": "#", "matrix": [9, 4], "x": 6.25, "y": 2.5}, + {"label": "$", "matrix": [9, 3], "x": 7.25, "y": 2.5}, + {"label": "%", "matrix": [9, 2], "x": 8.25, "y": 2.5}, + {"label": "^", "matrix": [9, 1], "x": 9.25, "y": 2.5}, + {"label": "&", "matrix": [9, 0], "x": 10.25, "y": 2.5}, + {"label": "*", "matrix": [2, 12], "x": 11.25, "y": 2.5}, + {"label": "(", "matrix": [2, 11], "x": 12.25, "y": 2.5}, + {"label": ")", "matrix": [2, 10], "x": 13.25, "y": 2.5}, + {"label": "_", "matrix": [2, 9], "x": 14.25, "y": 2.5}, + {"label": "+", "matrix": [2, 8], "x": 15.25, "y": 2.5}, + {"label": "Backspace", "matrix": [2, 7], "x": 16.25, "y": 2.5, "w": 2}, + {"label": "Insert", "matrix": [2, 6], "x": 18.5, "y": 2.5}, + {"label": "Home", "matrix": [2, 5], "x": 19.5, "y": 2.5}, + {"label": "PgUp", "matrix": [2, 4], "x": 20.5, "y": 2.5}, + {"label": "Num Lock", "matrix": [2, 3], "x": 21.75, "y": 2.5}, + {"label": "/", "matrix": [2, 2], "x": 22.75, "y": 2.5}, + {"label": "*", "matrix": [2, 1], "x": 23.75, "y": 2.5}, + {"label": "-", "matrix": [2, 0], "x": 24.75, "y": 2.5}, + {"label": "L10", "matrix": [10, 8], "x": 0, "y": 3.25}, + {"label": "L11", "matrix": [9, 7], "x": 1, "y": 3.25}, + {"label": "L12", "matrix": [8, 12], "x": 2, "y": 3.25}, + {"label": "Tab", "matrix": [8, 11], "x": 3.25, "y": 3.5, "w": 1.5}, + {"label": "Q", "matrix": [8, 6], "x": 4.75, "y": 3.5}, + {"label": "W", "matrix": [8, 5], "x": 5.75, "y": 3.5}, + {"label": "E", "matrix": [8, 4], "x": 6.75, "y": 3.5}, + {"label": "R", "matrix": [8, 3], "x": 7.75, "y": 3.5}, + {"label": "T", "matrix": [8, 2], "x": 8.75, "y": 3.5}, + {"label": "Y", "matrix": [8, 1], "x": 9.75, "y": 3.5}, + {"label": "U", "matrix": [8, 0], "x": 10.75, "y": 3.5}, + {"label": "I", "matrix": [3, 12], "x": 11.75, "y": 3.5}, + {"label": "O", "matrix": [3, 11], "x": 12.75, "y": 3.5}, + {"label": "P", "matrix": [3, 10], "x": 13.75, "y": 3.5}, + {"label": "{", "matrix": [3, 9], "x": 14.75, "y": 3.5}, + {"label": "}", "matrix": [3, 8], "x": 15.75, "y": 3.5}, + {"label": "|", "matrix": [3, 7], "x": 16.75, "y": 3.5, "w": 1.5}, + {"label": "Delete", "matrix": [3, 6], "x": 18.5, "y": 3.5}, + {"label": "End", "matrix": [3, 5], "x": 19.5, "y": 3.5}, + {"label": "PgDn", "matrix": [3, 4], "x": 20.5, "y": 3.5}, + {"label": "7", "matrix": [3, 3], "x": 21.75, "y": 3.5}, + {"label": "8", "matrix": [3, 2], "x": 22.75, "y": 3.5}, + {"label": "9", "matrix": [3, 1], "x": 23.75, "y": 3.5}, + {"label": "+", "matrix": [3, 0], "x": 24.75, "y": 3.5, "h": 2}, + {"label": "L13", "matrix": [9, 8], "x": 0, "y": 4.25}, + {"label": "L14", "matrix": [8, 7], "x": 1, "y": 4.25}, + {"label": "L15", "matrix": [7, 12], "x": 2, "y": 4.25}, + {"label": "Caps Lock", "matrix": [7, 6], "x": 3.25, "y": 4.5, "w": 1.75}, + {"label": "A", "matrix": [7, 5], "x": 5, "y": 4.5}, + {"label": "S", "matrix": [7, 4], "x": 6, "y": 4.5}, + {"label": "D", "matrix": [7, 3], "x": 7, "y": 4.5}, + {"label": "F", "matrix": [7, 2], "x": 8, "y": 4.5}, + {"label": "G", "matrix": [7, 1], "x": 9, "y": 4.5}, + {"label": "H", "matrix": [7, 0], "x": 10, "y": 4.5}, + {"label": "J", "matrix": [4, 12], "x": 11, "y": 4.5}, + {"label": "K", "matrix": [4, 11], "x": 12, "y": 4.5}, + {"label": "L", "matrix": [4, 10], "x": 13, "y": 4.5}, + {"label": ":", "matrix": [4, 9], "x": 14, "y": 4.5}, + {"label": "\"", "matrix": [4, 8], "x": 15, "y": 4.5}, + {"label": "Enter", "matrix": [4, 7], "x": 16, "y": 4.5, "w": 2.25}, + {"label": "4", "matrix": [4, 3], "x": 21.75, "y": 4.5}, + {"label": "5", "matrix": [4, 2], "x": 22.75, "y": 4.5}, + {"label": "6", "matrix": [4, 1], "x": 23.75, "y": 4.5}, + {"label": "L16", "matrix": [8, 8], "x": 0, "y": 5.5}, + {"label": "L17", "matrix": [7, 7], "x": 1, "y": 5.5}, + {"label": "L18", "matrix": [6, 12], "x": 2, "y": 5.5}, + {"label": "Shift", "matrix": [7, 11], "x": 3.25, "y": 5.5, "w": 2.25}, + {"label": "Z", "matrix": [6, 5], "x": 5.5, "y": 5.5}, + {"label": "X", "matrix": [6, 3], "x": 6.5, "y": 5.5}, + {"label": "C", "matrix": [6, 2], "x": 7.5, "y": 5.5}, + {"label": "V", "matrix": [6, 1], "x": 8.5, "y": 5.5}, + {"label": "B", "matrix": [6, 0], "x": 9.5, "y": 5.5}, + {"label": "N", "matrix": [5, 12], "x": 10.5, "y": 5.5}, + {"label": "M", "matrix": [5, 11], "x": 11.5, "y": 5.5}, + {"label": "<", "matrix": [5, 10], "x": 12.5, "y": 5.5}, + {"label": ">", "matrix": [5, 9], "x": 13.5, "y": 5.5}, + {"label": "?", "matrix": [5, 8], "x": 14.5, "y": 5.5}, + {"label": "Shift", "matrix": [5, 7], "x": 15.5, "y": 5.5, "w": 2.75}, + {"label": "Up", "matrix": [4, 5], "x": 19.5, "y": 5.5}, + {"label": "1", "matrix": [5, 3], "x": 21.75, "y": 5.5}, + {"label": "2", "matrix": [5, 2], "x": 22.75, "y": 5.5}, + {"label": "3", "matrix": [5, 1], "x": 23.75, "y": 5.5}, + {"label": "Enter", "matrix": [4, 0], "x": 24.75, "y": 5.5, "h": 2}, + {"label": "L19", "matrix": [7, 8], "x": 0, "y": 6.5}, + {"label": "L20", "matrix": [8, 9], "x": 1, "y": 6.5}, + {"label": "L21", "matrix": [7, 9], "x": 2, "y": 6.5}, + {"label": "Ctrl", "matrix": [6, 11], "x": 3.25, "y": 6.5, "w": 1.25}, + {"label": "Win", "matrix": [6, 6], "x": 4.5, "y": 6.5, "w": 1.25}, + {"label": "Alt", "matrix": [6, 4], "x": 5.75, "y": 6.5, "w": 1.25}, + {"label": "Space", "matrix": [6, 10], "x": 7, "y": 6.5, "w": 6.25}, + {"label": "Alt", "matrix": [6, 9], "x": 13.25, "y": 6.5, "w": 1.25}, + {"label": "Win", "matrix": [6, 8], "x": 14.5, "y": 6.5, "w": 1.25}, + {"label": "Menu", "matrix": [6, 7], "x": 15.75, "y": 6.5, "w": 1.25}, + {"label": "Ctrl", "matrix": [5, 6], "x": 17, "y": 6.5, "w": 1.25}, + {"label": "Left", "matrix": [4, 6], "x": 18.5, "y": 6.5}, + {"label": "Down", "matrix": [5, 5], "x": 19.5, "y": 6.5}, + {"label": "Right", "matrix": [4, 4], "x": 20.5, "y": 6.5}, + {"label": "0", "matrix": [5, 4], "x": 21.75, "y": 6.5, "w": 2}, + {"label": ".", "matrix": [5, 0], "x": 23.75, "y": 6.5} + ] + } + } +} diff --git a/keyboards/large_lad/keymaps/default/keymap.c b/keyboards/large_lad/keymaps/default/keymap.c new file mode 100644 index 0000000000..68c368360f --- /dev/null +++ b/keyboards/large_lad/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +// Copyright 2024 Hyphen-ated (@Hyphen-ated) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ + * │ │ │ │ │F13│F14│F15│F16│ │F17│F18│F19│F20│ │F21│F22│F23│F24│ │ │ │ │ │ │ │ │ │ + * ├───┼───┼───┤ ┌───┐ ├───┼───┼───┤───┤ ├───┼───┼───┤───┤ ├───┼───┼───┤───┤ ├───┼───┼───┤ ├───┼───┼───┤───┤ + * │ │ │ │ │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│ │ │ │ │ │ + * └───┴───┴───┘ └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └───┴───┴───┴───┘ + * ┌───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ + * │ │ │ │ │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │ + * ├───┼───┼───┤ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤ + * │ │ │ │ │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │ + * ├───┼───┼───┤ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │ + * │ │ │ │ │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ │ 4 │ 5 │ 6 │ │ + * ├───┼───┼───┤ ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤ + * │ │ │ │ │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │ + * ├───┼───┼───┤ ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│ + * │ │ │ │ │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │ + * └───┴───┴───┘ └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ + */ + [0] = LAYOUT( + KC_NO,KC_NO,KC_NO, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO,KC_NO,KC_NO, 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_PSCR, KC_SCRL, KC_PAUS, KC_NO, KC_NO, KC_NO, KC_NO, + + KC_NO,KC_NO,KC_NO, 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_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO,KC_NO,KC_NO, 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_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO,KC_NO,KC_NO, 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_NO,KC_NO,KC_NO, 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_NO,KC_NO,KC_NO, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT + ) +}; + +// encoder controls volume by default +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } +}; +#endif diff --git a/keyboards/large_lad/keymaps/default/rules.mk b/keyboards/large_lad/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/large_lad/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/large_lad/readme.md b/keyboards/large_lad/readme.md new file mode 100644 index 0000000000..ac9f5a0646 --- /dev/null +++ b/keyboards/large_lad/readme.md @@ -0,0 +1,23 @@ +# large_lad + +![large_lad](https://i.imgur.com/CQWAD2X.jpg) + +Starts with the standard US 104 key layout and adds more keys on top and on the left. Total of 148 keys, one of which is a rotary encoder. Includes two rows of function keys and a 3x7 grid of keys on the left. No LEDs. + +* Keyboard Maintainer: [Hyphen-ated](https://github.com/Hyphen-ated) +* Hardware Supported: Custom open source PCB. +* Hardware Availability: DIY. PCB and plate design files available at https://github.com/Hyphen-ated/large-lad-keyboard + +Make example for this keyboard (after setting up your build environment): + + make large_lad:default + +Flashing example for this keyboard: + + make large_lad: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 + +To enter the bootloader, there's two buttons to press on the blackpill board. Press and hold BOOT, press and release NRST, then release BOOT. Sometimes this randomly fails and you have to try again. From 6f3b494a4d8a28696743e977f677e6a247dbe392 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:56:08 +0000 Subject: [PATCH 256/592] Bump vite from 5.4.12 to 5.4.15 in /builddefs/docsgen (#25065) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.12 to 5.4.15. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.15/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.15/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index 21f56d7ddf..a798207d77 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.4.12", + "vite": "^5.4.15", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index 0b36eec07c..eda99772c4 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -766,10 +766,10 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.9, vite@^5.4.12: - version "5.4.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.12.tgz#627d12ff06de3942557dfe8632fd712a12a072c7" - integrity sha512-KwUaKB27TvWwDJr1GjjWthLMATbGEbeWYZIbGZ5qFIsgPP3vWzLu4cVooqhm5/Z2SPDUMjyPVjTztm5tYKwQxA== +vite@^5.2.9, vite@^5.4.15: + version "5.4.15" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.15.tgz#2941547f10ebb4bf9b0fa0da863c06711eb7e5e5" + integrity sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From 25fb4a498a4b6e8436e528edd502bda46fd2c464 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Fri, 28 Mar 2025 10:19:07 +0100 Subject: [PATCH 257/592] Allow AnnePro2 to reboot (#24886) Without this, the QK_REBOOT key did nothing. --- keyboards/annepro2/annepro2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/keyboards/annepro2/annepro2.c b/keyboards/annepro2/annepro2.c index f536690de3..9e72dbf6fb 100644 --- a/keyboards/annepro2/annepro2.c +++ b/keyboards/annepro2/annepro2.c @@ -48,6 +48,11 @@ ble_capslock_t ble_capslock = {._dummy = {0}, .caps_lock = false}; static uint8_t led_enabled = 1; #endif +void mcu_reset(void) { + __disable_irq(); + NVIC_SystemReset(); +} + void bootloader_jump(void) { // Send msg to shine to boot into IAP ap2_set_IAP(); From 5a6595357d110636dddc9a8f0455f5db55d4e2a7 Mon Sep 17 00:00:00 2001 From: lsh4711 <120231876+lsh4711@users.noreply.github.com> Date: Fri, 28 Mar 2025 19:03:59 +0900 Subject: [PATCH 258/592] Fix path typo related RP2040 (#25069) Fix path typo --- platforms/chibios/vendors/RP/RP2040.mk | 2 +- quantum/bits.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/chibios/vendors/RP/RP2040.mk b/platforms/chibios/vendors/RP/RP2040.mk index 94f023d72b..27d1fa4472 100644 --- a/platforms/chibios/vendors/RP/RP2040.mk +++ b/platforms/chibios/vendors/RP/RP2040.mk @@ -78,7 +78,7 @@ PICOSDKINTRINSICSSRC = $(PICOSDKROOT)/src/rp2_common/pico_divider/divider.S \ $(PICOSDKROOT)/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S PICOSDKINTRINSICSINC = $(PICOSDKROOT)/src/common/pico_base/include \ - $(PICOSDKROOT)/src/rp2_common/pico_platfrom/include \ + $(PICOSDKROOT)/src/rp2_common/pico_platform/include \ $(PICOSDKROOT)/src/rp2_common/hardware_divider/include # integer division intrinsics utilizing the RP2040 hardware divider diff --git a/quantum/bits.h b/quantum/bits.h index 2f3c343762..41f11e7b9c 100644 --- a/quantum/bits.h +++ b/quantum/bits.h @@ -4,7 +4,7 @@ #include -/* Remove these once we transitioned to C23 across all platfroms */ +/* Remove these once we transitioned to C23 across all platforms */ #define UINT32_WIDTH 32 #define UINT64_WIDTH 64 From 94a9099c3843a04dc0eb54f8009dff5b4422e430 Mon Sep 17 00:00:00 2001 From: Ben Green Date: Fri, 28 Mar 2025 13:38:24 +0000 Subject: [PATCH 259/592] Update onekey example for nucleo f446re (#25067) * use accessible pins for nucleo f446re onekey example * remove pin collision with matrix in keyboard.json * use accessible pins for LED * remove pin collision with matrix * Update readme.md to reflect pin changes --- keyboards/handwired/onekey/nucleo_f446re/config.h | 2 +- keyboards/handwired/onekey/nucleo_f446re/keyboard.json | 6 +++--- keyboards/handwired/onekey/nucleo_f446re/readme.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/handwired/onekey/nucleo_f446re/config.h b/keyboards/handwired/onekey/nucleo_f446re/config.h index 4401623e85..cebb609117 100644 --- a/keyboards/handwired/onekey/nucleo_f446re/config.h +++ b/keyboards/handwired/onekey/nucleo_f446re/config.h @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define ADC_PIN A0 +#define ADC_PIN A5 #define SOLENOID_PINS { B12, B13, B14, B15 } #define SOLENOID_PINS_ACTIVE_STATE { high, high, low } diff --git a/keyboards/handwired/onekey/nucleo_f446re/keyboard.json b/keyboards/handwired/onekey/nucleo_f446re/keyboard.json index 26de66e198..7c51ca053b 100644 --- a/keyboards/handwired/onekey/nucleo_f446re/keyboard.json +++ b/keyboards/handwired/onekey/nucleo_f446re/keyboard.json @@ -3,17 +3,17 @@ "processor": "STM32F446", "bootloader": "stm32-dfu", "matrix_pins": { - "cols": ["A2"], + "cols": ["A0"], "rows": ["A1"] }, "backlight": { "pin": "B8" }, "ws2812": { - "pin": "A0" + "pin": "A4" }, "apa102": { - "data_pin": "A0", + "data_pin": "A4", "clock_pin": "B13" } } diff --git a/keyboards/handwired/onekey/nucleo_f446re/readme.md b/keyboards/handwired/onekey/nucleo_f446re/readme.md index c7d13cb973..b0645b65fe 100644 --- a/keyboards/handwired/onekey/nucleo_f446re/readme.md +++ b/keyboards/handwired/onekey/nucleo_f446re/readme.md @@ -1,5 +1,5 @@ # STM32 Nucleo-L432 onekey -To trigger keypress, short together pins *A1* and *A2*. +To trigger keypress, short together pins *A0* and *A1*. Note that the pin numbering is relative to the MCU, so that A0 and A1 refer to PA0 and PA1 on the MCU (which are also labelled A0 and A1 on the board, but this isn't true for the other PAx pins). You'll also need to connect `VIN`, `GND`, USB `D+` to `PA12`/`D2`, and USB `D-` to `PA11`/`D10`. From d0cfb938ef58d6b8d2089f00f6160d2105791a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Sat, 29 Mar 2025 10:47:26 +0800 Subject: [PATCH 260/592] Module documentation typo correction (#25073) --- docs/features/community_modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md index 3a1a82e7bc..a28c5afaeb 100644 --- a/docs/features/community_modules.md +++ b/docs/features/community_modules.md @@ -40,7 +40,7 @@ cd /path/to/your/external/userspace mkdir -p modules # Replace the following {user} and {repo} with the author's community module repository git submodule add https://github.com/{user}/{repo}.git modules/{user} -git submdule update --init --recursive +git submodule update --init --recursive ``` This will ensure the copy of the module is made in your userspace. From 49d13595f64577bc50c08b460538d35055befdf8 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 30 Mar 2025 00:19:38 +1100 Subject: [PATCH 261/592] Fix lockups on AVR with `qmk/hello_world` module (#25074) Fix lockups on AVR. --- modules/qmk/hello_world/hello_world.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qmk/hello_world/hello_world.c b/modules/qmk/hello_world/hello_world.c index d9dd366100..dcabfc60ea 100644 --- a/modules/qmk/hello_world/hello_world.c +++ b/modules/qmk/hello_world/hello_world.c @@ -7,7 +7,7 @@ ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(1, 0, 0); uint32_t delayed_hello_world(uint32_t trigger_time, void *cb_arg) { - printf("Hello, world! I'm a QMK based keyboard! The keymap array size is %d bytes.\n", (int)hello_world_introspection().total_size); + dprintf("Hello, world! I'm a QMK based keyboard! The keymap array size is %d bytes.\n", (int)hello_world_introspection().total_size); return 0; } From bc42a7ea8980c1d135ac6f2d2ec194e3e7355bfe Mon Sep 17 00:00:00 2001 From: henrikosorensen Date: Sun, 30 Mar 2025 01:17:38 +0100 Subject: [PATCH 262/592] At101ish (#25072) * Dell AT101 replacement pcb support * Update keyboards/at101ish/readme.md Co-Authored-By: fauxpark * remove empty src clause in makefile * feature: Update at101ish to qmk v0.28 * feature: Add osdetecting keymap variant. * refactor: Move at101ish keyboard to handwired folder. * fix: Adjust at101ish readme- * fix: review changes. * chore: Remove unneeded feature. --------- Co-authored-by: fauxpark --- keyboards/handwired/at101ish/keyboard.json | 363 ++++++++++++++++++ .../at101ish/keymaps/default/keymap.c | 27 ++ .../at101ish/keymaps/osdetect/keymap.c | 59 +++ .../at101ish/keymaps/osdetect/rules.mk | 1 + keyboards/handwired/at101ish/readme.md | 25 ++ 5 files changed, 475 insertions(+) create mode 100644 keyboards/handwired/at101ish/keyboard.json create mode 100644 keyboards/handwired/at101ish/keymaps/default/keymap.c create mode 100644 keyboards/handwired/at101ish/keymaps/osdetect/keymap.c create mode 100644 keyboards/handwired/at101ish/keymaps/osdetect/rules.mk create mode 100644 keyboards/handwired/at101ish/readme.md diff --git a/keyboards/handwired/at101ish/keyboard.json b/keyboards/handwired/at101ish/keyboard.json new file mode 100644 index 0000000000..bd629f1605 --- /dev/null +++ b/keyboards/handwired/at101ish/keyboard.json @@ -0,0 +1,363 @@ +{ + "manufacturer": "Henrik O. S\u00f8rensen", + "keyboard_name": "AT101ish", + "maintainer": "qmk", + "bootloader": "halfkay", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "command": true, + "console": true, + "extrakey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "D6", + "num_lock": "D4", + "scroll_lock": "E6" + }, + "matrix_pins": { + "cols": ["D7", "B4", "B5", "B6", "F7", "F6", "F5", "F4", "F1", "F0"], + "rows": ["B1", "B0", "B2", "D5", "B3", "C7", "B7", "C6", "D0", "D3", "D1", "D2"] + }, + "processor": "atmega32u4", + "tags": ["at101", "at102", "bigfoot"], + "url": "https://github.com/henrikosorensen/keyboard_pcbs/tree/master/at101_pcb", + "usb": { + "device_version": "1.1.0", + "pid": "0x0101", + "vid": "0xFEED" + }, + "community_layouts": ["fullsize_ansi", "fullsize_iso"], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "F1", "matrix": [0, 1], "x": 2, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 4, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 5, "y": 0}, + {"label": "F5", "matrix": [0, 5], "x": 6.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 7.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 8.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 9.5, "y": 0}, + {"label": "F9", "matrix": [0, 9], "x": 11, "y": 0}, + {"label": "F10", "matrix": [1, 0], "x": 12, "y": 0}, + {"label": "F11", "matrix": [1, 1], "x": 13, "y": 0}, + {"label": "F12", "matrix": [1, 2], "x": 14, "y": 0}, + {"label": "PrtSc", "matrix": [1, 3], "x": 15.25, "y": 0}, + {"label": "Scroll Lock", "matrix": [1, 4], "x": 16.25, "y": 0}, + {"label": "Pause", "matrix": [1, 5], "x": 17.25, "y": 0}, + {"label": "\u00ac", "matrix": [2, 0], "x": 0, "y": 1.5}, + {"label": "!", "matrix": [2, 1], "x": 1, "y": 1.5}, + {"label": "\"", "matrix": [2, 2], "x": 2, "y": 1.5}, + {"label": "\u00a3", "matrix": [2, 3], "x": 3, "y": 1.5}, + {"label": "$", "matrix": [2, 4], "x": 4, "y": 1.5}, + {"label": "%", "matrix": [2, 5], "x": 5, "y": 1.5}, + {"label": "^", "matrix": [2, 6], "x": 6, "y": 1.5}, + {"label": "&", "matrix": [2, 7], "x": 7, "y": 1.5}, + {"label": "*", "matrix": [2, 8], "x": 8, "y": 1.5}, + {"label": "(", "matrix": [2, 9], "x": 9, "y": 1.5}, + {"label": ")", "matrix": [3, 0], "x": 10, "y": 1.5}, + {"label": "_", "matrix": [3, 1], "x": 11, "y": 1.5}, + {"label": "+", "matrix": [3, 2], "x": 12, "y": 1.5}, + {"label": "Backspace", "matrix": [3, 3], "x": 13, "y": 1.5, "w": 2}, + {"label": "Insert", "matrix": [3, 4], "x": 15.25, "y": 1.5}, + {"label": "Home", "matrix": [3, 5], "x": 16.25, "y": 1.5}, + {"label": "PgUp", "matrix": [3, 6], "x": 17.25, "y": 1.5}, + {"label": "Num Lock", "matrix": [3, 7], "x": 18.5, "y": 1.5}, + {"label": "/", "matrix": [3, 8], "x": 19.5, "y": 1.5}, + {"label": "*", "matrix": [3, 9], "x": 20.5, "y": 1.5}, + {"label": "-", "matrix": [1, 9], "x": 21.5, "y": 1.5}, + {"label": "Tab", "matrix": [4, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "Q", "matrix": [4, 1], "x": 1.5, "y": 2.5}, + {"label": "W", "matrix": [4, 2], "x": 2.5, "y": 2.5}, + {"label": "E", "matrix": [4, 3], "x": 3.5, "y": 2.5}, + {"label": "R", "matrix": [4, 4], "x": 4.5, "y": 2.5}, + {"label": "T", "matrix": [4, 5], "x": 5.5, "y": 2.5}, + {"label": "Y", "matrix": [4, 6], "x": 6.5, "y": 2.5}, + {"label": "U", "matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"label": "I", "matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"label": "O", "matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"label": "P", "matrix": [5, 0], "x": 10.5, "y": 2.5}, + {"label": "{", "matrix": [5, 1], "x": 11.5, "y": 2.5}, + {"label": "}", "matrix": [5, 2], "x": 12.5, "y": 2.5}, + {"label": "|", "matrix": [5, 3], "x": 13.5, "y": 2.5, "w": 1.5}, + {"label": "Delete", "matrix": [5, 4], "x": 15.25, "y": 2.5}, + {"label": "End", "matrix": [5, 5], "x": 16.25, "y": 2.5}, + {"label": "PgDn", "matrix": [5, 6], "x": 17.25, "y": 2.5}, + {"label": "7", "matrix": [5, 7], "x": 18.5, "y": 2.5}, + {"label": "8", "matrix": [5, 8], "x": 19.5, "y": 2.5}, + {"label": "9", "matrix": [5, 9], "x": 20.5, "y": 2.5}, + {"label": "+", "matrix": [1, 8], "x": 21.5, "y": 2.5}, + {"label": "Caps Lock", "matrix": [6, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"label": "A", "matrix": [6, 1], "x": 1.75, "y": 3.5}, + {"label": "S", "matrix": [6, 2], "x": 2.75, "y": 3.5}, + {"label": "D", "matrix": [6, 3], "x": 3.75, "y": 3.5}, + {"label": "F", "matrix": [6, 4], "x": 4.75, "y": 3.5}, + {"label": "G", "matrix": [6, 5], "x": 5.75, "y": 3.5}, + {"label": "H", "matrix": [6, 6], "x": 6.75, "y": 3.5}, + {"label": "J", "matrix": [6, 7], "x": 7.75, "y": 3.5}, + {"label": "K", "matrix": [6, 8], "x": 8.75, "y": 3.5}, + {"label": "L", "matrix": [6, 9], "x": 9.75, "y": 3.5}, + {"label": ":", "matrix": [7, 0], "x": 10.75, "y": 3.5}, + {"label": "@", "matrix": [7, 1], "x": 11.75, "y": 3.5}, + {"label": "~", "matrix": [7, 2], "x": 12.75, "y": 3.5}, + {"label": "Enter", "matrix": [7, 3], "x": 13.75, "y": 3.5, "w": 1.25}, + {"label": "4", "matrix": [7, 6], "x": 18.5, "y": 3.5}, + {"label": "5", "matrix": [7, 7], "x": 19.5, "y": 3.5}, + {"label": "6", "matrix": [7, 8], "x": 20.5, "y": 3.5}, + {"label": "=", "matrix": [7, 9], "x": 21.5, "y": 3.5}, + {"label": "Shift", "matrix": [8, 0], "x": 0, "y": 4.5, "w": 1.25}, + {"label": "|", "matrix": [8, 1], "x": 1.25, "y": 4.5}, + {"label": "Z", "matrix": [8, 2], "x": 2.25, "y": 4.5}, + {"label": "X", "matrix": [8, 3], "x": 3.25, "y": 4.5}, + {"label": "C", "matrix": [8, 4], "x": 4.25, "y": 4.5}, + {"label": "V", "matrix": [8, 5], "x": 5.25, "y": 4.5}, + {"label": "B", "matrix": [8, 6], "x": 6.25, "y": 4.5}, + {"label": "N", "matrix": [8, 7], "x": 7.25, "y": 4.5}, + {"label": "M", "matrix": [8, 8], "x": 8.25, "y": 4.5}, + {"label": "<", "matrix": [8, 9], "x": 9.25, "y": 4.5}, + {"label": ">", "matrix": [9, 0], "x": 10.25, "y": 4.5}, + {"label": "?", "matrix": [9, 1], "x": 11.25, "y": 4.5}, + {"label": "Shift", "matrix": [9, 2], "x": 12.25, "y": 4.5, "w": 1.75}, + {"label": "|", "matrix": [9, 3], "x": 14, "y": 4.5}, + {"label": "\u2191", "matrix": [9, 4], "x": 16.25, "y": 4.5}, + {"label": "1", "matrix": [9, 6], "x": 18.5, "y": 4.5}, + {"label": "2", "matrix": [9, 7], "x": 19.5, "y": 4.5}, + {"label": "3", "matrix": [9, 8], "x": 20.5, "y": 4.5}, + {"label": "Enter", "matrix": [9, 9], "x": 21.5, "y": 4.5, "h": 2}, + {"label": "Ctrl", "matrix": [10, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"label": "Win", "matrix": [10, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"label": "Alt", "matrix": [10, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"label": " ", "matrix": [10, 7], "x": 3.75, "y": 5.5, "w": 6.25}, + {"label": "AltGr ", "matrix": [11, 0], "x": 10, "y": 5.5, "w": 1.25}, + {"label": "Win", "matrix": [11, 1], "x": 11.25, "y": 5.5, "w": 1.25}, + {"label": "Menu", "matrix": [11, 2], "x": 12.5, "y": 5.5, "w": 1.25}, + {"label": "Ctrl", "matrix": [11, 3], "x": 13.75, "y": 5.5, "w": 1.25}, + {"label": "\u2190", "matrix": [11, 4], "x": 15.25, "y": 5.5}, + {"label": "\u2193", "matrix": [11, 5], "x": 16.25, "y": 5.5}, + {"label": "\u2192", "matrix": [11, 6], "x": 17.25, "y": 5.5}, + {"label": "0", "matrix": [11, 7], "x": 18.5, "y": 5.5, "w": 2}, + {"label": ".", "matrix": [11, 8], "x": 20.5, "y": 5.5} + ] + }, + "LAYOUT_fullsize_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [1, 0], "x": 12, "y": 0}, + {"matrix": [1, 1], "x": 13, "y": 0}, + {"matrix": [1, 2], "x": 14, "y": 0}, + {"matrix": [1, 3], "x": 15.25, "y": 0}, + {"matrix": [1, 4], "x": 16.25, "y": 0}, + {"matrix": [1, 5], "x": 17.25, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1.5}, + {"matrix": [2, 1], "x": 1, "y": 1.5}, + {"matrix": [2, 2], "x": 2, "y": 1.5}, + {"matrix": [2, 3], "x": 3, "y": 1.5}, + {"matrix": [2, 4], "x": 4, "y": 1.5}, + {"matrix": [2, 5], "x": 5, "y": 1.5}, + {"matrix": [2, 6], "x": 6, "y": 1.5}, + {"matrix": [2, 7], "x": 7, "y": 1.5}, + {"matrix": [2, 8], "x": 8, "y": 1.5}, + {"matrix": [2, 9], "x": 9, "y": 1.5}, + {"matrix": [3, 0], "x": 10, "y": 1.5}, + {"matrix": [3, 1], "x": 11, "y": 1.5}, + {"matrix": [3, 2], "x": 12, "y": 1.5}, + {"matrix": [3, 3], "x": 13, "y": 1.5, "w": 2}, + {"matrix": [3, 4], "x": 15.25, "y": 1.5}, + {"matrix": [3, 5], "x": 16.25, "y": 1.5}, + {"matrix": [3, 6], "x": 17.25, "y": 1.5}, + {"matrix": [3, 7], "x": 18.5, "y": 1.5}, + {"matrix": [3, 8], "x": 19.5, "y": 1.5}, + {"matrix": [3, 9], "x": 20.5, "y": 1.5}, + {"matrix": [1, 9], "x": 21.5, "y": 1.5}, + {"matrix": [4, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 2.5}, + {"matrix": [4, 2], "x": 2.5, "y": 2.5}, + {"matrix": [4, 3], "x": 3.5, "y": 2.5}, + {"matrix": [4, 4], "x": 4.5, "y": 2.5}, + {"matrix": [4, 5], "x": 5.5, "y": 2.5}, + {"matrix": [4, 6], "x": 6.5, "y": 2.5}, + {"matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"matrix": [5, 0], "x": 10.5, "y": 2.5}, + {"matrix": [5, 1], "x": 11.5, "y": 2.5}, + {"matrix": [5, 2], "x": 12.5, "y": 2.5}, + {"matrix": [5, 3], "x": 13.5, "y": 2.5, "w": 1.5}, + {"matrix": [5, 4], "x": 15.25, "y": 2.5}, + {"matrix": [5, 5], "x": 16.25, "y": 2.5}, + {"matrix": [5, 6], "x": 17.25, "y": 2.5}, + {"matrix": [5, 7], "x": 18.5, "y": 2.5}, + {"matrix": [5, 8], "x": 19.5, "y": 2.5}, + {"matrix": [5, 9], "x": 20.5, "y": 2.5}, + {"matrix": [1, 8], "x": 21.5, "y": 2.5, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [6, 1], "x": 1.75, "y": 3.5}, + {"matrix": [6, 2], "x": 2.75, "y": 3.5}, + {"matrix": [6, 3], "x": 3.75, "y": 3.5}, + {"matrix": [6, 4], "x": 4.75, "y": 3.5}, + {"matrix": [6, 5], "x": 5.75, "y": 3.5}, + {"matrix": [6, 6], "x": 6.75, "y": 3.5}, + {"matrix": [6, 7], "x": 7.75, "y": 3.5}, + {"matrix": [6, 8], "x": 8.75, "y": 3.5}, + {"matrix": [6, 9], "x": 9.75, "y": 3.5}, + {"matrix": [7, 0], "x": 10.75, "y": 3.5}, + {"matrix": [7, 1], "x": 11.75, "y": 3.5}, + {"matrix": [7, 3], "x": 12.75, "y": 3.5, "w": 2.25}, + {"matrix": [7, 6], "x": 18.5, "y": 3.5}, + {"matrix": [7, 7], "x": 19.5, "y": 3.5}, + {"matrix": [7, 8], "x": 20.5, "y": 3.5}, + {"matrix": [8, 0], "x": 0, "y": 4.5, "w": 2.25}, + {"matrix": [8, 2], "x": 2.25, "y": 4.5}, + {"matrix": [8, 3], "x": 3.25, "y": 4.5}, + {"matrix": [8, 4], "x": 4.25, "y": 4.5}, + {"matrix": [8, 5], "x": 5.25, "y": 4.5}, + {"matrix": [8, 6], "x": 6.25, "y": 4.5}, + {"matrix": [8, 7], "x": 7.25, "y": 4.5}, + {"matrix": [8, 8], "x": 8.25, "y": 4.5}, + {"matrix": [8, 9], "x": 9.25, "y": 4.5}, + {"matrix": [9, 0], "x": 10.25, "y": 4.5}, + {"matrix": [9, 1], "x": 11.25, "y": 4.5}, + {"matrix": [9, 2], "x": 12.25, "y": 4.5, "w": 2.75}, + {"matrix": [9, 4], "x": 16.25, "y": 4.5}, + {"matrix": [9, 6], "x": 18.5, "y": 4.5}, + {"matrix": [9, 7], "x": 19.5, "y": 4.5}, + {"matrix": [9, 8], "x": 20.5, "y": 4.5}, + {"matrix": [9, 9], "x": 21.5, "y": 4.5, "h": 2}, + {"matrix": [10, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"matrix": [10, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"matrix": [10, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"matrix": [10, 7], "x": 3.75, "y": 5.5, "w": 6.25}, + {"matrix": [11, 0], "x": 10, "y": 5.5, "w": 1.25}, + {"matrix": [11, 1], "x": 11.25, "y": 5.5, "w": 1.25}, + {"matrix": [11, 2], "x": 12.5, "y": 5.5, "w": 1.25}, + {"matrix": [11, 3], "x": 13.75, "y": 5.5, "w": 1.25}, + {"matrix": [11, 4], "x": 15.25, "y": 5.5}, + {"matrix": [11, 5], "x": 16.25, "y": 5.5}, + {"matrix": [11, 6], "x": 17.25, "y": 5.5}, + {"matrix": [11, 7], "x": 18.5, "y": 5.5, "w": 2}, + {"matrix": [11, 8], "x": 20.5, "y": 5.5} + ] + }, + "LAYOUT_fullsize_iso": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [1, 0], "x": 12, "y": 0}, + {"matrix": [1, 1], "x": 13, "y": 0}, + {"matrix": [1, 2], "x": 14, "y": 0}, + {"matrix": [1, 3], "x": 15.25, "y": 0}, + {"matrix": [1, 4], "x": 16.25, "y": 0}, + {"matrix": [1, 5], "x": 17.25, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1.5}, + {"matrix": [2, 1], "x": 1, "y": 1.5}, + {"matrix": [2, 2], "x": 2, "y": 1.5}, + {"matrix": [2, 3], "x": 3, "y": 1.5}, + {"matrix": [2, 4], "x": 4, "y": 1.5}, + {"matrix": [2, 5], "x": 5, "y": 1.5}, + {"matrix": [2, 6], "x": 6, "y": 1.5}, + {"matrix": [2, 7], "x": 7, "y": 1.5}, + {"matrix": [2, 8], "x": 8, "y": 1.5}, + {"matrix": [2, 9], "x": 9, "y": 1.5}, + {"matrix": [3, 0], "x": 10, "y": 1.5}, + {"matrix": [3, 1], "x": 11, "y": 1.5}, + {"matrix": [3, 2], "x": 12, "y": 1.5}, + {"matrix": [3, 3], "x": 13, "y": 1.5, "w": 2}, + {"matrix": [3, 4], "x": 15.25, "y": 1.5}, + {"matrix": [3, 5], "x": 16.25, "y": 1.5}, + {"matrix": [3, 6], "x": 17.25, "y": 1.5}, + {"matrix": [3, 7], "x": 18.5, "y": 1.5}, + {"matrix": [3, 8], "x": 19.5, "y": 1.5}, + {"matrix": [3, 9], "x": 20.5, "y": 1.5}, + {"matrix": [1, 9], "x": 21.5, "y": 1.5}, + {"matrix": [4, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 2.5}, + {"matrix": [4, 2], "x": 2.5, "y": 2.5}, + {"matrix": [4, 3], "x": 3.5, "y": 2.5}, + {"matrix": [4, 4], "x": 4.5, "y": 2.5}, + {"matrix": [4, 5], "x": 5.5, "y": 2.5}, + {"matrix": [4, 6], "x": 6.5, "y": 2.5}, + {"matrix": [4, 7], "x": 7.5, "y": 2.5}, + {"matrix": [4, 8], "x": 8.5, "y": 2.5}, + {"matrix": [4, 9], "x": 9.5, "y": 2.5}, + {"matrix": [5, 0], "x": 10.5, "y": 2.5}, + {"matrix": [5, 1], "x": 11.5, "y": 2.5}, + {"matrix": [5, 2], "x": 12.5, "y": 2.5}, + {"matrix": [5, 4], "x": 15.25, "y": 2.5}, + {"matrix": [5, 5], "x": 16.25, "y": 2.5}, + {"matrix": [5, 6], "x": 17.25, "y": 2.5}, + {"matrix": [5, 7], "x": 18.5, "y": 2.5}, + {"matrix": [5, 8], "x": 19.5, "y": 2.5}, + {"matrix": [5, 9], "x": 20.5, "y": 2.5}, + {"matrix": [1, 8], "x": 21.5, "y": 2.5, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3.5, "w": 1.75}, + {"matrix": [6, 1], "x": 1.75, "y": 3.5}, + {"matrix": [6, 2], "x": 2.75, "y": 3.5}, + {"matrix": [6, 3], "x": 3.75, "y": 3.5}, + {"matrix": [6, 4], "x": 4.75, "y": 3.5}, + {"matrix": [6, 5], "x": 5.75, "y": 3.5}, + {"matrix": [6, 6], "x": 6.75, "y": 3.5}, + {"matrix": [6, 7], "x": 7.75, "y": 3.5}, + {"matrix": [6, 8], "x": 8.75, "y": 3.5}, + {"matrix": [6, 9], "x": 9.75, "y": 3.5}, + {"matrix": [7, 0], "x": 10.75, "y": 3.5}, + {"matrix": [7, 1], "x": 11.75, "y": 3.5}, + {"matrix": [7, 2], "x": 12.75, "y": 3.5}, + {"matrix": [7, 3], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2}, + {"matrix": [7, 6], "x": 18.5, "y": 3.5}, + {"matrix": [7, 7], "x": 19.5, "y": 3.5}, + {"matrix": [7, 8], "x": 20.5, "y": 3.5}, + {"matrix": [8, 0], "x": 0, "y": 4.5, "w": 1.25}, + {"matrix": [8, 1], "x": 1.25, "y": 4.5}, + {"matrix": [8, 2], "x": 2.25, "y": 4.5}, + {"matrix": [8, 3], "x": 3.25, "y": 4.5}, + {"matrix": [8, 4], "x": 4.25, "y": 4.5}, + {"matrix": [8, 5], "x": 5.25, "y": 4.5}, + {"matrix": [8, 6], "x": 6.25, "y": 4.5}, + {"matrix": [8, 7], "x": 7.25, "y": 4.5}, + {"matrix": [8, 8], "x": 8.25, "y": 4.5}, + {"matrix": [8, 9], "x": 9.25, "y": 4.5}, + {"matrix": [9, 0], "x": 10.25, "y": 4.5}, + {"matrix": [9, 1], "x": 11.25, "y": 4.5}, + {"matrix": [9, 2], "x": 12.25, "y": 4.5, "w": 2.75}, + {"matrix": [9, 4], "x": 16.25, "y": 4.5}, + {"matrix": [9, 6], "x": 18.5, "y": 4.5}, + {"matrix": [9, 7], "x": 19.5, "y": 4.5}, + {"matrix": [9, 8], "x": 20.5, "y": 4.5}, + {"matrix": [9, 9], "x": 21.5, "y": 4.5, "h": 2}, + {"matrix": [10, 0], "x": 0, "y": 5.5, "w": 1.25}, + {"matrix": [10, 1], "x": 1.25, "y": 5.5, "w": 1.25}, + {"matrix": [10, 2], "x": 2.5, "y": 5.5, "w": 1.25}, + {"matrix": [10, 7], "x": 3.75, "y": 5.5, "w": 6.25}, + {"matrix": [11, 0], "x": 10, "y": 5.5, "w": 1.25}, + {"matrix": [11, 1], "x": 11.25, "y": 5.5, "w": 1.25}, + {"matrix": [11, 2], "x": 12.5, "y": 5.5, "w": 1.25}, + {"matrix": [11, 3], "x": 13.75, "y": 5.5, "w": 1.25}, + {"matrix": [11, 4], "x": 15.25, "y": 5.5}, + {"matrix": [11, 5], "x": 16.25, "y": 5.5}, + {"matrix": [11, 6], "x": 17.25, "y": 5.5}, + {"matrix": [11, 7], "x": 18.5, "y": 5.5, "w": 2}, + {"matrix": [11, 8], "x": 20.5, "y": 5.5} + ] + } + } +} diff --git a/keyboards/handwired/at101ish/keymaps/default/keymap.c b/keyboards/handwired/at101ish/keymaps/default/keymap.c new file mode 100644 index 0000000000..2311a24437 --- /dev/null +++ b/keyboards/handwired/at101ish/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +/* Copyright 2025 Henrik Otte Sørensen (@henrikottesorensen) + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PEQL, + 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_BSLS, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT) +}; diff --git a/keyboards/handwired/at101ish/keymaps/osdetect/keymap.c b/keyboards/handwired/at101ish/keymaps/osdetect/keymap.c new file mode 100644 index 0000000000..89b748a61b --- /dev/null +++ b/keyboards/handwired/at101ish/keymaps/osdetect/keymap.c @@ -0,0 +1,59 @@ +/* Copyright 2025 Henrik Otte Sørensen (@henrikottesorensen) + * + * 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 + +enum LAYER { + _PC = 0, + _MAC, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_PC] = LAYOUT_all( + 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_PSCR, KC_SCRL, KC_PAUS, + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PEQL, + 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_BSLS, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT), + [_MAC] = LAYOUT_all( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_WSCH, KC_LPAD, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_SCRL, KC_PAUS, + KC_NUBS, 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PEQL, + KC_LSFT, KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_BSLS, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT), + [_FN] = 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, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DF(_PC), _______, _______, _______, _______, KC_MUTE, KC_VOLD, _______, _______, _______, _______, + _______, _______, _______, DB_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, QK_BOOT, _______, DF(_MAC),_______, _______, _______, _______, _______, KC_MPLY, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_APP, KC_MPRV, KC_MSTP, KC_MNXT, _______, _______) +}; + +bool process_detected_host_os_user(os_variant_t detected_os) { + /* If Apple, swap to macOS layer. */ + if (detected_os == OS_MACOS || detected_os == OS_IOS) { + set_single_default_layer(_MAC); + } + else /* Else use PC layer */ { + set_single_default_layer(_PC); + } + + return true; +} diff --git a/keyboards/handwired/at101ish/keymaps/osdetect/rules.mk b/keyboards/handwired/at101ish/keymaps/osdetect/rules.mk new file mode 100644 index 0000000000..64ac3dcb16 --- /dev/null +++ b/keyboards/handwired/at101ish/keymaps/osdetect/rules.mk @@ -0,0 +1 @@ +OS_DETECTION_ENABLE = yes diff --git a/keyboards/handwired/at101ish/readme.md b/keyboards/handwired/at101ish/readme.md new file mode 100644 index 0000000000..2bdfbb9367 --- /dev/null +++ b/keyboards/handwired/at101ish/readme.md @@ -0,0 +1,25 @@ +# AT101(-ish) + +A replacement PCB for Dell AT101 family. (In theory) supports AT101, AT101W, AT102, AT102W, maybe other Bigfoot platform boards. + +Keyboard Maintainer: QMK Community and Henrik O. Sørensen +Hardware Supported: AT101(ish) PCB +Hardware Availability: https://github.com/henrikosorensen/keyboard_pcbs/tree/master/at101_pcb + +Make example for this keyboard (after setting up your build environment): + + make handwired/at101ish:default + +Flashing example for this keyboard: + + make handwired/at101ish: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 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 programming button on the teensy 2.0 PCB. + From da166d4d8b1eb5cf984a08effdf20faaca2b3234 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:06:42 -0700 Subject: [PATCH 263/592] Add "license" field to Community Module JSON schema. (#25085) Add "license" field to community module schema. --- data/schemas/community_module.jsonschema | 1 + docs/features/community_modules.md | 5 +++++ lib/python/qmk/json_encoders.py | 8 +++++--- modules/qmk/hello_world/qmk_module.json | 1 + modules/qmk/super_alt_tab/qmk_module.json | 1 + 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema index a3474476df..a237e210ce 100644 --- a/data/schemas/community_module.jsonschema +++ b/data/schemas/community_module.jsonschema @@ -7,6 +7,7 @@ "properties": { "module_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, + "license": {"type": "string"}, "url": { "type": "string", "format": "uri" diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md index a28c5afaeb..52526c9fe8 100644 --- a/docs/features/community_modules.md +++ b/docs/features/community_modules.md @@ -72,6 +72,7 @@ A Community Module is denoted by a `qmk_module.json` file such as the following: { "module_name": "Hello World", "maintainer": "QMK Maintainers", + "license": "GPL-2.0-or-later", "features": { "deferred_exec": true }, @@ -86,6 +87,10 @@ A Community Module is denoted by a `qmk_module.json` file such as the following: At minimum, the module must provide the `module_name` and `maintainer` fields. +The `license` field is encouraged to indicate the terms for using and sharing the module. It is recommended to use a [SPDX license identifier](https://spdx.org/licenses/) like "`Apache-2.0`" or "`GPL-2.0-or-later`" if possible. + +The `url` field may specify a URL to more information about the module. + The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build. The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap. diff --git a/lib/python/qmk/json_encoders.py b/lib/python/qmk/json_encoders.py index e83a381d52..e8bcf48996 100755 --- a/lib/python/qmk/json_encoders.py +++ b/lib/python/qmk/json_encoders.py @@ -250,12 +250,14 @@ class CommunityModuleJSONEncoder(QMKJSONEncoder): return '00module_name' if key == 'maintainer': return '01maintainer' + if key == 'license': + return '02license' if key == 'url': - return '02url' + return '03url' if key == 'features': - return '03features' + return '04features' if key == 'keycodes': - return '04keycodes' + return '05keycodes' elif self.indentation_level == 3: # keycodes if key == 'key': return '00key' diff --git a/modules/qmk/hello_world/qmk_module.json b/modules/qmk/hello_world/qmk_module.json index fd855a6e23..bbd00f3fcc 100644 --- a/modules/qmk/hello_world/qmk_module.json +++ b/modules/qmk/hello_world/qmk_module.json @@ -1,6 +1,7 @@ { "module_name": "Hello World", "maintainer": "QMK Maintainers", + "license": "GPL-2.0-or-later", "features": { "console": true, "deferred_exec": true diff --git a/modules/qmk/super_alt_tab/qmk_module.json b/modules/qmk/super_alt_tab/qmk_module.json index 002f7fb69e..142613a23e 100644 --- a/modules/qmk/super_alt_tab/qmk_module.json +++ b/modules/qmk/super_alt_tab/qmk_module.json @@ -1,6 +1,7 @@ { "module_name": "Super Alt Tab", "maintainer": "QMK Maintainers", + "license": "GPL-2.0-or-later", "keycodes": [ { "key": "COMMUNITY_MODULE_SUPER_ALT_TAB", From 0f1dcc0592cddf5099b04f864fcbf7c73e7a9d80 Mon Sep 17 00:00:00 2001 From: Ivan Gromov <38141348+key10iq@users.noreply.github.com> Date: Thu, 3 Apr 2025 22:51:25 +0400 Subject: [PATCH 264/592] Add kt60HS-T v2 PCB (#25080) * Add kt60HS-Tv2 * Update keyboards/keyten/kt60hs_t/readme.md Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60hs_t/v1/readme.md Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60hs_t/v2/keyboard.json Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60hs_t/v2/readme.md Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60hs_t/info.json Co-authored-by: Sergey Vlasov * Change of structure * Moving the keyboard * Update data/mappings/keyboard_aliases.hjson Co-authored-by: Sergey Vlasov * Update keyboards/keyten/kt60hs_t/v1/keyboard.json Co-authored-by: Duncan Sutherland * Update keyboards/keyten/kt60hs_t/v2/keyboard.json Co-authored-by: Duncan Sutherland --------- Co-authored-by: Sergey Vlasov Co-authored-by: Duncan Sutherland --- data/mappings/keyboard_aliases.hjson | 3 + keyboards/keyten/kt60hs_t/info.json | 14 + keyboards/keyten/kt60hs_t/readme.md | 27 +- .../keyten/kt60hs_t/{ => v1}/keyboard.json | 82 ++++- keyboards/keyten/kt60hs_t/v1/readme.md | 29 ++ keyboards/keyten/kt60hs_t/v2/keyboard.json | 282 ++++++++++++++++++ keyboards/keyten/kt60hs_t/v2/readme.md | 29 ++ 7 files changed, 431 insertions(+), 35 deletions(-) create mode 100644 keyboards/keyten/kt60hs_t/info.json rename keyboards/keyten/kt60hs_t/{ => v1}/keyboard.json (75%) create mode 100644 keyboards/keyten/kt60hs_t/v1/readme.md create mode 100644 keyboards/keyten/kt60hs_t/v2/keyboard.json create mode 100644 keyboards/keyten/kt60hs_t/v2/readme.md diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index c8d9bff052..4d8be703c3 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -347,6 +347,9 @@ "keycapsss/plaid_pad": { "target": "keycapsss/plaid_pad/rev1" }, + "keyten/kt60hs_t": { + "target": "keyten/kt60hs_t/v1" + }, "kira75": { "target": "kira/kira75" }, diff --git a/keyboards/keyten/kt60hs_t/info.json b/keyboards/keyten/kt60hs_t/info.json new file mode 100644 index 0000000000..97b4f7d222 --- /dev/null +++ b/keyboards/keyten/kt60hs_t/info.json @@ -0,0 +1,14 @@ +{ + "manufacturer": "keyten", + "keyboard_name": "kt60HS-T", + "maintainer": "key10iq", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "usb": { + "vid": "0xEB69" + } +} diff --git a/keyboards/keyten/kt60hs_t/readme.md b/keyboards/keyten/kt60hs_t/readme.md index 75ccbc3b69..eb02f6bb8f 100644 --- a/keyboards/keyten/kt60hs_t/readme.md +++ b/keyboards/keyten/kt60hs_t/readme.md @@ -2,30 +2,15 @@ 60% MX Hot-Swap Tsangan PCB -![kt60HS-T image](https://i.imgur.com/Iqrf6tHh.jpg) - -* Keyboard Maintainer: [keyten](https://github.com/key10iq) -* Hardware Supported: keyten kt60HS-T -* Hardware Availability: private GB +![kt60HS-T image](https://i.imgur.com/vM32aoX.jpeg) Supports: 1. Split Backspace 2. Stepped Caps Lock -Make example for this keyboard (after setting up your build environment): +There are two versions of the PCB available. - make keyten/kt60hs_t:default - -Flashing example for this keyboard: - - make keyten/kt60hs_t: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 -* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available -* Physical reset button: Hold the button on the back of the PCB +|Version| Features | +|-------|-------------------------------------------| +|v1 |Blue/Purple PCB / ARM STM32F401 controller | +|v2 |Purple PCB / ARM STM32F072 controller | diff --git a/keyboards/keyten/kt60hs_t/keyboard.json b/keyboards/keyten/kt60hs_t/v1/keyboard.json similarity index 75% rename from keyboards/keyten/kt60hs_t/keyboard.json rename to keyboards/keyten/kt60hs_t/v1/keyboard.json index 63a755d698..b5b90304b2 100644 --- a/keyboards/keyten/kt60hs_t/keyboard.json +++ b/keyboards/keyten/kt60hs_t/v1/keyboard.json @@ -1,17 +1,6 @@ { - "manufacturer": "keyten", - "keyboard_name": "kt60HS-T", - "maintainer": "key10iq", "bootloader": "stm32-dfu", "diode_direction": "COL2ROW", - "features": { - "bootmagic": true, - "command": false, - "console": false, - "extrakey": true, - "mousekey": true, - "nkro": true - }, "matrix_pins": { "cols": ["A3", "A4", "A5", "A6", "A7", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"], "rows": ["B15", "B14", "B12", "B13", "B0"] @@ -19,8 +8,7 @@ "processor": "STM32F401", "usb": { "device_version": "0.0.1", - "pid": "0x6004", - "vid": "0xEB69" + "pid": "0x6004" }, "community_layouts": [ "60_ansi_wkl_split_bs_rshift", @@ -28,7 +16,8 @@ "60_ansi_tsangan_split_bs_rshift" ], "layout_aliases": { - "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift" + "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift", + "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift" }, "layouts": { "LAYOUT_60_ansi_wkl_split_bs_rshift": { @@ -224,6 +213,71 @@ {"matrix": [4, 11], "x": 12.5, "y": 4}, {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} ] + }, + "LAYOUT_60_ansi_tsangan_split_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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] } } } diff --git a/keyboards/keyten/kt60hs_t/v1/readme.md b/keyboards/keyten/kt60hs_t/v1/readme.md new file mode 100644 index 0000000000..2f31dbf4bf --- /dev/null +++ b/keyboards/keyten/kt60hs_t/v1/readme.md @@ -0,0 +1,29 @@ +# keyten kt60HS-T V1 + +60% MX Hot-Swap Tsangan PCB + +![kt60HS-T image](https://i.imgur.com/tOej7ND.jpeg) + +**Note: This firmware only supports the PCB version with STM32F401 controller** + +* Keyboard Maintainer: [keyten](https://github.com/key10iq) +* Hardware Supported: keyten kt60HS-T +* Hardware Availability: private GB + +Make example for this keyboard (after setting up your build environment): + + make keyten/kt60hs_t/v1:default + +Flashing example for this keyboard: + + make keyten/kt60hs_t/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 +* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available +* Physical reset button: Hold the button on the back of the PCB diff --git a/keyboards/keyten/kt60hs_t/v2/keyboard.json b/keyboards/keyten/kt60hs_t/v2/keyboard.json new file mode 100644 index 0000000000..728bd90fe8 --- /dev/null +++ b/keyboards/keyten/kt60hs_t/v2/keyboard.json @@ -0,0 +1,282 @@ +{ + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["A3", "A4", "A5", "A6", "A7", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"], + "rows": ["B15", "B14", "B12", "B13", "B0"] + }, + "processor": "STM32F072", + "usb": { + "device_version": "2.0.0", + "pid": "0x6007" + }, + "community_layouts": [ + "60_ansi_wkl_split_bs_rshift", + "60_hhkb", + "60_ansi_tsangan_split_bs_rshift" + ], + "layout_aliases": { + "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift" + }, + "layouts": { + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4} + ] + }, + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan_split_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, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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": [4, 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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/keyten/kt60hs_t/v2/readme.md b/keyboards/keyten/kt60hs_t/v2/readme.md new file mode 100644 index 0000000000..db2b8afccf --- /dev/null +++ b/keyboards/keyten/kt60hs_t/v2/readme.md @@ -0,0 +1,29 @@ +# keyten kt60HS-T V2 + +60% MX Hot-Swap Tsangan PCB + +![kt60HS-T image](https://i.imgur.com/vM32aoX.jpeg) + +**Note: This firmware only supports the PCB version with STM32F072 controller** + +* Keyboard Maintainer: [keyten](https://github.com/key10iq) +* Hardware Supported: keyten kt60HS-T V2 +* Hardware Availability: private GB + +Make example for this keyboard (after setting up your build environment): + + make keyten/kt60hs_t/v2:default + +Flashing example for this keyboard: + + make keyten/kt60hs_t/v2: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 +* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available +* Physical reset button: Hold the button on the back of the PCB From 625d62efdf3cf6d720b6620d18774d7513d62d22 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 5 Apr 2025 22:21:04 +0100 Subject: [PATCH 265/592] Fix 'qmk lint -kb' argument handling (#25093) --- lib/python/qmk/cli/lint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index c09e377ad6..bcf905f579 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -317,10 +317,10 @@ def lint(cli): if isinstance(cli.config.lint.keyboard, str): # if provided via config - string not array keyboard_list = [cli.config.lint.keyboard] - elif is_all_keyboards(cli.args.keyboard[0]): + elif any(is_all_keyboards(kb) for kb in cli.args.keyboard): keyboard_list = list_keyboards() else: - keyboard_list = cli.config.lint.keyboard + keyboard_list = list(set(cli.config.lint.keyboard)) failed = [] From 30c0036db116dabed9d0a93b913918f38c615f13 Mon Sep 17 00:00:00 2001 From: Pham Duc Minh <95753855+Deemen17@users.noreply.github.com> Date: Mon, 7 Apr 2025 00:53:13 +0700 Subject: [PATCH 266/592] Refactor Deemen17 Works DE60 (#25088) --- data/mappings/keyboard_aliases.hjson | 3 +++ keyboards/deemen17/{de60fs => de60/r1}/config.h | 0 .../deemen17/{de60fs => de60/r1}/keyboard.json | 4 ++-- .../r1}/keymaps/default/keymap.c | 0 .../deemen17/{de60fs => de60/r1}/readme.md | 8 ++++---- keyboards/deemen17/de60/readme.md | 17 +++++++++++++++++ 6 files changed, 26 insertions(+), 6 deletions(-) rename keyboards/deemen17/{de60fs => de60/r1}/config.h (100%) rename keyboards/deemen17/{de60fs => de60/r1}/keyboard.json (99%) rename keyboards/deemen17/{de60fs => de60/r1}/keymaps/default/keymap.c (100%) rename keyboards/deemen17/{de60fs => de60/r1}/readme.md (89%) create mode 100644 keyboards/deemen17/de60/readme.md diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 4d8be703c3..0a640fd3e0 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -146,6 +146,9 @@ "daisy": { "target": "ktec/daisy" }, + "deemen17/de60": { + "target": "deemen17/de60/r1" + }, "dp3000": { "target": "dp3000/rev1" }, diff --git a/keyboards/deemen17/de60fs/config.h b/keyboards/deemen17/de60/r1/config.h similarity index 100% rename from keyboards/deemen17/de60fs/config.h rename to keyboards/deemen17/de60/r1/config.h diff --git a/keyboards/deemen17/de60fs/keyboard.json b/keyboards/deemen17/de60/r1/keyboard.json similarity index 99% rename from keyboards/deemen17/de60fs/keyboard.json rename to keyboards/deemen17/de60/r1/keyboard.json index 573c012baa..62de2691ce 100644 --- a/keyboards/deemen17/de60fs/keyboard.json +++ b/keyboards/deemen17/de60/r1/keyboard.json @@ -1,6 +1,6 @@ { - "manufacturer": "Deemen17", - "keyboard_name": "De60fs", + "manufacturer": "Deemen17 Works", + "keyboard_name": "DE60 R1", "maintainer": "Deemen17", "bootloader": "rp2040", "build": { diff --git a/keyboards/deemen17/de60fs/keymaps/default/keymap.c b/keyboards/deemen17/de60/r1/keymaps/default/keymap.c similarity index 100% rename from keyboards/deemen17/de60fs/keymaps/default/keymap.c rename to keyboards/deemen17/de60/r1/keymaps/default/keymap.c diff --git a/keyboards/deemen17/de60fs/readme.md b/keyboards/deemen17/de60/r1/readme.md similarity index 89% rename from keyboards/deemen17/de60fs/readme.md rename to keyboards/deemen17/de60/r1/readme.md index e5135691a8..e71a2fc412 100644 --- a/keyboards/deemen17/de60fs/readme.md +++ b/keyboards/deemen17/de60/r1/readme.md @@ -1,6 +1,6 @@ -# De60fs +# DE60 Round 1 -![De60fs](https://i.imgur.com/7hpYaoXh.jpg) +![DE60 R1](https://i.imgur.com/7hpYaoXh.jpg) A GH60 form factor PCB for 60% keyboards. Uses a Left USB Type C connector or 5 JST SH positions for daughter board. @@ -10,11 +10,11 @@ A GH60 form factor PCB for 60% keyboards. Uses a Left USB Type C connector or 5 Make example for this keyboard (after setting up your build environment): - make deemen17/de60fs:default + make deemen17/de60/r1:default Flashing example for this keyboard: - make deemen17/de60fs:default:flash + make deemen17/de60/r1: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). diff --git a/keyboards/deemen17/de60/readme.md b/keyboards/deemen17/de60/readme.md new file mode 100644 index 0000000000..c5ea64a6a6 --- /dev/null +++ b/keyboards/deemen17/de60/readme.md @@ -0,0 +1,17 @@ +# DE60 + +Deemen17 Works's 60% PCB Platform, which works as the base for our 60%-layout PCB designs. + +* Keyboard Maintainer: [Deemen17](https://github.com/Deemen17) +* Hardware Supported: DE60 PCBs +* Hardware Availability: [Deemen17 Facebook Page](https://www.facebook.com/deemen17/), [Deemen17 Works Instagram](https://www.instagram.com/deemen17.works) + +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 (ESC/Escape) and plug in the keyboard +* **Physical reset button**: Double tap the button RESET on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 9e775b8e9d955828407b586f980187461c5bfbd6 Mon Sep 17 00:00:00 2001 From: Dam Vu Duy Date: Mon, 7 Apr 2025 00:56:19 +0700 Subject: [PATCH 267/592] Add Coban Pad 12A (#25039) Co-authored-by: jack --- keyboards/coban/pad12a/config.h | 7 +++ keyboards/coban/pad12a/keyboard.json | 50 +++++++++++++++++++ .../coban/pad12a/keymaps/default/keymap.c | 19 +++++++ .../coban/pad12a/keymaps/default/rules.mk | 1 + keyboards/coban/pad12a/readme.md | 23 +++++++++ 5 files changed, 100 insertions(+) create mode 100644 keyboards/coban/pad12a/config.h create mode 100644 keyboards/coban/pad12a/keyboard.json create mode 100644 keyboards/coban/pad12a/keymaps/default/keymap.c create mode 100644 keyboards/coban/pad12a/keymaps/default/rules.mk create mode 100644 keyboards/coban/pad12a/readme.md diff --git a/keyboards/coban/pad12a/config.h b/keyboards/coban/pad12a/config.h new file mode 100644 index 0000000000..b6b096ad05 --- /dev/null +++ b/keyboards/coban/pad12a/config.h @@ -0,0 +1,7 @@ +// Copyright 2025 RyanDam (https://github.com/RyanDam) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U diff --git a/keyboards/coban/pad12a/keyboard.json b/keyboards/coban/pad12a/keyboard.json new file mode 100644 index 0000000000..dc027d46f4 --- /dev/null +++ b/keyboards/coban/pad12a/keyboard.json @@ -0,0 +1,50 @@ +{ + "keyboard_name": "Coban Pad 12A", + "name": "Coban Pad 12A", + "url": "https://cobanstationery.com", + "maintainer": "Coban Stationery", + "manufacturer": "Coban Stationery", + "usb": { + "pid": "0xC12A", + "vid": "0xCB3A", + "device_version": "1.0.0" + }, + "matrix_pins": { + "cols": ["GP18", "GP16", "GP11", "GP10"], + "rows": ["GP19", "GP17", "GP12"] + }, + "diode_direction": "ROW2COL", + "encoder": { + "rotary": [ + {"pin_a": "GP20", "pin_b": "GP21"} + ] + }, + "processor": "RP2040", + "bootloader": "rp2040", + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true + }, + "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}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + } +} diff --git a/keyboards/coban/pad12a/keymaps/default/keymap.c b/keyboards/coban/pad12a/keymaps/default/keymap.c new file mode 100644 index 0000000000..0ef7814f63 --- /dev/null +++ b/keyboards/coban/pad12a/keymaps/default/keymap.c @@ -0,0 +1,19 @@ +// Copyright 2025 RyanDam (https://github.com/RyanDam) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_MPLY, KC_MPRV, KC_MUTE, KC_MNXT, + KC_PGUP, KC_ESC, KC_UP, KC_ENT, + KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT + ), +}; + + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, +}; +#endif diff --git a/keyboards/coban/pad12a/keymaps/default/rules.mk b/keyboards/coban/pad12a/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/coban/pad12a/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/coban/pad12a/readme.md b/keyboards/coban/pad12a/readme.md new file mode 100644 index 0000000000..92b5b4528b --- /dev/null +++ b/keyboards/coban/pad12a/readme.md @@ -0,0 +1,23 @@ +# Coban Pad 12A + +![Coban Pad 12A](https://i.imgur.com/PTIaQld.jpeg) +Small ortho keyboard with 11 hotswapable buttons and 1 encoder + +* Keyboard Maintainer: [RyanDam](https://github.com/RyanDam) +* Hardware Supported: Coban Pad 12A + +Make example for this keyboard (after setting up your build environment): + + make coban/pad12a:default + +Flashing example for this keyboard: + + make coban/pad12a: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: + +* **boot button**: Hold the BOOT button on the back of the PCB while plug in usb cable From a7ac6e4e68ba0b5341d6c8ffff8f8a2a24d22ef7 Mon Sep 17 00:00:00 2001 From: nonameCCC <79012391+nonameCCC@users.noreply.github.com> Date: Mon, 7 Apr 2025 12:03:24 +0800 Subject: [PATCH 268/592] [Keyboard] Add PHDesign PH60/Multi Keyboard PCB (#25086) * Add PH60/Multi Support * Add PCB PIcture for README * Remove MO(_FN2) * README Typo Fix * Layout and README Adjustment * Add README for PHDesign Main Folder * Keymap Improvement * Update README.md --- keyboards/phdesign/ph60/multi/keyboard.json | 298 ++++++++++++++++++ .../ph60/multi/keymaps/default/keymap.c | 28 ++ keyboards/phdesign/ph60/multi/readme.md | 28 ++ keyboards/phdesign/readme.md | 9 + 4 files changed, 363 insertions(+) create mode 100644 keyboards/phdesign/ph60/multi/keyboard.json create mode 100644 keyboards/phdesign/ph60/multi/keymaps/default/keymap.c create mode 100644 keyboards/phdesign/ph60/multi/readme.md create mode 100644 keyboards/phdesign/readme.md diff --git a/keyboards/phdesign/ph60/multi/keyboard.json b/keyboards/phdesign/ph60/multi/keyboard.json new file mode 100644 index 0000000000..7240974f70 --- /dev/null +++ b/keyboards/phdesign/ph60/multi/keyboard.json @@ -0,0 +1,298 @@ +{ + "manufacturer": "phdesign.cc", + "keyboard_name": "ph60_multi", + "maintainer": "phdesign", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13"], + "rows": ["GP14", "GP15", "GP18", "GP19", "GP20"] + }, + "processor": "RP2040", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "url": "phdesign.cc", + "usb": { + "device_version": "2.0.1", + "pid": "0x0002", + "vid": "0x5048" + }, + "community_layouts": ["60_ansi", "60_ansi_tsangan_split_bs_rshift", "60_iso"] + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "x": 12.75, "y": 2, "w": 2.25}, + {"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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 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, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 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, 12], "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, 6], "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": { + "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, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/phdesign/ph60/multi/keymaps/default/keymap.c b/keyboards/phdesign/ph60/multi/keymaps/default/keymap.c new file mode 100644 index 0000000000..74d7a97299 --- /dev/null +++ b/keyboards/phdesign/ph60/multi/keymaps/default/keymap.c @@ -0,0 +1,28 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum custom_layers { + _BASE, + _FN1, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// Base Layer (61 keys) + [_BASE] = 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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, _______, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL + ), + // Fn1 Layer (Windows Lock Shifting Layer) + [_FN1] = 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_UP, _______, _______, _______, _______, _______, KC_INS, _______, KC_PSCR, KC_SCRL, KC_PAUS, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/phdesign/ph60/multi/readme.md b/keyboards/phdesign/ph60/multi/readme.md new file mode 100644 index 0000000000..320e8ec926 --- /dev/null +++ b/keyboards/phdesign/ph60/multi/readme.md @@ -0,0 +1,28 @@ +# phdesign/ph60/multi + +![PromoImage](https://i.imgur.com/sUwC9mk.jpg) + +A 60% multi-layout supported keyboard PCB with open source keyboard case. + +* Keyboard Maintainer: [Team PHDesign](https://github.com/ph-design) +* Hardware Supported: PH60/Multi PCB +* Hardware Availability: + - Store: https://e.tb.cn/h.6VMjUgWZkUGwq26?tk=oVyAeD6uPS2 + - GitHub Repo: https://github.com/ph-design/PH60/tree/Rev.2/PCB_Rev2/Multi + +Make example for this keyboard (after setting up your build environment): + + make phdesign/ph60/multi:default + +Flashing example for this keyboard: + + make phdesign/ph60/multi: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 diff --git a/keyboards/phdesign/readme.md b/keyboards/phdesign/readme.md new file mode 100644 index 0000000000..4605afc13f --- /dev/null +++ b/keyboards/phdesign/readme.md @@ -0,0 +1,9 @@ +![PHDesign Logo](https://i.imgur.com/zkiyChR.png) + +PHDesign is a team focused on making variety kinds of tech stuff,including keyboards and keyboard-like controllers. This directory includes QMK config files for our keyboard products. + +* Maintainer: [Team PHDesign](https://github.com/ph-design) +* Supported Hardware: + * [`PH60/Multi`](ph60/multi/): PH60 multi-layout PCB + * [`PH-AC`](phac/): PH-AC rhythm game controller +* Product Availability: [phdesing.cc](https://phdesign.cc/) From f94c8fd7666eef5dea3606f20be90281b91f5178 Mon Sep 17 00:00:00 2001 From: Ivan Gromov <38141348+key10iq@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:29:37 +0400 Subject: [PATCH 269/592] [Keyboard] Add Ortho Slayer (#25099) * Add Ortho Slayer * Update keyboards/keyten/ortho_slayer/keymaps/default/keymap.c Co-authored-by: jack * Update keyboards/keyten/ortho_slayer/readme.md Co-authored-by: jack --------- Co-authored-by: jack --- keyboards/keyten/ortho_slayer/keyboard.json | 117 ++++++++++++++++++ .../ortho_slayer/keymaps/default/keymap.c | 24 ++++ keyboards/keyten/ortho_slayer/readme.md | 27 ++++ 3 files changed, 168 insertions(+) create mode 100644 keyboards/keyten/ortho_slayer/keyboard.json create mode 100644 keyboards/keyten/ortho_slayer/keymaps/default/keymap.c create mode 100644 keyboards/keyten/ortho_slayer/readme.md diff --git a/keyboards/keyten/ortho_slayer/keyboard.json b/keyboards/keyten/ortho_slayer/keyboard.json new file mode 100644 index 0000000000..e023298937 --- /dev/null +++ b/keyboards/keyten/ortho_slayer/keyboard.json @@ -0,0 +1,117 @@ +{ + "manufacturer": "keyten x La-Versa", + "keyboard_name": "Ortho Slayer", + "maintainer": "key10iq", + "processor": "STM32F072", + "bootloader": "stm32-dfu", + "usb": { + "vid": "0xEB69", + "pid": "0x9001", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "diode_direction": "ROW2COL", + "matrix_pins": { + "rows": ["B6", "B4", "A15", "B0", "B1", "A6", "B15", "B11", "A9", "B13"], + "cols": ["B7", "B14", "B5", "A8", "B3", "A10", "A14", "B12", "A7", "B2", "B10"] + }, + "layouts": { + "LAYOUT": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [1, 0], "x": 1, "y": 0 }, + { "matrix": [0, 1], "x": 2, "y": 0 }, + { "matrix": [1, 1], "x": 3, "y": 0 }, + { "matrix": [0, 2], "x": 4, "y": 0 }, + { "matrix": [1, 2], "x": 5, "y": 0 }, + { "matrix": [0, 3], "x": 6, "y": 0 }, + { "matrix": [1, 3], "x": 7, "y": 0 }, + { "matrix": [0, 4], "x": 8, "y": 0 }, + { "matrix": [1, 4], "x": 9, "y": 0 }, + { "matrix": [0, 5], "x": 10, "y": 0 }, + { "matrix": [1, 5], "x": 11, "y": 0 }, + { "matrix": [0, 6], "x": 12, "y": 0 }, + { "matrix": [1, 6], "x": 13, "y": 0 }, + { "matrix": [0, 7], "x": 14.25, "y": 0 }, + { "matrix": [1, 7], "x": 15.25, "y": 0 }, + { "matrix": [0, 8], "x": 16.25, "y": 0 }, + { "matrix": [1, 8], "x": 17.5, "y": 0 }, + { "matrix": [0, 9], "x": 18.5, "y": 0 }, + { "matrix": [1, 9], "x": 19.5, "y": 0 }, + { "matrix": [0, 10], "x": 20.5, "y": 0 }, + { "matrix": [2, 0], "x": 0, "y": 1 }, + { "matrix": [3, 0], "x": 1, "y": 1 }, + { "matrix": [2, 1], "x": 2, "y": 1 }, + { "matrix": [3, 1], "x": 3, "y": 1 }, + { "matrix": [2, 2], "x": 4, "y": 1 }, + { "matrix": [3, 2], "x": 5, "y": 1 }, + { "matrix": [2, 3], "x": 6, "y": 1 }, + { "matrix": [3, 3], "x": 7, "y": 1 }, + { "matrix": [2, 4], "x": 8, "y": 1 }, + { "matrix": [3, 4], "x": 9, "y": 1 }, + { "matrix": [2, 5], "x": 10, "y": 1 }, + { "matrix": [3, 5], "x": 11, "y": 1 }, + { "matrix": [2, 6], "x": 12, "y": 1 }, + { "matrix": [3, 6], "x": 13, "y": 1 }, + { "matrix": [2, 7], "x": 14.25, "y": 1 }, + { "matrix": [3, 7], "x": 15.25, "y": 1 }, + { "matrix": [2, 8], "x": 16.25, "y": 1 }, + { "matrix": [3, 8], "x": 17.5, "y": 1 }, + { "matrix": [2, 9], "x": 18.5, "y": 1 }, + { "matrix": [3, 9], "x": 19.5, "y": 1 }, + { "h": 2, "matrix": [5, 10], "x": 20.5, "y": 1 }, + { "matrix": [4, 0], "x": 0, "y": 2 }, + { "matrix": [5, 0], "x": 1, "y": 2 }, + { "matrix": [4, 1], "x": 2, "y": 2 }, + { "matrix": [5, 1], "x": 3, "y": 2 }, + { "matrix": [4, 2], "x": 4, "y": 2 }, + { "matrix": [5, 2], "x": 5, "y": 2 }, + { "matrix": [4, 3], "x": 6, "y": 2 }, + { "matrix": [5, 3], "x": 7, "y": 2 }, + { "matrix": [4, 4], "x": 8, "y": 2 }, + { "matrix": [5, 4], "x": 9, "y": 2 }, + { "matrix": [4, 5], "x": 10, "y": 2 }, + { "matrix": [5, 5], "x": 11, "y": 2 }, + { "matrix": [4, 6], "x": 12, "y": 2 }, + { "matrix": [5, 6], "x": 13, "y": 2 }, + { "matrix": [5, 9], "x": 17.5, "y": 2 }, + { "matrix": [4, 9], "x": 18.5, "y": 2 }, + { "matrix": [4, 10], "x": 19.5, "y": 2 }, + { "matrix": [6, 0], "w": 2, "x": 0, "y": 3 }, + { "matrix": [7, 0], "x": 2, "y": 3 }, + { "matrix": [6, 2], "x": 3, "y": 3 }, + { "matrix": [7, 2], "x": 4, "y": 3 }, + { "matrix": [6, 3], "x": 5, "y": 3 }, + { "matrix": [7, 3], "x": 6, "y": 3 }, + { "matrix": [6, 4], "x": 7, "y": 3 }, + { "matrix": [7, 4], "x": 8, "y": 3 }, + { "matrix": [6, 5], "x": 9, "y": 3 }, + { "matrix": [7, 5], "x": 10, "y": 3 }, + { "matrix": [7, 6], "x": 11, "y": 3 }, + { "matrix": [6, 6], "w": 2, "x": 12, "y": 3 }, + { "matrix": [6, 8], "x": 15.25, "y": 3 }, + { "matrix": [7, 8], "x": 17.5, "y": 3 }, + { "matrix": [6, 9], "x": 18.5, "y": 3 }, + { "matrix": [7, 9], "x": 19.5, "y": 3 }, + { "h": 2, "matrix": [9, 10], "x": 20.5, "y": 3 }, + { "matrix": [8, 0], "w": 1.25, "x": 0, "y": 4 }, + { "matrix": [9, 0], "x": 1.25, "y": 4 }, + { "matrix": [8, 1], "w": 1.25, "x": 2.25, "y": 4 }, + { "matrix": [8, 4], "w": 7, "x": 3.5, "y": 4 }, + { "matrix": [9, 4], "w": 1.25, "x": 10.5, "y": 4 }, + { "matrix": [8, 6], "x": 11.75, "y": 4 }, + { "matrix": [9, 6], "w": 1.25, "x": 12.75, "y": 4 }, + { "matrix": [8, 7], "x": 14.25, "y": 4 }, + { "matrix": [9, 7], "x": 15.25, "y": 4 }, + { "matrix": [8, 8], "x": 16.25, "y": 4 }, + { "matrix": [9, 8], "w": 2, "x": 17.5, "y": 4 }, + { "matrix": [8, 10], "x": 19.5, "y": 4 } + ] + } + } +} diff --git a/keyboards/keyten/ortho_slayer/keymaps/default/keymap.c b/keyboards/keyten/ortho_slayer/keymaps/default/keymap.c new file mode 100644 index 0000000000..ea471d31ef --- /dev/null +++ b/keyboards/keyten/ortho_slayer/keymaps/default/keymap.c @@ -0,0 +1,24 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + MO(1), 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_GRV, KC_INS, KC_HOME, KC_PGUP, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_ESC, 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_BSPC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_KP_9, KC_PPLS, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, 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, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT + ), + + [1] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + +}; diff --git a/keyboards/keyten/ortho_slayer/readme.md b/keyboards/keyten/ortho_slayer/readme.md new file mode 100644 index 0000000000..bae4adf3b6 --- /dev/null +++ b/keyboards/keyten/ortho_slayer/readme.md @@ -0,0 +1,27 @@ +# keyten x La-Versa Ortho Slayer + +Ortho Slayer is a full size FRL ortho keyboard inspired by Berserk + +![Ortho Slayer image](https://i.imgur.com/CGYysPM.jpeg) + +* Keyboard Maintainer: [keyten](https://github.com/key10iq) +* Hardware Supported: keyten x La-Versa Ortho Slayer +* Hardware Availability: private GB + +Make example for this keyboard (after setting up your build environment): + + make keyten/ortho_slayer:default + +Flashing example for this keyboard: + + make keyten/ortho_slayer: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 +* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available +* Physical reset button: Hold the button on the back of the PCB From 5f222a3e02ec59620b1df54b07e405201448af06 Mon Sep 17 00:00:00 2001 From: sudo pacman -Syu Date: Tue, 8 Apr 2025 00:03:05 +0700 Subject: [PATCH 270/592] Fix coban pad9a wrong layout in keyboard.json (#25100) --- keyboards/coban/pad9a/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/coban/pad9a/keyboard.json b/keyboards/coban/pad9a/keyboard.json index 1b5efb3456..d34f2b000b 100644 --- a/keyboards/coban/pad9a/keyboard.json +++ b/keyboards/coban/pad9a/keyboard.json @@ -69,7 +69,7 @@ {"label": "key_3", "matrix": [0, 4], "x": 2, "y": 1}, {"label": "key_4", "matrix": [0, 5], "x": 0, "y": 2}, {"label": "key_5", "matrix": [0, 6], "x": 1, "y": 2}, - {"label": "key_6", "matrix": [0, 7], "x": 2, "y": 3} + {"label": "key_6", "matrix": [0, 7], "x": 2, "y": 2} ] } } From 06610c3da6de4208b9c8ab172479bbe0d859b74f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 8 Apr 2025 01:55:49 +0100 Subject: [PATCH 271/592] Remove `CTPC`/`CONVERT_TO_PROTON_C` options (#25111) --- builddefs/converters.mk | 7 ------- data/mappings/info_rules.hjson | 4 ++-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/builddefs/converters.mk b/builddefs/converters.mk index b1e5a1bed2..20ecea5cb9 100644 --- a/builddefs/converters.mk +++ b/builddefs/converters.mk @@ -1,10 +1,3 @@ -# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms -# and should not be replicated for new boards. These will be removed from -# documentation as well as existing keymaps in due course. -ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),) -$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.) -endif - ifneq (,$(filter $(MCU),atmega32u4)) # TODO: opt in rather than assume everything uses a pro micro PIN_COMPATIBLE ?= promicro diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 00685b5b5f..238957f170 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -53,8 +53,8 @@ "WS2812_DRIVER": {"info_key": "ws2812.driver"}, // Items we want flagged in lint - "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, - "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"}, "DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true}, + "CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"}, + "CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"}, "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} } From ca84b570429fdacc3211e85a3d1ee0e213bcd8e4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 8 Apr 2025 03:31:17 +0100 Subject: [PATCH 272/592] Remove direct docs.qmk.fm links from docs (#25113) --- docs/hand_wire.md | 2 +- docs/license_violations.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hand_wire.md b/docs/hand_wire.md index 9aeee7512d..be21cf2cc4 100644 --- a/docs/hand_wire.md +++ b/docs/hand_wire.md @@ -231,7 +231,7 @@ Once you have confirmed that the keyboard is working, if you have used a seperat If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/) -There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help! +There are a lot of possibilities inside the firmware - explore [the documentation](/) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help! ## Links to Other Guides diff --git a/docs/license_violations.md b/docs/license_violations.md index cf7850effc..0bc62102ed 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -85,7 +85,7 @@ Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past. -PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](https://docs.qmk.fm/pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation. +PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation. ## Detection From 2645751ce1aed528056c9bd6acef8a279b3c4a61 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 8 Apr 2025 03:35:43 +0100 Subject: [PATCH 273/592] Add warning when deprecated 'promicro_rp2040' is used (#25112) --- .../converters/promicro_to_promicro_rp2040/pre_converter.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platforms/chibios/converters/promicro_to_promicro_rp2040/pre_converter.mk b/platforms/chibios/converters/promicro_to_promicro_rp2040/pre_converter.mk index 303d3135ce..80111d0f78 100644 --- a/platforms/chibios/converters/promicro_to_promicro_rp2040/pre_converter.mk +++ b/platforms/chibios/converters/promicro_to_promicro_rp2040/pre_converter.mk @@ -1,2 +1,8 @@ CONVERTER:=platforms/chibios/converters/promicro_to_sparkfun_pm2040 ACTIVE_CONVERTER:=sparkfun_pm2040 + +$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) +$(info The 'CONVERT_TO=promicro_rp2040' option is now deprecated.) +$(info Depending on hardware either 'CONVERT_TO=sparkfun_pm2040' or 'CONVERT_TO=rp2040_ce' should be used instead.) +$(info See https://docs.qmk.fm/feature_converters#pro-micro documentation for more information.) +$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) From 0ec96ddd52cd6f4851beb5f387f3bd67b306f8b8 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Tue, 8 Apr 2025 18:13:16 -0400 Subject: [PATCH 274/592] Add Vida to QMK (#24225) Co-authored-by: jack Co-authored-by: Duncan Sutherland --- keyboards/cannonkeys/vida/config.h | 9 + .../cannonkeys/vida/hotswap/keyboard.json | 272 +++++++ .../vida/hotswap/keymaps/default/keymap.c | 27 + keyboards/cannonkeys/vida/info.json | 28 + keyboards/cannonkeys/vida/readme.md | 31 + keyboards/cannonkeys/vida/solderable/config.h | 7 + .../cannonkeys/vida/solderable/halconf.h | 8 + .../cannonkeys/vida/solderable/keyboard.json | 680 ++++++++++++++++++ .../vida/solderable/keymaps/default/keymap.c | 27 + .../vida/solderable/matrix_diagram.md | 24 + .../cannonkeys/vida/solderable/mcuconf.h | 9 + 11 files changed, 1122 insertions(+) create mode 100644 keyboards/cannonkeys/vida/config.h create mode 100644 keyboards/cannonkeys/vida/hotswap/keyboard.json create mode 100644 keyboards/cannonkeys/vida/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/vida/info.json create mode 100644 keyboards/cannonkeys/vida/readme.md create mode 100644 keyboards/cannonkeys/vida/solderable/config.h create mode 100644 keyboards/cannonkeys/vida/solderable/halconf.h create mode 100644 keyboards/cannonkeys/vida/solderable/keyboard.json create mode 100644 keyboards/cannonkeys/vida/solderable/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/vida/solderable/matrix_diagram.md create mode 100644 keyboards/cannonkeys/vida/solderable/mcuconf.h diff --git a/keyboards/cannonkeys/vida/config.h b/keyboards/cannonkeys/vida/config.h new file mode 100644 index 0000000000..4eec357f20 --- /dev/null +++ b/keyboards/cannonkeys/vida/config.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U + +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/keyboards/cannonkeys/vida/hotswap/keyboard.json b/keyboards/cannonkeys/vida/hotswap/keyboard.json new file mode 100644 index 0000000000..a2278354e5 --- /dev/null +++ b/keyboards/cannonkeys/vida/hotswap/keyboard.json @@ -0,0 +1,272 @@ +{ + "keyboard_name": "Vida HS", + "usb": { + "pid": "0x0035" + }, + "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_hhkb"], + "layout_aliases": { + "LAYOUT_60_ansi_split_bs_rshift": "LAYOUT_all" + }, + "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, 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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_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": [2, 12], "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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "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": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/cannonkeys/vida/hotswap/keymaps/default/keymap.c b/keyboards/cannonkeys/vida/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..8ff252918f --- /dev/null +++ b/keyboards/cannonkeys/vida/hotswap/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2023 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _FN1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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(_FN1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL + ), + + [_FN1] = LAYOUT_all( + QK_GESC, 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, _______, _______, _______, _______, _______, _______, QK_BOOT + ) +}; diff --git a/keyboards/cannonkeys/vida/info.json b/keyboards/cannonkeys/vida/info.json new file mode 100644 index 0000000000..8a5ddfe8bd --- /dev/null +++ b/keyboards/cannonkeys/vida/info.json @@ -0,0 +1,28 @@ +{ + "manufacturer": "CannonKeys", + "maintainer": "awkannan", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "GP29", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["GP28", "GP8", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1"], + "rows": ["GP26", "GP27", "GP15", "GP16", "GP17"] + }, + "processor": "RP2040", + "url": "https://cannonkeys.com", + "usb": { + "device_version": "0.0.1", + "vid": "0xCA04" + } +} diff --git a/keyboards/cannonkeys/vida/readme.md b/keyboards/cannonkeys/vida/readme.md new file mode 100644 index 0000000000..2143a7d20a --- /dev/null +++ b/keyboards/cannonkeys/vida/readme.md @@ -0,0 +1,31 @@ +# Vida Keyboard PCB + +Vida PCB from CannonKeys + +This folder has files for both the wired hotswap and solderable versions of the Vida PCB + +The hotswap version does not have as much layout support as the solderable version (no ISO, no split space) +The hotswap version does not support per key LED backlighting + +* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan) +* Hardware Supported: RP2040 +* Hardware Availability: [CannonKeys](https://cannonkeys.com) + + +Make example for this keyboard (after setting up your build environment): + + make cannonkeys/vida:hotswap:default + +Flashing example for this keyboard: + + make cannonkeys/vida: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: + +* **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**: Hold the "BOOTMODE" button on the back of the PCB and briefly press the "RESET" button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/cannonkeys/vida/solderable/config.h b/keyboards/cannonkeys/vida/solderable/config.h new file mode 100644 index 0000000000..9a8669d7a8 --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL RP2040_PWM_CHANNEL_A diff --git a/keyboards/cannonkeys/vida/solderable/halconf.h b/keyboards/cannonkeys/vida/solderable/halconf.h new file mode 100644 index 0000000000..0536c37ff3 --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cannonkeys/vida/solderable/keyboard.json b/keyboards/cannonkeys/vida/solderable/keyboard.json new file mode 100644 index 0000000000..1b8635b443 --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/keyboard.json @@ -0,0 +1,680 @@ +{ + "keyboard_name": "Vida", + "backlight": { + "breathing": true, + "breathing_period": 5, + "levels": 15, + "pin": "GP22" + }, + "features": { + "backlight": true + }, + "usb": { + "pid": "0x0032" + }, + "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_hhkb", "60_iso", "60_iso_split_bs_rshift", "60_iso_tsangan"], + "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, 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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_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": [2, 12], "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, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4} + ] + }, + "LAYOUT_60_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], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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, 6], "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_tsangan_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": [2, 12], "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, 6], "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_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": [2, 12], "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": 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.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, 5], "x": 3.75, "y": 4, "w": 2.25}, + {"matrix": [4, 6], "x": 6, "y": 4, "w": 1.25}, + {"matrix": [4, 9], "x": 7.25, "y": 4, "w": 2.75}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/cannonkeys/vida/solderable/keymaps/default/keymap.c b/keyboards/cannonkeys/vida/solderable/keymaps/default/keymap.c new file mode 100644 index 0000000000..46d376f42d --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2023 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _FN1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL + ), + + [_FN1] = LAYOUT_all( + QK_GESC, 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_UP, _______, BL_DOWN, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT + ) +}; diff --git a/keyboards/cannonkeys/vida/solderable/matrix_diagram.md b/keyboards/cannonkeys/vida/solderable/matrix_diagram.md new file mode 100644 index 0000000000..6de584cb4e --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/matrix_diagram.md @@ -0,0 +1,24 @@ +# Matrix Diagram for CannonKeys Vida + +``` + ┌───────┐ + 2u Backspace │0D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │2C │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ┌─────┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ┌──┴┐2D │ ISO Enter +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │ │1D │ │ +├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ └───┴────┘ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │ +├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ +│40 │41 │42 │46 │4A │4B │4C │4D │ +└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +┌────────┐ ┌──────────┐ +│30 │ 2.25u LShift 2.75u RShift │3C │ +└────────┘ └──────────┘ +┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐ +│40 │41 │42 │46 │4B │4C │4D │ Tsangan/WKL/HHKB +└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +``` diff --git a/keyboards/cannonkeys/vida/solderable/mcuconf.h b/keyboards/cannonkeys/vida/solderable/mcuconf.h new file mode 100644 index 0000000000..200f75c11b --- /dev/null +++ b/keyboards/cannonkeys/vida/solderable/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef RP_PWM_USE_PWM3 +#define RP_PWM_USE_PWM3 TRUE From 575abc48a3064a464caaa6febf0c65215c3eb1d0 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 9 Apr 2025 10:15:14 +1000 Subject: [PATCH 275/592] More Windows->Unix style path fixes. (#25119) --- lib/python/qmk/build_targets.py | 22 +++++++++---------- .../qmk/cli/generate/make_dependencies.py | 4 ++-- lib/python/qmk/commands.py | 3 ++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/python/qmk/build_targets.py b/lib/python/qmk/build_targets.py index e2df029490..df5a5ffb42 100644 --- a/lib/python/qmk/build_targets.py +++ b/lib/python/qmk/build_targets.py @@ -11,7 +11,7 @@ from qmk.commands import find_make, get_make_parallel_args, parse_configurator_j from qmk.keyboard import keyboard_folder from qmk.info import keymap_json from qmk.keymap import locate_keymap -from qmk.path import is_under_qmk_firmware, is_under_qmk_userspace +from qmk.path import is_under_qmk_firmware, is_under_qmk_userspace, unix_style_path # These must be kept in the order in which they're applied to $(TARGET) in the makefiles in order to ensure consistency. TARGET_FILENAME_MODIFIERS = ['FORCE_LAYOUT', 'CONVERT_TO'] @@ -204,11 +204,11 @@ class KeyboardKeymapBuildTarget(BuildTarget): if is_under_qmk_userspace(keymap_location) and not is_under_qmk_firmware(keymap_location): keymap_directory = keymap_location.parent compile_args.extend([ - f'MAIN_KEYMAP_PATH_1={keymap_directory}', - f'MAIN_KEYMAP_PATH_2={keymap_directory}', - f'MAIN_KEYMAP_PATH_3={keymap_directory}', - f'MAIN_KEYMAP_PATH_4={keymap_directory}', - f'MAIN_KEYMAP_PATH_5={keymap_directory}', + f'MAIN_KEYMAP_PATH_1={unix_style_path(keymap_directory)}', + f'MAIN_KEYMAP_PATH_2={unix_style_path(keymap_directory)}', + f'MAIN_KEYMAP_PATH_3={unix_style_path(keymap_directory)}', + f'MAIN_KEYMAP_PATH_4={unix_style_path(keymap_directory)}', + f'MAIN_KEYMAP_PATH_5={unix_style_path(keymap_directory)}', ]) return compile_args @@ -267,11 +267,11 @@ class JsonKeymapBuildTarget(BuildTarget): generated_files_path = intermediate_output / 'src' keymap_json = generated_files_path / 'keymap.json' compile_args.extend([ - f'MAIN_KEYMAP_PATH_1={intermediate_output}', - f'MAIN_KEYMAP_PATH_2={intermediate_output}', - f'MAIN_KEYMAP_PATH_3={intermediate_output}', - f'MAIN_KEYMAP_PATH_4={intermediate_output}', - f'MAIN_KEYMAP_PATH_5={intermediate_output}', + f'MAIN_KEYMAP_PATH_1={unix_style_path(intermediate_output)}', + f'MAIN_KEYMAP_PATH_2={unix_style_path(intermediate_output)}', + f'MAIN_KEYMAP_PATH_3={unix_style_path(intermediate_output)}', + f'MAIN_KEYMAP_PATH_4={unix_style_path(intermediate_output)}', + f'MAIN_KEYMAP_PATH_5={unix_style_path(intermediate_output)}', f'KEYMAP_JSON={keymap_json}', f'KEYMAP_PATH={generated_files_path}', ]) diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py index 331132a20f..9548187888 100755 --- a/lib/python/qmk/cli/generate/make_dependencies.py +++ b/lib/python/qmk/cli/generate/make_dependencies.py @@ -8,7 +8,7 @@ from argcomplete.completers import FilesCompleter from qmk.commands import dump_lines from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.keymap import keymap_completer, locate_keymap -from qmk.path import normpath, FileType +from qmk.path import normpath, FileType, unix_style_path @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON.') @@ -53,4 +53,4 @@ def generate_make_dependencies(cli): for file in interesting_files: check_files.append(Path('users') / cli.args.keymap / file) - dump_lines(cli.args.output, [f'generated-files: $(wildcard {found})\n' for found in check_files]) + dump_lines(cli.args.output, [f'generated-files: $(wildcard {unix_style_path(found)})\n' for found in check_files]) diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 0e1876ca7a..ac1455967d 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -12,6 +12,7 @@ from qmk.constants import QMK_USERSPACE, HAS_QMK_USERSPACE from qmk.json_schema import json_load, validate from qmk.keyboard import keyboard_alias_definitions from qmk.util import maybe_exit +from qmk.path import unix_style_path def find_make(): @@ -85,7 +86,7 @@ def build_environment(args): envs = parse_env_vars(args) if HAS_QMK_USERSPACE: - envs['QMK_USERSPACE'] = Path(QMK_USERSPACE).resolve() + envs['QMK_USERSPACE'] = unix_style_path(Path(QMK_USERSPACE).resolve()) return envs From a0f40d9410d1ecac4b498b999ebd04e65ef762f4 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 10 Apr 2025 00:28:30 +1000 Subject: [PATCH 276/592] Include `math.h` where necessary. (#25122) --- keyboards/rubi/lib/calc.c | 1 + keyboards/terrazzo/terrazzo.c | 1 + 2 files changed, 2 insertions(+) diff --git a/keyboards/rubi/lib/calc.c b/keyboards/rubi/lib/calc.c index 7796a9be45..b289fdb54b 100644 --- a/keyboards/rubi/lib/calc.c +++ b/keyboards/rubi/lib/calc.c @@ -13,6 +13,7 @@ This is the modified version of [calculator by MWWorks](https://github.com/MWWor Feel free to fix it! I think it needs to detect the precision of the two operands and then figure out what the precision of the result should be */ +#include #include "rubi.h" static uint8_t calc_current_operand = 0; diff --git a/keyboards/terrazzo/terrazzo.c b/keyboards/terrazzo/terrazzo.c index 2a3d2a8cc6..a629e5dceb 100644 --- a/keyboards/terrazzo/terrazzo.c +++ b/keyboards/terrazzo/terrazzo.c @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include "terrazzo.h" #ifdef LED_MATRIX_ENABLE From 6b8670fe8fc17115a2d20b4eabb9139cc4cde38e Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 10 Apr 2025 10:43:25 +1000 Subject: [PATCH 277/592] Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions (#25121) --- platforms/chibios/errno.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 platforms/chibios/errno.h diff --git a/platforms/chibios/errno.h b/platforms/chibios/errno.h new file mode 100644 index 0000000000..a411ed9821 --- /dev/null +++ b/platforms/chibios/errno.h @@ -0,0 +1,13 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include_next + +// Newer versions of picolibc don't seem to provide `__errno_r(r)` in the header file, but is used by ChibiOS. +#ifndef __errno_r +# ifdef __REENT_ERRNO +# define __errno_r(r) _REENT_ERRNO(r) +# else +# define __errno_r(r) (errno) +# endif +#endif From f549b30760a69f8279390469df0de2bcab434c57 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Fri, 11 Apr 2025 00:26:11 -0500 Subject: [PATCH 278/592] chore: Allow disabling underglow on Work Louder devices (#25123) (#25120) * Allow disabling Underglow on Work Louder devices Allows disabling Underglow on Work Louder devices by using `RGBLIGHT_ENABLE = no` on rules.mk * Update keyboards/work_louder/rgb_functions.c Suggested by @zvecr on review. Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- keyboards/work_louder/rgb_functions.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/work_louder/rgb_functions.c b/keyboards/work_louder/rgb_functions.c index 15d0f432a0..b0d89d8511 100644 --- a/keyboards/work_louder/rgb_functions.c +++ b/keyboards/work_louder/rgb_functions.c @@ -14,10 +14,10 @@ * along with this program. If not, see . */ -#include "rgblight.h" -#include "rgb_matrix.h" - #ifdef RGBLIGHT_ENABLE + +#include "rgblight.h" + #undef WS2812_DI_PIN #define WS2812_DI_PIN RGBLIGHT_DI_PIN From e27dd0f26faa3cbe787e539b2435450fffa3709a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 11 Apr 2025 13:19:02 +0100 Subject: [PATCH 279/592] Exclude external userspace from lint checking (#24680) --- lib/python/qmk/cli/lint.py | 2 +- lib/python/qmk/keymap.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index bcf905f579..bc14b61e8b 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -26,7 +26,7 @@ def _list_defaultish_keymaps(kb): defaultish.extend(INVALID_KM_NAMES) keymaps = set() - for x in list_keymaps(kb): + for x in list_keymaps(kb, include_userspace=False): if x in defaultish or x.startswith('default'): keymaps.add(x) diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 8e36461722..b7138aa4a1 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -399,7 +399,7 @@ def is_keymap_target(keyboard, keymap): return False -def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=False): +def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=False, include_userspace=True): """List the available keymaps for a keyboard. Args: @@ -418,14 +418,19 @@ def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=Fa fullpath When set to True the full path of the keymap relative to the `qmk_firmware` root will be provided. + include_userspace + When set to True, also search userspace for available keymaps + Returns: a sorted list of valid keymap names. """ names = set() + has_userspace = HAS_QMK_USERSPACE and include_userspace + # walk up the directory tree until keyboards_dir # and collect all directories' name with keymap.c file in it - for search_dir in [QMK_FIRMWARE, QMK_USERSPACE] if HAS_QMK_USERSPACE else [QMK_FIRMWARE]: + for search_dir in [QMK_FIRMWARE, QMK_USERSPACE] if has_userspace else [QMK_FIRMWARE]: keyboards_dir = search_dir / Path('keyboards') kb_path = keyboards_dir / keyboard @@ -443,7 +448,7 @@ def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=Fa info = info_json(keyboard) community_parents = list(Path('layouts').glob('*/')) - if HAS_QMK_USERSPACE and (Path(QMK_USERSPACE) / "layouts").exists(): + if has_userspace and (Path(QMK_USERSPACE) / "layouts").exists(): community_parents.append(Path(QMK_USERSPACE) / "layouts") for community_parent in community_parents: From daf696894773d0884bb6d0c542966d6db0f1af4d Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Fri, 11 Apr 2025 11:26:13 -0500 Subject: [PATCH 280/592] fix: Fix startup sound for Preonic (#25132) (#25133) Add `AUDIO_INIT_DELAY ` to config.h to resolve --- keyboards/preonic/config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/preonic/config.h b/keyboards/preonic/config.h index c47b9e7ed4..67ff77912c 100644 --- a/keyboards/preonic/config.h +++ b/keyboards/preonic/config.h @@ -20,6 +20,8 @@ along with this program. If not, see . #define AUDIO_VOICES #define AUDIO_PIN C6 +#define AUDIO_INIT_DELAY + /* * Feature disable options * These options are also useful to firmware size reduction. From ba72094b695ad98419ae12c61c8aebb8d55c5a44 Mon Sep 17 00:00:00 2001 From: "Christian C. Berclaz" Date: Sun, 13 Apr 2025 18:11:18 +0200 Subject: [PATCH 281/592] New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) (#24690) * Added a default firmware and layout for the WindStudio Wind X R1 keyboard. * Wind X R1: cleaned-up the folders to make clear that this firmware is for the release 1 of this keyboard. * Delete keyboards/windstudio/wind_x/R1 directory Removing the uppercase R1 folder * feat(cannonkeys/savage65): Added layout to keyboard.json - Added the layout LAYOUT_65_ansi_blocker_tsangan_split_bs to the community layouts. --- keyboards/cannonkeys/savage65/keyboard.json | 325 +++++++++++--------- 1 file changed, 188 insertions(+), 137 deletions(-) diff --git a/keyboards/cannonkeys/savage65/keyboard.json b/keyboards/cannonkeys/savage65/keyboard.json index bc9c1d77e5..471b785633 100644 --- a/keyboards/cannonkeys/savage65/keyboard.json +++ b/keyboards/cannonkeys/savage65/keyboard.json @@ -1,140 +1,62 @@ { - "keyboard_name": "Savage65", "manufacturer": "CannonKeys", - "url": "https://cannonkeys.com", + "keyboard_name": "Savage65", "maintainer": "awkannan", - "usb": { - "vid": "0xCA04", - "pid": "0x5A65", - "device_version": "0.0.1" + "backlight": { + "breathing": true, + "levels": 6, + "pin": "A6" + }, + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "backlight": true, + "bootmagic": true, + "command": true, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true }, "matrix_pins": { "cols": ["A5", "B10", "A3", "A2", "B0", "A9", "C13", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"], "rows": ["B12", "B11", "B14", "A8", "A1"] }, - "diode_direction": "COL2ROW", - "backlight": { - "pin": "A6", - "levels": 6, - "breathing": true - }, - "rgblight": { - "led_count": 20, - "animations": { - "breathing": true, - "rainbow_mood": true, - "rainbow_swirl": true, - "snake": true, - "knight": true, - "christmas": true, - "static_gradient": true, - "rgb_test": true, - "alternating": true, - "twinkle": true - } - }, - "ws2812": { - "pin": "B15", - "driver": "spi" - }, "processor": "STM32F072", - "bootloader": "stm32-dfu", - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "console": true, - "command": true, - "nkro": true, - "backlight": true, - "rgblight": true - }, "qmk": { "locking": { "enabled": true, "resync": true } }, - "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_iso_blocker"], - "layouts": { - "LAYOUT_default": { - "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": [0, 15], "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": [1, 15], "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": [2, 15], "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": [3, 15], "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, 10], "x": 10, "y": 4, "w": 1.25}, - {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, - {"matrix": [4, 12], "x": 13, "y": 4}, - {"matrix": [4, 13], "x": 14, "y": 4}, - {"matrix": [4, 15], "x": 15, "y": 4} - ] + "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": 20 + }, + "url": "https://cannonkeys.com", + "usb": { + "device_version": "0.0.1", + "pid": "0x5A65", + "vid": "0xCA04" + }, + "ws2812": { + "driver": "spi", + "pin": "B15" + }, + "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs", "65_iso_blocker"], + "layouts": { "LAYOUT_65_ansi_blocker": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, @@ -152,7 +74,6 @@ {"matrix": [0, 12], "x": 12, "y": 0}, {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, {"matrix": [0, 15], "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}, @@ -168,7 +89,6 @@ {"matrix": [1, 12], "x": 12.5, "y": 1}, {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, {"matrix": [1, 15], "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}, @@ -183,7 +103,6 @@ {"matrix": [2, 11], "x": 11.75, "y": 2}, {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, {"matrix": [2, 15], "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}, @@ -198,7 +117,6 @@ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, {"matrix": [3, 13], "x": 14, "y": 3}, {"matrix": [3, 15], "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}, @@ -228,7 +146,6 @@ {"matrix": [0, 13], "x": 13, "y": 0}, {"matrix": [0, 14], "x": 14, "y": 0}, {"matrix": [0, 15], "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}, @@ -244,7 +161,6 @@ {"matrix": [1, 12], "x": 12.5, "y": 1}, {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, {"matrix": [1, 15], "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}, @@ -259,7 +175,6 @@ {"matrix": [2, 11], "x": 11.75, "y": 2}, {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, {"matrix": [2, 15], "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}, @@ -274,7 +189,6 @@ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, {"matrix": [3, 13], "x": 14, "y": 3}, {"matrix": [3, 15], "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}, @@ -303,7 +217,6 @@ {"matrix": [0, 12], "x": 12, "y": 0}, {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, {"matrix": [0, 15], "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}, @@ -319,7 +232,6 @@ {"matrix": [1, 12], "x": 12.5, "y": 1}, {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, {"matrix": [1, 15], "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}, @@ -334,7 +246,6 @@ {"matrix": [2, 11], "x": 11.75, "y": 2}, {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, {"matrix": [2, 15], "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}, @@ -349,7 +260,77 @@ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, {"matrix": [3, 13], "x": 14, "y": 3}, {"matrix": [3, 15], "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, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan_split_bs": { + "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": [0, 15], "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": [1, 15], "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": [2, 15], "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": [3, 15], "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}, @@ -377,7 +358,6 @@ {"matrix": [0, 12], "x": 12, "y": 0}, {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, {"matrix": [0, 15], "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}, @@ -392,7 +372,6 @@ {"matrix": [1, 11], "x": 11.5, "y": 1}, {"matrix": [1, 12], "x": 12.5, "y": 1}, {"matrix": [1, 15], "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}, @@ -408,7 +387,6 @@ {"matrix": [2, 12], "x": 12.75, "y": 2}, {"matrix": [2, 13], "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}, {"matrix": [3, 1], "x": 1.25, "y": 3}, {"matrix": [3, 2], "x": 2.25, "y": 3}, @@ -424,7 +402,80 @@ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, {"matrix": [3, 13], "x": 14, "y": 3}, {"matrix": [3, 15], "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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4} + ] + }, + "LAYOUT_default": { + "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": [0, 15], "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": [1, 15], "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": [2, 15], "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": [3, 15], "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}, From e17878ad1571b21f33901fe555f1ed73e69a685a Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Mon, 14 Apr 2025 02:14:34 +1000 Subject: [PATCH 282/592] kradoindustries_promenade: add LAYOUT_1x2u (#25090) --- .../kradoindustries/promenade/keyboard.json | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/keyboards/kradoindustries/promenade/keyboard.json b/keyboards/kradoindustries/promenade/keyboard.json index 028ba1b24d..1de6ef7315 100644 --- a/keyboards/kradoindustries/promenade/keyboard.json +++ b/keyboards/kradoindustries/promenade/keyboard.json @@ -201,6 +201,81 @@ {"matrix": [4, 13], "x":13.5, "y":4, "w":1.5} ] }, + "LAYOUT_1x2u": { + "layout": [ + {"matrix": [0, 0], "x":0, "y":0, "w":1.5}, + {"matrix": [0, 1], "x":1.5, "y":0}, + {"matrix": [0, 2], "x":2.5, "y":0}, + {"matrix": [0, 3], "x":3.5, "y":0}, + {"matrix": [0, 4], "x":4.5, "y":0}, + {"matrix": [0, 5], "x":5.5, "y":0}, + {"matrix": [0, 6], "x":6.5, "y":0}, + {"matrix": [0, 7], "x":7.5, "y":0}, + {"matrix": [0, 8], "x":8.5, "y":0}, + {"matrix": [0, 9], "x":9.5, "y":0}, + {"matrix": [0, 10], "x":10.5, "y":0}, + {"matrix": [0, 11], "x":11.5, "y":0}, + {"matrix": [0, 12], "x":12.5, "y":0}, + {"matrix": [0, 13], "x":13.5, "y":0, "w":1.5}, + + {"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, "h":1.5}, + {"matrix": [1, 7], "x":7.5, "y":1, "h":1.5}, + {"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.5}, + {"matrix": [2, 1], "x":1.5, "y":2}, + {"matrix": [2, 2], "x":2.5, "y":2}, + {"matrix": [2, 3], "x":3.5, "y":2}, + {"matrix": [2, 4], "x":4.5, "y":2}, + {"matrix": [2, 5], "x":5.5, "y":2}, + {"matrix": [2, 8], "x":8.5, "y":2}, + {"matrix": [2, 9], "x":9.5, "y":2}, + {"matrix": [2, 10], "x":10.5, "y":2}, + {"matrix": [2, 11], "x":11.5, "y":2}, + {"matrix": [2, 12], "x":12.5, "y":2}, + {"matrix": [2, 13], "x":13.5, "y":2, "w":1.5}, + + {"matrix": [3, 0], "x":0, "y":3, "w":1.5}, + {"matrix": [3, 1], "x":1.5, "y":3}, + {"matrix": [3, 2], "x":2.5, "y":3}, + {"matrix": [3, 3], "x":3.5, "y":3}, + {"matrix": [3, 4], "x":4.5, "y":3}, + {"matrix": [3, 5], "x":5.5, "y":3}, + {"matrix": [3, 6], "x":6.5, "y":2.5, "h":1.5}, + {"matrix": [3, 7], "x":7.5, "y":2.5, "h":1.5}, + {"matrix": [3, 8], "x":8.5, "y":3}, + {"matrix": [3, 9], "x":9.5, "y":3}, + {"matrix": [3, 10], "x":10.5, "y":3}, + {"matrix": [3, 11], "x":11.5, "y":3}, + {"matrix": [3, 12], "x":12.5, "y":3}, + {"matrix": [3, 13], "x":13.5, "y":3, "w":1.5}, + + {"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}, + {"matrix": [4, 3], "x":3.5, "y":4}, + {"matrix": [4, 4], "x":4.5, "y":4}, + {"matrix": [4, 5], "x":5.5, "y":4}, + {"matrix": [4, 6], "x":6.5, "y":4, "w":2}, + {"matrix": [4, 8], "x":8.5, "y":4}, + {"matrix": [4, 9], "x":9.5, "y":4}, + {"matrix": [4, 10], "x":10.5, "y":4}, + {"matrix": [4, 11], "x":11.5, "y":4}, + {"matrix": [4, 12], "x":12.5, "y":4}, + {"matrix": [4, 13], "x":13.5, "y":4, "w":1.5} + ] + }, "LAYOUT_2x3u": { "layout": [ {"matrix": [0, 0], "x":0, "y":0, "w":1.5}, From d99eb01ee48ad6ade4904a79a5c7a3efe4861eba Mon Sep 17 00:00:00 2001 From: Sylvain Huguet Date: Sun, 13 Apr 2025 18:19:12 +0200 Subject: [PATCH 283/592] Update shuguet/shu89 (#24780) * Update keyboard.json Update mod keys location in RGB layout. * Update keyboard.json * Update keyboards/shuguet/shu89/keyboard.json Co-authored-by: Ryan --------- Co-authored-by: Ryan --- keyboards/shuguet/shu89/keyboard.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/keyboards/shuguet/shu89/keyboard.json b/keyboards/shuguet/shu89/keyboard.json index 072734b544..c3e0d0e61a 100644 --- a/keyboards/shuguet/shu89/keyboard.json +++ b/keyboards/shuguet/shu89/keyboard.json @@ -217,34 +217,34 @@ {"matrix": [0, 8], "x": 80, "y": 0, "flags": 4}, {"matrix": [0, 9], "x": 104, "y": 0, "flags": 4}, - {"matrix": [1, 4], "x": 16, "y": 13, "flags": 4}, + {"matrix": [1, 4], "x": 0, "y": 13, "flags": 4}, + {"matrix": [2, 4], "x": 20, "y": 13, "flags": 4}, {"matrix": [1, 5], "x": 32, "y": 13, "flags": 4}, {"matrix": [1, 6], "x": 48, "y": 13, "flags": 4}, {"matrix": [1, 7], "x": 64, "y": 13, "flags": 4}, {"matrix": [1, 8], "x": 80, "y": 13, "flags": 4}, {"matrix": [1, 9], "x": 96, "y": 13, "flags": 4}, - {"matrix": [2, 4], "x": 0, "y": 13, "flags": 4}, - + + {"matrix": [3, 4], "x": 0, "y": 26, "flags": 4}, {"matrix": [2, 5], "x": 20, "y": 26, "flags": 4}, {"matrix": [2, 6], "x": 36, "y": 26, "flags": 4}, {"matrix": [2, 7], "x": 52, "y": 26, "flags": 4}, {"matrix": [2, 8], "x": 68, "y": 26, "flags": 4}, {"matrix": [2, 9], "x": 84, "y": 26, "flags": 4}, - {"matrix": [3, 4], "x": 0, "y": 26, "flags": 4}, + {"matrix": [4, 4], "x": 0, "y": 39, "flags": 5}, {"matrix": [3, 5], "x": 24, "y": 39, "flags": 4}, {"matrix": [3, 6], "x": 40, "y": 39, "flags": 4}, {"matrix": [3, 7], "x": 56, "y": 39, "flags": 4}, {"matrix": [3, 8], "x": 72, "y": 39, "flags": 4}, {"matrix": [3, 9], "x": 88, "y": 39, "flags": 4}, - {"matrix": [4, 4], "x": 0, "y": 39, "flags": 5}, + {"matrix": [5, 4], "x": 0, "y": 51, "flags": 5}, {"matrix": [4, 5], "x": 28, "y": 51, "flags": 4}, {"matrix": [4, 6], "x": 44, "y": 51, "flags": 4}, {"matrix": [4, 7], "x": 60, "y": 51, "flags": 4}, {"matrix": [4, 8], "x": 76, "y": 51, "flags": 4}, {"matrix": [4, 9], "x": 92, "y": 51, "flags": 4}, - {"matrix": [5, 4], "x": 0, "y": 51, "flags": 5}, {"matrix": [5, 5], "x": 0, "y": 64, "flags": 5}, {"matrix": [5, 6], "x": 20, "y": 64, "flags": 5}, @@ -274,6 +274,7 @@ {"matrix": [7, 8], "x": 220, "y": 13, "flags": 4}, {"matrix": [7, 9], "x": 224, "y": 13, "flags": 4}, + {"matrix": [9, 0], "x": 100, "y": 26, "flags": 4}, {"matrix": [8, 0], "x": 116, "y": 26, "flags": 4}, {"matrix": [8, 1], "x": 132, "y": 26, "flags": 4}, {"matrix": [8, 2], "x": 148, "y": 26, "flags": 4}, @@ -284,23 +285,22 @@ {"matrix": [8, 7], "x": 216, "y": 26, "flags": 4}, {"matrix": [8, 8], "x": 220, "y": 26, "flags": 4}, {"matrix": [8, 9], "x": 224, "y": 26, "flags": 4}, - {"matrix": [9, 0], "x": 100, "y": 26, "flags": 4}, - + + {"matrix": [10, 0], "x": 104, "y": 39, "flags": 4}, {"matrix": [9, 1], "x": 120, "y": 39, "flags": 4}, {"matrix": [9, 2], "x": 136, "y": 39, "flags": 4}, {"matrix": [9, 3], "x": 152, "y": 39, "flags": 4}, {"matrix": [9, 4], "x": 168, "y": 39, "flags": 4}, {"matrix": [9, 5], "x": 184, "y": 39, "flags": 4}, {"matrix": [9, 6], "x": 200, "y": 39, "flags": 4}, - {"matrix": [10, 0], "x": 104, "y": 39, "flags": 4}, - + + {"matrix": [11, 0], "x": 108, "y": 51, "flags": 4}, {"matrix": [10, 1], "x": 124, "y": 51, "flags": 4}, {"matrix": [10, 2], "x": 140, "y": 51, "flags": 4}, {"matrix": [10, 3], "x": 156, "y": 51, "flags": 4}, {"matrix": [10, 4], "x": 172, "y": 51, "flags": 4}, {"matrix": [10, 6], "x": 188, "y": 51, "flags": 5}, {"matrix": [10, 8], "x": 216, "y": 51, "flags": 4}, - {"matrix": [11, 0], "x": 108, "y": 51, "flags": 4}, {"matrix": [11, 1], "x": 118, "y": 64, "flags": 4}, {"matrix": [11, 3], "x": 144, "y": 64, "flags": 5}, From 1388daa0cc2f9e3e171de8ed5388ee94c8a9103a Mon Sep 17 00:00:00 2001 From: suikagiken <115451678+suikagiken@users.noreply.github.com> Date: Mon, 14 Apr 2025 01:20:42 +0900 Subject: [PATCH 284/592] [Keyboard] Add suika83opti (#24991) --- .../suikagiken/suika83opti/keyboard.json | 115 ++++++++++++++++++ .../suika83opti/keymaps/default/keymap.json | 24 ++++ keyboards/suikagiken/suika83opti/readme.md | 43 +++++++ 3 files changed, 182 insertions(+) create mode 100644 keyboards/suikagiken/suika83opti/keyboard.json create mode 100644 keyboards/suikagiken/suika83opti/keymaps/default/keymap.json create mode 100644 keyboards/suikagiken/suika83opti/readme.md diff --git a/keyboards/suikagiken/suika83opti/keyboard.json b/keyboards/suikagiken/suika83opti/keyboard.json new file mode 100644 index 0000000000..d9876434fe --- /dev/null +++ b/keyboards/suikagiken/suika83opti/keyboard.json @@ -0,0 +1,115 @@ +{ + "manufacturer": "suikagiken", + "keyboard_name": "suika83opti", + "maintainer": "suikagiken", + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15"], + "rows": ["GP29", "GP28", "GP27", "GP26", "GP25", "GP24"] + }, + "url": "https://github.com/suikagiken/suika83opti", + "usb": { + "device_version": "1.0.0", + "vid": "0x4B48", + "pid": "0x0101" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0,0], "x": 0, "y": 0}, + {"matrix": [0,1], "x": 1.5, "y": 0}, + {"matrix": [0,2], "x": 2.5, "y": 0}, + {"matrix": [0,3], "x": 3.5, "y": 0}, + {"matrix": [0,4], "x": 4.5, "y": 0}, + {"matrix": [0,5], "x": 7, "y": 0}, + {"matrix": [0,6], "x": 8, "y": 0}, + {"matrix": [0,8], "x": 9, "y": 0}, + {"matrix": [0,9], "x": 10, "y": 0}, + {"matrix": [0,10], "x": 12.75, "y": 0}, + {"matrix": [0,11], "x": 13.75, "y": 0}, + {"matrix": [0,12], "x": 14.75, "y": 0}, + {"matrix": [0,13], "x": 15.75, "y": 0}, + {"matrix": [0,15], "x": 17.25, "y": 0}, + {"matrix": [1,0], "x": 0, "y": 1.5}, + {"matrix": [1,1], "x": 1, "y": 1.5}, + {"matrix": [1,2], "x": 2, "y": 1.5}, + {"matrix": [1,3], "x": 3, "y": 1.5}, + {"matrix": [1,4], "x": 4, "y": 1.5}, + {"matrix": [1,5], "x": 5, "y": 1.5}, + {"matrix": [1,6], "x": 6, "y": 1.5}, + {"matrix": [1,7], "x": 8.5, "y": 1.5}, + {"matrix": [1,9], "x": 11.5, "y": 1.5}, + {"matrix": [1,10], "x": 12.5, "y": 1.5}, + {"matrix": [1,11], "x": 13.5, "y": 1.5}, + {"matrix": [1,12], "x": 14.5, "y": 1.5}, + {"matrix": [1,13], "x": 15.5, "y": 1.5}, + {"matrix": [1,15], "x": 17.25, "y": 1.5, "h": 1.5}, + {"matrix": [2,0], "x": 0, "y": 2.5, "w": 1.5}, + {"matrix": [2,1], "x": 1.5, "y": 2.5}, + {"matrix": [2,2], "x": 2.5, "y": 2.5}, + {"matrix": [2,3], "x": 3.5, "y": 2.5}, + {"matrix": [2,4], "x": 4.5, "y": 2.5}, + {"matrix": [2,5], "x": 5.5, "y": 2.5}, + {"matrix": [2,7], "x": 8.5, "y": 2.5}, + {"matrix": [2,9], "x": 11, "y": 2.5}, + {"matrix": [2,10], "x": 12, "y": 2.5}, + {"matrix": [2,11], "x": 13, "y": 2.5}, + {"matrix": [2,12], "x": 14, "y": 2.5}, + {"matrix": [2,13], "x": 15, "y": 2.5}, + {"matrix": [2,14], "x": 16, "y": 2.5}, + {"matrix": [3,0], "x": 0.25, "y": 3.5, "w": 1.5}, + {"matrix": [3,1], "x": 1.75, "y": 3.5}, + {"matrix": [3,2], "x": 2.75, "y": 3.5}, + {"matrix": [3,3], "x": 3.75, "y": 3.5}, + {"matrix": [3,4], "x": 4.75, "y": 3.5}, + {"matrix": [3,5], "x": 5.75, "y": 3.5}, + {"matrix": [3,6], "x": 8, "y": 3.5}, + {"matrix": [3,8], "x": 9, "y": 3.5}, + {"matrix": [3,9], "x": 11.25, "y": 3.5}, + {"matrix": [3,10], "x": 12.25, "y": 3.5}, + {"matrix": [3,11], "x": 13.25, "y": 3.5}, + {"matrix": [3,12], "x": 14.25, "y": 3.5}, + {"matrix": [3,13], "x": 15.25, "y": 3.5}, + {"matrix": [3,14], "x": 16.25, "y": 3.5}, + {"matrix": [3,15], "x": 17.25, "y": 3, "h": 1.5}, + {"matrix": [4,0], "x": 0.75, "y": 4.5, "w": 1.5}, + {"matrix": [4,1], "x": 2.25, "y": 4.5}, + {"matrix": [4,2], "x": 3.25, "y": 4.5}, + {"matrix": [4,3], "x": 4.25, "y": 4.5}, + {"matrix": [4,4], "x": 5.25, "y": 4.5}, + {"matrix": [4,5], "x": 6.25, "y": 4.5}, + {"matrix": [4,7], "x": 8.5, "y": 4.5}, + {"matrix": [4,9], "x": 10.75, "y": 4.5}, + {"matrix": [4,10], "x": 11.75, "y": 4.5}, + {"matrix": [4,11], "x": 12.75, "y": 4.5}, + {"matrix": [4,12], "x": 13.75, "y": 4.5}, + {"matrix": [4,13], "x": 14.75, "y": 4.5}, + {"matrix": [4,14], "x": 15.75, "y": 4.5}, + {"matrix": [4,15], "x": 16.75, "y": 4.5}, + {"matrix": [5,0], "x": 1.25, "y": 5.5, "w": 1.5}, + {"matrix": [5,1], "x": 2.75, "y": 5.5}, + {"matrix": [5,2], "x": 3.75, "y": 5.5}, + {"matrix": [5,3], "x": 4.75, "y": 5.5}, + {"matrix": [5,4], "x": 5.75, "y": 5.5, "w": 1.5}, + {"matrix": [5,6], "x": 7.5, "y": 5.5}, + {"matrix": [5,7], "x": 8.5, "y": 5.5}, + {"matrix": [5,8], "x": 9.5, "y": 5.5}, + {"matrix": [5,9], "x": 10.75, "y": 5.5, "w": 1.5}, + {"matrix": [5,10], "x": 12.25, "y": 5.5}, + {"matrix": [5,11], "x": 13.25, "y": 5.5}, + {"matrix": [5,12], "x": 14.25, "y": 5.5}, + {"matrix": [5,13], "x": 15.25, "y": 5.5, "w": 1.5} + ] + } + } +} diff --git a/keyboards/suikagiken/suika83opti/keymaps/default/keymap.json b/keyboards/suikagiken/suika83opti/keymaps/default/keymap.json new file mode 100644 index 0000000000..8434463eb8 --- /dev/null +++ b/keyboards/suikagiken/suika83opti/keymaps/default/keymap.json @@ -0,0 +1,24 @@ +{ + "author": "suikagiken", + "keyboard": "suikagiken/suika83opti", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "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_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_PSCR", "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_MINS", "KC_BSPC", + "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_EQL" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_BSLS", + "KC_CAPS", "KC_A" , "KC_S" , "KC_D" , "KC_F" , "KC_G" , "KC_LBRC", "KC_RBRC", "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_UP" , "KC_B" , "KC_N" , "KC_M" , "KC_COMM", "KC_DOT" , "KC_SLSH", "KC_RSFT", + "KC_LCTL", "KC_LWIN", "KC_LOPT", "MO(1)" , "KC_SPC" , "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_SPC" , "MO(1)" , "KC_ROPT", "KC_APP" , "KC_RCTL" + ], + [ + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_PGUP", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_HOME", "KC_PGDN", "KC_END" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ] + ] +} diff --git a/keyboards/suikagiken/suika83opti/readme.md b/keyboards/suikagiken/suika83opti/readme.md new file mode 100644 index 0000000000..cbd8395087 --- /dev/null +++ b/keyboards/suikagiken/suika83opti/readme.md @@ -0,0 +1,43 @@ +# suika83opti +(English Follows Japanese) + +## 概要 +![suika83opti1](https://imgur.com/eJOI2Ax.jpg) +![suika83opti2](https://imgur.com/kVtW5gt.jpg) + +suika83optiはロースタッガードの一体型エルゴキーボードです。 +ファンクションキーや矢印キーなど、コンパクトキーボードでは省略されがちなキーも備えており、フルキーボードからの移行も容易です。 + +* 制作 : すいか技研 (Website: https://suikagiken.net GitHub: [suikagiken](https://github.com/suikagiken) ) +* 販売 : すいか技研の[booth](https://suikagiken.booth.pm/)にて販売予定です + +## ビルドガイド + +[こちら](https://github.com/suikagiken/suika83opti/blob/main/buildguide_1.0.md)からご覧下さい。 + +--- + +## Overview + +suika83opti is a row-staggered ergonomic keyboard with 85 keys. It has function keys or arrow keys, which are omitted in compact keyboards, making it easy to switch from a conventional full keyboard. + +* Keyboard Maintainer: [suikagiken](https://github.com/suikagiken) +* Hardware Availability: Available at [booth](https://suikagiken.booth.pm/). + +Make example for this keyboard (after setting up your build environment): + + make suikagiken/suika83opti:default + +Flashing example for this keyboard: + + make suikagiken/suika83opti: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 a7bf8e64a584c9a0930f4aa701a09a6e1de7e117 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Sun, 13 Apr 2025 18:36:13 +0200 Subject: [PATCH 285/592] [chore]: move and rename mouse/scroll min/max defines (#25141) * protocol: move {XY/HV}_REPORT_{MIN,MAX} into report.h ..to allow easier re-use in other code implementations. * protocol: rename {XY/HV}_REPORT_{MIN/MAX} to MOUSE_REPORT_{XY/HV}_{MIN/MAX} ..to avoid naming collisions. --- drivers/sensors/pimoroni_trackball.c | 12 ++++++------ quantum/pointing_device/pointing_device.c | 16 ++++++++-------- quantum/pointing_device/pointing_device.h | 10 +--------- tmk_core/protocol/report.h | 8 ++++++++ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/drivers/sensors/pimoroni_trackball.c b/drivers/sensors/pimoroni_trackball.c index afbe3d5b77..06e5042953 100644 --- a/drivers/sensors/pimoroni_trackball.c +++ b/drivers/sensors/pimoroni_trackball.c @@ -101,12 +101,12 @@ int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_di } mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t *offset) { - if (*offset > XY_REPORT_MAX) { - *offset -= XY_REPORT_MAX; - return (mouse_xy_report_t)XY_REPORT_MAX; - } else if (*offset < XY_REPORT_MIN) { - *offset += XY_REPORT_MAX; - return (mouse_xy_report_t)XY_REPORT_MIN; + if (*offset > MOUSE_REPORT_XY_MAX) { + *offset -= MOUSE_REPORT_XY_MAX; + return (mouse_xy_report_t)MOUSE_REPORT_XY_MAX; + } else if (*offset < MOUSE_REPORT_XY_MIN) { + *offset += MOUSE_REPORT_XY_MAX; + return (mouse_xy_report_t)MOUSE_REPORT_XY_MIN; } else { mouse_xy_report_t temp_return = *offset; *offset = 0; diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c index cac2875fc8..e26416f968 100644 --- a/quantum/pointing_device/pointing_device.c +++ b/quantum/pointing_device/pointing_device.c @@ -404,10 +404,10 @@ void pointing_device_set_cpi_on_side(bool left, uint16_t cpi) { * @return mouse_hv_report_t clamped value */ static inline mouse_hv_report_t pointing_device_hv_clamp(hv_clamp_range_t value) { - if (value < HV_REPORT_MIN) { - return HV_REPORT_MIN; - } else if (value > HV_REPORT_MAX) { - return HV_REPORT_MAX; + if (value < MOUSE_REPORT_HV_MIN) { + return MOUSE_REPORT_HV_MIN; + } else if (value > MOUSE_REPORT_HV_MAX) { + return MOUSE_REPORT_HV_MAX; } else { return value; } @@ -420,10 +420,10 @@ static inline mouse_hv_report_t pointing_device_hv_clamp(hv_clamp_range_t value) * @return mouse_xy_report_t clamped value */ static inline mouse_xy_report_t pointing_device_xy_clamp(xy_clamp_range_t value) { - if (value < XY_REPORT_MIN) { - return XY_REPORT_MIN; - } else if (value > XY_REPORT_MAX) { - return XY_REPORT_MAX; + if (value < MOUSE_REPORT_XY_MIN) { + return MOUSE_REPORT_XY_MIN; + } else if (value > MOUSE_REPORT_XY_MAX) { + return MOUSE_REPORT_XY_MAX; } else { return value; } diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h index 72188c977d..7bc059e594 100644 --- a/quantum/pointing_device/pointing_device.h +++ b/quantum/pointing_device/pointing_device.h @@ -92,27 +92,19 @@ typedef enum { } pointing_device_buttons_t; #ifdef MOUSE_EXTENDED_REPORT -# define XY_REPORT_MIN INT16_MIN -# define XY_REPORT_MAX INT16_MAX typedef int32_t xy_clamp_range_t; #else -# define XY_REPORT_MIN INT8_MIN -# define XY_REPORT_MAX INT8_MAX typedef int16_t xy_clamp_range_t; #endif #ifdef WHEEL_EXTENDED_REPORT -# define HV_REPORT_MIN INT16_MIN -# define HV_REPORT_MAX INT16_MAX typedef int32_t hv_clamp_range_t; #else -# define HV_REPORT_MIN INT8_MIN -# define HV_REPORT_MAX INT8_MAX typedef int16_t hv_clamp_range_t; #endif #define CONSTRAIN_HID(amt) ((amt) < INT8_MIN ? INT8_MIN : ((amt) > INT8_MAX ? INT8_MAX : (amt))) -#define CONSTRAIN_HID_XY(amt) ((amt) < XY_REPORT_MIN ? XY_REPORT_MIN : ((amt) > XY_REPORT_MAX ? XY_REPORT_MAX : (amt))) +#define CONSTRAIN_HID_XY(amt) ((amt) < MOUSE_REPORT_XY_MIN ? MOUSE_REPORT_XY_MIN : ((amt) > MOUSE_REPORT_XY_MAX ? MOUSE_REPORT_XY_MAX : (amt))) void pointing_device_init(void); bool pointing_device_task(void); diff --git a/tmk_core/protocol/report.h b/tmk_core/protocol/report.h index d854f51d5c..9053b0bb3f 100644 --- a/tmk_core/protocol/report.h +++ b/tmk_core/protocol/report.h @@ -194,14 +194,22 @@ typedef struct { } PACKED report_programmable_button_t; #ifdef MOUSE_EXTENDED_REPORT +# define MOUSE_REPORT_XY_MIN INT16_MIN +# define MOUSE_REPORT_XY_MAX INT16_MAX typedef int16_t mouse_xy_report_t; #else +# define MOUSE_REPORT_XY_MIN INT8_MIN +# define MOUSE_REPORT_XY_MAX INT8_MAX typedef int8_t mouse_xy_report_t; #endif #ifdef WHEEL_EXTENDED_REPORT +# define MOUSE_REPORT_HV_MIN INT16_MIN +# define MOUSE_REPORT_HV_MAX INT16_MAX typedef int16_t mouse_hv_report_t; #else +# define MOUSE_REPORT_HV_MIN INT8_MIN +# define MOUSE_REPORT_HV_MAX INT8_MAX typedef int8_t mouse_hv_report_t; #endif From 8d8dcb089ed36e7e1a61d77e5a4b6b08c8668869 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:46:24 -0700 Subject: [PATCH 286/592] [Core] Flow Tap tap-hold option to disable HRMs during fast typing (#25125) aka Global Quick Tap, Require Prior Idle --- data/mappings/info_config.hjson | 1 + docs/tap_hold.md | 83 +++++ quantum/action.c | 17 + quantum/action.h | 6 + quantum/action_tapping.c | 138 ++++++-- quantum/action_tapping.h | 57 ++++ quantum/process_keycode/process_leader.c | 6 +- .../tap_hold_configurations/flow_tap/config.h | 22 ++ .../tap_hold_configurations/flow_tap/test.mk | 18 + .../flow_tap/test_keymap.c | 23 ++ .../flow_tap/test_tap_hold.cpp | 313 ++++++++++++++++++ 11 files changed, 648 insertions(+), 36 deletions(-) create mode 100644 tests/tap_hold_configurations/flow_tap/config.h create mode 100644 tests/tap_hold_configurations/flow_tap/test.mk create mode 100644 tests/tap_hold_configurations/flow_tap/test_keymap.c create mode 100644 tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index b643553b52..bab881583a 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -201,6 +201,7 @@ // Tapping "CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"}, + "FLOW_TAP_TERM": {"info_key": "tapping.flow_tap_term", "value_type": "int"}, "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"}, "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"}, "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"}, diff --git a/docs/tap_hold.md b/docs/tap_hold.md index 254d5de5ec..f1af753eba 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -425,6 +425,89 @@ uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) { If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`. ::: +## Flow Tap + +Flow Tap modifies mod-tap `MT` and layer-tap `LT` keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. This is particularly useful for home row mods to avoid accidental mod triggers. It basically disables the hold behavior during fast typing, creating a "flow of taps." This also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately. + +Flow Tap is enabled by defining `FLOW_TAP_TERM` in your `config.h` with the desired timeout in milliseconds. A timeout of 150 ms is recommended as a starting point: + +```c +#define FLOW_TAP_TERM 150 +``` + +By default, Flow Tap is enabled when: + +* The tap-hold key is pressed within `FLOW_TAP_TERM` milliseconds of the previous key press. + +* The tapping keycodes of the previous key and tap-hold key are *both* among `KC_A`–`KC_Z`, `KC_COMM`, `KC_DOT`, `KC_SCLN`, `KC_SLSH` (the main alphas area of a conventional QWERTY layout) or `KC_SPC`. + +As an exception to the above, Flow Tap is temporarily disabled while a tap-hold key is undecided. This is to allow chording multiple mod-tap keys without having to wait out the Flow Tap term. + + +### is_flow_tap_key() + +Optionally, define the `is_flow_tap_key()` callback to specify where Flow Tap is enabled. The callback is called for both the tap-hold key *and* the key press immediately preceding it, and if the callback returns true for both keycodes, Flow Tap is enabled. + +The default implementation of this callback is: + +```.c +bool is_flow_tap_key(uint16_t keycode) { + if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) { + return false; // Disable Flow Tap on hotkeys. + } + switch (get_tap_keycode(keycode)) { + case KC_SPC: + case KC_A ... KC_Z: + case KC_DOT: + case KC_COMM: + case KC_SCLN: + case KC_SLSH: + return true; + } + return false; +} +``` + +Copy the above to your `keymap.c` and edit to customize. For instance, remove the `case KC_SPC` line to disable Flow Tap for the Space key. + +### get_flow_tap_term() + +Optionally, for further flexibility, define the `get_flow_tap_term()` callback. Flow Tap acts only when key events are closer together than the time returned by the callback. Return a time of 0 to disable filtering. In this way, Flow Tap may be disabled for certain tap-hold keys, or when following certain previous keys. + +The default implementation of this callback is + +```.c +uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record, + uint16_t prev_keycode) { + if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) { + return FLOW_TAP_TERM; + } + return 0; +} +``` + +In this callback, `keycode` and `record` correspond to the current tap-hold key, and `prev_keycode` is the keycode of the previous key. Return the timeout to use. Returning `0` disables Flow Tap. This callback enables setting per-key timeouts. It is also possible to enable or disable Flow Tap for certain tap-hold keys or when following certain previous keys. Example: + +```c +uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record, + uint16_t prev_keycode) { + if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) { + switch (keycode) { + case LCTL_T(KC_F): + case RCTL_T(KC_H): + return FLOW_TAP_TERM - 25; // Short timeout on these keys. + + default: + return FLOW_TAP_TERM; // Longer timeout otherwise. + } + } + return 0; // Disable Flow Tap. +} +``` + +::: tip If you define both `is_flow_tap_key()` and `get_flow_tap_term()`, then the latter takes precedence. +::: + ## Chordal Hold Chordal Hold is intended to be used together with either Permissive Hold or Hold diff --git a/quantum/action.c b/quantum/action.c index be85192d25..eb0dbc7022 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -1183,6 +1183,23 @@ bool is_tap_action(action_t action) { return false; } +uint16_t get_tap_keycode(uint16_t keycode) { + switch (keycode) { + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + return QK_MOD_TAP_GET_TAP_KEYCODE(keycode); + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + return QK_LAYER_TAP_GET_TAP_KEYCODE(keycode); + case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: + // IS_SWAP_HANDS_KEYCODE() tests for the special action keycodes + // like SH_TOGG, SH_TT, ..., which overlap the SH_T(kc) range. + if (!IS_SWAP_HANDS_KEYCODE(keycode)) { + return QK_SWAP_HANDS_GET_TAP_KEYCODE(keycode); + } + break; + } + return keycode; +} + /** \brief Debug print (FIXME: Needs better description) * * FIXME: Needs documentation. diff --git a/quantum/action.h b/quantum/action.h index 7596688f31..7616486c6d 100644 --- a/quantum/action.h +++ b/quantum/action.h @@ -128,6 +128,12 @@ void layer_switch(uint8_t new_layer); bool is_tap_record(keyrecord_t *record); bool is_tap_action(action_t action); +/** + * Given an MT or LT keycode, returns the tap keycode. Otherwise returns the + * original keycode unchanged. + */ +uint16_t get_tap_keycode(uint16_t keycode); + #ifndef NO_ACTION_TAPPING void process_record_tap_hint(keyrecord_t *record); #endif diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index e42a98554d..312c639169 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -4,6 +4,7 @@ #include "action.h" #include "action_layer.h" #include "action_tapping.h" +#include "action_util.h" #include "keycode.h" #include "timer.h" @@ -49,9 +50,7 @@ __attribute__((weak)) bool get_permissive_hold(uint16_t keycode, keyrecord_t *re } # endif -# if defined(CHORDAL_HOLD) -extern const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM; - +# if defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) # define REGISTERED_TAPS_SIZE 8 // Array of tap-hold keys that have been settled as tapped but not yet released. static keypos_t registered_taps[REGISTERED_TAPS_SIZE] = {}; @@ -66,6 +65,14 @@ static void registered_taps_del_index(uint8_t i); /** Logs the registered_taps array for debugging. */ static void debug_registered_taps(void); +static bool is_mt_or_lt(uint16_t keycode) { + return IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode); +} +# endif // defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) + +# if defined(CHORDAL_HOLD) +extern const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM; + /** \brief Finds which queued events should be held according to Chordal Hold. * * In a situation with multiple unsettled tap-hold key presses, scan the queue @@ -82,10 +89,6 @@ static void waiting_buffer_chordal_hold_taps_until(keypos_t key); /** \brief Processes and pops buffered events until the first tap-hold event. */ static void waiting_buffer_process_regular(void); - -static bool is_mt_or_lt(uint16_t keycode) { - return IS_QK_MOD_TAP(keycode) || IS_QK_LAYER_TAP(keycode); -} # endif // CHORDAL_HOLD # ifdef HOLD_ON_OTHER_KEY_PRESS_PER_KEY @@ -98,6 +101,13 @@ __attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyreco # include "process_auto_shift.h" # endif +# if defined(FLOW_TAP_TERM) +static uint32_t last_input = 0; +static uint16_t prev_keycode = KC_NO; + +uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t *record, uint16_t prev_keycode); +# endif // defined(FLOW_TAP_TERM) + static keyrecord_t tapping_key = {}; static keyrecord_t waiting_buffer[WAITING_BUFFER_SIZE] = {}; static uint8_t waiting_buffer_head = 0; @@ -147,6 +157,19 @@ void action_tapping_process(keyrecord_t record) { } } if (IS_EVENT(record.event)) { +# if defined(FLOW_TAP_TERM) + const uint16_t keycode = get_record_keycode(&record, false); + // Track the previous key press. + if (record.event.pressed) { + prev_keycode = keycode; + } + // If there is no unsettled tap-hold key, update last input time. Ignore + // mod keys in this update to allow for chording multiple mods for + // hotkeys like "Ctrl+Shift+arrow". + if (IS_NOEVENT(tapping_key.event) && !IS_MODIFIER_KEYCODE(keycode)) { + last_input = timer_read32(); + } +# endif // defined(FLOW_TAP_TERM) ac_dprintf("\n"); } } @@ -205,7 +228,7 @@ void action_tapping_process(keyrecord_t record) { bool process_tapping(keyrecord_t *keyp) { const keyevent_t event = keyp->event; -# if defined(CHORDAL_HOLD) +# if defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) if (!event.pressed) { const int8_t i = registered_tap_find(event.key); if (i != -1) { @@ -217,7 +240,7 @@ bool process_tapping(keyrecord_t *keyp) { debug_registered_taps(); } } -# endif // CHORDAL_HOLD +# endif // defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) // state machine is in the "reset" state, no tapping key is to be // processed @@ -227,6 +250,27 @@ bool process_tapping(keyrecord_t *keyp) { } else if (event.pressed && is_tap_record(keyp)) { // the currently pressed key is a tapping key, therefore transition // into the "pressed" tapping key state + +# if defined(FLOW_TAP_TERM) + const uint16_t keycode = get_record_keycode(keyp, false); + if (is_mt_or_lt(keycode)) { + const uint32_t idle_time = timer_elapsed32(last_input); + uint16_t term = get_flow_tap_term(keycode, keyp, prev_keycode); + if (term > 500) { + term = 500; + } + if (idle_time < 500 && idle_time < term) { + debug_event(keyp->event); + ac_dprintf(" within flow tap term (%u < %u) considered a tap\n", (int16_t)idle_time, term); + keyp->tap.count = 1; + registered_taps_add(keyp->event.key); + debug_registered_taps(); + process_record(keyp); + return true; + } + } +# endif // defined(FLOW_TAP_TERM) + ac_dprintf("Tapping: Start(Press tap key).\n"); tapping_key = *keyp; process_record_tap_hint(&tapping_key); @@ -655,28 +699,7 @@ void waiting_buffer_scan_tap(void) { } } -# ifdef CHORDAL_HOLD -__attribute__((weak)) bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t *tap_hold_record, uint16_t other_keycode, keyrecord_t *other_record) { - return get_chordal_hold_default(tap_hold_record, other_record); -} - -bool get_chordal_hold_default(keyrecord_t *tap_hold_record, keyrecord_t *other_record) { - if (tap_hold_record->event.type != KEY_EVENT || other_record->event.type != KEY_EVENT) { - return true; // Return true on combos or other non-key events. - } - - char tap_hold_hand = chordal_hold_handedness(tap_hold_record->event.key); - if (tap_hold_hand == '*') { - return true; - } - char other_hand = chordal_hold_handedness(other_record->event.key); - return other_hand == '*' || tap_hold_hand != other_hand; -} - -__attribute__((weak)) char chordal_hold_handedness(keypos_t key) { - return (char)pgm_read_byte(&chordal_hold_layout[key.row][key.col]); -} - +# if defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) static void registered_taps_add(keypos_t key) { if (num_registered_taps >= REGISTERED_TAPS_SIZE) { ac_dprintf("TAPS OVERFLOW: CLEAR ALL STATES\n"); @@ -714,6 +737,30 @@ static void debug_registered_taps(void) { ac_dprintf("}\n"); } +# endif // defined(CHORDAL_HOLD) || defined(FLOW_TAP_TERM) + +# ifdef CHORDAL_HOLD +__attribute__((weak)) bool get_chordal_hold(uint16_t tap_hold_keycode, keyrecord_t *tap_hold_record, uint16_t other_keycode, keyrecord_t *other_record) { + return get_chordal_hold_default(tap_hold_record, other_record); +} + +bool get_chordal_hold_default(keyrecord_t *tap_hold_record, keyrecord_t *other_record) { + if (tap_hold_record->event.type != KEY_EVENT || other_record->event.type != KEY_EVENT) { + return true; // Return true on combos or other non-key events. + } + + char tap_hold_hand = chordal_hold_handedness(tap_hold_record->event.key); + if (tap_hold_hand == '*') { + return true; + } + char other_hand = chordal_hold_handedness(other_record->event.key); + return other_hand == '*' || tap_hold_hand != other_hand; +} + +__attribute__((weak)) char chordal_hold_handedness(keypos_t key) { + return (char)pgm_read_byte(&chordal_hold_layout[key.row][key.col]); +} + static uint8_t waiting_buffer_find_chordal_hold_tap(void) { keyrecord_t *prev = &tapping_key; uint16_t prev_keycode = get_record_keycode(&tapping_key, false); @@ -761,6 +808,35 @@ static void waiting_buffer_process_regular(void) { } # endif // CHORDAL_HOLD +# ifdef FLOW_TAP_TERM +// By default, enable Flow Tap for the keys in the main alphas area and Space. +// This should work reasonably even if the layout is remapped on the host to an +// alt layout or international layout (e.g. Dvorak or AZERTY), where these same +// key positions are mostly used for typing letters. +__attribute__((weak)) bool is_flow_tap_key(uint16_t keycode) { + if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) { + return false; // Disable Flow Tap on hotkeys. + } + switch (get_tap_keycode(keycode)) { + case KC_SPC: + case KC_A ... KC_Z: + case KC_DOT: + case KC_COMM: + case KC_SCLN: + case KC_SLSH: + return true; + } + return false; +} + +__attribute__((weak)) uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t *record, uint16_t prev_keycode) { + if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) { + return FLOW_TAP_TERM; + } + return 0; +} +# endif // FLOW_TAP_TERM + /** \brief Logs tapping key if ACTION_DEBUG is enabled. */ static void debug_tapping_key(void) { ac_dprintf("TAPPING_KEY="); diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h index c3c7b999ec..2af000ad73 100644 --- a/quantum/action_tapping.h +++ b/quantum/action_tapping.h @@ -111,6 +111,63 @@ char chordal_hold_handedness(keypos_t key); extern const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM; #endif +#ifdef FLOW_TAP_TERM +/** + * Callback to specify the keys where Flow Tap is enabled. + * + * Flow Tap is constrained to certain keys by the following rule: this callback + * is called for both the tap-hold key *and* the key press immediately preceding + * it. If the callback returns true for both keycodes, Flow Tap is enabled. + * + * The default implementation of this callback corresponds to + * + * bool is_flow_tap_key(uint16_t keycode) { + * switch (get_tap_keycode(keycode)) { + * case KC_SPC: + * case KC_A ... KC_Z: + * case KC_DOT: + * case KC_COMM: + * case KC_SCLN: + * case KC_SLSH: + * return true; + * } + * return false; + * } + * + * @param keycode Keycode of the key. + * @return Whether to enable Flow Tap for this key. + */ +bool is_flow_tap_key(uint16_t keycode); + +/** + * Callback to customize Flow Tap filtering. + * + * Flow Tap acts only when key events are closer together than this time. + * + * Return a time of 0 to disable filtering. In this way, Flow Tap may be + * disabled for certain tap-hold keys, or when following certain previous keys. + * + * The default implementation of this callback is + * + * uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record, + * uint16_t prev_keycode) { + * if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) { + * return g_flow_tap_term; + * } + * return 0; + * } + * + * NOTE: If both `is_flow_tap_key()` and `get_flow_tap_term()` are defined, then + * `get_flow_tap_term()` takes precedence. + * + * @param keycode Keycode of the tap-hold key. + * @param record keyrecord_t of the tap-hold event. + * @param prev_keycode Keycode of the previously pressed key. + * @return Time in milliseconds. + */ +uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t *record, uint16_t prev_keycode); +#endif // FLOW_TAP_TERM + #ifdef DYNAMIC_TAPPING_TERM_ENABLE extern uint16_t g_tapping_term; #endif diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index ca017a577d..a5466c513c 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -22,11 +22,7 @@ bool process_leader(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { if (leader_sequence_active() && !leader_sequence_timed_out()) { #ifndef LEADER_KEY_STRICT_KEY_PROCESSING - if (IS_QK_MOD_TAP(keycode)) { - keycode = QK_MOD_TAP_GET_TAP_KEYCODE(keycode); - } else if (IS_QK_LAYER_TAP(keycode)) { - keycode = QK_LAYER_TAP_GET_TAP_KEYCODE(keycode); - } + keycode = get_tap_keycode(keycode); #endif if (!leader_sequence_add(keycode)) { diff --git a/tests/tap_hold_configurations/flow_tap/config.h b/tests/tap_hold_configurations/flow_tap/config.h new file mode 100644 index 0000000000..a17d488214 --- /dev/null +++ b/tests/tap_hold_configurations/flow_tap/config.h @@ -0,0 +1,22 @@ +/* Copyright 2022 Vladislav Kucheriavykh + * Copyright 2025 Google LLC + * + * 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 "test_common.h" + +#define FLOW_TAP_TERM 150 diff --git a/tests/tap_hold_configurations/flow_tap/test.mk b/tests/tap_hold_configurations/flow_tap/test.mk new file mode 100644 index 0000000000..81ba8da66d --- /dev/null +++ b/tests/tap_hold_configurations/flow_tap/test.mk @@ -0,0 +1,18 @@ +# Copyright 2022 Vladislav Kucheriavykh +# +# 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 . + +COMBO_ENABLE = yes + +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/flow_tap/test_keymap.c b/tests/tap_hold_configurations/flow_tap/test_keymap.c new file mode 100644 index 0000000000..4dfe5e4cb6 --- /dev/null +++ b/tests/tap_hold_configurations/flow_tap/test_keymap.c @@ -0,0 +1,23 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +uint16_t const mt_lt_combo[] = {SFT_T(KC_X), LT(1, KC_Y), COMBO_END}; + +// clang-format off +combo_t key_combos[] = { + COMBO(mt_lt_combo, KC_Z), +}; +// clang-format on diff --git a/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp new file mode 100644 index 0000000000..7816fcb6da --- /dev/null +++ b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp @@ -0,0 +1,313 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::AnyNumber; +using testing::InSequence; + +class FlowTapTest : public TestFixture {}; + +TEST_F(FlowTapTest, short_flow_tap_settled_as_tapped) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C)); + + set_keymap({regular_key, mod_tap_key1, mod_tap_key2}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap key 1 quickly after regular key. The mod-tap should settle + // immediately as tapped, sending `KC_B`. + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap key 2 quickly. + EXPECT_REPORT(driver, (KC_B, KC_C)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for longer than the tapping term. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, long_flow_tap_settled_as_held) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_B)); + + set_keymap({regular_key, mod_tap_key}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for the tapping term. + EXPECT_REPORT(driver, (KC_LSFT)); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, holding_multiple_mod_taps) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C)); + + set_keymap({regular_key, mod_tap_key1, mod_tap_key2}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + idle_for(TAPPING_TERM - 5); // Hold almost until tapping term. + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_LSFT)); + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL)); + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL, KC_A)); + regular_key.press(); + idle_for(10); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, layer_tap_key) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_B)); + auto regular_key2 = KeymapKey(1, 0, 0, KC_C); + + set_keymap({regular_key, layer_tap_key, regular_key2}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Press layer-tap key, quickly after the regular key. + EXPECT_REPORT(driver, (KC_B)); + layer_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap key. + EXPECT_EMPTY_REPORT(driver); + layer_tap_key.release(); + run_one_scan_loop(); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press layer-tap key, slowly after the regular key. + EXPECT_NO_REPORT(driver); + layer_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + EXPECT_EQ(layer_state, 1 << 1); + VERIFY_AND_CLEAR(driver); + + // Tap regular key2. + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap key. + EXPECT_NO_REPORT(driver); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, combo_key) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_X)); + auto layer_tap_key = KeymapKey(0, 2, 0, LT(1, KC_Y)); + + set_keymap({regular_key, mod_tap_key, layer_tap_key}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Press combo keys quickly after regular key. + EXPECT_REPORT(driver, (KC_Z)); + EXPECT_EMPTY_REPORT(driver); + tap_combo({mod_tap_key, layer_tap_key}); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap key quickly. + EXPECT_REPORT(driver, (KC_X)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, oneshot_mod_key) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto osm_key = KeymapKey(0, 1, 0, OSM(MOD_LSFT)); + + set_keymap({regular_key, osm_key}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Tap OSM, tap regular key. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(osm_key); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Nested press of OSM and regular keys. + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_EMPTY_REPORT(driver); + osm_key.press(); + run_one_scan_loop(); + tap_key(regular_key); + osm_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, quick_tap) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_A)); + + set_keymap({mod_tap_key}); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(mod_tap_key); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} From af141d1a5cd4a740e07f8195d9f1ec18e74bfdb7 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Mon, 14 Apr 2025 12:52:51 -0400 Subject: [PATCH 287/592] Add Link keyboard (#25058) Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/cannonkeys/link/config.h | 27 ++++ keyboards/cannonkeys/link/halconf.h | 7 + keyboards/cannonkeys/link/keyboard.json | 135 ++++++++++++++++++ .../cannonkeys/link/keymaps/default/keymap.c | 31 ++++ keyboards/cannonkeys/link/link.c | 93 ++++++++++++ keyboards/cannonkeys/link/readme.md | 27 ++++ 6 files changed, 320 insertions(+) create mode 100644 keyboards/cannonkeys/link/config.h create mode 100644 keyboards/cannonkeys/link/halconf.h create mode 100644 keyboards/cannonkeys/link/keyboard.json create mode 100644 keyboards/cannonkeys/link/keymaps/default/keymap.c create mode 100644 keyboards/cannonkeys/link/link.c create mode 100644 keyboards/cannonkeys/link/readme.md diff --git a/keyboards/cannonkeys/link/config.h b/keyboards/cannonkeys/link/config.h new file mode 100644 index 0000000000..c244f7a56b --- /dev/null +++ b/keyboards/cannonkeys/link/config.h @@ -0,0 +1,27 @@ +/* Copyright 2024 CannonKeys */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/* VBUS-routed pin for upstream detection */ +#define USB_VBUS_PIN GP27 + +#define SPLIT_HAND_PIN_LOW_IS_LEFT + +// Configure full duplex split comms over PIO +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP28 +#define SERIAL_USART_RX_PIN GP29 +#define SERIAL_USART_PIN_SWAP + +/* RP2040- and hardware-specific config */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 + +/* I2C for OLEDs */ +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP14 +#define I2C1_SCL_PIN GP15 + +#define OLED_DISPLAY_64X128 diff --git a/keyboards/cannonkeys/link/halconf.h b/keyboards/cannonkeys/link/halconf.h new file mode 100644 index 0000000000..538c60c0b2 --- /dev/null +++ b/keyboards/cannonkeys/link/halconf.h @@ -0,0 +1,7 @@ +// Copyright 2024 Andrew Kannan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_I2C TRUE +#include_next diff --git a/keyboards/cannonkeys/link/keyboard.json b/keyboards/cannonkeys/link/keyboard.json new file mode 100644 index 0000000000..e5692cd458 --- /dev/null +++ b/keyboards/cannonkeys/link/keyboard.json @@ -0,0 +1,135 @@ +{ + "manufacturer": "CannonKeys", + "keyboard_name": "Link", + "maintainer": "awkannan", + "bootloader": "rp2040", + "bootmagic": { + "matrix": [0, 5] + }, + "build": { + "debounce_type": "asym_eager_defer_pk" + }, + "diode_direction": "COL2ROW", + "dynamic_keymap": { + "layer_count": 6 + }, + "encoder": { + "rotary": [ + {"pin_a": "GP12", "pin_b": "GP13", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true + }, + "matrix_pins": { + "cols": ["GP17", "GP18", "GP19", "GP20", "GP21", "GP24"], + "rows": ["GP25", "GP26", "GP16", "GP11", "GP10"] + }, + "processor": "RP2040", + "qmk": { + "tap_keycode_delay": 10 + }, + "split": { + "bootmagic": { + "matrix": [5, 5] + }, + "enabled": true, + "handedness": { + "pin": "GP8" + }, + "matrix_pins": { + "right": { + "cols": ["GP16", "GP11", "GP10", "GP3", "GP2", "GP1"], + "rows": ["GP9", "GP0", "GP17", "GP18", "GP19"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "layer_state": true, + "matrix_state": true, + "oled": true, + "wpm": true + } + } + }, + "url": "https://cannonkeys.com/", + "usb": { + "device_version": "0.0.1", + "pid": "0x0038", + "vid": "0xCA04" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 5], "x": 0, "y": 0}, + {"matrix": [0, 4], "x": 1, "y": 0}, + {"matrix": [0, 3], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 1], "x": 4, "y": 0}, + {"matrix": [0, 0], "x": 5, "y": 0}, + {"matrix": [5, 0], "x": 11, "y": 0}, + {"matrix": [5, 1], "x": 12, "y": 0}, + {"matrix": [5, 2], "x": 13, "y": 0}, + {"matrix": [5, 3], "x": 14, "y": 0}, + {"matrix": [5, 4], "x": 15, "y": 0}, + {"matrix": [5, 5], "x": 16, "y": 0}, + {"matrix": [1, 5], "x": 0, "y": 1}, + {"matrix": [1, 4], "x": 1, "y": 1}, + {"matrix": [1, 3], "x": 2, "y": 1}, + {"matrix": [1, 2], "x": 3, "y": 1}, + {"matrix": [1, 1], "x": 4, "y": 1}, + {"matrix": [1, 0], "x": 5, "y": 1}, + {"matrix": [6, 0], "x": 11, "y": 1}, + {"matrix": [6, 1], "x": 12, "y": 1}, + {"matrix": [6, 2], "x": 13, "y": 1}, + {"matrix": [6, 3], "x": 14, "y": 1}, + {"matrix": [6, 4], "x": 15, "y": 1}, + {"matrix": [6, 5], "x": 16, "y": 1}, + {"matrix": [2, 5], "x": 0, "y": 2}, + {"matrix": [2, 4], "x": 1, "y": 2}, + {"matrix": [2, 3], "x": 2, "y": 2}, + {"matrix": [2, 2], "x": 3, "y": 2}, + {"matrix": [2, 1], "x": 4, "y": 2}, + {"matrix": [2, 0], "x": 5, "y": 2}, + {"matrix": [7, 0], "x": 11, "y": 2}, + {"matrix": [7, 1], "x": 12, "y": 2}, + {"matrix": [7, 2], "x": 13, "y": 2}, + {"matrix": [7, 3], "x": 14, "y": 2}, + {"matrix": [7, 4], "x": 15, "y": 2}, + {"matrix": [7, 5], "x": 16, "y": 2}, + {"matrix": [3, 5], "x": 0, "y": 3}, + {"matrix": [3, 4], "x": 1, "y": 3}, + {"matrix": [3, 3], "x": 2, "y": 3}, + {"matrix": [3, 2], "x": 3, "y": 3}, + {"matrix": [3, 1], "x": 4, "y": 3}, + {"matrix": [3, 0], "x": 5, "y": 3}, + {"matrix": [4, 5], "x": 6, "y": 3}, + {"matrix": [9, 5], "x": 10, "y": 3}, + {"matrix": [8, 0], "x": 11, "y": 3}, + {"matrix": [8, 1], "x": 12, "y": 3}, + {"matrix": [8, 2], "x": 13, "y": 3}, + {"matrix": [8, 3], "x": 14, "y": 3}, + {"matrix": [8, 4], "x": 15, "y": 3}, + {"matrix": [8, 5], "x": 16, "y": 3}, + {"matrix": [4, 4], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 2], "x": 4, "y": 4}, + {"matrix": [4, 1], "x": 5, "y": 4}, + {"matrix": [4, 0], "x": 6, "y": 4, "h": 1.5}, + {"matrix": [9, 0], "x": 10, "y": 4, "h": 1.5}, + {"matrix": [9, 1], "x": 11, "y": 4}, + {"matrix": [9, 2], "x": 12, "y": 4}, + {"matrix": [9, 3], "x": 13, "y": 4}, + {"matrix": [9, 4], "x": 14, "y": 4} + ] + } + } +} diff --git a/keyboards/cannonkeys/link/keymaps/default/keymap.c b/keyboards/cannonkeys/link/keymaps/default/keymap.c new file mode 100644 index 0000000000..eba810d868 --- /dev/null +++ b/keyboards/cannonkeys/link/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +// Copyright 2025 Andrew Kannan (awkannan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = LAYOUT( + 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_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, 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_MUTE, KC_MPLY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, KC_LALT, KC_LCTL, MO(1), KC_ENT, KC_SPC, MO(2), KC_RCTL, KC_RALT, KC_RGUI +), + +[1] = LAYOUT( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, + KC_WREF, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, + KC_TRNS, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_DOT, KC_COLN, KC_BSLS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +), + +[2] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_INS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_PGUP, KC_MPRV, KC_MNXT, KC_PSCR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +) +}; diff --git a/keyboards/cannonkeys/link/link.c b/keyboards/cannonkeys/link/link.c new file mode 100644 index 0000000000..2d0d2cb557 --- /dev/null +++ b/keyboards/cannonkeys/link/link.c @@ -0,0 +1,93 @@ +// Copyright 2025 Andrew Kannan (awkannan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + if (is_keyboard_master()) { + return OLED_ROTATION_0; + } else { + return OLED_ROTATION_90; + } + return rotation; +} + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, + 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, + 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0 + }; + oled_write_P(qmk_logo, false); +} + +void print_status_narrow(void) { + oled_write_P(PSTR("\n\n"), false); + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_ln_P(PSTR("Qwrt"), false); + break; + case 1: + oled_write_ln_P(PSTR("Clmk"), false); + break; + default: + oled_write_P(PSTR("Mod\n"), false); + break; + } + oled_write_P(PSTR("\n\n"), false); + oled_write_ln_P(PSTR("LAYER"), false); + switch (get_highest_layer(layer_state)) { + case 0: + case 1: + oled_write_P(PSTR("Base\n"), false); + break; + case 2: + oled_write_P(PSTR("Raise"), false); + break; + case 3: + oled_write_P(PSTR("Lower"), false); + break; + default: + oled_write_ln_P(PSTR("Undef"), false); + } + oled_write_P(PSTR("\n\n"), false); + led_t led_usb_state = host_keyboard_led_state(); + oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (is_keyboard_master()) { + print_status_narrow(); + } else { + render_logo(); + } + return true; +} + +#endif + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return true; +} +#endif diff --git a/keyboards/cannonkeys/link/readme.md b/keyboards/cannonkeys/link/readme.md new file mode 100644 index 0000000000..461be86180 --- /dev/null +++ b/keyboards/cannonkeys/link/readme.md @@ -0,0 +1,27 @@ +# Link + +The Link is a Sofle58 inspired Ergo Split keyboard from CannonKeys. +It uses 1.3" SH1107 screens and ALPS EC11 compatible encoders. + +* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan) +* Hardware Supported: RP2040 +* Hardware Availability: [CannonKeys](https://cannonkeys.com) + + +Make example for this keyboard (after setting up your build environment): + + make cannonkeys/link:default + +Flashing example for this keyboard: + + make cannonkeys/link: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 top-most and outer-most key in the matrix and plug in the keyboard +* **Physical reset button**: Hold the "BOOTMODE" button on the back of the PCB and briefly press the "RESET" button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 32b9d33bbbc1a9de503ef0aa2251089feae048ff Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 14 Apr 2025 10:58:14 -0600 Subject: [PATCH 288/592] Remove Sofle `rgb_default` keymap & tidy readme's (#25010) --- keyboards/sofle/keyhive/config.h | 23 - keyboards/sofle/keyhive/keyboard.json | 1 - keyboards/sofle/keyhive/readme.md | 54 -- keyboards/sofle/keymaps/rgb_default/config.h | 124 ---- keyboards/sofle/keymaps/rgb_default/keymap.c | 559 ------------------- keyboards/sofle/keymaps/rgb_default/rules.mk | 7 - keyboards/sofle/readme.md | 25 +- keyboards/sofle/rev1/readme.md | 27 - 8 files changed, 19 insertions(+), 801 deletions(-) delete mode 100644 keyboards/sofle/keyhive/config.h delete mode 100644 keyboards/sofle/keyhive/readme.md delete mode 100644 keyboards/sofle/keymaps/rgb_default/config.h delete mode 100644 keyboards/sofle/keymaps/rgb_default/keymap.c delete mode 100644 keyboards/sofle/keymaps/rgb_default/rules.mk delete mode 100644 keyboards/sofle/rev1/readme.md diff --git a/keyboards/sofle/keyhive/config.h b/keyboards/sofle/keyhive/config.h deleted file mode 100644 index cda0be789e..0000000000 --- a/keyboards/sofle/keyhive/config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright - * 2021 solartempest - * 2021 QMK - * - * 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 - -// OLED settings -#define OLED_TIMEOUT 80000 -#define OLED_BRIGHTNESS 90 diff --git a/keyboards/sofle/keyhive/keyboard.json b/keyboards/sofle/keyhive/keyboard.json index 8c76e875b0..720327b75d 100644 --- a/keyboards/sofle/keyhive/keyboard.json +++ b/keyboards/sofle/keyhive/keyboard.json @@ -1,5 +1,4 @@ { - "keyboard_name": "Sofle", "manufacturer": "Keyhive", "development_board": "elite_c", "usb": { diff --git a/keyboards/sofle/keyhive/readme.md b/keyboards/sofle/keyhive/readme.md deleted file mode 100644 index 3847dfe6bb..0000000000 --- a/keyboards/sofle/keyhive/readme.md +++ /dev/null @@ -1,54 +0,0 @@ -# Keyhive Sofle Keyboard - -![SofleKeyboard version 2.1 RGB Keyhive](https://i.imgur.com/WH9OoWuh.jpg) - -Sofle is 6×4+5 keys column-staggered split keyboard. Based on Lily58, Corne and Helix keyboards. - -For details about the keyboard design, refer to Josef's blog: [Sofle Keyboard - a split keyboard based on Lily58 and Crkbd](https://josef-adamcik.cz/electronics/let-me-introduce-you-sofle-keyboard-split-keyboard-based-on-lily58.html) - -Build guide: [Keyhive Sofle RGB build guide](https://github.com/keyhive/build_guides/blob/master/docs/keyboards/sofle-rgb.md) - -* Keyboard Maintainer: [Winder](https://github.com/winder) -* Hardware Supported: Keyhive Sofle RGB, ProMicro / Elite-C -* Hardware Availability: [Keyhive](https://keyhive.xyz/shop/sofle) - -### Acknowledgements - -* Solartempest - the image on this page and most of the code is either copied directly or inspired by their fork. [Solartempest's fork.](https://github.com/solartempest/qmk_firmware/tree/master/keyboards/solartempest/sofle). -* [Keyhive fork](https://github.com/keyhive/qmk_firmware) defined all of the board settings. - -# Supported Keymaps - -The keyhive schematic has been slightly modified compared to the open source sofle and not all keymaps are compatible. - -* **default**: Basic functionality, no rgb, no VIA. -* [keyhive_via](../keymaps/keyhive_via/readme.md) - Includes rgblighting and special support for remapping encoders with VIA. -* **Other**: may work but backwards compatibility is not guaranteed or tested. - -# VIA Support -As of 1.3.1, the VIA tool does not support Keyhive/Sofle V2 out of the box. -See [keyhive_via](../keymaps/keyhive_via/readme.md) for details about configuring and using VIA. - -# Compiling - -Make example for this keyboard (after setting up your build environment): - - make sofle/keyhive:default - -## Flashing - -Flash using the correct command below (or use QMK Toolbox). These commands can be mixed if, for example, you have an Elite C on the left and a pro micro on the right. - -Press reset button on the keyboard when asked. - -Disconnect the first half, connect the second one and repeat the process. - - # for Pro Micro-based builds - make sofle/keyhive:default:avrdude-split-left - make sofle/keyhive:default:avrdude-split-right - - # for Elite C or DFU bootloader builds - make sofle/keyhive:default:dfu-split-left - make sofle/keyhive:default:dfu-split-right - -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). diff --git a/keyboards/sofle/keymaps/rgb_default/config.h b/keyboards/sofle/keymaps/rgb_default/config.h deleted file mode 100644 index 564133ce7a..0000000000 --- a/keyboards/sofle/keymaps/rgb_default/config.h +++ /dev/null @@ -1,124 +0,0 @@ - /* Copyright 2021 Dane Evans - * - * 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 USE_MATRIX_I2C - -/* Select hand configuration */ - -///https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/ - -#define CUSTOM_FONT - -#define CUSTOM_LAYER_READ //if you remove this it causes issues - needs better guarding - - -#define QUICK_TAP_TERM 0 -#ifdef TAPPING_TERM - #undef TAPPING_TERM - #define TAPPING_TERM 200 -#endif -#define ENCODER_DIRECTION_FLIP - - -#define RGBLIGHT_SLEEP -// -#define RGBLIGHT_LAYERS - -/* ws2812 RGB LED */ -#define WS2812_DI_PIN D3 - - -#ifdef RGB_MATRIX_ENABLE -#define RGBLIGHT_LED_COUNT 35 // Number of LEDs -#define RGBLIGHT_LED_COUNT 35 // Number of LEDs -#define RGB_MATRIX_LED_COUNT RGBLIGHT_LED_COUNT -#endif - -#ifdef RGBLIGHT_ENABLE - #undef RGBLIGHT_LED_COUNT - - //#define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - //#define RGBLIGHT_EFFECT_RAINBOW_SWIRL - //#define RGBLIGHT_EFFECT_SNAKE - //#define RGBLIGHT_EFFECT_KNIGHT - //#define RGBLIGHT_EFFECT_CHRISTMAS - //#define RGBLIGHT_EFFECT_STATIC_GRADIENT - //#define RGBLIGHT_EFFECT_RGB_TEST - //#define RGBLIGHT_EFFECT_ALTERNATING - //#define RGBLIGHT_EFFECT_TWINKLE - - #define RGBLIGHT_LED_COUNT 70 - #undef RGBLED_SPLIT - #define RGBLED_SPLIT { 35, 35 } // haven't figured out how to use this yet - - //#define RGBLIGHT_LED_COUNT 30 - #undef RGBLIGHT_LIMIT_VAL - #define RGBLIGHT_LIMIT_VAL 120 - #define RGBLIGHT_HUE_STEP 10 - #define RGBLIGHT_SAT_STEP 17 - #define RGBLIGHT_VAL_STEP 17 -#endif - -#ifdef RGB_MATRIX_ENABLE -# define RGB_MATRIX_KEYPRESSES // reacts to keypresses -// # define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses) -# define RGB_MATRIX_SLEEP // turn off effects when suspended -# define RGB_MATRIX_FRAMEBUFFER_EFFECTS -// # define RGB_MATRIX_LED_PROCESS_LIMIT (RGB_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness) -// # define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness) -# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash. - -#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_GRADIENT_LEFT_RIGHT - -# define RGB_MATRIX_HUE_STEP 8 -# define RGB_MATRIX_SAT_STEP 8 -# define RGB_MATRIX_VAL_STEP 8 -# define RGB_MATRIX_SPD_STEP 10 - -/* Disable the animations you don't want/need. You will need to disable a good number of these * - * because they take up a lot of space. Disable until you can successfully compile your firmware. */ - // # undef ENABLE_RGB_MATRIX_ALPHAS_MODS - // # undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN - // # undef ENABLE_RGB_MATRIX_BREATHING - // # undef ENABLE_RGB_MATRIX_CYCLE_ALL - // # undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT - // # undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN - // # undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN - // # undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL - // # undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON - // # undef ENABLE_RGB_MATRIX_DUAL_BEACON - // # undef ENABLE_RGB_MATRIX_RAINBOW_BEACON - // # undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS - // # undef ENABLE_RGB_MATRIX_RAINDROPS - // # undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS - // # undef ENABLE_RGB_MATRIX_TYPING_HEATMAP - // # undef ENABLE_RGB_MATRIX_DIGITAL_RAIN - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS - // # undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS - // # undef ENABLE_RGB_MATRIX_SPLASH - // # undef ENABLE_RGB_MATRIX_MULTISPLASH - // # undef ENABLE_RGB_MATRIX_SOLID_SPLASH - // # undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH -#endif diff --git a/keyboards/sofle/keymaps/rgb_default/keymap.c b/keyboards/sofle/keymaps/rgb_default/keymap.c deleted file mode 100644 index e992cf9adb..0000000000 --- a/keyboards/sofle/keymaps/rgb_default/keymap.c +++ /dev/null @@ -1,559 +0,0 @@ - - /* Copyright 2021 Dane Evans - * - * 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 . - */ - // SOFLE RGB -#include - -#include QMK_KEYBOARD_H - -#define INDICATOR_BRIGHTNESS 30 - -#define HSV_OVERRIDE_HELP(h, s, v, Override) h, s , Override -#define HSV_OVERRIDE(hsv, Override) HSV_OVERRIDE_HELP(hsv,Override) - -// Light combinations -#define SET_INDICATORS(hsv) \ - {0, 1, HSV_OVERRIDE_HELP(hsv, INDICATOR_BRIGHTNESS)}, \ - {35+0, 1, hsv} -#define SET_UNDERGLOW(hsv) \ - {1, 6, hsv}, \ - {35+1, 6,hsv} -#define SET_NUMPAD(hsv) \ - {35+15, 5, hsv},\ - {35+22, 3, hsv},\ - {35+27, 3, hsv} -#define SET_NUMROW(hsv) \ - {10, 2, hsv}, \ - {20, 2, hsv}, \ - {30, 2, hsv}, \ - {35+ 10, 2, hsv}, \ - {35+ 20, 2, hsv}, \ - {35+ 30, 2, hsv} -#define SET_INNER_COL(hsv) \ - {33, 4, hsv}, \ - {35+ 33, 4, hsv} - -#define SET_OUTER_COL(hsv) \ - {7, 4, hsv}, \ - {35+ 7, 4, hsv} -#define SET_THUMB_CLUSTER(hsv) \ - {25, 2, hsv}, \ - {35+ 25, 2, hsv} -#define SET_LAYER_ID(hsv) \ - {0, 1, HSV_OVERRIDE_HELP(hsv, INDICATOR_BRIGHTNESS)}, \ - {35+0, 1, HSV_OVERRIDE_HELP(hsv, INDICATOR_BRIGHTNESS)}, \ - {1, 6, hsv}, \ - {35+1, 6, hsv}, \ - {7, 4, hsv}, \ - {35+ 7, 4, hsv}, \ - {25, 2, hsv}, \ - {35+ 25, 2, hsv} - - -enum sofle_layers { - _DEFAULTS = 0, - _QWERTY = 0, - _COLEMAK, - _COLEMAKDH, - _LOWER, - _RAISE, - _ADJUST, - _NUMPAD, - _SWITCH -}; - -enum custom_keycodes { - KC_LOWER = SAFE_RANGE, - KC_RAISE, - KC_ADJUST, - KC_D_MUTE -}; - -#define KC_QWERTY PDF(_QWERTY) -#define KC_COLEMAK PDF(_COLEMAK) -#define KC_COLEMAKDH PDF(_COLEMAKDH) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* - * QWERTY - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | E | R | T | | Y | U | I | O | P | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | V | B |-------| |-------| N | M | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - [_QWERTY] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_GRV, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - LT(_NUMPAD,KC_TAB),KC_Q,KC_W,KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_D_MUTE,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_BSPC, KC_LGUI, KC_LOWER, KC_SPC, KC_ENT , KC_SPC, KC_ENT , KC_RAISE, KC_RCTL, KC_RALT - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), - -/* - * COLEMAK - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | F | P | G | | J | L | U | Y | ; | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | V | B |-------| |-------| K | M | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ -[_COLEMAK] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRNS, KC_TRNS,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), - -/* - * COLEMAK-DH - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | F | P | B | | J | L | U | Y | ; | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | R | S | T | G |-------. ,-------| M | N | E | I | O | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | D | V |-------| |-------| K | H | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ -[_COLEMAKDH] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_TRNS, KC_TRNS,KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), - -/* LOWER - * ,-----------------------------------------. ,-----------------------------------------. - * | trans| F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | trans| ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | trans| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ -[_LOWER] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_PGUP, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_DEL, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_PGDN,_______, _______,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), -/* RAISE - * ,----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ -[_RAISE] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_CIRC, KC_AMPR,KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_MINS, KC_EQL, KC_LCBR, KC_RCBR, KC_PIPE, KC_GRV, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX,_______, _______,KC_UNDS, KC_PLUS,KC_LBRC, KC_RBRC, KC_BSLS, KC_TILD, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), -/* ADJUST - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | QK_BOOT| | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |UG_TOGG|hue^ |sat ^ | bri ^| |COLEMAK|-------. ,-------|desk <| | |desk >| | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | mode | hue dn|sat d|bri dn| |QWERTY|-------| |-------| | PREV | PLAY | NEXT | | | - * `-----------------------------------------/ / \ \-----------------------------------------' - * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - [_ADJUST] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - QK_BOOT, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - UG_TOGG, UG_HUEU,UG_SATU, UG_VALU, KC_COLEMAKDH,KC_COLEMAK, C(G(KC_LEFT)),KC_NO,KC_NO,C(G(KC_RGHT)),XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - UG_NEXT, UG_HUED,UG_SATD, UG_VALD, XXXXXXX,KC_QWERTY,XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), -/* NUMPAD - * ,-----------------------------------------. ,-----------------------------------------. - * | trans| | | | | | | |NumLck| | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | | | | | | | ^ | 7 | 8 | 9 | * | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | trans| | | | | |-------. ,-------| - | 4 | 5 | 6 | | | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | trans| | | | | |-------| |-------| + | 1 | 2 | 3 | \ | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE | 0 | . | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ -[_NUMPAD] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_NUM, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CIRC, KC_P7, KC_P8, KC_P9, KC_ASTR, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_P4, KC_P5, KC_P6, KC_EQL, KC_PIPE, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,_______, _______,KC_PLUS, KC_P1, KC_P2, KC_P3, KC_SLSH, _______, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, OSM(MOD_MEH), _______, _______, _______, _______, _______, KC_P0, KC_PDOT, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ -), - -/* SWITCH - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | qwer | cole |col_dh| low | raise| adj | |numpad| | | | |QK_BOOT | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | | | | |EE_CLR| - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | SLEEP| | | | | |-------| |-------| | | | | | | - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE | 0 | . | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - // layer switcher -[_SWITCH] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - TO(0), TO(1), TO(2), TO(3), TO(4), TO(5), TO(6), KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_NO, KC_NO, KC_BRIU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, EE_CLR, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_SYSTEM_SLEEP,KC_NO,KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ - - ), -}; - -#ifdef RGBLIGHT_ENABLE -char layer_state_str[70]; -// Now define the array of layers. Later layers take precedence - -// QWERTY, -// Light on inner column and underglow -const rgblight_segment_t PROGMEM layer_qwerty_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_RED) - -); -const rgblight_segment_t PROGMEM layer_colemakdh_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_PINK) -); - -// _NUM, -// Light on outer column and underglow -const rgblight_segment_t PROGMEM layer_num_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_TEAL) - -); -// _SYMBOL, -// Light on inner column and underglow -const rgblight_segment_t PROGMEM layer_symbol_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_BLUE) - - ); -// _COMMAND, -// Light on inner column and underglow -const rgblight_segment_t PROGMEM layer_command_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_PURPLE) -); - -//_NUMPAD -const rgblight_segment_t PROGMEM layer_numpad_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_INDICATORS(HSV_ORANGE), - SET_UNDERGLOW(HSV_ORANGE), - SET_NUMPAD(HSV_BLUE), - {7, 4, HSV_ORANGE}, - {25, 2, HSV_ORANGE}, - {35+6, 4, HSV_ORANGE}, - {35+25, 2, HSV_ORANGE} - ); -// _SWITCHER // light up top row -const rgblight_segment_t PROGMEM layer_switcher_lights[] = RGBLIGHT_LAYER_SEGMENTS( - SET_LAYER_ID(HSV_GREEN), - SET_NUMROW(HSV_GREEN) -); - -const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST( - - layer_qwerty_lights, - layer_num_lights,// overrides layer 1 - layer_symbol_lights, - layer_command_lights, - layer_numpad_lights, - layer_switcher_lights, // Overrides other layers - layer_colemakdh_lights -); - -layer_state_t layer_state_set_user(layer_state_t state) { - rgblight_set_layer_state(0, layer_state_cmp(state, _DEFAULTS) && layer_state_cmp(default_layer_state,_QWERTY)); - rgblight_set_layer_state(7, layer_state_cmp(state, _DEFAULTS) && layer_state_cmp(default_layer_state,_COLEMAKDH)); - - - rgblight_set_layer_state(1, layer_state_cmp(state, _LOWER)); - rgblight_set_layer_state(2, layer_state_cmp(state, _RAISE)); - rgblight_set_layer_state(3, layer_state_cmp(state, _ADJUST)); - rgblight_set_layer_state(4, layer_state_cmp(state, _NUMPAD)); - rgblight_set_layer_state(5, layer_state_cmp(state, _SWITCH)); - return state; -} -void keyboard_post_init_user(void) { - // Enable the LED layers - rgblight_layers = my_rgb_layers; - - rgblight_mode(10);// haven't found a way to set this in a more useful way - -} -#endif - -#ifdef OLED_ENABLE - -static void render_logo(void) { - static const char PROGMEM qmk_logo[] = { - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 - }; - - oled_write_P(qmk_logo, false); -} - -static void print_status_narrow(void) { - // Print current mode - oled_write_P(PSTR("\n\n"), false); - oled_write_ln_P(PSTR("Dane\nEvans"), false); - - oled_write_ln_P(PSTR(""), false); - - //snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state) - - - switch (get_highest_layer(default_layer_state)) { - case _QWERTY: - oled_write_ln_P(PSTR("Qwrt"), false); - break; - case _COLEMAK: - oled_write_ln_P(PSTR("Clmk"), false); - break; - case _COLEMAKDH: - oled_write_ln_P(PSTR("CmkDH"), false); - break; - - default: - oled_write_ln_P(PSTR("Undef"), false); - } - oled_write_P(PSTR("\n\n"), false); - // Print current layer - oled_write_ln_P(PSTR("LAYER"), false); - switch (get_highest_layer(layer_state)) { - case _COLEMAK: - case _QWERTY: - case _COLEMAKDH: - oled_write_P(PSTR("Base\n"), false); - break; - case _RAISE: - oled_write_P(PSTR("Raise"), false); - break; - case _LOWER: - oled_write_P(PSTR("Lower"), false); - break; - case _ADJUST: - oled_write_P(PSTR("Adj\n"), false); - break; - case _NUMPAD: - oled_write_P(PSTR("Nump\n"), false); - break; - case _SWITCH: - oled_write_P(PSTR("Swit\n"), false); - break; - default: - oled_write_ln_P(PSTR("Undef"), false); - } -} - -oled_rotation_t oled_init_user(oled_rotation_t rotation) { - if (is_keyboard_master()) { - return OLED_ROTATION_270; - } - return rotation; -} - -bool oled_task_user(void) { - if (is_keyboard_master()) { - print_status_narrow(); - } else { - render_logo(); - } - return false; -} - -#endif - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - case KC_RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - case KC_ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - case KC_D_MUTE: - if (record->event.pressed) { - register_mods(mod_config(MOD_MEH)); - register_code(KC_UP); - } else { - unregister_mods(mod_config(MOD_MEH)); - unregister_code(KC_UP); - } - } - return true; -} - -#ifdef ENCODER_ENABLE - -bool encoder_update_user(uint8_t index, bool clockwise) { - if (index == 0) { - if (clockwise) { - tap_code(KC_VOLU); - } else { - tap_code(KC_VOLD); - } - } else if (index == 1) { - switch (get_highest_layer(layer_state)) { - case _COLEMAK: - case _QWERTY: - case _COLEMAKDH: - if (clockwise) { - tap_code(KC_PGDN); - } else { - tap_code(KC_PGUP); - } - break; - case _RAISE: - case _LOWER: - if (clockwise) { - tap_code(KC_DOWN); - } else { - tap_code(KC_UP); - } - break; - default: - if (clockwise) { - tap_code(KC_WH_D); - } else { - tap_code(KC_WH_U); - } - break; - } - } - return true; -} - -#endif diff --git a/keyboards/sofle/keymaps/rgb_default/rules.mk b/keyboards/sofle/keymaps/rgb_default/rules.mk deleted file mode 100644 index 0d18161a0d..0000000000 --- a/keyboards/sofle/keymaps/rgb_default/rules.mk +++ /dev/null @@ -1,7 +0,0 @@ -MOUSEKEY_ENABLE = yes -EXTRAKEY_ENABLE = yes -CONSOLE_ENABLE = no -RGBLIGHT_ENABLE = yes -ENCODER_ENABLE = yes -LTO_ENABLE = yes -OLED_ENABLE = yes diff --git a/keyboards/sofle/readme.md b/keyboards/sofle/readme.md index 7e8ef215c2..6af2a93ec5 100644 --- a/keyboards/sofle/readme.md +++ b/keyboards/sofle/readme.md @@ -4,24 +4,37 @@ Sofle is 6×4+5 keys column-staggered split keyboard. Based on Lily58, Corne and Helix keyboards. -More details about the keyboard on my blog: [Let me introduce you SofleKeyboard - a split keyboard based on Lily58 and Crkbd](https://josef-adamcik.cz/electronics/let-me-introduce-you-sofle-keyboard-split-keyboard-based-on-lily58.html) - -The current (temporary) build guide and a build log is available here: [SofleKeyboard build log/guide](https://josef-adamcik.cz/electronics/soflekeyboard-build-log-and-build-guide.html) +More details about the keyboard and build guides can be found here: [Sofle Keyboard Build Log and Guide](https://josefadamcik.github.io/SofleKeyboard) * Keyboard Maintainer: [Josef Adamcik](https://josef-adamcik.cz) [Twitter:@josefadamcik](https://twitter.com/josefadamcik) * Hardware Supported: SofleKeyboard PCB, ProMicro * Hardware Availability: [PCB & Case Data](https://github.com/josefadamcik/SofleKeyboard) +## Firmware Revisions +- `sofle/rev1` is used for v1, v2, and RGB PCBs (**NOT** RGB PCBs purchased from [Keyhive](https://keyhive.xyz)) +- `sofle/keyhive` is used for PCBs purchased from [Keyhive](https://keyhive.xyz/shop/sofle) +- [`keyboards/sofle_choc`](../sofle_choc/) is used for Choc PCBs + Make example for this keyboard (after setting up your build environment): - make sofle:default + make sofle/rev1:default + make sofle/keyhive:default -Flash the default keymap: +Flashing example for this keyboard: - make sofle:default:avrdude + make sofle/rev1:default:flash + make sofle/keyhive:default:flash Press reset button on he keyboard when asked. Disconnect the first half, connect the second one and repeat the process. 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 +* **Physical reset button**: Briefly press the button near the TRRS connector. Quickly double-tap if you are using Pro Micro. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/sofle/rev1/readme.md b/keyboards/sofle/rev1/readme.md deleted file mode 100644 index 1d229030c4..0000000000 --- a/keyboards/sofle/rev1/readme.md +++ /dev/null @@ -1,27 +0,0 @@ -# Sofle Keyboard - -![SofleKeyboard version 1](https://i.imgur.com/S5GTKth.jpeg) - -Sofle is 6×4+5 keys column-staggered split keyboard. Based on Lily58, Corne and Helix keyboards. - -More details about the keyboard on my blog: [Let me introduce you SofleKeyboard - a split keyboard based on Lily58 and Crkbd](https://josef-adamcik.cz/electronics/let-me-introduce-you-sofle-keyboard-split-keyboard-based-on-lily58.html) - -The current (temporary) build guide and a build log is available here: [SofleKeyboard build log/guide](https://josef-adamcik.cz/electronics/soflekeyboard-build-log-and-build-guide.html) - -* Keyboard Maintainer: [Josef Adamcik](https://josef-adamcik.cz) [Twitter:@josefadamcik](https://twitter.com/josefadamcik) -* Hardware Supported: SofleKeyboard PCB, ProMicro -* Hardware Availability: [PCB & Case Data](https://github.com/josefadamcik/SofleKeyboard) - -Make example for this keyboard (after setting up your build environment): - - make sofle:default - -Flashing example for this keyboard: - - make sofle:default:flash - -Press reset button on he keyboard when asked. - -Disconnect the first half, connect the second one and repeat the process. - -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). From 80612c8ec0e87077cdef1afc42c052732bdb2a75 Mon Sep 17 00:00:00 2001 From: Daniel Reisch Date: Mon, 14 Apr 2025 10:27:52 -0700 Subject: [PATCH 289/592] Added Keyboard LumPy27 (#24967) Co-authored-by: jack Co-authored-by: Drashna Jaelre --- keyboards/djreisch/lumpy27/keyboard.json | 55 ++++++++++++++ .../djreisch/lumpy27/keymaps/default/keymap.c | 76 +++++++++++++++++++ keyboards/djreisch/lumpy27/readme.md | 29 +++++++ 3 files changed, 160 insertions(+) create mode 100644 keyboards/djreisch/lumpy27/keyboard.json create mode 100644 keyboards/djreisch/lumpy27/keymaps/default/keymap.c create mode 100644 keyboards/djreisch/lumpy27/readme.md diff --git a/keyboards/djreisch/lumpy27/keyboard.json b/keyboards/djreisch/lumpy27/keyboard.json new file mode 100644 index 0000000000..d6c4b180bd --- /dev/null +++ b/keyboards/djreisch/lumpy27/keyboard.json @@ -0,0 +1,55 @@ +{ + "manufacturer": "djreisch", + "keyboard_name": "LumPy27", + "maintainer": "djreisch", + "board": "GENERIC_RP_RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5"], + "rows": ["GP14", "GP15", "GP16", "GP17", "GP18"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x2326", + "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}, + {"matrix": [0, 5], "x": 5, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4} + ] + } + } +} diff --git a/keyboards/djreisch/lumpy27/keymaps/default/keymap.c b/keyboards/djreisch/lumpy27/keymaps/default/keymap.c new file mode 100644 index 0000000000..48897c8064 --- /dev/null +++ b/keyboards/djreisch/lumpy27/keymaps/default/keymap.c @@ -0,0 +1,76 @@ +/* Copyright 2024 Daniel Reisch (djreisch) + * + * 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 + +enum custom_keycodes { MACRO_GG = QK_USER }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + Main + ,-----------------------------------------. + | ESC | 1 | 2 | 3 | 4 | 5 | + |------+------+------+------+------+------| + | Tab | G | Q | W | E | R | + |------+------+------+------+------+------| + | LSHIFT | A | S | D | F | + |------+------+------+------+------+------| + | LCTL | B | Z | X | C | V |-------| + `-----------------------------------------/ / + | LAlt | FN | / Space / + | | |/ / + `---------------------' + */ + [0] = LAYOUT(KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_TAB, KC_G, KC_Q, KC_W, KC_E, KC_R, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, + KC_LCTL, KC_B, KC_Z, KC_X, KC_C, KC_V, + KC_LALT, MO(1), KC_SPACE), + + /* + Alt + ,-----------------------------------------. + | ESC | 0 | 9 | 8 | 7 | 6 | + |------+------+------+------+------+------| + | F1 | F2 | F3 | F4 | F5 | F6 | + |------+------+------+------+------+------| + | LSHIFT | A | S | Y | H | + |------+------+------+------+------+------| + | LCTL | B | Z | X | C | M |-------| + `-----------------------------------------/ / + | LAlt | FN | / Enter / + | | |/ / + `---------------------' + */ + [1] = LAYOUT(KC_ESC, KC_0, KC_9, KC_8, KC_7, KC_6, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_LSFT, KC_A, KC_S, KC_Y, KC_H, + KC_LCTL, MACRO_GG, KC_Z, KC_X, KC_C, KC_M, + KC_LALT, KC_TRNS, KC_ENTER) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case MACRO_GG: + if (record->event.pressed) { + // when keycode MACRO_GG is pressed, press shift+enter, send string "gg" and press enter + SEND_STRING(SS_DOWN(X_LSFT) SS_DELAY(10) SS_TAP(X_ENTER) SS_UP(X_LSFT) "gg" SS_TAP(X_ENTER)); + } + break; + } + + return true; +} diff --git a/keyboards/djreisch/lumpy27/readme.md b/keyboards/djreisch/lumpy27/readme.md new file mode 100644 index 0000000000..da7d1ca92b --- /dev/null +++ b/keyboards/djreisch/lumpy27/readme.md @@ -0,0 +1,29 @@ +# LumPy27 + +The Lightweight User-Modifiable Pi/Python keyboard is a 26-key ergonomic gaming keyboard running on an RP2040. Originally designed to run CircuitPython and KMK, since QMK supports the RP2040 bootloader this is now an additional option for firmware. + +Q: Why is it named the LumPy27 even though it has 26 keys? + +A: When originally designing the PCB and coming up with a name, I miscounted the switches. With the name emblazoned on the silkscreen I figured it sounded better than LumPy26. + +Q: Why are the keys in the wrong place? + +A: For certain games I found it easier instead of remapping them to just change where they are. That's why keys like B and G are not in the right spots. + +* Keyboard Maintainer: [djreisch](https://github.com/djreisch) +* Hardware Availability: [DuckyDebug.org](https://duckydebug.org/products/lumpy27-ergonomic-gaming-keyboard) + +qmk compile example for this keyboard (after setting up your build environment): + + qmk compile -kb djreisch/lumpy27 -km default + +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: + +* **Bootloader Reset**: Hold down the bootload button and press the reset button +* **Bootloader Power On**: Hold down the bootloader button and plug in the keyboard + + From e83b709169e7f19cd79f44066ba7faf17ecdd952 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 17 Apr 2025 12:41:20 +1000 Subject: [PATCH 290/592] [Keyboard] Kobold r1 (#25161) * Kobold r1 * Apply suggestions from code review Co-authored-by: jack * `board_init` => `early_hardware_init_post`. --------- Co-authored-by: jack --- keyboards/tzarc/kobold/config.h | 29 +++++++ keyboards/tzarc/kobold/halconf.h | 8 ++ keyboards/tzarc/kobold/info.json | 82 +++++++++++++++++++ .../tzarc/kobold/keymaps/default/keymap.c | 14 ++++ keyboards/tzarc/kobold/kobold.c | 18 ++++ keyboards/tzarc/kobold/mcuconf.h | 12 +++ keyboards/tzarc/kobold/r1/keyboard.json | 5 ++ keyboards/tzarc/kobold/readme.md | 29 +++++++ 8 files changed, 197 insertions(+) create mode 100644 keyboards/tzarc/kobold/config.h create mode 100644 keyboards/tzarc/kobold/halconf.h create mode 100644 keyboards/tzarc/kobold/info.json create mode 100644 keyboards/tzarc/kobold/keymaps/default/keymap.c create mode 100644 keyboards/tzarc/kobold/kobold.c create mode 100644 keyboards/tzarc/kobold/mcuconf.h create mode 100644 keyboards/tzarc/kobold/r1/keyboard.json create mode 100644 keyboards/tzarc/kobold/readme.md diff --git a/keyboards/tzarc/kobold/config.h b/keyboards/tzarc/kobold/config.h new file mode 100644 index 0000000000..b3991ae037 --- /dev/null +++ b/keyboards/tzarc/kobold/config.h @@ -0,0 +1,29 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +// Hardware-specific definitions +#define RGB_ENABLE_PIN C11 + +// WS2812 Configuration +#define WS2812_PWM_DRIVER PWMD17 +#define WS2812_PWM_CHANNEL 1 +#define WS2812_PWM_PAL_MODE 10 +#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 +#define WS2812_PWM_DMA_CHANNEL 1 +#define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM17_UP + +// SPI Configuration +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 5 +#define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 5 +#define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 5 + +// External NOR Flash config +#define EXTERNAL_FLASH_SPI_MODE 0 +#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN B10 +#define EXTERNAL_FLASH_SPI_CLOCK_DIVISOR 4 // (160MHz/4) => 40MHz +#define EXTERNAL_FLASH_SIZE (16 * 1024 * 1024) // 128Mb/16MB capacity diff --git a/keyboards/tzarc/kobold/halconf.h b/keyboards/tzarc/kobold/halconf.h new file mode 100644 index 0000000000..2251180c14 --- /dev/null +++ b/keyboards/tzarc/kobold/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define HAL_USE_PWM TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/tzarc/kobold/info.json b/keyboards/tzarc/kobold/info.json new file mode 100644 index 0000000000..bed8e8a23f --- /dev/null +++ b/keyboards/tzarc/kobold/info.json @@ -0,0 +1,82 @@ +{ + "manufacturer": "Tzarc", + "keyboard_name": "Kobold", + "url": "https://github.com/tzarc/keyboards/tree/main/Kobold", + "maintainer": "tzarc", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "dynamic_keymap": { + "layer_count": 32 + }, + "eeprom": { + "driver": "wear_leveling", + "wear_leveling": { + "backing_size": 32768, + "driver": "spi_flash" + } + }, + "features": { + "bootmagic": true, + "rgb_matrix": true + }, + "matrix_pins": { + "direct": [ + ["B14", "C6", "B9", "B7", "B13", "B15", "C13", "C15", "B12", "B0", "A2", "A0", "B11", "A4", "A3", "A1"] + ] + }, + "processor": "STM32G431", + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"x": 0, "y": 0, "flags": 2}, + {"x": 75, "y": 0, "flags": 2}, + {"x": 150, "y": 0, "flags": 2}, + {"x": 224, "y": 0, "flags": 2}, + {"x": 224, "y": 21, "flags": 2}, + {"x": 150, "y": 21, "flags": 2}, + {"x": 75, "y": 21, "flags": 2}, + {"x": 0, "y": 21, "flags": 2}, + {"x": 0, "y": 43, "flags": 2}, + {"x": 75, "y": 43, "flags": 2}, + {"x": 150, "y": 43, "flags": 2}, + {"x": 224, "y": 43, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 150, "y": 64, "flags": 2}, + {"x": 75, "y": 64, "flags": 2}, + {"x": 0, "y": 64, "flags": 2} + ] + }, + "usb": { + "pid": "0x4921", + "vid": "0x1209" + }, + "ws2812": { + "driver": "pwm", + "pin": "B5" + }, + "community_layouts": ["ortho_4x4"], + "layouts": { + "LAYOUT_ortho_4x4": { + "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": 0, "y": 1}, + {"matrix": [0, 5], "x": 1, "y": 1}, + {"matrix": [0, 6], "x": 2, "y": 1}, + {"matrix": [0, 7], "x": 3, "y": 1}, + {"matrix": [0, 8], "x": 0, "y": 2}, + {"matrix": [0, 9], "x": 1, "y": 2}, + {"matrix": [0, 10], "x": 2, "y": 2}, + {"matrix": [0, 11], "x": 3, "y": 2}, + {"matrix": [0, 12], "x": 0, "y": 3}, + {"matrix": [0, 13], "x": 1, "y": 3}, + {"matrix": [0, 14], "x": 2, "y": 3}, + {"matrix": [0, 15], "x": 3, "y": 3} + ] + } + } +} diff --git a/keyboards/tzarc/kobold/keymaps/default/keymap.c b/keyboards/tzarc/kobold/keymaps/default/keymap.c new file mode 100644 index 0000000000..d78325c78b --- /dev/null +++ b/keyboards/tzarc/kobold/keymaps/default/keymap.c @@ -0,0 +1,14 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x4( + KC_A, KC_B, KC_C, KC_D, + KC_E, KC_F, KC_G, KC_H, + KC_I, KC_J, KC_K, KC_L, + KC_M, KC_N, KC_O, KC_P + ), +}; +// clang-format on diff --git a/keyboards/tzarc/kobold/kobold.c b/keyboards/tzarc/kobold/kobold.c new file mode 100644 index 0000000000..0460a4fe85 --- /dev/null +++ b/keyboards/tzarc/kobold/kobold.c @@ -0,0 +1,18 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +void early_hardware_init_post(void) { + // Disable RGB LEDs + gpio_set_pin_output(RGB_ENABLE_PIN); + gpio_write_pin(RGB_ENABLE_PIN, 1); +} + +void housekeeping_task_kb() { + // Enable RGB LEDs after 200 milliseconds + static bool rgb_enabled = false; + if (!rgb_enabled && timer_read32() > 200) { + gpio_write_pin(RGB_ENABLE_PIN, 0); + rgb_enabled = true; + } +} diff --git a/keyboards/tzarc/kobold/mcuconf.h b/keyboards/tzarc/kobold/mcuconf.h new file mode 100644 index 0000000000..5d7fdbe232 --- /dev/null +++ b/keyboards/tzarc/kobold/mcuconf.h @@ -0,0 +1,12 @@ +// Copyright 2025 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include_next + +// Used for SK6812 chain +#undef STM32_PWM_USE_TIM17 +#define STM32_PWM_USE_TIM17 TRUE + +// Used for NOR Flash +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/tzarc/kobold/r1/keyboard.json b/keyboards/tzarc/kobold/r1/keyboard.json new file mode 100644 index 0000000000..ad889c2304 --- /dev/null +++ b/keyboards/tzarc/kobold/r1/keyboard.json @@ -0,0 +1,5 @@ +{ + "usb": { + "device_version": "1.0.0" + } +} diff --git a/keyboards/tzarc/kobold/readme.md b/keyboards/tzarc/kobold/readme.md new file mode 100644 index 0000000000..0c73ed49e7 --- /dev/null +++ b/keyboards/tzarc/kobold/readme.md @@ -0,0 +1,29 @@ +# Kobold + +![Kobold](https://i.imgur.com/R8nDodO.jpg) + +4x4 macropad running QMK, in the same form factor as a bm16s. Non-standard Choc key spacing. + +North-facing RGB, SPI NOR Flash, voltage and current measurement, direct pin matrix, reset to bootloader by holding top 4 keys. + +* Keyboard Maintainer: [tzarc](https://github.com/tzarc) +* Hardware Supported: Kobold, r1 +* Hardware Availability: [KiCad files](https://github.com/tzarc/keyboards/tree/main/Kobold) + +Make example for this keyboard (after setting up your build environment): + + make tzarc/kobold/r1:default + +Flashing example for this keyboard: + + make tzarc/kobold/r1: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 top left key and plug in the keyboard +* **Physical reset button**: Simultaneously press the top four keys, or press the physical button on the back marked 'D'. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 76413592402ae2ede4d9deef0f7d91bf73026d33 Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:23:16 -0400 Subject: [PATCH 291/592] [Docs] Unify lighting step descriptions (#25167) unify lighting step descriptions and defaults across docs --- docs/features/led_matrix.md | 2 ++ docs/features/rgb_matrix.md | 4 ++++ docs/features/rgblight.md | 6 +++--- docs/reference_info_json.md | 22 +++++++++++----------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/docs/features/led_matrix.md b/docs/features/led_matrix.md index 756cc11e2b..113b13f03b 100644 --- a/docs/features/led_matrix.md +++ b/docs/features/led_matrix.md @@ -227,6 +227,8 @@ For inspiration and examples, check out the built-in effects under `quantum/led_ #define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set #define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set #define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set +#define LED_MATRIX_VAL_STEP 8 // The value by which to increment the brightness per adjustment action +#define LED_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action #define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set #define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR diff --git a/docs/features/rgb_matrix.md b/docs/features/rgb_matrix.md index 0e53ce9c35..a22f931f1b 100644 --- a/docs/features/rgb_matrix.md +++ b/docs/features/rgb_matrix.md @@ -378,6 +378,10 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master #define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set #define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set #define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set +#define RGB_MATRIX_HUE_STEP 8 // The value by which to increment the hue per adjustment action +#define RGB_MATRIX_SAT_STEP 16 // The value by which to increment the saturation per adjustment action +#define RGB_MATRIX_VAL_STEP 16 // The value by which to increment the brightness per adjustment action +#define RGB_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action #define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set #define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR diff --git a/docs/features/rgblight.md b/docs/features/rgblight.md index 4322fe796e..43e3781f8d 100644 --- a/docs/features/rgblight.md +++ b/docs/features/rgblight.md @@ -97,9 +97,9 @@ Your RGB lighting can be configured by placing these `#define`s in your `config. |Define |Default |Description | |---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------| -|`RGBLIGHT_HUE_STEP` |`8` |The number of steps to cycle through the hue by | -|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by | -|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by | +|`RGBLIGHT_HUE_STEP` |`8` |The value by which to increment the hue per adjustment action | +|`RGBLIGHT_SAT_STEP` |`17` |The value by which to increment the saturation per adjustment action | +|`RGBLIGHT_VAL_STEP` |`17` |The value by which to increment the brightness per adjustment action | |`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level | |`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep | |`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added | diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index 29b999c32e..0f8f680b55 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -413,7 +413,7 @@ Configures the [LED Matrix](features/led_matrix) feature. * Default: `16` * `led_process_limit` Number * Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness). - * Default: `led_count / 5` + * Default: `(led_count + 4) / 5` * `max_brightness` Number * The maximum value which brightness is scaled to, from 0 to 255. * Default: `255` @@ -424,7 +424,7 @@ Configures the [LED Matrix](features/led_matrix) feature. * Turn off the LEDs when the host goes to sleep. * Default: `false` * `speed_steps` Number - * The number of speed adjustment steps. + * The value by which to increment the speed. * Default: `16` * `split_count` Array: Number * For split keyboards, the number of LEDs on each half. @@ -433,7 +433,7 @@ Configures the [LED Matrix](features/led_matrix) feature. * The LED activity timeout in milliseconds. * Default: `0` (no timeout) * `val_steps` Number - * The number of brightness adjustment steps. + * The value by which to increment the brightness. * Default: `8` ## Matrix {#matrix} @@ -549,7 +549,7 @@ Configures the [RGB Lighting](features/rgblight) feature. } ``` * `brightness_steps` Number - * The number of brightness adjustment steps. + * The value by which to increment the brightness. * Default: `17` * `default` * `animation` String @@ -574,7 +574,7 @@ Configures the [RGB Lighting](features/rgblight) feature. * The driver to use. Must be one of `apa102`, `custom`, `ws2812`. * Default: `"ws2812"` * `hue_steps` Number - * The number of hue adjustment steps. + * The value by which to increment the hue. * Default: `8` * `layers` * `blink` Boolean @@ -593,7 +593,7 @@ Configures the [RGB Lighting](features/rgblight) feature. * The maximum value which the HSV "V" component is scaled to, from 0 to 255. * Default: `255` * `saturation_steps` Number - * The number of saturation adjustment steps. + * The value by which to increment the suturation. * Default: `17` * `sleep` Boolean * Turn off the LEDs when the host goes to sleep. @@ -645,7 +645,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature. * `driver` String Required * The driver to use. Must be one of `aw20216s`, `custom`, `is31fl3218`, `is31fl3236`, `is31fl3729`, `is31fl3731`, `is31fl3733`, `is31fl3736`, `is31fl3737`, `is31fl3741`, `is31fl3742a`, `is31fl3743a`, `is31fl3745`, `is31fl3746a`, `snled27351`, `ws2812`. * `hue_steps` Number - * The number of hue adjustment steps. + * The value by which to increment the hue. * Default: `8` * `layout` Array: Object Required * List of LED configuration dictionaries. Each dictionary contains: @@ -664,7 +664,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature. * Default: `16` * `led_process_limit` Number * Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness). - * Default: `led_count / 5` + * Default: `(led_count + 4) / 5` * `max_brightness` Number * The maximum value which the HSV "V" component is scaled to, from 0 to 255. * Default: `255` @@ -672,13 +672,13 @@ Configures the [RGB Matrix](features/rgb_matrix) feature. * Animations react to keyup instead of keydown. * Default: `false` * `sat_steps` Number - * The number of saturation adjustment steps. + * The value by which to increment the saturation. * Default: `16` * `sleep` Boolean * Turn off the LEDs when the host goes to sleep. * Default: `false` * `speed_steps` Number - * The number of speed adjustment steps. + * The value by which to increment the speed. * Default: `16` * `split_count` Array: Number * For split keyboards, the number of LEDs on each half. @@ -687,7 +687,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature. * The LED activity timeout in milliseconds. * Default: `0` (no timeout) * `val_steps` Number - * The number of brightness adjustment steps. + * The value by which to increment the brightness. * Default: `16` ## Secure {#secure} From 576325e2f489b888fda9c74df08534856cfea5c2 Mon Sep 17 00:00:00 2001 From: JamesWilson1996 <47866504+JamesWilson1996@users.noreply.github.com> Date: Thu, 17 Apr 2025 19:50:41 +0100 Subject: [PATCH 292/592] [Keyboard] Add voidhhkb-hotswap (#25007) * Added files for voidhhkb-hotswap * Updated keyboard name to resolve build errors * Implement suggestions from PR. Use 60_hhkb community layout. * Update keyboards/void/voidhhkb_hotswap/readme.md Co-authored-by: Ryan * Apply suggestions from code review Co-authored-by: jack --------- Co-authored-by: Ryan Co-authored-by: jack --- keyboards/void/voidhhkb_hotswap/keyboard.json | 97 +++++++++++++++++++ .../voidhhkb_hotswap/keymaps/default/keymap.c | 21 ++++ keyboards/void/voidhhkb_hotswap/readme.md | 29 ++++++ 3 files changed, 147 insertions(+) create mode 100644 keyboards/void/voidhhkb_hotswap/keyboard.json create mode 100644 keyboards/void/voidhhkb_hotswap/keymaps/default/keymap.c create mode 100644 keyboards/void/voidhhkb_hotswap/readme.md diff --git a/keyboards/void/voidhhkb_hotswap/keyboard.json b/keyboards/void/voidhhkb_hotswap/keyboard.json new file mode 100644 index 0000000000..460454cc5f --- /dev/null +++ b/keyboards/void/voidhhkb_hotswap/keyboard.json @@ -0,0 +1,97 @@ +{ + "manufacturer": "James Wilson", + "keyboard_name": "voidhhkb_hotswap", + "maintainer": "JamesWilson1996", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["B12", "B13", "A3", "A4", "B14", "B15", "A8", "A5", "A9", "A10", "A6", "A7", "A15", "B3", "B4"], + "rows": ["B11", "B10", "B2", "B1", "B0"] + }, + "processor": "STM32F072", + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0002", + "vid": "0x4A57" + }, + "community_layouts": [ "60_hhkb" ], + "layouts": { + "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, 1], "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.0, "y": 3}, + + {"matrix": [4, 2], "x": 1.5, "y": 4}, + {"matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 6}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 11.5, "y": 4} + ] + } + } +} diff --git a/keyboards/void/voidhhkb_hotswap/keymaps/default/keymap.c b/keyboards/void/voidhhkb_hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..3b28a0c1c2 --- /dev/null +++ b/keyboards/void/voidhhkb_hotswap/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// 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_60_hhkb( + 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_BSLS, KC_GRV, + 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_BSPC, + 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_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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT + ), + [1] = LAYOUT_60_hhkb( + KC_PWR, 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, + KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, KC_NO, KC_CLAG, + KC_NO, KC_VOLU, KC_VOLD, KC_MUTE, KC_EJCT, KC_NO, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_RETN, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_NO, KC_TRNS, + KC_NO, KC_NO, KC_NO, KC_MSTP, KC_NO + ) +}; diff --git a/keyboards/void/voidhhkb_hotswap/readme.md b/keyboards/void/voidhhkb_hotswap/readme.md new file mode 100644 index 0000000000..a9b78eefe7 --- /dev/null +++ b/keyboards/void/voidhhkb_hotswap/readme.md @@ -0,0 +1,29 @@ +# VoidHHKB-Hotswap + +![VoidHHKB-Hotswap)](https://i.imgur.com/dxTs8gB.jpeg) + +VoidHHKB-Hotswap 60% PCB designed for the [HSKB project](https://github.com/Dev01-D/HSKB). + +* Keyboard Maintainer: [James Wilson](https://github.com/JamesWilson1996) +* Hardware Supported: STM32F072CBT6 +* Hardware Availability: [HSKB](https://github.com/Dev01-D/HSKB) + +# Compiling + +Make example for this keyboard (after setting up your build environment): + + make void/voidhhkb_hotswap:default + +Flashing example for this keyboard: + + make void/voidhhkb_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: + +* **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 b43fc33be3df1d8f9b0b13c43dea764adf2d70c5 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 18 Apr 2025 03:59:59 +0100 Subject: [PATCH 293/592] Remove duplication of RGB Matrix defaults (#25146) * Remove duplication of RGB Matrix defaults * Remove more duplication of defaults * fix --- keyboards/adm42/rev4/keyboard.json | 1 - keyboards/ashwing66/keyboard.json | 1 - keyboards/eek/info.json | 1 - keyboards/ein_60/keyboard.json | 1 - keyboards/fs_streampad/keyboard.json | 3 --- keyboards/geekboards/macropad_v2/keyboard.json | 1 - keyboards/handwired/hnah40rgb/keyboard.json | 1 - keyboards/marcopad/keyboard.json | 3 +-- keyboards/mechboards/crkbd/pro/keyboard.json | 3 --- keyboards/mechboards/lily58/pro/keyboard.json | 3 --- keyboards/mechboards/sofle/pro/keyboard.json | 3 --- keyboards/momokai/aurora/keyboard.json | 1 - keyboards/momokai/tap_duo/keyboard.json | 1 - keyboards/momokai/tap_trio/keyboard.json | 1 - keyboards/rot13labs/veilid_sao/keyboard.json | 3 --- keyboards/splitkb/halcyon/kyria/rev4/keyboard.json | 3 --- keyboards/system76/launch_1/keyboard.json | 4 +--- 17 files changed, 2 insertions(+), 32 deletions(-) diff --git a/keyboards/adm42/rev4/keyboard.json b/keyboards/adm42/rev4/keyboard.json index efb0eea029..827c127b86 100644 --- a/keyboards/adm42/rev4/keyboard.json +++ b/keyboards/adm42/rev4/keyboard.json @@ -82,7 +82,6 @@ {"matrix": [0, 10], "x": 194, "y": 13, "flags": 4}, {"matrix": [0, 11], "x": 210, "y": 11, "flags": 4} ], - "led_flush_limit": 16, "led_process_limit": 21, "max_brightness": 170, "sat_steps": 24, diff --git a/keyboards/ashwing66/keyboard.json b/keyboards/ashwing66/keyboard.json index 27a5799964..427eebcd96 100644 --- a/keyboards/ashwing66/keyboard.json +++ b/keyboards/ashwing66/keyboard.json @@ -75,7 +75,6 @@ {"matrix": [0, 14], "x": 206, "y": 1, "flags": 4}, {"matrix": [0, 15], "x": 223, "y": 0, "flags": 4} ], - "led_flush_limit": 16, "led_process_limit": 5, "max_brightness": 125, "sleep": true diff --git a/keyboards/eek/info.json b/keyboards/eek/info.json index 86ff284347..0e510e282a 100644 --- a/keyboards/eek/info.json +++ b/keyboards/eek/info.json @@ -13,7 +13,6 @@ "val": 150 }, "driver": "ws2812", - "led_flush_limit": 16, "max_brightness": 200 }, "features": { diff --git a/keyboards/ein_60/keyboard.json b/keyboards/ein_60/keyboard.json index a7902af490..1c245fa8b4 100644 --- a/keyboards/ein_60/keyboard.json +++ b/keyboards/ein_60/keyboard.json @@ -13,7 +13,6 @@ "val": 150 }, "driver": "ws2812", - "led_flush_limit": 16, "max_brightness": 200 }, "rgblight": { diff --git a/keyboards/fs_streampad/keyboard.json b/keyboards/fs_streampad/keyboard.json index 5adefff443..bf4f36a950 100644 --- a/keyboards/fs_streampad/keyboard.json +++ b/keyboards/fs_streampad/keyboard.json @@ -76,9 +76,6 @@ "pixel_flow": true, "pixel_rain": true }, - "default": { - "animation": "cycle_left_right" - }, "sleep": true, "layout": [ {"matrix": [0, 0], "flags": 4, "x": 0, "y": 0 }, diff --git a/keyboards/geekboards/macropad_v2/keyboard.json b/keyboards/geekboards/macropad_v2/keyboard.json index 54d779570a..31f21b97bf 100644 --- a/keyboards/geekboards/macropad_v2/keyboard.json +++ b/keyboards/geekboards/macropad_v2/keyboard.json @@ -47,7 +47,6 @@ }, "default": { "animation": "cycle_up_down", - "sat": 255, "speed": 30, "val": 192 }, diff --git a/keyboards/handwired/hnah40rgb/keyboard.json b/keyboards/handwired/hnah40rgb/keyboard.json index 753b5dd00a..b5bc58e910 100644 --- a/keyboards/handwired/hnah40rgb/keyboard.json +++ b/keyboards/handwired/hnah40rgb/keyboard.json @@ -61,7 +61,6 @@ "animation": "cycle_pinwheel" }, "driver": "ws2812", - "led_flush_limit": 16, "max_brightness": 200, "react_on_keyup": true }, diff --git a/keyboards/marcopad/keyboard.json b/keyboards/marcopad/keyboard.json index c0a8ca37c0..50dc3c1ed0 100644 --- a/keyboards/marcopad/keyboard.json +++ b/keyboards/marcopad/keyboard.json @@ -34,8 +34,7 @@ "animation": "splash", "hue": 132, "sat": 102, - "speed": 80, - "val": 255 + "speed": 80 }, "driver": "ws2812", "layout": [ diff --git a/keyboards/mechboards/crkbd/pro/keyboard.json b/keyboards/mechboards/crkbd/pro/keyboard.json index 05bca63993..69a04760de 100644 --- a/keyboards/mechboards/crkbd/pro/keyboard.json +++ b/keyboards/mechboards/crkbd/pro/keyboard.json @@ -30,9 +30,6 @@ "animations": { "cycle_left_right": true }, - "default": { - "animation": "cycle_left_right" - }, "driver": "ws2812", "layout": [ {"x": 85, "y": 16, "flags": 2}, diff --git a/keyboards/mechboards/lily58/pro/keyboard.json b/keyboards/mechboards/lily58/pro/keyboard.json index d655377f19..ca620c67d8 100644 --- a/keyboards/mechboards/lily58/pro/keyboard.json +++ b/keyboards/mechboards/lily58/pro/keyboard.json @@ -30,9 +30,6 @@ "animations": { "cycle_left_right": true }, - "default": { - "animation": "cycle_left_right" - }, "driver": "ws2812", "layout": [ {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4}, diff --git a/keyboards/mechboards/sofle/pro/keyboard.json b/keyboards/mechboards/sofle/pro/keyboard.json index dbc339d9a1..e1da038644 100644 --- a/keyboards/mechboards/sofle/pro/keyboard.json +++ b/keyboards/mechboards/sofle/pro/keyboard.json @@ -30,9 +30,6 @@ "animations": { "cycle_left_right": true }, - "default": { - "animation": "cycle_left_right" - }, "driver": "ws2812", "layout": [ {"matrix": [4, 0], "x": 32, "y": 57, "flags": 4}, diff --git a/keyboards/momokai/aurora/keyboard.json b/keyboards/momokai/aurora/keyboard.json index 84ecbdeb4a..9c5ff2a043 100644 --- a/keyboards/momokai/aurora/keyboard.json +++ b/keyboards/momokai/aurora/keyboard.json @@ -45,7 +45,6 @@ "rgb_matrix": { "default": { "animation": "solid_color", - "hue": 0, "sat": 0, "val": 200 }, diff --git a/keyboards/momokai/tap_duo/keyboard.json b/keyboards/momokai/tap_duo/keyboard.json index f5351dd031..ad38187949 100644 --- a/keyboards/momokai/tap_duo/keyboard.json +++ b/keyboards/momokai/tap_duo/keyboard.json @@ -14,7 +14,6 @@ "rgb_matrix": { "default": { "animation": "solid_color", - "hue": 0, "sat": 0, "val": 200 }, diff --git a/keyboards/momokai/tap_trio/keyboard.json b/keyboards/momokai/tap_trio/keyboard.json index f61de25c10..23e9867fe7 100644 --- a/keyboards/momokai/tap_trio/keyboard.json +++ b/keyboards/momokai/tap_trio/keyboard.json @@ -14,7 +14,6 @@ "rgb_matrix": { "default": { "animation": "solid_color", - "hue": 0, "sat": 0, "val": 200 }, diff --git a/keyboards/rot13labs/veilid_sao/keyboard.json b/keyboards/rot13labs/veilid_sao/keyboard.json index 751345d264..0a0d8eecab 100644 --- a/keyboards/rot13labs/veilid_sao/keyboard.json +++ b/keyboards/rot13labs/veilid_sao/keyboard.json @@ -31,9 +31,6 @@ "cycle_left_right": true }, "driver": "ws2812", - "default": { - "animation": "cycle_left_right" - }, "layout": [ {"flags": 4, "matrix": [0, 0], "x": 0, "y": 0} ], diff --git a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json index aca43a8a16..7f699f2584 100755 --- a/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json +++ b/keyboards/splitkb/halcyon/kyria/rev4/keyboard.json @@ -65,9 +65,6 @@ "splash": true, "typing_heatmap": true }, - "default": { - "animation": "cycle_left_right" - }, "driver": "ws2812", "layout": [ {"x": 75, "y": 2, "flags": 2}, diff --git a/keyboards/system76/launch_1/keyboard.json b/keyboards/system76/launch_1/keyboard.json index 929b8c9794..b5317dd9bc 100644 --- a/keyboards/system76/launch_1/keyboard.json +++ b/keyboards/system76/launch_1/keyboard.json @@ -44,9 +44,7 @@ }, "default": { "animation": "rainbow_moving_chevron", - "hue": 142, - "sat": 255, - "speed": 127 + "hue": 142 }, "driver": "ws2812", "max_brightness": 176, From 800bc78d26ea02083be86596ab63fe7d4bf17e5c Mon Sep 17 00:00:00 2001 From: lsh4711 <120231876+lsh4711@users.noreply.github.com> Date: Fri, 18 Apr 2025 18:05:25 +0900 Subject: [PATCH 294/592] Fix missing and extra commas in JSON schema (#25057) --- data/schemas/community_module.jsonschema | 4 ++-- data/schemas/keyboard.jsonschema | 6 +++--- data/schemas/user_repo_v0.jsonschema | 4 ++-- data/schemas/user_repo_v1.jsonschema | 2 +- data/schemas/user_repo_v1_1.jsonschema | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema index a3474476df..3cdb6d6a42 100644 --- a/data/schemas/community_module.jsonschema +++ b/data/schemas/community_module.jsonschema @@ -3,7 +3,7 @@ "$id": "qmk.community_module.v1", "title": "Community Module Information", "type": "object", - "required": ["module_name", "maintainer"] + "required": ["module_name", "maintainer"], "properties": { "module_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, @@ -12,6 +12,6 @@ "format": "uri" }, "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, - "features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"}, + "features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"} } } diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 9b63f62d45..92a17e1ef8 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -30,12 +30,12 @@ "properties": { "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} } - } + }, "features_config": { "$ref": "qmk.definitions.v1#/boolean_array", "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, "not": {"required": ["lto"]} - }, + } }, "type": "object", "not": {"required": ["vendorId", "productId"]}, // reject via keys... @@ -354,7 +354,7 @@ "axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "axes": { "type": "object", - "propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]} + "propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}, "additionalProperties": { "oneOf": [ { diff --git a/data/schemas/user_repo_v0.jsonschema b/data/schemas/user_repo_v0.jsonschema index b18ac50428..58d955abe2 100644 --- a/data/schemas/user_repo_v0.jsonschema +++ b/data/schemas/user_repo_v0.jsonschema @@ -8,7 +8,7 @@ ], "properties": { "userspace_version": { - "type": "string", - }, + "type": "string" + } } } diff --git a/data/schemas/user_repo_v1.jsonschema b/data/schemas/user_repo_v1.jsonschema index 69a59bce00..88b50e8a72 100644 --- a/data/schemas/user_repo_v1.jsonschema +++ b/data/schemas/user_repo_v1.jsonschema @@ -9,7 +9,7 @@ {"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"}, {"$ref": "qmk.definitions.v1#/json_file_path"} ] - }, + } }, "required": [ "userspace_version", diff --git a/data/schemas/user_repo_v1_1.jsonschema b/data/schemas/user_repo_v1_1.jsonschema index 5a7ccce063..173d8d26d6 100644 --- a/data/schemas/user_repo_v1_1.jsonschema +++ b/data/schemas/user_repo_v1_1.jsonschema @@ -10,7 +10,7 @@ {"$ref": "qmk.definitions.v1#/keyboard_keymap_env"}, {"$ref": "qmk.definitions.v1#/json_file_path"} ] - }, + } }, "required": [ "userspace_version", From 88453acc6aa4c92fdcc90f706987114cc4b9a237 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 19 Apr 2025 19:56:45 +0100 Subject: [PATCH 295/592] Remove duplication of RGBLight defaults (#25169) --- keyboards/anavi/knobs3/keyboard.json | 3 --- keyboards/anavi/macropad10/keyboard.json | 3 --- keyboards/ask55/keyboard.json | 2 -- keyboards/cannonkeys/ripple/keyboard.json | 2 -- keyboards/chickenman/ciel65/keyboard.json | 2 -- keyboards/clueboard/17/keyboard.json | 4 +--- keyboards/clueboard/2x1800/2018/keyboard.json | 1 - keyboards/clueboard/66/rev1/keyboard.json | 4 +--- keyboards/clueboard/66/rev2/keyboard.json | 4 +--- keyboards/clueboard/66/rev3/keyboard.json | 4 +--- keyboards/clueboard/66/rev4/keyboard.json | 4 +--- keyboards/clueboard/66_hotswap/prototype/keyboard.json | 4 +--- keyboards/clueboard/card/keyboard.json | 4 +--- keyboards/ghs/jem/info.json | 2 -- keyboards/hillside/46/0_1/keyboard.json | 1 - keyboards/hillside/48/0_1/keyboard.json | 1 - keyboards/hillside/52/0_1/keyboard.json | 1 - keyboards/jaykeeb/kamigakushi/keyboard.json | 2 -- keyboards/jaykeeb/sriwedari70/keyboard.json | 2 -- keyboards/kbdfans/odinmini/keyboard.json | 1 - keyboards/keycapsss/3w6_2040/keyboard.json | 1 - keyboards/keyspensory/kp60/keyboard.json | 1 - keyboards/kprepublic/jj50/rev2/keyboard.json | 1 - keyboards/lxxt/keyboard.json | 2 -- keyboards/mechwild/bde/info.json | 3 +-- keyboards/mechwild/bde/rev2/keyboard.json | 1 - keyboards/mechwild/sugarglider/info.json | 2 -- keyboards/mk65/keyboard.json | 2 -- keyboards/mlego/m65/rev1/keyboard.json | 1 - keyboards/mlego/m65/rev2/keyboard.json | 1 - keyboards/mlego/m65/rev3/keyboard.json | 1 - keyboards/mlego/m65/rev4/keyboard.json | 1 - keyboards/mwstudio/mw80/keyboard.json | 2 -- keyboards/nightly_boards/octopadplus/keyboard.json | 2 -- keyboards/pauperboards/brick/keyboard.json | 1 - keyboards/plywrks/allaro/keyboard.json | 2 -- keyboards/prototypist/oceanographer/keyboard.json | 2 -- keyboards/rastersoft/minitkl/keyboard.json | 1 - keyboards/reedskeebs/alish40/keyboard.json | 4 +--- keyboards/salicylic_acid3/guide68/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json | 2 -- keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json | 2 -- keyboards/studiokestra/galatea/rev2/keyboard.json | 1 - keyboards/studiokestra/galatea/rev3/keyboard.json | 1 - keyboards/takashicompany/goat51/keyboard.json | 2 -- keyboards/takashicompany/spreadwriter/keyboard.json | 2 -- keyboards/tau4/keyboard.json | 1 - keyboards/tweetydabird/lbs4/keyboard.json | 3 --- keyboards/tweetydabird/lbs6/keyboard.json | 3 --- keyboards/vinhcatba/uncertainty/keyboard.json | 1 - keyboards/work_louder/micro/keyboard.json | 1 - keyboards/work_louder/numpad/keyboard.json | 1 - keyboards/yoichiro/lunakey_pico/keyboard.json | 4 +--- 53 files changed, 10 insertions(+), 97 deletions(-) diff --git a/keyboards/anavi/knobs3/keyboard.json b/keyboards/anavi/knobs3/keyboard.json index 11081ee086..86aaadf98f 100644 --- a/keyboards/anavi/knobs3/keyboard.json +++ b/keyboards/anavi/knobs3/keyboard.json @@ -23,9 +23,6 @@ "rgblight": { "led_count": 1, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, - "max_brightness": 255, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/anavi/macropad10/keyboard.json b/keyboards/anavi/macropad10/keyboard.json index a355fdd549..2e1218d45f 100644 --- a/keyboards/anavi/macropad10/keyboard.json +++ b/keyboards/anavi/macropad10/keyboard.json @@ -22,9 +22,6 @@ "rgblight": { "led_count": 4, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, - "max_brightness": 255, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/ask55/keyboard.json b/keyboards/ask55/keyboard.json index 66efb1749a..53451e5329 100644 --- a/keyboards/ask55/keyboard.json +++ b/keyboards/ask55/keyboard.json @@ -36,9 +36,7 @@ "static_gradient": true }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 8, - "max_brightness": 255, "saturation_steps": 8, "sleep": true }, diff --git a/keyboards/cannonkeys/ripple/keyboard.json b/keyboards/cannonkeys/ripple/keyboard.json index 3dc11719a1..bce98e226c 100644 --- a/keyboards/cannonkeys/ripple/keyboard.json +++ b/keyboards/cannonkeys/ripple/keyboard.json @@ -36,8 +36,6 @@ "rgblight": { "led_count": 20, "hue_steps": 17, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "static_gradient": true, "twinkle": true, diff --git a/keyboards/chickenman/ciel65/keyboard.json b/keyboards/chickenman/ciel65/keyboard.json index 8c316759a8..70527b2aaf 100644 --- a/keyboards/chickenman/ciel65/keyboard.json +++ b/keyboards/chickenman/ciel65/keyboard.json @@ -26,10 +26,8 @@ }, "rgblight": { "led_count": 14, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "sleep": true, "animations": { "alternating": true, diff --git a/keyboards/clueboard/17/keyboard.json b/keyboards/clueboard/17/keyboard.json index d6aec9cfcc..dcf273afda 100644 --- a/keyboards/clueboard/17/keyboard.json +++ b/keyboards/clueboard/17/keyboard.json @@ -32,10 +32,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 10, - "led_count": 4, - "saturation_steps": 17 + "led_count": 4 }, "ws2812": { "pin": "F6" diff --git a/keyboards/clueboard/2x1800/2018/keyboard.json b/keyboards/clueboard/2x1800/2018/keyboard.json index 1a926c62b9..e7b4c95ce3 100644 --- a/keyboards/clueboard/2x1800/2018/keyboard.json +++ b/keyboards/clueboard/2x1800/2018/keyboard.json @@ -44,7 +44,6 @@ "twinkle": true }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 16, "saturation_steps": 8 }, diff --git a/keyboards/clueboard/66/rev1/keyboard.json b/keyboards/clueboard/66/rev1/keyboard.json index ca1e3a6553..4743a125b9 100644 --- a/keyboards/clueboard/66/rev1/keyboard.json +++ b/keyboards/clueboard/66/rev1/keyboard.json @@ -33,10 +33,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 10, - "led_count": 14, - "saturation_steps": 17 + "led_count": 14 }, "ws2812": { "pin": "B2" diff --git a/keyboards/clueboard/66/rev2/keyboard.json b/keyboards/clueboard/66/rev2/keyboard.json index fea4f8d39b..39ca7c4841 100644 --- a/keyboards/clueboard/66/rev2/keyboard.json +++ b/keyboards/clueboard/66/rev2/keyboard.json @@ -34,10 +34,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 32, - "led_count": 14, - "saturation_steps": 17 + "led_count": 14 }, "ws2812": { "pin": "D7" diff --git a/keyboards/clueboard/66/rev3/keyboard.json b/keyboards/clueboard/66/rev3/keyboard.json index 4553979d8a..7713c73481 100644 --- a/keyboards/clueboard/66/rev3/keyboard.json +++ b/keyboards/clueboard/66/rev3/keyboard.json @@ -34,10 +34,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 32, - "led_count": 18, - "saturation_steps": 17 + "led_count": 18 }, "ws2812": { "pin": "D7" diff --git a/keyboards/clueboard/66/rev4/keyboard.json b/keyboards/clueboard/66/rev4/keyboard.json index dbc1b94915..d834b688f9 100644 --- a/keyboards/clueboard/66/rev4/keyboard.json +++ b/keyboards/clueboard/66/rev4/keyboard.json @@ -32,10 +32,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 32, - "led_count": 18, - "saturation_steps": 17 + "led_count": 18 }, "ws2812": { "pin": "D7" diff --git a/keyboards/clueboard/66_hotswap/prototype/keyboard.json b/keyboards/clueboard/66_hotswap/prototype/keyboard.json index 9d0b0dd27c..1325612ed3 100644 --- a/keyboards/clueboard/66_hotswap/prototype/keyboard.json +++ b/keyboards/clueboard/66_hotswap/prototype/keyboard.json @@ -39,10 +39,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 32, - "led_count": 26, - "saturation_steps": 17 + "led_count": 26 }, "ws2812": { "pin": "D7" diff --git a/keyboards/clueboard/card/keyboard.json b/keyboards/clueboard/card/keyboard.json index 0425819ed7..3929c073d7 100644 --- a/keyboards/clueboard/card/keyboard.json +++ b/keyboards/clueboard/card/keyboard.json @@ -25,10 +25,8 @@ "rows": ["F0", "F5", "F4", "B4"] }, "rgblight": { - "brightness_steps": 17, "hue_steps": 10, - "led_count": 4, - "saturation_steps": 17 + "led_count": 4 }, "ws2812": { "pin": "E6" diff --git a/keyboards/ghs/jem/info.json b/keyboards/ghs/jem/info.json index b90655647d..21d9bf0e6b 100644 --- a/keyboards/ghs/jem/info.json +++ b/keyboards/ghs/jem/info.json @@ -29,8 +29,6 @@ "rgblight": { "led_count": 22, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "breathing": true, "rainbow_mood": true, diff --git a/keyboards/hillside/46/0_1/keyboard.json b/keyboards/hillside/46/0_1/keyboard.json index 663eeb25f4..7d3967c8c3 100644 --- a/keyboards/hillside/46/0_1/keyboard.json +++ b/keyboards/hillside/46/0_1/keyboard.json @@ -40,7 +40,6 @@ "rgblight": { "led_count": 4, "split": true, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "sleep": true diff --git a/keyboards/hillside/48/0_1/keyboard.json b/keyboards/hillside/48/0_1/keyboard.json index 4dd2e01361..acae16f347 100644 --- a/keyboards/hillside/48/0_1/keyboard.json +++ b/keyboards/hillside/48/0_1/keyboard.json @@ -40,7 +40,6 @@ "rgblight": { "led_count": 5, "split": true, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "sleep": true diff --git a/keyboards/hillside/52/0_1/keyboard.json b/keyboards/hillside/52/0_1/keyboard.json index c8db3917d6..469e6c5844 100644 --- a/keyboards/hillside/52/0_1/keyboard.json +++ b/keyboards/hillside/52/0_1/keyboard.json @@ -40,7 +40,6 @@ "rgblight": { "led_count": 5, "split": true, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "sleep": true diff --git a/keyboards/jaykeeb/kamigakushi/keyboard.json b/keyboards/jaykeeb/kamigakushi/keyboard.json index 7ab02d2c66..6095d9cd87 100644 --- a/keyboards/jaykeeb/kamigakushi/keyboard.json +++ b/keyboards/jaykeeb/kamigakushi/keyboard.json @@ -19,10 +19,8 @@ }, "rgblight": { "led_count": 2, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/jaykeeb/sriwedari70/keyboard.json b/keyboards/jaykeeb/sriwedari70/keyboard.json index c9569a9724..20f7e00ba4 100644 --- a/keyboards/jaykeeb/sriwedari70/keyboard.json +++ b/keyboards/jaykeeb/sriwedari70/keyboard.json @@ -30,10 +30,8 @@ }, "rgblight": { "led_count": 8, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/kbdfans/odinmini/keyboard.json b/keyboards/kbdfans/odinmini/keyboard.json index a9cb1a798f..34002e83d8 100644 --- a/keyboards/kbdfans/odinmini/keyboard.json +++ b/keyboards/kbdfans/odinmini/keyboard.json @@ -35,7 +35,6 @@ "twinkle": true }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 4, "max_brightness": 180, "saturation_steps": 8, diff --git a/keyboards/keycapsss/3w6_2040/keyboard.json b/keyboards/keycapsss/3w6_2040/keyboard.json index f29b3753c6..e481b98894 100644 --- a/keyboards/keycapsss/3w6_2040/keyboard.json +++ b/keyboards/keycapsss/3w6_2040/keyboard.json @@ -42,7 +42,6 @@ "sat": 232, "speed": 2 }, - "hue_steps": 8, "led_count": 2, "max_brightness": 100, "saturation_steps": 8, diff --git a/keyboards/keyspensory/kp60/keyboard.json b/keyboards/keyspensory/kp60/keyboard.json index 1172e14d45..8672cf10e8 100644 --- a/keyboards/keyspensory/kp60/keyboard.json +++ b/keyboards/keyspensory/kp60/keyboard.json @@ -26,7 +26,6 @@ }, "rgblight": { "led_count": 8, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "animations": { diff --git a/keyboards/kprepublic/jj50/rev2/keyboard.json b/keyboards/kprepublic/jj50/rev2/keyboard.json index b739c20713..c3e0f7a322 100644 --- a/keyboards/kprepublic/jj50/rev2/keyboard.json +++ b/keyboards/kprepublic/jj50/rev2/keyboard.json @@ -39,7 +39,6 @@ "twinkle": true }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 6, "saturation_steps": 8 }, diff --git a/keyboards/lxxt/keyboard.json b/keyboards/lxxt/keyboard.json index 3a2700883d..5a028cacd8 100644 --- a/keyboards/lxxt/keyboard.json +++ b/keyboards/lxxt/keyboard.json @@ -26,10 +26,8 @@ }, "rgblight": { "led_count": 16, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "sleep": true, "animations": { "alternating": true, diff --git a/keyboards/mechwild/bde/info.json b/keyboards/mechwild/bde/info.json index 918c792aa7..edecde1eba 100644 --- a/keyboards/mechwild/bde/info.json +++ b/keyboards/mechwild/bde/info.json @@ -10,8 +10,7 @@ }, "development_board": "promicro", "rgblight": { - "sleep": true, - "max_brightness": 255 + "sleep": true }, "tapping": { "tap_keycode_delay": 10, diff --git a/keyboards/mechwild/bde/rev2/keyboard.json b/keyboards/mechwild/bde/rev2/keyboard.json index 932f99f0e9..b166934e1e 100644 --- a/keyboards/mechwild/bde/rev2/keyboard.json +++ b/keyboards/mechwild/bde/rev2/keyboard.json @@ -34,7 +34,6 @@ "animations": { "rainbow_swirl": true }, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8 }, diff --git a/keyboards/mechwild/sugarglider/info.json b/keyboards/mechwild/sugarglider/info.json index 80004f35d1..0b796f7c21 100644 --- a/keyboards/mechwild/sugarglider/info.json +++ b/keyboards/mechwild/sugarglider/info.json @@ -18,8 +18,6 @@ }, "rgblight": { "led_count": 10, - "max_brightness": 255, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "animations": { diff --git a/keyboards/mk65/keyboard.json b/keyboards/mk65/keyboard.json index 9135deaf19..07a78872c4 100644 --- a/keyboards/mk65/keyboard.json +++ b/keyboards/mk65/keyboard.json @@ -34,10 +34,8 @@ }, "rgblight": { "led_count": 7, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "sleep": true, "animations": { "alternating": true, diff --git a/keyboards/mlego/m65/rev1/keyboard.json b/keyboards/mlego/m65/rev1/keyboard.json index 2f77137eec..b763c2e2cf 100644 --- a/keyboards/mlego/m65/rev1/keyboard.json +++ b/keyboards/mlego/m65/rev1/keyboard.json @@ -42,7 +42,6 @@ "static_gradient": true, "twinkle": true }, - "hue_steps": 8, "layers": { "enabled": true }, diff --git a/keyboards/mlego/m65/rev2/keyboard.json b/keyboards/mlego/m65/rev2/keyboard.json index 0014767309..f07f1280a4 100644 --- a/keyboards/mlego/m65/rev2/keyboard.json +++ b/keyboards/mlego/m65/rev2/keyboard.json @@ -41,7 +41,6 @@ "static_gradient": true, "twinkle": true }, - "hue_steps": 8, "layers": { "enabled": true }, diff --git a/keyboards/mlego/m65/rev3/keyboard.json b/keyboards/mlego/m65/rev3/keyboard.json index 4b7980b63b..168a214a88 100644 --- a/keyboards/mlego/m65/rev3/keyboard.json +++ b/keyboards/mlego/m65/rev3/keyboard.json @@ -42,7 +42,6 @@ "static_gradient": true, "twinkle": true }, - "hue_steps": 8, "layers": { "enabled": true }, diff --git a/keyboards/mlego/m65/rev4/keyboard.json b/keyboards/mlego/m65/rev4/keyboard.json index ab2a708ba8..a83f363bb1 100644 --- a/keyboards/mlego/m65/rev4/keyboard.json +++ b/keyboards/mlego/m65/rev4/keyboard.json @@ -44,7 +44,6 @@ "static_gradient": true, "twinkle": true }, - "hue_steps": 8, "layers": { "enabled": true }, diff --git a/keyboards/mwstudio/mw80/keyboard.json b/keyboards/mwstudio/mw80/keyboard.json index 829e97591c..08591eb706 100644 --- a/keyboards/mwstudio/mw80/keyboard.json +++ b/keyboards/mwstudio/mw80/keyboard.json @@ -29,8 +29,6 @@ "rgblight": { "led_count": 16, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/nightly_boards/octopadplus/keyboard.json b/keyboards/nightly_boards/octopadplus/keyboard.json index ca5a7cdad1..8b94b722a8 100644 --- a/keyboards/nightly_boards/octopadplus/keyboard.json +++ b/keyboards/nightly_boards/octopadplus/keyboard.json @@ -52,9 +52,7 @@ "twinkle": true }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 8, - "max_brightness": 255, "saturation_steps": 8, "sleep": true }, diff --git a/keyboards/pauperboards/brick/keyboard.json b/keyboards/pauperboards/brick/keyboard.json index 8ebe32ded4..d1267f0891 100644 --- a/keyboards/pauperboards/brick/keyboard.json +++ b/keyboards/pauperboards/brick/keyboard.json @@ -35,7 +35,6 @@ }, "rgblight": { "led_count": 8, - "hue_steps": 8, "brightness_steps": 8, "saturation_steps": 8, "animations": { diff --git a/keyboards/plywrks/allaro/keyboard.json b/keyboards/plywrks/allaro/keyboard.json index fecc15f73b..a9a0a175b6 100644 --- a/keyboards/plywrks/allaro/keyboard.json +++ b/keyboards/plywrks/allaro/keyboard.json @@ -26,8 +26,6 @@ "rgblight": { "led_count": 16, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/prototypist/oceanographer/keyboard.json b/keyboards/prototypist/oceanographer/keyboard.json index 8b0209d451..13bc41355c 100644 --- a/keyboards/prototypist/oceanographer/keyboard.json +++ b/keyboards/prototypist/oceanographer/keyboard.json @@ -29,8 +29,6 @@ "led_count": 3, "sleep": true, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "max_brightness": 155, "animations": { "alternating": true, diff --git a/keyboards/rastersoft/minitkl/keyboard.json b/keyboards/rastersoft/minitkl/keyboard.json index e8d0691959..6b0869bc63 100644 --- a/keyboards/rastersoft/minitkl/keyboard.json +++ b/keyboards/rastersoft/minitkl/keyboard.json @@ -24,7 +24,6 @@ "rgblight": { "led_count": 3, "pin": "B2", - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "animations": { diff --git a/keyboards/reedskeebs/alish40/keyboard.json b/keyboards/reedskeebs/alish40/keyboard.json index 1a4b9f4afe..564d4eeeda 100644 --- a/keyboards/reedskeebs/alish40/keyboard.json +++ b/keyboards/reedskeebs/alish40/keyboard.json @@ -34,10 +34,8 @@ "static_gradient": true, "twinkle": true }, - "brightness_steps": 17, "hue_steps": 10, - "led_count": 10, - "saturation_steps": 17 + "led_count": 10 }, "ws2812": { "pin": "F5" diff --git a/keyboards/salicylic_acid3/guide68/keyboard.json b/keyboards/salicylic_acid3/guide68/keyboard.json index 0714262858..d2c6f10d11 100644 --- a/keyboards/salicylic_acid3/guide68/keyboard.json +++ b/keyboards/salicylic_acid3/guide68/keyboard.json @@ -39,7 +39,6 @@ "twinkle": true }, "sleep": true, - "max_brightness": 255, "split": true, "split_count": [6, 6] }, diff --git a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json index 7586ed5a34..e4b63753e2 100644 --- a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json @@ -26,10 +26,8 @@ }, "rgblight": { "led_count": 18, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "sleep": true, "animations": { "alternating": true, diff --git a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json index 80ae2558f2..6790011807 100644 --- a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json @@ -26,10 +26,8 @@ }, "rgblight": { "led_count": 18, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, - "max_brightness": 255, "sleep": true, "animations": { "alternating": true, diff --git a/keyboards/studiokestra/galatea/rev2/keyboard.json b/keyboards/studiokestra/galatea/rev2/keyboard.json index 115b5684cd..19bb235e33 100644 --- a/keyboards/studiokestra/galatea/rev2/keyboard.json +++ b/keyboards/studiokestra/galatea/rev2/keyboard.json @@ -40,7 +40,6 @@ }, "rgblight": { "led_count": 24, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "max_brightness": 200, diff --git a/keyboards/studiokestra/galatea/rev3/keyboard.json b/keyboards/studiokestra/galatea/rev3/keyboard.json index a4b07bb4df..c077351bb9 100644 --- a/keyboards/studiokestra/galatea/rev3/keyboard.json +++ b/keyboards/studiokestra/galatea/rev3/keyboard.json @@ -36,7 +36,6 @@ }, "rgblight": { "led_count": 24, - "hue_steps": 8, "saturation_steps": 8, "brightness_steps": 8, "max_brightness": 200, diff --git a/keyboards/takashicompany/goat51/keyboard.json b/keyboards/takashicompany/goat51/keyboard.json index c424685713..8ef4c54343 100644 --- a/keyboards/takashicompany/goat51/keyboard.json +++ b/keyboards/takashicompany/goat51/keyboard.json @@ -32,8 +32,6 @@ "rgblight": { "led_count": 11, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/takashicompany/spreadwriter/keyboard.json b/keyboards/takashicompany/spreadwriter/keyboard.json index 2c9fcd1619..59c78c4532 100644 --- a/keyboards/takashicompany/spreadwriter/keyboard.json +++ b/keyboards/takashicompany/spreadwriter/keyboard.json @@ -31,8 +31,6 @@ "rgblight": { "led_count": 53, "hue_steps": 10, - "saturation_steps": 17, - "brightness_steps": 17, "animations": { "alternating": true, "breathing": true, diff --git a/keyboards/tau4/keyboard.json b/keyboards/tau4/keyboard.json index f5acdbddd3..9a8e280905 100644 --- a/keyboards/tau4/keyboard.json +++ b/keyboards/tau4/keyboard.json @@ -47,7 +47,6 @@ "twinkle": true }, "brightness_steps": 8, - "hue_steps": 8, "layers": { "blink": false, "enabled": true, diff --git a/keyboards/tweetydabird/lbs4/keyboard.json b/keyboards/tweetydabird/lbs4/keyboard.json index 3176520772..e223289a3c 100644 --- a/keyboards/tweetydabird/lbs4/keyboard.json +++ b/keyboards/tweetydabird/lbs4/keyboard.json @@ -36,9 +36,6 @@ }, "rgblight": { "led_count": 6, - "hue_steps": 8, - "saturation_steps": 17, - "brightness_steps": 17, "max_brightness": 175, "animations": { "alternating": true, diff --git a/keyboards/tweetydabird/lbs6/keyboard.json b/keyboards/tweetydabird/lbs6/keyboard.json index 1714e9b6c4..57be9289f8 100644 --- a/keyboards/tweetydabird/lbs6/keyboard.json +++ b/keyboards/tweetydabird/lbs6/keyboard.json @@ -39,9 +39,6 @@ }, "rgblight": { "led_count": 8, - "hue_steps": 8, - "saturation_steps": 17, - "brightness_steps": 17, "max_brightness": 200, "animations": { "alternating": true, diff --git a/keyboards/vinhcatba/uncertainty/keyboard.json b/keyboards/vinhcatba/uncertainty/keyboard.json index 5f35a144d8..551e30c823 100644 --- a/keyboards/vinhcatba/uncertainty/keyboard.json +++ b/keyboards/vinhcatba/uncertainty/keyboard.json @@ -47,7 +47,6 @@ "override_rgb": true }, "led_count": 14, - "max_brightness": 255, "sleep": true }, "url": "", diff --git a/keyboards/work_louder/micro/keyboard.json b/keyboards/work_louder/micro/keyboard.json index 1b57ca82e8..b9ba6227bd 100644 --- a/keyboards/work_louder/micro/keyboard.json +++ b/keyboards/work_louder/micro/keyboard.json @@ -38,7 +38,6 @@ "hue": 213 }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 8, "max_brightness": 150, "saturation_steps": 8, diff --git a/keyboards/work_louder/numpad/keyboard.json b/keyboards/work_louder/numpad/keyboard.json index bd615c4080..08bf7295da 100644 --- a/keyboards/work_louder/numpad/keyboard.json +++ b/keyboards/work_louder/numpad/keyboard.json @@ -99,7 +99,6 @@ "hue": 213 }, "brightness_steps": 8, - "hue_steps": 8, "led_count": 8, "max_brightness": 120, "saturation_steps": 8, diff --git a/keyboards/yoichiro/lunakey_pico/keyboard.json b/keyboards/yoichiro/lunakey_pico/keyboard.json index 39070d615a..a6db26fde0 100644 --- a/keyboards/yoichiro/lunakey_pico/keyboard.json +++ b/keyboards/yoichiro/lunakey_pico/keyboard.json @@ -41,10 +41,8 @@ "static_gradient": true, "twinkle": true }, - "hue_steps": 8, "saturation_steps": 8, - "brightness_steps": 8, - "max_brightness": 255 + "brightness_steps": 8 }, "split": { "enabled": true, From ea85ace4a90baca401e49f35365a6a8f7d3802c4 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Sat, 19 Apr 2025 11:57:00 -0700 Subject: [PATCH 296/592] Ignore the Layer Lock key in Repeat Key and Caps Word. (#25171) --- quantum/process_keycode/process_caps_word.c | 7 ++- quantum/process_keycode/process_repeat_key.c | 5 +- tests/caps_word/test.mk | 2 + tests/caps_word/test_caps_word.cpp | 52 +++++++++++++++++--- tests/repeat_key/test.mk | 1 + tests/repeat_key/test_repeat_key.cpp | 33 +++++++++++++ 6 files changed, 91 insertions(+), 9 deletions(-) diff --git a/quantum/process_keycode/process_caps_word.c b/quantum/process_keycode/process_caps_word.c index b8fb868c6d..8ab66cc521 100644 --- a/quantum/process_keycode/process_caps_word.c +++ b/quantum/process_keycode/process_caps_word.c @@ -160,8 +160,13 @@ bool process_caps_word(uint16_t keycode, keyrecord_t* record) { case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: +#ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys. case QK_TRI_LAYER_LOWER ... QK_TRI_LAYER_UPPER: - // Ignore AltGr. +#endif // TRI_LAYER_ENABLE +#ifdef LAYER_LOCK_ENABLE // Ignore Layer Lock key. + case QK_LAYER_LOCK: +#endif // LAYER_LOCK_ENABLE + // Ignore AltGr. case KC_RALT: case OSM(MOD_RALT): return true; diff --git a/quantum/process_keycode/process_repeat_key.c b/quantum/process_keycode/process_repeat_key.c index 73f4ddedcf..fdeed4f466 100644 --- a/quantum/process_keycode/process_repeat_key.c +++ b/quantum/process_keycode/process_repeat_key.c @@ -41,7 +41,10 @@ static bool remember_last_key(uint16_t keycode, keyrecord_t* record, uint8_t* re #ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys. case QK_TRI_LAYER_LOWER: case QK_TRI_LAYER_UPPER: -#endif // TRI_LAYER_ENABLE +#endif // TRI_LAYER_ENABLE +#ifdef LAYER_LOCK_ENABLE // Ignore Layer Lock key. + case QK_LAYER_LOCK: +#endif // LAYER_LOCK_ENABLE return false; // Ignore hold events on tap-hold keys. diff --git a/tests/caps_word/test.mk b/tests/caps_word/test.mk index 2509b01858..6d5664aa05 100644 --- a/tests/caps_word/test.mk +++ b/tests/caps_word/test.mk @@ -15,5 +15,7 @@ CAPS_WORD_ENABLE = yes COMMAND_ENABLE = no +LAYER_LOCK_ENABLE = yes SPACE_CADET_ENABLE = yes +TRI_LAYER_ENABLE = yes diff --git a/tests/caps_word/test_caps_word.cpp b/tests/caps_word/test_caps_word.cpp index 28d86e9324..4b58790915 100644 --- a/tests/caps_word/test_caps_word.cpp +++ b/tests/caps_word/test_caps_word.cpp @@ -156,21 +156,22 @@ TEST_F(CapsWord, IdleTimeout) { // Turn on Caps Word and tap "A". caps_word_on(); tap_key(key_a); - VERIFY_AND_CLEAR(driver); + EXPECT_EMPTY_REPORT(driver); idle_for(CAPS_WORD_IDLE_TIMEOUT); run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); // Caps Word should be off and mods should be clear. EXPECT_EQ(is_caps_word_on(), false); EXPECT_EQ(get_mods() | get_weak_mods(), 0); - EXPECT_EMPTY_REPORT(driver).Times(AnyNumber()); // Expect unshifted "A". EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); tap_key(key_a); - + run_one_scan_loop(); VERIFY_AND_CLEAR(driver); } @@ -244,6 +245,7 @@ TEST_F(CapsWord, ShiftsAltGrSymbols) { // clang-format off EXPECT_CALL(driver, send_keyboard_mock(AnyOf( KeyboardReport(), + KeyboardReport(KC_LSFT), KeyboardReport(KC_RALT), KeyboardReport(KC_LSFT, KC_RALT)))) .Times(AnyNumber()); @@ -259,6 +261,9 @@ TEST_F(CapsWord, ShiftsAltGrSymbols) { tap_key(key_a); run_one_scan_loop(); key_altgr.release(); + run_one_scan_loop(); + + idle_for(CAPS_WORD_IDLE_TIMEOUT); VERIFY_AND_CLEAR(driver); } @@ -274,6 +279,7 @@ TEST_F(CapsWord, ShiftsModTapAltGrSymbols) { // clang-format off EXPECT_CALL(driver, send_keyboard_mock(AnyOf( KeyboardReport(), + KeyboardReport(KC_LSFT), KeyboardReport(KC_RALT), KeyboardReport(KC_LSFT, KC_RALT)))) .Times(AnyNumber()); @@ -289,8 +295,11 @@ TEST_F(CapsWord, ShiftsModTapAltGrSymbols) { tap_key(key_a); run_one_scan_loop(); key_altgr_t.release(); - + run_one_scan_loop(); EXPECT_TRUE(is_caps_word_on()); + + idle_for(CAPS_WORD_IDLE_TIMEOUT); + VERIFY_AND_CLEAR(driver); } @@ -535,7 +544,11 @@ TEST_P(CapsWordDoubleTapShift, Activation) { // machine at this point. This due to imperfect test isolation which can't // reset the caps word double shift timer on test case setup. idle_for(CAPS_WORD_IDLE_TIMEOUT); + + EXPECT_REPORT(driver, (KC_ESC)); + EXPECT_EMPTY_REPORT(driver); tap_key(esc); + VERIFY_AND_CLEAR(driver); } // Double tap doesn't count if another key is pressed between the taps. @@ -589,6 +602,7 @@ TEST_P(CapsWordDoubleTapShift, SlowTaps) { EXPECT_EQ(is_caps_word_on(), false); // Caps Word is still off. clear_oneshot_mods(); + send_keyboard_report(); VERIFY_AND_CLEAR(driver); } @@ -626,7 +640,7 @@ TEST_F(CapsWord, IgnoresOSLHold) { run_one_scan_loop(); tap_key(key_b); key_osl.release(); - run_one_scan_loop(); + idle_for(CAPS_WORD_IDLE_TIMEOUT + 1); VERIFY_AND_CLEAR(driver); } @@ -645,15 +659,39 @@ TEST_F(CapsWord, IgnoresOSLTap) { KeyboardReport(), KeyboardReport(KC_LSFT)))) .Times(AnyNumber()); + // clang-format on EXPECT_REPORT(driver, (KC_LSFT, KC_B)); caps_word_on(); tap_key(key_osl); tap_key(key_b); - run_one_scan_loop(); + idle_for(CAPS_WORD_IDLE_TIMEOUT); + + VERIFY_AND_CLEAR(driver); +} + +TEST_F(CapsWord, IgnoresLayerLockKey) { + TestDriver driver; + KeymapKey key_llock(0, 1, 0, QK_LAYER_LOCK); + KeymapKey key_b(0, 0, 0, KC_B); + set_keymap({key_llock, key_b}); + + // Allow any number of reports with no keys or only modifiers. + // clang-format off + EXPECT_CALL(driver, send_keyboard_mock(AnyOf( + KeyboardReport(), + KeyboardReport(KC_LSFT)))) + .Times(AnyNumber()); + // clang-format on + + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + caps_word_on(); + + tap_key(key_llock); + tap_key(key_b); + idle_for(CAPS_WORD_IDLE_TIMEOUT); VERIFY_AND_CLEAR(driver); } -// clang-format on } // namespace diff --git a/tests/repeat_key/test.mk b/tests/repeat_key/test.mk index aec8ff3bfb..186207ffc2 100644 --- a/tests/repeat_key/test.mk +++ b/tests/repeat_key/test.mk @@ -16,3 +16,4 @@ REPEAT_KEY_ENABLE = yes AUTO_SHIFT_ENABLE = yes +LAYER_LOCK_ENABLE = yes diff --git a/tests/repeat_key/test_repeat_key.cpp b/tests/repeat_key/test_repeat_key.cpp index eee44fc104..ed5d618761 100644 --- a/tests/repeat_key/test_repeat_key.cpp +++ b/tests/repeat_key/test_repeat_key.cpp @@ -751,4 +751,37 @@ TEST_F(RepeatKey, RepeatKeyInvoke) { testing::Mock::VerifyAndClearExpectations(&driver); } +// Check that mods and Layer Lock are not remembered. +TEST_F(RepeatKey, IgnoredKeys) { + TestDriver driver; + KeymapKey regular_key(0, 0, 0, KC_A); + KeymapKey key_repeat(0, 1, 0, QK_REP); + KeymapKey key_lsft(0, 2, 0, KC_LSFT); + KeymapKey key_lctl(0, 3, 0, KC_LCTL); + KeymapKey key_llck(0, 4, 0, QK_LAYER_LOCK); + set_keymap({regular_key, key_repeat, key_lsft, key_lctl, key_llck}); + + // Allow any number of empty reports. + EXPECT_EMPTY_REPORT(driver).Times(AnyNumber()); + { + InSequence seq; + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_LSFT)); + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A)); + } + + tap_key(regular_key); // Taps the KC_A key. + + // Tap Shift, Ctrl, and Layer Lock keys, which should not be remembered. + tap_keys(key_lsft, key_lctl, key_llck); + EXPECT_KEYCODE_EQ(get_last_keycode(), KC_A); + + // Tapping the Repeat Key should still reproduce KC_A. + tap_keys(key_repeat, key_repeat); + + testing::Mock::VerifyAndClearExpectations(&driver); +} + } // namespace From 5c39722ab9c9c7b86f34d4ed4ca4620a47dab01b Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 20 Apr 2025 05:20:00 +1000 Subject: [PATCH 297/592] Allow for disabling EEPROM subsystem entirely. (#25173) --- builddefs/common_features.mk | 146 ++++++++++++++++--------------- data/schemas/keyboard.jsonschema | 2 +- quantum/dynamic_keymap.c | 2 - quantum/eeconfig.c | 5 -- quantum/led_matrix/led_matrix.c | 1 - quantum/rgb_matrix/rgb_matrix.c | 1 - quantum/unicode/unicode.c | 1 - quantum/via.c | 1 - 8 files changed, 75 insertions(+), 84 deletions(-) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 802e01de43..f30a456fc3 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -171,80 +171,82 @@ endif VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash EEPROM_DRIVER ?= vendor -ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) +ifneq ($(strip $(EEPROM_DRIVER)),none) + ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) $(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver) -else - OPT_DEFS += -DEEPROM_ENABLE - COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom - COMMON_VPATH += $(DRIVER_PATH)/eeprom - COMMON_VPATH += $(PLATFORM_COMMON_DIR) - ifeq ($(strip $(EEPROM_DRIVER)), custom) - # Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM - SRC += eeprom_driver.c - else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling) - # Wear-leveling EEPROM implementation - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING - SRC += eeprom_driver.c eeprom_wear_leveling.c - else ifeq ($(strip $(EEPROM_DRIVER)), i2c) - # External I2C EEPROM implementation - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C - I2C_DRIVER_REQUIRED = yes - SRC += eeprom_driver.c eeprom_i2c.c - else ifeq ($(strip $(EEPROM_DRIVER)), spi) - # External SPI EEPROM implementation - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI - SPI_DRIVER_REQUIRED = yes - SRC += eeprom_driver.c eeprom_spi.c - else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash) - # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH - COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash - COMMON_VPATH += $(DRIVER_PATH)/flash - SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c - else ifeq ($(strip $(EEPROM_DRIVER)), transient) - # Transient EEPROM implementation -- no data storage but provides runtime area for it - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT - SRC += eeprom_driver.c eeprom_transient.c - else ifeq ($(strip $(EEPROM_DRIVER)), vendor) - # Vendor-implemented EEPROM - OPT_DEFS += -DEEPROM_VENDOR - ifeq ($(PLATFORM),AVR) - # Automatically provided by avr-libc, nothing required - else ifeq ($(PLATFORM),CHIBIOS) - ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) - # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH - COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash - COMMON_VPATH += $(DRIVER_PATH)/flash - SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c - else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),) - # Wear-leveling EEPROM implementation, backed by MCU flash - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING - SRC += eeprom_driver.c eeprom_wear_leveling.c - WEAR_LEVELING_DRIVER ?= embedded_flash - else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) - # True EEPROM on STM32L0xx, L1xx - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 - SRC += eeprom_driver.c eeprom_stm32_L0_L1.c - else ifneq ($(filter $(MCU_SERIES),RP2040),) - # Wear-leveling EEPROM implementation, backed by RP2040 flash - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING - SRC += eeprom_driver.c eeprom_wear_leveling.c - WEAR_LEVELING_DRIVER ?= rp2040_flash - else ifneq ($(filter $(MCU_SERIES),KL2x K20x),) - # Teensy EEPROM implementations - OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM - SRC += eeprom_kinetis_flexram.c - else - # Fall back to transient, i.e. non-persistent - OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT - SRC += eeprom_driver.c eeprom_transient.c + else + OPT_DEFS += -DEEPROM_ENABLE + COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom + COMMON_VPATH += $(DRIVER_PATH)/eeprom + COMMON_VPATH += $(PLATFORM_COMMON_DIR) + ifeq ($(strip $(EEPROM_DRIVER)), custom) + # Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM + SRC += eeprom_driver.c + else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling) + # Wear-leveling EEPROM implementation + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING + SRC += eeprom_driver.c eeprom_wear_leveling.c + else ifeq ($(strip $(EEPROM_DRIVER)), i2c) + # External I2C EEPROM implementation + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C + I2C_DRIVER_REQUIRED = yes + SRC += eeprom_driver.c eeprom_i2c.c + else ifeq ($(strip $(EEPROM_DRIVER)), spi) + # External SPI EEPROM implementation + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI + SPI_DRIVER_REQUIRED = yes + SRC += eeprom_driver.c eeprom_spi.c + else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash) + # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH + COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash + COMMON_VPATH += $(DRIVER_PATH)/flash + SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c + else ifeq ($(strip $(EEPROM_DRIVER)), transient) + # Transient EEPROM implementation -- no data storage but provides runtime area for it + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT + SRC += eeprom_driver.c eeprom_transient.c + else ifeq ($(strip $(EEPROM_DRIVER)), vendor) + # Vendor-implemented EEPROM + OPT_DEFS += -DEEPROM_VENDOR + ifeq ($(PLATFORM),AVR) + # Automatically provided by avr-libc, nothing required + else ifeq ($(PLATFORM),CHIBIOS) + ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) + # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH + COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash + COMMON_VPATH += $(DRIVER_PATH)/flash + SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c + else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),) + # Wear-leveling EEPROM implementation, backed by MCU flash + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING + SRC += eeprom_driver.c eeprom_wear_leveling.c + WEAR_LEVELING_DRIVER ?= embedded_flash + else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) + # True EEPROM on STM32L0xx, L1xx + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 + SRC += eeprom_driver.c eeprom_stm32_L0_L1.c + else ifneq ($(filter $(MCU_SERIES),RP2040),) + # Wear-leveling EEPROM implementation, backed by RP2040 flash + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING + SRC += eeprom_driver.c eeprom_wear_leveling.c + WEAR_LEVELING_DRIVER ?= rp2040_flash + else ifneq ($(filter $(MCU_SERIES),KL2x K20x),) + # Teensy EEPROM implementations + OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM + SRC += eeprom_kinetis_flexram.c + else + # Fall back to transient, i.e. non-persistent + OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT + SRC += eeprom_driver.c eeprom_transient.c + endif + else ifeq ($(PLATFORM),TEST) + # Test harness "EEPROM" + OPT_DEFS += -DEEPROM_TEST_HARNESS + SRC += eeprom.c endif - else ifeq ($(PLATFORM),TEST) - # Test harness "EEPROM" - OPT_DEFS += -DEEPROM_TEST_HARNESS - SRC += eeprom.c endif endif endif diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 2314c72bdb..4e8bae1084 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -319,7 +319,7 @@ "properties": { "driver": { "type": "string", - "enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"] + "enum": ["none", "custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"] }, "backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"} diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 756b232f59..59027fb694 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -18,8 +18,6 @@ #include "dynamic_keymap.h" #include "keymap_introspection.h" #include "action.h" -#include "eeprom.h" -#include "progmem.h" #include "send_string.h" #include "keycodes.h" #include "nvm_dynamic_keymap.h" diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index 9aa60fc968..31bc9a6051 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -2,16 +2,11 @@ #include #include #include "debug.h" -#include "eeprom.h" #include "eeconfig.h" #include "action_layer.h" #include "nvm_eeconfig.h" #include "keycode_config.h" -#ifdef EEPROM_DRIVER -# include "eeprom_driver.h" -#endif // EEPROM_DRIVER - #ifdef BACKLIGHT_ENABLE # include "backlight.h" #endif // BACKLIGHT_ENABLE diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index 2e107a66e9..f9d76e2776 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -19,7 +19,6 @@ #include "led_matrix.h" #include "progmem.h" -#include "eeprom.h" #include "eeconfig.h" #include "keyboard.h" #include "sync_timer.h" diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index a18105c9b3..3fc9085f06 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -18,7 +18,6 @@ #include "rgb_matrix.h" #include "progmem.h" -#include "eeprom.h" #include "eeconfig.h" #include "keyboard.h" #include "sync_timer.h" diff --git a/quantum/unicode/unicode.c b/quantum/unicode/unicode.c index b0729335f0..dff1d43fb4 100644 --- a/quantum/unicode/unicode.c +++ b/quantum/unicode/unicode.c @@ -16,7 +16,6 @@ #include "unicode.h" -#include "eeprom.h" #include "eeconfig.h" #include "action.h" #include "action_util.h" diff --git a/quantum/via.c b/quantum/via.c index c746d9a608..3682b4ab2b 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -26,7 +26,6 @@ #include "raw_hid.h" #include "dynamic_keymap.h" -#include "eeprom.h" #include "eeconfig.h" #include "matrix.h" #include "timer.h" From 7e68cfc6fa4adf4b17e06cd5138cc9c2ad40f3e3 Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:11:08 -0400 Subject: [PATCH 298/592] [keyboard] ymdk/id75/rp2040 (#25157) Co-authored-by: tao heihei <> --- keyboards/ymdk/id75/f103/keyboard.json | 1 - keyboards/ymdk/id75/info.json | 2 ++ keyboards/ymdk/id75/readme.md | 4 ++++ keyboards/ymdk/id75/rp2040/config.h | 20 ++++++++++++++++++++ keyboards/ymdk/id75/rp2040/keyboard.json | 12 ++++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 keyboards/ymdk/id75/rp2040/config.h create mode 100644 keyboards/ymdk/id75/rp2040/keyboard.json diff --git a/keyboards/ymdk/id75/f103/keyboard.json b/keyboards/ymdk/id75/f103/keyboard.json index 5b1974b3f2..07088ee7cc 100644 --- a/keyboards/ymdk/id75/f103/keyboard.json +++ b/keyboards/ymdk/id75/f103/keyboard.json @@ -1,5 +1,4 @@ { - "manufacturer": "YMDK", "bootloader": "uf2boot", "matrix_pins": { "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "A5", "A6", "A4", "A3", "A2", "A1", "A0", "A15"], diff --git a/keyboards/ymdk/id75/info.json b/keyboards/ymdk/id75/info.json index bbe4d1c73e..e409743abb 100644 --- a/keyboards/ymdk/id75/info.json +++ b/keyboards/ymdk/id75/info.json @@ -1,6 +1,8 @@ { + "manufacturer": "YMDK", "keyboard_name": "Idobao x YMDK ID75", "maintainer": "qmk", + "bootloader_instructions": "Press the button on the back of the PCB twice in quick succession.", "diode_direction": "ROW2COL", "features": { "bootmagic": true, diff --git a/keyboards/ymdk/id75/readme.md b/keyboards/ymdk/id75/readme.md index 4f7e779458..f94d4c14cf 100644 --- a/keyboards/ymdk/id75/readme.md +++ b/keyboards/ymdk/id75/readme.md @@ -8,15 +8,18 @@ A 75-key, 5-row ortholinear keyboard with per-key and underglow RGB LEDs. * Hardware Supported: [Idobao x YMDK ID75](https://www.aliexpress.com/item/3256804537842097.html). **This is not the same PCB as `idobao/id75` or `ymdk/ymd75`.** This keyboard has had multiple PCB revisions, some of which may not work with the firmware in this repository. **Check your PCB before flashing.** * `f103`: (Geehy APM32F103CBT6, uf2boot) + * `rp2040`: (RP2040, rp2040) * Hardware Availability: [YMDK](https://ymdkey.com/products/id75-75-keys-ortholinear-layout-qmk-anodized-aluminum-case-plate-hot-swappable-hot-swap-type-c-pcb-mechanical-keyboard-kit), [AliExpress (YMDK Store)](https://www.aliexpress.com/item/2255800125183974.html), [Amazon](https://www.amazon.com/Ortholinear-Anodized-Aluminum-hot-swappable-Mechanical/dp/B07ZQ8CD88) Make example for this keyboard (after setting up your build environment): make ymdk/id75/f103:default + make ymdk/id75/rp2040:default Flashing example for this keyboard: make ymdk/id75/f103:default:flash + make ymdk/id75/rp2040: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). @@ -30,3 +33,4 @@ Enter the bootloader in 3 ways: After entering the bootloader through one of the three methods above, the keyboard will appear as a USB mass storage device. If the CLI is unable to find this device, the compiled `.uf2` file can be manually copied to it. The keyboard will reboot on completion with the new firmware loaded. - `f103`: The volume name is `MT.KEY`. +- `rp2040`: The volume name is `RPI-RP2`. diff --git a/keyboards/ymdk/id75/rp2040/config.h b/keyboards/ymdk/id75/rp2040/config.h new file mode 100644 index 0000000000..b7a25de160 --- /dev/null +++ b/keyboards/ymdk/id75/rp2040/config.h @@ -0,0 +1,20 @@ +/* Copyright 2021 Mike Tsao + * + * 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 RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U diff --git a/keyboards/ymdk/id75/rp2040/keyboard.json b/keyboards/ymdk/id75/rp2040/keyboard.json new file mode 100644 index 0000000000..f153203cd0 --- /dev/null +++ b/keyboards/ymdk/id75/rp2040/keyboard.json @@ -0,0 +1,12 @@ +{ + "bootloader": "rp2040", + "matrix_pins": { + "cols": ["GP26", "GP27", "GP4", "GP5", "GP1", "GP23", "GP22", "GP21", "GP28", "GP3", "GP7", "GP12", "GP13", "GP14", "GP15"], + "rows": ["GP8", "GP6", "GP19", "GP20", "GP18"] + }, + "processor": "RP2040", + "ws2812": { + "driver": "vendor", + "pin": "GP2" + } +} From ce8b8414d96e9d9ecb2e001fc5844a8fa9b7addc Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 19 Apr 2025 22:52:25 +0100 Subject: [PATCH 299/592] Remove `bluefruit_le_read_battery_voltage` function (#25129) --- builddefs/common_features.mk | 1 - drivers/bluetooth/bluefruit_le.cpp | 21 --------------------- drivers/bluetooth/bluefruit_le.h | 4 ---- keyboards/handwired/promethium/config.h | 5 ++--- keyboards/handwired/promethium/promethium.c | 17 ++++++++--------- keyboards/handwired/promethium/rules.mk | 2 +- keyboards/matrix/falcon/config.h | 1 - keyboards/tokyokeyboard/alix40/config.h | 18 ------------------ 8 files changed, 11 insertions(+), 58 deletions(-) delete mode 100644 keyboards/tokyokeyboard/alix40/config.h diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index f30a456fc3..ec856715b0 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -897,7 +897,6 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le) SPI_DRIVER_REQUIRED = yes - ANALOG_DRIVER_REQUIRED = yes SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp endif diff --git a/drivers/bluetooth/bluefruit_le.cpp b/drivers/bluetooth/bluefruit_le.cpp index 218eca2195..5fdd104dcf 100644 --- a/drivers/bluetooth/bluefruit_le.cpp +++ b/drivers/bluetooth/bluefruit_le.cpp @@ -32,13 +32,8 @@ # define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE #endif -#define SAMPLE_BATTERY #define ConnectionUpdateInterval 1000 /* milliseconds */ -#ifndef BATTERY_LEVEL_PIN -# define BATTERY_LEVEL_PIN B5 -#endif - static struct { bool is_connected; bool initialized; @@ -48,10 +43,6 @@ static struct { #define UsingEvents 2 bool event_flags; -#ifdef SAMPLE_BATTERY - uint16_t last_battery_update; - uint32_t vbat; -#endif uint16_t last_connection_update; } state; @@ -549,14 +540,6 @@ void bluefruit_le_task(void) { set_connected(atoi(resbuf)); } } - -#ifdef SAMPLE_BATTERY - if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && resp_buf.empty()) { - state.last_battery_update = timer_read(); - - state.vbat = analogReadPin(BATTERY_LEVEL_PIN); - } -#endif } static bool process_queue_item(struct queue_item *item, uint16_t timeout) { @@ -655,10 +638,6 @@ void bluefruit_le_send_mouse(report_mouse_t *report) { } } -uint32_t bluefruit_le_read_battery_voltage(void) { - return state.vbat; -} - bool bluefruit_le_set_mode_leds(bool on) { if (!state.configured) { return false; diff --git a/drivers/bluetooth/bluefruit_le.h b/drivers/bluetooth/bluefruit_le.h index a3de03c35c..5efe92b6e0 100644 --- a/drivers/bluetooth/bluefruit_le.h +++ b/drivers/bluetooth/bluefruit_le.h @@ -45,10 +45,6 @@ extern void bluefruit_le_send_consumer(uint16_t usage); * change. */ extern void bluefruit_le_send_mouse(report_mouse_t *report); -/* Compute battery voltage by reading an analog pin. - * Returns the integer number of millivolts */ -extern uint32_t bluefruit_le_read_battery_voltage(void); - extern bool bluefruit_le_set_mode_leds(bool on); extern bool bluefruit_le_set_power_level(int8_t level); diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h index 806726b5eb..974a4f951f 100644 --- a/keyboards/handwired/promethium/config.h +++ b/keyboards/handwired/promethium/config.h @@ -63,9 +63,8 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT #define PS2_MOUSE_INIT_DELAY 2000 -#define BATTERY_POLL 30000 -#define MAX_VOLTAGE 4.2 -#define MIN_VOLTAGE 3.2 + +#define BATTERY_PIN B5 #ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file enum led_sequence { diff --git a/keyboards/handwired/promethium/promethium.c b/keyboards/handwired/promethium/promethium.c index 63139ac09d..c94a27a4de 100644 --- a/keyboards/handwired/promethium/promethium.c +++ b/keyboards/handwired/promethium/promethium.c @@ -1,16 +1,15 @@ -#include "promethium.h" -#include "analog.h" +#include "keyboard.h" #include "timer.h" -#include "matrix.h" -#include "bluefruit_le.h" +#include "battery.h" -// cubic fit {3.3, 0}, {3.5, 2.9}, {3.6, 5}, {3.7, 8.6}, {3.8, 36}, {3.9, 62}, {4.0, 73}, {4.05, 83}, {4.1, 89}, {4.15, 94}, {4.2, 100} +#ifndef BATTERY_POLL +# define BATTERY_POLL 30000 +#endif uint8_t battery_level(void) { - float voltage = bluefruit_le_read_battery_voltage() * 2 * 3.3 / 1024; - if (voltage < MIN_VOLTAGE) return 0; - if (voltage > MAX_VOLTAGE) return 255; - return (voltage - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE) * 255; + // maintain legacy behaviour and scale 0-100 percent to 0-255 + uint16_t percent = battery_get_percent(); + return (percent * 255) / 100; } __attribute__ ((weak)) diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk index 7f20880066..4012f8ca29 100644 --- a/keyboards/handwired/promethium/rules.mk +++ b/keyboards/handwired/promethium/rules.mk @@ -5,7 +5,7 @@ PS2_DRIVER = interrupt CUSTOM_MATRIX = yes WS2812_DRIVER_REQUIRED = yes -ANALOG_DRIVER_REQUIRED = yes +BATTERY_DRIVER_REQUIRED = yes SRC += rgbsps.c SRC += matrix.c diff --git a/keyboards/matrix/falcon/config.h b/keyboards/matrix/falcon/config.h index 9065dd0770..66787658fd 100644 --- a/keyboards/matrix/falcon/config.h +++ b/keyboards/matrix/falcon/config.h @@ -29,4 +29,3 @@ //pin setting #define LED_POWER_PIN D5 #define CHG_EN_PIN E6 -#define BATTERY_LEVEL_PIN F0 diff --git a/keyboards/tokyokeyboard/alix40/config.h b/keyboards/tokyokeyboard/alix40/config.h deleted file mode 100644 index 51d446c6d2..0000000000 --- a/keyboards/tokyokeyboard/alix40/config.h +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2021 quadcube -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 - -/* Bluetooth */ -#define BATTERY_LEVEL_PIN B6 From edf34315affe4427f862ccd70ff2aa9143ee1966 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 19 Apr 2025 23:09:54 +0100 Subject: [PATCH 300/592] Fix 'Would you like to clone the submodules?' prompt under msys (#24958) --- lib/python/qmk/cli/doctor/check.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/python/qmk/cli/doctor/check.py b/lib/python/qmk/cli/doctor/check.py index 2804a1d7df..51b0f0c80a 100644 --- a/lib/python/qmk/cli/doctor/check.py +++ b/lib/python/qmk/cli/doctor/check.py @@ -54,10 +54,13 @@ def _check_arm_gcc_installation(): """Returns OK if the arm-none-eabi-gcc is fully installed and can produce binaries. """ with TemporaryDirectory() as temp_dir: - temp_file = Path(temp_dir) / 'test.elf' + temp_in = Path(temp_dir) / 'test.c' + temp_out = Path(temp_dir) / 'test.elf' - args = ['arm-none-eabi-gcc', '-mcpu=cortex-m0', '-mthumb', '-mno-thumb-interwork', '--specs=nosys.specs', '--specs=nano.specs', '-x', 'c', '-o', str(temp_file), '-'] - result = cli.run(args, stdin=None, stdout=None, stderr=None, input='#include \nint main() { return __NEWLIB__ * __NEWLIB_MINOR__ * __NEWLIB_PATCHLEVEL__; }') + temp_in.write_text('#include \nint main() { return __NEWLIB__ * __NEWLIB_MINOR__ * __NEWLIB_PATCHLEVEL__; }', encoding='utf-8') + + args = ['arm-none-eabi-gcc', '-mcpu=cortex-m0', '-mthumb', '-mno-thumb-interwork', '--specs=nosys.specs', '--specs=nano.specs', '-x', 'c', '-o', str(temp_out), str(temp_in)] + result = cli.run(args, stdout=None, stderr=None) if result.returncode == 0: cli.log.info('Successfully compiled using arm-none-eabi-gcc') else: @@ -65,8 +68,8 @@ def _check_arm_gcc_installation(): cli.log.error(f'Command: {" ".join(args)}') return CheckStatus.ERROR - args = ['arm-none-eabi-size', str(temp_file)] - result = cli.run(args, stdin=None, stdout=None, stderr=None) + args = ['arm-none-eabi-size', str(temp_out)] + result = cli.run(args, stdout=None, stderr=None) if result.returncode == 0: cli.log.info('Successfully tested arm-none-eabi-binutils using arm-none-eabi-size') else: @@ -91,10 +94,13 @@ def _check_avr_gcc_installation(): """Returns OK if the avr-gcc is fully installed and can produce binaries. """ with TemporaryDirectory() as temp_dir: - temp_file = Path(temp_dir) / 'test.elf' + temp_in = Path(temp_dir) / 'test.c' + temp_out = Path(temp_dir) / 'test.elf' - args = ['avr-gcc', '-mmcu=atmega32u4', '-x', 'c', '-o', str(temp_file), '-'] - result = cli.run(args, stdin=None, stdout=None, stderr=None, input='int main() { return 0; }') + temp_in.write_text('int main() { return 0; }', encoding='utf-8') + + args = ['avr-gcc', '-mmcu=atmega32u4', '-x', 'c', '-o', str(temp_out), str(temp_in)] + result = cli.run(args, stdout=None, stderr=None) if result.returncode == 0: cli.log.info('Successfully compiled using avr-gcc') else: @@ -102,8 +108,8 @@ def _check_avr_gcc_installation(): cli.log.error(f'Command: {" ".join(args)}') return CheckStatus.ERROR - args = ['avr-size', str(temp_file)] - result = cli.run(args, stdin=None, stdout=None, stderr=None) + args = ['avr-size', str(temp_out)] + result = cli.run(args, stdout=None, stderr=None) if result.returncode == 0: cli.log.info('Successfully tested avr-binutils using avr-size') else: From a4aabea5111b126f31420f95c0961f9a2bc26476 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 20 Apr 2025 08:10:33 +1000 Subject: [PATCH 301/592] Fixup eeconfig lighting reset. (#25166) --- quantum/eeconfig.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index 31bc9a6051..addc07ae53 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -98,8 +98,8 @@ void eeconfig_init_quantum(void) { #endif // AUDIO_ENABLE #ifdef RGBLIGHT_ENABLE - rgblight_config_t rgblight_config = {0}; - eeconfig_update_rgblight(&rgblight_config); + extern void eeconfig_update_rgblight_default(void); + eeconfig_update_rgblight_default(); #endif // RGBLIGHT_ENABLE #ifdef UNICODE_COMMON_ENABLE @@ -112,13 +112,13 @@ void eeconfig_init_quantum(void) { #endif // STENO_ENABLE #ifdef RGB_MATRIX_ENABLE - rgb_config_t rgb_matrix_config = {0}; - eeconfig_update_rgb_matrix(&rgb_matrix_config); + extern void eeconfig_update_rgb_matrix_default(void); + eeconfig_update_rgb_matrix_default(); #endif #ifdef LED_MATRIX_ENABLE - led_eeconfig_t led_matrix_config = {0}; - eeconfig_update_led_matrix(&led_matrix_config); + extern void eeconfig_update_led_matrix_default(void); + eeconfig_update_led_matrix_default(); #endif // LED_MATRIX_ENABLE #ifdef HAPTIC_ENABLE @@ -145,6 +145,15 @@ void eeconfig_init_quantum(void) { #endif eeconfig_init_kb(); + +#ifdef RGB_MATRIX_ENABLE + extern void eeconfig_force_flush_rgb_matrix(void); + eeconfig_force_flush_rgb_matrix(); +#endif // RGB_MATRIX_ENABLE +#ifdef LED_MATRIX_ENABLE + extern void eeconfig_force_flush_led_matrix(void); + eeconfig_force_flush_led_matrix(); +#endif // LED_MATRIX_ENABLE } void eeconfig_init(void) { From a1cb82286102bf4494ba856e2e8a348424929b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bl=C3=A1ha?= Date: Sun, 20 Apr 2025 11:41:30 +0200 Subject: [PATCH 302/592] DOCS: `qmk-hid` missing in bootloaders list? (#25177) --- docs/config_options.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/config_options.md b/docs/config_options.md index 90a708dd99..e75a5b2f7e 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -401,6 +401,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i * `atmel-dfu` * `lufa-dfu` * `qmk-dfu` + * `qmk-hid` * `halfkay` * `caterina` * `bootloadhid` From 53f1f3b6d70bd457c5c42b799858c775dfcd3cb6 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 22 Apr 2025 00:02:47 +1000 Subject: [PATCH 303/592] Fix for `.clangd`. (#25180) --- .clangd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clangd b/.clangd index 6133ae7229..63dadd7e7c 100644 --- a/.clangd +++ b/.clangd @@ -1,4 +1,4 @@ CompileFlags: Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option] - Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues] + Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues, -D__has_include*] Compiler: clang From 2c54ff3e63062e432b5f1b6d01789e565e227336 Mon Sep 17 00:00:00 2001 From: Eric Molitor <534583+emolitor@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:05:22 +0100 Subject: [PATCH 304/592] Update develop branch to Pico SDK 1.5.1 (#25178) --- lib/pico-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pico-sdk b/lib/pico-sdk index a3398d8d3a..d0c5cac430 160000 --- a/lib/pico-sdk +++ b/lib/pico-sdk @@ -1 +1 @@ -Subproject commit a3398d8d3a772f37fef44a74743a1de69770e9c2 +Subproject commit d0c5cac430cc955b65efa0e899748853d9a80928 From ec324af22eddff1f89f33a30c77a678b111c420c Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 21 Apr 2025 20:07:05 +0100 Subject: [PATCH 305/592] Add lint warning for empty url (#25182) --- lib/python/qmk/cli/lint.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index bc14b61e8b..e2c76e4465 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -171,6 +171,14 @@ def _handle_invalid_features(kb, info): return ok +def _handle_invalid_config(kb, info): + """Check for invalid keyboard level config + """ + if info.get('url') == "": + cli.log.warning(f'{kb}: Invalid keyboard level config detected - Optional field "url" should not be empty.') + return True + + def _chibios_conf_includenext_check(target): """Check the ChibiOS conf.h for the correct inclusion of the next conf.h """ @@ -255,6 +263,9 @@ def keyboard_check(kb): # noqa C901 if not _handle_invalid_features(kb, kb_info): ok = False + if not _handle_invalid_config(kb, kb_info): + ok = False + invalid_files = git_get_ignored_files(f'keyboards/{kb}/') for file in invalid_files: if 'keymap' in file: From c7cb7ba9765b35930a26ec247e362615ffd10ed2 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 21 Apr 2025 22:27:56 +0100 Subject: [PATCH 306/592] Implement connection keycode logic (#25176) --- builddefs/common_features.mk | 2 +- builddefs/generic_features.mk | 1 + drivers/bluetooth/outputselect.c | 70 --------- drivers/bluetooth/outputselect.h | 24 ++- quantum/connection/connection.c | 147 ++++++++++++++++++ quantum/connection/connection.h | 110 +++++++++++++ quantum/eeconfig.c | 18 +++ quantum/eeconfig.h | 6 + quantum/keyboard.c | 6 + quantum/nvm/eeprom/nvm_eeconfig.c | 13 ++ .../nvm/eeprom/nvm_eeprom_eeconfig_internal.h | 2 + quantum/nvm/nvm_eeconfig.h | 6 + quantum/process_keycode/process_connection.c | 26 +++- quantum/quantum.c | 4 +- tmk_core/protocol/host.c | 11 +- 15 files changed, 347 insertions(+), 99 deletions(-) delete mode 100644 drivers/bluetooth/outputselect.c create mode 100644 quantum/connection/connection.c create mode 100644 quantum/connection/connection.h diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index ec856715b0..0b9840a14e 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -892,8 +892,8 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) OPT_DEFS += -DBLUETOOTH_ENABLE OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]')) NO_USB_STARTUP_CHECK := yes + CONNECTION_ENABLE := yes COMMON_VPATH += $(DRIVER_PATH)/bluetooth - SRC += outputselect.c process_connection.c ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le) SPI_DRIVER_REQUIRED = yes diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk index d39727f23b..c826514431 100644 --- a/builddefs/generic_features.mk +++ b/builddefs/generic_features.mk @@ -25,6 +25,7 @@ GENERIC_FEATURES = \ CAPS_WORD \ COMBO \ COMMAND \ + CONNECTION \ CRC \ DEFERRED_EXEC \ DIGITIZER \ diff --git a/drivers/bluetooth/outputselect.c b/drivers/bluetooth/outputselect.c deleted file mode 100644 index b986ba274e..0000000000 --- a/drivers/bluetooth/outputselect.c +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2017 Priyadi Iman Nurcahyo -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 "outputselect.h" -#include "usb_util.h" - -#ifdef BLUETOOTH_BLUEFRUIT_LE -# include "bluefruit_le.h" -#endif - -uint8_t desired_output = OUTPUT_DEFAULT; - -/** \brief Set Output - * - * FIXME: Needs doc - */ -void set_output(uint8_t output) { - set_output_user(output); - desired_output = output; -} - -/** \brief Set Output User - * - * FIXME: Needs doc - */ -__attribute__((weak)) void set_output_user(uint8_t output) {} - -/** \brief Auto Detect Output - * - * FIXME: Needs doc - */ -uint8_t auto_detect_output(void) { - if (usb_connected_state()) { - return OUTPUT_USB; - } - -#ifdef BLUETOOTH_BLUEFRUIT_LE - if (bluefruit_le_is_connected()) { - return OUTPUT_BLUETOOTH; - } -#endif - -#ifdef BLUETOOTH_ENABLE - return OUTPUT_BLUETOOTH; // should check if BT is connected here -#endif - - return OUTPUT_NONE; -} - -/** \brief Where To Send - * - * FIXME: Needs doc - */ -uint8_t where_to_send(void) { - if (desired_output == OUTPUT_AUTO) { - return auto_detect_output(); - } - return desired_output; -} diff --git a/drivers/bluetooth/outputselect.h b/drivers/bluetooth/outputselect.h index c4548e1122..25f063bbff 100644 --- a/drivers/bluetooth/outputselect.h +++ b/drivers/bluetooth/outputselect.h @@ -14,21 +14,17 @@ along with this program. If not, see . #pragma once -#include +#include "connection.h" -enum outputs { - OUTPUT_AUTO, +// DEPRECATED - DO NOT USE - OUTPUT_NONE, - OUTPUT_USB, - OUTPUT_BLUETOOTH -}; +#define OUTPUT_AUTO CONNECTION_HOST_AUTO +#define OUTPUT_NONE CONNECTION_HOST_NONE +#define OUTPUT_USB CONNECTION_HOST_USB +#define OUTPUT_BLUETOOTH CONNECTION_HOST_BLUETOOTH -#ifndef OUTPUT_DEFAULT -# define OUTPUT_DEFAULT OUTPUT_AUTO -#endif +#define set_output connection_set_host_noeeprom +#define where_to_send connection_get_host +#define auto_detect_output connection_auto_detect_host -void set_output(uint8_t output); -void set_output_user(uint8_t output); -uint8_t auto_detect_output(void); -uint8_t where_to_send(void); +void set_output_user(uint8_t output); diff --git a/quantum/connection/connection.c b/quantum/connection/connection.c new file mode 100644 index 0000000000..c7f3c4b424 --- /dev/null +++ b/quantum/connection/connection.c @@ -0,0 +1,147 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include "connection.h" +#include "eeconfig.h" +#include "usb_util.h" +#include "util.h" + +// ======== DEPRECATED DEFINES - DO NOT USE ======== +#ifdef OUTPUT_DEFAULT +# undef CONNECTION_HOST_DEFAULT +# define CONNECTION_HOST_DEFAULT OUTPUT_DEFAULT +#endif + +__attribute__((weak)) void set_output_user(uint8_t output) {} +// ======== + +#ifdef BLUETOOTH_ENABLE +# ifdef BLUETOOTH_BLUEFRUIT_LE +# include "bluefruit_le.h" +# define bluetooth_is_connected() bluefruit_le_is_connected() +# else +// TODO: drivers should check if BT is connected here +# define bluetooth_is_connected() true +# endif +#endif + +#define CONNECTION_HOST_INVALID 0xFF + +#ifndef CONNECTION_HOST_DEFAULT +# define CONNECTION_HOST_DEFAULT CONNECTION_HOST_AUTO +#endif + +static const connection_host_t host_candidates[] = { + CONNECTION_HOST_AUTO, + CONNECTION_HOST_USB, +#ifdef BLUETOOTH_ENABLE + CONNECTION_HOST_BLUETOOTH, +#endif +#if 0 + CONNECTION_HOST_2P4GHZ, +#endif +}; + +#define HOST_CANDIDATES_COUNT ARRAY_SIZE(host_candidates) + +static connection_config_t config = {.desired_host = CONNECTION_HOST_INVALID}; + +void eeconfig_update_connection_default(void) { + config.desired_host = CONNECTION_HOST_DEFAULT; + + eeconfig_update_connection(&config); +} + +void connection_init(void) { + eeconfig_read_connection(&config); + if (config.desired_host == CONNECTION_HOST_INVALID) { + eeconfig_update_connection_default(); + } +} + +__attribute__((weak)) void connection_host_changed_user(connection_host_t host) {} +__attribute__((weak)) void connection_host_changed_kb(connection_host_t host) {} + +static void handle_host_changed(void) { + connection_host_changed_user(config.desired_host); + connection_host_changed_kb(config.desired_host); + + // TODO: Remove deprecated callback + set_output_user(config.desired_host); +} + +void connection_set_host_noeeprom(connection_host_t host) { + if (config.desired_host == host) { + return; + } + + config.desired_host = host; + + handle_host_changed(); +} + +void connection_set_host(connection_host_t host) { + connection_set_host_noeeprom(host); + + eeconfig_update_connection(&config); +} + +void connection_next_host_noeeprom(void) { + uint8_t next = 0; + for (uint8_t i = 0; i < HOST_CANDIDATES_COUNT; i++) { + if (host_candidates[i] == config.desired_host) { + next = i == HOST_CANDIDATES_COUNT - 1 ? 0 : i + 1; + break; + } + } + + connection_set_host_noeeprom(host_candidates[next]); +} + +void connection_next_host(void) { + connection_next_host_noeeprom(); + + eeconfig_update_connection(&config); +} + +void connection_prev_host_noeeprom(void) { + uint8_t next = 0; + for (uint8_t i = 0; i < HOST_CANDIDATES_COUNT; i++) { + if (host_candidates[i] == config.desired_host) { + next = i == 0 ? HOST_CANDIDATES_COUNT - 1 : i - 1; + break; + } + } + + connection_set_host_noeeprom(host_candidates[next]); +} + +void connection_prev_host(void) { + connection_prev_host_noeeprom(); + + eeconfig_update_connection(&config); +} + +connection_host_t connection_get_host_raw(void) { + return config.desired_host; +} + +connection_host_t connection_auto_detect_host(void) { + if (usb_connected_state()) { + return CONNECTION_HOST_USB; + } + +#ifdef BLUETOOTH_ENABLE + if (bluetooth_is_connected()) { + return CONNECTION_HOST_BLUETOOTH; + } +#endif + + return CONNECTION_HOST_NONE; +} + +connection_host_t connection_get_host(void) { + if (config.desired_host == CONNECTION_HOST_AUTO) { + return connection_auto_detect_host(); + } + return config.desired_host; +} diff --git a/quantum/connection/connection.h b/quantum/connection/connection.h new file mode 100644 index 0000000000..e403141fae --- /dev/null +++ b/quantum/connection/connection.h @@ -0,0 +1,110 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include "util.h" + +/** + * \enum connection_host_t + * + * An enumeration of the possible hosts. + */ +typedef enum connection_host_t { + CONNECTION_HOST_AUTO, + + CONNECTION_HOST_NONE, + CONNECTION_HOST_USB, + CONNECTION_HOST_BLUETOOTH, + CONNECTION_HOST_2P4GHZ +} connection_host_t; + +/** + * \union connection_config_t + * + * Configuration structure for the connection subsystem. + */ +typedef union connection_config_t { + uint8_t raw; + connection_host_t desired_host : 8; +} PACKED connection_config_t; + +_Static_assert(sizeof(connection_config_t) == sizeof(uint8_t), "Connection EECONFIG out of spec."); + +/** + * \brief Initialize the subsystem. + * + * This function must be called only once, before any of the below functions can be called. + */ +void connection_init(void); + +/** + * \brief Get currently configured host. Does not resolve 'CONNECTION_HOST_AUTO'. + * + * \return 'connection_host_t' of the configured host. + */ +connection_host_t connection_get_host_raw(void); + +/** + * \brief Get current active host. + * + * \return 'connection_host_t' of the configured host. + */ +connection_host_t connection_auto_detect_host(void); + +/** + * \brief Get currently configured host. Resolves 'CONNECTION_HOST_AUTO' using 'connection_auto_detect_host()'. + * + * \return 'connection_host_t' of the configured host. + */ +connection_host_t connection_get_host(void); + +/** + * \brief Get current host. New state is not written to EEPROM. + * + * \param host The host to configure. + */ +void connection_set_host_noeeprom(connection_host_t host); + +/** + * \brief Get current host. + * + * \param host The host to configure. + */ +void connection_set_host(connection_host_t host); + +/** + * \brief Move to the next potential host. New state is not written to EEPROM. + * + */ +void connection_next_host_noeeprom(void); + +/** + * \brief Move to the next potential host. + * + */ +void connection_next_host(void); + +/** + * \brief Move to the previous potential host. New state is not written to EEPROM. + * + */ +void connection_prev_host_noeeprom(void); + +/** + * \brief Move to the previous potential host. + * + */ +void connection_prev_host(void); + +/** + * \brief user hook called when changing configured host + * + */ +void connection_host_changed_user(connection_host_t host); + +/** + * \brief keyboard hook called when changing configured host + * + */ +void connection_host_changed_kb(connection_host_t host); diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index addc07ae53..1e8cfd758a 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -35,6 +35,10 @@ # include "haptic.h" #endif // HAPTIC_ENABLE +#ifdef CONNECTION_ENABLE +# include "connection.h" +#endif // CONNECTION_ENABLE + #ifdef VIA_ENABLE bool via_eeprom_is_valid(void); void via_eeprom_set_valid(bool valid); @@ -127,6 +131,11 @@ void eeconfig_init_quantum(void) { haptic_reset(); #endif // HAPTIC_ENABLE +#ifdef CONNECTION_ENABLE + extern void eeconfig_update_connection_default(void); + eeconfig_update_connection_default(); +#endif // CONNECTION_ENABLE + #if (EECONFIG_KB_DATA_SIZE) > 0 eeconfig_init_kb_datablock(); #endif // (EECONFIG_KB_DATA_SIZE) > 0 @@ -299,6 +308,15 @@ void eeconfig_update_haptic(const haptic_config_t *haptic_config) { } #endif // HAPTIC_ENABLE +#ifdef CONNECTION_ENABLE +void eeconfig_read_connection(connection_config_t *config) { + nvm_eeconfig_read_connection(config); +} +void eeconfig_update_connection(const connection_config_t *config) { + nvm_eeconfig_update_connection(config); +} +#endif // CONNECTION_ENABLE + bool eeconfig_read_handedness(void) { return nvm_eeconfig_read_handedness(); } diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index 4044f1c294..d4d8d957be 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -131,6 +131,12 @@ void eeconfig_read_haptic(haptic_config_t *haptic_confi void eeconfig_update_haptic(const haptic_config_t *haptic_config) __attribute__((nonnull)); #endif +#ifdef CONNECTION_ENABLE +typedef union connection_config_t connection_config_t; +void eeconfig_read_connection(connection_config_t *config); +void eeconfig_update_connection(const connection_config_t *config); +#endif + bool eeconfig_read_handedness(void); void eeconfig_update_handedness(bool val); diff --git a/quantum/keyboard.c b/quantum/keyboard.c index 0671b0461f..be51190a87 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -146,6 +146,9 @@ along with this program. If not, see . #ifdef LAYER_LOCK_ENABLE # include "layer_lock.h" #endif +#ifdef CONNECTION_ENABLE +# include "connection.h" +#endif static uint32_t last_input_modification_time = 0; uint32_t last_input_activity_time(void) { @@ -465,6 +468,9 @@ void keyboard_init(void) { #endif matrix_init(); quantum_init(); +#ifdef CONNECTION_ENABLE + connection_init(); +#endif led_init_ports(); #ifdef BACKLIGHT_ENABLE backlight_init_ports(); diff --git a/quantum/nvm/eeprom/nvm_eeconfig.c b/quantum/nvm/eeprom/nvm_eeconfig.c index d6c388f3bc..d9495d2753 100644 --- a/quantum/nvm/eeprom/nvm_eeconfig.c +++ b/quantum/nvm/eeprom/nvm_eeconfig.c @@ -41,6 +41,10 @@ # include "haptic.h" #endif +#ifdef CONNECTION_ENABLE +# include "connection.h" +#endif + void nvm_eeconfig_erase(void) { #ifdef EEPROM_DRIVER eeprom_driver_format(false); @@ -196,6 +200,15 @@ void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config) { } #endif // HAPTIC_ENABLE +#ifdef CONNECTION_ENABLE +void nvm_eeconfig_read_connection(connection_config_t *config) { + config->raw = eeprom_read_byte(EECONFIG_CONNECTION); +} +void nvm_eeconfig_update_connection(const connection_config_t *config) { + eeprom_update_byte(EECONFIG_CONNECTION, config->raw); +} +#endif // CONNECTION_ENABLE + bool nvm_eeconfig_read_handedness(void) { return !!eeprom_read_byte(EECONFIG_HANDEDNESS); } diff --git a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h index 6efbf9480b..41b76f1f65 100644 --- a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h +++ b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h @@ -27,6 +27,7 @@ typedef struct PACKED { }; uint32_t haptic; uint8_t rgblight_ext; + uint8_t connection; } eeprom_core_t; /* EEPROM parameter address */ @@ -46,6 +47,7 @@ typedef struct PACKED { #define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix)) #define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic)) #define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext)) +#define EECONFIG_CONNECTION (uint8_t *)(offsetof(eeprom_core_t, connection)) // Size of EEPROM being used for core data storage #define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t)) diff --git a/quantum/nvm/nvm_eeconfig.h b/quantum/nvm/nvm_eeconfig.h index 131f61d534..40827361ca 100644 --- a/quantum/nvm/nvm_eeconfig.h +++ b/quantum/nvm/nvm_eeconfig.h @@ -87,6 +87,12 @@ void nvm_eeconfig_read_haptic(haptic_config_t *haptic_c void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config); #endif // HAPTIC_ENABLE +#ifdef CONNECTION_ENABLE +typedef union connection_config_t connection_config_t; +void nvm_eeconfig_read_connection(connection_config_t *config); +void nvm_eeconfig_update_connection(const connection_config_t *config); +#endif // CONNECTION_ENABLE + bool nvm_eeconfig_read_handedness(void); void nvm_eeconfig_update_handedness(bool val); diff --git a/quantum/process_keycode/process_connection.c b/quantum/process_keycode/process_connection.c index b0e230d680..501529ede7 100644 --- a/quantum/process_keycode/process_connection.c +++ b/quantum/process_keycode/process_connection.c @@ -1,24 +1,34 @@ // Copyright 2024 Nick Brassel (@tzarc) // SPDX-License-Identifier: GPL-2.0-or-later -#include "outputselect.h" +#include "connection.h" #include "process_connection.h" bool process_connection(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { switch (keycode) { case QK_OUTPUT_NEXT: - set_output(OUTPUT_AUTO); // This should cycle through the outputs going forward. Ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated when it does. + connection_next_host(); return false; - case QK_OUTPUT_USB: - set_output(OUTPUT_USB); - return false; - case QK_OUTPUT_BLUETOOTH: - set_output(OUTPUT_BLUETOOTH); + case QK_OUTPUT_PREV: + connection_prev_host(); return false; - case QK_OUTPUT_PREV: + case QK_OUTPUT_AUTO: + connection_set_host(CONNECTION_HOST_AUTO); + return false; case QK_OUTPUT_NONE: + connection_set_host(CONNECTION_HOST_NONE); + return false; + case QK_OUTPUT_USB: + connection_set_host(CONNECTION_HOST_USB); + return false; + case QK_OUTPUT_BLUETOOTH: + connection_set_host(CONNECTION_HOST_BLUETOOTH); + return false; case QK_OUTPUT_2P4GHZ: + connection_set_host(CONNECTION_HOST_2P4GHZ); + return false; + case QK_BLUETOOTH_PROFILE_NEXT: case QK_BLUETOOTH_PROFILE_PREV: case QK_BLUETOOTH_UNPAIR: diff --git a/quantum/quantum.c b/quantum/quantum.c index adb14d64b6..0bb6ee0a91 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -20,7 +20,7 @@ # include "process_backlight.h" #endif -#ifdef BLUETOOTH_ENABLE +#ifdef CONNECTION_ENABLE # include "process_connection.h" #endif @@ -436,7 +436,7 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef LAYER_LOCK_ENABLE process_layer_lock(keycode, record) && #endif -#ifdef BLUETOOTH_ENABLE +#ifdef CONNECTION_ENABLE process_connection(keycode, record) && #endif true)) { diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c index df805c827c..453952049f 100644 --- a/tmk_core/protocol/host.c +++ b/tmk_core/protocol/host.c @@ -31,8 +31,11 @@ along with this program. If not, see . #endif #ifdef BLUETOOTH_ENABLE +# ifndef CONNECTION_ENABLE +# error CONNECTION_ENABLE required and not enabled +# endif +# include "connection.h" # include "bluetooth.h" -# include "outputselect.h" #endif #ifdef NKRO_ENABLE @@ -74,7 +77,7 @@ led_t host_keyboard_led_state(void) { /* send report */ void host_keyboard_send(report_keyboard_t *report) { #ifdef BLUETOOTH_ENABLE - if (where_to_send() == OUTPUT_BLUETOOTH) { + if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { bluetooth_send_keyboard(report); return; } @@ -111,7 +114,7 @@ void host_nkro_send(report_nkro_t *report) { void host_mouse_send(report_mouse_t *report) { #ifdef BLUETOOTH_ENABLE - if (where_to_send() == OUTPUT_BLUETOOTH) { + if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { bluetooth_send_mouse(report); return; } @@ -147,7 +150,7 @@ void host_consumer_send(uint16_t usage) { last_consumer_usage = usage; #ifdef BLUETOOTH_ENABLE - if (where_to_send() == OUTPUT_BLUETOOTH) { + if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { bluetooth_send_consumer(usage); return; } From ebfa3cdd5c38d023ed4525e25004155aad7ad3e0 Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Mon, 21 Apr 2025 16:56:10 -0700 Subject: [PATCH 307/592] Add handwired/footy (#25151) Co-authored-by: jack --- keyboards/handwired/footy/config.h | 5 +++ keyboards/handwired/footy/keyboard.json | 35 ++++++++++++++++ .../footy/keymaps/default/keymap.json | 10 +++++ .../handwired/footy/keymaps/handy/keymap.json | 15 +++++++ .../footy/keymaps/superwhisper/keymap.json | 15 +++++++ keyboards/handwired/footy/readme.md | 42 +++++++++++++++++++ 6 files changed, 122 insertions(+) create mode 100644 keyboards/handwired/footy/config.h create mode 100644 keyboards/handwired/footy/keyboard.json create mode 100644 keyboards/handwired/footy/keymaps/default/keymap.json create mode 100644 keyboards/handwired/footy/keymaps/handy/keymap.json create mode 100644 keyboards/handwired/footy/keymaps/superwhisper/keymap.json create mode 100644 keyboards/handwired/footy/readme.md diff --git a/keyboards/handwired/footy/config.h b/keyboards/handwired/footy/config.h new file mode 100644 index 0000000000..5a081f79d6 --- /dev/null +++ b/keyboards/handwired/footy/config.h @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U diff --git a/keyboards/handwired/footy/keyboard.json b/keyboards/handwired/footy/keyboard.json new file mode 100644 index 0000000000..eef8c25038 --- /dev/null +++ b/keyboards/handwired/footy/keyboard.json @@ -0,0 +1,35 @@ +{ + "manufacturer": "CJ Pais", + "keyboard_name": "Footy", + "maintainer": "cjpais", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "bootmagic": { + "matrix": [0, 1] + }, + "matrix_pins": { + "cols": ["GP11", "GP10", "GP15"], + "rows": ["GP14"] + }, + "processor": "RP2040", + "url": "https://workshop.cjpais.com/projects/footy", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x636A" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0} + ] + } + } +} diff --git a/keyboards/handwired/footy/keymaps/default/keymap.json b/keyboards/handwired/footy/keymaps/default/keymap.json new file mode 100644 index 0000000000..99804041d8 --- /dev/null +++ b/keyboards/handwired/footy/keymaps/default/keymap.json @@ -0,0 +1,10 @@ +{ + "keyboard": "handwired/footy", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_A", "KC_B", "KC_C" + ] + ] +} diff --git a/keyboards/handwired/footy/keymaps/handy/keymap.json b/keyboards/handwired/footy/keymaps/handy/keymap.json new file mode 100644 index 0000000000..e2a2db6d10 --- /dev/null +++ b/keyboards/handwired/footy/keymaps/handy/keymap.json @@ -0,0 +1,15 @@ +{ + "keyboard": "handwired/footy", + "keymap": "handy", + "layout": "LAYOUT", + "layers": [ + [ + "KC_NO", "MT(MOD_RCTL | MOD_RGUI, KC_NO)", "KC_NO" + ] + ], + "config": { + "tapping": { + "term": 50 + } + } +} diff --git a/keyboards/handwired/footy/keymaps/superwhisper/keymap.json b/keyboards/handwired/footy/keymaps/superwhisper/keymap.json new file mode 100644 index 0000000000..0cfa41f502 --- /dev/null +++ b/keyboards/handwired/footy/keymaps/superwhisper/keymap.json @@ -0,0 +1,15 @@ +{ + "keyboard": "handwired/footy", + "keymap": "superwhisper", + "layout": "LAYOUT", + "layers": [ + [ + "KC_NO", "LOPT(KC_SPACE)", "KC_NO" + ] + ], + "config": { + "tapping": { + "term": 50 + } + } +} diff --git a/keyboards/handwired/footy/readme.md b/keyboards/handwired/footy/readme.md new file mode 100644 index 0000000000..6d02fad95c --- /dev/null +++ b/keyboards/handwired/footy/readme.md @@ -0,0 +1,42 @@ +# Footy + +![Footy Foot Pedal](https://i.imgur.com/ZdvlgRB.jpeg) + +*Footy is a foot pedal intended to be used with a speech to text application like 'handy' or superwhisper. Initially developed as an assistive technology device for those with limited typing abilities.* + +* Keyboard Maintainer: [CJ Pais](https://github.com/cjpais) +* Hardware Supported: [Keebio Stampy](https://keeb.io/products/stampy-rp2040-usb-c-controller-board-for-handwiring) +* Hardware Availability: [3D printed case](https://makerworld.com/en/models/1185240-footy) + +Make example for this keyboard (after setting up your build environment): + + make handwired/footy:default + +Flashing example for this keyboard (enter the bootloader first): + + make handwired/footy:default:flash + +or drag and drop .uf2 file on the removable storage + +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: + +* **Physical reset button**: Briefly double press the button on the back of the PCB + +## Keymaps + +Right now there are two primary keymaps, one for 'handy' and one for 'superwhisper'. + +Handy's default keymap is for the center switch to be RCTRL + RGUI. + +Superwhisper's default keymap is for the center switch to be LOPT + SPACE. + +You can build either of these firmware images by running the following commands: + +``` +make handwired/footy:handy +make handwired/footy:superwhisper +``` \ No newline at end of file From 9f04023d35c8ab6c4970afab391f77bb7b3ac63c Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 22 Apr 2025 14:14:28 +1000 Subject: [PATCH 308/592] Decrease firmware size for `anavi/macropad8`. (#25185) Preparation for bootstrapper. --- keyboards/anavi/macropad8/keyboard.json | 1 - 1 file changed, 1 deletion(-) diff --git a/keyboards/anavi/macropad8/keyboard.json b/keyboards/anavi/macropad8/keyboard.json index d70d3fa047..50381ce8a8 100644 --- a/keyboards/anavi/macropad8/keyboard.json +++ b/keyboards/anavi/macropad8/keyboard.json @@ -23,7 +23,6 @@ "rainbow_swirl": true, "snake": true, "knight": true, - "christmas": true, "static_gradient": true, "rgb_test": true, "alternating": true, From b5f8f4d6a201e6a67d1ee483fe6d3327d98cb052 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 22 Apr 2025 05:31:42 +0100 Subject: [PATCH 309/592] Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation (#25184) --- tmk_core/protocol/chibios/chibios.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index cf948154f9..d752f3746b 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -134,8 +134,6 @@ void protocol_setup(void) { // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); } -static host_driver_t *driver = NULL; - void protocol_pre_init(void) { /* Init USB */ usb_event_queue_init(); @@ -146,18 +144,11 @@ void protocol_pre_init(void) { #endif /* Wait until USB is active */ - while (true) { -#if defined(USB_WAIT_FOR_ENUMERATION) - if (USB_DRIVER.state == USB_ACTIVE) { - driver = &chibios_driver; - break; - } -#else - driver = &chibios_driver; - break; -#endif +#ifdef USB_WAIT_FOR_ENUMERATION + while (USB_DRIVER.state != USB_ACTIVE) { wait_ms(50); } +#endif /* Do need to wait here! * Otherwise the next print might start a transfer on console EP @@ -170,7 +161,7 @@ void protocol_pre_init(void) { } void protocol_post_init(void) { - host_set_driver(driver); + host_set_driver(&chibios_driver); } void protocol_pre_task(void) { From 73e2ef486ab7acf3763695cb3a3cf691451cdff3 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Tue, 22 Apr 2025 00:59:49 -0700 Subject: [PATCH 310/592] [Bug][Core] Fix for Flow Tap: fix handling of distinct taps and timer updates. (#25175) * Flow Tap bug fix. As reported by @amarz45 and @mwpardue, there is a bug where if two tap-hold keys are pressed in distinct taps back to back, then Flow Tap is not applied on the second tap-hold key, but it should be. In a related bug reported by @NikGovorov, if a tap-hold key is held followed by a tap of a tap-hold key, then Flow Tap updates its timer on the release of the held tap-hold key, but it should be ignored. The problem common to both these bugs is that I incorrectly assumed `tapping_key` is cleared to noevent once it is released, when actually `tapping_key` is still maintained for `TAPPING_TERM` ms after release (for Quick Tap). This commit fixes that. Thanks to @amarz45, @mwpardue, and @NikGovorov for reporting! Details: * Logic for converting the current tap-hold event to a tap is extracted to `flow_tap_key_if_within_term()`, which is now invoked also in the post-release "interfered with other tap key" case. This fixes the distinct taps bug. * The Flow Tap timer is now updated at the beginning of each call to `process_record()`, provided that there is no unsettled tap-hold key at that time and that the record is not for a mod or layer switch key. By moving this update logic to `process_record()`, it is conceptually simpler and more robust. * Unit tests extended to cover the reported scenarios. * Fix formatting. * Revision to fix @NikGovorov's scenario. The issue is that when another key is pressed while a layer-tap hasn't been settled yet, the `prev_keycode` remembers the keycode from before the layer switched. This can then enable Flow Tap for the following key when it shouldn't, or vice versa. Thanks to @NikGovorov for reporting! This commit revises Flow Tap in the following ways: * The previous key and timer are both updated from `process_record()`. This is slightly later in the sequence of processing than before, and by this point, a just-settled layer-tap should have taken effect so that the keycode from the correct layer is remembered. * The Flow Tap previous key and timer are updated now also on key release events, except for releases of modifiers and held layer switches. * The Flow Tap previous key and timer are now updated together, for simplicity. This makes the logic easier to think about. * A few additional unit tests, including @NikGovorov's scenario as "layer_tap_ignored_with_disabled_key_complex." --- quantum/action.c | 3 + quantum/action_tapping.c | 105 ++++-- quantum/action_tapping.h | 3 + .../tap_hold_configurations/flow_tap/config.h | 1 + .../flow_tap/test_tap_hold.cpp | 331 +++++++++++++++++- 5 files changed, 410 insertions(+), 33 deletions(-) diff --git a/quantum/action.c b/quantum/action.c index eb0dbc7022..dd82c9ec99 100644 --- a/quantum/action.c +++ b/quantum/action.c @@ -281,6 +281,9 @@ void process_record(keyrecord_t *record) { if (IS_NOEVENT(record->event)) { return; } +#ifdef FLOW_TAP_TERM + flow_tap_update_last_event(record); +#endif // FLOW_TAP_TERM if (!process_record_quantum(record)) { #ifndef NO_ACTION_ONESHOT diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index 312c639169..3e391d1526 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -6,6 +6,7 @@ #include "action_tapping.h" #include "action_util.h" #include "keycode.h" +#include "quantum_keycodes.h" #include "timer.h" #ifndef NO_ACTION_TAPPING @@ -102,10 +103,10 @@ __attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyreco # endif # if defined(FLOW_TAP_TERM) -static uint32_t last_input = 0; -static uint16_t prev_keycode = KC_NO; +static uint32_t flow_tap_prev_time = 0; +static uint16_t flow_tap_prev_keycode = KC_NO; -uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t *record, uint16_t prev_keycode); +static bool flow_tap_key_if_within_term(keyrecord_t *record); # endif // defined(FLOW_TAP_TERM) static keyrecord_t tapping_key = {}; @@ -157,19 +158,6 @@ void action_tapping_process(keyrecord_t record) { } } if (IS_EVENT(record.event)) { -# if defined(FLOW_TAP_TERM) - const uint16_t keycode = get_record_keycode(&record, false); - // Track the previous key press. - if (record.event.pressed) { - prev_keycode = keycode; - } - // If there is no unsettled tap-hold key, update last input time. Ignore - // mod keys in this update to allow for chording multiple mods for - // hotkeys like "Ctrl+Shift+arrow". - if (IS_NOEVENT(tapping_key.event) && !IS_MODIFIER_KEYCODE(keycode)) { - last_input = timer_read32(); - } -# endif // defined(FLOW_TAP_TERM) ac_dprintf("\n"); } } @@ -252,22 +240,8 @@ bool process_tapping(keyrecord_t *keyp) { // into the "pressed" tapping key state # if defined(FLOW_TAP_TERM) - const uint16_t keycode = get_record_keycode(keyp, false); - if (is_mt_or_lt(keycode)) { - const uint32_t idle_time = timer_elapsed32(last_input); - uint16_t term = get_flow_tap_term(keycode, keyp, prev_keycode); - if (term > 500) { - term = 500; - } - if (idle_time < 500 && idle_time < term) { - debug_event(keyp->event); - ac_dprintf(" within flow tap term (%u < %u) considered a tap\n", (int16_t)idle_time, term); - keyp->tap.count = 1; - registered_taps_add(keyp->event.key); - debug_registered_taps(); - process_record(keyp); - return true; - } + if (flow_tap_key_if_within_term(keyp)) { + return true; } # endif // defined(FLOW_TAP_TERM) @@ -582,6 +556,13 @@ bool process_tapping(keyrecord_t *keyp) { return true; } else if (is_tap_record(keyp)) { // Sequential tap can be interfered with other tap key. +# if defined(FLOW_TAP_TERM) + if (flow_tap_key_if_within_term(keyp)) { + tapping_key = (keyrecord_t){0}; + debug_tapping_key(); + return true; + } +# endif // defined(FLOW_TAP_TERM) ac_dprintf("Tapping: Start with interfering other tap.\n"); tapping_key = *keyp; waiting_buffer_scan_tap(); @@ -809,6 +790,66 @@ static void waiting_buffer_process_regular(void) { # endif // CHORDAL_HOLD # ifdef FLOW_TAP_TERM +void flow_tap_update_last_event(keyrecord_t *record) { + // Don't update while a tap-hold key is unsettled. + if (waiting_buffer_tail != waiting_buffer_head || (tapping_key.event.pressed && tapping_key.tap.count == 0)) { + return; + } + const uint16_t keycode = get_record_keycode(record, false); + // Ignore releases of modifiers and held layer switches. + if (!record->event.pressed) { + switch (keycode) { + case MODIFIER_KEYCODE_RANGE: + case QK_MOMENTARY ... QK_MOMENTARY_MAX: + case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: +# ifndef NO_ACTION_ONESHOT // Ignore one-shot keys. + case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: + case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: +# endif // NO_ACTION_ONESHOT +# ifdef TRI_LAYER_ENABLE // Ignore Tri Layer keys. + case QK_TRI_LAYER_LOWER: + case QK_TRI_LAYER_UPPER: +# endif // TRI_LAYER_ENABLE + return; + case QK_MODS ... QK_MODS_MAX: + if (QK_MODS_GET_BASIC_KEYCODE(keycode) == KC_NO) { + return; + } + break; + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + if (record->tap.count == 0) { + return; + } + break; + } + } + + flow_tap_prev_keycode = keycode; + flow_tap_prev_time = timer_read32(); +} + +static bool flow_tap_key_if_within_term(keyrecord_t *record) { + const uint16_t keycode = get_record_keycode(record, false); + if (is_mt_or_lt(keycode)) { + const uint32_t idle_time = timer_elapsed32(flow_tap_prev_time); + uint16_t term = get_flow_tap_term(keycode, record, flow_tap_prev_keycode); + if (term > 500) { + term = 500; + } + if (idle_time < 500 && idle_time < term) { + debug_event(record->event); + ac_dprintf(" within flow tap term (%u < %u) considered a tap\n", (int16_t)idle_time, term); + record->tap.count = 1; + registered_taps_add(record->event.key); + debug_registered_taps(); + process_record(record); + return true; + } + } + return false; +} + // By default, enable Flow Tap for the keys in the main alphas area and Space. // This should work reasonably even if the layout is remapped on the host to an // alt layout or international layout (e.g. Dvorak or AZERTY), where these same diff --git a/quantum/action_tapping.h b/quantum/action_tapping.h index 2af000ad73..0cf4aa1200 100644 --- a/quantum/action_tapping.h +++ b/quantum/action_tapping.h @@ -166,6 +166,9 @@ bool is_flow_tap_key(uint16_t keycode); * @return Time in milliseconds. */ uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t *record, uint16_t prev_keycode); + +/** Updates the Flow Tap last key and timer. */ +void flow_tap_update_last_event(keyrecord_t *record); #endif // FLOW_TAP_TERM #ifdef DYNAMIC_TAPPING_TERM_ENABLE diff --git a/tests/tap_hold_configurations/flow_tap/config.h b/tests/tap_hold_configurations/flow_tap/config.h index a17d488214..d6f385d8d4 100644 --- a/tests/tap_hold_configurations/flow_tap/config.h +++ b/tests/tap_hold_configurations/flow_tap/config.h @@ -20,3 +20,4 @@ #include "test_common.h" #define FLOW_TAP_TERM 150 +#define PERMISSIVE_HOLD diff --git a/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp index 7816fcb6da..a4233f0d57 100644 --- a/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp @@ -25,7 +25,169 @@ using testing::InSequence; class FlowTapTest : public TestFixture {}; -TEST_F(FlowTapTest, short_flow_tap_settled_as_tapped) { +// Test an input of quick distinct taps. All should be settled as tapped. +TEST_F(FlowTapTest, distinct_taps) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_B)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_C)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, ALT_T(KC_D)); + + set_keymap({regular_key, mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key, FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Tap mod-tap 1. + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap mod-tap 2. + EXPECT_REPORT(driver, (KC_C)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap mod-tap 3. + EXPECT_REPORT(driver, (KC_D)); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key3.release(); + idle_for(FLOW_TAP_TERM + 1); // Pause between taps. + VERIFY_AND_CLEAR(driver); + + // Tap mod-tap 1. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap mod-tap 2. + EXPECT_REPORT(driver, (KC_C)); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key2.release(); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); +} + +// By default, Flow Tap is disabled when mods other than Shift and AltGr are on. +TEST_F(FlowTapTest, hotkey_taps) { + TestDriver driver; + InSequence s; + auto ctrl_key = KeymapKey(0, 0, 0, KC_LCTL); + auto shft_key = KeymapKey(0, 1, 0, KC_LSFT); + auto alt_key = KeymapKey(0, 2, 0, KC_LALT); + auto gui_key = KeymapKey(0, 3, 0, KC_LGUI); + auto regular_key = KeymapKey(0, 4, 0, KC_A); + auto mod_tap_key = KeymapKey(0, 5, 0, RCTL_T(KC_B)); + + set_keymap({ctrl_key, shft_key, alt_key, gui_key, regular_key, mod_tap_key}); + + for (KeymapKey* mod_key : {&ctrl_key, &alt_key, &gui_key}) { + // Hold mod key. + EXPECT_REPORT(driver, (mod_key->code)); + mod_key->press(); + run_one_scan_loop(); + + // Tap regular key. + EXPECT_REPORT(driver, (mod_key->code, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (mod_key->code)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap, where Flow Tap is disabled due to the held mod. + EXPECT_REPORT(driver, (mod_key->code, KC_RCTL)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap. + EXPECT_REPORT(driver, (mod_key->code)); + mod_tap_key.release(); + run_one_scan_loop(); + + // Release mod key. + EXPECT_EMPTY_REPORT(driver); + mod_key->release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + } + + // Hold Shift key. + EXPECT_REPORT(driver, (KC_LSFT)); + shft_key.press(); + run_one_scan_loop(); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LSFT)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap, where Flow Tap applies to settle as tapped. + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap. + EXPECT_REPORT(driver, (KC_LSFT)); + mod_tap_key.release(); + run_one_scan_loop(); + + // Release Shift key. + EXPECT_EMPTY_REPORT(driver); + shft_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +// Test input with two mod-taps in a rolled press quickly after a regular key. +TEST_F(FlowTapTest, rolled_press) { TestDriver driver; InSequence s; auto regular_key = KeymapKey(0, 0, 0, KC_A); @@ -152,6 +314,53 @@ TEST_F(FlowTapTest, holding_multiple_mod_taps) { VERIFY_AND_CLEAR(driver); } +TEST_F(FlowTapTest, holding_mod_tap_with_regular_mod) { + TestDriver driver; + InSequence s; + auto regular_key = KeymapKey(0, 0, 0, KC_A); + auto mod_key = KeymapKey(0, 1, 0, KC_LSFT); + auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_C)); + + set_keymap({regular_key, mod_key, mod_tap_key}); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press mod and mod-tap keys. + EXPECT_REPORT(driver, (KC_LSFT)); + mod_key.press(); + run_one_scan_loop(); + mod_tap_key.press(); + idle_for(TAPPING_TERM - 5); // Hold almost until tapping term. + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL)); + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL, KC_A)); + regular_key.press(); + idle_for(10); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LSFT, KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + mod_key.release(); + run_one_scan_loop(); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + TEST_F(FlowTapTest, layer_tap_key) { TestDriver driver; InSequence s; @@ -216,6 +425,125 @@ TEST_F(FlowTapTest, layer_tap_key) { VERIFY_AND_CLEAR(driver); } +TEST_F(FlowTapTest, layer_tap_ignored_with_disabled_key) { + TestDriver driver; + InSequence s; + auto no_key = KeymapKey(0, 0, 0, KC_NO); + auto regular_key = KeymapKey(1, 0, 0, KC_ESC); + auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_B)); + + set_keymap({no_key, regular_key, layer_tap_key, mod_tap_key}); + + EXPECT_REPORT(driver, (KC_ESC)); + EXPECT_EMPTY_REPORT(driver); + layer_tap_key.press(); + idle_for(TAPPING_TERM + 1); + tap_key(regular_key); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LCTL)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, layer_tap_ignored_with_disabled_key_complex) { + TestDriver driver; + InSequence s; + auto regular_key1 = KeymapKey(0, 0, 0, KC_Q); + auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_SPC)); + auto mod_tap_key1 = KeymapKey(0, 2, 0, CTL_T(KC_T)); + // Place RALT_T(KC_I), where Flow Tap is enabled, in the same position on + // layer 0 as KC_RGHT, where Flow Tap is disabled. This tests that Flow Tap + // tracks the keycode from the correct layer. + auto mod_tap_key2 = KeymapKey(0, 3, 0, RALT_T(KC_I)); + auto regular_key2 = KeymapKey(1, 3, 0, KC_RGHT); + + set_keymap({regular_key1, layer_tap_key, mod_tap_key1, mod_tap_key2, regular_key2}); + + // Tap regular key 1. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key1); + idle_for(FLOW_TAP_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Hold layer-tap key. + EXPECT_NO_REPORT(driver); + layer_tap_key.press(); + run_one_scan_loop(); + // idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Tap regular key 2. + EXPECT_REPORT(driver, (KC_RGHT)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key2); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap key. + EXPECT_NO_REPORT(driver); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Quickly hold mod-tap key 1. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL, KC_Q)); + EXPECT_REPORT(driver, (KC_LCTL)); + tap_key(regular_key1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, layer_tap_ignored_with_enabled_key) { + TestDriver driver; + InSequence s; + auto no_key = KeymapKey(0, 0, 0, KC_NO); + auto regular_key = KeymapKey(1, 0, 0, KC_C); + auto layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_B)); + + set_keymap({no_key, regular_key, layer_tap_key, mod_tap_key}); + + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + layer_tap_key.press(); + idle_for(TAPPING_TERM + 1); + tap_key(regular_key); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + idle_for(TAPPING_TERM + 1); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + TEST_F(FlowTapTest, combo_key) { TestDriver driver; InSequence s; @@ -275,6 +603,7 @@ TEST_F(FlowTapTest, oneshot_mod_key) { // Nested press of OSM and regular keys. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); EXPECT_REPORT(driver, (KC_LSFT, KC_A)); + EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT))).Times(AnyNumber()); EXPECT_EMPTY_REPORT(driver); osm_key.press(); run_one_scan_loop(); From 960c4969a539fbbc1880d3fad1c1af83827d535a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 22 Apr 2025 17:59:00 +0100 Subject: [PATCH 311/592] Remove empty `url` fields (#25181) --- keyboards/0_sixty/info.json | 1 - keyboards/0xc7/61key/keyboard.json | 1 - keyboards/0xcb/tutelpad/keyboard.json | 1 - keyboards/1k/keyboard.json | 1 - keyboards/1upkeyboards/1up60hse/keyboard.json | 1 - keyboards/1upkeyboards/1up60rgb/keyboard.json | 1 - keyboards/1upkeyboards/super16/keyboard.json | 1 - keyboards/1upkeyboards/super16v2/keyboard.json | 1 - keyboards/1upkeyboards/sweet16/info.json | 1 - keyboards/1upkeyboards/sweet16/v1/keyboard.json | 1 - keyboards/2key2crawl/keyboard.json | 1 - keyboards/30wer/keyboard.json | 1 - keyboards/40percentclub/25/keyboard.json | 1 - keyboards/40percentclub/4pack/keyboard.json | 1 - keyboards/40percentclub/4x4/keyboard.json | 1 - keyboards/40percentclub/5x5/keyboard.json | 1 - keyboards/40percentclub/6lit/keyboard.json | 1 - keyboards/40percentclub/foobar/keyboard.json | 1 - keyboards/40percentclub/gherkin/info.json | 1 - keyboards/40percentclub/half_n_half/keyboard.json | 1 - keyboards/40percentclub/i75/info.json | 1 - keyboards/40percentclub/luddite/keyboard.json | 1 - keyboards/40percentclub/mf68/keyboard.json | 1 - keyboards/40percentclub/nano/keyboard.json | 1 - keyboards/40percentclub/nori/keyboard.json | 1 - keyboards/40percentclub/polyandry/info.json | 1 - keyboards/40percentclub/tomato/keyboard.json | 1 - keyboards/40percentclub/ut47/keyboard.json | 1 - keyboards/45_ats/keyboard.json | 1 - keyboards/4pplet/aekiso60/info.json | 1 - keyboards/4pplet/perk60_iso/rev_a/keyboard.json | 1 - keyboards/4pplet/waffling80/info.json | 1 - keyboards/5keys/keyboard.json | 1 - keyboards/7c8/framework/keyboard.json | 1 - keyboards/9key/keyboard.json | 1 - keyboards/abatskeyboardclub/nayeon/keyboard.json | 1 - keyboards/acheron/apollo/87h/info.json | 1 - keyboards/acheron/apollo/87htsc/keyboard.json | 1 - keyboards/acheron/apollo/88htsc/keyboard.json | 1 - keyboards/acheron/athena/info.json | 1 - keyboards/acheron/austin/keyboard.json | 1 - keyboards/acheron/lasgweloth/keyboard.json | 1 - keyboards/acheron/themis/info.json | 1 - keyboards/ada/ada1800mini/keyboard.json | 1 - keyboards/ada/infinity81/keyboard.json | 1 - keyboards/adkb96/rev1/keyboard.json | 1 - keyboards/aeboards/aegis/keyboard.json | 1 - keyboards/aeboards/constellation/rev1/keyboard.json | 1 - keyboards/aeboards/constellation/rev2/keyboard.json | 1 - keyboards/aeboards/constellation/rev3/keyboard.json | 1 - keyboards/aeboards/ext65/info.json | 1 - keyboards/aeboards/ext65/rev1/keyboard.json | 1 - keyboards/aeboards/ext65/rev2/keyboard.json | 1 - keyboards/aeboards/ext65/rev3/keyboard.json | 1 - keyboards/aeboards/satellite/rev1/keyboard.json | 1 - keyboards/ah/haven80/info.json | 1 - keyboards/ai/keyboard.json | 1 - keyboards/ai03/andromeda/keyboard.json | 1 - keyboards/ai03/equinox/info.json | 1 - keyboards/ai03/orbit_x/keyboard.json | 1 - keyboards/al1/keyboard.json | 1 - keyboards/alf/x11/keyboard.json | 1 - keyboards/alf/x2/keyboard.json | 1 - keyboards/alhenkb/macropad5x4/keyboard.json | 1 - keyboards/alpine65/keyboard.json | 1 - keyboards/alps64/keyboard.json | 1 - keyboards/amjkeyboard/amj40/keyboard.json | 1 - keyboards/amjkeyboard/amj60/keyboard.json | 1 - keyboards/amjkeyboard/amj66/keyboard.json | 1 - keyboards/amjkeyboard/amj84/keyboard.json | 1 - keyboards/amjkeyboard/amj96/keyboard.json | 1 - keyboards/amjkeyboard/amjpad/keyboard.json | 1 - keyboards/anavi/macropad8/keyboard.json | 1 - keyboards/aplyard/aplx6/info.json | 1 - keyboards/arabica37/rev1/keyboard.json | 1 - keyboards/archetype/minervalx/keyboard.json | 1 - keyboards/ares/keyboard.json | 1 - keyboards/artemis/paragon/info.json | 1 - keyboards/at_at/660m/keyboard.json | 1 - keyboards/atreus/info.json | 1 - keyboards/atreus62/keyboard.json | 1 - keyboards/aves65/keyboard.json | 1 - keyboards/axolstudio/helpo/keyboard.json | 1 - keyboards/baguette/keyboard.json | 1 - keyboards/bahm/aster_ergo/keyboard.json | 1 - keyboards/balloondogcaps/tr90/keyboard.json | 1 - keyboards/balloondogcaps/tr90pm/keyboard.json | 1 - keyboards/bantam44/keyboard.json | 1 - keyboards/beatervan/keyboard.json | 1 - keyboards/beekeeb/piantor_pro/keyboard.json | 1 - keyboards/bestway/keyboard.json | 1 - keyboards/bfake/keyboard.json | 1 - keyboards/biacco42/ergo42/rev1/keyboard.json | 1 - keyboards/biacco42/meishi/keyboard.json | 1 - keyboards/biacco42/meishi2/keyboard.json | 1 - keyboards/bioi/f60/keyboard.json | 1 - keyboards/bioi/g60ble/keyboard.json | 1 - keyboards/bioi/morgan65/keyboard.json | 1 - keyboards/bioi/s65/keyboard.json | 1 - keyboards/blank/blank01/keyboard.json | 1 - keyboards/blaster75/keyboard.json | 1 - keyboards/blockboy/ac980mini/keyboard.json | 1 - keyboards/blockey/keyboard.json | 1 - keyboards/boardwalk/keyboard.json | 1 - keyboards/bobpad/keyboard.json | 1 - keyboards/bolsa/bolsalice/keyboard.json | 1 - keyboards/bolsa/damapad/keyboard.json | 1 - keyboards/boston_meetup/2019/keyboard.json | 1 - keyboards/botanicalkeyboards/fm2u/keyboard.json | 1 - keyboards/box75/keyboard.json | 1 - keyboards/bpiphany/four_banger/keyboard.json | 1 - keyboards/bpiphany/frosty_flake/info.json | 1 - keyboards/bpiphany/ghost_squid/keyboard.json | 1 - keyboards/bpiphany/hid_liber/keyboard.json | 1 - keyboards/bpiphany/kitten_paw/keyboard.json | 1 - keyboards/bpiphany/pegasushoof/info.json | 1 - keyboards/bpiphany/tiger_lily/keyboard.json | 1 - keyboards/bt66tech/bt66tech60/keyboard.json | 1 - keyboards/bubble75/hotswap/keyboard.json | 1 - keyboards/budgy/keyboard.json | 1 - keyboards/buildakb/mw60/keyboard.json | 1 - keyboards/caffeinated/serpent65/keyboard.json | 1 - keyboards/canary/canary60rgb/v1/keyboard.json | 1 - keyboards/cannonkeys/adelie/keyboard.json | 1 - keyboards/cannonkeys/nearfield/keyboard.json | 1 - keyboards/cannonkeys/ortho48/keyboard.json | 1 - keyboards/cannonkeys/ortho60/keyboard.json | 1 - keyboards/cannonkeys/ortho75/keyboard.json | 1 - keyboards/cannonkeys/practice60/keyboard.json | 1 - keyboards/cannonkeys/vector/keyboard.json | 1 - keyboards/capsunlocked/cu24/keyboard.json | 1 - keyboards/capsunlocked/cu65/keyboard.json | 1 - keyboards/capsunlocked/cu75/keyboard.json | 1 - keyboards/centromere/keyboard.json | 1 - keyboards/checkerboards/axon40/keyboard.json | 1 - keyboards/checkerboards/candybar_ortho/keyboard.json | 1 - keyboards/checkerboards/g_idb60/keyboard.json | 1 - keyboards/checkerboards/nop60/keyboard.json | 1 - keyboards/checkerboards/plexus75/keyboard.json | 1 - keyboards/checkerboards/quark/keyboard.json | 1 - keyboards/checkerboards/ud40_ortho_alt/keyboard.json | 1 - keyboards/chickenman/ciel/keyboard.json | 1 - keyboards/chickenman/ciel65/keyboard.json | 1 - keyboards/cipulot/kallos/keyboard.json | 1 - keyboards/ck60i/keyboard.json | 1 - keyboards/ckeys/nakey/keyboard.json | 1 - keyboards/ckeys/obelus/keyboard.json | 1 - keyboards/clawsome/bookerboard/keyboard.json | 1 - keyboards/clawsome/sidekick/keyboard.json | 1 - keyboards/clueboard/17/keyboard.json | 1 - keyboards/clueboard/california/keyboard.json | 1 - keyboards/cmm_studio/fuji65/keyboard.json | 1 - keyboards/cmm_studio/saka68/hotswap/keyboard.json | 1 - keyboards/cmm_studio/saka68/solder/keyboard.json | 1 - keyboards/coarse/ixora/keyboard.json | 1 - keyboards/coarse/vinta/keyboard.json | 1 - keyboards/concreteflowers/cor/keyboard.json | 1 - keyboards/concreteflowers/cor_tkl/keyboard.json | 1 - keyboards/contra/keyboard.json | 1 - keyboards/converter/adb_usb/info.json | 1 - keyboards/converter/ibm_terminal/keyboard.json | 1 - keyboards/converter/m0110_usb/keyboard.json | 1 - keyboards/converter/numeric_keypad_iie/keyboard.json | 1 - keyboards/converter/palm_usb/stowaway/keyboard.json | 1 - keyboards/converter/siemens_tastatur/keyboard.json | 1 - keyboards/converter/sun_usb/info.json | 1 - keyboards/converter/usb_usb/info.json | 1 - keyboards/converter/xt_usb/keyboard.json | 1 - keyboards/crawlpad/keyboard.json | 1 - keyboards/crazy_keyboard_68/keyboard.json | 1 - keyboards/creatkeebs/glacier/keyboard.json | 1 - keyboards/crimsonkeyboards/resume1800/keyboard.json | 1 - keyboards/crowboard/keyboard.json | 1 - keyboards/cutie_club/borsdorf/keyboard.json | 1 - keyboards/cutie_club/fidelity/keyboard.json | 1 - keyboards/cutie_club/giant_macro_pad/keyboard.json | 1 - keyboards/cutie_club/keebcats/denis/keyboard.json | 1 - keyboards/cutie_club/keebcats/dougal/keyboard.json | 1 - keyboards/cutie_club/novus/keyboard.json | 1 - keyboards/cutie_club/wraith/keyboard.json | 1 - keyboards/cx60/keyboard.json | 1 - keyboards/cxt_studio/12e3/keyboard.json | 1 - keyboards/cxt_studio/12e4/keyboard.json | 1 - keyboards/dailycraft/bat43/info.json | 1 - keyboards/dailycraft/claw44/rev1/keyboard.json | 1 - keyboards/dailycraft/owl8/keyboard.json | 1 - keyboards/dailycraft/sandbox/rev1/keyboard.json | 1 - keyboards/dailycraft/sandbox/rev2/keyboard.json | 1 - keyboards/dailycraft/stickey4/keyboard.json | 1 - keyboards/dailycraft/wings42/rev1/keyboard.json | 1 - keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json | 1 - keyboards/dailycraft/wings42/rev2/keyboard.json | 1 - keyboards/daji/seis_cinco/keyboard.json | 1 - keyboards/dark/magnum_ergo_1/keyboard.json | 1 - keyboards/darkproject/kd83a_bfg_edition/keyboard.json | 1 - keyboards/darkproject/kd87a_bfg_edition/keyboard.json | 1 - keyboards/darmoshark/k3/keyboard.json | 1 - keyboards/dasky/reverb/keyboard.json | 1 - keyboards/dc01/arrow/keyboard.json | 1 - keyboards/dc01/left/keyboard.json | 1 - keyboards/dc01/numpad/keyboard.json | 1 - keyboards/dc01/right/keyboard.json | 1 - keyboards/delikeeb/flatbread60/keyboard.json | 1 - keyboards/delikeeb/vaguettelite/keyboard.json | 1 - keyboards/delikeeb/vanana/info.json | 1 - keyboards/delikeeb/waaffle/rev3/info.json | 1 - keyboards/deltapad/keyboard.json | 1 - keyboards/demiurge/keyboard.json | 1 - keyboards/deng/djam/keyboard.json | 1 - keyboards/deng/thirty/keyboard.json | 1 - keyboards/densus/alveus/mx/keyboard.json | 1 - keyboards/dichotomy/keyboard.json | 1 - keyboards/dk60/keyboard.json | 1 - keyboards/dm9records/ergoinu/keyboard.json | 1 - keyboards/do60/keyboard.json | 1 - keyboards/doio/kb09/keyboard.json | 1 - keyboards/doio/kb12/keyboard.json | 1 - keyboards/doio/kb19/keyboard.json | 1 - keyboards/doio/kb30/keyboard.json | 1 - keyboards/doio/kb3x/keyboard.json | 1 - keyboards/donutcables/budget96/keyboard.json | 1 - keyboards/donutcables/scrabblepad/keyboard.json | 1 - keyboards/doppelganger/keyboard.json | 1 - keyboards/doro67/multi/keyboard.json | 1 - keyboards/doro67/rgb/keyboard.json | 1 - keyboards/dp60/keyboard.json | 1 - keyboards/draculad/keyboard.json | 1 - keyboards/dtisaac/cg108/keyboard.json | 1 - keyboards/dtisaac/dosa40rgb/keyboard.json | 1 - keyboards/dtisaac/dtisaac01/keyboard.json | 1 - keyboards/duck/jetfire/keyboard.json | 1 - keyboards/duck/lightsaver/keyboard.json | 1 - keyboards/duck/octagon/v1/keyboard.json | 1 - keyboards/duck/octagon/v2/keyboard.json | 1 - keyboards/duck/orion/v3/keyboard.json | 1 - keyboards/duck/tcv3/keyboard.json | 1 - keyboards/dumbo/keyboard.json | 1 - keyboards/dz60/keyboard.json | 1 - keyboards/dztech/bocc/keyboard.json | 1 - keyboards/dztech/duo_s/keyboard.json | 1 - keyboards/dztech/dz60rgb/info.json | 1 - keyboards/dztech/dz60rgb_ansi/info.json | 1 - keyboards/dztech/dz60rgb_wkl/info.json | 1 - keyboards/dztech/dz64rgb/keyboard.json | 1 - keyboards/dztech/dz65rgb/info.json | 1 - keyboards/dztech/dz96/keyboard.json | 1 - keyboards/dztech/endless80/keyboard.json | 1 - keyboards/e88/keyboard.json | 1 - keyboards/eason/aeroboard/keyboard.json | 1 - keyboards/eason/capsule65/keyboard.json | 1 - keyboards/eason/meow65/keyboard.json | 1 - keyboards/eason/void65h/keyboard.json | 1 - keyboards/eco/info.json | 1 - keyboards/edc40/keyboard.json | 1 - keyboards/edi/standaside/keyboard.json | 1 - keyboards/efreet/keyboard.json | 1 - keyboards/ein_60/keyboard.json | 1 - keyboards/emi20/keyboard.json | 1 - keyboards/emptystring/nqg/keyboard.json | 1 - keyboards/eniigmakeyboards/ek60/keyboard.json | 1 - keyboards/eniigmakeyboards/ek65/keyboard.json | 1 - keyboards/eniigmakeyboards/ek87/keyboard.json | 1 - keyboards/epomaker/tide65/keyboard.json | 1 - keyboards/era/divine/keyboard.json | 1 - keyboards/era/era65/keyboard.json | 1 - keyboards/era/linx3/fave65s/keyboard.json | 1 - keyboards/era/linx3/n86/keyboard.json | 1 - keyboards/era/linx3/n87/keyboard.json | 1 - keyboards/era/linx3/n8x/keyboard.json | 1 - keyboards/era/sirind/brick65s/keyboard.json | 1 - keyboards/era/sirind/chickpad/keyboard.json | 1 - keyboards/era/sirind/klein_hs/keyboard.json | 1 - keyboards/era/sirind/klein_sd/keyboard.json | 1 - keyboards/era/sirind/tomak/keyboard.json | 1 - keyboards/era/sirind/tomak79h/keyboard.json | 1 - keyboards/era/sirind/tomak79s/keyboard.json | 1 - keyboards/esca/getawayvan/keyboard.json | 1 - keyboards/esca/getawayvan_f042/keyboard.json | 1 - keyboards/eve/meteor/keyboard.json | 1 - keyboards/evil80/keyboard.json | 1 - keyboards/evolv/keyboard.json | 1 - keyboards/evyd13/atom47/rev2/keyboard.json | 1 - keyboards/evyd13/atom47/rev3/keyboard.json | 1 - keyboards/evyd13/atom47/rev4/keyboard.json | 1 - keyboards/evyd13/atom47/rev5/keyboard.json | 1 - keyboards/evyd13/eon65/keyboard.json | 1 - keyboards/evyd13/eon75/keyboard.json | 1 - keyboards/evyd13/eon87/keyboard.json | 1 - keyboards/evyd13/eon95/keyboard.json | 1 - keyboards/evyd13/fin_pad/keyboard.json | 1 - keyboards/evyd13/minitomic/keyboard.json | 1 - keyboards/evyd13/nt650/keyboard.json | 1 - keyboards/evyd13/nt660/keyboard.json | 1 - keyboards/evyd13/nt980/keyboard.json | 1 - keyboards/evyd13/omrontkl/keyboard.json | 1 - keyboards/evyd13/plain60/keyboard.json | 1 - keyboards/evyd13/ta65/keyboard.json | 1 - keyboards/evyd13/wonderland/keyboard.json | 1 - keyboards/exclusive/e65/keyboard.json | 1 - keyboards/exclusive/e6_rgb/keyboard.json | 1 - keyboards/exclusive/e6v2/le/keyboard.json | 1 - keyboards/exclusive/e6v2/oe/keyboard.json | 1 - keyboards/exclusive/e7v1/keyboard.json | 1 - keyboards/exclusive/e85/hotswap/keyboard.json | 1 - keyboards/exclusive/e85/soldered/keyboard.json | 1 - keyboards/exent/keyboard.json | 1 - keyboards/eyeohdesigns/babyv/keyboard.json | 1 - keyboards/eyeohdesigns/theboulevard/keyboard.json | 1 - keyboards/facew/keyboard.json | 1 - keyboards/falsonix/fx19/keyboard.json | 1 - keyboards/fatotesa/keyboard.json | 1 - keyboards/fc660c/keyboard.json | 1 - keyboards/fc980c/keyboard.json | 1 - keyboards/flehrad/numbrero/keyboard.json | 1 - keyboards/flehrad/snagpad/keyboard.json | 1 - keyboards/flehrad/tradestation/keyboard.json | 1 - keyboards/fluorite/keyboard.json | 1 - keyboards/flx/virgo/keyboard.json | 1 - keyboards/foostan/cornelius/keyboard.json | 1 - keyboards/fortitude60/rev1/keyboard.json | 1 - keyboards/foxlab/key65/hotswap/keyboard.json | 1 - keyboards/foxlab/key65/universal/keyboard.json | 1 - keyboards/foxlab/leaf60/hotswap/keyboard.json | 1 - keyboards/foxlab/leaf60/universal/keyboard.json | 1 - keyboards/foxlab/time80/keyboard.json | 1 - keyboards/foxlab/time_re/hotswap/keyboard.json | 1 - keyboards/foxlab/time_re/universal/keyboard.json | 1 - keyboards/ft/mars65/keyboard.json | 1 - keyboards/ft/mars80/keyboard.json | 1 - keyboards/funky40/keyboard.json | 1 - keyboards/gami_studio/lex60/keyboard.json | 1 - keyboards/gboards/butterstick/keyboard.json | 1 - keyboards/gboards/gergoplex/keyboard.json | 1 - keyboards/geekboards/tester/keyboard.json | 1 - keyboards/ggkeyboards/genesis/hotswap/keyboard.json | 1 - keyboards/ggkeyboards/genesis/solder/keyboard.json | 1 - keyboards/gh60/revc/keyboard.json | 1 - keyboards/gh60/satan/keyboard.json | 1 - keyboards/gh60/v1p3/keyboard.json | 1 - keyboards/gh80_3000/keyboard.json | 1 - keyboards/ghs/jem/info.json | 1 - keyboards/ghs/xls/keyboard.json | 1 - keyboards/gkeyboard/gkb_m16/keyboard.json | 1 - keyboards/gl516/xr63gl/keyboard.json | 1 - keyboards/glenpickle/chimera_ergo/keyboard.json | 1 - keyboards/glenpickle/chimera_ls/keyboard.json | 1 - keyboards/gon/nerd60/keyboard.json | 1 - keyboards/gon/nerdtkl/keyboard.json | 1 - keyboards/gopolar/gg86/keyboard.json | 1 - keyboards/gray_studio/cod67/keyboard.json | 1 - keyboards/gray_studio/hb85/keyboard.json | 1 - keyboards/gray_studio/space65/keyboard.json | 1 - keyboards/gray_studio/think65/hotswap/keyboard.json | 1 - keyboards/gray_studio/think65/solder/keyboard.json | 1 - keyboards/grid600/press/keyboard.json | 1 - keyboards/gvalchca/ga150/keyboard.json | 1 - keyboards/h0oni/deskpad/keyboard.json | 1 - keyboards/h0oni/hotduck/keyboard.json | 1 - keyboards/hadron/info.json | 1 - keyboards/halokeys/elemental75/keyboard.json | 1 - keyboards/handwired/108key_trackpoint/keyboard.json | 1 - keyboards/handwired/2x5keypad/keyboard.json | 1 - keyboards/handwired/3dfoxc/keyboard.json | 1 - keyboards/handwired/3dortho14u/rev1/keyboard.json | 1 - keyboards/handwired/3dortho14u/rev2/keyboard.json | 1 - keyboards/handwired/3dp660/keyboard.json | 1 - keyboards/handwired/3dp660_oled/keyboard.json | 1 - keyboards/handwired/412_64/keyboard.json | 1 - keyboards/handwired/42/keyboard.json | 1 - keyboards/handwired/6macro/keyboard.json | 1 - keyboards/handwired/aek64/keyboard.json | 1 - keyboards/handwired/alcor_dactyl/keyboard.json | 1 - keyboards/handwired/aplx2/keyboard.json | 1 - keyboards/handwired/arrow_pad/keyboard.json | 1 - keyboards/handwired/atreus50/keyboard.json | 1 - keyboards/handwired/bdn9_ble/keyboard.json | 1 - keyboards/handwired/bigmac/keyboard.json | 1 - keyboards/handwired/boss566y/redragon_vara/keyboard.json | 1 - keyboards/handwired/brain/keyboard.json | 1 - keyboards/handwired/cans12er/keyboard.json | 1 - keyboards/handwired/chiron/keyboard.json | 1 - keyboards/handwired/ck4x4/keyboard.json | 1 - keyboards/handwired/cmd60/keyboard.json | 1 - keyboards/handwired/colorlice/keyboard.json | 1 - keyboards/handwired/croxsplit44/keyboard.json | 1 - keyboards/handwired/curiosity/keyboard.json | 1 - keyboards/handwired/d48/keyboard.json | 1 - keyboards/handwired/dactyl/keyboard.json | 1 - keyboards/handwired/dactyl_kinesis/keyboard.json | 1 - keyboards/handwired/dactyl_left/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x7/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x8/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/6x6/info.json | 1 - keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/6x7/keyboard.json | 1 - keyboards/handwired/dactyl_maximus/keyboard.json | 1 - keyboards/handwired/dactyl_promicro/keyboard.json | 1 - keyboards/handwired/daishi/keyboard.json | 1 - keyboards/handwired/datahand/keyboard.json | 1 - keyboards/handwired/ddg_56/keyboard.json | 1 - keyboards/handwired/eagleii/keyboard.json | 1 - keyboards/handwired/elrgo_s/keyboard.json | 1 - keyboards/handwired/ergocheap/keyboard.json | 1 - keyboards/handwired/fc200rt_qmk/keyboard.json | 1 - keyboards/handwired/fivethirteen/keyboard.json | 1 - keyboards/handwired/gamenum/keyboard.json | 1 - keyboards/handwired/hacked_motospeed/keyboard.json | 1 - keyboards/handwired/hexon38/keyboard.json | 1 - keyboards/handwired/hnah108/keyboard.json | 1 - keyboards/handwired/hnah40rgb/keyboard.json | 1 - keyboards/handwired/hwpm87/keyboard.json | 1 - keyboards/handwired/iso85k/keyboard.json | 1 - keyboards/handwired/itstleo9/info.json | 1 - keyboards/handwired/jankrp2040dactyl/keyboard.json | 1 - keyboards/handwired/jn68m/keyboard.json | 1 - keyboards/handwired/jot50/keyboard.json | 1 - keyboards/handwired/jotpad16/keyboard.json | 1 - keyboards/handwired/jtallbean/split_65/keyboard.json | 1 - keyboards/handwired/k8split/keyboard.json | 1 - keyboards/handwired/k_numpad17/keyboard.json | 1 - keyboards/handwired/kbod/keyboard.json | 1 - keyboards/handwired/ks63/keyboard.json | 1 - keyboards/handwired/lemonpad/keyboard.json | 1 - keyboards/handwired/macroboard/info.json | 1 - keyboards/handwired/magicforce61/keyboard.json | 1 - keyboards/handwired/magicforce68/keyboard.json | 1 - keyboards/handwired/marek128b/ergosplit44/keyboard.json | 1 - keyboards/handwired/mechboards_micropad/keyboard.json | 1 - keyboards/handwired/minorca/keyboard.json | 1 - keyboards/handwired/ms_sculpt_mobile/info.json | 1 - keyboards/handwired/myskeeb/keyboard.json | 1 - keyboards/handwired/nicekey/keyboard.json | 1 - keyboards/handwired/nortontechpad/keyboard.json | 1 - keyboards/handwired/not_so_minidox/keyboard.json | 1 - keyboards/handwired/novem/keyboard.json | 1 - keyboards/handwired/nozbe_macro/keyboard.json | 1 - keyboards/handwired/numpad20/keyboard.json | 1 - keyboards/handwired/obuwunkunubi/spaget/keyboard.json | 1 - keyboards/handwired/onekey/info.json | 1 - keyboards/handwired/ortho5x13/keyboard.json | 1 - keyboards/handwired/ortho5x14/keyboard.json | 1 - keyboards/handwired/ortho_brass/keyboard.json | 1 - keyboards/handwired/osborne1/keyboard.json | 1 - keyboards/handwired/p65rgb/keyboard.json | 1 - keyboards/handwired/pilcrow/keyboard.json | 1 - keyboards/handwired/postageboard/info.json | 1 - keyboards/handwired/promethium/keyboard.json | 1 - keyboards/handwired/protype/keyboard.json | 1 - keyboards/handwired/pteron/keyboard.json | 1 - keyboards/handwired/pteron38/keyboard.json | 1 - keyboards/handwired/pteron44/keyboard.json | 1 - keyboards/handwired/qc60/proto/keyboard.json | 1 - keyboards/handwired/rd_61_qmk/keyboard.json | 1 - keyboards/handwired/retro_refit/keyboard.json | 1 - keyboards/handwired/riblee_f401/keyboard.json | 1 - keyboards/handwired/riblee_f411/keyboard.json | 1 - keyboards/handwired/riblee_split/keyboard.json | 1 - keyboards/handwired/rs60/keyboard.json | 1 - keyboards/handwired/sejin_eat1010r2/keyboard.json | 1 - keyboards/handwired/sick68/keyboard.json | 1 - keyboards/handwired/skakunm_dactyl/keyboard.json | 1 - keyboards/handwired/slash/keyboard.json | 1 - keyboards/handwired/snatchpad/keyboard.json | 1 - keyboards/handwired/sono1/info.json | 1 - keyboards/handwired/space_oddity/keyboard.json | 1 - keyboards/handwired/splittest/info.json | 1 - keyboards/handwired/steamvan/rev1/keyboard.json | 1 - keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json | 1 - keyboards/handwired/sticc14/keyboard.json | 1 - keyboards/handwired/swiftrax/cowfish/keyboard.json | 1 - keyboards/handwired/symmetric70_proto/info.json | 1 - keyboards/handwired/symmetry60/keyboard.json | 1 - keyboards/handwired/t111/keyboard.json | 1 - keyboards/handwired/terminus_mini/keyboard.json | 1 - keyboards/handwired/tkk/keyboard.json | 1 - keyboards/handwired/trackpoint/keyboard.json | 1 - keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json | 1 - keyboards/handwired/tractyl_manuform/5x6_right/info.json | 1 - keyboards/handwired/traveller/keyboard.json | 1 - keyboards/handwired/twig/twig50/keyboard.json | 1 - keyboards/handwired/unicomp_mini_m/keyboard.json | 1 - keyboards/handwired/uthol/info.json | 1 - keyboards/handwired/woodpad/keyboard.json | 1 - keyboards/handwired/wulkan/keyboard.json | 1 - keyboards/handwired/wwa/helios/keyboard.json | 1 - keyboards/handwired/wwa/kepler/keyboard.json | 1 - keyboards/handwired/wwa/mercury/keyboard.json | 1 - keyboards/handwired/wwa/soyuz/keyboard.json | 1 - keyboards/handwired/wwa/soyuzxl/keyboard.json | 1 - keyboards/handwired/xealous/rev1/keyboard.json | 1 - keyboards/handwired/z150/keyboard.json | 1 - keyboards/handwired/ziyoulang_k3_mod/keyboard.json | 3 +-- keyboards/hardlineworks/otd_plus/keyboard.json | 1 - keyboards/heliar/wm1_hotswap/keyboard.json | 1 - keyboards/helix/rev3_4rows/keyboard.json | 1 - keyboards/helix/rev3_5rows/keyboard.json | 1 - keyboards/herevoland/buff75/keyboard.json | 1 - keyboards/hfdkb/ac001/keyboard.json | 1 - keyboards/hhkb/ansi/info.json | 1 - keyboards/hhkb/jp/keyboard.json | 1 - keyboards/hhkb/yang/keyboard.json | 1 - keyboards/hhkb_lite_2/keyboard.json | 1 - keyboards/hineybush/h08_ocelot/keyboard.json | 1 - keyboards/hineybush/h10/keyboard.json | 1 - keyboards/hineybush/h101/keyboard.json | 1 - keyboards/hineybush/h60/keyboard.json | 1 - keyboards/hineybush/h65/keyboard.json | 1 - keyboards/hineybush/h65_hotswap/keyboard.json | 1 - keyboards/hineybush/h660s/keyboard.json | 1 - keyboards/hineybush/h75_singa/keyboard.json | 1 - keyboards/hineybush/h87_g2/keyboard.json | 1 - keyboards/hineybush/h87a/keyboard.json | 1 - keyboards/hineybush/h88/keyboard.json | 1 - keyboards/hineybush/h88_g2/keyboard.json | 1 - keyboards/hineybush/hbcp/keyboard.json | 1 - keyboards/hineybush/hineyg80/keyboard.json | 1 - keyboards/hineybush/ibis/keyboard.json | 1 - keyboards/hineybush/physix/keyboard.json | 1 - keyboards/hineybush/sm68/keyboard.json | 1 - keyboards/hnahkb/freyr/keyboard.json | 1 - keyboards/hnahkb/stella/keyboard.json | 1 - keyboards/holyswitch/lightweight65/keyboard.json | 1 - keyboards/holyswitch/southpaw75/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json | 1 - keyboards/horrortroll/handwired_k552/keyboard.json | 1 - keyboards/horrortroll/lemon40/keyboard.json | 1 - keyboards/hp69/keyboard.json | 1 - keyboards/hs60/v1/info.json | 1 - keyboards/hs60/v2/ansi/keyboard.json | 1 - keyboards/hs60/v2/hhkb/keyboard.json | 1 - keyboards/hs60/v2/iso/keyboard.json | 1 - keyboards/hubble/keyboard.json | 1 - keyboards/icebreaker/hotswap/keyboard.json | 1 - keyboards/idobao/id75/v1/keyboard.json | 1 - keyboards/idobao/id75/v2/keyboard.json | 1 - keyboards/idobao/id80/v2/info.json | 1 - keyboards/igloo/keyboard.json | 1 - keyboards/illuminati/is0/keyboard.json | 1 - keyboards/illusion/rosa/keyboard.json | 1 - keyboards/ilumkb/primus75/keyboard.json | 1 - keyboards/ilumkb/simpler61/keyboard.json | 1 - keyboards/ilumkb/simpler64/keyboard.json | 1 - keyboards/ilumkb/volcano660/keyboard.json | 1 - keyboards/inett_studio/sqx/hotswap/keyboard.json | 1 - keyboards/inett_studio/sqx/universal/keyboard.json | 1 - keyboards/inland/mk47/keyboard.json | 1 - keyboards/input_club/k_type/keyboard.json | 1 - keyboards/irene/keyboard.json | 1 - keyboards/iriskeyboards/keyboard.json | 1 - keyboards/iron180/keyboard.json | 1 - keyboards/j80/keyboard.json | 1 - keyboards/jae/j01/keyboard.json | 1 - keyboards/jagdpietr/drakon/keyboard.json | 1 - keyboards/jaykeeb/aumz_work/info.json | 1 - keyboards/jaykeeb/jk60/keyboard.json | 1 - keyboards/jaykeeb/jk60rgb/keyboard.json | 1 - keyboards/jaykeeb/jk65/keyboard.json | 1 - keyboards/jaykeeb/joker/keyboard.json | 1 - keyboards/jaykeeb/kamigakushi/keyboard.json | 1 - keyboards/jaykeeb/orba/keyboard.json | 1 - keyboards/jaykeeb/sebelas/keyboard.json | 1 - keyboards/jaykeeb/skyline/keyboard.json | 1 - keyboards/jaykeeb/tokki/keyboard.json | 1 - keyboards/jc65/v32a/keyboard.json | 1 - keyboards/jc65/v32u4/keyboard.json | 1 - keyboards/jd40/keyboard.json | 1 - keyboards/jd45/keyboard.json | 1 - keyboards/jels/boaty/keyboard.json | 1 - keyboards/jels/jels60/info.json | 1 - keyboards/jels/jels88/keyboard.json | 1 - keyboards/jolofsor/denial75/keyboard.json | 1 - keyboards/jukaie/jk01/keyboard.json | 1 - keyboards/kabedon/kabedon78s/keyboard.json | 1 - keyboards/kabedon/kabedon98e/keyboard.json | 1 - keyboards/kagizaraya/chidori/keyboard.json | 1 - keyboards/kagizaraya/halberd/keyboard.json | 1 - keyboards/kagizaraya/miniaxe/keyboard.json | 1 - keyboards/kagizaraya/scythe/keyboard.json | 1 - keyboards/kakunpc/business_card/alpha/keyboard.json | 1 - keyboards/kakunpc/business_card/beta/keyboard.json | 1 - keyboards/kb_elmo/67mk_e/keyboard.json | 1 - keyboards/kb_elmo/isolation/keyboard.json | 1 - keyboards/kb_elmo/qez/keyboard.json | 1 - keyboards/kb_elmo/vertex/keyboard.json | 1 - keyboards/kbdfans/bella/rgb/keyboard.json | 1 - keyboards/kbdfans/bella/rgb_iso/keyboard.json | 1 - keyboards/kbdfans/bella/soldered/keyboard.json | 1 - keyboards/kbdfans/boop65/rgb/keyboard.json | 1 - keyboards/kbdfans/bounce/75/soldered/keyboard.json | 1 - keyboards/kbdfans/jm60/keyboard.json | 1 - keyboards/kbdfans/kbd4x/keyboard.json | 1 - keyboards/kbdfans/kbd66/keyboard.json | 1 - keyboards/kbdfans/kbd67/hotswap/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/info.json | 1 - keyboards/kbdfans/kbd67/mkiirgb_iso/keyboard.json | 1 - keyboards/kbdfans/kbd67/rev1/keyboard.json | 1 - keyboards/kbdfans/kbd67/rev2/keyboard.json | 1 - keyboards/kbdfans/kbd6x/keyboard.json | 1 - keyboards/kbdfans/kbd75/rev1/keyboard.json | 1 - keyboards/kbdfans/kbd75/rev2/keyboard.json | 1 - keyboards/kbdfans/kbd75rgb/keyboard.json | 1 - keyboards/kbdfans/kbd8x/keyboard.json | 1 - keyboards/kbdfans/kbdmini/keyboard.json | 1 - keyboards/kbdfans/maja/keyboard.json | 1 - keyboards/kbdfans/maja_soldered/keyboard.json | 1 - keyboards/kbdfans/niu_mini/keyboard.json | 1 - keyboards/kbdfans/odin/rgb/keyboard.json | 1 - keyboards/kbdfans/odin/soldered/keyboard.json | 1 - keyboards/kbdfans/odin/v2/keyboard.json | 1 - keyboards/kbdfans/phaseone/keyboard.json | 1 - keyboards/kbdfans/tiger80/keyboard.json | 1 - keyboards/kc60/keyboard.json | 1 - keyboards/kc60se/keyboard.json | 1 - keyboards/keebformom/keyboard.json | 1 - keyboards/keebio/dilly/keyboard.json | 1 - keyboards/keebmonkey/kbmg68/keyboard.json | 1 - keyboards/keebsforall/freebird60/keyboard.json | 1 - keyboards/keebsforall/freebird75/keyboard.json | 1 - keyboards/keebwerk/mega/ansi/keyboard.json | 1 - keyboards/keebwerk/nano_slider/keyboard.json | 1 - keyboards/keebzdotnet/fme/keyboard.json | 1 - keyboards/kelwin/utopia88/keyboard.json | 1 - keyboards/keybage/radpad/keyboard.json | 1 - keyboards/keybee/keybee65/keyboard.json | 1 - keyboards/keyboardio/atreus/keyboard.json | 1 - keyboards/keyhive/honeycomb/keyboard.json | 1 - keyboards/keyhive/lattice60/keyboard.json | 1 - keyboards/keyhive/navi10/info.json | 1 - keyboards/keyhive/southpole/keyboard.json | 1 - keyboards/keyhive/ut472/keyboard.json | 1 - keyboards/keyprez/bison/keyboard.json | 1 - keyboards/keyprez/corgi/keyboard.json | 1 - keyboards/keyprez/rhino/keyboard.json | 1 - keyboards/keyprez/unicorn/keyboard.json | 1 - keyboards/keysofkings/twokey/keyboard.json | 1 - keyboards/keyten/aperture/keyboard.json | 1 - keyboards/keyten/kt3700/keyboard.json | 1 - keyboards/keyten/kt60_m/keyboard.json | 1 - keyboards/kezewa/enter67/keyboard.json | 1 - keyboards/kezewa/enter80/keyboard.json | 1 - keyboards/kibou/fukuro/keyboard.json | 1 - keyboards/kikkou/keyboard.json | 1 - keyboards/kinesis/info.json | 1 - keyboards/kineticlabs/emu/hotswap/keyboard.json | 1 - keyboards/kineticlabs/emu/soldered/keyboard.json | 1 - keyboards/kingly_keys/ave/ortho/keyboard.json | 1 - keyboards/kingly_keys/ave/staggered/keyboard.json | 1 - keyboards/kingly_keys/little_foot/keyboard.json | 1 - keyboards/kingly_keys/romac/keyboard.json | 1 - keyboards/kingly_keys/romac_plus/keyboard.json | 1 - keyboards/kingly_keys/smd_milk/keyboard.json | 1 - keyboards/kira/kira75/keyboard.json | 1 - keyboards/kira/kira80/keyboard.json | 1 - keyboards/kk/65/keyboard.json | 1 - keyboards/knobgoblin/keyboard.json | 1 - keyboards/kona_classic/keyboard.json | 1 - keyboards/kopibeng/xt60/keyboard.json | 1 - keyboards/kopibeng/xt60_singa/keyboard.json | 1 - keyboards/kopibeng/xt65/keyboard.json | 1 - keyboards/kopibeng/xt8x/keyboard.json | 1 - keyboards/kprepublic/bm16a/v1/keyboard.json | 1 - keyboards/kprepublic/bm16a/v2/keyboard.json | 1 - keyboards/kprepublic/bm16s/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm43a/keyboard.json | 1 - keyboards/kprepublic/bm43hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_iso/rev2/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_poker/rev2/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm80hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm80v2/keyboard.json | 1 - keyboards/kprepublic/bm80v2_iso/keyboard.json | 1 - keyboards/kprepublic/bm980hsrgb/keyboard.json | 1 - keyboards/kprepublic/cospad/keyboard.json | 1 - keyboards/kprepublic/cstc40/info.json | 1 - keyboards/kprepublic/jj40/rev1/keyboard.json | 1 - keyboards/kprepublic/jj4x4/keyboard.json | 1 - keyboards/kprepublic/jj50/rev1/keyboard.json | 1 - keyboards/kprepublic/jj50/rev2/keyboard.json | 1 - keyboards/ktec/daisy/keyboard.json | 1 - keyboards/ktec/staryu/keyboard.json | 1 - keyboards/kumaokobo/kudox_game/info.json | 1 - keyboards/kuro/kuro65/keyboard.json | 1 - keyboards/kv/revt/keyboard.json | 1 - keyboards/kwstudio/pisces/keyboard.json | 1 - keyboards/kwstudio/scorpio/keyboard.json | 1 - keyboards/kwstudio/scorpio_rev2/keyboard.json | 1 - keyboards/labbe/labbeminiv1/keyboard.json | 1 - keyboards/labyrinth75/keyboard.json | 1 - keyboards/laneware/lpad/keyboard.json | 1 - keyboards/laneware/lw67/keyboard.json | 1 - keyboards/laneware/lw75/keyboard.json | 1 - keyboards/laneware/macro1/keyboard.json | 1 - keyboards/laser_ninja/pumpkinpad/keyboard.json | 1 - keyboards/latincompass/latin17rgb/keyboard.json | 1 - keyboards/latincompass/latin47ble/keyboard.json | 1 - keyboards/latincompass/latin60rgb/keyboard.json | 1 - keyboards/latincompass/latin64ble/keyboard.json | 1 - keyboards/latincompass/latin6rgb/keyboard.json | 1 - keyboards/leafcutterlabs/bigknob/keyboard.json | 1 - keyboards/leeku/finger65/keyboard.json | 1 - keyboards/lets_split/info.json | 1 - keyboards/lfkeyboards/lfk78/revb/keyboard.json | 1 - keyboards/lfkeyboards/lfk78/revc/keyboard.json | 1 - keyboards/lfkeyboards/lfk78/revj/keyboard.json | 1 - keyboards/lfkeyboards/lfk87/info.json | 1 - keyboards/lfkeyboards/lfkpad/keyboard.json | 1 - keyboards/lfkeyboards/mini1800/info.json | 1 - keyboards/lfkeyboards/smk65/info.json | 1 - keyboards/lily58/lite_rev3/keyboard.json | 1 - keyboards/lily58/r2g/keyboard.json | 1 - keyboards/lily58/rev1/keyboard.json | 1 - keyboards/linworks/fave104/keyboard.json | 1 - keyboards/linworks/fave60/keyboard.json | 1 - keyboards/linworks/fave60a/keyboard.json | 1 - keyboards/linworks/fave65h/keyboard.json | 1 - keyboards/linworks/fave84h/keyboard.json | 1 - keyboards/linworks/fave87h/keyboard.json | 1 - keyboards/linworks/favepada/keyboard.json | 1 - keyboards/littlealby/mute/keyboard.json | 1 - keyboards/lm_keyboard/lm60n/keyboard.json | 1 - keyboards/lxxt/keyboard.json | 1 - keyboards/lyso1/lefishe/keyboard.json | 1 - keyboards/lz/erghost/keyboard.json | 1 - keyboards/m10a/keyboard.json | 1 - keyboards/magic_force/mf34/keyboard.json | 1 - keyboards/makrosu/keyboard.json | 1 - keyboards/malevolti/lyra/rev1/keyboard.json | 1 - keyboards/malevolti/superlyra/rev1/keyboard.json | 1 - keyboards/maple_computing/6ball/keyboard.json | 1 - keyboards/maple_computing/c39/keyboard.json | 1 - keyboards/maple_computing/ivy/rev1/keyboard.json | 1 - keyboards/maple_computing/jnao/keyboard.json | 1 - keyboards/maple_computing/launchpad/rev1/keyboard.json | 1 - keyboards/maple_computing/lets_split_eh/keyboard.json | 1 - keyboards/maple_computing/minidox/rev1/keyboard.json | 1 - keyboards/maple_computing/the_ruler/keyboard.json | 1 - keyboards/mariorion_v25/prod/keyboard.json | 1 - keyboards/mariorion_v25/proto/keyboard.json | 1 - keyboards/matrix/abelx/keyboard.json | 1 - keyboards/matrix/cain_re/keyboard.json | 1 - keyboards/matrix/falcon/keyboard.json | 1 - keyboards/matrix/m12og/rev1/keyboard.json | 1 - keyboards/matrix/m12og/rev2/keyboard.json | 1 - keyboards/matrix/m20add/keyboard.json | 1 - keyboards/matrix/me/keyboard.json | 1 - keyboards/matrix/noah/keyboard.json | 1 - keyboards/maxipad/info.json | 1 - keyboards/mazestudio/jocker/keyboard.json | 1 - keyboards/mb44/keyboard.json | 1 - keyboards/mechanickeys/miniashen40/keyboard.json | 1 - keyboards/mechanickeys/undead60m/keyboard.json | 1 - keyboards/mechbrewery/mb65h/keyboard.json | 1 - keyboards/mechbrewery/mb65s/keyboard.json | 1 - keyboards/mechkeys/acr60/keyboard.json | 1 - keyboards/mechkeys/alu84/keyboard.json | 1 - keyboards/mechkeys/espectro/keyboard.json | 1 - keyboards/mechkeys/mechmini/v1/keyboard.json | 1 - keyboards/mechkeys/mk60/keyboard.json | 1 - keyboards/mechlovin/adelais/info.json | 1 - keyboards/mechlovin/delphine/info.json | 1 - keyboards/mechlovin/foundation/keyboard.json | 1 - keyboards/mechlovin/hannah60rgb/rev1/keyboard.json | 1 - keyboards/mechlovin/hannah60rgb/rev2/keyboard.json | 1 - keyboards/mechlovin/hannah65/rev1/haus/keyboard.json | 1 - keyboards/mechlovin/hannah910/rev1/keyboard.json | 1 - keyboards/mechlovin/hannah910/rev2/keyboard.json | 1 - keyboards/mechlovin/hannah910/rev3/keyboard.json | 1 - keyboards/mechlovin/hex4b/info.json | 1 - keyboards/mechlovin/hex6c/keyboard.json | 1 - keyboards/mechlovin/infinity87/rev1/rogue87/keyboard.json | 1 - keyboards/mechlovin/infinity87/rev1/rouge87/keyboard.json | 1 - keyboards/mechlovin/infinity87/rev1/standard/keyboard.json | 1 - keyboards/mechlovin/infinity87/rev2/keyboard.json | 1 - keyboards/mechlovin/infinity87/rgb_rev1/keyboard.json | 1 - keyboards/mechlovin/infinity875/keyboard.json | 1 - keyboards/mechlovin/infinity88/keyboard.json | 1 - keyboards/mechlovin/infinityce/keyboard.json | 1 - keyboards/mechlovin/jay60/keyboard.json | 1 - keyboards/mechlovin/kanu/keyboard.json | 1 - keyboards/mechlovin/kay60/keyboard.json | 1 - keyboards/mechlovin/kay65/keyboard.json | 1 - keyboards/mechlovin/mechlovin9/info.json | 1 - keyboards/mechlovin/olly/bb/keyboard.json | 1 - keyboards/mechlovin/olly/jf/info.json | 1 - keyboards/mechlovin/olly/octagon/keyboard.json | 1 - keyboards/mechlovin/olly/orion/keyboard.json | 1 - keyboards/mechlovin/pisces/keyboard.json | 1 - keyboards/mechlovin/serratus/keyboard.json | 1 - keyboards/mechlovin/th1800/keyboard.json | 1 - keyboards/mechlovin/zed1800/info.json | 1 - keyboards/mechlovin/zed60/keyboard.json | 1 - keyboards/mechlovin/zed65/mono_led/keyboard.json | 1 - keyboards/mechlovin/zed65/no_backlight/cor65/keyboard.json | 1 - keyboards/mechlovin/zed65/no_backlight/retro66/keyboard.json | 1 - .../mechlovin/zed65/no_backlight/wearhaus66/keyboard.json | 1 - keyboards/meetlab/kafka60/keyboard.json | 1 - keyboards/meetlab/kafka68/keyboard.json | 1 - keyboards/meetlab/kafkasplit/keyboard.json | 1 - keyboards/meetlab/kalice/keyboard.json | 1 - keyboards/meetlab/rena/keyboard.json | 1 - keyboards/mehkee96/keyboard.json | 1 - keyboards/melgeek/mach80/info.json | 1 - keyboards/melgeek/mj61/info.json | 1 - keyboards/melgeek/mj63/info.json | 1 - keyboards/melgeek/mj64/info.json | 1 - keyboards/melgeek/mj65/rev3/keyboard.json | 1 - keyboards/melgeek/mj6xy/info.json | 1 - keyboards/melgeek/mojo68/rev1/keyboard.json | 1 - keyboards/melgeek/mojo75/rev1/keyboard.json | 1 - keyboards/melgeek/tegic/rev1/keyboard.json | 1 - keyboards/melgeek/z70ultra/rev1/keyboard.json | 1 - keyboards/meme/keyboard.json | 1 - keyboards/merge/iso_macro/keyboard.json | 1 - keyboards/mexsistor/ludmila/keyboard.json | 1 - keyboards/miller/gm862/keyboard.json | 1 - keyboards/millet/doksin/keyboard.json | 1 - keyboards/mincedshon/ecila/keyboard.json | 1 - keyboards/minimacro5/keyboard.json | 1 - keyboards/mint60/keyboard.json | 1 - keyboards/misterknife/knife66/keyboard.json | 1 - keyboards/misterknife/knife66_iso/keyboard.json | 1 - keyboards/mitosis/keyboard.json | 1 - keyboards/miuni32/keyboard.json | 1 - keyboards/mk65/keyboard.json | 1 - keyboards/mmkzoo65/keyboard.json | 1 - keyboards/mode/m256ws/keyboard.json | 1 - keyboards/mode/m60h/keyboard.json | 1 - keyboards/mode/m60h_f/keyboard.json | 1 - keyboards/mode/m60s/keyboard.json | 1 - keyboards/mode/m65ha_alpha/keyboard.json | 1 - keyboards/mode/m65hi_alpha/keyboard.json | 1 - keyboards/mode/m65s/keyboard.json | 1 - keyboards/mode/m75h/keyboard.json | 1 - keyboards/mode/m75s/keyboard.json | 1 - keyboards/mode/m80v1/m80h/keyboard.json | 1 - keyboards/mode/m80v1/m80s/keyboard.json | 1 - keyboards/mokey/ginkgo65/keyboard.json | 1 - keyboards/mokey/ginkgo65hot/keyboard.json | 1 - keyboards/mokey/ibis80/keyboard.json | 1 - keyboards/mokey/luckycat70/keyboard.json | 1 - keyboards/mokey/mokey12x2/keyboard.json | 1 - keyboards/mokey/mokey63/keyboard.json | 1 - keyboards/mokey/mokey64/keyboard.json | 1 - keyboards/mokey/xox70/keyboard.json | 1 - keyboards/mokey/xox70hot/keyboard.json | 1 - keyboards/moky/moky67/keyboard.json | 1 - keyboards/moky/moky88/keyboard.json | 1 - keyboards/momoka_ergo/keyboard.json | 1 - keyboards/momokai/aurora/keyboard.json | 1 - keyboards/momokai/tap_duo/keyboard.json | 1 - keyboards/momokai/tap_trio/keyboard.json | 1 - keyboards/monarch/keyboard.json | 1 - keyboards/monoflex60/keyboard.json | 1 - keyboards/mothwing/keyboard.json | 1 - keyboards/mountainblocks/mb17/keyboard.json | 1 - keyboards/mountainmechdesigns/teton_78/keyboard.json | 1 - keyboards/ms_sculpt/keyboard.json | 1 - keyboards/mss_studio/m63_rgb/keyboard.json | 1 - keyboards/mss_studio/m64_rgb/keyboard.json | 1 - keyboards/mt/blocked65/keyboard.json | 1 - keyboards/mt/mt40/keyboard.json | 1 - keyboards/mt/mt64rgb/keyboard.json | 1 - keyboards/mt/mt84/keyboard.json | 1 - keyboards/mt/split75/keyboard.json | 1 - keyboards/murcielago/rev1/keyboard.json | 1 - keyboards/mwstudio/mmk_3/keyboard.json | 1 - keyboards/mwstudio/mw65_black/keyboard.json | 1 - keyboards/mwstudio/mw65_rgb/keyboard.json | 1 - keyboards/mwstudio/mw660/keyboard.json | 1 - keyboards/mwstudio/mw75/keyboard.json | 1 - keyboards/mwstudio/mw75r2/keyboard.json | 1 - keyboards/mwstudio/mw80/keyboard.json | 1 - keyboards/mykeyclub/jris65/hotswap/keyboard.json | 1 - keyboards/nacly/splitreus62/keyboard.json | 1 - keyboards/nacly/ua62/keyboard.json | 1 - keyboards/navi60/keyboard.json | 1 - keyboards/ncc1701kb/keyboard.json | 1 - keyboards/nek_type_a/keyboard.json | 1 - keyboards/nemui/keyboard.json | 1 - keyboards/neokeys/g67/element_hs/keyboard.json | 1 - keyboards/neokeys/g67/hotswap/keyboard.json | 1 - keyboards/neokeys/g67/soldered/keyboard.json | 1 - keyboards/neson_design/700e/keyboard.json | 1 - keyboards/neson_design/810e/keyboard.json | 1 - keyboards/neson_design/n6/keyboard.json | 1 - keyboards/neson_design/nico/keyboard.json | 1 - keyboards/newgame40/keyboard.json | 1 - keyboards/nibell/micropad4x4/keyboard.json | 1 - keyboards/nibiria/stream15/keyboard.json | 1 - keyboards/nightly_boards/adellein/keyboard.json | 1 - keyboards/nightly_boards/alter/rev1/keyboard.json | 1 - keyboards/nightly_boards/alter_lite/keyboard.json | 1 - keyboards/nightly_boards/conde60/keyboard.json | 1 - keyboards/nightly_boards/n2/keyboard.json | 1 - keyboards/nightly_boards/n40_o/keyboard.json | 1 - keyboards/nightly_boards/n60_s/keyboard.json | 1 - keyboards/nightly_boards/n87/keyboard.json | 1 - keyboards/nightly_boards/n9/keyboard.json | 1 - keyboards/nightly_boards/octopad/keyboard.json | 1 - keyboards/nightly_boards/octopadplus/keyboard.json | 1 - keyboards/nightly_boards/paraluman/keyboard.json | 1 - keyboards/ning/tiny_board/tb16_rgb/keyboard.json | 1 - keyboards/nix_studio/n60_a/keyboard.json | 1 - keyboards/nix_studio/oxalys80/keyboard.json | 1 - keyboards/novelkeys/nk65/info.json | 1 - keyboards/novelkeys/novelpad/keyboard.json | 1 - keyboards/noxary/220/keyboard.json | 1 - keyboards/noxary/260/keyboard.json | 1 - keyboards/noxary/268_2/keyboard.json | 1 - keyboards/noxary/268_2_rgb/keyboard.json | 1 - keyboards/noxary/280/keyboard.json | 1 - keyboards/noxary/378/keyboard.json | 1 - keyboards/noxary/valhalla/keyboard.json | 1 - keyboards/noxary/valhalla_v2/keyboard.json | 1 - keyboards/noxary/x268/keyboard.json | 1 - keyboards/numatreus/keyboard.json | 1 - keyboards/obosob/arch_36/keyboard.json | 1 - keyboards/ocean/gin_v2/keyboard.json | 1 - keyboards/ocean/slamz/keyboard.json | 1 - keyboards/ocean/stealth/keyboard.json | 1 - keyboards/ocean/wang_ergo/keyboard.json | 1 - keyboards/ocean/wang_v2/keyboard.json | 1 - keyboards/odelia/keyboard.json | 1 - keyboards/ogre/ergo_single/keyboard.json | 1 - keyboards/ogre/ergo_split/keyboard.json | 1 - keyboards/ok60/keyboard.json | 1 - keyboards/omkbd/ergodash/mini/keyboard.json | 1 - keyboards/omkbd/ergodash/rev1/keyboard.json | 1 - keyboards/omkbd/runner3680/3x6/keyboard.json | 1 - keyboards/omkbd/runner3680/3x7/keyboard.json | 1 - keyboards/omkbd/runner3680/3x8/keyboard.json | 1 - keyboards/omkbd/runner3680/4x6/keyboard.json | 1 - keyboards/omkbd/runner3680/4x7/keyboard.json | 1 - keyboards/omkbd/runner3680/4x8/keyboard.json | 1 - keyboards/omkbd/runner3680/5x6/keyboard.json | 1 - keyboards/omkbd/runner3680/5x6_5x8/keyboard.json | 1 - keyboards/omkbd/runner3680/5x7/keyboard.json | 1 - keyboards/omkbd/runner3680/5x8/keyboard.json | 1 - keyboards/orange75/keyboard.json | 1 - keyboards/org60/keyboard.json | 1 - keyboards/owlab/jelly_evolv/info.json | 1 - keyboards/owlab/spring/keyboard.json | 1 - keyboards/owlab/suit80/ansi/keyboard.json | 1 - keyboards/owlab/suit80/iso/keyboard.json | 1 - keyboards/p3d/eu_isolation/keyboard.json | 1 - keyboards/p3d/q4z/keyboard.json | 1 - keyboards/p3d/spacey/keyboard.json | 1 - keyboards/p3d/synapse/keyboard.json | 1 - keyboards/pabile/p20/info.json | 1 - keyboards/panc40/keyboard.json | 1 - keyboards/panc60/keyboard.json | 1 - keyboards/papercranekeyboards/gerald65/keyboard.json | 1 - keyboards/pdxkbc/keyboard.json | 1 - keyboards/pearlboards/atlas/keyboard.json | 1 - keyboards/pearlboards/pandora/keyboard.json | 1 - keyboards/pearlboards/pearl/keyboard.json | 1 - keyboards/pearlboards/zeus/keyboard.json | 1 - keyboards/pearlboards/zeuspad/keyboard.json | 1 - keyboards/pegasus/keyboard.json | 1 - keyboards/percent/booster/keyboard.json | 1 - keyboards/percent/canoe/keyboard.json | 1 - keyboards/percent/canoe_gen2/keyboard.json | 1 - keyboards/percent/skog/keyboard.json | 1 - keyboards/percent/skog_lite/keyboard.json | 1 - keyboards/phase_studio/titan65/hotswap/keyboard.json | 1 - keyboards/phase_studio/titan65/soldered/keyboard.json | 1 - keyboards/phdesign/phac/keyboard.json | 1 - keyboards/phentech/rpk_001/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev1/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/left/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/right/keyboard.json | 1 - keyboards/pinky/3/keyboard.json | 1 - keyboards/pinky/4/keyboard.json | 1 - keyboards/pixelspace/capsule65i/keyboard.json | 1 - keyboards/pixelspace/shadow80/keyboard.json | 1 - keyboards/pkb65/keyboard.json | 1 - keyboards/playkbtw/ca66/keyboard.json | 1 - keyboards/playkbtw/helen80/keyboard.json | 1 - keyboards/playkbtw/pk60/keyboard.json | 1 - keyboards/playkbtw/pk64rgb/keyboard.json | 1 - keyboards/plume/plume65/keyboard.json | 1 - keyboards/plut0nium/0x3e/keyboard.json | 1 - keyboards/plywrks/ahgase/keyboard.json | 1 - keyboards/plywrks/allaro/keyboard.json | 1 - keyboards/plywrks/ji_eun/keyboard.json | 1 - keyboards/plywrks/lune/keyboard.json | 1 - keyboards/plywrks/ply8x/hotswap/keyboard.json | 1 - keyboards/plywrks/ply8x/solder/keyboard.json | 1 - keyboards/poker87c/keyboard.json | 1 - keyboards/poker87d/keyboard.json | 1 - keyboards/polilla/rev1/keyboard.json | 1 - keyboards/polycarbdiet/s20/keyboard.json | 1 - keyboards/primekb/prime_r/keyboard.json | 1 - keyboards/printedpad/keyboard.json | 1 - keyboards/program_yoink/ortho/keyboard.json | 1 - keyboards/program_yoink/staggered/keyboard.json | 1 - keyboards/projectcain/relic/keyboard.json | 1 - keyboards/projectcain/vault45/keyboard.json | 1 - keyboards/projectd/65/projectd_65_ansi/keyboard.json | 1 - keyboards/projectd/75/ansi/keyboard.json | 1 - keyboards/projectd/75/iso/keyboard.json | 1 - keyboards/projectkb/signature87/keyboard.json | 1 - keyboards/prototypist/oceanographer/keyboard.json | 1 - keyboards/prototypist/pt60/keyboard.json | 1 - keyboards/prototypist/pt80/keyboard.json | 1 - keyboards/pteron36/keyboard.json | 1 - keyboards/pteropus/keyboard.json | 1 - keyboards/puck/keyboard.json | 1 - keyboards/punk75/keyboard.json | 1 - keyboards/purin/keyboard.json | 1 - keyboards/qck75/v1/keyboard.json | 1 - keyboards/qpockets/eggman/keyboard.json | 1 - keyboards/qpockets/space_space/rev1/keyboard.json | 1 - keyboards/qpockets/space_space/rev2/keyboard.json | 1 - keyboards/qpockets/wanten/keyboard.json | 1 - keyboards/quad_h/lb75/keyboard.json | 1 - keyboards/quadrum/delta/keyboard.json | 1 - keyboards/quantrik/kyuu/keyboard.json | 1 - keyboards/qwertlekeys/calice/keyboard.json | 1 - keyboards/qwertykeys/qk65/hotswap/keyboard.json | 1 - keyboards/qwertykeys/qk65/solder/keyboard.json | 1 - keyboards/qwertyydox/rev1/keyboard.json | 1 - keyboards/rabbit/rabbit68/keyboard.json | 1 - keyboards/rainkeebs/rainkeeb/keyboard.json | 1 - keyboards/ramlord/witf/keyboard.json | 1 - keyboards/rart/rart45/keyboard.json | 1 - keyboards/rart/rart4x4/keyboard.json | 1 - keyboards/rart/rart60/keyboard.json | 1 - keyboards/rart/rart67/keyboard.json | 1 - keyboards/rart/rart67m/keyboard.json | 1 - keyboards/rart/rart75/keyboard.json | 1 - keyboards/rart/rart75hs/keyboard.json | 1 - keyboards/rart/rart75m/keyboard.json | 1 - keyboards/rart/rart80/keyboard.json | 1 - keyboards/rart/rartand/keyboard.json | 1 - keyboards/rart/rartlice/keyboard.json | 1 - keyboards/rart/rartlite/keyboard.json | 1 - keyboards/rart/rartpad/keyboard.json | 1 - keyboards/rate/pistachio/info.json | 1 - keyboards/rate/pistachio_mp/keyboard.json | 1 - keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json | 1 - keyboards/rationalist/ratio65_solder/rev_a/keyboard.json | 1 - keyboards/rect44/keyboard.json | 1 - keyboards/redox/rev1/info.json | 1 - keyboards/redox/wireless/keyboard.json | 1 - keyboards/redox_media/keyboard.json | 1 - keyboards/redscarf_i/keyboard.json | 1 - keyboards/redscarf_iiplus/verb/keyboard.json | 1 - keyboards/redscarf_iiplus/verc/keyboard.json | 1 - keyboards/redscarf_iiplus/verd/keyboard.json | 1 - keyboards/relapsekb/or87/keyboard.json | 1 - keyboards/retro_75/keyboard.json | 1 - keyboards/reversestudio/decadepad/keyboard.json | 1 - keyboards/reviung/reviung33/keyboard.json | 1 - keyboards/reviung/reviung34/keyboard.json | 1 - keyboards/reviung/reviung39/keyboard.json | 1 - keyboards/reviung/reviung41/keyboard.json | 1 - keyboards/reviung/reviung5/keyboard.json | 1 - keyboards/reviung/reviung53/keyboard.json | 1 - keyboards/reviung/reviung61/keyboard.json | 1 - keyboards/rgbkb/sol/rev1/keyboard.json | 1 - keyboards/rgbkb/sol/rev2/keyboard.json | 1 - keyboards/rgbkb/sol3/rev1/keyboard.json | 1 - keyboards/rgbkb/zen/rev1/keyboard.json | 1 - keyboards/rgbkb/zen/rev2/keyboard.json | 1 - keyboards/rmi_kb/aelith/keyboard.json | 1 - keyboards/rmi_kb/chevron/keyboard.json | 1 - keyboards/rmi_kb/equator/keyboard.json | 1 - keyboards/rmi_kb/herringbone/pro/keyboard.json | 1 - keyboards/rmi_kb/herringbone/v1/keyboard.json | 1 - keyboards/rmi_kb/mona/v1/keyboard.json | 1 - keyboards/rmi_kb/mona/v1_1/keyboard.json | 1 - keyboards/rmi_kb/mona/v32a/keyboard.json | 1 - keyboards/rmi_kb/squishy65/keyboard.json | 1 - keyboards/rmi_kb/squishyfrl/keyboard.json | 1 - keyboards/rmi_kb/squishytkl/keyboard.json | 1 - keyboards/rmi_kb/tkl_ff/info.json | 1 - keyboards/rmi_kb/wete/v1/keyboard.json | 1 - keyboards/rmi_kb/wete/v2/keyboard.json | 1 - keyboards/rmkeebs/rm_fullsize/keyboard.json | 1 - keyboards/rocketboard_16/keyboard.json | 1 - keyboards/rominronin/katana60/rev1/keyboard.json | 1 - keyboards/rot13labs/rotc0n/keyboard.json | 1 - keyboards/rpiguy9907/southpaw66/keyboard.json | 1 - keyboards/ryanbaekr/rb1/keyboard.json | 1 - keyboards/ryanbaekr/rb18/keyboard.json | 1 - keyboards/ryanbaekr/rb69/keyboard.json | 1 - keyboards/ryanbaekr/rb86/keyboard.json | 1 - keyboards/ryanbaekr/rb87/keyboard.json | 1 - keyboards/ryanskidmore/rskeys100/keyboard.json | 1 - keyboards/sakura_workshop/fuji75/info.json | 1 - keyboards/salane/ncr80alpsskfl/keyboard.json | 1 - keyboards/salane/starryfrl/keyboard.json | 1 - keyboards/salicylic_acid3/guide68/keyboard.json | 1 - keyboards/sam/s80/keyboard.json | 1 - keyboards/sam/sg81m/keyboard.json | 1 - keyboards/sanctified/dystopia/keyboard.json | 1 - keyboards/sandwich/keeb68/keyboard.json | 1 - keyboards/satt/comet46/keyboard.json | 1 - keyboards/satt/vision/keyboard.json | 1 - keyboards/sauce/mild/keyboard.json | 1 - keyboards/sawnsprojects/amber80/solder/keyboard.json | 1 - keyboards/sawnsprojects/bunnygirl65/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json | 1 - keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json | 1 - keyboards/sawnsprojects/krush/krush65/solder/keyboard.json | 1 - keyboards/sawnsprojects/okayu/info.json | 1 - keyboards/sawnsprojects/plaque80/keyboard.json | 1 - keyboards/sawnsprojects/re65/keyboard.json | 1 - keyboards/sawnsprojects/satxri6key/keyboard.json | 1 - keyboards/sawnsprojects/vcl65/solder/keyboard.json | 1 - keyboards/sck/gtm/keyboard.json | 1 - keyboards/sck/neiso/keyboard.json | 1 - keyboards/sck/osa/keyboard.json | 1 - keyboards/sentraq/s60_x/info.json | 1 - keyboards/sentraq/s65_plus/keyboard.json | 1 - keyboards/sentraq/s65_x/keyboard.json | 1 - keyboards/shambles/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/hotswap/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/soldered/keyboard.json | 1 - keyboards/shandoncodes/riot_pad/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s2/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s3/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s4/keyboard.json | 1 - keyboards/shorty/keyboard.json | 1 - keyboards/shostudio/arc/keyboard.json | 1 - keyboards/sidderskb/majbritt/rev1/keyboard.json | 1 - keyboards/sirius/uni660/rev1/keyboard.json | 1 - keyboards/sirius/uni660/rev2/ansi/keyboard.json | 1 - keyboards/sirius/uni660/rev2/iso/keyboard.json | 1 - keyboards/sixkeyboard/keyboard.json | 1 - keyboards/skeletn87/hotswap/keyboard.json | 1 - keyboards/skeletn87/soldered/keyboard.json | 1 - keyboards/skippys_custom_pcs/roopad/keyboard.json | 1 - keyboards/smallkeyboard/keyboard.json | 1 - keyboards/smithrune/iron160/iron160_h/keyboard.json | 1 - keyboards/smithrune/iron160/iron160_s/keyboard.json | 1 - keyboards/smithrune/iron165r2/info.json | 1 - keyboards/smithrune/iron180/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2h/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2s/keyboard.json | 1 - keyboards/smithrune/magnus/m75h/keyboard.json | 1 - keyboards/smithrune/magnus/m75s/keyboard.json | 1 - keyboards/smk60/keyboard.json | 1 - keyboards/snampad/keyboard.json | 1 - keyboards/snes_macropad/keyboard.json | 1 - keyboards/soda/cherish/keyboard.json | 1 - keyboards/soy20/keyboard.json | 1 - keyboards/spaceholdings/nebula12/keyboard.json | 1 - keyboards/spaceholdings/nebula12b/keyboard.json | 1 - keyboards/spaceholdings/nebula68/keyboard.json | 1 - keyboards/spaceholdings/nebula68b/info.json | 1 - keyboards/spaceman/2_milk/keyboard.json | 1 - keyboards/spaceman/pancake/rev1/info.json | 1 - keyboards/spaceman/pancake/rev2/keyboard.json | 1 - keyboards/spaceman/yun65/keyboard.json | 1 - keyboards/specskeys/keyboard.json | 1 - keyboards/spiderisland/split78/keyboard.json | 1 - keyboards/split67/keyboard.json | 1 - keyboards/splitish/keyboard.json | 1 - keyboards/stello65/beta/keyboard.json | 1 - keyboards/stello65/hs_rev1/keyboard.json | 1 - keyboards/stello65/sl_rev1/keyboard.json | 1 - keyboards/stratos/keyboard.json | 1 - keyboards/studiokestra/frl84/keyboard.json | 1 - keyboards/studiokestra/galatea/rev1/keyboard.json | 1 - keyboards/studiokestra/galatea/rev2/keyboard.json | 1 - keyboards/studiokestra/galatea/rev3/keyboard.json | 1 - keyboards/suavity/ehan/keyboard.json | 1 - keyboards/subatomic/keyboard.json | 1 - keyboards/superuser/ext/keyboard.json | 1 - keyboards/superuser/frl/keyboard.json | 1 - keyboards/superuser/tkl/keyboard.json | 1 - keyboards/swiss/keyboard.json | 1 - keyboards/switchplate/southpaw_fullsize/keyboard.json | 1 - keyboards/switchplate/switchplate910/keyboard.json | 1 - keyboards/sx60/keyboard.json | 1 - keyboards/synthandkeys/bento_box/keyboard.json | 1 - keyboards/synthandkeys/the_debit_card/keyboard.json | 1 - keyboards/tada68/keyboard.json | 1 - keyboards/takashicompany/baumkuchen/keyboard.json | 1 - keyboards/takashicompany/center_enter/keyboard.json | 1 - keyboards/takashicompany/ejectix/keyboard.json | 1 - keyboards/takashicompany/ergomirage/keyboard.json | 1 - keyboards/takashicompany/jourkey/keyboard.json | 1 - keyboards/takashicompany/klec_01/keyboard.json | 1 - keyboards/takashicompany/klec_02/keyboard.json | 1 - keyboards/takashicompany/minidivide/keyboard.json | 1 - keyboards/takashicompany/minidivide_max/keyboard.json | 1 - keyboards/takashicompany/palmslave/keyboard.json | 1 - keyboards/takashicompany/tightwriter/keyboard.json | 1 - keyboards/takashiski/otaku_split/rev0/keyboard.json | 1 - keyboards/taleguers/taleguers75/keyboard.json | 1 - keyboards/tanuki/keyboard.json | 1 - keyboards/technika/keyboard.json | 1 - keyboards/telophase/keyboard.json | 1 - keyboards/terrazzo/keyboard.json | 1 - keyboards/tetris/keyboard.json | 1 - keyboards/tg4x/keyboard.json | 1 - keyboards/tg67/keyboard.json | 1 - keyboards/tgr/910/keyboard.json | 1 - keyboards/tgr/910ce/keyboard.json | 1 - keyboards/tgr/alice/keyboard.json | 1 - keyboards/tgr/jane/v2/keyboard.json | 1 - keyboards/tgr/jane/v2ce/keyboard.json | 1 - keyboards/tgr/tris/keyboard.json | 1 - keyboards/the_royal/liminal/keyboard.json | 1 - keyboards/thevankeyboards/bananasplit/keyboard.json | 1 - keyboards/thevankeyboards/caravan/keyboard.json | 1 - keyboards/thevankeyboards/jetvan/keyboard.json | 1 - keyboards/thevankeyboards/minivan/keyboard.json | 1 - keyboards/thevankeyboards/roadkit/keyboard.json | 1 - keyboards/tkc/california/keyboard.json | 1 - keyboards/tkc/candybar/lefty/keyboard.json | 1 - keyboards/tkc/candybar/lefty_r3/keyboard.json | 1 - keyboards/tkc/candybar/righty/keyboard.json | 1 - keyboards/tkc/candybar/righty_r3/keyboard.json | 1 - keyboards/tkc/godspeed75/keyboard.json | 1 - keyboards/tkc/m0lly/keyboard.json | 1 - keyboards/tkc/osav2/keyboard.json | 1 - keyboards/tkc/portico/keyboard.json | 1 - keyboards/tkc/portico68v2/keyboard.json | 1 - keyboards/tkc/portico75/keyboard.json | 1 - keyboards/tkc/tkc1800/keyboard.json | 1 - keyboards/tkc/tkl_ab87/keyboard.json | 1 - keyboards/tmo50/keyboard.json | 1 - keyboards/toad/keyboard.json | 1 - keyboards/toffee_studio/blueberry/keyboard.json | 1 - keyboards/tominabox1/bigboy/keyboard.json | 1 - keyboards/tominabox1/le_chiffre/info.json | 1 - keyboards/tominabox1/littlefoot_lx/rev1/keyboard.json | 1 - keyboards/tominabox1/littlefoot_lx/rev2/keyboard.json | 1 - keyboards/tominabox1/qaz/keyboard.json | 1 - keyboards/tominabox1/underscore33/rev1/keyboard.json | 1 - keyboards/tominabox1/underscore33/rev2/keyboard.json | 1 - keyboards/touchpad/keyboard.json | 1 - keyboards/tr60w/keyboard.json | 1 - keyboards/trainpad/keyboard.json | 1 - keyboards/treasure/type9/keyboard.json | 1 - keyboards/treasure/type9s3/keyboard.json | 1 - keyboards/trnthsn/e8ghty/info.json | 1 - keyboards/trnthsn/e8ghtyneo/info.json | 1 - keyboards/trnthsn/s6xty/keyboard.json | 1 - keyboards/trnthsn/s6xty5neor2/info.json | 1 - keyboards/ubest/vn/keyboard.json | 1 - keyboards/uk78/keyboard.json | 1 - keyboards/unikeyboard/diverge3/keyboard.json | 1 - keyboards/unikeyboard/divergetm2/keyboard.json | 1 - keyboards/unikeyboard/felix/keyboard.json | 1 - keyboards/unikorn/keyboard.json | 1 - keyboards/uranuma/keyboard.json | 1 - keyboards/utd80/keyboard.json | 1 - keyboards/v60_type_r/keyboard.json | 1 - keyboards/vertex/angle65/keyboard.json | 1 - keyboards/vertex/arc60/keyboard.json | 1 - keyboards/vertex/arc60h/keyboard.json | 1 - keyboards/vertex/cycle8/keyboard.json | 1 - keyboards/viktus/omnikey_bh/keyboard.json | 1 - keyboards/viktus/smolka/keyboard.json | 1 - keyboards/viktus/sp_mini/keyboard.json | 1 - keyboards/viktus/vkr94/keyboard.json | 1 - keyboards/viktus/z150_bh/keyboard.json | 1 - keyboards/vinhcatba/uncertainty/keyboard.json | 1 - keyboards/vitamins_included/info.json | 1 - keyboards/void/voidhhkb_hotswap/keyboard.json | 1 - keyboards/waterfowl/keyboard.json | 1 - keyboards/wavtype/foundation/keyboard.json | 1 - keyboards/wavtype/p01_ultra/keyboard.json | 1 - keyboards/weirdo/geminate60/keyboard.json | 1 - keyboards/weirdo/kelowna/rgb64/keyboard.json | 1 - keyboards/weirdo/ls_60/keyboard.json | 1 - keyboards/weirdo/naiping/np64/keyboard.json | 1 - keyboards/weirdo/naiping/nphhkb/keyboard.json | 1 - keyboards/weirdo/naiping/npminila/keyboard.json | 1 - keyboards/weirdo/tiger910/keyboard.json | 1 - keyboards/wekey/polaris/keyboard.json | 1 - keyboards/wekey/we27/keyboard.json | 1 - keyboards/westfoxtrot/aanzee/keyboard.json | 1 - keyboards/westfoxtrot/cyclops/keyboard.json | 1 - keyboards/westfoxtrot/prophet/keyboard.json | 1 - keyboards/windstudio/wind_x/r1/keyboard.json | 1 - keyboards/winkeyless/b87/keyboard.json | 1 - keyboards/winkeyless/bface/keyboard.json | 1 - keyboards/winkeyless/bmini/keyboard.json | 1 - keyboards/winry/winry25tc/keyboard.json | 1 - keyboards/winry/winry315/keyboard.json | 1 - keyboards/wolf/kuku65/keyboard.json | 1 - keyboards/wolf/m60_b/keyboard.json | 1 - keyboards/wolf/m6_c/keyboard.json | 1 - keyboards/wolf/neely65/keyboard.json | 1 - keyboards/wolf/ryujin/keyboard.json | 1 - keyboards/wolf/sabre/keyboard.json | 1 - keyboards/wolf/silhouette/keyboard.json | 1 - keyboards/wolf/twilight/keyboard.json | 1 - keyboards/wolf/ziggurat/keyboard.json | 1 - keyboards/wolfmarkclub/wm1/keyboard.json | 1 - keyboards/woodkeys/bigseries/1key/keyboard.json | 1 - keyboards/woodkeys/bigseries/2key/keyboard.json | 1 - keyboards/woodkeys/bigseries/3key/keyboard.json | 1 - keyboards/woodkeys/bigseries/4key/keyboard.json | 1 - keyboards/woodkeys/meira/info.json | 1 - keyboards/woodkeys/scarletbandana/keyboard.json | 1 - keyboards/wsk/alpha9/keyboard.json | 1 - keyboards/wsk/g4m3ralpha/keyboard.json | 1 - keyboards/x16/keyboard.json | 1 - keyboards/xbows/knight/keyboard.json | 1 - keyboards/xbows/knight_plus/keyboard.json | 1 - keyboards/xbows/nature/keyboard.json | 1 - keyboards/xbows/numpad/keyboard.json | 1 - keyboards/xbows/ranger/keyboard.json | 1 - keyboards/xbows/woody/keyboard.json | 1 - keyboards/xelus/dawn60/info.json | 1 - keyboards/xelus/dharma/keyboard.json | 1 - keyboards/xelus/la_plus/keyboard.json | 1 - keyboards/xelus/ninjin/keyboard.json | 1 - keyboards/xelus/pachi/mini_32u4/keyboard.json | 1 - keyboards/xelus/pachi/rev1/keyboard.json | 1 - keyboards/xelus/pachi/rgb/rev1/keyboard.json | 1 - keyboards/xelus/pachi/rgb/rev2/keyboard.json | 1 - keyboards/xelus/rs108/keyboard.json | 1 - keyboards/xelus/rs60/info.json | 1 - keyboards/xelus/snap96/keyboard.json | 1 - keyboards/xelus/trinityxttkl/keyboard.json | 1 - keyboards/xelus/valor/rev1/keyboard.json | 1 - keyboards/xelus/valor/rev2/keyboard.json | 1 - keyboards/xelus/valor/rev3/keyboard.json | 1 - keyboards/xelus/valor_frl_tkl/info.json | 1 - keyboards/xelus/xs108/keyboard.json | 1 - keyboards/xelus/xs60/hotswap/keyboard.json | 1 - keyboards/xelus/xs60/soldered/keyboard.json | 1 - keyboards/xiaomi/mk02/keyboard.json | 1 - keyboards/xiudi/xd68/keyboard.json | 1 - keyboards/xiudi/xd75/keyboard.json | 1 - keyboards/xiudi/xd84/keyboard.json | 1 - keyboards/xiudi/xd84pro/keyboard.json | 1 - keyboards/xiudi/xd96/keyboard.json | 1 - keyboards/xmmx/keyboard.json | 1 - keyboards/xw60/keyboard.json | 1 - keyboards/yampad/keyboard.json | 1 - keyboards/ydkb/chili/keyboard.json | 1 - keyboards/ydkb/just60/keyboard.json | 1 - keyboards/ydkb/yd68/keyboard.json | 1 - keyboards/ydkb/ydpm40/keyboard.json | 1 - keyboards/ymdk/bface/keyboard.json | 1 - keyboards/ymdk/melody96/hotswap/keyboard.json | 1 - keyboards/ymdk/melody96/soldered/keyboard.json | 1 - keyboards/ymdk/sp64/keyboard.json | 1 - keyboards/ymdk/yd60mq/info.json | 1 - keyboards/ymdk/ym68/keyboard.json | 1 - keyboards/ymdk/ymd21/v2/keyboard.json | 1 - keyboards/ymdk/ymd40/air40/keyboard.json | 1 - keyboards/ymdk/ymd40/v2/keyboard.json | 1 - keyboards/ymdk/ymd75/rev1/keyboard.json | 1 - keyboards/ymdk/ymd75/rev2/keyboard.json | 1 - keyboards/ymdk/ymd75/rev3/keyboard.json | 1 - keyboards/ymdk/ymd75/rev4/iso/keyboard.json | 1 - keyboards/ymdk/ymd96/keyboard.json | 1 - keyboards/yncognito/batpad/keyboard.json | 1 - keyboards/yoichiro/lunakey_macro/keyboard.json | 1 - keyboards/yoichiro/lunakey_mini/keyboard.json | 1 - keyboards/yushakobo/ergo68/keyboard.json | 1 - keyboards/yushakobo/navpad/10_helix_r/keyboard.json | 1 - keyboards/yushakobo/quick7/keyboard.json | 1 - keyboards/ziggurat/keyboard.json | 1 - keyboards/zlant/keyboard.json | 1 - keyboards/zvecr/split_blackpill/keyboard.json | 1 - keyboards/zvecr/zv48/info.json | 1 - keyboards/zwag/zwag75/keyboard.json | 1 - 1389 files changed, 1 insertion(+), 1390 deletions(-) diff --git a/keyboards/0_sixty/info.json b/keyboards/0_sixty/info.json index ce76f808b2..ebe4d39625 100644 --- a/keyboards/0_sixty/info.json +++ b/keyboards/0_sixty/info.json @@ -1,6 +1,5 @@ { "manufacturer": "ven0mtr0n", - "url": "", "maintainer": "vinamarora8", "usb": { "vid": "0x7654", diff --git a/keyboards/0xc7/61key/keyboard.json b/keyboards/0xc7/61key/keyboard.json index ab5127db38..6b1e2e809e 100644 --- a/keyboards/0xc7/61key/keyboard.json +++ b/keyboards/0xc7/61key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "61Key", "manufacturer": "0xC7", - "url": "", "maintainer": "RealEmanGaming", "usb": { "vid": "0xE117", diff --git a/keyboards/0xcb/tutelpad/keyboard.json b/keyboards/0xcb/tutelpad/keyboard.json index 2885377262..2367e6ce2e 100644 --- a/keyboards/0xcb/tutelpad/keyboard.json +++ b/keyboards/0xcb/tutelpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TutelPad", "manufacturer": "ItsFiremanSam", - "url": "", "maintainer": "ItsFiremanSam", "usb": { "vid": "0xCB00", diff --git a/keyboards/1k/keyboard.json b/keyboards/1k/keyboard.json index 440856d0bd..269f11782a 100644 --- a/keyboards/1k/keyboard.json +++ b/keyboards/1k/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "1K", "manufacturer": "MakotoKurauchi", - "url": "", "maintainer": "MakotoKurauchi", "usb": { "vid": "0x0009", diff --git a/keyboards/1upkeyboards/1up60hse/keyboard.json b/keyboards/1upkeyboards/1up60hse/keyboard.json index 990b51c1f8..9f1d0c0ff4 100644 --- a/keyboards/1upkeyboards/1up60hse/keyboard.json +++ b/keyboards/1upkeyboards/1up60hse/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "1up60hse", "manufacturer": "1upkeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6F75", diff --git a/keyboards/1upkeyboards/1up60rgb/keyboard.json b/keyboards/1upkeyboards/1up60rgb/keyboard.json index f4ba111251..5b0d9ef5d4 100644 --- a/keyboards/1upkeyboards/1up60rgb/keyboard.json +++ b/keyboards/1upkeyboards/1up60rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "1UP RGB Underglow PCB", "manufacturer": "1upkeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6F75", diff --git a/keyboards/1upkeyboards/super16/keyboard.json b/keyboards/1upkeyboards/super16/keyboard.json index 9da4168d47..f43d5d7037 100644 --- a/keyboards/1upkeyboards/super16/keyboard.json +++ b/keyboards/1upkeyboards/super16/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "super16", "manufacturer": "1upkeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6F75", diff --git a/keyboards/1upkeyboards/super16v2/keyboard.json b/keyboards/1upkeyboards/super16v2/keyboard.json index 652b03006e..2e423d7d5a 100644 --- a/keyboards/1upkeyboards/super16v2/keyboard.json +++ b/keyboards/1upkeyboards/super16v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "super16v2", "manufacturer": "1upkeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6F75", diff --git a/keyboards/1upkeyboards/sweet16/info.json b/keyboards/1upkeyboards/sweet16/info.json index 5fb70bb8e9..65ce40a658 100644 --- a/keyboards/1upkeyboards/sweet16/info.json +++ b/keyboards/1upkeyboards/sweet16/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sweet16", "manufacturer": "1up Keyboards", - "url": "", "maintainer": "skullydazed", "features": { "bootmagic": false, diff --git a/keyboards/1upkeyboards/sweet16/v1/keyboard.json b/keyboards/1upkeyboards/sweet16/v1/keyboard.json index 3ac73ce8eb..161ca65950 100644 --- a/keyboards/1upkeyboards/sweet16/v1/keyboard.json +++ b/keyboards/1upkeyboards/sweet16/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sweet16", "manufacturer": "1up Keyboards", - "url": "", "maintainer": "skullydazed", "usb": { "vid": "0x6F75", diff --git a/keyboards/2key2crawl/keyboard.json b/keyboards/2key2crawl/keyboard.json index fec55c811a..252f619e34 100644 --- a/keyboards/2key2crawl/keyboard.json +++ b/keyboards/2key2crawl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "2Key2Crawl", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/30wer/keyboard.json b/keyboards/30wer/keyboard.json index 606c13f7aa..7c0326125c 100644 --- a/keyboards/30wer/keyboard.json +++ b/keyboards/30wer/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "30wer", "manufacturer": "8o7wer", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1234", diff --git a/keyboards/40percentclub/25/keyboard.json b/keyboards/40percentclub/25/keyboard.json index e23d0578c3..ceaff11454 100644 --- a/keyboards/40percentclub/25/keyboard.json +++ b/keyboards/40percentclub/25/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The 5x5 Keyboard", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/4pack/keyboard.json b/keyboards/40percentclub/4pack/keyboard.json index a114e97dbb..6be4ab5e8a 100644 --- a/keyboards/40percentclub/4pack/keyboard.json +++ b/keyboards/40percentclub/4pack/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "4pack", "manufacturer": "40percentclub", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/4x4/keyboard.json b/keyboards/40percentclub/4x4/keyboard.json index 735a3865da..cd5e0f4c0c 100644 --- a/keyboards/40percentclub/4x4/keyboard.json +++ b/keyboards/40percentclub/4x4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The 4x4 Keyboard", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/5x5/keyboard.json b/keyboards/40percentclub/5x5/keyboard.json index 039d9fe47b..1a76644489 100644 --- a/keyboards/40percentclub/5x5/keyboard.json +++ b/keyboards/40percentclub/5x5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The 5x5 Keyboard", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/6lit/keyboard.json b/keyboards/40percentclub/6lit/keyboard.json index 52a8914d7d..96644a7a44 100644 --- a/keyboards/40percentclub/6lit/keyboard.json +++ b/keyboards/40percentclub/6lit/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The 6lit Macropad", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/foobar/keyboard.json b/keyboards/40percentclub/foobar/keyboard.json index ec568b2382..c0a77c4e9a 100644 --- a/keyboards/40percentclub/foobar/keyboard.json +++ b/keyboards/40percentclub/foobar/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The foobar Keyboard", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/gherkin/info.json b/keyboards/40percentclub/gherkin/info.json index 0c9f609cdc..644001bc05 100644 --- a/keyboards/40percentclub/gherkin/info.json +++ b/keyboards/40percentclub/gherkin/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Gherkin", "manufacturer": "40 Percent Club", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/half_n_half/keyboard.json b/keyboards/40percentclub/half_n_half/keyboard.json index 4f18d235b2..21ca55f162 100644 --- a/keyboards/40percentclub/half_n_half/keyboard.json +++ b/keyboards/40percentclub/half_n_half/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "half_n_half", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/i75/info.json b/keyboards/40percentclub/i75/info.json index a7124adec2..197667cba5 100644 --- a/keyboards/40percentclub/i75/info.json +++ b/keyboards/40percentclub/i75/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "i75", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/luddite/keyboard.json b/keyboards/40percentclub/luddite/keyboard.json index a9f79d7369..774aed72db 100644 --- a/keyboards/40percentclub/luddite/keyboard.json +++ b/keyboards/40percentclub/luddite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Luddite", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/mf68/keyboard.json b/keyboards/40percentclub/mf68/keyboard.json index 45585d5e47..161c4345af 100644 --- a/keyboards/40percentclub/mf68/keyboard.json +++ b/keyboards/40percentclub/mf68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MF68", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/nano/keyboard.json b/keyboards/40percentclub/nano/keyboard.json index 547aed16f9..39aa46098f 100644 --- a/keyboards/40percentclub/nano/keyboard.json +++ b/keyboards/40percentclub/nano/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Nano", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/nori/keyboard.json b/keyboards/40percentclub/nori/keyboard.json index 968e74e19e..feb66f9501 100644 --- a/keyboards/40percentclub/nori/keyboard.json +++ b/keyboards/40percentclub/nori/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The nori Keyboard", "manufacturer": "di0ib", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/polyandry/info.json b/keyboards/40percentclub/polyandry/info.json index 49b8bedbe3..25e560f780 100644 --- a/keyboards/40percentclub/polyandry/info.json +++ b/keyboards/40percentclub/polyandry/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Polypad", "manufacturer": "di0ib", - "url": "", "maintainer": "QMK", "features": { "bootmagic": true, diff --git a/keyboards/40percentclub/tomato/keyboard.json b/keyboards/40percentclub/tomato/keyboard.json index c0b526cbc6..ecc7b19570 100644 --- a/keyboards/40percentclub/tomato/keyboard.json +++ b/keyboards/40percentclub/tomato/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tomato", "manufacturer": "40 Percent Club", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/40percentclub/ut47/keyboard.json b/keyboards/40percentclub/ut47/keyboard.json index 62e4a940a1..00c8edef69 100644 --- a/keyboards/40percentclub/ut47/keyboard.json +++ b/keyboards/40percentclub/ut47/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ut47", "manufacturer": "40percent.club", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4025", diff --git a/keyboards/45_ats/keyboard.json b/keyboards/45_ats/keyboard.json index 5e5465f264..17ef036999 100644 --- a/keyboards/45_ats/keyboard.json +++ b/keyboards/45_ats/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "45ATS", "manufacturer": "Abec13", - "url": "", "maintainer": "The-Royal", "usb": { "vid": "0xAB13", diff --git a/keyboards/4pplet/aekiso60/info.json b/keyboards/4pplet/aekiso60/info.json index 80d5ab233d..50dd5e55df 100644 --- a/keyboards/4pplet/aekiso60/info.json +++ b/keyboards/4pplet/aekiso60/info.json @@ -1,6 +1,5 @@ { "manufacturer": "4pplet", - "url": "", "maintainer": "4pplet", "usb": { "vid": "0x4444" diff --git a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json index 56e7a25de4..50babdab71 100644 --- a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json +++ b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Perk60 ISO Rev A", "manufacturer": "4pplet", - "url": "", "maintainer": "4pplet", "usb": { "vid": "0x4444", diff --git a/keyboards/4pplet/waffling80/info.json b/keyboards/4pplet/waffling80/info.json index 72fcd4615b..c003b16fed 100644 --- a/keyboards/4pplet/waffling80/info.json +++ b/keyboards/4pplet/waffling80/info.json @@ -1,6 +1,5 @@ { "manufacturer": "4pplet", - "url": "", "maintainer": "4pplet", "usb": { "vid": "0x4444" diff --git a/keyboards/5keys/keyboard.json b/keyboards/5keys/keyboard.json index 7a40d1014d..7282db2922 100644 --- a/keyboards/5keys/keyboard.json +++ b/keyboards/5keys/keyboard.json @@ -14,7 +14,6 @@ ["F4","F5","F6","F7","B1"] ] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/7c8/framework/keyboard.json b/keyboards/7c8/framework/keyboard.json index 33f9cfc591..a6ebdfbfc6 100644 --- a/keyboards/7c8/framework/keyboard.json +++ b/keyboards/7c8/framework/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Framework", "manufacturer": "7c8", - "url": "", "maintainer": "stevennguyen", "usb": { "vid": "0x77C8", diff --git a/keyboards/9key/keyboard.json b/keyboards/9key/keyboard.json index c1e95e3f08..f63fdf3607 100644 --- a/keyboards/9key/keyboard.json +++ b/keyboards/9key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "9Key", "manufacturer": "Bishop Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/abatskeyboardclub/nayeon/keyboard.json b/keyboards/abatskeyboardclub/nayeon/keyboard.json index a3fac207f4..4949b17072 100644 --- a/keyboards/abatskeyboardclub/nayeon/keyboard.json +++ b/keyboards/abatskeyboardclub/nayeon/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Nayeon", "manufacturer": "Abats Keyboard Club", - "url": "", "maintainer": "ramonimbao", "layout_aliases": { "LAYOUT_ansi": "LAYOUT_tkl_f13_ansi_tsangan", diff --git a/keyboards/acheron/apollo/87h/info.json b/keyboards/acheron/apollo/87h/info.json index ac47f594b5..41606da15f 100644 --- a/keyboards/acheron/apollo/87h/info.json +++ b/keyboards/acheron/apollo/87h/info.json @@ -1,6 +1,5 @@ { "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4150" diff --git a/keyboards/acheron/apollo/87htsc/keyboard.json b/keyboards/acheron/apollo/87htsc/keyboard.json index 55229706b1..e40f18da92 100644 --- a/keyboards/acheron/apollo/87htsc/keyboard.json +++ b/keyboards/acheron/apollo/87htsc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Apollo87H-T-SC", "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4150", diff --git a/keyboards/acheron/apollo/88htsc/keyboard.json b/keyboards/acheron/apollo/88htsc/keyboard.json index 9b9482874f..02831f8c62 100644 --- a/keyboards/acheron/apollo/88htsc/keyboard.json +++ b/keyboards/acheron/apollo/88htsc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Apollo88H-T-SC", "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4150", diff --git a/keyboards/acheron/athena/info.json b/keyboards/acheron/athena/info.json index 4f9d3b61e6..e10cb288f0 100644 --- a/keyboards/acheron/athena/info.json +++ b/keyboards/acheron/athena/info.json @@ -1,6 +1,5 @@ { "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0xAC11" diff --git a/keyboards/acheron/austin/keyboard.json b/keyboards/acheron/austin/keyboard.json index a3df5dd75d..140e398cce 100755 --- a/keyboards/acheron/austin/keyboard.json +++ b/keyboards/acheron/austin/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Austin", "manufacturer": "DriftMechanics", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xAC11", diff --git a/keyboards/acheron/lasgweloth/keyboard.json b/keyboards/acheron/lasgweloth/keyboard.json index 35d30e89b2..85769d0732 100644 --- a/keyboards/acheron/lasgweloth/keyboard.json +++ b/keyboards/acheron/lasgweloth/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lasgweloth", "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4150", diff --git a/keyboards/acheron/themis/info.json b/keyboards/acheron/themis/info.json index 4f9d3b61e6..e10cb288f0 100644 --- a/keyboards/acheron/themis/info.json +++ b/keyboards/acheron/themis/info.json @@ -1,6 +1,5 @@ { "manufacturer": "AcheronProject", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0xAC11" diff --git a/keyboards/ada/ada1800mini/keyboard.json b/keyboards/ada/ada1800mini/keyboard.json index 80e8ee64aa..37c0be1582 100644 --- a/keyboards/ada/ada1800mini/keyboard.json +++ b/keyboards/ada/ada1800mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ada1800mini", "manufacturer": "Ada", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xADA0", diff --git a/keyboards/ada/infinity81/keyboard.json b/keyboards/ada/infinity81/keyboard.json index 40c5bd2f18..f1f928697b 100644 --- a/keyboards/ada/infinity81/keyboard.json +++ b/keyboards/ada/infinity81/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "infinity81", "manufacturer": "Ada", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xADA0", diff --git a/keyboards/adkb96/rev1/keyboard.json b/keyboards/adkb96/rev1/keyboard.json index 7cf92f1516..5def3c9da3 100644 --- a/keyboards/adkb96/rev1/keyboard.json +++ b/keyboards/adkb96/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ADKB96", "manufacturer": "Bit Trade One", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00A5", diff --git a/keyboards/aeboards/aegis/keyboard.json b/keyboards/aeboards/aegis/keyboard.json index 26f5f2a0c1..63705b7043 100644 --- a/keyboards/aeboards/aegis/keyboard.json +++ b/keyboards/aeboards/aegis/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Aegis", "manufacturer": "AEboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4145", diff --git a/keyboards/aeboards/constellation/rev1/keyboard.json b/keyboards/aeboards/constellation/rev1/keyboard.json index 5a43568d57..4c21a8f3b9 100644 --- a/keyboards/aeboards/constellation/rev1/keyboard.json +++ b/keyboards/aeboards/constellation/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Constellation Rev1", "manufacturer": "AEBoards", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x4145", diff --git a/keyboards/aeboards/constellation/rev2/keyboard.json b/keyboards/aeboards/constellation/rev2/keyboard.json index f296b523e0..e4add7a63a 100644 --- a/keyboards/aeboards/constellation/rev2/keyboard.json +++ b/keyboards/aeboards/constellation/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Constellation Rev2", "manufacturer": "AEBoards", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x4145", diff --git a/keyboards/aeboards/constellation/rev3/keyboard.json b/keyboards/aeboards/constellation/rev3/keyboard.json index ab39641b74..306561409c 100644 --- a/keyboards/aeboards/constellation/rev3/keyboard.json +++ b/keyboards/aeboards/constellation/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Constellation Rev3", "manufacturer": "AEBoards", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x4145", diff --git a/keyboards/aeboards/ext65/info.json b/keyboards/aeboards/ext65/info.json index 3f4b0bbc00..e4c57bd144 100644 --- a/keyboards/aeboards/ext65/info.json +++ b/keyboards/aeboards/ext65/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ext65", "manufacturer": "AEBoards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4145" diff --git a/keyboards/aeboards/ext65/rev1/keyboard.json b/keyboards/aeboards/ext65/rev1/keyboard.json index 1d105505e5..80370f6045 100644 --- a/keyboards/aeboards/ext65/rev1/keyboard.json +++ b/keyboards/aeboards/ext65/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ext65 Rev1", "manufacturer": "AEBoards", - "url": "", "maintainer": "qmk", "usb": { "pid": "0xAE65", diff --git a/keyboards/aeboards/ext65/rev2/keyboard.json b/keyboards/aeboards/ext65/rev2/keyboard.json index ab7cceeefb..ca2777d36c 100644 --- a/keyboards/aeboards/ext65/rev2/keyboard.json +++ b/keyboards/aeboards/ext65/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ext65 Rev2", "manufacturer": "AEBoards", - "url": "", "maintainer": "qmk", "usb": { "pid": "0xA652", diff --git a/keyboards/aeboards/ext65/rev3/keyboard.json b/keyboards/aeboards/ext65/rev3/keyboard.json index 8c8051fc44..867e46e519 100644 --- a/keyboards/aeboards/ext65/rev3/keyboard.json +++ b/keyboards/aeboards/ext65/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ext65 Rev3", "manufacturer": "AEBoards", - "url": "", "maintainer": "qmk", "usb": { "pid": "0xA653", diff --git a/keyboards/aeboards/satellite/rev1/keyboard.json b/keyboards/aeboards/satellite/rev1/keyboard.json index 8b90704efa..f9355171fb 100644 --- a/keyboards/aeboards/satellite/rev1/keyboard.json +++ b/keyboards/aeboards/satellite/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Satellite Rev1", "manufacturer": "AEBoards", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x4145", diff --git a/keyboards/ah/haven80/info.json b/keyboards/ah/haven80/info.json index bd87815154..1a8c33890a 100644 --- a/keyboards/ah/haven80/info.json +++ b/keyboards/ah/haven80/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Atelier_Haven", - "url": "", "maintainer": "Freather", "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/ai/keyboard.json b/keyboards/ai/keyboard.json index 8f4039b4d2..d25459b507 100644 --- a/keyboards/ai/keyboard.json +++ b/keyboards/ai/keyboard.json @@ -17,7 +17,6 @@ "rows": ["D0", "D4", "C6", "D7", "D1"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/ai03/andromeda/keyboard.json b/keyboards/ai03/andromeda/keyboard.json index d085b91ad1..0ad082436a 100644 --- a/keyboards/ai03/andromeda/keyboard.json +++ b/keyboards/ai03/andromeda/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Andromeda", "manufacturer": "ai03 Design Studio", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/ai03/equinox/info.json b/keyboards/ai03/equinox/info.json index 7c2cc46500..a6c424e187 100644 --- a/keyboards/ai03/equinox/info.json +++ b/keyboards/ai03/equinox/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Equinox", "manufacturer": "ai03 Design Studio", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/ai03/orbit_x/keyboard.json b/keyboards/ai03/orbit_x/keyboard.json index d039969b37..859ff47085 100644 --- a/keyboards/ai03/orbit_x/keyboard.json +++ b/keyboards/ai03/orbit_x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OrbitX", "manufacturer": "ai03 Design Studio", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/al1/keyboard.json b/keyboards/al1/keyboard.json index 7e6440560f..aed02e8ade 100644 --- a/keyboards/al1/keyboard.json +++ b/keyboards/al1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AL1", "manufacturer": "Alsoran", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x544C", diff --git a/keyboards/alf/x11/keyboard.json b/keyboards/alf/x11/keyboard.json index c571705dc1..0396093435 100644 --- a/keyboards/alf/x11/keyboard.json +++ b/keyboards/alf/x11/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "X1.1", "manufacturer": "ALF", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4146", diff --git a/keyboards/alf/x2/keyboard.json b/keyboards/alf/x2/keyboard.json index 9dd011c7f1..ec3eae179a 100644 --- a/keyboards/alf/x2/keyboard.json +++ b/keyboards/alf/x2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "X2", "manufacturer": "ALF", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/alhenkb/macropad5x4/keyboard.json b/keyboards/alhenkb/macropad5x4/keyboard.json index 1fb472255d..7415068b2c 100644 --- a/keyboards/alhenkb/macropad5x4/keyboard.json +++ b/keyboards/alhenkb/macropad5x4/keyboard.json @@ -16,7 +16,6 @@ "rows": ["F5", "F7", "B3", "B6", "B5"], "cols": ["F4", "F6", "B1", "B2"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/alpine65/keyboard.json b/keyboards/alpine65/keyboard.json index 36bba880a8..ae372d2a08 100644 --- a/keyboards/alpine65/keyboard.json +++ b/keyboards/alpine65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alpine65", "manufacturer": "Bitmap Designs", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x6680", diff --git a/keyboards/alps64/keyboard.json b/keyboards/alps64/keyboard.json index a6a60478f8..d8f5fb22b5 100644 --- a/keyboards/alps64/keyboard.json +++ b/keyboards/alps64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alps64", "manufacturer": "Hasu", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6873", diff --git a/keyboards/amjkeyboard/amj40/keyboard.json b/keyboards/amjkeyboard/amj40/keyboard.json index de536cb55e..c3bbe72039 100644 --- a/keyboards/amjkeyboard/amj40/keyboard.json +++ b/keyboards/amjkeyboard/amj40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AMJ40", "manufacturer": "Han Chen", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00D8", diff --git a/keyboards/amjkeyboard/amj60/keyboard.json b/keyboards/amjkeyboard/amj60/keyboard.json index a2cfd1b6e1..f16d178b06 100644 --- a/keyboards/amjkeyboard/amj60/keyboard.json +++ b/keyboards/amjkeyboard/amj60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AMJ60", "manufacturer": "Han Chen", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00D8", diff --git a/keyboards/amjkeyboard/amj66/keyboard.json b/keyboards/amjkeyboard/amj66/keyboard.json index 72646e4fc7..f674452f32 100644 --- a/keyboards/amjkeyboard/amj66/keyboard.json +++ b/keyboards/amjkeyboard/amj66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AMJ66", "manufacturer": "AMJKeyboard", - "url": "", "maintainer": "FSund, qmk", "usb": { "vid": "0x00D8", diff --git a/keyboards/amjkeyboard/amj84/keyboard.json b/keyboards/amjkeyboard/amj84/keyboard.json index b544ffc8b3..d5f1f11a4d 100644 --- a/keyboards/amjkeyboard/amj84/keyboard.json +++ b/keyboards/amjkeyboard/amj84/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AMJ84", "manufacturer": "Han Chen", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x00D8", diff --git a/keyboards/amjkeyboard/amj96/keyboard.json b/keyboards/amjkeyboard/amj96/keyboard.json index 23a131c615..ea02e6170c 100644 --- a/keyboards/amjkeyboard/amj96/keyboard.json +++ b/keyboards/amjkeyboard/amj96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AMJ96", "manufacturer": "Han Chen", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00D8", diff --git a/keyboards/amjkeyboard/amjpad/keyboard.json b/keyboards/amjkeyboard/amjpad/keyboard.json index e331f3af19..3fa60ed3d7 100644 --- a/keyboards/amjkeyboard/amjpad/keyboard.json +++ b/keyboards/amjkeyboard/amjpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "PAD", "manufacturer": "AMJ", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00D8", diff --git a/keyboards/anavi/macropad8/keyboard.json b/keyboards/anavi/macropad8/keyboard.json index 50381ce8a8..27d34c18f3 100644 --- a/keyboards/anavi/macropad8/keyboard.json +++ b/keyboards/anavi/macropad8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Macro Pad 8", "manufacturer": "ANAVI", - "url": "", "maintainer": "leon-anavi", "usb": { "vid": "0xCEEB", diff --git a/keyboards/aplyard/aplx6/info.json b/keyboards/aplyard/aplx6/info.json index 9f86182a33..a0624a7d49 100644 --- a/keyboards/aplyard/aplx6/info.json +++ b/keyboards/aplyard/aplx6/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Aplx6", "manufacturer": "Aplyard", - "url": "", "maintainer": "Aplyard", "usb": { "vid": "0xE0E0" diff --git a/keyboards/arabica37/rev1/keyboard.json b/keyboards/arabica37/rev1/keyboard.json index 63c4fe2940..d1db9a276c 100644 --- a/keyboards/arabica37/rev1/keyboard.json +++ b/keyboards/arabica37/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Arabica3/7", "manufacturer": "CalciumNitride", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/archetype/minervalx/keyboard.json b/keyboards/archetype/minervalx/keyboard.json index 0d01ccf485..3523e95afb 100644 --- a/keyboards/archetype/minervalx/keyboard.json +++ b/keyboards/archetype/minervalx/keyboard.json @@ -18,7 +18,6 @@ "rows": ["GP11", "GP12", "GP13", "GP14", "GP15"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0100", diff --git a/keyboards/ares/keyboard.json b/keyboards/ares/keyboard.json index f1e650397e..b6e5544511 100644 --- a/keyboards/ares/keyboard.json +++ b/keyboards/ares/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ares", "manufacturer": "LSJ", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/artemis/paragon/info.json b/keyboards/artemis/paragon/info.json index 63fefe8c55..93c547faa9 100644 --- a/keyboards/artemis/paragon/info.json +++ b/keyboards/artemis/paragon/info.json @@ -17,7 +17,6 @@ "lto": true }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3449", diff --git a/keyboards/at_at/660m/keyboard.json b/keyboards/at_at/660m/keyboard.json index a9c5af73f8..f42c0b7cbb 100644 --- a/keyboards/at_at/660m/keyboard.json +++ b/keyboards/at_at/660m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "660M", "manufacturer": "AT-AT", - "url": "", "maintainer": "adrientetar", "usb": { "vid": "0xA22A", diff --git a/keyboards/atreus/info.json b/keyboards/atreus/info.json index 1a33591ab5..cf53b506a0 100644 --- a/keyboards/atreus/info.json +++ b/keyboards/atreus/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atreus", "manufacturer": "Technomancy", - "url": "", "maintainer": "qmk", "features": { "bootmagic": false, diff --git a/keyboards/atreus62/keyboard.json b/keyboards/atreus62/keyboard.json index c24c02e71e..5fb786fa98 100644 --- a/keyboards/atreus62/keyboard.json +++ b/keyboards/atreus62/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atreus62", "manufacturer": "Profet", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5072", diff --git a/keyboards/aves65/keyboard.json b/keyboards/aves65/keyboard.json index 3ad686f83a..9d8a70b78c 100644 --- a/keyboards/aves65/keyboard.json +++ b/keyboards/aves65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Aves65", "manufacturer": "I/O Keyboards", - "url": "", "maintainer": "Hund", "usb": { "vid": "0x9991", diff --git a/keyboards/axolstudio/helpo/keyboard.json b/keyboards/axolstudio/helpo/keyboard.json index c90c967788..4af362c596 100644 --- a/keyboards/axolstudio/helpo/keyboard.json +++ b/keyboards/axolstudio/helpo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Helpo", "manufacturer": "Axolstudio", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x525C", diff --git a/keyboards/baguette/keyboard.json b/keyboards/baguette/keyboard.json index 001757f861..1d86c43ad9 100644 --- a/keyboards/baguette/keyboard.json +++ b/keyboards/baguette/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Baguette", "manufacturer": "Yiancar", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bahm/aster_ergo/keyboard.json b/keyboards/bahm/aster_ergo/keyboard.json index 5545e02409..963764d497 100644 --- a/keyboards/bahm/aster_ergo/keyboard.json +++ b/keyboards/bahm/aster_ergo/keyboard.json @@ -17,7 +17,6 @@ "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B1", "B0", "A7", "A6", "B4", "B3", "A15", "A5", "A2", "A1"], "rows": ["B7", "B6", "B5", "B11", "B10", "A4"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x8701", diff --git a/keyboards/balloondogcaps/tr90/keyboard.json b/keyboards/balloondogcaps/tr90/keyboard.json index 42071ba3f0..957953fd69 100644 --- a/keyboards/balloondogcaps/tr90/keyboard.json +++ b/keyboards/balloondogcaps/tr90/keyboard.json @@ -17,7 +17,6 @@ "rows": ["F0", "F1", "F4"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/balloondogcaps/tr90pm/keyboard.json b/keyboards/balloondogcaps/tr90pm/keyboard.json index c5badb7836..e095c1eda1 100644 --- a/keyboards/balloondogcaps/tr90pm/keyboard.json +++ b/keyboards/balloondogcaps/tr90pm/keyboard.json @@ -17,7 +17,6 @@ "rows": ["C6", "D7", "E6"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/bantam44/keyboard.json b/keyboards/bantam44/keyboard.json index ac534af6a9..d5deffa01b 100644 --- a/keyboards/bantam44/keyboard.json +++ b/keyboards/bantam44/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bantam44", "manufacturer": "Bantam Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/beatervan/keyboard.json b/keyboards/beatervan/keyboard.json index 27d0f3e535..5bc27c8265 100644 --- a/keyboards/beatervan/keyboard.json +++ b/keyboards/beatervan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "beatervan", "manufacturer": "OJ", - "url": "", "maintainer": "OJ", "usb": { "vid": "0x6F7A", diff --git a/keyboards/beekeeb/piantor_pro/keyboard.json b/keyboards/beekeeb/piantor_pro/keyboard.json index ad4890ae68..e7605acd1a 100644 --- a/keyboards/beekeeb/piantor_pro/keyboard.json +++ b/keyboards/beekeeb/piantor_pro/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP7", "GP8", "GP9", "GP10"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/bestway/keyboard.json b/keyboards/bestway/keyboard.json index 66856115f8..2f4541b268 100644 --- a/keyboards/bestway/keyboard.json +++ b/keyboards/bestway/keyboard.json @@ -35,7 +35,6 @@ "led_count": 3, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xBB05", diff --git a/keyboards/bfake/keyboard.json b/keyboards/bfake/keyboard.json index 4774e282d7..8892d81112 100644 --- a/keyboards/bfake/keyboard.json +++ b/keyboards/bfake/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "B.fake", "manufacturer": "NotWinkeyless", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/biacco42/ergo42/rev1/keyboard.json b/keyboards/biacco42/ergo42/rev1/keyboard.json index c75e9d1c51..4639bf9639 100644 --- a/keyboards/biacco42/ergo42/rev1/keyboard.json +++ b/keyboards/biacco42/ergo42/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ergo42", "manufacturer": "Biacco42", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBC42", diff --git a/keyboards/biacco42/meishi/keyboard.json b/keyboards/biacco42/meishi/keyboard.json index b7d751d83e..99f7c5debb 100644 --- a/keyboards/biacco42/meishi/keyboard.json +++ b/keyboards/biacco42/meishi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Meishi", "manufacturer": "Biacco42", - "url": "", "maintainer": "Biacco42", "usb": { "vid": "0xBC42", diff --git a/keyboards/biacco42/meishi2/keyboard.json b/keyboards/biacco42/meishi2/keyboard.json index 2f553681bc..137c429ff1 100644 --- a/keyboards/biacco42/meishi2/keyboard.json +++ b/keyboards/biacco42/meishi2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "meishi2", "manufacturer": "Biacco42", - "url": "", "maintainer": "biacco42", "usb": { "vid": "0xBC42", diff --git a/keyboards/bioi/f60/keyboard.json b/keyboards/bioi/f60/keyboard.json index 8974a68e02..67fa1c1c9a 100644 --- a/keyboards/bioi/f60/keyboard.json +++ b/keyboards/bioi/f60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BIOI F60", "manufacturer": "Basic IO Instruments", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x8101", diff --git a/keyboards/bioi/g60ble/keyboard.json b/keyboards/bioi/g60ble/keyboard.json index 8b24556b37..ad1aed6048 100644 --- a/keyboards/bioi/g60ble/keyboard.json +++ b/keyboards/bioi/g60ble/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BIOI G60 BLE", "manufacturer": "Basic IO Instruments", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6583", diff --git a/keyboards/bioi/morgan65/keyboard.json b/keyboards/bioi/morgan65/keyboard.json index 5606233f2a..0182392706 100644 --- a/keyboards/bioi/morgan65/keyboard.json +++ b/keyboards/bioi/morgan65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Morgan65", "manufacturer": "Basic IO Instruments", - "url": "", "maintainer": "scottywei", "usb": { "vid": "0x8101", diff --git a/keyboards/bioi/s65/keyboard.json b/keyboards/bioi/s65/keyboard.json index 56d53b54cf..73baaf98c4 100644 --- a/keyboards/bioi/s65/keyboard.json +++ b/keyboards/bioi/s65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BIOI S65", "manufacturer": "Basic IO Instruments", - "url": "", "maintainer": "scottywei", "usb": { "vid": "0x8101", diff --git a/keyboards/blank/blank01/keyboard.json b/keyboards/blank/blank01/keyboard.json index 672a292def..5e29f192f2 100644 --- a/keyboards/blank/blank01/keyboard.json +++ b/keyboards/blank/blank01/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BLANK.01", "manufacturer": "BLANK", - "url": "", "maintainer": "gkeyboard", "usb": { "vid": "0x424C", diff --git a/keyboards/blaster75/keyboard.json b/keyboards/blaster75/keyboard.json index 81cc789da6..93288150ba 100644 --- a/keyboards/blaster75/keyboard.json +++ b/keyboards/blaster75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Blaster 75", "manufacturer": "Altain", - "url": "", "maintainer": "Altain", "usb": { "vid": "0xA122", diff --git a/keyboards/blockboy/ac980mini/keyboard.json b/keyboards/blockboy/ac980mini/keyboard.json index ad844102dc..8675daad8d 100644 --- a/keyboards/blockboy/ac980mini/keyboard.json +++ b/keyboards/blockboy/ac980mini/keyboard.json @@ -21,7 +21,6 @@ "rows": ["D0", "D1", "D2", "D3", "D5"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x6060", diff --git a/keyboards/blockey/keyboard.json b/keyboards/blockey/keyboard.json index 9710606a52..e9c5ceafa1 100644 --- a/keyboards/blockey/keyboard.json +++ b/keyboards/blockey/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BlocKey", "manufacturer": "Eucalyn", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/boardwalk/keyboard.json b/keyboards/boardwalk/keyboard.json index 6fb7673ec8..d0cb4b1383 100644 --- a/keyboards/boardwalk/keyboard.json +++ b/keyboards/boardwalk/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Boardwalk", "manufacturer": "shensmobile", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCDCD", diff --git a/keyboards/bobpad/keyboard.json b/keyboards/bobpad/keyboard.json index feddbbf222..d96c875011 100644 --- a/keyboards/bobpad/keyboard.json +++ b/keyboards/bobpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bobPad", "manufacturer": "Desiboards", - "url": "", "maintainer": "Ananya Kirti", "usb": { "vid": "0x416B", diff --git a/keyboards/bolsa/bolsalice/keyboard.json b/keyboards/bolsa/bolsalice/keyboard.json index 8ada9b5546..377da8a1d2 100644 --- a/keyboards/bolsa/bolsalice/keyboard.json +++ b/keyboards/bolsa/bolsalice/keyboard.json @@ -42,7 +42,6 @@ "diode_direction": "COL2ROW", "processor": "atmega32u4", "bootloader": "atmel-dfu", - "url": "", "maintainer": "qmk", "community_layouts": ["alice", "alice_split_bs"], "layouts": { diff --git a/keyboards/bolsa/damapad/keyboard.json b/keyboards/bolsa/damapad/keyboard.json index 5a47d12322..a5d95add81 100644 --- a/keyboards/bolsa/damapad/keyboard.json +++ b/keyboards/bolsa/damapad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Damapad", "manufacturer": "Bolsa Keyboard Supply", - "url": "", "maintainer": "matthewdias", "usb": { "vid": "0x6D64", diff --git a/keyboards/boston_meetup/2019/keyboard.json b/keyboards/boston_meetup/2019/keyboard.json index 40a390b0a8..4f07e0c631 100644 --- a/keyboards/boston_meetup/2019/keyboard.json +++ b/keyboards/boston_meetup/2019/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Boston Meetup Board", "manufacturer": "ishtob", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFB30", diff --git a/keyboards/botanicalkeyboards/fm2u/keyboard.json b/keyboards/botanicalkeyboards/fm2u/keyboard.json index 907d5d46b8..8c2714ade3 100644 --- a/keyboards/botanicalkeyboards/fm2u/keyboard.json +++ b/keyboards/botanicalkeyboards/fm2u/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FM2U", "manufacturer": "Botanical Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6969", diff --git a/keyboards/box75/keyboard.json b/keyboards/box75/keyboard.json index 89afff1716..9c5c245f20 100644 --- a/keyboards/box75/keyboard.json +++ b/keyboards/box75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BOX75", "manufacturer": "Lin Design", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x7668", diff --git a/keyboards/bpiphany/four_banger/keyboard.json b/keyboards/bpiphany/four_banger/keyboard.json index a368fbfe61..d74864d18f 100644 --- a/keyboards/bpiphany/four_banger/keyboard.json +++ b/keyboards/bpiphany/four_banger/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Four Banger", "manufacturer": "1up Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bpiphany/frosty_flake/info.json b/keyboards/bpiphany/frosty_flake/info.json index 33a2f792d9..bfec449931 100644 --- a/keyboards/bpiphany/frosty_flake/info.json +++ b/keyboards/bpiphany/frosty_flake/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Frosty Flake", "manufacturer": "Bathroom Epiphanies", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bpiphany/ghost_squid/keyboard.json b/keyboards/bpiphany/ghost_squid/keyboard.json index 85f6f0fa8e..68901ba316 100644 --- a/keyboards/bpiphany/ghost_squid/keyboard.json +++ b/keyboards/bpiphany/ghost_squid/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ghost Squid", "manufacturer": "Bathroom Epiphanies", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bpiphany/hid_liber/keyboard.json b/keyboards/bpiphany/hid_liber/keyboard.json index 67c8416849..2f8f3ea4ce 100644 --- a/keyboards/bpiphany/hid_liber/keyboard.json +++ b/keyboards/bpiphany/hid_liber/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HIDLiberation", "manufacturer": "bpiphany", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bpiphany/kitten_paw/keyboard.json b/keyboards/bpiphany/kitten_paw/keyboard.json index 829129d406..42c6cb8732 100644 --- a/keyboards/bpiphany/kitten_paw/keyboard.json +++ b/keyboards/bpiphany/kitten_paw/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kitten Paw", "manufacturer": "bpiphany", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/bpiphany/pegasushoof/info.json b/keyboards/bpiphany/pegasushoof/info.json index 1e9e9db306..a28f68e63e 100644 --- a/keyboards/bpiphany/pegasushoof/info.json +++ b/keyboards/bpiphany/pegasushoof/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Filco", - "url": "", "maintainer": "qmk", "features": { "bootmagic": true, diff --git a/keyboards/bpiphany/tiger_lily/keyboard.json b/keyboards/bpiphany/tiger_lily/keyboard.json index 118f89f39d..f260f84c71 100644 --- a/keyboards/bpiphany/tiger_lily/keyboard.json +++ b/keyboards/bpiphany/tiger_lily/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "tiger_lily", "manufacturer": "Bathroom Epiphanies", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4245", diff --git a/keyboards/bt66tech/bt66tech60/keyboard.json b/keyboards/bt66tech/bt66tech60/keyboard.json index 778e27fe67..9f747397c3 100644 --- a/keyboards/bt66tech/bt66tech60/keyboard.json +++ b/keyboards/bt66tech/bt66tech60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bt66tech 60%", "manufacturer": "bt66tech", - "url": "", "maintainer": "bt66tech", "usb": { "vid": "0x4254", diff --git a/keyboards/bubble75/hotswap/keyboard.json b/keyboards/bubble75/hotswap/keyboard.json index 011ce33ec4..92f57144ce 100644 --- a/keyboards/bubble75/hotswap/keyboard.json +++ b/keyboards/bubble75/hotswap/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "bubble75", - "url": "", "manufacturer": "phl", "maintainer": "velocifire", "usb": { diff --git a/keyboards/budgy/keyboard.json b/keyboards/budgy/keyboard.json index 0dc45c9da0..cfb60d85ae 100644 --- a/keyboards/budgy/keyboard.json +++ b/keyboards/budgy/keyboard.json @@ -12,7 +12,6 @@ "nkro": true }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0117", diff --git a/keyboards/buildakb/mw60/keyboard.json b/keyboards/buildakb/mw60/keyboard.json index 9969768345..9c944277de 100644 --- a/keyboards/buildakb/mw60/keyboard.json +++ b/keyboards/buildakb/mw60/keyboard.json @@ -17,7 +17,6 @@ "rows": ["E6", "D1", "F7", "F4", "F1"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0004", diff --git a/keyboards/caffeinated/serpent65/keyboard.json b/keyboards/caffeinated/serpent65/keyboard.json index add4854720..ef0f926759 100644 --- a/keyboards/caffeinated/serpent65/keyboard.json +++ b/keyboards/caffeinated/serpent65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Serpent65", "manufacturer": "Caffeinated Studios", - "url": "", "maintainer": "jrfhoutx", "usb": { "vid": "0x4353", diff --git a/keyboards/canary/canary60rgb/v1/keyboard.json b/keyboards/canary/canary60rgb/v1/keyboard.json index ac1ba67de0..4980a6f224 100644 --- a/keyboards/canary/canary60rgb/v1/keyboard.json +++ b/keyboards/canary/canary60rgb/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CANARY60RGB", "manufacturer": "CANARY", - "url": "", "maintainer": "tuananhnguyen204", "usb": { "vid": "0x4341", diff --git a/keyboards/cannonkeys/adelie/keyboard.json b/keyboards/cannonkeys/adelie/keyboard.json index 6b36af3082..c6792f4c90 100644 --- a/keyboards/cannonkeys/adelie/keyboard.json +++ b/keyboards/cannonkeys/adelie/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Adelie", "manufacturer": "Abec13", - "url": "", "maintainer": "Abec13", "usb": { "vid": "0xCA04", diff --git a/keyboards/cannonkeys/nearfield/keyboard.json b/keyboards/cannonkeys/nearfield/keyboard.json index e516198f09..784d26bd6f 100644 --- a/keyboards/cannonkeys/nearfield/keyboard.json +++ b/keyboards/cannonkeys/nearfield/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Nearfield", "manufacturer": "JLC", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x0004", diff --git a/keyboards/cannonkeys/ortho48/keyboard.json b/keyboards/cannonkeys/ortho48/keyboard.json index 2e045c183e..34f295fcd3 100644 --- a/keyboards/cannonkeys/ortho48/keyboard.json +++ b/keyboards/cannonkeys/ortho48/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho48", "manufacturer": "CannonKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCA04", diff --git a/keyboards/cannonkeys/ortho60/keyboard.json b/keyboards/cannonkeys/ortho60/keyboard.json index 2e8ad77297..874dc9efae 100644 --- a/keyboards/cannonkeys/ortho60/keyboard.json +++ b/keyboards/cannonkeys/ortho60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho60", "manufacturer": "CannonKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCA04", diff --git a/keyboards/cannonkeys/ortho75/keyboard.json b/keyboards/cannonkeys/ortho75/keyboard.json index af09fd47a7..e46b255b79 100644 --- a/keyboards/cannonkeys/ortho75/keyboard.json +++ b/keyboards/cannonkeys/ortho75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho75", "manufacturer": "CannonKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/cannonkeys/practice60/keyboard.json b/keyboards/cannonkeys/practice60/keyboard.json index ad8cde6d6b..9cd29cb2c5 100644 --- a/keyboards/cannonkeys/practice60/keyboard.json +++ b/keyboards/cannonkeys/practice60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Practice 60", "manufacturer": "CannonKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCA04", diff --git a/keyboards/cannonkeys/vector/keyboard.json b/keyboards/cannonkeys/vector/keyboard.json index 46fc0b4578..1c3e6e0ac2 100644 --- a/keyboards/cannonkeys/vector/keyboard.json +++ b/keyboards/cannonkeys/vector/keyboard.json @@ -21,7 +21,6 @@ "on_state": 0 }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0xCA04", diff --git a/keyboards/capsunlocked/cu24/keyboard.json b/keyboards/capsunlocked/cu24/keyboard.json index ceec64611c..db367ceba3 100644 --- a/keyboards/capsunlocked/cu24/keyboard.json +++ b/keyboards/capsunlocked/cu24/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CU24", "manufacturer": "Yiancar/CapsUnlocked", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/capsunlocked/cu65/keyboard.json b/keyboards/capsunlocked/cu65/keyboard.json index 80f1149661..aa45e9e498 100644 --- a/keyboards/capsunlocked/cu65/keyboard.json +++ b/keyboards/capsunlocked/cu65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CU65", "manufacturer": "CapsUnlocked", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4355", diff --git a/keyboards/capsunlocked/cu75/keyboard.json b/keyboards/capsunlocked/cu75/keyboard.json index f7a8356bcc..b226f74bf9 100644 --- a/keyboards/capsunlocked/cu75/keyboard.json +++ b/keyboards/capsunlocked/cu75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CU75", "manufacturer": "LFKeyboards/CapsUnlocked", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/centromere/keyboard.json b/keyboards/centromere/keyboard.json index c190bd84d7..01dd6c9875 100644 --- a/keyboards/centromere/keyboard.json +++ b/keyboards/centromere/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Centromere", "manufacturer": "Southpaw Design", - "url": "", "maintainer": "spe2", "usb": { "vid": "0xFEED", diff --git a/keyboards/checkerboards/axon40/keyboard.json b/keyboards/checkerboards/axon40/keyboard.json index c0b67b611d..432602659e 100644 --- a/keyboards/checkerboards/axon40/keyboard.json +++ b/keyboards/checkerboards/axon40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Axon40", "manufacturer": "Nasp", - "url": "", "maintainer": "nasp", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/candybar_ortho/keyboard.json b/keyboards/checkerboards/candybar_ortho/keyboard.json index d7908a04f4..1b9e264653 100644 --- a/keyboards/checkerboards/candybar_ortho/keyboard.json +++ b/keyboards/checkerboards/candybar_ortho/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CandyBar Ortho", "manufacturer": "Nasp", - "url": "", "maintainer": "nasp", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/g_idb60/keyboard.json b/keyboards/checkerboards/g_idb60/keyboard.json index 16f70dc868..cf1530b50b 100644 --- a/keyboards/checkerboards/g_idb60/keyboard.json +++ b/keyboards/checkerboards/g_idb60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "G_IDB60", "manufacturer": "Nasp", - "url": "", "maintainer": "npspears", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/nop60/keyboard.json b/keyboards/checkerboards/nop60/keyboard.json index 9b86a3936a..fb0e7b23df 100644 --- a/keyboards/checkerboards/nop60/keyboard.json +++ b/keyboards/checkerboards/nop60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NOP60", "manufacturer": "Nasp", - "url": "", "maintainer": "nasp", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/plexus75/keyboard.json b/keyboards/checkerboards/plexus75/keyboard.json index 14bd4deb75..e457f7f3e6 100644 --- a/keyboards/checkerboards/plexus75/keyboard.json +++ b/keyboards/checkerboards/plexus75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Plexus75", "manufacturer": "Nasp", - "url": "", "maintainer": "npspears", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/quark/keyboard.json b/keyboards/checkerboards/quark/keyboard.json index 4bb7c7fef7..90d378b528 100644 --- a/keyboards/checkerboards/quark/keyboard.json +++ b/keyboards/checkerboards/quark/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "QUARK", "manufacturer": "Nasp", - "url": "", "maintainer": "nasp", "usb": { "vid": "0x7070", diff --git a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json index 2aae3d1cc8..aaf5fb3e61 100644 --- a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json +++ b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UD40_Ortho_Alt", "manufacturer": "Nasp", - "url": "", "maintainer": "nasp", "usb": { "vid": "0x7070", diff --git a/keyboards/chickenman/ciel/keyboard.json b/keyboards/chickenman/ciel/keyboard.json index f28995794c..45c4c76048 100644 --- a/keyboards/chickenman/ciel/keyboard.json +++ b/keyboards/chickenman/ciel/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ciel", "manufacturer": "ChickenMan", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xC41C", diff --git a/keyboards/chickenman/ciel65/keyboard.json b/keyboards/chickenman/ciel65/keyboard.json index 70527b2aaf..7943e44311 100644 --- a/keyboards/chickenman/ciel65/keyboard.json +++ b/keyboards/chickenman/ciel65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ciel65", "manufacturer": "ChickenMan", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xC41C", diff --git a/keyboards/cipulot/kallos/keyboard.json b/keyboards/cipulot/kallos/keyboard.json index 731b37fda9..8a2e45e012 100644 --- a/keyboards/cipulot/kallos/keyboard.json +++ b/keyboards/cipulot/kallos/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kallos", "manufacturer": "Cipulot", - "url": "", "maintainer": "Cipulot", "usb": { "vid": "0x6369", diff --git a/keyboards/ck60i/keyboard.json b/keyboards/ck60i/keyboard.json index 72b57598a4..70535c5a76 100644 --- a/keyboards/ck60i/keyboard.json +++ b/keyboards/ck60i/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CK60i", "manufacturer": "CandyKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x434B", diff --git a/keyboards/ckeys/nakey/keyboard.json b/keyboards/ckeys/nakey/keyboard.json index 85f744217f..e9cbced1f1 100644 --- a/keyboards/ckeys/nakey/keyboard.json +++ b/keyboards/ckeys/nakey/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "naKey", "manufacturer": "cKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/ckeys/obelus/keyboard.json b/keyboards/ckeys/obelus/keyboard.json index 797bb870b9..39e3cbb115 100644 --- a/keyboards/ckeys/obelus/keyboard.json +++ b/keyboards/ckeys/obelus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Obelus", "manufacturer": "cKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/clawsome/bookerboard/keyboard.json b/keyboards/clawsome/bookerboard/keyboard.json index a72260eb60..7e3065863a 100644 --- a/keyboards/clawsome/bookerboard/keyboard.json +++ b/keyboards/clawsome/bookerboard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bookerboard", "manufacturer": "AlisGraveNil", - "url": "", "maintainer": "AlisGraveNil", "usb": { "vid": "0xFEED", diff --git a/keyboards/clawsome/sidekick/keyboard.json b/keyboards/clawsome/sidekick/keyboard.json index 4f535d09aa..f2712a367d 100644 --- a/keyboards/clawsome/sidekick/keyboard.json +++ b/keyboards/clawsome/sidekick/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sidekick", "manufacturer": "AlisGraveNil", - "url": "", "maintainer": "AlisGraveNil", "usb": { "vid": "0xFEED", diff --git a/keyboards/clueboard/17/keyboard.json b/keyboards/clueboard/17/keyboard.json index dcf273afda..0da234142d 100644 --- a/keyboards/clueboard/17/keyboard.json +++ b/keyboards/clueboard/17/keyboard.json @@ -38,7 +38,6 @@ "ws2812": { "pin": "F6" }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x2312", diff --git a/keyboards/clueboard/california/keyboard.json b/keyboards/clueboard/california/keyboard.json index 66b4b484e2..15467d4deb 100644 --- a/keyboards/clueboard/california/keyboard.json +++ b/keyboards/clueboard/california/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "Clueboard California", - "url": "", "maintainer": "skullydazed", "processor": "STM32F303", "board": "QMK_PROTON_C", diff --git a/keyboards/cmm_studio/fuji65/keyboard.json b/keyboards/cmm_studio/fuji65/keyboard.json index c4f1e5156e..84e539a636 100644 --- a/keyboards/cmm_studio/fuji65/keyboard.json +++ b/keyboards/cmm_studio/fuji65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Fuji65", "manufacturer": "CMM.Studio", - "url": "", "maintainer": "CMMS-Freather", "usb": { "vid": "0x434D", diff --git a/keyboards/cmm_studio/saka68/hotswap/keyboard.json b/keyboards/cmm_studio/saka68/hotswap/keyboard.json index 6dc3ec639a..8ea3185bf7 100644 --- a/keyboards/cmm_studio/saka68/hotswap/keyboard.json +++ b/keyboards/cmm_studio/saka68/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Saka68 Hotswap", "manufacturer": "CMM.Studio", - "url": "", "maintainer": "CMMS-Freather", "usb": { "vid": "0x434D", diff --git a/keyboards/cmm_studio/saka68/solder/keyboard.json b/keyboards/cmm_studio/saka68/solder/keyboard.json index d5aea40763..1ce357aabf 100644 --- a/keyboards/cmm_studio/saka68/solder/keyboard.json +++ b/keyboards/cmm_studio/saka68/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Saka68 Solder", "manufacturer": "CMM.Studio", - "url": "", "maintainer": "CMMS-Freather", "usb": { "vid": "0x434D", diff --git a/keyboards/coarse/ixora/keyboard.json b/keyboards/coarse/ixora/keyboard.json index 33ba2270ac..ebcc345d52 100644 --- a/keyboards/coarse/ixora/keyboard.json +++ b/keyboards/coarse/ixora/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ixora Rev1", "manufacturer": "PeiorisBoards", - "url": "", "maintainer": "Peioris", "usb": { "vid": "0xFEED", diff --git a/keyboards/coarse/vinta/keyboard.json b/keyboards/coarse/vinta/keyboard.json index df9aa7e5a1..07d5edb29b 100644 --- a/keyboards/coarse/vinta/keyboard.json +++ b/keyboards/coarse/vinta/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vinta R1", "manufacturer": "PeiorisBoards", - "url": "", "maintainer": "Peioris", "usb": { "vid": "0xFEED", diff --git a/keyboards/concreteflowers/cor/keyboard.json b/keyboards/concreteflowers/cor/keyboard.json index c2fa4379df..a4553229a7 100644 --- a/keyboards/concreteflowers/cor/keyboard.json +++ b/keyboards/concreteflowers/cor/keyboard.json @@ -17,7 +17,6 @@ "cols": ["F5", "F6", "F7", "C6", "C7", "B1", "B7", "B5", "B4", "D7", "D6", "D4", "D5", "D3", "D2", "D1", "D0"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0x5001", diff --git a/keyboards/concreteflowers/cor_tkl/keyboard.json b/keyboards/concreteflowers/cor_tkl/keyboard.json index 6a797d644c..3d98077e13 100644 --- a/keyboards/concreteflowers/cor_tkl/keyboard.json +++ b/keyboards/concreteflowers/cor_tkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cor TKL", "manufacturer": "concreteflowers", - "url": "", "maintainer": "ramonimbao", "community_layouts": [ "tkl_f13_ansi", diff --git a/keyboards/contra/keyboard.json b/keyboards/contra/keyboard.json index ffa32d6555..b3179564fe 100644 --- a/keyboards/contra/keyboard.json +++ b/keyboards/contra/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Contra", "manufacturer": "Cartel", - "url": "", "maintainer": "qmk", "features": { "bootmagic": true, diff --git a/keyboards/converter/adb_usb/info.json b/keyboards/converter/adb_usb/info.json index 3fbe2c0c74..3452efd709 100644 --- a/keyboards/converter/adb_usb/info.json +++ b/keyboards/converter/adb_usb/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "ADB to USB Keyboard Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/ibm_terminal/keyboard.json b/keyboards/converter/ibm_terminal/keyboard.json index b95ea58d20..d37bb2b147 100644 --- a/keyboards/converter/ibm_terminal/keyboard.json +++ b/keyboards/converter/ibm_terminal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "IBM Terminal to USB Keyboard Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/m0110_usb/keyboard.json b/keyboards/converter/m0110_usb/keyboard.json index 11b83bbb18..c4803b6e88 100644 --- a/keyboards/converter/m0110_usb/keyboard.json +++ b/keyboards/converter/m0110_usb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Apple M0110(A) to USB Keyboard Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/numeric_keypad_iie/keyboard.json b/keyboards/converter/numeric_keypad_iie/keyboard.json index 6dcffe7e21..6d64654846 100644 --- a/keyboards/converter/numeric_keypad_iie/keyboard.json +++ b/keyboards/converter/numeric_keypad_iie/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Numeric Keypad IIe", "manufacturer": "Apple Inc.", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/palm_usb/stowaway/keyboard.json b/keyboards/converter/palm_usb/stowaway/keyboard.json index c93957b7d8..6488b5c23c 100644 --- a/keyboards/converter/palm_usb/stowaway/keyboard.json +++ b/keyboards/converter/palm_usb/stowaway/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stowaway Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/siemens_tastatur/keyboard.json b/keyboards/converter/siemens_tastatur/keyboard.json index 710a2902cb..8f9f31bef1 100644 --- a/keyboards/converter/siemens_tastatur/keyboard.json +++ b/keyboards/converter/siemens_tastatur/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Siemens Tastatur", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x8968", diff --git a/keyboards/converter/sun_usb/info.json b/keyboards/converter/sun_usb/info.json index e4031595ad..57c38520ff 100644 --- a/keyboards/converter/sun_usb/info.json +++ b/keyboards/converter/sun_usb/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sun Keyboard Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/usb_usb/info.json b/keyboards/converter/usb_usb/info.json index 747fd49782..97d048160f 100644 --- a/keyboards/converter/usb_usb/info.json +++ b/keyboards/converter/usb_usb/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "USB to USB Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/converter/xt_usb/keyboard.json b/keyboards/converter/xt_usb/keyboard.json index 649b283329..08e697b8e9 100644 --- a/keyboards/converter/xt_usb/keyboard.json +++ b/keyboards/converter/xt_usb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "IBM PC XT Keyboard Converter", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/crawlpad/keyboard.json b/keyboards/crawlpad/keyboard.json index d4f1c43971..a10d1ca9c3 100644 --- a/keyboards/crawlpad/keyboard.json +++ b/keyboards/crawlpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Crawlpad", "manufacturer": "WoodKeys.Click", - "url": "", "maintainer": "colemarkham", "usb": { "vid": "0xFEED", diff --git a/keyboards/crazy_keyboard_68/keyboard.json b/keyboards/crazy_keyboard_68/keyboard.json index a53013bfb9..f87a3675af 100644 --- a/keyboards/crazy_keyboard_68/keyboard.json +++ b/keyboards/crazy_keyboard_68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Crazy_Keyboard 68", "manufacturer": "chent7", - "url": "", "maintainer": "chent7", "usb": { "vid": "0xFEED", diff --git a/keyboards/creatkeebs/glacier/keyboard.json b/keyboards/creatkeebs/glacier/keyboard.json index 61e6bd9136..e1e94ab8eb 100644 --- a/keyboards/creatkeebs/glacier/keyboard.json +++ b/keyboards/creatkeebs/glacier/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "glacier", "manufacturer": "creatkeebs", - "url": "", "maintainer": "Timliuzhaolu", "usb": { "vid": "0x0410", diff --git a/keyboards/crimsonkeyboards/resume1800/keyboard.json b/keyboards/crimsonkeyboards/resume1800/keyboard.json index aa54b04801..9b68049c6d 100644 --- a/keyboards/crimsonkeyboards/resume1800/keyboard.json +++ b/keyboards/crimsonkeyboards/resume1800/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Resume1800", "manufacturer": "CrimsonKeyboards", - "url": "", "maintainer": "CrimsonKeyboards", "usb": { "vid": "0xFEED", diff --git a/keyboards/crowboard/keyboard.json b/keyboards/crowboard/keyboard.json index 1a9502cbd1..2686a3d99c 100644 --- a/keyboards/crowboard/keyboard.json +++ b/keyboards/crowboard/keyboard.json @@ -15,7 +15,6 @@ "rows": ["GP14", "GP15", "GP16", "GP17"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/cutie_club/borsdorf/keyboard.json b/keyboards/cutie_club/borsdorf/keyboard.json index 30b5a74d64..ddf8dfeda4 100644 --- a/keyboards/cutie_club/borsdorf/keyboard.json +++ b/keyboards/cutie_club/borsdorf/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Borsdorf", "manufacturer": "Cutie Club", - "url": "", "maintainer": "Cutie Club", "usb": { "vid": "0xFB9C", diff --git a/keyboards/cutie_club/fidelity/keyboard.json b/keyboards/cutie_club/fidelity/keyboard.json index 905460d64e..e1ca2a430e 100644 --- a/keyboards/cutie_club/fidelity/keyboard.json +++ b/keyboards/cutie_club/fidelity/keyboard.json @@ -25,7 +25,6 @@ "resync": true } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x4D1B", diff --git a/keyboards/cutie_club/giant_macro_pad/keyboard.json b/keyboards/cutie_club/giant_macro_pad/keyboard.json index f5cde334c0..2eb2542603 100644 --- a/keyboards/cutie_club/giant_macro_pad/keyboard.json +++ b/keyboards/cutie_club/giant_macro_pad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cupar19 Giant Macro Pad", "manufacturer": "Cutie Club", - "url": "", "maintainer": "cutie-club", "usb": { "vid": "0xFB9C", diff --git a/keyboards/cutie_club/keebcats/denis/keyboard.json b/keyboards/cutie_club/keebcats/denis/keyboard.json index 098ae39cd2..052e22c1b1 100644 --- a/keyboards/cutie_club/keebcats/denis/keyboard.json +++ b/keyboards/cutie_club/keebcats/denis/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Keebcats Denis 80", "manufacturer": "Cutie Club", - "url": "", "maintainer": "Cutie Club", "usb": { "vid": "0xFB9C", diff --git a/keyboards/cutie_club/keebcats/dougal/keyboard.json b/keyboards/cutie_club/keebcats/dougal/keyboard.json index 915e3ad15c..c607977564 100644 --- a/keyboards/cutie_club/keebcats/dougal/keyboard.json +++ b/keyboards/cutie_club/keebcats/dougal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Keebcats Dougal 65", "manufacturer": "Cutie Club", - "url": "", "maintainer": "Cutie Club", "usb": { "vid": "0xFB9C", diff --git a/keyboards/cutie_club/novus/keyboard.json b/keyboards/cutie_club/novus/keyboard.json index 97bb81a71f..a5f47f8d51 100644 --- a/keyboards/cutie_club/novus/keyboard.json +++ b/keyboards/cutie_club/novus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Novus", "manufacturer": "Cutie Club", - "url": "", "maintainer": "Cutie Club", "usb": { "vid": "0xFB9C", diff --git a/keyboards/cutie_club/wraith/keyboard.json b/keyboards/cutie_club/wraith/keyboard.json index 7cc29caf25..6da586acfe 100644 --- a/keyboards/cutie_club/wraith/keyboard.json +++ b/keyboards/cutie_club/wraith/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wraith", "manufacturer": "Amber", - "url": "", "maintainer": "amberstarlight", "usb": { "vid": "0xFEED", diff --git a/keyboards/cx60/keyboard.json b/keyboards/cx60/keyboard.json index 9748d934a6..24bbee5a28 100644 --- a/keyboards/cx60/keyboard.json +++ b/keyboards/cx60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CX60", "manufacturer": "CX60", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4358", diff --git a/keyboards/cxt_studio/12e3/keyboard.json b/keyboards/cxt_studio/12e3/keyboard.json index 763f6bd5b9..0b8949cda7 100644 --- a/keyboards/cxt_studio/12e3/keyboard.json +++ b/keyboards/cxt_studio/12e3/keyboard.json @@ -64,7 +64,6 @@ {"flags": 4, "matrix": [2, 0], "x": 0, "y": 2} ] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x12E3", diff --git a/keyboards/cxt_studio/12e4/keyboard.json b/keyboards/cxt_studio/12e4/keyboard.json index b48e75f4ca..45d2835af4 100644 --- a/keyboards/cxt_studio/12e4/keyboard.json +++ b/keyboards/cxt_studio/12e4/keyboard.json @@ -66,7 +66,6 @@ {"flags": 4, "matrix": [2, 0], "x": 0, "y": 2} ] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xC401", diff --git a/keyboards/dailycraft/bat43/info.json b/keyboards/dailycraft/bat43/info.json index 19aaa540dd..6b4026f6d4 100644 --- a/keyboards/dailycraft/bat43/info.json +++ b/keyboards/dailycraft/bat43/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "bat43", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/claw44/rev1/keyboard.json b/keyboards/dailycraft/claw44/rev1/keyboard.json index 62b069a490..2391bc262f 100644 --- a/keyboards/dailycraft/claw44/rev1/keyboard.json +++ b/keyboards/dailycraft/claw44/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "claw44", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/owl8/keyboard.json b/keyboards/dailycraft/owl8/keyboard.json index a4a1a70e3e..482a3d905f 100644 --- a/keyboards/dailycraft/owl8/keyboard.json +++ b/keyboards/dailycraft/owl8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "owl8", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/sandbox/rev1/keyboard.json b/keyboards/dailycraft/sandbox/rev1/keyboard.json index 8658de96df..50a114457d 100644 --- a/keyboards/dailycraft/sandbox/rev1/keyboard.json +++ b/keyboards/dailycraft/sandbox/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "sandbox rev1", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/sandbox/rev2/keyboard.json b/keyboards/dailycraft/sandbox/rev2/keyboard.json index 1eb61ee12c..b1991cf56c 100644 --- a/keyboards/dailycraft/sandbox/rev2/keyboard.json +++ b/keyboards/dailycraft/sandbox/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "sandbox rev2", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/stickey4/keyboard.json b/keyboards/dailycraft/stickey4/keyboard.json index d0e2a491d3..d6ec02f784 100644 --- a/keyboards/dailycraft/stickey4/keyboard.json +++ b/keyboards/dailycraft/stickey4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "stickey4", "manufacturer": "yfuku", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/wings42/rev1/keyboard.json b/keyboards/dailycraft/wings42/rev1/keyboard.json index f4a3949c61..307b675d06 100644 --- a/keyboards/dailycraft/wings42/rev1/keyboard.json +++ b/keyboards/dailycraft/wings42/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "wings42 rev1", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json b/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json index bebe264cc0..ef5b4331b1 100644 --- a/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "wings42 rev1_extkeys", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/dailycraft/wings42/rev2/keyboard.json b/keyboards/dailycraft/wings42/rev2/keyboard.json index 3f2cb1b766..4d41f54f3b 100644 --- a/keyboards/dailycraft/wings42/rev2/keyboard.json +++ b/keyboards/dailycraft/wings42/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "wings42 rev2", "manufacturer": "yfuku", - "url": "", "maintainer": "yfuku", "usb": { "vid": "0x5946", diff --git a/keyboards/daji/seis_cinco/keyboard.json b/keyboards/daji/seis_cinco/keyboard.json index 358dfc17ce..3957dd4d0c 100644 --- a/keyboards/daji/seis_cinco/keyboard.json +++ b/keyboards/daji/seis_cinco/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Seis Cinco", "manufacturer": "Daji", - "url": "", "maintainer": "toraifu", "usb": { "vid": "0xBF00", diff --git a/keyboards/dark/magnum_ergo_1/keyboard.json b/keyboards/dark/magnum_ergo_1/keyboard.json index a52de6decc..6d3b3a5592 100644 --- a/keyboards/dark/magnum_ergo_1/keyboard.json +++ b/keyboards/dark/magnum_ergo_1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Magnum Ergo 1", "manufacturer": "Gondolindrim X Dark", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4744", diff --git a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json index 23bd2b6981..9f2ad70f12 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json +++ b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json @@ -174,7 +174,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "0.0.3", "pid": "0xE392", diff --git a/keyboards/darkproject/kd87a_bfg_edition/keyboard.json b/keyboards/darkproject/kd87a_bfg_edition/keyboard.json index 1e0d7f5e8b..cd6ae14108 100644 --- a/keyboards/darkproject/kd87a_bfg_edition/keyboard.json +++ b/keyboards/darkproject/kd87a_bfg_edition/keyboard.json @@ -180,7 +180,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "0.0.3", "pid": "0xE393", diff --git a/keyboards/darmoshark/k3/keyboard.json b/keyboards/darmoshark/k3/keyboard.json index ff5047b93a..e62d1908ed 100644 --- a/keyboards/darmoshark/k3/keyboard.json +++ b/keyboards/darmoshark/k3/keyboard.json @@ -2,7 +2,6 @@ "manufacturer": "Darmoshark", "keyboard_name": "K3 QMK", "maintainer": "Proceee", - "url": "", "processor": "WB32FQ95", "bootloader": "wb32-dfu", "usb": { diff --git a/keyboards/dasky/reverb/keyboard.json b/keyboards/dasky/reverb/keyboard.json index e7e203ebf6..bfeb9ef675 100644 --- a/keyboards/dasky/reverb/keyboard.json +++ b/keyboards/dasky/reverb/keyboard.json @@ -124,7 +124,6 @@ {"matrix": [3, 0], "x": 129, "y": 13, "flags": 4} ] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/dc01/arrow/keyboard.json b/keyboards/dc01/arrow/keyboard.json index f56646367f..c8a2b229ea 100644 --- a/keyboards/dc01/arrow/keyboard.json +++ b/keyboards/dc01/arrow/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DC01 Arrow", "manufacturer": "Mechboards", - "url": "", "maintainer": "Yiancar-Designs", "usb": { "vid": "0x8968", diff --git a/keyboards/dc01/left/keyboard.json b/keyboards/dc01/left/keyboard.json index 2238f67564..01942c099c 100644 --- a/keyboards/dc01/left/keyboard.json +++ b/keyboards/dc01/left/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DC01 Left", "manufacturer": "Mechboards", - "url": "", "maintainer": "Yiancar-Designs", "usb": { "vid": "0x8968", diff --git a/keyboards/dc01/numpad/keyboard.json b/keyboards/dc01/numpad/keyboard.json index 900af6e542..b78d8b9ee5 100644 --- a/keyboards/dc01/numpad/keyboard.json +++ b/keyboards/dc01/numpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DC01 Numpad", "manufacturer": "Mechboards", - "url": "", "maintainer": "Yiancar-Designs", "usb": { "vid": "0x8968", diff --git a/keyboards/dc01/right/keyboard.json b/keyboards/dc01/right/keyboard.json index 36dc7a7056..3811ec3331 100644 --- a/keyboards/dc01/right/keyboard.json +++ b/keyboards/dc01/right/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DC01 Right", "manufacturer": "Mechboards", - "url": "", "maintainer": "Yiancar-Designs", "usb": { "vid": "0x8968", diff --git a/keyboards/delikeeb/flatbread60/keyboard.json b/keyboards/delikeeb/flatbread60/keyboard.json index b0cf794dfb..2de307ab2a 100644 --- a/keyboards/delikeeb/flatbread60/keyboard.json +++ b/keyboards/delikeeb/flatbread60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Flatbread60", "manufacturer": "delikeeb", - "url": "", "maintainer": "noclew", "usb": { "vid": "0x9906", diff --git a/keyboards/delikeeb/vaguettelite/keyboard.json b/keyboards/delikeeb/vaguettelite/keyboard.json index 56919958f2..e438fd9bfb 100644 --- a/keyboards/delikeeb/vaguettelite/keyboard.json +++ b/keyboards/delikeeb/vaguettelite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vaguette Lite", "manufacturer": "dELIKEEb", - "url": "", "maintainer": "noclew", "usb": { "vid": "0x9906", diff --git a/keyboards/delikeeb/vanana/info.json b/keyboards/delikeeb/vanana/info.json index 520cd92b09..0ba67d4af5 100644 --- a/keyboards/delikeeb/vanana/info.json +++ b/keyboards/delikeeb/vanana/info.json @@ -1,6 +1,5 @@ { "manufacturer": "dELIKEEb", - "url": "", "maintainer": "noclew", "usb": { "vid": "0x9906", diff --git a/keyboards/delikeeb/waaffle/rev3/info.json b/keyboards/delikeeb/waaffle/rev3/info.json index 1201411d46..761c2dc3c7 100644 --- a/keyboards/delikeeb/waaffle/rev3/info.json +++ b/keyboards/delikeeb/waaffle/rev3/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Waaffle rev3", "manufacturer": "dELIKEEb", - "url": "", "maintainer": "noclew", "usb": { "vid": "0x9906", diff --git a/keyboards/deltapad/keyboard.json b/keyboards/deltapad/keyboard.json index 23683bbd1e..262f6bc41b 100644 --- a/keyboards/deltapad/keyboard.json +++ b/keyboards/deltapad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "deltapad", "manufacturer": "Richard Snijder", - "url": "", "maintainer": "Richard Snijder", "usb": { "vid": "0xFEED", diff --git a/keyboards/demiurge/keyboard.json b/keyboards/demiurge/keyboard.json index ad5264323b..80b1b477e1 100644 --- a/keyboards/demiurge/keyboard.json +++ b/keyboards/demiurge/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Demiurge", "manufacturer": "ojthetiny", - "url": "", "maintainer": "ojthetiny", "usb": { "vid": "0x6F6A", diff --git a/keyboards/deng/djam/keyboard.json b/keyboards/deng/djam/keyboard.json index 94e2aca2ec..0589af4938 100644 --- a/keyboards/deng/djam/keyboard.json +++ b/keyboards/deng/djam/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DJam", "manufacturer": "Leo Deng", - "url": "", "maintainer": "myst729", "usb": { "vid": "0xDE29", diff --git a/keyboards/deng/thirty/keyboard.json b/keyboards/deng/thirty/keyboard.json index a26d727f12..da36ae19f5 100644 --- a/keyboards/deng/thirty/keyboard.json +++ b/keyboards/deng/thirty/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Thirty", "manufacturer": "Leo Deng", - "url": "", "maintainer": "myst729", "usb": { "vid": "0xDE29", diff --git a/keyboards/densus/alveus/mx/keyboard.json b/keyboards/densus/alveus/mx/keyboard.json index 839c84fb45..dd3f1bde05 100644 --- a/keyboards/densus/alveus/mx/keyboard.json +++ b/keyboards/densus/alveus/mx/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alveus", "manufacturer": "Mechlovin Studio", - "url": "", "usb": { "vid": "0xDE00", "pid": "0x0F70", diff --git a/keyboards/dichotomy/keyboard.json b/keyboards/dichotomy/keyboard.json index bc3546a082..33a799b0e3 100644 --- a/keyboards/dichotomy/keyboard.json +++ b/keyboards/dichotomy/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dichotomy", "manufacturer": "Broekhuijsen", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/dk60/keyboard.json b/keyboards/dk60/keyboard.json index a88920814d..990cd7cfcc 100644 --- a/keyboards/dk60/keyboard.json +++ b/keyboards/dk60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DK60", "manufacturer": "DARKOU", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/dm9records/ergoinu/keyboard.json b/keyboards/dm9records/ergoinu/keyboard.json index 1f91a06600..0e124d1a21 100644 --- a/keyboards/dm9records/ergoinu/keyboard.json +++ b/keyboards/dm9records/ergoinu/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ergoinu", "manufacturer": "Dm9Records", - "url": "", "maintainer": "hsgw(Takuya Urakawa)", "usb": { "vid": "0x04D8", diff --git a/keyboards/do60/keyboard.json b/keyboards/do60/keyboard.json index 2a7d585f65..88cf1873e5 100644 --- a/keyboards/do60/keyboard.json +++ b/keyboards/do60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Do60", "manufacturer": "Doyu Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4453", diff --git a/keyboards/doio/kb09/keyboard.json b/keyboards/doio/kb09/keyboard.json index e3012f510c..f80f19cfda 100644 --- a/keyboards/doio/kb09/keyboard.json +++ b/keyboards/doio/kb09/keyboard.json @@ -88,7 +88,6 @@ "max_brightness": 200, "sleep": true }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0901", diff --git a/keyboards/doio/kb12/keyboard.json b/keyboards/doio/kb12/keyboard.json index c87d5f9544..fa450de512 100644 --- a/keyboards/doio/kb12/keyboard.json +++ b/keyboards/doio/kb12/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KB12-01", "manufacturer": "DOIO", - "url": "", "maintainer": "DOIO2022", "usb": { "vid": "0xD010", diff --git a/keyboards/doio/kb19/keyboard.json b/keyboards/doio/kb19/keyboard.json index faaaedd36f..6b97350b31 100644 --- a/keyboards/doio/kb19/keyboard.json +++ b/keyboards/doio/kb19/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KB19-01", "manufacturer": "DOIO", - "url": "", "maintainer": "DOIO2022", "usb": { "vid": "0xD010", diff --git a/keyboards/doio/kb30/keyboard.json b/keyboards/doio/kb30/keyboard.json index 388df2d9e3..68b79d0393 100644 --- a/keyboards/doio/kb30/keyboard.json +++ b/keyboards/doio/kb30/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KB30-01", "manufacturer": "DOIO", - "url": "", "maintainer": "DOIO2022", "usb": { "vid": "0xD010", diff --git a/keyboards/doio/kb3x/keyboard.json b/keyboards/doio/kb3x/keyboard.json index be0d138439..eb9e843745 100644 --- a/keyboards/doio/kb3x/keyboard.json +++ b/keyboards/doio/kb3x/keyboard.json @@ -86,7 +86,6 @@ "max_brightness": 200, "sleep": true }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x3F01", diff --git a/keyboards/donutcables/budget96/keyboard.json b/keyboards/donutcables/budget96/keyboard.json index eaba1b7c46..972149440d 100644 --- a/keyboards/donutcables/budget96/keyboard.json +++ b/keyboards/donutcables/budget96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Budget96", "manufacturer": "DonutCables", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4443", diff --git a/keyboards/donutcables/scrabblepad/keyboard.json b/keyboards/donutcables/scrabblepad/keyboard.json index aa03523ed8..9ee05346a0 100644 --- a/keyboards/donutcables/scrabblepad/keyboard.json +++ b/keyboards/donutcables/scrabblepad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ScrabblePad", "manufacturer": "DonutCables", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4443", diff --git a/keyboards/doppelganger/keyboard.json b/keyboards/doppelganger/keyboard.json index 8856927012..72b3604596 100644 --- a/keyboards/doppelganger/keyboard.json +++ b/keyboards/doppelganger/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Doppelganger", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/doro67/multi/keyboard.json b/keyboards/doro67/multi/keyboard.json index a3a652e40b..6749a234cf 100644 --- a/keyboards/doro67/multi/keyboard.json +++ b/keyboards/doro67/multi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Doro67 Multi", "manufacturer": "Backprop Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4250", diff --git a/keyboards/doro67/rgb/keyboard.json b/keyboards/doro67/rgb/keyboard.json index 8f372dc9c7..520ffbc870 100644 --- a/keyboards/doro67/rgb/keyboard.json +++ b/keyboards/doro67/rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Doro67 RGB", "manufacturer": "Backprop Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4250", diff --git a/keyboards/dp60/keyboard.json b/keyboards/dp60/keyboard.json index 51a2c08d47..2c42747bb4 100644 --- a/keyboards/dp60/keyboard.json +++ b/keyboards/dp60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DP60", "manufacturer": "astro", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x60BE", diff --git a/keyboards/draculad/keyboard.json b/keyboards/draculad/keyboard.json index 3ba2f0efae..c72bda7c38 100644 --- a/keyboards/draculad/keyboard.json +++ b/keyboards/draculad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DracuLad", "manufacturer": "MangoIV", - "url": "", "maintainer": "MangoIV", "usb": { "vid": "0xFEED", diff --git a/keyboards/dtisaac/cg108/keyboard.json b/keyboards/dtisaac/cg108/keyboard.json index 28e5563111..b2d7ed34fe 100644 --- a/keyboards/dtisaac/cg108/keyboard.json +++ b/keyboards/dtisaac/cg108/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CG108", "manufacturer": "DTIsaac", - "url": "", "maintainer": "daotakisaac", "usb": { "vid": "0x4454", diff --git a/keyboards/dtisaac/dosa40rgb/keyboard.json b/keyboards/dtisaac/dosa40rgb/keyboard.json index 5f3654d2c5..6795625260 100644 --- a/keyboards/dtisaac/dosa40rgb/keyboard.json +++ b/keyboards/dtisaac/dosa40rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": ">_Dosa40", "manufacturer": "DTIsaac", - "url": "", "maintainer": "DTIsaac", "usb": { "vid": "0x4454", diff --git a/keyboards/dtisaac/dtisaac01/keyboard.json b/keyboards/dtisaac/dtisaac01/keyboard.json index 0b4b1b3057..a9650a8112 100644 --- a/keyboards/dtisaac/dtisaac01/keyboard.json +++ b/keyboards/dtisaac/dtisaac01/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "dtisaac01", "manufacturer": "DTIsaac", - "url": "", "maintainer": "DTIsaac", "usb": { "vid": "0x4454", diff --git a/keyboards/duck/jetfire/keyboard.json b/keyboards/duck/jetfire/keyboard.json index a97ff193a8..d9adf05ca4 100644 --- a/keyboards/duck/jetfire/keyboard.json +++ b/keyboards/duck/jetfire/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jetfire", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/duck/lightsaver/keyboard.json b/keyboards/duck/lightsaver/keyboard.json index d4e1cd1e35..978e0c6e23 100644 --- a/keyboards/duck/lightsaver/keyboard.json +++ b/keyboards/duck/lightsaver/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lightsaver V3", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/duck/octagon/v1/keyboard.json b/keyboards/duck/octagon/v1/keyboard.json index 47f3acdc4d..7dfd9ec3ea 100644 --- a/keyboards/duck/octagon/v1/keyboard.json +++ b/keyboards/duck/octagon/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Octagon V1", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/duck/octagon/v2/keyboard.json b/keyboards/duck/octagon/v2/keyboard.json index 4afbc42d47..b3a1eb784d 100644 --- a/keyboards/duck/octagon/v2/keyboard.json +++ b/keyboards/duck/octagon/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Octagon V2", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/duck/orion/v3/keyboard.json b/keyboards/duck/orion/v3/keyboard.json index ba479aa0a2..9a7251c650 100644 --- a/keyboards/duck/orion/v3/keyboard.json +++ b/keyboards/duck/orion/v3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Orion V3", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/duck/tcv3/keyboard.json b/keyboards/duck/tcv3/keyboard.json index c03142b4db..699a44e69b 100644 --- a/keyboards/duck/tcv3/keyboard.json +++ b/keyboards/duck/tcv3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TC-V3", "manufacturer": "Duck", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444B", diff --git a/keyboards/dumbo/keyboard.json b/keyboards/dumbo/keyboard.json index b833915d80..8026f22790 100644 --- a/keyboards/dumbo/keyboard.json +++ b/keyboards/dumbo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dumbo", "manufacturer": "trip_trap", - "url": "", "maintainer": "adamnaldal", "usb": { "vid": "0xFEED", diff --git a/keyboards/dz60/keyboard.json b/keyboards/dz60/keyboard.json index 8a8e631f1b..3bf56b90f1 100644 --- a/keyboards/dz60/keyboard.json +++ b/keyboards/dz60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ60", "manufacturer": "KBDFans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x445A", diff --git a/keyboards/dztech/bocc/keyboard.json b/keyboards/dztech/bocc/keyboard.json index a6208b2bf7..e05e1828a3 100644 --- a/keyboards/dztech/bocc/keyboard.json +++ b/keyboards/dztech/bocc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BOCC", "manufacturer": "DZTECH", - "url": "", "maintainer": "DZTECH", "usb": { "vid": "0x445A", diff --git a/keyboards/dztech/duo_s/keyboard.json b/keyboards/dztech/duo_s/keyboard.json index 7bf8b0bfdd..76cbb57261 100644 --- a/keyboards/dztech/duo_s/keyboard.json +++ b/keyboards/dztech/duo_s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DUO-S", "manufacturer": "DZTECH", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x445A", diff --git a/keyboards/dztech/dz60rgb/info.json b/keyboards/dztech/dz60rgb/info.json index 17439e3443..1bcc77c605 100644 --- a/keyboards/dztech/dz60rgb/info.json +++ b/keyboards/dztech/dz60rgb/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ60RGB", "manufacturer": "DZTECH", - "url": "", "maintainer": "dztech", "usb": { "vid": "0x445A" diff --git a/keyboards/dztech/dz60rgb_ansi/info.json b/keyboards/dztech/dz60rgb_ansi/info.json index 12fefa5d87..dddbd47315 100644 --- a/keyboards/dztech/dz60rgb_ansi/info.json +++ b/keyboards/dztech/dz60rgb_ansi/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ60RGB_ANSI", "manufacturer": "DZTECH", - "url": "", "maintainer": "dztech", "usb": { "vid": "0x445A" diff --git a/keyboards/dztech/dz60rgb_wkl/info.json b/keyboards/dztech/dz60rgb_wkl/info.json index ca43c1cbd7..a4dfb63c7a 100644 --- a/keyboards/dztech/dz60rgb_wkl/info.json +++ b/keyboards/dztech/dz60rgb_wkl/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ60RGB_WKL", "manufacturer": "DZTECH", - "url": "", "maintainer": "dztech", "usb": { "vid": "0x445A" diff --git a/keyboards/dztech/dz64rgb/keyboard.json b/keyboards/dztech/dz64rgb/keyboard.json index ea22af59db..ef95b52400 100644 --- a/keyboards/dztech/dz64rgb/keyboard.json +++ b/keyboards/dztech/dz64rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ64RGB", "manufacturer": "DZTECH", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x445A", diff --git a/keyboards/dztech/dz65rgb/info.json b/keyboards/dztech/dz65rgb/info.json index d3a127251b..39e1242af4 100644 --- a/keyboards/dztech/dz65rgb/info.json +++ b/keyboards/dztech/dz65rgb/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ65RGB", "manufacturer": "DZTECH", - "url": "", "maintainer": "dztech", "usb": { "vid": "0x445A" diff --git a/keyboards/dztech/dz96/keyboard.json b/keyboards/dztech/dz96/keyboard.json index ef2de26a70..e51f574419 100644 --- a/keyboards/dztech/dz96/keyboard.json +++ b/keyboards/dztech/dz96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DZ96", "manufacturer": "DZTECH", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x445A", diff --git a/keyboards/dztech/endless80/keyboard.json b/keyboards/dztech/endless80/keyboard.json index 9387b67ead..835ef0d652 100644 --- a/keyboards/dztech/endless80/keyboard.json +++ b/keyboards/dztech/endless80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "endless80", "manufacturer": "dztech", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x445A", diff --git a/keyboards/e88/keyboard.json b/keyboards/e88/keyboard.json index 32ee42aefd..941eb42729 100644 --- a/keyboards/e88/keyboard.json +++ b/keyboards/e88/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "e88", "manufacturer": "Pink Labs", - "url": "", "maintainer": "2-n", "usb": { "vid": "0x4705", diff --git a/keyboards/eason/aeroboard/keyboard.json b/keyboards/eason/aeroboard/keyboard.json index 3d8c2a6db6..cc0771f82c 100644 --- a/keyboards/eason/aeroboard/keyboard.json +++ b/keyboards/eason/aeroboard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AeroBoard", "manufacturer": "Eason", - "url": "", "maintainer": "EasonQian1", "usb": { "vid": "0x8954", diff --git a/keyboards/eason/capsule65/keyboard.json b/keyboards/eason/capsule65/keyboard.json index 87b7b94568..9f51508a70 100644 --- a/keyboards/eason/capsule65/keyboard.json +++ b/keyboards/eason/capsule65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "capsule65", "manufacturer": "eason", - "url": "", "maintainer": "EasonQian1", "usb": { "vid": "0xF21E", diff --git a/keyboards/eason/meow65/keyboard.json b/keyboards/eason/meow65/keyboard.json index 340a741040..df995ea359 100644 --- a/keyboards/eason/meow65/keyboard.json +++ b/keyboards/eason/meow65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Meow65", "manufacturer": "Eason", - "url": "", "maintainer": "Eason", "usb": { "vid": "0x68F4", diff --git a/keyboards/eason/void65h/keyboard.json b/keyboards/eason/void65h/keyboard.json index 7b6a7fe2fb..664cfac81b 100644 --- a/keyboards/eason/void65h/keyboard.json +++ b/keyboards/eason/void65h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Void65h", "manufacturer": "Eason", - "url": "", "maintainer": "Eason", "usb": { "vid": "0x51D7", diff --git a/keyboards/eco/info.json b/keyboards/eco/info.json index 1bb5c79eb2..f62d91a01f 100644 --- a/keyboards/eco/info.json +++ b/keyboards/eco/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "The ECO Keyboard", "manufacturer": "Bishop Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1337", diff --git a/keyboards/edc40/keyboard.json b/keyboards/edc40/keyboard.json index 7ad2fdd3b8..a9a2527520 100644 --- a/keyboards/edc40/keyboard.json +++ b/keyboards/edc40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "edc40", "manufacturer": "OJ", - "url": "", "maintainer": "ojthetiny", "usb": { "vid": "0x4F4A", diff --git a/keyboards/edi/standaside/keyboard.json b/keyboards/edi/standaside/keyboard.json index 410f8f693a..744f5fbe1e 100644 --- a/keyboards/edi/standaside/keyboard.json +++ b/keyboards/edi/standaside/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stand Aside", "manufacturer": "Fate Everywhere", - "url": "", "maintainer": "fateeverywhere", "usb": { "vid": "0xF7E0", diff --git a/keyboards/efreet/keyboard.json b/keyboards/efreet/keyboard.json index 7dac78cc39..0e42253c47 100644 --- a/keyboards/efreet/keyboard.json +++ b/keyboards/efreet/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Efreet", "manufacturer": "Soran", - "url": "", "maintainer": "amberstarlight", "usb": { "vid": "0x534F", diff --git a/keyboards/ein_60/keyboard.json b/keyboards/ein_60/keyboard.json index 1c245fa8b4..b1e48f1747 100644 --- a/keyboards/ein_60/keyboard.json +++ b/keyboards/ein_60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ein_60", "manufacturer": "klackygears", - "url": "", "maintainer": "klackygears", "usb": { "vid": "0x4A53", diff --git a/keyboards/emi20/keyboard.json b/keyboards/emi20/keyboard.json index 56f13af875..d6fd12356a 100644 --- a/keyboards/emi20/keyboard.json +++ b/keyboards/emi20/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Emi20", "manufacturer": "Aquacylinder", - "url": "", "maintainer": "Aquacylinder", "usb": { "vid": "0xFEED", diff --git a/keyboards/emptystring/nqg/keyboard.json b/keyboards/emptystring/nqg/keyboard.json index 96f9391dcc..52fae23604 100644 --- a/keyboards/emptystring/nqg/keyboard.json +++ b/keyboards/emptystring/nqg/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NQG", "manufacturer": "emptystring", - "url": "", "maintainer": "culturalsnow", "usb": { "vid": "0x0076", diff --git a/keyboards/eniigmakeyboards/ek60/keyboard.json b/keyboards/eniigmakeyboards/ek60/keyboard.json index 6446dbce34..09e34dfbc1 100644 --- a/keyboards/eniigmakeyboards/ek60/keyboard.json +++ b/keyboards/eniigmakeyboards/ek60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "EK60", "manufacturer": "Eniigma Keyboards", - "url": "", "maintainer": "adamws", "usb": { "vid": "0x454B", diff --git a/keyboards/eniigmakeyboards/ek65/keyboard.json b/keyboards/eniigmakeyboards/ek65/keyboard.json index fa6ad3566a..cd158f3b9a 100644 --- a/keyboards/eniigmakeyboards/ek65/keyboard.json +++ b/keyboards/eniigmakeyboards/ek65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "EK65", "manufacturer": "Eniigma Keyboards", - "url": "", "maintainer": "adamws", "usb": { "vid": "0x454B", diff --git a/keyboards/eniigmakeyboards/ek87/keyboard.json b/keyboards/eniigmakeyboards/ek87/keyboard.json index 900a74a4b6..a136d53729 100644 --- a/keyboards/eniigmakeyboards/ek87/keyboard.json +++ b/keyboards/eniigmakeyboards/ek87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "EK87", "manufacturer": "Eniigma Keyboards", - "url": "", "maintainer": "adamws", "usb": { "vid": "0x454B", diff --git a/keyboards/epomaker/tide65/keyboard.json b/keyboards/epomaker/tide65/keyboard.json index 60f1b46f70..7a384f180f 100644 --- a/keyboards/epomaker/tide65/keyboard.json +++ b/keyboards/epomaker/tide65/keyboard.json @@ -141,7 +141,6 @@ {"matrix": [4, 14], "x": 224, "y": 64, "flags": 4} ] }, - "url": "", "usb": { "device_version": "0.0.1", "force_nkro": true, diff --git a/keyboards/era/divine/keyboard.json b/keyboards/era/divine/keyboard.json index d02241da78..cc67932131 100644 --- a/keyboards/era/divine/keyboard.json +++ b/keyboards/era/divine/keyboard.json @@ -31,7 +31,6 @@ "rows": ["GP11", "GP10", "GP9", "GP8", "GP4"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/era/era65/keyboard.json b/keyboards/era/era65/keyboard.json index d5fd612767..63b96666c1 100644 --- a/keyboards/era/era65/keyboard.json +++ b/keyboards/era/era65/keyboard.json @@ -32,7 +32,6 @@ "rows": ["GP1", "GP2", "GP4", "GP10", "GP11"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.4", "pid": "0x0001", diff --git a/keyboards/era/linx3/fave65s/keyboard.json b/keyboards/era/linx3/fave65s/keyboard.json index 87f4fdf513..af44df9850 100644 --- a/keyboards/era/linx3/fave65s/keyboard.json +++ b/keyboards/era/linx3/fave65s/keyboard.json @@ -109,7 +109,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0011", diff --git a/keyboards/era/linx3/n86/keyboard.json b/keyboards/era/linx3/n86/keyboard.json index c0b8b5525a..354a358470 100644 --- a/keyboards/era/linx3/n86/keyboard.json +++ b/keyboards/era/linx3/n86/keyboard.json @@ -161,7 +161,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0008", diff --git a/keyboards/era/linx3/n87/keyboard.json b/keyboards/era/linx3/n87/keyboard.json index 548a37fadd..5a03a5cbc5 100644 --- a/keyboards/era/linx3/n87/keyboard.json +++ b/keyboards/era/linx3/n87/keyboard.json @@ -162,7 +162,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0009", diff --git a/keyboards/era/linx3/n8x/keyboard.json b/keyboards/era/linx3/n8x/keyboard.json index ae0d608ffa..c018874bd1 100644 --- a/keyboards/era/linx3/n8x/keyboard.json +++ b/keyboards/era/linx3/n8x/keyboard.json @@ -29,7 +29,6 @@ "rows": ["GP4", "GP5", "GP6", "GP7", "GP10", "GP9"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0007", diff --git a/keyboards/era/sirind/brick65s/keyboard.json b/keyboards/era/sirind/brick65s/keyboard.json index 5d6768a93c..489b0da323 100644 --- a/keyboards/era/sirind/brick65s/keyboard.json +++ b/keyboards/era/sirind/brick65s/keyboard.json @@ -27,7 +27,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0012", diff --git a/keyboards/era/sirind/chickpad/keyboard.json b/keyboards/era/sirind/chickpad/keyboard.json index fe76df006d..c662d8241a 100644 --- a/keyboards/era/sirind/chickpad/keyboard.json +++ b/keyboards/era/sirind/chickpad/keyboard.json @@ -88,7 +88,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0015", diff --git a/keyboards/era/sirind/klein_hs/keyboard.json b/keyboards/era/sirind/klein_hs/keyboard.json index 6d677f6748..01395c3af1 100644 --- a/keyboards/era/sirind/klein_hs/keyboard.json +++ b/keyboards/era/sirind/klein_hs/keyboard.json @@ -28,7 +28,6 @@ "rows": ["GP18", "GP19", "GP20", "GP21", "GP14", "GP5", "GP6", "GP4", "GP13", "GP12"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0004", diff --git a/keyboards/era/sirind/klein_sd/keyboard.json b/keyboards/era/sirind/klein_sd/keyboard.json index 62b8f78865..b2fbe33290 100644 --- a/keyboards/era/sirind/klein_sd/keyboard.json +++ b/keyboards/era/sirind/klein_sd/keyboard.json @@ -149,7 +149,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0005", diff --git a/keyboards/era/sirind/tomak/keyboard.json b/keyboards/era/sirind/tomak/keyboard.json index cfd933bfe6..9f4993614b 100644 --- a/keyboards/era/sirind/tomak/keyboard.json +++ b/keyboards/era/sirind/tomak/keyboard.json @@ -196,7 +196,6 @@ } } }, - "url": "", "usb": { "device_version": "1.0.2", "pid": "0x0006", diff --git a/keyboards/era/sirind/tomak79h/keyboard.json b/keyboards/era/sirind/tomak79h/keyboard.json index 216250f850..d1764bb668 100644 --- a/keyboards/era/sirind/tomak79h/keyboard.json +++ b/keyboards/era/sirind/tomak79h/keyboard.json @@ -197,7 +197,6 @@ } } }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0014", diff --git a/keyboards/era/sirind/tomak79s/keyboard.json b/keyboards/era/sirind/tomak79s/keyboard.json index 9011a359ad..2e68ad788d 100644 --- a/keyboards/era/sirind/tomak79s/keyboard.json +++ b/keyboards/era/sirind/tomak79s/keyboard.json @@ -203,7 +203,6 @@ } } }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0013", diff --git a/keyboards/esca/getawayvan/keyboard.json b/keyboards/esca/getawayvan/keyboard.json index 6105e5850d..999430307b 100644 --- a/keyboards/esca/getawayvan/keyboard.json +++ b/keyboards/esca/getawayvan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GetawayVan", "manufacturer": "esca", - "url": "", "maintainer": "esca", "usb": { "vid": "0xE5CA", diff --git a/keyboards/esca/getawayvan_f042/keyboard.json b/keyboards/esca/getawayvan_f042/keyboard.json index 6b934e16c7..cf27a89693 100644 --- a/keyboards/esca/getawayvan_f042/keyboard.json +++ b/keyboards/esca/getawayvan_f042/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GetawayVan", "manufacturer": "esca", - "url": "", "maintainer": "esca", "usb": { "vid": "0xE5CA", diff --git a/keyboards/eve/meteor/keyboard.json b/keyboards/eve/meteor/keyboard.json index a8136496f0..4b3239c38c 100644 --- a/keyboards/eve/meteor/keyboard.json +++ b/keyboards/eve/meteor/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Meteor", "manufacturer": "EVE", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4556", diff --git a/keyboards/evil80/keyboard.json b/keyboards/evil80/keyboard.json index 9610718b34..c5a6283716 100644 --- a/keyboards/evil80/keyboard.json +++ b/keyboards/evil80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Evil80", "manufacturer": "Evil", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/evolv/keyboard.json b/keyboards/evolv/keyboard.json index 8373bbb536..872f80085d 100644 --- a/keyboards/evolv/keyboard.json +++ b/keyboards/evolv/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Evolv75", "manufacturer": "NathanAlpha", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7865", diff --git a/keyboards/evyd13/atom47/rev2/keyboard.json b/keyboards/evyd13/atom47/rev2/keyboard.json index 6466c1b7b8..8b1af5ede6 100644 --- a/keyboards/evyd13/atom47/rev2/keyboard.json +++ b/keyboards/evyd13/atom47/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atom47 rev2", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/atom47/rev3/keyboard.json b/keyboards/evyd13/atom47/rev3/keyboard.json index 009c3ef534..e2c6a1e1ba 100644 --- a/keyboards/evyd13/atom47/rev3/keyboard.json +++ b/keyboards/evyd13/atom47/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atom47 rev3", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/atom47/rev4/keyboard.json b/keyboards/evyd13/atom47/rev4/keyboard.json index cea416e1a6..9a5d7b1ce4 100644 --- a/keyboards/evyd13/atom47/rev4/keyboard.json +++ b/keyboards/evyd13/atom47/rev4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atom47 rev4", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/atom47/rev5/keyboard.json b/keyboards/evyd13/atom47/rev5/keyboard.json index 074d34ab43..86ff90c19c 100644 --- a/keyboards/evyd13/atom47/rev5/keyboard.json +++ b/keyboards/evyd13/atom47/rev5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atom47 rev5", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/eon65/keyboard.json b/keyboards/evyd13/eon65/keyboard.json index 05506e0ea8..328e0e4885 100644 --- a/keyboards/evyd13/eon65/keyboard.json +++ b/keyboards/evyd13/eon65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eon65", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/eon75/keyboard.json b/keyboards/evyd13/eon75/keyboard.json index fe6ee01832..d91e1267fb 100644 --- a/keyboards/evyd13/eon75/keyboard.json +++ b/keyboards/evyd13/eon75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eon75", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/eon87/keyboard.json b/keyboards/evyd13/eon87/keyboard.json index a0d73d442e..a53c2c130e 100644 --- a/keyboards/evyd13/eon87/keyboard.json +++ b/keyboards/evyd13/eon87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eon87", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/eon95/keyboard.json b/keyboards/evyd13/eon95/keyboard.json index 20be437ea1..4da4cad0d1 100644 --- a/keyboards/evyd13/eon95/keyboard.json +++ b/keyboards/evyd13/eon95/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eon95", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/fin_pad/keyboard.json b/keyboards/evyd13/fin_pad/keyboard.json index 01b24ccfd0..79d87d7153 100644 --- a/keyboards/evyd13/fin_pad/keyboard.json +++ b/keyboards/evyd13/fin_pad/keyboard.json @@ -21,7 +21,6 @@ "ortho_6x4" ], "processor": "atmega32u2", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xA6E2", diff --git a/keyboards/evyd13/minitomic/keyboard.json b/keyboards/evyd13/minitomic/keyboard.json index 7a8d6d8c23..97bc0dd050 100644 --- a/keyboards/evyd13/minitomic/keyboard.json +++ b/keyboards/evyd13/minitomic/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Minitomic", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/nt650/keyboard.json b/keyboards/evyd13/nt650/keyboard.json index 6f2910b630..54f3f8cce0 100644 --- a/keyboards/evyd13/nt650/keyboard.json +++ b/keyboards/evyd13/nt650/keyboard.json @@ -22,7 +22,6 @@ "rows": ["F7", "D6", "D4", "F1", "D5", "F0", "D3", "D2"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xD5DF", diff --git a/keyboards/evyd13/nt660/keyboard.json b/keyboards/evyd13/nt660/keyboard.json index 142e9f2920..a0a330ae40 100644 --- a/keyboards/evyd13/nt660/keyboard.json +++ b/keyboards/evyd13/nt660/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "nt660", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/nt980/keyboard.json b/keyboards/evyd13/nt980/keyboard.json index 65ba93d73d..b51a67903e 100644 --- a/keyboards/evyd13/nt980/keyboard.json +++ b/keyboards/evyd13/nt980/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "nt980", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/omrontkl/keyboard.json b/keyboards/evyd13/omrontkl/keyboard.json index 1ea340acaa..2f41f3f14c 100644 --- a/keyboards/evyd13/omrontkl/keyboard.json +++ b/keyboards/evyd13/omrontkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OmronTKL", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/plain60/keyboard.json b/keyboards/evyd13/plain60/keyboard.json index ce08a523ed..dd59768dbf 100644 --- a/keyboards/evyd13/plain60/keyboard.json +++ b/keyboards/evyd13/plain60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Plain60", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/ta65/keyboard.json b/keyboards/evyd13/ta65/keyboard.json index 1f58de0200..87f7bbfbc8 100644 --- a/keyboards/evyd13/ta65/keyboard.json +++ b/keyboards/evyd13/ta65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ta-65", "manufacturer": "Evyd13", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4705", diff --git a/keyboards/evyd13/wonderland/keyboard.json b/keyboards/evyd13/wonderland/keyboard.json index 526416fd71..b15ad66f41 100644 --- a/keyboards/evyd13/wonderland/keyboard.json +++ b/keyboards/evyd13/wonderland/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wonderland", "manufacturer": "Evyd13", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x4705", diff --git a/keyboards/exclusive/e65/keyboard.json b/keyboards/exclusive/e65/keyboard.json index 9735155abe..6efd89e94f 100644 --- a/keyboards/exclusive/e65/keyboard.json +++ b/keyboards/exclusive/e65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E6.5", "manufacturer": "Exclusive / E-Team", - "url": "", "maintainer": "masterzen", "usb": { "vid": "0x4558", diff --git a/keyboards/exclusive/e6_rgb/keyboard.json b/keyboards/exclusive/e6_rgb/keyboard.json index 401bee9aba..5e6e3999be 100644 --- a/keyboards/exclusive/e6_rgb/keyboard.json +++ b/keyboards/exclusive/e6_rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E6 RGB", "manufacturer": "astro", - "url": "", "maintainer": "yulei", "usb": { "vid": "0x4154", diff --git a/keyboards/exclusive/e6v2/le/keyboard.json b/keyboards/exclusive/e6v2/le/keyboard.json index e6d551126e..aa6be48997 100644 --- a/keyboards/exclusive/e6v2/le/keyboard.json +++ b/keyboards/exclusive/e6v2/le/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E6-V2 LE", "manufacturer": "Exclusive / E-Team", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/exclusive/e6v2/oe/keyboard.json b/keyboards/exclusive/e6v2/oe/keyboard.json index 587205d2df..e619e542b1 100644 --- a/keyboards/exclusive/e6v2/oe/keyboard.json +++ b/keyboards/exclusive/e6v2/oe/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E6-V2 OE", "manufacturer": "Exclusive / E-Team", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/exclusive/e7v1/keyboard.json b/keyboards/exclusive/e7v1/keyboard.json index ac0eb5549a..711d1e3908 100644 --- a/keyboards/exclusive/e7v1/keyboard.json +++ b/keyboards/exclusive/e7v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E7-V1", "manufacturer": "Exclusive / E-Team", - "url": "", "maintainer": "masterzen", "usb": { "vid": "0x4558", diff --git a/keyboards/exclusive/e85/hotswap/keyboard.json b/keyboards/exclusive/e85/hotswap/keyboard.json index 7fcd61c843..72e578c04e 100644 --- a/keyboards/exclusive/e85/hotswap/keyboard.json +++ b/keyboards/exclusive/e85/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E8.5 Hotswap", "manufacturer": "Exclusive", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4558", diff --git a/keyboards/exclusive/e85/soldered/keyboard.json b/keyboards/exclusive/e85/soldered/keyboard.json index dfd6d18826..eaffa08933 100644 --- a/keyboards/exclusive/e85/soldered/keyboard.json +++ b/keyboards/exclusive/e85/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "E8.5 Soldered", "manufacturer": "Exclusive", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4558", diff --git a/keyboards/exent/keyboard.json b/keyboards/exent/keyboard.json index 1fcd11084b..e6ac763d13 100644 --- a/keyboards/exent/keyboard.json +++ b/keyboards/exent/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Exent", "manufacturer": "Quadcube", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5143", diff --git a/keyboards/eyeohdesigns/babyv/keyboard.json b/keyboards/eyeohdesigns/babyv/keyboard.json index 1197533189..849d59a227 100644 --- a/keyboards/eyeohdesigns/babyv/keyboard.json +++ b/keyboards/eyeohdesigns/babyv/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "babyv", "manufacturer": "Eye Oh Designs", - "url": "", "maintainer": "eye oh designs", "usb": { "vid": "0xFEED", diff --git a/keyboards/eyeohdesigns/theboulevard/keyboard.json b/keyboards/eyeohdesigns/theboulevard/keyboard.json index 94007dd2c5..cb2cd6b3c2 100644 --- a/keyboards/eyeohdesigns/theboulevard/keyboard.json +++ b/keyboards/eyeohdesigns/theboulevard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "the boulevard", "manufacturer": "eye oh designs", - "url": "", "maintainer": "eye oh designs", "usb": { "vid": "0xFEED", diff --git a/keyboards/facew/keyboard.json b/keyboards/facew/keyboard.json index a8a7543b7a..395207d348 100644 --- a/keyboards/facew/keyboard.json +++ b/keyboards/facew/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FaceW", "manufacturer": "SPRiT", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/falsonix/fx19/keyboard.json b/keyboards/falsonix/fx19/keyboard.json index 4ef4730a5d..b940c914af 100644 --- a/keyboards/falsonix/fx19/keyboard.json +++ b/keyboards/falsonix/fx19/keyboard.json @@ -31,7 +31,6 @@ "rows": ["F0", "F1", "F4", "F5", "F6"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/fatotesa/keyboard.json b/keyboards/fatotesa/keyboard.json index ba6fc08d0c..dd74076812 100644 --- a/keyboards/fatotesa/keyboard.json +++ b/keyboards/fatotesa/keyboard.json @@ -42,7 +42,6 @@ "cols": ["F5", "F6", "F7", "B1", "B3", "B2", "B6", null], "rows": ["D4", "C6", "D7", "E6", "B4", "B5"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/fc660c/keyboard.json b/keyboards/fc660c/keyboard.json index 6c573fef88..6486bf0587 100644 --- a/keyboards/fc660c/keyboard.json +++ b/keyboards/fc660c/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FC660C", "manufacturer": "Hasu", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4853", diff --git a/keyboards/fc980c/keyboard.json b/keyboards/fc980c/keyboard.json index 9944dd3899..b22747ba15 100644 --- a/keyboards/fc980c/keyboard.json +++ b/keyboards/fc980c/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FC980C", "manufacturer": "Hasu", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4853", diff --git a/keyboards/flehrad/numbrero/keyboard.json b/keyboards/flehrad/numbrero/keyboard.json index f72b06ca7c..723204fbc1 100644 --- a/keyboards/flehrad/numbrero/keyboard.json +++ b/keyboards/flehrad/numbrero/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Numbrero", "manufacturer": "Flehrad", - "url": "", "maintainer": "Flehrad", "usb": { "vid": "0xFEED", diff --git a/keyboards/flehrad/snagpad/keyboard.json b/keyboards/flehrad/snagpad/keyboard.json index 1b2a2c4ae1..48022f5518 100644 --- a/keyboards/flehrad/snagpad/keyboard.json +++ b/keyboards/flehrad/snagpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Snagpad", "manufacturer": "Flehrad", - "url": "", "maintainer": "Flehrad", "usb": { "vid": "0x4443", diff --git a/keyboards/flehrad/tradestation/keyboard.json b/keyboards/flehrad/tradestation/keyboard.json index 757325ceaf..f99ee313d3 100644 --- a/keyboards/flehrad/tradestation/keyboard.json +++ b/keyboards/flehrad/tradestation/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Trade Station", "manufacturer": "Flehrad", - "url": "", "maintainer": "Flehrad", "usb": { "vid": "0xFEED", diff --git a/keyboards/fluorite/keyboard.json b/keyboards/fluorite/keyboard.json index 37e74c387c..17824c36b7 100644 --- a/keyboards/fluorite/keyboard.json +++ b/keyboards/fluorite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "fluorite", "manufacturer": "ihotsuno", - "url": "", "maintainer": "ihotsuno, qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/flx/virgo/keyboard.json b/keyboards/flx/virgo/keyboard.json index 996425282d..73100da1e9 100644 --- a/keyboards/flx/virgo/keyboard.json +++ b/keyboards/flx/virgo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Virgo", "manufacturer": "FLX", - "url": "", "maintainer": "mechmerlin", "usb": { "vid": "0x4658", diff --git a/keyboards/foostan/cornelius/keyboard.json b/keyboards/foostan/cornelius/keyboard.json index 75cf098c4d..4f9312825e 100644 --- a/keyboards/foostan/cornelius/keyboard.json +++ b/keyboards/foostan/cornelius/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cornelius", "manufacturer": "Yushakobo", - "url": "", "maintainer": "foostan", "usb": { "vid": "0x3265", diff --git a/keyboards/fortitude60/rev1/keyboard.json b/keyboards/fortitude60/rev1/keyboard.json index 4ad8a723b7..3970a78404 100644 --- a/keyboards/fortitude60/rev1/keyboard.json +++ b/keyboards/fortitude60/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Fortitude60", "manufacturer": "Pekaso", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCB10", diff --git a/keyboards/foxlab/key65/hotswap/keyboard.json b/keyboards/foxlab/key65/hotswap/keyboard.json index b21893fa88..c635903804 100644 --- a/keyboards/foxlab/key65/hotswap/keyboard.json +++ b/keyboards/foxlab/key65/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Key 65 Hotswap", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/key65/universal/keyboard.json b/keyboards/foxlab/key65/universal/keyboard.json index daaa1b37b1..94cc4c94c2 100644 --- a/keyboards/foxlab/key65/universal/keyboard.json +++ b/keyboards/foxlab/key65/universal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Key 65 Universal", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/leaf60/hotswap/keyboard.json b/keyboards/foxlab/leaf60/hotswap/keyboard.json index 55639853e9..20dd487c27 100644 --- a/keyboards/foxlab/leaf60/hotswap/keyboard.json +++ b/keyboards/foxlab/leaf60/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Leaf 60 Hotswap", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/leaf60/universal/keyboard.json b/keyboards/foxlab/leaf60/universal/keyboard.json index 93bfe45cce..758e949aa2 100644 --- a/keyboards/foxlab/leaf60/universal/keyboard.json +++ b/keyboards/foxlab/leaf60/universal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Leaf 60 Universal", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/time80/keyboard.json b/keyboards/foxlab/time80/keyboard.json index 9902ed770d..d4111207ed 100644 --- a/keyboards/foxlab/time80/keyboard.json +++ b/keyboards/foxlab/time80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Time80", "manufacturer": "Fox Lab", - "url": "", "maintainer": "lukelex", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/time_re/hotswap/keyboard.json b/keyboards/foxlab/time_re/hotswap/keyboard.json index cfef3317f2..2391284ee0 100644 --- a/keyboards/foxlab/time_re/hotswap/keyboard.json +++ b/keyboards/foxlab/time_re/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Time 80 Reforged", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/foxlab/time_re/universal/keyboard.json b/keyboards/foxlab/time_re/universal/keyboard.json index b53364a589..cd4fca6df8 100644 --- a/keyboards/foxlab/time_re/universal/keyboard.json +++ b/keyboards/foxlab/time_re/universal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Time 80 Reforged", "manufacturer": "Fox Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x464C", diff --git a/keyboards/ft/mars65/keyboard.json b/keyboards/ft/mars65/keyboard.json index 3b6f5ec8a9..ab5e968b90 100644 --- a/keyboards/ft/mars65/keyboard.json +++ b/keyboards/ft/mars65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mars 6.5", "manufacturer": "FT", - "url": "", "maintainer": "wonderbeel", "usb": { "vid": "0x20A0", diff --git a/keyboards/ft/mars80/keyboard.json b/keyboards/ft/mars80/keyboard.json index 1d5e53dcbe..4862e84ab9 100644 --- a/keyboards/ft/mars80/keyboard.json +++ b/keyboards/ft/mars80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mars 8.0", "manufacturer": "FT", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/funky40/keyboard.json b/keyboards/funky40/keyboard.json index d76b9eee2e..0aafa58041 100644 --- a/keyboards/funky40/keyboard.json +++ b/keyboards/funky40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Funky40", "manufacturer": "TheFourthCow", - "url": "", "maintainer": "TheFourthCow", "usb": { "vid": "0xFEED", diff --git a/keyboards/gami_studio/lex60/keyboard.json b/keyboards/gami_studio/lex60/keyboard.json index be1715c844..d458d6a667 100644 --- a/keyboards/gami_studio/lex60/keyboard.json +++ b/keyboards/gami_studio/lex60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lex60", "manufacturer": "Evyd13", - "url": "", "maintainer": "GamiStudio", "usb": { "vid": "0x7353", diff --git a/keyboards/gboards/butterstick/keyboard.json b/keyboards/gboards/butterstick/keyboard.json index 59d703925b..80204f6ba9 100644 --- a/keyboards/gboards/butterstick/keyboard.json +++ b/keyboards/gboards/butterstick/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Butter Stick", "manufacturer": "g Heavy Industries", - "url": "", "maintainer": "germ", "usb": { "vid": "0xFEED", diff --git a/keyboards/gboards/gergoplex/keyboard.json b/keyboards/gboards/gergoplex/keyboard.json index cf1e451392..111f7b8f2c 100644 --- a/keyboards/gboards/gergoplex/keyboard.json +++ b/keyboards/gboards/gergoplex/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GergoPlex", "manufacturer": "g Heavy Industries", - "url": "", "maintainer": "germ", "usb": { "vid": "0x6B0A", diff --git a/keyboards/geekboards/tester/keyboard.json b/keyboards/geekboards/tester/keyboard.json index 743e5e2392..57073ebdc0 100644 --- a/keyboards/geekboards/tester/keyboard.json +++ b/keyboards/geekboards/tester/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tester", "manufacturer": "Geekboards", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0xFEED", diff --git a/keyboards/ggkeyboards/genesis/hotswap/keyboard.json b/keyboards/ggkeyboards/genesis/hotswap/keyboard.json index 5cd4f07716..cb5e94cf38 100644 --- a/keyboards/ggkeyboards/genesis/hotswap/keyboard.json +++ b/keyboards/ggkeyboards/genesis/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Genesis Hotswap", "manufacturer": "GG Keyboards", - "url": "", "maintainer": "Spooknik", "usb": { "vid": "0xBB00", diff --git a/keyboards/ggkeyboards/genesis/solder/keyboard.json b/keyboards/ggkeyboards/genesis/solder/keyboard.json index 485be430e5..15fcc2334b 100644 --- a/keyboards/ggkeyboards/genesis/solder/keyboard.json +++ b/keyboards/ggkeyboards/genesis/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Genesis Solder", "manufacturer": "GG Keyboards", - "url": "", "maintainer": "Spooknik", "usb": { "vid": "0xBB00", diff --git a/keyboards/gh60/revc/keyboard.json b/keyboards/gh60/revc/keyboard.json index 4f90f2540c..8e1c03c151 100644 --- a/keyboards/gh60/revc/keyboard.json +++ b/keyboards/gh60/revc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GH60 Rev C", "manufacturer": "geekhack", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4335", diff --git a/keyboards/gh60/satan/keyboard.json b/keyboards/gh60/satan/keyboard.json index e3f2685297..864e5fa90d 100644 --- a/keyboards/gh60/satan/keyboard.json +++ b/keyboards/gh60/satan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GH60 Satan", "manufacturer": "SATAN", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4335", diff --git a/keyboards/gh60/v1p3/keyboard.json b/keyboards/gh60/v1p3/keyboard.json index 18ac7608bb..34d8c992b4 100644 --- a/keyboards/gh60/v1p3/keyboard.json +++ b/keyboards/gh60/v1p3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GH60 v1.3", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/gh80_3000/keyboard.json b/keyboards/gh80_3000/keyboard.json index c88f5c8232..929f11f7c0 100644 --- a/keyboards/gh80_3000/keyboard.json +++ b/keyboards/gh80_3000/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GH80-3000", "manufacturer": "farmakon", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/ghs/jem/info.json b/keyboards/ghs/jem/info.json index 21d9bf0e6b..4bda443ac5 100644 --- a/keyboards/ghs/jem/info.json +++ b/keyboards/ghs/jem/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "GHS.JEM", "manufacturer": "Gone Hacking Studio", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0x0645", diff --git a/keyboards/ghs/xls/keyboard.json b/keyboards/ghs/xls/keyboard.json index f062f32af8..acd916884a 100644 --- a/keyboards/ghs/xls/keyboard.json +++ b/keyboards/ghs/xls/keyboard.json @@ -19,7 +19,6 @@ "indicators": { "num_lock": "B0" }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/gkeyboard/gkb_m16/keyboard.json b/keyboards/gkeyboard/gkb_m16/keyboard.json index 1f1fe50a67..fe846b4bd2 100644 --- a/keyboards/gkeyboard/gkb_m16/keyboard.json +++ b/keyboards/gkeyboard/gkb_m16/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GKB-M16", "manufacturer": "gkeyboard", - "url": "", "maintainer": "gkeyboard", "usb": { "vid": "0x474B", diff --git a/keyboards/gl516/xr63gl/keyboard.json b/keyboards/gl516/xr63gl/keyboard.json index ddeb425462..808bd9d1b1 100644 --- a/keyboards/gl516/xr63gl/keyboard.json +++ b/keyboards/gl516/xr63gl/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP26", "GP27", "GP28", "GP29", "GP0", "GP3", "GP4", "GP2", "GP1"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/glenpickle/chimera_ergo/keyboard.json b/keyboards/glenpickle/chimera_ergo/keyboard.json index 038498fd10..d2b4d93b9d 100644 --- a/keyboards/glenpickle/chimera_ergo/keyboard.json +++ b/keyboards/glenpickle/chimera_ergo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chimera Ergo", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/glenpickle/chimera_ls/keyboard.json b/keyboards/glenpickle/chimera_ls/keyboard.json index b0d6a52912..23c870c74d 100644 --- a/keyboards/glenpickle/chimera_ls/keyboard.json +++ b/keyboards/glenpickle/chimera_ls/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chimera Lets Split", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/gon/nerd60/keyboard.json b/keyboards/gon/nerd60/keyboard.json index 590b3f3d9e..01cbaf3cd0 100644 --- a/keyboards/gon/nerd60/keyboard.json +++ b/keyboards/gon/nerd60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NerD 60", "manufacturer": "GON", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E45", diff --git a/keyboards/gon/nerdtkl/keyboard.json b/keyboards/gon/nerdtkl/keyboard.json index ccf13ec325..ae9db2553b 100644 --- a/keyboards/gon/nerdtkl/keyboard.json +++ b/keyboards/gon/nerdtkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NerD TKL", "manufacturer": "GON", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E45", diff --git a/keyboards/gopolar/gg86/keyboard.json b/keyboards/gopolar/gg86/keyboard.json index b704582aa6..a9944beea9 100644 --- a/keyboards/gopolar/gg86/keyboard.json +++ b/keyboards/gopolar/gg86/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GG86 Tai-Chi", "manufacturer": "Gopolar", - "url": "", "maintainer": "Gopolar", "usb": { "vid": "0x0007", diff --git a/keyboards/gray_studio/cod67/keyboard.json b/keyboards/gray_studio/cod67/keyboard.json index fa946d9b33..e0a71c6703 100644 --- a/keyboards/gray_studio/cod67/keyboard.json +++ b/keyboards/gray_studio/cod67/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "COD67", "manufacturer": "Graystudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4753", diff --git a/keyboards/gray_studio/hb85/keyboard.json b/keyboards/gray_studio/hb85/keyboard.json index 61387a2709..0fcf30a925 100644 --- a/keyboards/gray_studio/hb85/keyboard.json +++ b/keyboards/gray_studio/hb85/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HB85", "manufacturer": "Gray Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4753", diff --git a/keyboards/gray_studio/space65/keyboard.json b/keyboards/gray_studio/space65/keyboard.json index ffe825ff4c..6534f165a8 100644 --- a/keyboards/gray_studio/space65/keyboard.json +++ b/keyboards/gray_studio/space65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Space65", "manufacturer": "Graystudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4753", diff --git a/keyboards/gray_studio/think65/hotswap/keyboard.json b/keyboards/gray_studio/think65/hotswap/keyboard.json index c2dba58190..a38f648eca 100644 --- a/keyboards/gray_studio/think65/hotswap/keyboard.json +++ b/keyboards/gray_studio/think65/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Think6.5\u00b0 Hotswap", "manufacturer": "Graystudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4753", diff --git a/keyboards/gray_studio/think65/solder/keyboard.json b/keyboards/gray_studio/think65/solder/keyboard.json index 09096a854e..283516b60a 100644 --- a/keyboards/gray_studio/think65/solder/keyboard.json +++ b/keyboards/gray_studio/think65/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Think6.5\u00b0", "manufacturer": "Graystudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4753", diff --git a/keyboards/grid600/press/keyboard.json b/keyboards/grid600/press/keyboard.json index 74c3e7aad1..8e8ae09f1c 100644 --- a/keyboards/grid600/press/keyboard.json +++ b/keyboards/grid600/press/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "PRESS", "manufacturer": "Grid", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/gvalchca/ga150/keyboard.json b/keyboards/gvalchca/ga150/keyboard.json index 38028799fa..cdea8ea976 100644 --- a/keyboards/gvalchca/ga150/keyboard.json +++ b/keyboards/gvalchca/ga150/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GA15.0", "manufacturer": "Gvalchca", - "url": "", "maintainer": "Gvalchca", "usb": { "vid": "0x6776", diff --git a/keyboards/h0oni/deskpad/keyboard.json b/keyboards/h0oni/deskpad/keyboard.json index d7ad53cd43..1d84fe3ee4 100644 --- a/keyboards/h0oni/deskpad/keyboard.json +++ b/keyboards/h0oni/deskpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Deskpad", "manufacturer": "Hydrogen", - "url": "", "maintainer": "Hydrogen BD", "usb": { "vid": "0x4D53", diff --git a/keyboards/h0oni/hotduck/keyboard.json b/keyboards/h0oni/hotduck/keyboard.json index bdb2386021..a2a709d71d 100644 --- a/keyboards/h0oni/hotduck/keyboard.json +++ b/keyboards/h0oni/hotduck/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "hotDuck", "manufacturer": "h0oni", - "url": "", "maintainer": "h0oni", "usb": { "vid": "0x4D53", diff --git a/keyboards/hadron/info.json b/keyboards/hadron/info.json index 1d25e18f30..1268c24a10 100644 --- a/keyboards/hadron/info.json +++ b/keyboards/hadron/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hadron", "manufacturer": "ishtob", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFB30", diff --git a/keyboards/halokeys/elemental75/keyboard.json b/keyboards/halokeys/elemental75/keyboard.json index 866916b69b..b26d094c4b 100644 --- a/keyboards/halokeys/elemental75/keyboard.json +++ b/keyboards/halokeys/elemental75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Elemental75", "manufacturer": "Halokeys", - "url": "", "maintainer": "shamit05", "usb": { "vid": "0xEA0B", diff --git a/keyboards/handwired/108key_trackpoint/keyboard.json b/keyboards/handwired/108key_trackpoint/keyboard.json index 94acb1a26c..0e8e1a0963 100644 --- a/keyboards/handwired/108key_trackpoint/keyboard.json +++ b/keyboards/handwired/108key_trackpoint/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "108Key-TrackPoint", "manufacturer": "QMK", - "url": "", "maintainer": "mkem114", "usb": { "vid": "0x1234", diff --git a/keyboards/handwired/2x5keypad/keyboard.json b/keyboards/handwired/2x5keypad/keyboard.json index 0b146f165b..f4ee815c10 100644 --- a/keyboards/handwired/2x5keypad/keyboard.json +++ b/keyboards/handwired/2x5keypad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "2x5keypad", "manufacturer": "Jonathan Cameron", - "url": "", "maintainer": "jmcameron", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/3dfoxc/keyboard.json b/keyboards/handwired/3dfoxc/keyboard.json index 7675acd73b..1475d52ab4 100644 --- a/keyboards/handwired/3dfoxc/keyboard.json +++ b/keyboards/handwired/3dfoxc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "3dfoxc", "manufacturer": "dlgoodr", - "url": "", "maintainer": "dlgoodr", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/3dortho14u/rev1/keyboard.json b/keyboards/handwired/3dortho14u/rev1/keyboard.json index 63773d405f..3a3c872d3a 100644 --- a/keyboards/handwired/3dortho14u/rev1/keyboard.json +++ b/keyboards/handwired/3dortho14u/rev1/keyboard.json @@ -1,7 +1,6 @@ { "manufacturer": "xia0", "keyboard_name": "3dortho14u", - "url": "", "maintainer": "xia0", "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/handwired/3dortho14u/rev2/keyboard.json b/keyboards/handwired/3dortho14u/rev2/keyboard.json index 9e048d643d..831e24e118 100644 --- a/keyboards/handwired/3dortho14u/rev2/keyboard.json +++ b/keyboards/handwired/3dortho14u/rev2/keyboard.json @@ -1,7 +1,6 @@ { "manufacturer": "xia0", "keyboard_name": "3dortho14u", - "url": "", "maintainer": "xia0", "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/handwired/3dp660/keyboard.json b/keyboards/handwired/3dp660/keyboard.json index c1c4c13e7e..5b26aaecc6 100644 --- a/keyboards/handwired/3dp660/keyboard.json +++ b/keyboards/handwired/3dp660/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "3dp660", "manufacturer": "gooberpsycho", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x676F", diff --git a/keyboards/handwired/3dp660_oled/keyboard.json b/keyboards/handwired/3dp660_oled/keyboard.json index ef863b3b52..c687a8bbb4 100644 --- a/keyboards/handwired/3dp660_oled/keyboard.json +++ b/keyboards/handwired/3dp660_oled/keyboard.json @@ -22,7 +22,6 @@ "rows": ["D5", "B0", "B5", "B4", "E6", "D7", "C6", "D4", "D2", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3661", diff --git a/keyboards/handwired/412_64/keyboard.json b/keyboards/handwired/412_64/keyboard.json index c0f27dcb91..f80611178e 100644 --- a/keyboards/handwired/412_64/keyboard.json +++ b/keyboards/handwired/412_64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "412-64 Model 00", "manufacturer": "EDI/SCI", - "url": "", "maintainer": "fateeverywhere", "usb": { "vid": "0xF7E0", diff --git a/keyboards/handwired/42/keyboard.json b/keyboards/handwired/42/keyboard.json index 45801b7773..7dbb5827df 100644 --- a/keyboards/handwired/42/keyboard.json +++ b/keyboards/handwired/42/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "42", "manufacturer": "nglgzz", - "url": "", "maintainer": "nglgzz", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/6macro/keyboard.json b/keyboards/handwired/6macro/keyboard.json index 702008de34..10c59bbbac 100644 --- a/keyboards/handwired/6macro/keyboard.json +++ b/keyboards/handwired/6macro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "6macro", "manufacturer": "joaofbmaia", - "url": "", "maintainer": "joaofbmaia", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/aek64/keyboard.json b/keyboards/handwired/aek64/keyboard.json index a06ed6decc..0a57e17927 100644 --- a/keyboards/handwired/aek64/keyboard.json +++ b/keyboards/handwired/aek64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AEK64", "manufacturer": "4sStylZ and others makers", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/alcor_dactyl/keyboard.json b/keyboards/handwired/alcor_dactyl/keyboard.json index b38d39bfcc..81d0228dd6 100644 --- a/keyboards/handwired/alcor_dactyl/keyboard.json +++ b/keyboards/handwired/alcor_dactyl/keyboard.json @@ -4,7 +4,6 @@ "maintainer": "rocketstrong", "bootloader": "rp2040", "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/handwired/aplx2/keyboard.json b/keyboards/handwired/aplx2/keyboard.json index 6a9d7130bd..3e43576f58 100644 --- a/keyboards/handwired/aplx2/keyboard.json +++ b/keyboards/handwired/aplx2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Aplx2", "manufacturer": "Aplyard", - "url": "", "maintainer": "Aplyard", "usb": { "vid": "0xE0E0", diff --git a/keyboards/handwired/arrow_pad/keyboard.json b/keyboards/handwired/arrow_pad/keyboard.json index 237c1f0749..f70645fe2a 100644 --- a/keyboards/handwired/arrow_pad/keyboard.json +++ b/keyboards/handwired/arrow_pad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GoldPad", "manufacturer": "Nobody", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/atreus50/keyboard.json b/keyboards/handwired/atreus50/keyboard.json index 961d1959b0..029d622f98 100644 --- a/keyboards/handwired/atreus50/keyboard.json +++ b/keyboards/handwired/atreus50/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atreus50", "manufacturer": "Hexwire", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBB80", diff --git a/keyboards/handwired/bdn9_ble/keyboard.json b/keyboards/handwired/bdn9_ble/keyboard.json index 20f020504c..27ed008f43 100644 --- a/keyboards/handwired/bdn9_ble/keyboard.json +++ b/keyboards/handwired/bdn9_ble/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BDN9-BLE", "manufacturer": "KeyPCB/Keebio", - "url": "", "maintainer": "merlin04", "usb": { "vid": "0xCB10", diff --git a/keyboards/handwired/bigmac/keyboard.json b/keyboards/handwired/bigmac/keyboard.json index 8eff62a7ea..40592658a1 100644 --- a/keyboards/handwired/bigmac/keyboard.json +++ b/keyboards/handwired/bigmac/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigMac", "manufacturer": "Taylore101", - "url": "", "maintainer": "Taylore101", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/boss566y/redragon_vara/keyboard.json b/keyboards/handwired/boss566y/redragon_vara/keyboard.json index b75caa6544..579cfe0576 100644 --- a/keyboards/handwired/boss566y/redragon_vara/keyboard.json +++ b/keyboards/handwired/boss566y/redragon_vara/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Redragon Vara", "manufacturer": "PH", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5048", diff --git a/keyboards/handwired/brain/keyboard.json b/keyboards/handwired/brain/keyboard.json index c5f8c3682c..9593ad4471 100644 --- a/keyboards/handwired/brain/keyboard.json +++ b/keyboards/handwired/brain/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Brain", "manufacturer": "Klackygears", - "url": "", "maintainer": "Klackygears", "usb": { "vid": "0x4A53", diff --git a/keyboards/handwired/cans12er/keyboard.json b/keyboards/handwired/cans12er/keyboard.json index 9d08706423..31fe7ebc83 100644 --- a/keyboards/handwired/cans12er/keyboard.json +++ b/keyboards/handwired/cans12er/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cans12er", "manufacturer": "Can", - "url": "", "maintainer": "canbaytok", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/chiron/keyboard.json b/keyboards/handwired/chiron/keyboard.json index 1685a9d477..7000421646 100644 --- a/keyboards/handwired/chiron/keyboard.json +++ b/keyboards/handwired/chiron/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chiron", "manufacturer": "Mike Hix", - "url": "", "maintainer": "musl", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/ck4x4/keyboard.json b/keyboards/handwired/ck4x4/keyboard.json index 642408cc0e..717820f9fc 100644 --- a/keyboards/handwired/ck4x4/keyboard.json +++ b/keyboards/handwired/ck4x4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CK4x4", "manufacturer": "QMK", - "url": "", "maintainer": "awkannan", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/cmd60/keyboard.json b/keyboards/handwired/cmd60/keyboard.json index f9733a7582..05872439c9 100644 --- a/keyboards/handwired/cmd60/keyboard.json +++ b/keyboards/handwired/cmd60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CMD60", "manufacturer": "cmd", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/colorlice/keyboard.json b/keyboards/handwired/colorlice/keyboard.json index 4ccc10527c..7292137dff 100644 --- a/keyboards/handwired/colorlice/keyboard.json +++ b/keyboards/handwired/colorlice/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ColorLice", "manufacturer": "marhalloweenvt", - "url": "", "maintainer": "marhalloweenvt", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/croxsplit44/keyboard.json b/keyboards/handwired/croxsplit44/keyboard.json index d497942b95..0d29f6fd66 100644 --- a/keyboards/handwired/croxsplit44/keyboard.json +++ b/keyboards/handwired/croxsplit44/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "splitcustom44", "manufacturer": "Samux6146", - "url": "", "maintainer": "Samux6146", "usb": { "vid": "0xB62C", diff --git a/keyboards/handwired/curiosity/keyboard.json b/keyboards/handwired/curiosity/keyboard.json index e95fa25e71..85428b33ca 100644 --- a/keyboards/handwired/curiosity/keyboard.json +++ b/keyboards/handwired/curiosity/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Curiosity", "manufacturer": "Spaceman", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0x5342", diff --git a/keyboards/handwired/d48/keyboard.json b/keyboards/handwired/d48/keyboard.json index 99c8a67326..a0266e475e 100644 --- a/keyboards/handwired/d48/keyboard.json +++ b/keyboards/handwired/d48/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "D48", "manufacturer": "Andrew Dunai", - "url": "", "maintainer": "and3rson", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/dactyl/keyboard.json b/keyboards/handwired/dactyl/keyboard.json index 58baf228ca..6026469176 100644 --- a/keyboards/handwired/dactyl/keyboard.json +++ b/keyboards/handwired/dactyl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl", "manufacturer": "Adereth", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/dactyl_kinesis/keyboard.json b/keyboards/handwired/dactyl_kinesis/keyboard.json index 26993fc974..a536159532 100644 --- a/keyboards/handwired/dactyl_kinesis/keyboard.json +++ b/keyboards/handwired/dactyl_kinesis/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Kinesis", "manufacturer": "dmik", - "url": "", "maintainer": "dmik", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_left/keyboard.json b/keyboards/handwired/dactyl_left/keyboard.json index cfb3ad1489..2a2254f578 100644 --- a/keyboards/handwired/dactyl_left/keyboard.json +++ b/keyboards/handwired/dactyl_left/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "dactyl_left", "manufacturer": "RedForty", - "url": "", "maintainer": "RedForty", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json index ce4b6c648b..e66bfa2ff6 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Manuform 4x5", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json index 0d8af5eed1..f69fb8d426 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Manuform 4x6", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json index ab916b0353..d4674042a2 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Manuform 4x6 5 thumb keys", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json index 1bcba1b648..020bf43fdd 100644 --- a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x6)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json index 7a0cff5e6c..739eb573ff 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x6+2)", "manufacturer": "tshort", - "url": "", "maintainer": "jceb", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json index 0694447ee9..7c89289bb2 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x6)", "manufacturer": "tshort", - "url": "", "maintainer": "jceb", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json index 7d51a06c7c..33d8c3c080 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x6) 68 Keys", "manufacturer": "kpagratis", - "url": "", "maintainer": "kpagratis", "development_board": "promicro", "usb": { diff --git a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json index cf5f579057..2534a76d78 100644 --- a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x7)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/5x8/keyboard.json b/keyboards/handwired/dactyl_manuform/5x8/keyboard.json index 24ac4924ac..2ac3010717 100644 --- a/keyboards/handwired/dactyl_manuform/5x8/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (5x8)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/6x6/info.json b/keyboards/handwired/dactyl_manuform/6x6/info.json index 080e4e1942..3a26d38af1 100644 --- a/keyboards/handwired/dactyl_manuform/6x6/info.json +++ b/keyboards/handwired/dactyl_manuform/6x6/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (6x6)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json index a011a2cc3b..e60fa249f4 100644 --- a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (6x6+4)", "manufacturer": "tshort", - "url": "", "maintainer": "dmik", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json index bb016647da..7d1e72ff9e 100644 --- a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl-Manuform (6x7)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x444D", diff --git a/keyboards/handwired/dactyl_maximus/keyboard.json b/keyboards/handwired/dactyl_maximus/keyboard.json index 57e91cc3f4..f9f5160ee6 100644 --- a/keyboards/handwired/dactyl_maximus/keyboard.json +++ b/keyboards/handwired/dactyl_maximus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Maximus", "manufacturer": "handwired", - "url": "", "maintainer": "dunk2k", "usb": { "vid": "0x444C", diff --git a/keyboards/handwired/dactyl_promicro/keyboard.json b/keyboards/handwired/dactyl_promicro/keyboard.json index df82505d94..86576b3e09 100644 --- a/keyboards/handwired/dactyl_promicro/keyboard.json +++ b/keyboards/handwired/dactyl_promicro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Ergo(6x6)", "manufacturer": "tshort", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/daishi/keyboard.json b/keyboards/handwired/daishi/keyboard.json index 22044faab3..d774f13a5b 100644 --- a/keyboards/handwired/daishi/keyboard.json +++ b/keyboards/handwired/daishi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Daishi", "manufacturer": "MetaMechs", - "url": "", "maintainer": "Croktopus", "usb": { "vid": "0x6D6D", diff --git a/keyboards/handwired/datahand/keyboard.json b/keyboards/handwired/datahand/keyboard.json index c2c7dab421..1f1ebc07ee 100644 --- a/keyboards/handwired/datahand/keyboard.json +++ b/keyboards/handwired/datahand/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DataHand", "manufacturer": "DataHand", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x13BA", diff --git a/keyboards/handwired/ddg_56/keyboard.json b/keyboards/handwired/ddg_56/keyboard.json index e211821dae..5d4a21bba6 100644 --- a/keyboards/handwired/ddg_56/keyboard.json +++ b/keyboards/handwired/ddg_56/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DDG_56", "manufacturer": "Spaceman", - "url": "", "maintainer": "spaceman", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/eagleii/keyboard.json b/keyboards/handwired/eagleii/keyboard.json index 4179a4cdd6..43a4d5a2f7 100644 --- a/keyboards/handwired/eagleii/keyboard.json +++ b/keyboards/handwired/eagleii/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "II", "manufacturer": "Eagle", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/elrgo_s/keyboard.json b/keyboards/handwired/elrgo_s/keyboard.json index c0ae4beadb..2a0e57dabe 100644 --- a/keyboards/handwired/elrgo_s/keyboard.json +++ b/keyboards/handwired/elrgo_s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Elrgo S", "manufacturer": "Eloren", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x454C", diff --git a/keyboards/handwired/ergocheap/keyboard.json b/keyboards/handwired/ergocheap/keyboard.json index 8728b486a8..879cf8a4d1 100644 --- a/keyboards/handwired/ergocheap/keyboard.json +++ b/keyboards/handwired/ergocheap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ergocheap", "manufacturer": "xSteins", - "url": "", "maintainer": "xSteins", "usb": { "vid": "0xFEDE", diff --git a/keyboards/handwired/fc200rt_qmk/keyboard.json b/keyboards/handwired/fc200rt_qmk/keyboard.json index aab792e7bd..7e45cbdb62 100644 --- a/keyboards/handwired/fc200rt_qmk/keyboard.json +++ b/keyboards/handwired/fc200rt_qmk/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "fc200rt_qmk", "manufacturer": "NaCly", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBEEF", diff --git a/keyboards/handwired/fivethirteen/keyboard.json b/keyboards/handwired/fivethirteen/keyboard.json index 9046fc53ba..f6492d3e0b 100644 --- a/keyboards/handwired/fivethirteen/keyboard.json +++ b/keyboards/handwired/fivethirteen/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "fivethirteen", "manufacturer": "rdg", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/gamenum/keyboard.json b/keyboards/handwired/gamenum/keyboard.json index 50a3962108..010f9526db 100644 --- a/keyboards/handwired/gamenum/keyboard.json +++ b/keyboards/handwired/gamenum/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GameNum", "manufacturer": "Seth-Senpai", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1234", diff --git a/keyboards/handwired/hacked_motospeed/keyboard.json b/keyboards/handwired/hacked_motospeed/keyboard.json index 1a38cdafdc..17f85a7e9d 100644 --- a/keyboards/handwired/hacked_motospeed/keyboard.json +++ b/keyboards/handwired/hacked_motospeed/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hacked Motospeed", "manufacturer": "MMO_Corp", - "url": "", "maintainer": "Deckweiss", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/hexon38/keyboard.json b/keyboards/handwired/hexon38/keyboard.json index dfc11eb532..1d3595aa38 100644 --- a/keyboards/handwired/hexon38/keyboard.json +++ b/keyboards/handwired/hexon38/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "hexon38", "manufacturer": "pepaslabs", - "url": "", "maintainer": "cellularmitosis", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/hnah108/keyboard.json b/keyboards/handwired/hnah108/keyboard.json index 3099ed8548..b4daac3fab 100644 --- a/keyboards/handwired/hnah108/keyboard.json +++ b/keyboards/handwired/hnah108/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hnah108", "manufacturer": "HnahKB", - "url": "", "maintainer": "HnahKB", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/hnah40rgb/keyboard.json b/keyboards/handwired/hnah40rgb/keyboard.json index b5bc58e910..4775259f35 100644 --- a/keyboards/handwired/hnah40rgb/keyboard.json +++ b/keyboards/handwired/hnah40rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hnah40V2", "manufacturer": "HnahKB", - "url": "", "maintainer": "HnahKB", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/hwpm87/keyboard.json b/keyboards/handwired/hwpm87/keyboard.json index 0dbbb0472a..302dc23316 100644 --- a/keyboards/handwired/hwpm87/keyboard.json +++ b/keyboards/handwired/hwpm87/keyboard.json @@ -2,7 +2,6 @@ "manufacturer": "KD-MM2", "keyboard_name": "hwpm87", "maintainer": "KD-MM2", - "url": "", "usb": { "vid": "0xFEED", "pid": "0x0001", diff --git a/keyboards/handwired/iso85k/keyboard.json b/keyboards/handwired/iso85k/keyboard.json index 625a356e30..415bcf54f0 100644 --- a/keyboards/handwired/iso85k/keyboard.json +++ b/keyboards/handwired/iso85k/keyboard.json @@ -17,7 +17,6 @@ "rows": ["C7", "C6", "B15", "B14", "B13", "B12"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xCAFE", diff --git a/keyboards/handwired/itstleo9/info.json b/keyboards/handwired/itstleo9/info.json index ba9de4d774..dba1078701 100644 --- a/keyboards/handwired/itstleo9/info.json +++ b/keyboards/handwired/itstleo9/info.json @@ -11,7 +11,6 @@ "mousekey": true, "nkro": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/handwired/jankrp2040dactyl/keyboard.json b/keyboards/handwired/jankrp2040dactyl/keyboard.json index 485da14b66..ff49cef6a2 100644 --- a/keyboards/handwired/jankrp2040dactyl/keyboard.json +++ b/keyboards/handwired/jankrp2040dactyl/keyboard.json @@ -25,7 +25,6 @@ }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/handwired/jn68m/keyboard.json b/keyboards/handwired/jn68m/keyboard.json index e2c833b002..d2c506c8c9 100644 --- a/keyboards/handwired/jn68m/keyboard.json +++ b/keyboards/handwired/jn68m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JN68M", "manufacturer": "MxBlue", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xC714", diff --git a/keyboards/handwired/jot50/keyboard.json b/keyboards/handwired/jot50/keyboard.json index d272ffc6b1..a3c1c1fbe1 100644 --- a/keyboards/handwired/jot50/keyboard.json +++ b/keyboards/handwired/jot50/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jot50", "manufacturer": "Jotix", - "url": "", "maintainer": "jotix", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/jotpad16/keyboard.json b/keyboards/handwired/jotpad16/keyboard.json index 6a8a5db44c..c5f8511da8 100644 --- a/keyboards/handwired/jotpad16/keyboard.json +++ b/keyboards/handwired/jotpad16/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JotPad16", "manufacturer": "Jotix", - "url": "", "maintainer": "jotix", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/jtallbean/split_65/keyboard.json b/keyboards/handwired/jtallbean/split_65/keyboard.json index b10e6c6cc0..86d4de0195 100644 --- a/keyboards/handwired/jtallbean/split_65/keyboard.json +++ b/keyboards/handwired/jtallbean/split_65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "split_65", "manufacturer": "jtallbean", - "url": "", "maintainer": "samlli", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/k8split/keyboard.json b/keyboards/handwired/k8split/keyboard.json index 62ea64604a..186cf804e1 100644 --- a/keyboards/handwired/k8split/keyboard.json +++ b/keyboards/handwired/k8split/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "k8split", "manufacturer": "Ckat", - "url": "", "maintainer": "Ckath", "usb": { "vid": "0xC81D", diff --git a/keyboards/handwired/k_numpad17/keyboard.json b/keyboards/handwired/k_numpad17/keyboard.json index 7d48cd1f3e..de52ca88af 100644 --- a/keyboards/handwired/k_numpad17/keyboard.json +++ b/keyboards/handwired/k_numpad17/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "K-Numpad17", "manufacturer": "Handwired", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/kbod/keyboard.json b/keyboards/handwired/kbod/keyboard.json index 91926b554d..a025952119 100644 --- a/keyboards/handwired/kbod/keyboard.json +++ b/keyboards/handwired/kbod/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kbod", "manufacturer": "fudanchii", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/ks63/keyboard.json b/keyboards/handwired/ks63/keyboard.json index 09e59975e8..da0d2e0a3f 100644 --- a/keyboards/handwired/ks63/keyboard.json +++ b/keyboards/handwired/ks63/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ks63", "manufacturer": "kleshwong", - "url": "", "maintainer": "Klesh Wong", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/lemonpad/keyboard.json b/keyboards/handwired/lemonpad/keyboard.json index aab7b94692..dea15dcc3c 100644 --- a/keyboards/handwired/lemonpad/keyboard.json +++ b/keyboards/handwired/lemonpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "lemonpad", "manufacturer": "dari-studios", - "url": "", "maintainer": "dari-studios", "usb": { "vid": "0x6473", diff --git a/keyboards/handwired/macroboard/info.json b/keyboards/handwired/macroboard/info.json index 5c27c96ae9..adef955b9d 100644 --- a/keyboards/handwired/macroboard/info.json +++ b/keyboards/handwired/macroboard/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Macroboard", "manufacturer": "QMK", - "url": "", "maintainer": "Micha\u0142 Szczepaniak", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/magicforce61/keyboard.json b/keyboards/handwired/magicforce61/keyboard.json index e15cc0590e..e66f9dfe9c 100644 --- a/keyboards/handwired/magicforce61/keyboard.json +++ b/keyboards/handwired/magicforce61/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Magicforce 61", "manufacturer": "Hexwire", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/magicforce68/keyboard.json b/keyboards/handwired/magicforce68/keyboard.json index 6567c8b1cf..1101dd6001 100644 --- a/keyboards/handwired/magicforce68/keyboard.json +++ b/keyboards/handwired/magicforce68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Magicforce 68", "manufacturer": "Hexwire", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/marek128b/ergosplit44/keyboard.json b/keyboards/handwired/marek128b/ergosplit44/keyboard.json index f9a88576a7..7e14cbc172 100644 --- a/keyboards/handwired/marek128b/ergosplit44/keyboard.json +++ b/keyboards/handwired/marek128b/ergosplit44/keyboard.json @@ -21,7 +21,6 @@ "rows": ["GP2", "GP3", "GP4", "GP5"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/handwired/mechboards_micropad/keyboard.json b/keyboards/handwired/mechboards_micropad/keyboard.json index 65ef6fb5b4..7f830771c3 100644 --- a/keyboards/handwired/mechboards_micropad/keyboard.json +++ b/keyboards/handwired/mechboards_micropad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mechboards Micropad", "manufacturer": "Yiancar", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/handwired/minorca/keyboard.json b/keyboards/handwired/minorca/keyboard.json index 9ac1f52d13..0d27200cb1 100644 --- a/keyboards/handwired/minorca/keyboard.json +++ b/keyboards/handwired/minorca/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Minorca", "manufacturer": "panc.co", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/ms_sculpt_mobile/info.json b/keyboards/handwired/ms_sculpt_mobile/info.json index 918f166c61..33e250b682 100644 --- a/keyboards/handwired/ms_sculpt_mobile/info.json +++ b/keyboards/handwired/ms_sculpt_mobile/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Microsoftplus", - "url": "", "maintainer": "qmk", "features": { "bootmagic": false, diff --git a/keyboards/handwired/myskeeb/keyboard.json b/keyboards/handwired/myskeeb/keyboard.json index c75f40cf46..d6805a400c 100644 --- a/keyboards/handwired/myskeeb/keyboard.json +++ b/keyboards/handwired/myskeeb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MySKeeb", "manufacturer": "DAG3", - "url": "", "maintainer": "su8044", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/nicekey/keyboard.json b/keyboards/handwired/nicekey/keyboard.json index fe7267ab84..66866de548 100644 --- a/keyboards/handwired/nicekey/keyboard.json +++ b/keyboards/handwired/nicekey/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "nicekey", "manufacturer": "Lukas", - "url": "", "maintainer": "spydon", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/nortontechpad/keyboard.json b/keyboards/handwired/nortontechpad/keyboard.json index e90b6b5482..25fceb93da 100644 --- a/keyboards/handwired/nortontechpad/keyboard.json +++ b/keyboards/handwired/nortontechpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NortonTechPad", "manufacturer": "NortonTech", - "url": "", "maintainer": "NortonTech", "usb": { "vid": "0x9879", diff --git a/keyboards/handwired/not_so_minidox/keyboard.json b/keyboards/handwired/not_so_minidox/keyboard.json index fa68a823af..abd1f43708 100644 --- a/keyboards/handwired/not_so_minidox/keyboard.json +++ b/keyboards/handwired/not_so_minidox/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Not So MiniDox", "manufacturer": "mtdjr", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/novem/keyboard.json b/keyboards/handwired/novem/keyboard.json index c824f7809c..47c0a1bca6 100644 --- a/keyboards/handwired/novem/keyboard.json +++ b/keyboards/handwired/novem/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "novem", "manufacturer": "Jose I. Martinez", - "url": "", "maintainer": "Jose I. Martinez", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/nozbe_macro/keyboard.json b/keyboards/handwired/nozbe_macro/keyboard.json index 584509ad18..494d52d221 100644 --- a/keyboards/handwired/nozbe_macro/keyboard.json +++ b/keyboards/handwired/nozbe_macro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Nozbe Reunion Pad", "manufacturer": "Leon Omelan", - "url": "", "maintainer": "Leon Omelan", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/numpad20/keyboard.json b/keyboards/handwired/numpad20/keyboard.json index e47cfc5df5..4f4254cf12 100644 --- a/keyboards/handwired/numpad20/keyboard.json +++ b/keyboards/handwired/numpad20/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Numpad 20", "manufacturer": "Hexwire", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBB80", diff --git a/keyboards/handwired/obuwunkunubi/spaget/keyboard.json b/keyboards/handwired/obuwunkunubi/spaget/keyboard.json index 238736705d..44d22e71d6 100644 --- a/keyboards/handwired/obuwunkunubi/spaget/keyboard.json +++ b/keyboards/handwired/obuwunkunubi/spaget/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "spaget", "manufacturer": "obuwunkunubi", - "url": "", "maintainer": "obuwunkunubi", "usb": { "vid": "0x1337", diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json index 5cf7c600ee..577cb68a6b 100644 --- a/keyboards/handwired/onekey/info.json +++ b/keyboards/handwired/onekey/info.json @@ -1,6 +1,5 @@ { "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/ortho5x13/keyboard.json b/keyboards/handwired/ortho5x13/keyboard.json index 23591b5046..6dea79ab92 100644 --- a/keyboards/handwired/ortho5x13/keyboard.json +++ b/keyboards/handwired/ortho5x13/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho 5x13", "manufacturer": "Hexwire", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBB80", diff --git a/keyboards/handwired/ortho5x14/keyboard.json b/keyboards/handwired/ortho5x14/keyboard.json index 1e6828190b..281ad1c0e0 100644 --- a/keyboards/handwired/ortho5x14/keyboard.json +++ b/keyboards/handwired/ortho5x14/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho5 x14", "manufacturer": "MPInc", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBB80", diff --git a/keyboards/handwired/ortho_brass/keyboard.json b/keyboards/handwired/ortho_brass/keyboard.json index 5cd01b1f6d..2f0fe7b685 100644 --- a/keyboards/handwired/ortho_brass/keyboard.json +++ b/keyboards/handwired/ortho_brass/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ortho Brass", "manufacturer": "BifbofII", - "url": "", "maintainer": "BifbofII", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/osborne1/keyboard.json b/keyboards/handwired/osborne1/keyboard.json index 8cbcb3cc8b..eacc77ff59 100644 --- a/keyboards/handwired/osborne1/keyboard.json +++ b/keyboards/handwired/osborne1/keyboard.json @@ -21,7 +21,6 @@ "rows": ["D0", "B7", "B5", "C6", "D1", "B6", "D7", "D6"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x239A", diff --git a/keyboards/handwired/p65rgb/keyboard.json b/keyboards/handwired/p65rgb/keyboard.json index b80a1e7f49..a0c75b7e4f 100644 --- a/keyboards/handwired/p65rgb/keyboard.json +++ b/keyboards/handwired/p65rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "p65rgb", "manufacturer": "marhalloweenvt", - "url": "", "maintainer": "marhalloweenvt", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/pilcrow/keyboard.json b/keyboards/handwired/pilcrow/keyboard.json index b44a4e2d3d..f490ac33b6 100644 --- a/keyboards/handwired/pilcrow/keyboard.json +++ b/keyboards/handwired/pilcrow/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "pilcrow", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/postageboard/info.json b/keyboards/handwired/postageboard/info.json index 2f4e674d59..b34c2b3fbe 100644 --- a/keyboards/handwired/postageboard/info.json +++ b/keyboards/handwired/postageboard/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Postage Board", "manufacturer": "LifeIsOnTheWire", - "url": "", "maintainer": "LifeIsOnTheWire", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/promethium/keyboard.json b/keyboards/handwired/promethium/keyboard.json index 6ee1ed8ca1..fa72908039 100644 --- a/keyboards/handwired/promethium/keyboard.json +++ b/keyboards/handwired/promethium/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Promethium", "manufacturer": "Priyadi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x17EF", diff --git a/keyboards/handwired/protype/keyboard.json b/keyboards/handwired/protype/keyboard.json index 69f196abc4..dbbc17ba86 100644 --- a/keyboards/handwired/protype/keyboard.json +++ b/keyboards/handwired/protype/keyboard.json @@ -15,7 +15,6 @@ "cols": ["GP12", "GP9", "GP10", "GP0", "GP1", "GP5", "GP6", "GP2", "GP3", "GP4"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xB7D7", diff --git a/keyboards/handwired/pteron/keyboard.json b/keyboards/handwired/pteron/keyboard.json index 7aa2470cc1..acaa1b7d62 100644 --- a/keyboards/handwired/pteron/keyboard.json +++ b/keyboards/handwired/pteron/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pteron", "manufacturer": "QMK", - "url": "", "maintainer": "FSund", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/pteron38/keyboard.json b/keyboards/handwired/pteron38/keyboard.json index 266aefec1f..f0c219f2e2 100644 --- a/keyboards/handwired/pteron38/keyboard.json +++ b/keyboards/handwired/pteron38/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pteron38", "manufacturer": "QMK", - "url": "", "maintainer": "fidelcoria", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/pteron44/keyboard.json b/keyboards/handwired/pteron44/keyboard.json index 26321317eb..497fd95f58 100644 --- a/keyboards/handwired/pteron44/keyboard.json +++ b/keyboards/handwired/pteron44/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pteron44", "manufacturer": "QMK", - "url": "", "maintainer": "fidelcoria", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/qc60/proto/keyboard.json b/keyboards/handwired/qc60/proto/keyboard.json index 810df8b7ae..b9919c4465 100644 --- a/keyboards/handwired/qc60/proto/keyboard.json +++ b/keyboards/handwired/qc60/proto/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "QC60", "manufacturer": "PeiorisBoards", - "url": "", "maintainer": "coarse", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/rd_61_qmk/keyboard.json b/keyboards/handwired/rd_61_qmk/keyboard.json index be07d95924..bca23af959 100644 --- a/keyboards/handwired/rd_61_qmk/keyboard.json +++ b/keyboards/handwired/rd_61_qmk/keyboard.json @@ -52,7 +52,6 @@ "led_count": 1, "saturation_steps": 8 }, - "url": "", "ws2812": { "pin": "C7" }, diff --git a/keyboards/handwired/retro_refit/keyboard.json b/keyboards/handwired/retro_refit/keyboard.json index 7acdb48b44..73e747fffa 100644 --- a/keyboards/handwired/retro_refit/keyboard.json +++ b/keyboards/handwired/retro_refit/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "retro_refit", "manufacturer": "Nobody", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/riblee_f401/keyboard.json b/keyboards/handwired/riblee_f401/keyboard.json index 53fc613760..6fc3fbe474 100644 --- a/keyboards/handwired/riblee_f401/keyboard.json +++ b/keyboards/handwired/riblee_f401/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Handwired F401", "manufacturer": "Riblee", - "url": "", "maintainer": "riblee", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/riblee_f411/keyboard.json b/keyboards/handwired/riblee_f411/keyboard.json index 47d6349ba7..1688220573 100644 --- a/keyboards/handwired/riblee_f411/keyboard.json +++ b/keyboards/handwired/riblee_f411/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Handwired F411", "manufacturer": "Riblee", - "url": "", "maintainer": "riblee", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/riblee_split/keyboard.json b/keyboards/handwired/riblee_split/keyboard.json index f24dbe2ce6..9748bf1ec2 100644 --- a/keyboards/handwired/riblee_split/keyboard.json +++ b/keyboards/handwired/riblee_split/keyboard.json @@ -17,7 +17,6 @@ "rows": ["A4", "A3", "A2", "A1", "A0"] }, "development_board": "blackpill_f411", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0xFEED", diff --git a/keyboards/handwired/rs60/keyboard.json b/keyboards/handwired/rs60/keyboard.json index 1536474343..5bbabd8bbd 100644 --- a/keyboards/handwired/rs60/keyboard.json +++ b/keyboards/handwired/rs60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rs60", "manufacturer": "rs", - "url": "", "maintainer": "rs", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/sejin_eat1010r2/keyboard.json b/keyboards/handwired/sejin_eat1010r2/keyboard.json index f2cfef37a8..e31a0063b5 100644 --- a/keyboards/handwired/sejin_eat1010r2/keyboard.json +++ b/keyboards/handwired/sejin_eat1010r2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "EAT-1010R2", "manufacturer": "Sejin", - "url": "", "maintainer": "DmNosachev", "usb": { "vid": "0x515A", diff --git a/keyboards/handwired/sick68/keyboard.json b/keyboards/handwired/sick68/keyboard.json index 339484791f..81a9577f36 100644 --- a/keyboards/handwired/sick68/keyboard.json +++ b/keyboards/handwired/sick68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "sick68", "manufacturer": "umbynos", - "url": "", "maintainer": "umbynos", "usb": { "vid": "0x5E68", diff --git a/keyboards/handwired/skakunm_dactyl/keyboard.json b/keyboards/handwired/skakunm_dactyl/keyboard.json index 5d87f23f7b..d14023e6c0 100644 --- a/keyboards/handwired/skakunm_dactyl/keyboard.json +++ b/keyboards/handwired/skakunm_dactyl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dactyl Min (3x5_5)", "manufacturer": "skakunm", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/slash/keyboard.json b/keyboards/handwired/slash/keyboard.json index a682624d8e..ea1248c48e 100644 --- a/keyboards/handwired/slash/keyboard.json +++ b/keyboards/handwired/slash/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Slash", "manufacturer": "asdftemp", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/snatchpad/keyboard.json b/keyboards/handwired/snatchpad/keyboard.json index d06fe2c003..61a8555135 100644 --- a/keyboards/handwired/snatchpad/keyboard.json +++ b/keyboards/handwired/snatchpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "snatchpad", "manufacturer": "xia0", - "url": "", "maintainer": "xia0", "usb": { "vid": "0x6662", diff --git a/keyboards/handwired/sono1/info.json b/keyboards/handwired/sono1/info.json index 85e86051c3..6eed0e45d5 100644 --- a/keyboards/handwired/sono1/info.json +++ b/keyboards/handwired/sono1/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sono1", "manufacturer": "ASKeyboard", - "url": "", "maintainer": "DmNosachev", "features": { "bootmagic": true, diff --git a/keyboards/handwired/space_oddity/keyboard.json b/keyboards/handwired/space_oddity/keyboard.json index ca4e10d16b..a432372d97 100644 --- a/keyboards/handwired/space_oddity/keyboard.json +++ b/keyboards/handwired/space_oddity/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Space Oddity", "manufacturer": "James Taylor", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/splittest/info.json b/keyboards/handwired/splittest/info.json index 07cac23aad..bbfe538255 100644 --- a/keyboards/handwired/splittest/info.json +++ b/keyboards/handwired/splittest/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Split Tester", "manufacturer": "Keebio", - "url": "", "maintainer": "nooges", "usb": { "vid": "0xCB10", diff --git a/keyboards/handwired/steamvan/rev1/keyboard.json b/keyboards/handwired/steamvan/rev1/keyboard.json index 9c4593bca7..575f5f1a7c 100644 --- a/keyboards/handwired/steamvan/rev1/keyboard.json +++ b/keyboards/handwired/steamvan/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SteamVan rev1", "manufacturer": "John M Daly", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json b/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json index 5f524ea445..2dc64b445e 100644 --- a/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json +++ b/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "Split_5x7", - "url": "", "maintainer": "stef9998", "manufacturer": "Stef9998", "usb": { diff --git a/keyboards/handwired/sticc14/keyboard.json b/keyboards/handwired/sticc14/keyboard.json index b3fb4a06e5..4fd89780ee 100644 --- a/keyboards/handwired/sticc14/keyboard.json +++ b/keyboards/handwired/sticc14/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sticc14", "manufacturer": "u/ergorius", - "url": "", "maintainer": "erkhal", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/swiftrax/cowfish/keyboard.json b/keyboards/handwired/swiftrax/cowfish/keyboard.json index efa8c39d19..b4387bb94b 100644 --- a/keyboards/handwired/swiftrax/cowfish/keyboard.json +++ b/keyboards/handwired/swiftrax/cowfish/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CowFish", "manufacturer": "Swiftrax", - "url": "", "maintainer": "swiftrax", "usb": { "vid": "0x04D8", diff --git a/keyboards/handwired/symmetric70_proto/info.json b/keyboards/handwired/symmetric70_proto/info.json index ecd0d38c24..e0bd2f9c91 100644 --- a/keyboards/handwired/symmetric70_proto/info.json +++ b/keyboards/handwired/symmetric70_proto/info.json @@ -1,6 +1,5 @@ { "manufacturer": "mtei", - "url": "", "maintainer": "mtei", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/symmetry60/keyboard.json b/keyboards/handwired/symmetry60/keyboard.json index 40afdf88c9..461e412457 100644 --- a/keyboards/handwired/symmetry60/keyboard.json +++ b/keyboards/handwired/symmetry60/keyboard.json @@ -1,7 +1,6 @@ { "Keyboard_name": "Symmetry60", "manufacturer": "Marhalloweenvt", - "url": "", "maintainer": "marhalloweenvt", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/t111/keyboard.json b/keyboards/handwired/t111/keyboard.json index f65a3f087e..a43968e062 100644 --- a/keyboards/handwired/t111/keyboard.json +++ b/keyboards/handwired/t111/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "T111", "manufacturer": "FUJITSU", - "url": "", "maintainer": "DmNosachev", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/terminus_mini/keyboard.json b/keyboards/handwired/terminus_mini/keyboard.json index 09346c81bf..0e1fdcee91 100644 --- a/keyboards/handwired/terminus_mini/keyboard.json +++ b/keyboards/handwired/terminus_mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Terminus Mini", "manufacturer": "James Morgan", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/tkk/keyboard.json b/keyboards/handwired/tkk/keyboard.json index 91e495081f..3cf67ce24e 100644 --- a/keyboards/handwired/tkk/keyboard.json +++ b/keyboards/handwired/tkk/keyboard.json @@ -17,7 +17,6 @@ ] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/handwired/trackpoint/keyboard.json b/keyboards/handwired/trackpoint/keyboard.json index 09fadd1dc6..1cd10dbb47 100644 --- a/keyboards/handwired/trackpoint/keyboard.json +++ b/keyboards/handwired/trackpoint/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Trackpoint Demo", "manufacturer": "QMK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1234", diff --git a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json index 37633e5a56..cc651bec95 100644 --- a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json +++ b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "Tractyl Manuform (4x6)", - "url": "", "maintainer": "drashna", "usb": { "pid": "0x3537", diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/info.json b/keyboards/handwired/tractyl_manuform/5x6_right/info.json index b28f309fdb..fe3f2432ca 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/info.json +++ b/keyboards/handwired/tractyl_manuform/5x6_right/info.json @@ -1,5 +1,4 @@ { - "url": "", "usb": { "pid": "0x3536", "device_version": "0.0.1" diff --git a/keyboards/handwired/traveller/keyboard.json b/keyboards/handwired/traveller/keyboard.json index e6941036f5..31161efe64 100644 --- a/keyboards/handwired/traveller/keyboard.json +++ b/keyboards/handwired/traveller/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Traveller", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/twig/twig50/keyboard.json b/keyboards/handwired/twig/twig50/keyboard.json index f1cc2f5a96..67054b6795 100644 --- a/keyboards/handwired/twig/twig50/keyboard.json +++ b/keyboards/handwired/twig/twig50/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "twig50", "manufacturer": "Twig", - "url": "", "maintainer": "nodatk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/unicomp_mini_m/keyboard.json b/keyboards/handwired/unicomp_mini_m/keyboard.json index 50ae033028..b66b50ab46 100644 --- a/keyboards/handwired/unicomp_mini_m/keyboard.json +++ b/keyboards/handwired/unicomp_mini_m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Unicomp Mini M", "manufacturer": "stevendlander", - "url": "", "maintainer": "stevendlander", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/uthol/info.json b/keyboards/handwired/uthol/info.json index 7270e23172..a5c1a0c0c9 100644 --- a/keyboards/handwired/uthol/info.json +++ b/keyboards/handwired/uthol/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Uthol", - "url": "", "maintainer": "uthol", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/woodpad/keyboard.json b/keyboards/handwired/woodpad/keyboard.json index e6c07b2c42..baf30d0bdc 100644 --- a/keyboards/handwired/woodpad/keyboard.json +++ b/keyboards/handwired/woodpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Woodpad", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/wulkan/keyboard.json b/keyboards/handwired/wulkan/keyboard.json index eceeb5c145..c804409b7d 100644 --- a/keyboards/handwired/wulkan/keyboard.json +++ b/keyboards/handwired/wulkan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Handwired48Keys", "manufacturer": "Wulkan", - "url": "", "maintainer": "Napoleon Wulkan", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/wwa/helios/keyboard.json b/keyboards/handwired/wwa/helios/keyboard.json index 64b2010396..af894cad64 100644 --- a/keyboards/handwired/wwa/helios/keyboard.json +++ b/keyboards/handwired/wwa/helios/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP4", "GP5", "GP6"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/handwired/wwa/kepler/keyboard.json b/keyboards/handwired/wwa/kepler/keyboard.json index f962d632b4..2b1ac39337 100644 --- a/keyboards/handwired/wwa/kepler/keyboard.json +++ b/keyboards/handwired/wwa/kepler/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP9", "GP10", "GP11"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/handwired/wwa/mercury/keyboard.json b/keyboards/handwired/wwa/mercury/keyboard.json index bb89858da2..2a31875b01 100644 --- a/keyboards/handwired/wwa/mercury/keyboard.json +++ b/keyboards/handwired/wwa/mercury/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP4", "GP5"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0003", diff --git a/keyboards/handwired/wwa/soyuz/keyboard.json b/keyboards/handwired/wwa/soyuz/keyboard.json index 9670f312a6..1783782754 100644 --- a/keyboards/handwired/wwa/soyuz/keyboard.json +++ b/keyboards/handwired/wwa/soyuz/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP7", "GP8", "GP9"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0004", diff --git a/keyboards/handwired/wwa/soyuzxl/keyboard.json b/keyboards/handwired/wwa/soyuzxl/keyboard.json index 9180344176..98f4bc649d 100644 --- a/keyboards/handwired/wwa/soyuzxl/keyboard.json +++ b/keyboards/handwired/wwa/soyuzxl/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B5", "B2", "B3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0005", diff --git a/keyboards/handwired/xealous/rev1/keyboard.json b/keyboards/handwired/xealous/rev1/keyboard.json index 9f926a3602..55e99eeb54 100644 --- a/keyboards/handwired/xealous/rev1/keyboard.json +++ b/keyboards/handwired/xealous/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XeaL60", "manufacturer": "XeaLouS", - "url": "", "maintainer": "alex-ong", "usb": { "vid": "0x4131", diff --git a/keyboards/handwired/z150/keyboard.json b/keyboards/handwired/z150/keyboard.json index 38c92a6537..e3e7b5c769 100644 --- a/keyboards/handwired/z150/keyboard.json +++ b/keyboards/handwired/z150/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Z150", "manufacturer": "ALPS", - "url": "", "maintainer": "DmNosachev", "usb": { "vid": "0xFEED", diff --git a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json index 5d4ca7a254..decb70c78e 100644 --- a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json +++ b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json @@ -141,6 +141,5 @@ } }, "manufacturer": "Coom", - "maintainer": "coomstoolbox", - "url": "" + "maintainer": "coomstoolbox" } diff --git a/keyboards/hardlineworks/otd_plus/keyboard.json b/keyboards/hardlineworks/otd_plus/keyboard.json index e0afc03893..38d9f40ae8 100644 --- a/keyboards/hardlineworks/otd_plus/keyboard.json +++ b/keyboards/hardlineworks/otd_plus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OTD-PLUS", "manufacturer": "Hardlineworks", - "url": "", "maintainer": "Hardlineworks", "usb": { "vid": "0x484C", diff --git a/keyboards/heliar/wm1_hotswap/keyboard.json b/keyboards/heliar/wm1_hotswap/keyboard.json index 789a3c7d2b..704710d948 100644 --- a/keyboards/heliar/wm1_hotswap/keyboard.json +++ b/keyboards/heliar/wm1_hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "wm1 hotswap", "manufacturer": "Heliar", - "url": "", "maintainer": "heliar", "usb": { "vid": "0xFEED", diff --git a/keyboards/helix/rev3_4rows/keyboard.json b/keyboards/helix/rev3_4rows/keyboard.json index 537c332d5c..3d44e8fe78 100644 --- a/keyboards/helix/rev3_4rows/keyboard.json +++ b/keyboards/helix/rev3_4rows/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Helix rev3 4rows", "manufacturer": "yushakobo", - "url": "", "maintainer": "yushakobo", "usb": { "vid": "0x3265", diff --git a/keyboards/helix/rev3_5rows/keyboard.json b/keyboards/helix/rev3_5rows/keyboard.json index 485cfd924f..12328ea86d 100644 --- a/keyboards/helix/rev3_5rows/keyboard.json +++ b/keyboards/helix/rev3_5rows/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Helix rev3 5rows", "manufacturer": "yushakobo", - "url": "", "maintainer": "yushakobo", "usb": { "vid": "0x3265", diff --git a/keyboards/herevoland/buff75/keyboard.json b/keyboards/herevoland/buff75/keyboard.json index 15f3e27ac1..32b17cff61 100644 --- a/keyboards/herevoland/buff75/keyboard.json +++ b/keyboards/herevoland/buff75/keyboard.json @@ -3,7 +3,6 @@ "processor": "STM32F103", "bootloader": "stm32duino", "manufacturer": "HereVoLand", - "url": "", "maintainer": "Here VoLand @Vem", "usb": { "vid": "0xB727", diff --git a/keyboards/hfdkb/ac001/keyboard.json b/keyboards/hfdkb/ac001/keyboard.json index 87f6e40bc3..b5fd8eb4a9 100644 --- a/keyboards/hfdkb/ac001/keyboard.json +++ b/keyboards/hfdkb/ac001/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ac001", "manufacturer": "hfd", - "url": "", "maintainer": "jonylee@hfd", "usb": { "vid": "0xFFFE", diff --git a/keyboards/hhkb/ansi/info.json b/keyboards/hhkb/ansi/info.json index 16349fc6e2..ff2c1bba6e 100644 --- a/keyboards/hhkb/ansi/info.json +++ b/keyboards/hhkb/ansi/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "ANSI", "manufacturer": "HHKB", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4848", diff --git a/keyboards/hhkb/jp/keyboard.json b/keyboards/hhkb/jp/keyboard.json index d745f21d20..db96a92a6c 100644 --- a/keyboards/hhkb/jp/keyboard.json +++ b/keyboards/hhkb/jp/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JP", "manufacturer": "HHKB", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4848", diff --git a/keyboards/hhkb/yang/keyboard.json b/keyboards/hhkb/yang/keyboard.json index a5725d6afa..7af8a62934 100644 --- a/keyboards/hhkb/yang/keyboard.json +++ b/keyboards/hhkb/yang/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HHKB BLE", "manufacturer": "YANG", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4848", diff --git a/keyboards/hhkb_lite_2/keyboard.json b/keyboards/hhkb_lite_2/keyboard.json index 3e9099f0e5..df69582b65 100644 --- a/keyboards/hhkb_lite_2/keyboard.json +++ b/keyboards/hhkb_lite_2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HHKB Lite 2", "manufacturer": "PFU", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x88B2", diff --git a/keyboards/hineybush/h08_ocelot/keyboard.json b/keyboards/hineybush/h08_ocelot/keyboard.json index bca579aab8..46de9a63f8 100644 --- a/keyboards/hineybush/h08_ocelot/keyboard.json +++ b/keyboards/hineybush/h08_ocelot/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h08", "manufacturer": "Hiney LLC", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h10/keyboard.json b/keyboards/hineybush/h10/keyboard.json index 63a109f484..b29061b51b 100644 --- a/keyboards/hineybush/h10/keyboard.json +++ b/keyboards/hineybush/h10/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h10", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h101/keyboard.json b/keyboards/hineybush/h101/keyboard.json index d1f8fa32a0..7d17c1922f 100644 --- a/keyboards/hineybush/h101/keyboard.json +++ b/keyboards/hineybush/h101/keyboard.json @@ -17,7 +17,6 @@ "rows": ["C13", "C14", "C15", "A0", "A1", "A2"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "0.0.1", "vid": "0x4069", diff --git a/keyboards/hineybush/h60/keyboard.json b/keyboards/hineybush/h60/keyboard.json index b7b24b2626..3ee6d66c17 100644 --- a/keyboards/hineybush/h60/keyboard.json +++ b/keyboards/hineybush/h60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h60", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h65/keyboard.json b/keyboards/hineybush/h65/keyboard.json index 8560c7774c..0c85733e7d 100644 --- a/keyboards/hineybush/h65/keyboard.json +++ b/keyboards/hineybush/h65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h65", "manufacturer": "Hiney LLC", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h65_hotswap/keyboard.json b/keyboards/hineybush/h65_hotswap/keyboard.json index 510836f22f..12e7f65330 100644 --- a/keyboards/hineybush/h65_hotswap/keyboard.json +++ b/keyboards/hineybush/h65_hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h65 hotswap", "manufacturer": "Hiney LLC", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h660s/keyboard.json b/keyboards/hineybush/h660s/keyboard.json index 44e8c8c21a..c1ca43de5b 100644 --- a/keyboards/hineybush/h660s/keyboard.json +++ b/keyboards/hineybush/h660s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h660s", "manufacturer": "hineybush", - "url": "", "maintainer": "Josh Hinnebusch", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h75_singa/keyboard.json b/keyboards/hineybush/h75_singa/keyboard.json index 0c3ca31e28..02d2b13d09 100644 --- a/keyboards/hineybush/h75_singa/keyboard.json +++ b/keyboards/hineybush/h75_singa/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h75_singa", "manufacturer": "Singa Keyboards", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h87_g2/keyboard.json b/keyboards/hineybush/h87_g2/keyboard.json index 13c17caa98..ae97c5aadd 100644 --- a/keyboards/hineybush/h87_g2/keyboard.json +++ b/keyboards/hineybush/h87_g2/keyboard.json @@ -25,7 +25,6 @@ "rows": ["A15", "B3", "B4", "A0", "B6", "B7"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/hineybush/h87a/keyboard.json b/keyboards/hineybush/h87a/keyboard.json index 42a50bf001..a03727e4f5 100644 --- a/keyboards/hineybush/h87a/keyboard.json +++ b/keyboards/hineybush/h87a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h87a", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h88/keyboard.json b/keyboards/hineybush/h88/keyboard.json index 6a9b3142e3..c623416e7a 100644 --- a/keyboards/hineybush/h88/keyboard.json +++ b/keyboards/hineybush/h88/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "h88", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/h88_g2/keyboard.json b/keyboards/hineybush/h88_g2/keyboard.json index 983cbcc1f5..a23216bd86 100644 --- a/keyboards/hineybush/h88_g2/keyboard.json +++ b/keyboards/hineybush/h88_g2/keyboard.json @@ -48,7 +48,6 @@ "saturation_steps": 8, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/hineybush/hbcp/keyboard.json b/keyboards/hineybush/hbcp/keyboard.json index e8771ea9a7..1ad6755e42 100644 --- a/keyboards/hineybush/hbcp/keyboard.json +++ b/keyboards/hineybush/hbcp/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "hbcp", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/hineyg80/keyboard.json b/keyboards/hineybush/hineyg80/keyboard.json index 933d689225..863be1d23b 100644 --- a/keyboards/hineybush/hineyg80/keyboard.json +++ b/keyboards/hineybush/hineyg80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "hineyG80", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0xFEED", diff --git a/keyboards/hineybush/ibis/keyboard.json b/keyboards/hineybush/ibis/keyboard.json index 8c2f6ca3fe..40cba1c8f9 100644 --- a/keyboards/hineybush/ibis/keyboard.json +++ b/keyboards/hineybush/ibis/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B0", "B1", "B2", "B3", "C7", "C6", "B4", "D7", "D5", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xEAA9", diff --git a/keyboards/hineybush/physix/keyboard.json b/keyboards/hineybush/physix/keyboard.json index 79a0bea7ab..ee6c5f3978 100644 --- a/keyboards/hineybush/physix/keyboard.json +++ b/keyboards/hineybush/physix/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "PhysiX", "manufacturer": "LZ", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hineybush/sm68/keyboard.json b/keyboards/hineybush/sm68/keyboard.json index 8350ca0380..f499fa605c 100644 --- a/keyboards/hineybush/sm68/keyboard.json +++ b/keyboards/hineybush/sm68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "sm68", "manufacturer": "hineybush", - "url": "", "maintainer": "hineybush", "usb": { "vid": "0x04D8", diff --git a/keyboards/hnahkb/freyr/keyboard.json b/keyboards/hnahkb/freyr/keyboard.json index 635c9d5989..ff83ecb532 100644 --- a/keyboards/hnahkb/freyr/keyboard.json +++ b/keyboards/hnahkb/freyr/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Freyr", "manufacturer": "HnahKB", - "url": "", "maintainer": "vuhopkep", "usb": { "vid": "0xFEED", diff --git a/keyboards/hnahkb/stella/keyboard.json b/keyboards/hnahkb/stella/keyboard.json index 7c69ec3de2..0a7ac5c109 100644 --- a/keyboards/hnahkb/stella/keyboard.json +++ b/keyboards/hnahkb/stella/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stella", "manufacturer": "HnahKB", - "url": "", "maintainer": "VGS", "usb": { "vid": "0xFEED", diff --git a/keyboards/holyswitch/lightweight65/keyboard.json b/keyboards/holyswitch/lightweight65/keyboard.json index 16a9f73737..bc2fdc9504 100644 --- a/keyboards/holyswitch/lightweight65/keyboard.json +++ b/keyboards/holyswitch/lightweight65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lightweight65", "manufacturer": "HolySwitch", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0x484F", diff --git a/keyboards/holyswitch/southpaw75/keyboard.json b/keyboards/holyswitch/southpaw75/keyboard.json index 1483e1fc31..e735895f20 100644 --- a/keyboards/holyswitch/southpaw75/keyboard.json +++ b/keyboards/holyswitch/southpaw75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "southpaw default", "manufacturer": "drewguy", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x484F", diff --git a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json index cef69593d7..6e8f7a00ff 100644 --- a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Black E6.5", "manufacturer": "HorrorTroll", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x7516", diff --git a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json index 77eac52ebd..f19a338721 100644 --- a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Devil68 Pro", "manufacturer": "HorrorTroll", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x7516", diff --git a/keyboards/horrortroll/handwired_k552/keyboard.json b/keyboards/horrortroll/handwired_k552/keyboard.json index 213cdf8086..97f8ec822c 100644 --- a/keyboards/horrortroll/handwired_k552/keyboard.json +++ b/keyboards/horrortroll/handwired_k552/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "K552 Kumara", "manufacturer": "HorrorTroll", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x7516", diff --git a/keyboards/horrortroll/lemon40/keyboard.json b/keyboards/horrortroll/lemon40/keyboard.json index 6303fb70bb..1c9993ca77 100644 --- a/keyboards/horrortroll/lemon40/keyboard.json +++ b/keyboards/horrortroll/lemon40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lemon40", "manufacturer": "HorrorTroll", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x7516", diff --git a/keyboards/hp69/keyboard.json b/keyboards/hp69/keyboard.json index 83ed922a27..577606be5d 100644 --- a/keyboards/hp69/keyboard.json +++ b/keyboards/hp69/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "hp69", "manufacturer": "Desiboards", - "url": "", "maintainer": "Ananya Kirti", "usb": { "vid": "0x416B", diff --git a/keyboards/hs60/v1/info.json b/keyboards/hs60/v1/info.json index c6ebae97ce..4c4e7d4e47 100644 --- a/keyboards/hs60/v1/info.json +++ b/keyboards/hs60/v1/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "HS60", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/hs60/v2/ansi/keyboard.json b/keyboards/hs60/v2/ansi/keyboard.json index e0781ef54b..d0ec52a50d 100644 --- a/keyboards/hs60/v2/ansi/keyboard.json +++ b/keyboards/hs60/v2/ansi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HS60 V2", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/hs60/v2/hhkb/keyboard.json b/keyboards/hs60/v2/hhkb/keyboard.json index 9bd4d111c2..327359b697 100644 --- a/keyboards/hs60/v2/hhkb/keyboard.json +++ b/keyboards/hs60/v2/hhkb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HS60 V2", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/hs60/v2/iso/keyboard.json b/keyboards/hs60/v2/iso/keyboard.json index a51dac05fa..e31ff53d7b 100644 --- a/keyboards/hs60/v2/iso/keyboard.json +++ b/keyboards/hs60/v2/iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "HS60 V2", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/hubble/keyboard.json b/keyboards/hubble/keyboard.json index 735cf4237d..2b75235cbb 100644 --- a/keyboards/hubble/keyboard.json +++ b/keyboards/hubble/keyboard.json @@ -37,7 +37,6 @@ "cols": ["F5", "F6", "B4", "E6", "D7", "C6", "D4", "D0"], "rows": ["D1", "F4", "F7", "B5", "B1", "B3", "B6", "B2"] }, - "url": "", "usb": { "vid": "0x4680", "pid": "0x1357", diff --git a/keyboards/icebreaker/hotswap/keyboard.json b/keyboards/icebreaker/hotswap/keyboard.json index ab55c5ae5f..5102da60c1 100644 --- a/keyboards/icebreaker/hotswap/keyboard.json +++ b/keyboards/icebreaker/hotswap/keyboard.json @@ -152,7 +152,6 @@ ], "max_brightness": 120 }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x6503", diff --git a/keyboards/idobao/id75/v1/keyboard.json b/keyboards/idobao/id75/v1/keyboard.json index f52938d0d8..ed3cae1305 100644 --- a/keyboards/idobao/id75/v1/keyboard.json +++ b/keyboards/idobao/id75/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ID75", "manufacturer": "IDOBAO", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6964", diff --git a/keyboards/idobao/id75/v2/keyboard.json b/keyboards/idobao/id75/v2/keyboard.json index 09e24dbd47..69cbc037c4 100644 --- a/keyboards/idobao/id75/v2/keyboard.json +++ b/keyboards/idobao/id75/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ID75", "manufacturer": "IDOBAO", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x6964", diff --git a/keyboards/idobao/id80/v2/info.json b/keyboards/idobao/id80/v2/info.json index 4d6e0773d8..66123fcb2a 100644 --- a/keyboards/idobao/id80/v2/info.json +++ b/keyboards/idobao/id80/v2/info.json @@ -1,6 +1,5 @@ { "manufacturer": "IDOBAO", - "url": "", "maintainer": "IDOBAOKB", "usb": { "vid": "0x6964", diff --git a/keyboards/igloo/keyboard.json b/keyboards/igloo/keyboard.json index 6e0cba498b..cf64823104 100644 --- a/keyboards/igloo/keyboard.json +++ b/keyboards/igloo/keyboard.json @@ -19,7 +19,6 @@ "rows": ["B7", "D0", "D1", "D2", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/illuminati/is0/keyboard.json b/keyboards/illuminati/is0/keyboard.json index ee90646b19..78bbe029ab 100644 --- a/keyboards/illuminati/is0/keyboard.json +++ b/keyboards/illuminati/is0/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "iS0", "manufacturer": "Illuminati Works", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/illusion/rosa/keyboard.json b/keyboards/illusion/rosa/keyboard.json index 29b7a2124d..f1077ecdbd 100644 --- a/keyboards/illusion/rosa/keyboard.json +++ b/keyboards/illusion/rosa/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rosa", "manufacturer": "illusion keyboards", - "url": "", "maintainer": "illusion", "usb": { "vid": "0x694B", diff --git a/keyboards/ilumkb/primus75/keyboard.json b/keyboards/ilumkb/primus75/keyboard.json index 15831ffda6..52d2982097 100644 --- a/keyboards/ilumkb/primus75/keyboard.json +++ b/keyboards/ilumkb/primus75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Primus75", "manufacturer": "moyi4681", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x445A", diff --git a/keyboards/ilumkb/simpler61/keyboard.json b/keyboards/ilumkb/simpler61/keyboard.json index 8e7680fb9f..a9fc9913c8 100644 --- a/keyboards/ilumkb/simpler61/keyboard.json +++ b/keyboards/ilumkb/simpler61/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Simpler61", "manufacturer": "Equalz", - "url": "", "maintainer": "Equalz", "usb": { "vid": "0xC3C3", diff --git a/keyboards/ilumkb/simpler64/keyboard.json b/keyboards/ilumkb/simpler64/keyboard.json index 65aa627b04..30ec37c977 100644 --- a/keyboards/ilumkb/simpler64/keyboard.json +++ b/keyboards/ilumkb/simpler64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Simpler64", "manufacturer": "Equalz", - "url": "", "maintainer": "Equalz", "usb": { "vid": "0xC3C3", diff --git a/keyboards/ilumkb/volcano660/keyboard.json b/keyboards/ilumkb/volcano660/keyboard.json index fa74e46fed..e353c8cce0 100644 --- a/keyboards/ilumkb/volcano660/keyboard.json +++ b/keyboards/ilumkb/volcano660/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Volcano660", "manufacturer": "DZTech", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x445A", diff --git a/keyboards/inett_studio/sqx/hotswap/keyboard.json b/keyboards/inett_studio/sqx/hotswap/keyboard.json index 432112e7f4..6c04e4fbe5 100644 --- a/keyboards/inett_studio/sqx/hotswap/keyboard.json +++ b/keyboards/inett_studio/sqx/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SQUARE.X", "manufacturer": "iNETT Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x694E", diff --git a/keyboards/inett_studio/sqx/universal/keyboard.json b/keyboards/inett_studio/sqx/universal/keyboard.json index 11bb224a0f..7c7b4e479e 100644 --- a/keyboards/inett_studio/sqx/universal/keyboard.json +++ b/keyboards/inett_studio/sqx/universal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SQUARE.X", "manufacturer": "iNETT Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x694E", diff --git a/keyboards/inland/mk47/keyboard.json b/keyboards/inland/mk47/keyboard.json index b6404f58b2..de6f792f6d 100644 --- a/keyboards/inland/mk47/keyboard.json +++ b/keyboards/inland/mk47/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "MK47", "manufacturer": "Inland", "maintainer": "jonylee@hfd", - "url":"", "usb": { "vid": "0xFFFE", "pid": "0x0002", diff --git a/keyboards/input_club/k_type/keyboard.json b/keyboards/input_club/k_type/keyboard.json index a4e8e2419e..3769bdae83 100644 --- a/keyboards/input_club/k_type/keyboard.json +++ b/keyboards/input_club/k_type/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "K-Type (QMK)", "manufacturer": "Input:Club", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1C11", diff --git a/keyboards/irene/keyboard.json b/keyboards/irene/keyboard.json index 3280c34c03..b9189bc864 100644 --- a/keyboards/irene/keyboard.json +++ b/keyboards/irene/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Irene", "manufacturer": "Andrei Collado", - "url": "", "maintainer": "Andrei Collado", "usb": { "vid": "0x1434", diff --git a/keyboards/iriskeyboards/keyboard.json b/keyboards/iriskeyboards/keyboard.json index 200c3a3f6a..c568e8e232 100644 --- a/keyboards/iriskeyboards/keyboard.json +++ b/keyboards/iriskeyboards/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iris Rev0", "manufacturer": "SonOfAres", - "url": "", "maintainer": "SonOfAres", "usb": { "vid": "0x494B", diff --git a/keyboards/iron180/keyboard.json b/keyboards/iron180/keyboard.json index 8daae1b1eb..90593faf8a 100644 --- a/keyboards/iron180/keyboard.json +++ b/keyboards/iron180/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iron180", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/j80/keyboard.json b/keyboards/j80/keyboard.json index 72745d262f..c7fee83834 100644 --- a/keyboards/j80/keyboard.json +++ b/keyboards/j80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "J80", "manufacturer": "JER", - "url": "", "maintainer": "oeywil", "usb": { "vid": "0x20A0", diff --git a/keyboards/jae/j01/keyboard.json b/keyboards/jae/j01/keyboard.json index fd16f2a46e..2375122bd8 100644 --- a/keyboards/jae/j01/keyboard.json +++ b/keyboards/jae/j01/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "J-01", "manufacturer": "Evyd13", - "url": "", "maintainer": "MechMerlin", "usb": { "vid": "0x4705", diff --git a/keyboards/jagdpietr/drakon/keyboard.json b/keyboards/jagdpietr/drakon/keyboard.json index 2d2b68a41a..dfb38ac200 100644 --- a/keyboards/jagdpietr/drakon/keyboard.json +++ b/keyboards/jagdpietr/drakon/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "drakon", "manufacturer": "jagdpietr", - "url": "", "maintainer": "jagdpietr", "usb": { "vid": "0xFEED", diff --git a/keyboards/jaykeeb/aumz_work/info.json b/keyboards/jaykeeb/aumz_work/info.json index 7ca2eb32b8..8a1107127a 100644 --- a/keyboards/jaykeeb/aumz_work/info.json +++ b/keyboards/jaykeeb/aumz_work/info.json @@ -3,7 +3,6 @@ "maintainer": "Alabahuy", "processor": "RP2040", "bootloader": "rp2040", - "url": "", "diode_direction": "COL2ROW", "features": { "bootmagic": true, diff --git a/keyboards/jaykeeb/jk60/keyboard.json b/keyboards/jaykeeb/jk60/keyboard.json index 3899d90699..813f4d1e87 100644 --- a/keyboards/jaykeeb/jk60/keyboard.json +++ b/keyboards/jaykeeb/jk60/keyboard.json @@ -21,7 +21,6 @@ "on_state": 0 }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x7760", diff --git a/keyboards/jaykeeb/jk60rgb/keyboard.json b/keyboards/jaykeeb/jk60rgb/keyboard.json index fd6876d563..45a708615e 100644 --- a/keyboards/jaykeeb/jk60rgb/keyboard.json +++ b/keyboards/jaykeeb/jk60rgb/keyboard.json @@ -154,7 +154,6 @@ ] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x7762", diff --git a/keyboards/jaykeeb/jk65/keyboard.json b/keyboards/jaykeeb/jk65/keyboard.json index 0be07caacd..320725509e 100644 --- a/keyboards/jaykeeb/jk65/keyboard.json +++ b/keyboards/jaykeeb/jk65/keyboard.json @@ -21,7 +21,6 @@ "on_state": 0 }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x7765", diff --git a/keyboards/jaykeeb/joker/keyboard.json b/keyboards/jaykeeb/joker/keyboard.json index ed8b59d03f..3d3663d38d 100644 --- a/keyboards/jaykeeb/joker/keyboard.json +++ b/keyboards/jaykeeb/joker/keyboard.json @@ -23,7 +23,6 @@ "on_state": 0 }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0795", diff --git a/keyboards/jaykeeb/kamigakushi/keyboard.json b/keyboards/jaykeeb/kamigakushi/keyboard.json index 6095d9cd87..72c6d19937 100644 --- a/keyboards/jaykeeb/kamigakushi/keyboard.json +++ b/keyboards/jaykeeb/kamigakushi/keyboard.json @@ -43,7 +43,6 @@ "rows": ["GP24", "GP29", "GP6", "GP15", "GP16"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0765", diff --git a/keyboards/jaykeeb/orba/keyboard.json b/keyboards/jaykeeb/orba/keyboard.json index b437667b14..8d6a27d90b 100644 --- a/keyboards/jaykeeb/orba/keyboard.json +++ b/keyboards/jaykeeb/orba/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP11", "GP10", "GP18", "GP19", "GP0" ] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0769", diff --git a/keyboards/jaykeeb/sebelas/keyboard.json b/keyboards/jaykeeb/sebelas/keyboard.json index e88607703e..4e5dc822b9 100644 --- a/keyboards/jaykeeb/sebelas/keyboard.json +++ b/keyboards/jaykeeb/sebelas/keyboard.json @@ -41,7 +41,6 @@ } }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0767", diff --git a/keyboards/jaykeeb/skyline/keyboard.json b/keyboards/jaykeeb/skyline/keyboard.json index 068c11a874..66d3390fc8 100644 --- a/keyboards/jaykeeb/skyline/keyboard.json +++ b/keyboards/jaykeeb/skyline/keyboard.json @@ -22,7 +22,6 @@ "rows": ["GP13", "GP27", "GP26", "GP25", "GP22", "GP23"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0799", diff --git a/keyboards/jaykeeb/tokki/keyboard.json b/keyboards/jaykeeb/tokki/keyboard.json index 0ab1150017..82c8056ebc 100644 --- a/keyboards/jaykeeb/tokki/keyboard.json +++ b/keyboards/jaykeeb/tokki/keyboard.json @@ -41,7 +41,6 @@ } }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0768", diff --git a/keyboards/jc65/v32a/keyboard.json b/keyboards/jc65/v32a/keyboard.json index 7fd13e0626..4cb14e54d4 100644 --- a/keyboards/jc65/v32a/keyboard.json +++ b/keyboards/jc65/v32a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JC65 BMC", "manufacturer": "RAMA", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1234", diff --git a/keyboards/jc65/v32u4/keyboard.json b/keyboards/jc65/v32u4/keyboard.json index 6a8d923507..0abdbf6a18 100644 --- a/keyboards/jc65/v32u4/keyboard.json +++ b/keyboards/jc65/v32u4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JC65", "manufacturer": "dou", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/jd40/keyboard.json b/keyboards/jd40/keyboard.json index f56602b215..062972d43f 100644 --- a/keyboards/jd40/keyboard.json +++ b/keyboards/jd40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "jd40", "manufacturer": "geekhack", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/jd45/keyboard.json b/keyboards/jd45/keyboard.json index 6c103ec6dd..559c5f1d26 100644 --- a/keyboards/jd45/keyboard.json +++ b/keyboards/jd45/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JD45", "manufacturer": "geekhack", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/jels/boaty/keyboard.json b/keyboards/jels/boaty/keyboard.json index 36fa9288ab..6bfcf25f16 100644 --- a/keyboards/jels/boaty/keyboard.json +++ b/keyboards/jels/boaty/keyboard.json @@ -6,7 +6,6 @@ "pid": "0x000B", "device_version": "1.0.0" }, - "url": "", "maintainer": "Jels", "processor": "atmega328p", "bootloader": "usbasploader", diff --git a/keyboards/jels/jels60/info.json b/keyboards/jels/jels60/info.json index 7194542d48..8f3e05e581 100644 --- a/keyboards/jels/jels60/info.json +++ b/keyboards/jels/jels60/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jels60", "manufacturer": "Jels", - "url": "", "maintainer": "Jels", "usb": { "vid": "0x006A", diff --git a/keyboards/jels/jels88/keyboard.json b/keyboards/jels/jels88/keyboard.json index e4d2c6e273..430396ccf1 100644 --- a/keyboards/jels/jels88/keyboard.json +++ b/keyboards/jels/jels88/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jels88", "manufacturer": "Jels", - "url": "", "maintainer": "Jels", "usb": { "vid": "0x006A", diff --git a/keyboards/jolofsor/denial75/keyboard.json b/keyboards/jolofsor/denial75/keyboard.json index df7c3157c9..14fbb07328 100644 --- a/keyboards/jolofsor/denial75/keyboard.json +++ b/keyboards/jolofsor/denial75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "denial75", "manufacturer": "jsor-hpoli", - "url": "", "maintainer": "jolofsor", "usb": { "vid": "0x4A48", diff --git a/keyboards/jukaie/jk01/keyboard.json b/keyboards/jukaie/jk01/keyboard.json index cde0b38034..3a6845258a 100644 --- a/keyboards/jukaie/jk01/keyboard.json +++ b/keyboards/jukaie/jk01/keyboard.json @@ -181,7 +181,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "0.0.2", "pid": "0x0002", diff --git a/keyboards/kabedon/kabedon78s/keyboard.json b/keyboards/kabedon/kabedon78s/keyboard.json index b875f9b35a..393dcd4b3e 100644 --- a/keyboards/kabedon/kabedon78s/keyboard.json +++ b/keyboards/kabedon/kabedon78s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "78S", "manufacturer": "Kabe_Don", - "url": "", "maintainer": "370490639", "usb": { "vid": "0x4B44", diff --git a/keyboards/kabedon/kabedon98e/keyboard.json b/keyboards/kabedon/kabedon98e/keyboard.json index beff70d5d9..85cc538d7d 100644 --- a/keyboards/kabedon/kabedon98e/keyboard.json +++ b/keyboards/kabedon/kabedon98e/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "98e", "manufacturer": "Kabe_Don", - "url": "", "maintainer": "370490639", "usb": { "vid": "0x4B44", diff --git a/keyboards/kagizaraya/chidori/keyboard.json b/keyboards/kagizaraya/chidori/keyboard.json index 2f9066149d..0187d55eec 100644 --- a/keyboards/kagizaraya/chidori/keyboard.json +++ b/keyboards/kagizaraya/chidori/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chidori", "manufacturer": "Kagizaraya", - "url": "", "maintainer": "ka2hiro", "usb": { "vid": "0xFEED", diff --git a/keyboards/kagizaraya/halberd/keyboard.json b/keyboards/kagizaraya/halberd/keyboard.json index c8c5b5e214..da82556271 100644 --- a/keyboards/kagizaraya/halberd/keyboard.json +++ b/keyboards/kagizaraya/halberd/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Halberd", "manufacturer": "Kagizaraya", - "url": "", "maintainer": "ka2hiro", "usb": { "vid": "0xFEED", diff --git a/keyboards/kagizaraya/miniaxe/keyboard.json b/keyboards/kagizaraya/miniaxe/keyboard.json index b2e3b14d0e..52ecbbac5a 100644 --- a/keyboards/kagizaraya/miniaxe/keyboard.json +++ b/keyboards/kagizaraya/miniaxe/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MiniAxe", "manufacturer": "ENDO Katsuhiro", - "url": "", "maintainer": "ka2hiro", "usb": { "vid": "0xFEED", diff --git a/keyboards/kagizaraya/scythe/keyboard.json b/keyboards/kagizaraya/scythe/keyboard.json index ed1bd99f66..eddb54315d 100644 --- a/keyboards/kagizaraya/scythe/keyboard.json +++ b/keyboards/kagizaraya/scythe/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Scythe", "manufacturer": "Kagizaraya", - "url": "", "maintainer": "ka2hiro", "usb": { "vid": "0xFEED", diff --git a/keyboards/kakunpc/business_card/alpha/keyboard.json b/keyboards/kakunpc/business_card/alpha/keyboard.json index 17c42ebb31..c357ae3a00 100644 --- a/keyboards/kakunpc/business_card/alpha/keyboard.json +++ b/keyboards/kakunpc/business_card/alpha/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "business_card alpha", "manufacturer": "kakunpc", - "url": "", "maintainer": "kakunpc", "usb": { "vid": "0xFEED", diff --git a/keyboards/kakunpc/business_card/beta/keyboard.json b/keyboards/kakunpc/business_card/beta/keyboard.json index 5b6a77f358..0e8fda9f58 100644 --- a/keyboards/kakunpc/business_card/beta/keyboard.json +++ b/keyboards/kakunpc/business_card/beta/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "business_card beta", "manufacturer": "kakunpc", - "url": "", "maintainer": "kakunpc", "usb": { "vid": "0xFEED", diff --git a/keyboards/kb_elmo/67mk_e/keyboard.json b/keyboards/kb_elmo/67mk_e/keyboard.json index 4e842f28e6..046b08c667 100644 --- a/keyboards/kb_elmo/67mk_e/keyboard.json +++ b/keyboards/kb_elmo/67mk_e/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "67mk_E", "manufacturer": "kb_elmo", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xA68C", diff --git a/keyboards/kb_elmo/isolation/keyboard.json b/keyboards/kb_elmo/isolation/keyboard.json index e7a40a55e6..1152675912 100644 --- a/keyboards/kb_elmo/isolation/keyboard.json +++ b/keyboards/kb_elmo/isolation/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ISOlation", "manufacturer": "kb-elmo", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xA68C", diff --git a/keyboards/kb_elmo/qez/keyboard.json b/keyboards/kb_elmo/qez/keyboard.json index ab1f823043..fa53745b31 100644 --- a/keyboards/kb_elmo/qez/keyboard.json +++ b/keyboards/kb_elmo/qez/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "QEZ", "manufacturer": "kb_elmo", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xA68C", diff --git a/keyboards/kb_elmo/vertex/keyboard.json b/keyboards/kb_elmo/vertex/keyboard.json index 5585386296..c40e87ad62 100644 --- a/keyboards/kb_elmo/vertex/keyboard.json +++ b/keyboards/kb_elmo/vertex/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vertex", "manufacturer": "kb_elmo", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xA68C", diff --git a/keyboards/kbdfans/bella/rgb/keyboard.json b/keyboards/kbdfans/bella/rgb/keyboard.json index 50310e3667..2ca18d2851 100644 --- a/keyboards/kbdfans/bella/rgb/keyboard.json +++ b/keyboards/kbdfans/bella/rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bella RGB ANSI", "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/bella/rgb_iso/keyboard.json b/keyboards/kbdfans/bella/rgb_iso/keyboard.json index 20b00283ed..c7dd6423b5 100644 --- a/keyboards/kbdfans/bella/rgb_iso/keyboard.json +++ b/keyboards/kbdfans/bella/rgb_iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bella RGB ISO", "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/bella/soldered/keyboard.json b/keyboards/kbdfans/bella/soldered/keyboard.json index aa5d915980..e99a4fb224 100644 --- a/keyboards/kbdfans/bella/soldered/keyboard.json +++ b/keyboards/kbdfans/bella/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bella Soldered", "manufacturer": "KBDfans", - "url": "", "maintainer": "kbdfans", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/boop65/rgb/keyboard.json b/keyboards/kbdfans/boop65/rgb/keyboard.json index 49fa78b315..6fbd28816b 100644 --- a/keyboards/kbdfans/boop65/rgb/keyboard.json +++ b/keyboards/kbdfans/boop65/rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Boop65 RGB", "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/bounce/75/soldered/keyboard.json b/keyboards/kbdfans/bounce/75/soldered/keyboard.json index e1610872e1..73c6d63d3a 100644 --- a/keyboards/kbdfans/bounce/75/soldered/keyboard.json +++ b/keyboards/kbdfans/bounce/75/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Bounce75 Soldered", "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/jm60/keyboard.json b/keyboards/kbdfans/jm60/keyboard.json index ffa205daa0..6bc60c308c 100644 --- a/keyboards/kbdfans/jm60/keyboard.json +++ b/keyboards/kbdfans/jm60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JM60", "manufacturer": "JMWS", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kbdfans/kbd4x/keyboard.json b/keyboards/kbdfans/kbd4x/keyboard.json index 77abf71f28..1f3d5ce25e 100644 --- a/keyboards/kbdfans/kbd4x/keyboard.json +++ b/keyboards/kbdfans/kbd4x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD4x", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kbdfans/kbd66/keyboard.json b/keyboards/kbdfans/kbd66/keyboard.json index 2b614442a0..57cbab49fd 100644 --- a/keyboards/kbdfans/kbd66/keyboard.json +++ b/keyboards/kbdfans/kbd66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD66", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kbdfans/kbd67/hotswap/keyboard.json b/keyboards/kbdfans/kbd67/hotswap/keyboard.json index fb0c165d14..4620d06a16 100644 --- a/keyboards/kbdfans/kbd67/hotswap/keyboard.json +++ b/keyboards/kbdfans/kbd67/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD67 Hotswap", "manufacturer": "KBDFans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json b/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json index 397f525f7a..f4bc2437d9 100644 --- a/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD67-MKII Soldered", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xA103", diff --git a/keyboards/kbdfans/kbd67/mkiirgb/info.json b/keyboards/kbdfans/kbd67/mkiirgb/info.json index 683503b4ee..1371370357 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/info.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/info.json @@ -1,6 +1,5 @@ { "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42" diff --git a/keyboards/kbdfans/kbd67/mkiirgb_iso/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb_iso/keyboard.json index b8e9fdaf1c..5000f8fb0a 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb_iso/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb_iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD67MKIIRGB ISO", "manufacturer": "KBDfans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd67/rev1/keyboard.json b/keyboards/kbdfans/kbd67/rev1/keyboard.json index ba91317906..04f88cecd2 100644 --- a/keyboards/kbdfans/kbd67/rev1/keyboard.json +++ b/keyboards/kbdfans/kbd67/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD67 Rev1", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd67/rev2/keyboard.json b/keyboards/kbdfans/kbd67/rev2/keyboard.json index 1e9d87ba0d..1190d3bd8a 100644 --- a/keyboards/kbdfans/kbd67/rev2/keyboard.json +++ b/keyboards/kbdfans/kbd67/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD67 Rev2", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd6x/keyboard.json b/keyboards/kbdfans/kbd6x/keyboard.json index c2b9f28b63..e603cb64ff 100644 --- a/keyboards/kbdfans/kbd6x/keyboard.json +++ b/keyboards/kbdfans/kbd6x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD6X", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd75/rev1/keyboard.json b/keyboards/kbdfans/kbd75/rev1/keyboard.json index 01429c8ebb..900e5dbd78 100644 --- a/keyboards/kbdfans/kbd75/rev1/keyboard.json +++ b/keyboards/kbdfans/kbd75/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD75 rev1", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd75/rev2/keyboard.json b/keyboards/kbdfans/kbd75/rev2/keyboard.json index 322eba661a..e0f862d40f 100644 --- a/keyboards/kbdfans/kbd75/rev2/keyboard.json +++ b/keyboards/kbdfans/kbd75/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD75 rev2", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd75rgb/keyboard.json b/keyboards/kbdfans/kbd75rgb/keyboard.json index 9a5f7a6908..b30fb22126 100644 --- a/keyboards/kbdfans/kbd75rgb/keyboard.json +++ b/keyboards/kbdfans/kbd75rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD75RGB", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/kbd8x/keyboard.json b/keyboards/kbdfans/kbd8x/keyboard.json index fe0106165d..b8d34f8277 100644 --- a/keyboards/kbdfans/kbd8x/keyboard.json +++ b/keyboards/kbdfans/kbd8x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBD8X", "manufacturer": "KBDfans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kbdfans/kbdmini/keyboard.json b/keyboards/kbdfans/kbdmini/keyboard.json index 8f2dade705..2f47097309 100644 --- a/keyboards/kbdfans/kbdmini/keyboard.json +++ b/keyboards/kbdfans/kbdmini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KBDMINI", "manufacturer": "DZTECH", - "url": "", "maintainer": "KBDFans", "usb": { "vid": "0xFEED", diff --git a/keyboards/kbdfans/maja/keyboard.json b/keyboards/kbdfans/maja/keyboard.json index c307f78637..a1ba96af51 100644 --- a/keyboards/kbdfans/maja/keyboard.json +++ b/keyboards/kbdfans/maja/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Maja", "manufacturer": "KBDFans", - "url": "", "maintainer": "DZTECH", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/maja_soldered/keyboard.json b/keyboards/kbdfans/maja_soldered/keyboard.json index f182ef97d1..7879fd9962 100644 --- a/keyboards/kbdfans/maja_soldered/keyboard.json +++ b/keyboards/kbdfans/maja_soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Maja Soldered", "manufacturer": "KBDFans", - "url": "", "maintainer": "DZTECH", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/niu_mini/keyboard.json b/keyboards/kbdfans/niu_mini/keyboard.json index 4c7d6f6d50..766d63d366 100644 --- a/keyboards/kbdfans/niu_mini/keyboard.json +++ b/keyboards/kbdfans/niu_mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NIU Mini", "manufacturer": "KBDFans", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6E6D", diff --git a/keyboards/kbdfans/odin/rgb/keyboard.json b/keyboards/kbdfans/odin/rgb/keyboard.json index 1777e2cdc0..f1a0e7b8e8 100644 --- a/keyboards/kbdfans/odin/rgb/keyboard.json +++ b/keyboards/kbdfans/odin/rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Odin RGB", "manufacturer": "KBDFans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/odin/soldered/keyboard.json b/keyboards/kbdfans/odin/soldered/keyboard.json index 42a8a0e056..4832e90096 100644 --- a/keyboards/kbdfans/odin/soldered/keyboard.json +++ b/keyboards/kbdfans/odin/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Odin Soldered", "manufacturer": "KBDFans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/odin/v2/keyboard.json b/keyboards/kbdfans/odin/v2/keyboard.json index 595a5596fe..4ac47226bc 100644 --- a/keyboards/kbdfans/odin/v2/keyboard.json +++ b/keyboards/kbdfans/odin/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Odin V2", "manufacturer": "KBDFans", - "url": "", "maintainer": "lexbrugman", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/phaseone/keyboard.json b/keyboards/kbdfans/phaseone/keyboard.json index fcc6bdc7b3..ff6b3fe6d1 100644 --- a/keyboards/kbdfans/phaseone/keyboard.json +++ b/keyboards/kbdfans/phaseone/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Phase One", "manufacturer": "KBDFans", - "url": "", "maintainer": "moyi4681", "usb": { "vid": "0x4B42", diff --git a/keyboards/kbdfans/tiger80/keyboard.json b/keyboards/kbdfans/tiger80/keyboard.json index 9761cb892d..ccef4de81a 100644 --- a/keyboards/kbdfans/tiger80/keyboard.json +++ b/keyboards/kbdfans/tiger80/keyboard.json @@ -48,7 +48,6 @@ "ws2812": { "pin": "B3" }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0011", diff --git a/keyboards/kc60/keyboard.json b/keyboards/kc60/keyboard.json index fc21477163..f7ee4e785b 100644 --- a/keyboards/kc60/keyboard.json +++ b/keyboards/kc60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KC60", "manufacturer": "NPKC", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x530A", diff --git a/keyboards/kc60se/keyboard.json b/keyboards/kc60se/keyboard.json index c8bdf24a4b..c7c18b4a76 100644 --- a/keyboards/kc60se/keyboard.json +++ b/keyboards/kc60se/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kc60se", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/keebformom/keyboard.json b/keyboards/keebformom/keyboard.json index b1ffee0f3d..7fbaa5737f 100644 --- a/keyboards/keebformom/keyboard.json +++ b/keyboards/keebformom/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "Keeb For Mom", - "url": "", "maintainer": "qmk", "manufacturer": "nendezkombet/sandipratama", "usb": { diff --git a/keyboards/keebio/dilly/keyboard.json b/keyboards/keebio/dilly/keyboard.json index 83bf1eac9d..223228a8e0 100644 --- a/keyboards/keebio/dilly/keyboard.json +++ b/keyboards/keebio/dilly/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dilly", "manufacturer": "Keebio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCB10", diff --git a/keyboards/keebmonkey/kbmg68/keyboard.json b/keyboards/keebmonkey/kbmg68/keyboard.json index 5cb0fa0e45..110da77d37 100644 --- a/keyboards/keebmonkey/kbmg68/keyboard.json +++ b/keyboards/keebmonkey/kbmg68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kbmg68", "manufacturer": "KeebMonkey", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/keebsforall/freebird60/keyboard.json b/keyboards/keebsforall/freebird60/keyboard.json index 3c4df7472a..813275857d 100644 --- a/keyboards/keebsforall/freebird60/keyboard.json +++ b/keyboards/keebsforall/freebird60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Freebird60", "manufacturer": "KnoblesseOblige", - "url": "", "maintainer": "KnoblesseOblige", "usb": { "vid": "0xADAD", diff --git a/keyboards/keebsforall/freebird75/keyboard.json b/keyboards/keebsforall/freebird75/keyboard.json index 1e92ad7063..2bd9579f60 100644 --- a/keyboards/keebsforall/freebird75/keyboard.json +++ b/keyboards/keebsforall/freebird75/keyboard.json @@ -17,7 +17,6 @@ "rows": ["C7", "C6", "B6", "B5", "B4", "D7"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x7575", diff --git a/keyboards/keebwerk/mega/ansi/keyboard.json b/keyboards/keebwerk/mega/ansi/keyboard.json index e5a12585df..01f158da9a 100755 --- a/keyboards/keebwerk/mega/ansi/keyboard.json +++ b/keyboards/keebwerk/mega/ansi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Keebwerk Mega ANSI", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "Yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/keebwerk/nano_slider/keyboard.json b/keyboards/keebwerk/nano_slider/keyboard.json index 64f59d6c10..e44a2feb3e 100644 --- a/keyboards/keebwerk/nano_slider/keyboard.json +++ b/keyboards/keebwerk/nano_slider/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "nano. slider", "manufacturer": "keebwerk.", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x03A8", diff --git a/keyboards/keebzdotnet/fme/keyboard.json b/keyboards/keebzdotnet/fme/keyboard.json index d7b9ebca0c..5d6a908a81 100644 --- a/keyboards/keebzdotnet/fme/keyboard.json +++ b/keyboards/keebzdotnet/fme/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FMe", "manufacturer": "keebzdotnet", - "url": "", "maintainer": "keebzdotnet", "usb": { "vid": "0x4B5A", diff --git a/keyboards/kelwin/utopia88/keyboard.json b/keyboards/kelwin/utopia88/keyboard.json index 406642d41c..fb4640e2bb 100644 --- a/keyboards/kelwin/utopia88/keyboard.json +++ b/keyboards/kelwin/utopia88/keyboard.json @@ -23,7 +23,6 @@ "rows": ["B7", "D5", "D3", "D2", "D1", "D0"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/keybage/radpad/keyboard.json b/keyboards/keybage/radpad/keyboard.json index 84407a9310..6fa5163bee 100644 --- a/keyboards/keybage/radpad/keyboard.json +++ b/keyboards/keybage/radpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RadPad", "manufacturer": "Keybage", - "url": "", "maintainer": "Brandon Schlack", "usb": { "vid": "0x4253", diff --git a/keyboards/keybee/keybee65/keyboard.json b/keyboards/keybee/keybee65/keyboard.json index 7952378b15..56c5d33175 100644 --- a/keyboards/keybee/keybee65/keyboard.json +++ b/keyboards/keybee/keybee65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KeyBee65", "manufacturer": "KeyBee", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x6265", diff --git a/keyboards/keyboardio/atreus/keyboard.json b/keyboards/keyboardio/atreus/keyboard.json index 5185d9ee28..7fee6ec54d 100644 --- a/keyboards/keyboardio/atreus/keyboard.json +++ b/keyboards/keyboardio/atreus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atreus", "manufacturer": "Keyboardio", - "url": "", "maintainer": "keyboardio", "usb": { "vid": "0x1209", diff --git a/keyboards/keyhive/honeycomb/keyboard.json b/keyboards/keyhive/honeycomb/keyboard.json index 768f08275d..69907fccc1 100644 --- a/keyboards/keyhive/honeycomb/keyboard.json +++ b/keyboards/keyhive/honeycomb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Honeycomb", "manufacturer": "Keyhive", - "url": "", "maintainer": "filoxo", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyhive/lattice60/keyboard.json b/keyboards/keyhive/lattice60/keyboard.json index b805a73357..fce9453e34 100644 --- a/keyboards/keyhive/lattice60/keyboard.json +++ b/keyboards/keyhive/lattice60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LATTICE60", "manufacturer": "emdarcher", - "url": "", "maintainer": "emdarcher", "usb": { "vid": "0x16C0", diff --git a/keyboards/keyhive/navi10/info.json b/keyboards/keyhive/navi10/info.json index e5df0c68e1..25c9f14f27 100644 --- a/keyboards/keyhive/navi10/info.json +++ b/keyboards/keyhive/navi10/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Navi10", "manufacturer": "emdarcher", - "url": "", "maintainer": "emdarcher", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyhive/southpole/keyboard.json b/keyboards/keyhive/southpole/keyboard.json index 7136675881..38cb349ef9 100644 --- a/keyboards/keyhive/southpole/keyboard.json +++ b/keyboards/keyhive/southpole/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "southpole", "manufacturer": "u/waxpoetic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyhive/ut472/keyboard.json b/keyboards/keyhive/ut472/keyboard.json index 828058a955..4fc67962da 100644 --- a/keyboards/keyhive/ut472/keyboard.json +++ b/keyboards/keyhive/ut472/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UT47.2", "manufacturer": "Keyhive", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xA103", diff --git a/keyboards/keyprez/bison/keyboard.json b/keyboards/keyprez/bison/keyboard.json index 5fd2de1ff5..1dfe883880 100644 --- a/keyboards/keyprez/bison/keyboard.json +++ b/keyboards/keyprez/bison/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bison", "manufacturer": "csandven", - "url": "", "maintainer": "Christian Sandven", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyprez/corgi/keyboard.json b/keyboards/keyprez/corgi/keyboard.json index 8e664de03d..4dc9af92a2 100644 --- a/keyboards/keyprez/corgi/keyboard.json +++ b/keyboards/keyprez/corgi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "corgi", "manufacturer": "Christian Sandven", - "url": "", "maintainer": "Christian Sandven", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyprez/rhino/keyboard.json b/keyboards/keyprez/rhino/keyboard.json index 75854f6f99..c00219c119 100644 --- a/keyboards/keyprez/rhino/keyboard.json +++ b/keyboards/keyprez/rhino/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rhino", "manufacturer": "Christian Sandven", - "url": "", "maintainer": "Christian Sandven", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyprez/unicorn/keyboard.json b/keyboards/keyprez/unicorn/keyboard.json index 7fa855e240..9b10351081 100644 --- a/keyboards/keyprez/unicorn/keyboard.json +++ b/keyboards/keyprez/unicorn/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Unicorn", "manufacturer": "Keyprez", - "url": "", "maintainer": "Keyprez", "usb": { "vid": "0x6B7A", diff --git a/keyboards/keysofkings/twokey/keyboard.json b/keyboards/keysofkings/twokey/keyboard.json index 2b75891329..3163a30e6b 100644 --- a/keyboards/keysofkings/twokey/keyboard.json +++ b/keyboards/keysofkings/twokey/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Twokey", "manufacturer": "Keys of Kings", - "url": "", "maintainer": "Keys of Kings", "usb": { "vid": "0xFEED", diff --git a/keyboards/keyten/aperture/keyboard.json b/keyboards/keyten/aperture/keyboard.json index 7648e46cc0..5ed3ecfb8e 100644 --- a/keyboards/keyten/aperture/keyboard.json +++ b/keyboards/keyten/aperture/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Aperture", "manufacturer": "Bizunow", - "url": "", "maintainer": "key10iq", "usb": { "vid": "0xEB69", diff --git a/keyboards/keyten/kt3700/keyboard.json b/keyboards/keyten/kt3700/keyboard.json index 9f89ee1453..83df8285d0 100644 --- a/keyboards/keyten/kt3700/keyboard.json +++ b/keyboards/keyten/kt3700/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kt3700", "manufacturer": "keyten", - "url": "", "maintainer": "key10iq", "usb": { "vid": "0xEB69", diff --git a/keyboards/keyten/kt60_m/keyboard.json b/keyboards/keyten/kt60_m/keyboard.json index f72deeebbd..5426bff85f 100644 --- a/keyboards/keyten/kt60_m/keyboard.json +++ b/keyboards/keyten/kt60_m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kt60-M", "manufacturer": "keyten", - "url": "", "maintainer": "key10iq", "usb": { "vid": "0xEB69", diff --git a/keyboards/kezewa/enter67/keyboard.json b/keyboards/kezewa/enter67/keyboard.json index df1d7f6b5b..eca9311377 100644 --- a/keyboards/kezewa/enter67/keyboard.json +++ b/keyboards/kezewa/enter67/keyboard.json @@ -19,7 +19,6 @@ "rows": ["A1", "A2", "A3", "A4", "A5"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0xAA66", diff --git a/keyboards/kezewa/enter80/keyboard.json b/keyboards/kezewa/enter80/keyboard.json index a4fe83b3ac..9e62163192 100644 --- a/keyboards/kezewa/enter80/keyboard.json +++ b/keyboards/kezewa/enter80/keyboard.json @@ -19,7 +19,6 @@ "cols": ["A1", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "B11", "B12", "B13", "B14", "A8", "A9", "A10", "A15", "B3"], "rows": ["B4", "B5", "B6", "B15", "B10", "B7"] }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0xFF65", diff --git a/keyboards/kibou/fukuro/keyboard.json b/keyboards/kibou/fukuro/keyboard.json index fa50cca964..97dcaaac4b 100644 --- a/keyboards/kibou/fukuro/keyboard.json +++ b/keyboards/kibou/fukuro/keyboard.json @@ -17,7 +17,6 @@ "rows": ["A9", "A10", "C13", "A0", "A6"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0003", diff --git a/keyboards/kikkou/keyboard.json b/keyboards/kikkou/keyboard.json index af684bbc29..7e018aa62b 100644 --- a/keyboards/kikkou/keyboard.json +++ b/keyboards/kikkou/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kikkou", "manufacturer": "Mechwerkes", - "url": "", "maintainer": "Mechwerkes", "usb": { "vid": "0x6D65", diff --git a/keyboards/kinesis/info.json b/keyboards/kinesis/info.json index 49025977bd..066f072ebd 100644 --- a/keyboards/kinesis/info.json +++ b/keyboards/kinesis/info.json @@ -1,5 +1,4 @@ { - "url": "", "maintainer": "qmk", "qmk": { "locking": { diff --git a/keyboards/kineticlabs/emu/hotswap/keyboard.json b/keyboards/kineticlabs/emu/hotswap/keyboard.json index ec53c2f6bf..a199af4805 100644 --- a/keyboards/kineticlabs/emu/hotswap/keyboard.json +++ b/keyboards/kineticlabs/emu/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Emu Hotswap", "manufacturer": "Kineticlabs", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xE015", diff --git a/keyboards/kineticlabs/emu/soldered/keyboard.json b/keyboards/kineticlabs/emu/soldered/keyboard.json index 4aaf523d2a..59de15184a 100644 --- a/keyboards/kineticlabs/emu/soldered/keyboard.json +++ b/keyboards/kineticlabs/emu/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Emu Soldered", "manufacturer": "Kineticlabs", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xE015", diff --git a/keyboards/kingly_keys/ave/ortho/keyboard.json b/keyboards/kingly_keys/ave/ortho/keyboard.json index 27fb2666a2..d945664ba2 100644 --- a/keyboards/kingly_keys/ave/ortho/keyboard.json +++ b/keyboards/kingly_keys/ave/ortho/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The Ave. Ortholinear", "manufacturer": "Kingly-Keys", - "url": "", "maintainer": "the-royal", "usb": { "vid": "0x4B4B", diff --git a/keyboards/kingly_keys/ave/staggered/keyboard.json b/keyboards/kingly_keys/ave/staggered/keyboard.json index 5fcb1657e3..6296e8c8d1 100644 --- a/keyboards/kingly_keys/ave/staggered/keyboard.json +++ b/keyboards/kingly_keys/ave/staggered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The Ave. Staggered", "manufacturer": "Kingly-Keys", - "url": "", "maintainer": "the-royal", "usb": { "vid": "0x4B4B", diff --git a/keyboards/kingly_keys/little_foot/keyboard.json b/keyboards/kingly_keys/little_foot/keyboard.json index a511d48905..ddbe877b6d 100644 --- a/keyboards/kingly_keys/little_foot/keyboard.json +++ b/keyboards/kingly_keys/little_foot/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The Little Foot", "manufacturer": "Kingly-Keys", - "url": "", "maintainer": "TheRoyalSweatshirt", "usb": { "vid": "0xFEED", diff --git a/keyboards/kingly_keys/romac/keyboard.json b/keyboards/kingly_keys/romac/keyboard.json index 9927bdc25f..8088152db7 100644 --- a/keyboards/kingly_keys/romac/keyboard.json +++ b/keyboards/kingly_keys/romac/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RoMac", "manufacturer": "TheRoyalSweatshirt", - "url": "", "maintainer": "TheRoyalSweatshirt", "usb": { "vid": "0x4B4B", diff --git a/keyboards/kingly_keys/romac_plus/keyboard.json b/keyboards/kingly_keys/romac_plus/keyboard.json index 8b6c43333d..920ed39fa2 100644 --- a/keyboards/kingly_keys/romac_plus/keyboard.json +++ b/keyboards/kingly_keys/romac_plus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RoMac+", "manufacturer": "TheRoyalSweatshirt", - "url": "", "maintainer": "TheRoyalSweatshirt", "usb": { "vid": "0x4B4B", diff --git a/keyboards/kingly_keys/smd_milk/keyboard.json b/keyboards/kingly_keys/smd_milk/keyboard.json index 9f8a10a5bf..943599dad1 100644 --- a/keyboards/kingly_keys/smd_milk/keyboard.json +++ b/keyboards/kingly_keys/smd_milk/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SMD-2% Milk", "manufacturer": "Kingly-Keys", - "url": "", "maintainer": "TheRoyalSweatshirt", "usb": { "vid": "0xFEED", diff --git a/keyboards/kira/kira75/keyboard.json b/keyboards/kira/kira75/keyboard.json index fb4c90a8b5..a974b10161 100644 --- a/keyboards/kira/kira75/keyboard.json +++ b/keyboards/kira/kira75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kira 75", "manufacturer": "thesiscamper", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kira/kira80/keyboard.json b/keyboards/kira/kira80/keyboard.json index 137e1f6565..858b500408 100644 --- a/keyboards/kira/kira80/keyboard.json +++ b/keyboards/kira/kira80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kira80", "manufacturer": "EVE", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6986", diff --git a/keyboards/kk/65/keyboard.json b/keyboards/kk/65/keyboard.json index 49c52eec80..d7fd74ec9f 100644 --- a/keyboards/kk/65/keyboard.json +++ b/keyboards/kk/65/keyboard.json @@ -23,7 +23,6 @@ "rows": ["D7", "B4", "B5", "B6", "B7"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/knobgoblin/keyboard.json b/keyboards/knobgoblin/keyboard.json index 8494eea465..4886a47da3 100644 --- a/keyboards/knobgoblin/keyboard.json +++ b/keyboards/knobgoblin/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Knob Goblin", "manufacturer": "MrT1ddl3s", - "url": "", "maintainer": "MrT1ddl3s", "usb": { "vid": "0x4B47", diff --git a/keyboards/kona_classic/keyboard.json b/keyboards/kona_classic/keyboard.json index 79bef89bb6..716df4759f 100644 --- a/keyboards/kona_classic/keyboard.json +++ b/keyboards/kona_classic/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kona Classic", "manufacturer": "Dangerous Parts", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kopibeng/xt60/keyboard.json b/keyboards/kopibeng/xt60/keyboard.json index 24dc8f490b..7b0b74db0e 100644 --- a/keyboards/kopibeng/xt60/keyboard.json +++ b/keyboards/kopibeng/xt60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XT60", "manufacturer": "kopibeng", - "url": "", "maintainer": "Kopibeng", "usb": { "vid": "0x4B50", diff --git a/keyboards/kopibeng/xt60_singa/keyboard.json b/keyboards/kopibeng/xt60_singa/keyboard.json index b1d239cd20..7f717adf35 100644 --- a/keyboards/kopibeng/xt60_singa/keyboard.json +++ b/keyboards/kopibeng/xt60_singa/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XT60_SINGA", "manufacturer": "kopibeng", - "url": "", "maintainer": "Kopibeng", "usb": { "vid": "0x4B50", diff --git a/keyboards/kopibeng/xt65/keyboard.json b/keyboards/kopibeng/xt65/keyboard.json index c73ff703d5..60fff35ca1 100644 --- a/keyboards/kopibeng/xt65/keyboard.json +++ b/keyboards/kopibeng/xt65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XT65", "manufacturer": "kopibeng", - "url": "", "maintainer": "kopibeng", "usb": { "vid": "0x4B50", diff --git a/keyboards/kopibeng/xt8x/keyboard.json b/keyboards/kopibeng/xt8x/keyboard.json index 7167cb1d07..ad6c044982 100644 --- a/keyboards/kopibeng/xt8x/keyboard.json +++ b/keyboards/kopibeng/xt8x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XT8x", "manufacturer": "kopibeng", - "url": "", "maintainer": "kopibeng", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm16a/v1/keyboard.json b/keyboards/kprepublic/bm16a/v1/keyboard.json index 85173a89cc..fba123ccb7 100644 --- a/keyboards/kprepublic/bm16a/v1/keyboard.json +++ b/keyboards/kprepublic/bm16a/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bm16a", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm16a/v2/keyboard.json b/keyboards/kprepublic/bm16a/v2/keyboard.json index e922d0b9ee..ac65e4affb 100644 --- a/keyboards/kprepublic/bm16a/v2/keyboard.json +++ b/keyboards/kprepublic/bm16a/v2/keyboard.json @@ -22,7 +22,6 @@ "rows": ["A8", "A9", "B5", "B3"] }, "processor": "STM32F103", // GD32F303CCT6 - "url": "", "usb": { "device_version": "0.0.2", "pid": "0x016C", diff --git a/keyboards/kprepublic/bm16s/keyboard.json b/keyboards/kprepublic/bm16s/keyboard.json index 8c6ce05bb9..d7b31b5651 100644 --- a/keyboards/kprepublic/bm16s/keyboard.json +++ b/keyboards/kprepublic/bm16s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bm16s", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json index 7bdeafbcad..430d525a71 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM40 Hotswap RGB", "manufacturer": "KPRepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json index 525a6088ed..21689cb958 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM40 Hotswap RGB", "manufacturer": "KPRepublic", - "url": "", "maintainer": "qmk", "features": { "bootmagic": true, diff --git a/keyboards/kprepublic/bm43a/keyboard.json b/keyboards/kprepublic/bm43a/keyboard.json index 79c089c68c..28c8f259d1 100644 --- a/keyboards/kprepublic/bm43a/keyboard.json +++ b/keyboards/kprepublic/bm43a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM43A", "manufacturer": "KPRepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/kprepublic/bm43hsrgb/keyboard.json b/keyboards/kprepublic/bm43hsrgb/keyboard.json index 9fa40bdd9c..9dff2d8ddc 100755 --- a/keyboards/kprepublic/bm43hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm43hsrgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM43 Hotswap RGB", "manufacturer": "KPRepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json index 5fe5d21014..3640dad2a8 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB", "manufacturer": "KP Republic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb/rev2/keyboard.json index a82d5159cf..3783ebb8b2 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60V2", "manufacturer": "KP Republic", - "url": "", "maintainer": "bdtc123", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json index 0a9b283131..e93a616c95 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB_EC Rev1", "manufacturer": "KP Republic", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json index 09124e03a9..1f0dffa260 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB_EC Rev2", "manufacturer": "KP Republic", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json index 4cd2c48440..8cdb855aa2 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB_ISO Rev1", "manufacturer": "KPRepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb_iso/rev2/keyboard.json index e84817122e..3a0df3e414 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB_ISO Rev2", "manufacturer": "KPRepublic", - "url": "", "maintainer": "kp republic", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json index d7923b8432..d1f5c9fb53 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB Poker Rev1", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb_poker/rev2/keyboard.json index 62ff452a68..f3edf59fec 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM60HSRGB Poker Rev2", "manufacturer": "KPrepublic", - "url": "", "maintainer": "bdtc123", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json index dc63acfa41..c5fa1d9026 100644 --- a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM65HSRGB", "manufacturer": "KPrepublic", - "url": "", "maintainer": "bytesapart", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json index 53b132713c..43d213a1a7 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM65HSRGB ISO", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json index 6e2d3a9208..9b6975bddc 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM68HSRGB Rev1", "manufacturer": "KPrepublic", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json index 7df1af5902..e294562e0d 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM68HSRGB Rev2", "manufacturer": "KPrepublic", - "url": "", "maintainer": "bdtc123", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm80hsrgb/keyboard.json b/keyboards/kprepublic/bm80hsrgb/keyboard.json index 5a4d65fbcd..8c51e2ea98 100644 --- a/keyboards/kprepublic/bm80hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm80hsrgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM80HSRGB", "manufacturer": "KPRepublic", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm80v2/keyboard.json b/keyboards/kprepublic/bm80v2/keyboard.json index dd985550bb..e8f061115f 100644 --- a/keyboards/kprepublic/bm80v2/keyboard.json +++ b/keyboards/kprepublic/bm80v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM80v2", "manufacturer": "KPrepublic", - "url": "", "maintainer": "edwardslau", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm80v2_iso/keyboard.json b/keyboards/kprepublic/bm80v2_iso/keyboard.json index 46ab7a5e8b..9143f9df07 100644 --- a/keyboards/kprepublic/bm80v2_iso/keyboard.json +++ b/keyboards/kprepublic/bm80v2_iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM80v2 ISO", "manufacturer": "KPrepublic", - "url": "", "maintainer": "edwardslau", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/bm980hsrgb/keyboard.json b/keyboards/kprepublic/bm980hsrgb/keyboard.json index 8ee498b7b6..addd87de4f 100644 --- a/keyboards/kprepublic/bm980hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm980hsrgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BM980 Hotswap RGB", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/cospad/keyboard.json b/keyboards/kprepublic/cospad/keyboard.json index 51a824b816..8d65d30271 100644 --- a/keyboards/kprepublic/cospad/keyboard.json +++ b/keyboards/kprepublic/cospad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cospad", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B5C", diff --git a/keyboards/kprepublic/cstc40/info.json b/keyboards/kprepublic/cstc40/info.json index 44d12fc22f..bd79ef2afe 100644 --- a/keyboards/kprepublic/cstc40/info.json +++ b/keyboards/kprepublic/cstc40/info.json @@ -15,7 +15,6 @@ "rgb_matrix": true }, "processor": "STM32F401", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0040", diff --git a/keyboards/kprepublic/jj40/rev1/keyboard.json b/keyboards/kprepublic/jj40/rev1/keyboard.json index 3ac3e2f02c..201f916ee3 100644 --- a/keyboards/kprepublic/jj40/rev1/keyboard.json +++ b/keyboards/kprepublic/jj40/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JJ40 rev1", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/jj4x4/keyboard.json b/keyboards/kprepublic/jj4x4/keyboard.json index 2f53db2e88..d7d785b054 100644 --- a/keyboards/kprepublic/jj4x4/keyboard.json +++ b/keyboards/kprepublic/jj4x4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JJ4x4", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/jj50/rev1/keyboard.json b/keyboards/kprepublic/jj50/rev1/keyboard.json index c9f191ef9c..7eed1349e0 100644 --- a/keyboards/kprepublic/jj50/rev1/keyboard.json +++ b/keyboards/kprepublic/jj50/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JJ50 rev1", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/kprepublic/jj50/rev2/keyboard.json b/keyboards/kprepublic/jj50/rev2/keyboard.json index c3e0f7a322..4327c4be97 100644 --- a/keyboards/kprepublic/jj50/rev2/keyboard.json +++ b/keyboards/kprepublic/jj50/rev2/keyboard.json @@ -42,7 +42,6 @@ "led_count": 6, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "2.0.0", "pid": "0x0050", diff --git a/keyboards/ktec/daisy/keyboard.json b/keyboards/ktec/daisy/keyboard.json index d0a24f5b0d..8ca734534e 100644 --- a/keyboards/ktec/daisy/keyboard.json +++ b/keyboards/ktec/daisy/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Daisy", "manufacturer": "KTEC", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B50", diff --git a/keyboards/ktec/staryu/keyboard.json b/keyboards/ktec/staryu/keyboard.json index a2799703be..9272642c3e 100644 --- a/keyboards/ktec/staryu/keyboard.json +++ b/keyboards/ktec/staryu/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Staryu", "manufacturer": "K.T.E.C.", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1209", diff --git a/keyboards/kumaokobo/kudox_game/info.json b/keyboards/kumaokobo/kudox_game/info.json index 6968b5e427..8750facede 100644 --- a/keyboards/kumaokobo/kudox_game/info.json +++ b/keyboards/kumaokobo/kudox_game/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "The Kudox Game Keyboard", "manufacturer": "Kumao Kobo", - "url": "", "maintainer": "Kumao Kobo", "usb": { "vid": "0xABBA", diff --git a/keyboards/kuro/kuro65/keyboard.json b/keyboards/kuro/kuro65/keyboard.json index 72549735d9..8ca2310692 100644 --- a/keyboards/kuro/kuro65/keyboard.json +++ b/keyboards/kuro/kuro65/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "Kuro65", "manufacturer": "Kuro", "maintainer": "0x544D", - "url": "", "processor": "atmega32u4", "bootloader": "atmel-dfu", "diode_direction": "COL2ROW", diff --git a/keyboards/kv/revt/keyboard.json b/keyboards/kv/revt/keyboard.json index 8553dcdd35..20d9c38fbe 100644 --- a/keyboards/kv/revt/keyboard.json +++ b/keyboards/kv/revt/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KVT", "manufacturer": "Hybrid", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6565", diff --git a/keyboards/kwstudio/pisces/keyboard.json b/keyboards/kwstudio/pisces/keyboard.json index 48f4e6a4f6..e69993b963 100644 --- a/keyboards/kwstudio/pisces/keyboard.json +++ b/keyboards/kwstudio/pisces/keyboard.json @@ -20,7 +20,6 @@ "rows": ["B7", "D5", "D3", "D2", "D1", "D0"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/kwstudio/scorpio/keyboard.json b/keyboards/kwstudio/scorpio/keyboard.json index 82262afb1b..4d94b3a6b9 100644 --- a/keyboards/kwstudio/scorpio/keyboard.json +++ b/keyboards/kwstudio/scorpio/keyboard.json @@ -35,7 +35,6 @@ "led_count": 9, "sleep": true }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0002", diff --git a/keyboards/kwstudio/scorpio_rev2/keyboard.json b/keyboards/kwstudio/scorpio_rev2/keyboard.json index d1b41b1d4f..b4cf901d1f 100644 --- a/keyboards/kwstudio/scorpio_rev2/keyboard.json +++ b/keyboards/kwstudio/scorpio_rev2/keyboard.json @@ -38,7 +38,6 @@ "led_count": 9, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0003", diff --git a/keyboards/labbe/labbeminiv1/keyboard.json b/keyboards/labbe/labbeminiv1/keyboard.json index da53de3da5..d976ea5d36 100644 --- a/keyboards/labbe/labbeminiv1/keyboard.json +++ b/keyboards/labbe/labbeminiv1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Labbe Mini V1", "manufacturer": "Labbe", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xABBE", diff --git a/keyboards/labyrinth75/keyboard.json b/keyboards/labyrinth75/keyboard.json index 1e70a8318d..99f79b9a2b 100644 --- a/keyboards/labyrinth75/keyboard.json +++ b/keyboards/labyrinth75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "labyrinth75", "manufacturer": "Livi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4F53", diff --git a/keyboards/laneware/lpad/keyboard.json b/keyboards/laneware/lpad/keyboard.json index 464205846b..a42ba2c13f 100644 --- a/keyboards/laneware/lpad/keyboard.json +++ b/keyboards/laneware/lpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "L-PAD", "manufacturer": "Laneware Peripherals", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C50", diff --git a/keyboards/laneware/lw67/keyboard.json b/keyboards/laneware/lw67/keyboard.json index e48506f58e..d1b85ea50d 100644 --- a/keyboards/laneware/lw67/keyboard.json +++ b/keyboards/laneware/lw67/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LW-67", "manufacturer": "Laneware Peripherals", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C50", diff --git a/keyboards/laneware/lw75/keyboard.json b/keyboards/laneware/lw75/keyboard.json index 27601d1e28..6aee9461a8 100644 --- a/keyboards/laneware/lw75/keyboard.json +++ b/keyboards/laneware/lw75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LW-75", "manufacturer": "Laneware Peripherals", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C50", diff --git a/keyboards/laneware/macro1/keyboard.json b/keyboards/laneware/macro1/keyboard.json index a432db5915..12fce7b920 100644 --- a/keyboards/laneware/macro1/keyboard.json +++ b/keyboards/laneware/macro1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MACRO-1", "manufacturer": "Laneware Peripherals", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C50", diff --git a/keyboards/laser_ninja/pumpkinpad/keyboard.json b/keyboards/laser_ninja/pumpkinpad/keyboard.json index 64e62911a6..96b4049121 100644 --- a/keyboards/laser_ninja/pumpkinpad/keyboard.json +++ b/keyboards/laser_ninja/pumpkinpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pumpkinpad", "manufacturer": "Laser Ninja", - "url": "", "maintainer": "Jels", "processor": "STM32F072", "bootloader": "stm32-dfu", diff --git a/keyboards/latincompass/latin17rgb/keyboard.json b/keyboards/latincompass/latin17rgb/keyboard.json index 161672aea4..934653b6fe 100644 --- a/keyboards/latincompass/latin17rgb/keyboard.json +++ b/keyboards/latincompass/latin17rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Latin17RGB", "manufacturer": "18438880", - "url": "", "maintainer": "18438880", "usb": { "vid": "0x7C88", diff --git a/keyboards/latincompass/latin47ble/keyboard.json b/keyboards/latincompass/latin47ble/keyboard.json index ac07f68152..f5d53dbbe8 100644 --- a/keyboards/latincompass/latin47ble/keyboard.json +++ b/keyboards/latincompass/latin47ble/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Latin47BLE", "manufacturer": "latincompass", - "url": "", "maintainer": "latincompass", "usb": { "vid": "0x6C63", diff --git a/keyboards/latincompass/latin60rgb/keyboard.json b/keyboards/latincompass/latin60rgb/keyboard.json index 764a7c882a..4252387c12 100644 --- a/keyboards/latincompass/latin60rgb/keyboard.json +++ b/keyboards/latincompass/latin60rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Latin60RGB", "manufacturer": "latincompass", - "url": "", "maintainer": "latincompass", "usb": { "vid": "0x6C63", diff --git a/keyboards/latincompass/latin64ble/keyboard.json b/keyboards/latincompass/latin64ble/keyboard.json index b2563569d3..3a7a93c4a3 100644 --- a/keyboards/latincompass/latin64ble/keyboard.json +++ b/keyboards/latincompass/latin64ble/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Latin64BLE", "manufacturer": "latincompass", - "url": "", "maintainer": "latincompass", "usb": { "vid": "0x6C63", diff --git a/keyboards/latincompass/latin6rgb/keyboard.json b/keyboards/latincompass/latin6rgb/keyboard.json index 42aa82a030..d2708df399 100644 --- a/keyboards/latincompass/latin6rgb/keyboard.json +++ b/keyboards/latincompass/latin6rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Latin6rgb", "manufacturer": "18438880", - "url": "", "maintainer": "18438880", "usb": { "vid": "0x7C88", diff --git a/keyboards/leafcutterlabs/bigknob/keyboard.json b/keyboards/leafcutterlabs/bigknob/keyboard.json index 8250f7eb61..7d1fc6fb72 100644 --- a/keyboards/leafcutterlabs/bigknob/keyboard.json +++ b/keyboards/leafcutterlabs/bigknob/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "bigKNOB", "manufacturer": "leafcutterlabs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCEEB", diff --git a/keyboards/leeku/finger65/keyboard.json b/keyboards/leeku/finger65/keyboard.json index c9b7338856..cdb67f0e36 100644 --- a/keyboards/leeku/finger65/keyboard.json +++ b/keyboards/leeku/finger65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Finger65", "manufacturer": "LeeKu", - "url": "", "maintainer": "sidcarter", "usb": { "vid": "0xFEED", diff --git a/keyboards/lets_split/info.json b/keyboards/lets_split/info.json index a92a948abd..9152226cab 100644 --- a/keyboards/lets_split/info.json +++ b/keyboards/lets_split/info.json @@ -1,5 +1,4 @@ { - "url": "", "maintainer": "qmk", "processor": "atmega32u4", "bootloader": "caterina", diff --git a/keyboards/lfkeyboards/lfk78/revb/keyboard.json b/keyboards/lfkeyboards/lfk78/revb/keyboard.json index a4c0d83902..d5c4656928 100644 --- a/keyboards/lfkeyboards/lfk78/revb/keyboard.json +++ b/keyboards/lfkeyboards/lfk78/revb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LFK78 Rev B", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C46", diff --git a/keyboards/lfkeyboards/lfk78/revc/keyboard.json b/keyboards/lfkeyboards/lfk78/revc/keyboard.json index 56ab9b49be..0906307fe7 100644 --- a/keyboards/lfkeyboards/lfk78/revc/keyboard.json +++ b/keyboards/lfkeyboards/lfk78/revc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LFK7 Rev C-H", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C46", diff --git a/keyboards/lfkeyboards/lfk78/revj/keyboard.json b/keyboards/lfkeyboards/lfk78/revj/keyboard.json index df8ac8d0f6..2657a21b8c 100644 --- a/keyboards/lfkeyboards/lfk78/revj/keyboard.json +++ b/keyboards/lfkeyboards/lfk78/revj/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LFK78 Rev J", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C46", diff --git a/keyboards/lfkeyboards/lfk87/info.json b/keyboards/lfkeyboards/lfk87/info.json index 9b10936df8..d38a397da3 100644 --- a/keyboards/lfkeyboards/lfk87/info.json +++ b/keyboards/lfkeyboards/lfk87/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "LFK87", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "features": { "audio": true, diff --git a/keyboards/lfkeyboards/lfkpad/keyboard.json b/keyboards/lfkeyboards/lfkpad/keyboard.json index 6de415b8e0..f422507a5b 100644 --- a/keyboards/lfkeyboards/lfkpad/keyboard.json +++ b/keyboards/lfkeyboards/lfkpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LFKPad", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4C46", diff --git a/keyboards/lfkeyboards/mini1800/info.json b/keyboards/lfkeyboards/mini1800/info.json index 35bb1c15a8..a7ee5324b6 100644 --- a/keyboards/lfkeyboards/mini1800/info.json +++ b/keyboards/lfkeyboards/mini1800/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mini1800", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "lfkeyboards", "usb": { "vid": "0xFEED", diff --git a/keyboards/lfkeyboards/smk65/info.json b/keyboards/lfkeyboards/smk65/info.json index 0ecbf2ab95..e80ef7b7eb 100644 --- a/keyboards/lfkeyboards/smk65/info.json +++ b/keyboards/lfkeyboards/smk65/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "SMK65v2", "manufacturer": "LFKeyboards", - "url": "", "maintainer": "qmk", "features": { "bootmagic": true, diff --git a/keyboards/lily58/lite_rev3/keyboard.json b/keyboards/lily58/lite_rev3/keyboard.json index ddb1f1877e..839cf4fe78 100644 --- a/keyboards/lily58/lite_rev3/keyboard.json +++ b/keyboards/lily58/lite_rev3/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "Lily58 Lite Rev3", "manufacturer": "Liliums", "maintainer": "yuchi", - "url": "", "processor": "RP2040", "bootloader": "rp2040", "diode_direction": "COL2ROW", diff --git a/keyboards/lily58/r2g/keyboard.json b/keyboards/lily58/r2g/keyboard.json index bb825b1d9e..6bd8f7b916 100644 --- a/keyboards/lily58/r2g/keyboard.json +++ b/keyboards/lily58/r2g/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lily58 R2G", "manufacturer": "Mechboards UK", - "url": "", "maintainer": "Elliot Powell", "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/lily58/rev1/keyboard.json b/keyboards/lily58/rev1/keyboard.json index 9ee51b8ba3..3488b0e2b5 100644 --- a/keyboards/lily58/rev1/keyboard.json +++ b/keyboards/lily58/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lily58", "manufacturer": "liliums", - "url": "", "maintainer": "liliums", "usb": { "vid": "0x04D8", diff --git a/keyboards/linworks/fave104/keyboard.json b/keyboards/linworks/fave104/keyboard.json index c71fdd5661..01c49af4c9 100644 --- a/keyboards/linworks/fave104/keyboard.json +++ b/keyboards/linworks/fave104/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FAVE-104", "manufacturer": "Lx3", - "url": "", "maintainer": "keydler", "usb": { "vid": "0x4C58", diff --git a/keyboards/linworks/fave60/keyboard.json b/keyboards/linworks/fave60/keyboard.json index 38c5458445..eb72e9c3e2 100644 --- a/keyboards/linworks/fave60/keyboard.json +++ b/keyboards/linworks/fave60/keyboard.json @@ -43,7 +43,6 @@ "cols": ["D6", "D4", "B5", "B4", "B6", "C6", "C7", "F4", "F0", "E6", "D1", "D2", "D3", "D5", "B0"], "rows": ["F6", "F7", "D7", "F1", "D0"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x000D", diff --git a/keyboards/linworks/fave60a/keyboard.json b/keyboards/linworks/fave60a/keyboard.json index 7972e94bae..8a505aaae2 100644 --- a/keyboards/linworks/fave60a/keyboard.json +++ b/keyboards/linworks/fave60a/keyboard.json @@ -161,7 +161,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x000C", diff --git a/keyboards/linworks/fave65h/keyboard.json b/keyboards/linworks/fave65h/keyboard.json index 6e35f55a4b..212bd0a37b 100644 --- a/keyboards/linworks/fave65h/keyboard.json +++ b/keyboards/linworks/fave65h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FAve 65H", "manufacturer": "Lx3", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x4C58", diff --git a/keyboards/linworks/fave84h/keyboard.json b/keyboards/linworks/fave84h/keyboard.json index 1ca6cb911a..6b66dd946c 100644 --- a/keyboards/linworks/fave84h/keyboard.json +++ b/keyboards/linworks/fave84h/keyboard.json @@ -198,7 +198,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0004", diff --git a/keyboards/linworks/fave87h/keyboard.json b/keyboards/linworks/fave87h/keyboard.json index 5fb1d4d42a..4bb6e42de4 100644 --- a/keyboards/linworks/fave87h/keyboard.json +++ b/keyboards/linworks/fave87h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "FAve 87H", "manufacturer": "Lx3", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x4C58", diff --git a/keyboards/linworks/favepada/keyboard.json b/keyboards/linworks/favepada/keyboard.json index 2b5adcf0a6..e468f88779 100644 --- a/keyboards/linworks/favepada/keyboard.json +++ b/keyboards/linworks/favepada/keyboard.json @@ -107,7 +107,6 @@ "ws2812": { "pin": "B1" }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x000B", diff --git a/keyboards/littlealby/mute/keyboard.json b/keyboards/littlealby/mute/keyboard.json index 96c2e26a74..3bd6ab3747 100644 --- a/keyboards/littlealby/mute/keyboard.json +++ b/keyboards/littlealby/mute/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mute", "manufacturer": "Little Alby", - "url": "", "maintainer": "albybarber", "usb": { "vid": "0x4142", diff --git a/keyboards/lm_keyboard/lm60n/keyboard.json b/keyboards/lm_keyboard/lm60n/keyboard.json index f12bdec031..317c61aee2 100644 --- a/keyboards/lm_keyboard/lm60n/keyboard.json +++ b/keyboards/lm_keyboard/lm60n/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "L+M 60N", "manufacturer": "L+M Keyboard", - "url": "", "maintainer": "gkeyboard", "usb": { "vid": "0x4C4D", diff --git a/keyboards/lxxt/keyboard.json b/keyboards/lxxt/keyboard.json index 5a028cacd8..57c8350b2a 100644 --- a/keyboards/lxxt/keyboard.json +++ b/keyboards/lxxt/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LXXT", "manufacturer": "DeskDaily", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0x5003", diff --git a/keyboards/lyso1/lefishe/keyboard.json b/keyboards/lyso1/lefishe/keyboard.json index 6104f47e47..677fb11e18 100644 --- a/keyboards/lyso1/lefishe/keyboard.json +++ b/keyboards/lyso1/lefishe/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Le_Fishe", "manufacturer": "Lyso1", - "url": "", "maintainer": "Lyso1", "usb": { "vid": "0x7856", diff --git a/keyboards/lz/erghost/keyboard.json b/keyboards/lz/erghost/keyboard.json index ac5ce2edf2..7722e4fc62 100644 --- a/keyboards/lz/erghost/keyboard.json +++ b/keyboards/lz/erghost/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "erGhost", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x6C7A", diff --git a/keyboards/m10a/keyboard.json b/keyboards/m10a/keyboard.json index 544d2535ed..e0ba10e096 100644 --- a/keyboards/m10a/keyboard.json +++ b/keyboards/m10a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M10-A", "manufacturer": "RAMA WORKS", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5241", diff --git a/keyboards/magic_force/mf34/keyboard.json b/keyboards/magic_force/mf34/keyboard.json index 7178d0405e..44d1a4ec92 100644 --- a/keyboards/magic_force/mf34/keyboard.json +++ b/keyboards/magic_force/mf34/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "MagicForce", - "url": "", "maintainer": "MagicForce", "manufacturer": "MagicForce", "usb": { diff --git a/keyboards/makrosu/keyboard.json b/keyboards/makrosu/keyboard.json index ec6b8a3bfd..a9790e22d2 100644 --- a/keyboards/makrosu/keyboard.json +++ b/keyboards/makrosu/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MakrOSU", "manufacturer": "Valdydesu_", - "url": "", "maintainer": "Valdydesu_", "usb": { "vid": "0xAB69", diff --git a/keyboards/malevolti/lyra/rev1/keyboard.json b/keyboards/malevolti/lyra/rev1/keyboard.json index cce0ad7bb7..6a4a993d76 100644 --- a/keyboards/malevolti/lyra/rev1/keyboard.json +++ b/keyboards/malevolti/lyra/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lyra", "manufacturer": "Dom", - "url": "", "maintainer": "malevolti", "usb": { "vid": "0x4443", diff --git a/keyboards/malevolti/superlyra/rev1/keyboard.json b/keyboards/malevolti/superlyra/rev1/keyboard.json index 61ef7c605d..4db7558302 100644 --- a/keyboards/malevolti/superlyra/rev1/keyboard.json +++ b/keyboards/malevolti/superlyra/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SuperLyra", "manufacturer": "Dom", - "url": "", "maintainer": "malevolti", "usb": { "vid": "0x4443", diff --git a/keyboards/maple_computing/6ball/keyboard.json b/keyboards/maple_computing/6ball/keyboard.json index 3f125c75c4..0db90d176e 100644 --- a/keyboards/maple_computing/6ball/keyboard.json +++ b/keyboards/maple_computing/6ball/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "6-Ball", "manufacturer": "That-Canadian", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCEEB", diff --git a/keyboards/maple_computing/c39/keyboard.json b/keyboards/maple_computing/c39/keyboard.json index de4cbc6aeb..f2f396ccd7 100755 --- a/keyboards/maple_computing/c39/keyboard.json +++ b/keyboards/maple_computing/c39/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "C39", "manufacturer": "Maple Computing", - "url": "", "maintainer": "Space Cat", "usb": { "vid": "0xCA17", diff --git a/keyboards/maple_computing/ivy/rev1/keyboard.json b/keyboards/maple_computing/ivy/rev1/keyboard.json index aac35a5dcc..e5bc6beae7 100644 --- a/keyboards/maple_computing/ivy/rev1/keyboard.json +++ b/keyboards/maple_computing/ivy/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ivy", "manufacturer": "Maple Computing", - "url": "", "maintainer": "That-Canadian", "usb": { "vid": "0x1337", diff --git a/keyboards/maple_computing/jnao/keyboard.json b/keyboards/maple_computing/jnao/keyboard.json index 97b51a7680..012d51f8f5 100644 --- a/keyboards/maple_computing/jnao/keyboard.json +++ b/keyboards/maple_computing/jnao/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JNAO", "manufacturer": "Maple Computing", - "url": "", "maintainer": "That-Canadian", "usb": { "vid": "0x1337", diff --git a/keyboards/maple_computing/launchpad/rev1/keyboard.json b/keyboards/maple_computing/launchpad/rev1/keyboard.json index 8c75561179..272a2eef6d 100644 --- a/keyboards/maple_computing/launchpad/rev1/keyboard.json +++ b/keyboards/maple_computing/launchpad/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Launch Pad", "manufacturer": "Maple Computing", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1337", diff --git a/keyboards/maple_computing/lets_split_eh/keyboard.json b/keyboards/maple_computing/lets_split_eh/keyboard.json index 42a1cf3e77..90965090b1 100644 --- a/keyboards/maple_computing/lets_split_eh/keyboard.json +++ b/keyboards/maple_computing/lets_split_eh/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lets Split Eh?", "manufacturer": "That-Canadian", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/maple_computing/minidox/rev1/keyboard.json b/keyboards/maple_computing/minidox/rev1/keyboard.json index b64f26e834..340a8bd39e 100644 --- a/keyboards/maple_computing/minidox/rev1/keyboard.json +++ b/keyboards/maple_computing/minidox/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MiniDox", "manufacturer": "That-Canadian", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/maple_computing/the_ruler/keyboard.json b/keyboards/maple_computing/the_ruler/keyboard.json index 7d15bb9bb8..a6c9304d60 100644 --- a/keyboards/maple_computing/the_ruler/keyboard.json +++ b/keyboards/maple_computing/the_ruler/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "The Ruler", "manufacturer": "Maple Computing", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x1337", diff --git a/keyboards/mariorion_v25/prod/keyboard.json b/keyboards/mariorion_v25/prod/keyboard.json index dd014be03a..6c2ba94ec1 100644 --- a/keyboards/mariorion_v25/prod/keyboard.json +++ b/keyboards/mariorion_v25/prod/keyboard.json @@ -44,7 +44,6 @@ "rows": ["B5", "B4", "B3", "A2", "C13", "B8"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/mariorion_v25/proto/keyboard.json b/keyboards/mariorion_v25/proto/keyboard.json index be00d447d2..5e46f64754 100644 --- a/keyboards/mariorion_v25/proto/keyboard.json +++ b/keyboards/mariorion_v25/proto/keyboard.json @@ -44,7 +44,6 @@ "rows": ["B5", "B4", "B3", "A2", "C13", "B8"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/matrix/abelx/keyboard.json b/keyboards/matrix/abelx/keyboard.json index 7fcad281da..19f7d23b61 100644 --- a/keyboards/matrix/abelx/keyboard.json +++ b/keyboards/matrix/abelx/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ABELX", "manufacturer": "Matrix", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/cain_re/keyboard.json b/keyboards/matrix/cain_re/keyboard.json index 7d93e806c2..e806e9a427 100644 --- a/keyboards/matrix/cain_re/keyboard.json +++ b/keyboards/matrix/cain_re/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cain", "manufacturer": "Matrix", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/falcon/keyboard.json b/keyboards/matrix/falcon/keyboard.json index 0c387f5bc2..bf5fc640ce 100644 --- a/keyboards/matrix/falcon/keyboard.json +++ b/keyboards/matrix/falcon/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Falcon", "manufacturer": "Matrix Lab", - "url": "", "maintainer": "yulei (Astro)", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/m12og/rev1/keyboard.json b/keyboards/matrix/m12og/rev1/keyboard.json index c956720a8d..7d1fccdad6 100644 --- a/keyboards/matrix/m12og/rev1/keyboard.json +++ b/keyboards/matrix/m12og/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "m12og_v1", "manufacturer": "Matrix", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/m12og/rev2/keyboard.json b/keyboards/matrix/m12og/rev2/keyboard.json index 45fcffe9eb..5a04161d1b 100644 --- a/keyboards/matrix/m12og/rev2/keyboard.json +++ b/keyboards/matrix/m12og/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M12OG", "manufacturer": "Matrix", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/m20add/keyboard.json b/keyboards/matrix/m20add/keyboard.json index fc58d242e6..31cc936b9c 100644 --- a/keyboards/matrix/m20add/keyboard.json +++ b/keyboards/matrix/m20add/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "8XV2.0 Additional", "manufacturer": "Matrix", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/me/keyboard.json b/keyboards/matrix/me/keyboard.json index 8349fbd7e6..6abfe38435 100644 --- a/keyboards/matrix/me/keyboard.json +++ b/keyboards/matrix/me/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Matrix ME", "manufacturer": "Matrix Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D58", diff --git a/keyboards/matrix/noah/keyboard.json b/keyboards/matrix/noah/keyboard.json index 53c8dc2458..d9d4ce3976 100644 --- a/keyboards/matrix/noah/keyboard.json +++ b/keyboards/matrix/noah/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NOAH", "manufacturer": "Matrix", - "url": "", "maintainer": "astro", "usb": { "vid": "0x4D58", diff --git a/keyboards/maxipad/info.json b/keyboards/maxipad/info.json index bf054e4b83..73b563edc1 100644 --- a/keyboards/maxipad/info.json +++ b/keyboards/maxipad/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "maxipad", "manufacturer": "wootpatoot", - "url": "", "maintainer": "qmk", "features": { "bootmagic": true, diff --git a/keyboards/mazestudio/jocker/keyboard.json b/keyboards/mazestudio/jocker/keyboard.json index 7257866f21..51c09eea32 100644 --- a/keyboards/mazestudio/jocker/keyboard.json +++ b/keyboards/mazestudio/jocker/keyboard.json @@ -4,7 +4,6 @@ "maintainer": "mazestd", "bootloader": "atmel-dfu", "processor": "atmega32u4", - "url": "", "usb": { "vid": "0x70F5", "pid": "0x4A01", diff --git a/keyboards/mb44/keyboard.json b/keyboards/mb44/keyboard.json index c349d11d38..f6ab714a5c 100644 --- a/keyboards/mb44/keyboard.json +++ b/keyboards/mb44/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MB-44", "manufacturer": "melonbred", - "url": "", "maintainer": "melonbred", "usb": { "vid": "0x6D62", diff --git a/keyboards/mechanickeys/miniashen40/keyboard.json b/keyboards/mechanickeys/miniashen40/keyboard.json index 2adee31c1d..8e5821cc29 100644 --- a/keyboards/mechanickeys/miniashen40/keyboard.json +++ b/keyboards/mechanickeys/miniashen40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mini Ashen 40", "manufacturer": "MechanicKeys", - "url": "", "maintainer": "jfescobar18", "usb": { "vid": "0x4D4B", diff --git a/keyboards/mechanickeys/undead60m/keyboard.json b/keyboards/mechanickeys/undead60m/keyboard.json index 7dc27c29ed..9f88f13346 100644 --- a/keyboards/mechanickeys/undead60m/keyboard.json +++ b/keyboards/mechanickeys/undead60m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Undead 60-M", "manufacturer": "MechanicKeys", - "url": "", "maintainer": "jfescobar18", "usb": { "vid": "0x4D4B", diff --git a/keyboards/mechbrewery/mb65h/keyboard.json b/keyboards/mechbrewery/mb65h/keyboard.json index 8b4049be4d..99d49d698d 100644 --- a/keyboards/mechbrewery/mb65h/keyboard.json +++ b/keyboards/mechbrewery/mb65h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MB65H", "manufacturer": "MechBrewery", - "url": "", "maintainer": "AnthonyNguyen168", "usb": { "vid": "0x4252", diff --git a/keyboards/mechbrewery/mb65s/keyboard.json b/keyboards/mechbrewery/mb65s/keyboard.json index e043d95860..eeafcaba1a 100644 --- a/keyboards/mechbrewery/mb65s/keyboard.json +++ b/keyboards/mechbrewery/mb65s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MB65S", "manufacturer": "MechBrewery", - "url": "", "maintainer": "AnthonyNguyen168", "usb": { "vid": "0x4252", diff --git a/keyboards/mechkeys/acr60/keyboard.json b/keyboards/mechkeys/acr60/keyboard.json index 6486b21f12..0be2ec47c1 100644 --- a/keyboards/mechkeys/acr60/keyboard.json +++ b/keyboards/mechkeys/acr60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ACR60", "manufacturer": "MechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mechkeys/alu84/keyboard.json b/keyboards/mechkeys/alu84/keyboard.json index 30f70b17c9..1d7d8cbee2 100644 --- a/keyboards/mechkeys/alu84/keyboard.json +++ b/keyboards/mechkeys/alu84/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ALU84", "manufacturer": "MechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mechkeys/espectro/keyboard.json b/keyboards/mechkeys/espectro/keyboard.json index f4d2aa29bb..d9a7dda165 100644 --- a/keyboards/mechkeys/espectro/keyboard.json +++ b/keyboards/mechkeys/espectro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Espectro", "manufacturer": "MechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mechkeys/mechmini/v1/keyboard.json b/keyboards/mechkeys/mechmini/v1/keyboard.json index 8d3a4a9b84..a1338c9ba9 100644 --- a/keyboards/mechkeys/mechmini/v1/keyboard.json +++ b/keyboards/mechkeys/mechmini/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MechMini", "manufacturer": "MechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mechkeys/mk60/keyboard.json b/keyboards/mechkeys/mk60/keyboard.json index e47d7def2c..bb9a69daf5 100644 --- a/keyboards/mechkeys/mk60/keyboard.json +++ b/keyboards/mechkeys/mk60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MK60", "manufacturer": "MechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mechlovin/adelais/info.json b/keyboards/mechlovin/adelais/info.json index 42b16d6398..84ca6403ce 100644 --- a/keyboards/mechlovin/adelais/info.json +++ b/keyboards/mechlovin/adelais/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/delphine/info.json b/keyboards/mechlovin/delphine/info.json index baeeab6f18..2fe90c7629 100644 --- a/keyboards/mechlovin/delphine/info.json +++ b/keyboards/mechlovin/delphine/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Delphine", "manufacturer": "Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C" diff --git a/keyboards/mechlovin/foundation/keyboard.json b/keyboards/mechlovin/foundation/keyboard.json index 3bd05add2f..00cf464255 100644 --- a/keyboards/mechlovin/foundation/keyboard.json +++ b/keyboards/mechlovin/foundation/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Foundation FRL", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Protozoa", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah60rgb/rev1/keyboard.json b/keyboards/mechlovin/hannah60rgb/rev1/keyboard.json index 4fb4dc2eef..e2b0ae715e 100644 --- a/keyboards/mechlovin/hannah60rgb/rev1/keyboard.json +++ b/keyboards/mechlovin/hannah60rgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hannah60 RGB", "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah60rgb/rev2/keyboard.json b/keyboards/mechlovin/hannah60rgb/rev2/keyboard.json index 06bb71a348..066422b3e3 100644 --- a/keyboards/mechlovin/hannah60rgb/rev2/keyboard.json +++ b/keyboards/mechlovin/hannah60rgb/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hannah60 RGB Rev.2", "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah65/rev1/haus/keyboard.json b/keyboards/mechlovin/hannah65/rev1/haus/keyboard.json index 7a935fc1a5..14ca49f207 100644 --- a/keyboards/mechlovin/hannah65/rev1/haus/keyboard.json +++ b/keyboards/mechlovin/hannah65/rev1/haus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Haus Rev. 1", "manufacturer": "Team Mechlovin", - "url": "", "maintainer": "Team Mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah910/rev1/keyboard.json b/keyboards/mechlovin/hannah910/rev1/keyboard.json index 61cf365337..44dedd57c3 100644 --- a/keyboards/mechlovin/hannah910/rev1/keyboard.json +++ b/keyboards/mechlovin/hannah910/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hannah910", "manufacturer": "Mechlovin", - "url": "", "maintainer": "Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah910/rev2/keyboard.json b/keyboards/mechlovin/hannah910/rev2/keyboard.json index 9fb5847124..8a01f6bb8b 100644 --- a/keyboards/mechlovin/hannah910/rev2/keyboard.json +++ b/keyboards/mechlovin/hannah910/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hannah910", "manufacturer": "Mechlovin", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hannah910/rev3/keyboard.json b/keyboards/mechlovin/hannah910/rev3/keyboard.json index ba88319890..668b31328f 100644 --- a/keyboards/mechlovin/hannah910/rev3/keyboard.json +++ b/keyboards/mechlovin/hannah910/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hannah910", "manufacturer": "Mechlovin", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hex4b/info.json b/keyboards/mechlovin/hex4b/info.json index 9964736255..de7f03bab9 100644 --- a/keyboards/mechlovin/hex4b/info.json +++ b/keyboards/mechlovin/hex4b/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Hex-Keyboard&Mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/hex6c/keyboard.json b/keyboards/mechlovin/hex6c/keyboard.json index e068420b81..c951cf242d 100644 --- a/keyboards/mechlovin/hex6c/keyboard.json +++ b/keyboards/mechlovin/hex6c/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Hex6C", "manufacturer": "Mechlovin Studio and Hex Keyboard", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity87/rev1/rogue87/keyboard.json b/keyboards/mechlovin/infinity87/rev1/rogue87/keyboard.json index 2ac0510dbf..840f8a0392 100644 --- a/keyboards/mechlovin/infinity87/rev1/rogue87/keyboard.json +++ b/keyboards/mechlovin/infinity87/rev1/rogue87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rogue87 Rev.1", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity87/rev1/rouge87/keyboard.json b/keyboards/mechlovin/infinity87/rev1/rouge87/keyboard.json index 6b947f0f1f..1eec53ebb9 100644 --- a/keyboards/mechlovin/infinity87/rev1/rouge87/keyboard.json +++ b/keyboards/mechlovin/infinity87/rev1/rouge87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rouge87 Rev.1", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity87/rev1/standard/keyboard.json b/keyboards/mechlovin/infinity87/rev1/standard/keyboard.json index a0cb10fac2..941f6ec955 100644 --- a/keyboards/mechlovin/infinity87/rev1/standard/keyboard.json +++ b/keyboards/mechlovin/infinity87/rev1/standard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "infinity87 Rev.1", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity87/rev2/keyboard.json b/keyboards/mechlovin/infinity87/rev2/keyboard.json index fdc6686988..618b9397bf 100644 --- a/keyboards/mechlovin/infinity87/rev2/keyboard.json +++ b/keyboards/mechlovin/infinity87/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Infinity87 Rev.2", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity87/rgb_rev1/keyboard.json b/keyboards/mechlovin/infinity87/rgb_rev1/keyboard.json index 2d177949dc..2ca5e03b36 100644 --- a/keyboards/mechlovin/infinity87/rgb_rev1/keyboard.json +++ b/keyboards/mechlovin/infinity87/rgb_rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Infinity87 RGB Rev1", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity875/keyboard.json b/keyboards/mechlovin/infinity875/keyboard.json index 73bdb0af13..1016178caa 100644 --- a/keyboards/mechlovin/infinity875/keyboard.json +++ b/keyboards/mechlovin/infinity875/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Infinity87.5", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinity88/keyboard.json b/keyboards/mechlovin/infinity88/keyboard.json index 14371d2459..3691c6d836 100644 --- a/keyboards/mechlovin/infinity88/keyboard.json +++ b/keyboards/mechlovin/infinity88/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Infinity 88", "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/infinityce/keyboard.json b/keyboards/mechlovin/infinityce/keyboard.json index 5b10e056ba..2de1bde499 100644 --- a/keyboards/mechlovin/infinityce/keyboard.json +++ b/keyboards/mechlovin/infinityce/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Infinity CE", "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/jay60/keyboard.json b/keyboards/mechlovin/jay60/keyboard.json index 75bf190d88..2b7e9ef914 100644 --- a/keyboards/mechlovin/jay60/keyboard.json +++ b/keyboards/mechlovin/jay60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jay60", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/kanu/keyboard.json b/keyboards/mechlovin/kanu/keyboard.json index 10cd22319a..233b82f71e 100644 --- a/keyboards/mechlovin/kanu/keyboard.json +++ b/keyboards/mechlovin/kanu/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kanu", "manufacturer": "Mechlovin", - "url": "", "maintainer": "Team Mechlovin'", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/kay60/keyboard.json b/keyboards/mechlovin/kay60/keyboard.json index 7c38273947..b42fd73b88 100644 --- a/keyboards/mechlovin/kay60/keyboard.json +++ b/keyboards/mechlovin/kay60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kay60", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/kay65/keyboard.json b/keyboards/mechlovin/kay65/keyboard.json index f5d5897939..d5008ec48f 100644 --- a/keyboards/mechlovin/kay65/keyboard.json +++ b/keyboards/mechlovin/kay65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kay65 Rev. 1", "manufacturer": "Team Mechlovin", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/mechlovin9/info.json b/keyboards/mechlovin/mechlovin9/info.json index 41133813ef..6783f0a323 100644 --- a/keyboards/mechlovin/mechlovin9/info.json +++ b/keyboards/mechlovin/mechlovin9/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Team Mechlovin", "usb": { "vid": "0x4D4C" diff --git a/keyboards/mechlovin/olly/bb/keyboard.json b/keyboards/mechlovin/olly/bb/keyboard.json index ac08e94c3c..de3eb16c1d 100644 --- a/keyboards/mechlovin/olly/bb/keyboard.json +++ b/keyboards/mechlovin/olly/bb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Olly BB", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/olly/jf/info.json b/keyboards/mechlovin/olly/jf/info.json index 315191e840..c5a70f44ba 100644 --- a/keyboards/mechlovin/olly/jf/info.json +++ b/keyboards/mechlovin/olly/jf/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C" diff --git a/keyboards/mechlovin/olly/octagon/keyboard.json b/keyboards/mechlovin/olly/octagon/keyboard.json index 9c580a664e..6df26bad09 100644 --- a/keyboards/mechlovin/olly/octagon/keyboard.json +++ b/keyboards/mechlovin/olly/octagon/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Olly Octagon", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/olly/orion/keyboard.json b/keyboards/mechlovin/olly/orion/keyboard.json index 2780e21949..408d904899 100644 --- a/keyboards/mechlovin/olly/orion/keyboard.json +++ b/keyboards/mechlovin/olly/orion/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Olly Orion", "manufacturer": "Mechlovin.Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/pisces/keyboard.json b/keyboards/mechlovin/pisces/keyboard.json index 37915826e6..b24afb6465 100644 --- a/keyboards/mechlovin/pisces/keyboard.json +++ b/keyboards/mechlovin/pisces/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pisces65", "manufacturer": "Team.Mechlovin", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/serratus/keyboard.json b/keyboards/mechlovin/serratus/keyboard.json index c283c48a35..8cf0778c1d 100644 --- a/keyboards/mechlovin/serratus/keyboard.json +++ b/keyboards/mechlovin/serratus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Serratus Rev.1", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/th1800/keyboard.json b/keyboards/mechlovin/th1800/keyboard.json index 66b7487545..8162deca81 100644 --- a/keyboards/mechlovin/th1800/keyboard.json +++ b/keyboards/mechlovin/th1800/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "th-1800", "manufacturer": "Team Mechlovin", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/zed1800/info.json b/keyboards/mechlovin/zed1800/info.json index 9de42c2442..aecaf6d922 100644 --- a/keyboards/mechlovin/zed1800/info.json +++ b/keyboards/mechlovin/zed1800/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/zed60/keyboard.json b/keyboards/mechlovin/zed60/keyboard.json index 136170eec6..480517a301 100644 --- a/keyboards/mechlovin/zed60/keyboard.json +++ b/keyboards/mechlovin/zed60/keyboard.json @@ -38,7 +38,6 @@ "saturation_steps": 8, "sleep": true }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0602", diff --git a/keyboards/mechlovin/zed65/mono_led/keyboard.json b/keyboards/mechlovin/zed65/mono_led/keyboard.json index 763fbe9f4c..e33db35a7a 100644 --- a/keyboards/mechlovin/zed65/mono_led/keyboard.json +++ b/keyboards/mechlovin/zed65/mono_led/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Zed65-MonoLED", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/zed65/no_backlight/cor65/keyboard.json b/keyboards/mechlovin/zed65/no_backlight/cor65/keyboard.json index 4b3ed831c5..56103e44db 100644 --- a/keyboards/mechlovin/zed65/no_backlight/cor65/keyboard.json +++ b/keyboards/mechlovin/zed65/no_backlight/cor65/keyboard.json @@ -11,7 +11,6 @@ "cols": ["B11", "B10", "B2", "B1", "B0", "A6", "A5", "A4", "A3", "A2", "C13", "B7", "B6", "B5", "B4", "B3"], "rows": ["B12", "B13", "B14", "B15", "A1"] }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x6504", diff --git a/keyboards/mechlovin/zed65/no_backlight/retro66/keyboard.json b/keyboards/mechlovin/zed65/no_backlight/retro66/keyboard.json index 49ed44f0a1..8fcfde5db9 100644 --- a/keyboards/mechlovin/zed65/no_backlight/retro66/keyboard.json +++ b/keyboards/mechlovin/zed65/no_backlight/retro66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Retro66", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Mechlovin' Studio", "usb": { "vid": "0x4D4C", diff --git a/keyboards/mechlovin/zed65/no_backlight/wearhaus66/keyboard.json b/keyboards/mechlovin/zed65/no_backlight/wearhaus66/keyboard.json index c9c9e0ddb1..c2b75fd1e4 100644 --- a/keyboards/mechlovin/zed65/no_backlight/wearhaus66/keyboard.json +++ b/keyboards/mechlovin/zed65/no_backlight/wearhaus66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wearhaus66", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "mechlovin", "usb": { "vid": "0x4D4C", diff --git a/keyboards/meetlab/kafka60/keyboard.json b/keyboards/meetlab/kafka60/keyboard.json index 5dbf3f5642..2c7c41b23d 100644 --- a/keyboards/meetlab/kafka60/keyboard.json +++ b/keyboards/meetlab/kafka60/keyboard.json @@ -13,7 +13,6 @@ "cols": ["A15", "B3", "B4", "B5", "B6", "B7", "B8", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "B11"], "rows": ["B15", "A8", "B13", "B12", "A9"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xBF06", diff --git a/keyboards/meetlab/kafka68/keyboard.json b/keyboards/meetlab/kafka68/keyboard.json index 3836edc3c9..418749ed43 100644 --- a/keyboards/meetlab/kafka68/keyboard.json +++ b/keyboards/meetlab/kafka68/keyboard.json @@ -14,7 +14,6 @@ "cols": ["A10", "B7", "B6", "B5", "B4", "B3", "A15", "B0", "A7", "A6", "A5", "A4", "A3", "B1", "B10", "B11"], "rows": ["B13", "B14", "B15", "A8", "A9"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xAA07", diff --git a/keyboards/meetlab/kafkasplit/keyboard.json b/keyboards/meetlab/kafkasplit/keyboard.json index 375d4f7a03..0ac90a56fb 100644 --- a/keyboards/meetlab/kafkasplit/keyboard.json +++ b/keyboards/meetlab/kafkasplit/keyboard.json @@ -143,7 +143,6 @@ } } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0xBFC2", diff --git a/keyboards/meetlab/kalice/keyboard.json b/keyboards/meetlab/kalice/keyboard.json index 5e53fe4904..eb91d64466 100644 --- a/keyboards/meetlab/kalice/keyboard.json +++ b/keyboards/meetlab/kalice/keyboard.json @@ -31,7 +31,6 @@ "led_count": 11, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xBB04", diff --git a/keyboards/meetlab/rena/keyboard.json b/keyboards/meetlab/rena/keyboard.json index cf28f6d5f0..8787fb0ee8 100644 --- a/keyboards/meetlab/rena/keyboard.json +++ b/keyboards/meetlab/rena/keyboard.json @@ -39,7 +39,6 @@ "led_count": 1, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xAB06", diff --git a/keyboards/mehkee96/keyboard.json b/keyboards/mehkee96/keyboard.json index 4f4d4853c8..326e91670d 100644 --- a/keyboards/mehkee96/keyboard.json +++ b/keyboards/mehkee96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "96KEE", "manufacturer": "Mehkee", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/melgeek/mach80/info.json b/keyboards/melgeek/mach80/info.json index ade831fc36..d8a565b2e4 100755 --- a/keyboards/melgeek/mach80/info.json +++ b/keyboards/melgeek/mach80/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mach80", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mj61/info.json b/keyboards/melgeek/mj61/info.json index d34dc59364..9a3e86d5e0 100644 --- a/keyboards/melgeek/mj61/info.json +++ b/keyboards/melgeek/mj61/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "MJ61", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mj63/info.json b/keyboards/melgeek/mj63/info.json index c81bf9f867..af59bf8a59 100644 --- a/keyboards/melgeek/mj63/info.json +++ b/keyboards/melgeek/mj63/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "MJ63", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mj64/info.json b/keyboards/melgeek/mj64/info.json index 731996ef84..25d908db5d 100644 --- a/keyboards/melgeek/mj64/info.json +++ b/keyboards/melgeek/mj64/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "MJ64", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mj65/rev3/keyboard.json b/keyboards/melgeek/mj65/rev3/keyboard.json index adf0ef94bc..a4513b45e7 100644 --- a/keyboards/melgeek/mj65/rev3/keyboard.json +++ b/keyboards/melgeek/mj65/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MJ65", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mj6xy/info.json b/keyboards/melgeek/mj6xy/info.json index 0dd1212354..3b13337aae 100755 --- a/keyboards/melgeek/mj6xy/info.json +++ b/keyboards/melgeek/mj6xy/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "MJ6XY", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mojo68/rev1/keyboard.json b/keyboards/melgeek/mojo68/rev1/keyboard.json index 7f21839292..d6388b089d 100755 --- a/keyboards/melgeek/mojo68/rev1/keyboard.json +++ b/keyboards/melgeek/mojo68/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MoJo68", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/mojo75/rev1/keyboard.json b/keyboards/melgeek/mojo75/rev1/keyboard.json index a1b93afb69..dbc6cbceee 100644 --- a/keyboards/melgeek/mojo75/rev1/keyboard.json +++ b/keyboards/melgeek/mojo75/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MoJo75", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/tegic/rev1/keyboard.json b/keyboards/melgeek/tegic/rev1/keyboard.json index 0a2e9306f6..c15a54b39f 100644 --- a/keyboards/melgeek/tegic/rev1/keyboard.json +++ b/keyboards/melgeek/tegic/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "tegic", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/melgeek/z70ultra/rev1/keyboard.json b/keyboards/melgeek/z70ultra/rev1/keyboard.json index de1b1df646..8f79b395fc 100644 --- a/keyboards/melgeek/z70ultra/rev1/keyboard.json +++ b/keyboards/melgeek/z70ultra/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Z70Ultra", "manufacturer": "MelGeek", - "url": "", "maintainer": "melgeek001365", "usb": { "vid": "0xEDED", diff --git a/keyboards/meme/keyboard.json b/keyboards/meme/keyboard.json index 27acfc5a33..5be88543dd 100644 --- a/keyboards/meme/keyboard.json +++ b/keyboards/meme/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Meme", "manufacturer": "Switchmod Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/merge/iso_macro/keyboard.json b/keyboards/merge/iso_macro/keyboard.json index 1c6d905282..bdf3737906 100644 --- a/keyboards/merge/iso_macro/keyboard.json +++ b/keyboards/merge/iso_macro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ISO Macro", "manufacturer": "Merge", - "url": "", "maintainer": "duoshock", "usb": { "vid": "0x4D65", diff --git a/keyboards/mexsistor/ludmila/keyboard.json b/keyboards/mexsistor/ludmila/keyboard.json index 71202208c5..61c4cca2ab 100644 --- a/keyboards/mexsistor/ludmila/keyboard.json +++ b/keyboards/mexsistor/ludmila/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ludmila Macropad", "manufacturer": "Kevin M.", - "url": "", "maintainer": "Kevin M.", "usb": { "vid": "0x69CC", diff --git a/keyboards/miller/gm862/keyboard.json b/keyboards/miller/gm862/keyboard.json index b8c32cf16a..210b37b7b0 100644 --- a/keyboards/miller/gm862/keyboard.json +++ b/keyboards/miller/gm862/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GM862", "manufacturer": "MILLER", - "url": "", "maintainer": "MILLER", "usb": { "vid": "0x4B42", diff --git a/keyboards/millet/doksin/keyboard.json b/keyboards/millet/doksin/keyboard.json index 7a848662cd..a472eebc79 100644 --- a/keyboards/millet/doksin/keyboard.json +++ b/keyboards/millet/doksin/keyboard.json @@ -14,7 +14,6 @@ ] }, "processor": "atmega32u2", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x1919", diff --git a/keyboards/mincedshon/ecila/keyboard.json b/keyboards/mincedshon/ecila/keyboard.json index fe7173e34a..73e52b7590 100644 --- a/keyboards/mincedshon/ecila/keyboard.json +++ b/keyboards/mincedshon/ecila/keyboard.json @@ -45,7 +45,6 @@ "rows": ["E6", "B3", "B5", "B4", "D7"] }, "processor": "atmega32u4", - "url": "", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/minimacro5/keyboard.json b/keyboards/minimacro5/keyboard.json index 32be6abd5f..e500efa251 100644 --- a/keyboards/minimacro5/keyboard.json +++ b/keyboards/minimacro5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "miniMACRO5", "manufacturer": "leafcutterlabs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCEEB", diff --git a/keyboards/mint60/keyboard.json b/keyboards/mint60/keyboard.json index c5bfe27365..9fa69f5a3c 100644 --- a/keyboards/mint60/keyboard.json +++ b/keyboards/mint60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mint60", "manufacturer": "Eucalyn", - "url": "", "maintainer": "eucalyn", "usb": { "vid": "0xFEED", diff --git a/keyboards/misterknife/knife66/keyboard.json b/keyboards/misterknife/knife66/keyboard.json index 9e3d0c66b7..3670b8a07f 100644 --- a/keyboards/misterknife/knife66/keyboard.json +++ b/keyboards/misterknife/knife66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Knife66", "manufacturer": "MisterKnife", - "url": "", "maintainer": "afewyards", "usb": { "vid": "0xAC11", diff --git a/keyboards/misterknife/knife66_iso/keyboard.json b/keyboards/misterknife/knife66_iso/keyboard.json index 88f8746109..3370afa1b5 100644 --- a/keyboards/misterknife/knife66_iso/keyboard.json +++ b/keyboards/misterknife/knife66_iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Knife66 ISO", "manufacturer": "MisterKnife", - "url": "", "maintainer": "afewyards", "usb": { "vid": "0xAC11", diff --git a/keyboards/mitosis/keyboard.json b/keyboards/mitosis/keyboard.json index c69d1d30cd..310c0ebd1a 100644 --- a/keyboards/mitosis/keyboard.json +++ b/keyboards/mitosis/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mitosis", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/miuni32/keyboard.json b/keyboards/miuni32/keyboard.json index 0b52b058fa..b105d2f2b8 100644 --- a/keyboards/miuni32/keyboard.json +++ b/keyboards/miuni32/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Miuni32", "manufacturer": "Bigtuna.io", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/mk65/keyboard.json b/keyboards/mk65/keyboard.json index 07a78872c4..0a768ece5e 100644 --- a/keyboards/mk65/keyboard.json +++ b/keyboards/mk65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MK-65", "manufacturer": "mangooo", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0x5004", diff --git a/keyboards/mmkzoo65/keyboard.json b/keyboards/mmkzoo65/keyboard.json index f023f34ef0..6e1c33273c 100644 --- a/keyboards/mmkzoo65/keyboard.json +++ b/keyboards/mmkzoo65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MMKZOO65", "manufacturer": "MWStudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7BA1", diff --git a/keyboards/mode/m256ws/keyboard.json b/keyboards/mode/m256ws/keyboard.json index 820ed536c2..3a754fe7db 100644 --- a/keyboards/mode/m256ws/keyboard.json +++ b/keyboards/mode/m256ws/keyboard.json @@ -36,7 +36,6 @@ "twinkle": true } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x5753", diff --git a/keyboards/mode/m60h/keyboard.json b/keyboards/mode/m60h/keyboard.json index b33ea3a9c3..26095bb828 100644 --- a/keyboards/mode/m60h/keyboard.json +++ b/keyboards/mode/m60h/keyboard.json @@ -39,7 +39,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0062", diff --git a/keyboards/mode/m60h_f/keyboard.json b/keyboards/mode/m60h_f/keyboard.json index 014472bc68..8a9a64ee65 100644 --- a/keyboards/mode/m60h_f/keyboard.json +++ b/keyboards/mode/m60h_f/keyboard.json @@ -39,7 +39,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0061", diff --git a/keyboards/mode/m60s/keyboard.json b/keyboards/mode/m60s/keyboard.json index 6a03219427..4a435967d6 100644 --- a/keyboards/mode/m60s/keyboard.json +++ b/keyboards/mode/m60s/keyboard.json @@ -39,7 +39,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0060", diff --git a/keyboards/mode/m65ha_alpha/keyboard.json b/keyboards/mode/m65ha_alpha/keyboard.json index cc5271b5c2..acf8845cd7 100644 --- a/keyboards/mode/m65ha_alpha/keyboard.json +++ b/keyboards/mode/m65ha_alpha/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SixtyFive HA", "manufacturer": "Mode", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m65hi_alpha/keyboard.json b/keyboards/mode/m65hi_alpha/keyboard.json index c0c843d4de..f85e1f3756 100644 --- a/keyboards/mode/m65hi_alpha/keyboard.json +++ b/keyboards/mode/m65hi_alpha/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SixtyFive HI", "manufacturer": "Mode", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m65s/keyboard.json b/keyboards/mode/m65s/keyboard.json index ae8df282ad..bd11e38bf4 100644 --- a/keyboards/mode/m65s/keyboard.json +++ b/keyboards/mode/m65s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SixtyFive S", "manufacturer": "Mode", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m75h/keyboard.json b/keyboards/mode/m75h/keyboard.json index 5d4d8249e6..6df6f28ab0 100644 --- a/keyboards/mode/m75h/keyboard.json +++ b/keyboards/mode/m75h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M75H", "manufacturer": "Mode", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m75s/keyboard.json b/keyboards/mode/m75s/keyboard.json index aff38dc622..f345874bbf 100644 --- a/keyboards/mode/m75s/keyboard.json +++ b/keyboards/mode/m75s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "75S", "manufacturer": "Mode", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m80v1/m80h/keyboard.json b/keyboards/mode/m80v1/m80h/keyboard.json index dcebcb6d49..9b7eeb85d2 100644 --- a/keyboards/mode/m80v1/m80h/keyboard.json +++ b/keyboards/mode/m80v1/m80h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eighty", "manufacturer": "Mode", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00DE", diff --git a/keyboards/mode/m80v1/m80s/keyboard.json b/keyboards/mode/m80v1/m80s/keyboard.json index 25bfd3c70a..4f93ef676c 100644 --- a/keyboards/mode/m80v1/m80s/keyboard.json +++ b/keyboards/mode/m80v1/m80s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eighty", "manufacturer": "Mode", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x00DE", diff --git a/keyboards/mokey/ginkgo65/keyboard.json b/keyboards/mokey/ginkgo65/keyboard.json index 311d91f2d3..bdee6ebf80 100644 --- a/keyboards/mokey/ginkgo65/keyboard.json +++ b/keyboards/mokey/ginkgo65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ginkgo 65", "manufacturer": "Mokey", - "url": "", "maintainer": "rhmokey", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/ginkgo65hot/keyboard.json b/keyboards/mokey/ginkgo65hot/keyboard.json index 1674607310..c42c2a87ff 100644 --- a/keyboards/mokey/ginkgo65hot/keyboard.json +++ b/keyboards/mokey/ginkgo65hot/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ginkgo65hot", "manufacturer": "Mokey", - "url": "", "maintainer": "mokey", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/ibis80/keyboard.json b/keyboards/mokey/ibis80/keyboard.json index d6cd985d01..536de9aab6 100644 --- a/keyboards/mokey/ibis80/keyboard.json +++ b/keyboards/mokey/ibis80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ibis 80", "manufacturer": "Mokey", - "url": "", "maintainer": "Runheme", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/luckycat70/keyboard.json b/keyboards/mokey/luckycat70/keyboard.json index 2f9ab6a1e5..81d077f8a5 100644 --- a/keyboards/mokey/luckycat70/keyboard.json +++ b/keyboards/mokey/luckycat70/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lucky Cat 70", "manufacturer": "qmk", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/mokey12x2/keyboard.json b/keyboards/mokey/mokey12x2/keyboard.json index 6f22429e72..489856a264 100644 --- a/keyboards/mokey/mokey12x2/keyboard.json +++ b/keyboards/mokey/mokey12x2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mokey12x2", "manufacturer": "Mokey", - "url": "", "maintainer": "Mokey", "development_board": "bluepill", "diode_direction": "COL2ROW", diff --git a/keyboards/mokey/mokey63/keyboard.json b/keyboards/mokey/mokey63/keyboard.json index bebc600510..40b45bcd41 100644 --- a/keyboards/mokey/mokey63/keyboard.json +++ b/keyboards/mokey/mokey63/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mokey63", "manufacturer": "Mokey", - "url": "", "maintainer": "mokey", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/mokey64/keyboard.json b/keyboards/mokey/mokey64/keyboard.json index 0234cf6292..fbc50d4fd8 100644 --- a/keyboards/mokey/mokey64/keyboard.json +++ b/keyboards/mokey/mokey64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mokey64", "manufacturer": "Mokey", - "url": "", "maintainer": "mokey", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/xox70/keyboard.json b/keyboards/mokey/xox70/keyboard.json index 4f8f5439f5..41980ed4ad 100644 --- a/keyboards/mokey/xox70/keyboard.json +++ b/keyboards/mokey/xox70/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XOX 70", "manufacturer": "Mokey", - "url": "", "maintainer": "Mokey", "usb": { "vid": "0x6653", diff --git a/keyboards/mokey/xox70hot/keyboard.json b/keyboards/mokey/xox70hot/keyboard.json index 7d5f338b62..011e031ffe 100644 --- a/keyboards/mokey/xox70hot/keyboard.json +++ b/keyboards/mokey/xox70hot/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XOX 70 Hotswap", "manufacturer": "Mokey", - "url": "", "maintainer": "rhmokey", "usb": { "vid": "0x6653", diff --git a/keyboards/moky/moky67/keyboard.json b/keyboards/moky/moky67/keyboard.json index 8737790b69..869dfc3389 100644 --- a/keyboards/moky/moky67/keyboard.json +++ b/keyboards/moky/moky67/keyboard.json @@ -1,7 +1,6 @@ { "manufacturer": "moky", "keyboard_name": "moky67", - "url": "", "processor": "WB32FQ95", "bootloader": "wb32-dfu", "usb": { diff --git a/keyboards/moky/moky88/keyboard.json b/keyboards/moky/moky88/keyboard.json index 38ed4dbd28..1db4c5247c 100644 --- a/keyboards/moky/moky88/keyboard.json +++ b/keyboards/moky/moky88/keyboard.json @@ -1,7 +1,6 @@ { "manufacturer": "moky", "keyboard_name": "moky88", - "url": "", "processor": "WB32FQ95", "bootloader": "wb32-dfu", "usb": { diff --git a/keyboards/momoka_ergo/keyboard.json b/keyboards/momoka_ergo/keyboard.json index a24430ee82..23e0535d61 100644 --- a/keyboards/momoka_ergo/keyboard.json +++ b/keyboards/momoka_ergo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Momoka Ergo", "manufacturer": "StefanGrindelwald", - "url": "", "maintainer": "StefanGrindelwald", "usb": { "vid": "0x4F4D", diff --git a/keyboards/momokai/aurora/keyboard.json b/keyboards/momokai/aurora/keyboard.json index 9c5ff2a043..572d302663 100644 --- a/keyboards/momokai/aurora/keyboard.json +++ b/keyboards/momokai/aurora/keyboard.json @@ -24,7 +24,6 @@ ] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0009", diff --git a/keyboards/momokai/tap_duo/keyboard.json b/keyboards/momokai/tap_duo/keyboard.json index ad38187949..7658a7c5c6 100644 --- a/keyboards/momokai/tap_duo/keyboard.json +++ b/keyboards/momokai/tap_duo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tap Duo", "manufacturer": "Momokai", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x69F9", diff --git a/keyboards/momokai/tap_trio/keyboard.json b/keyboards/momokai/tap_trio/keyboard.json index 23e9867fe7..9ce41ff5ad 100644 --- a/keyboards/momokai/tap_trio/keyboard.json +++ b/keyboards/momokai/tap_trio/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tap Trio", "manufacturer": "Momokai", - "url": "", "maintainer": "peepeetee", "usb": { "vid": "0x69F9", diff --git a/keyboards/monarch/keyboard.json b/keyboards/monarch/keyboard.json index c42db64a26..b7237ec613 100644 --- a/keyboards/monarch/keyboard.json +++ b/keyboards/monarch/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Monarch", "manufacturer": "DoCallMeKing", - "url": "", "maintainer": "Ramon Imbao", "usb": { "vid": "0x4011", diff --git a/keyboards/monoflex60/keyboard.json b/keyboards/monoflex60/keyboard.json index 4c6fca7524..9be4b39202 100644 --- a/keyboards/monoflex60/keyboard.json +++ b/keyboards/monoflex60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Monoflex 60", "manufacturer": "SantiGo Customs", - "url": "", "maintainer": "key10iq", "usb": { "vid": "0xDEB4", diff --git a/keyboards/mothwing/keyboard.json b/keyboards/mothwing/keyboard.json index c52d9df00e..5a584c7cb2 100644 --- a/keyboards/mothwing/keyboard.json +++ b/keyboards/mothwing/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "mothwing", "manufacturer": "Luana co.ltd.", - "url": "", "maintainer": "tan-t", "usb": { "vid": "0x4D77", diff --git a/keyboards/mountainblocks/mb17/keyboard.json b/keyboards/mountainblocks/mb17/keyboard.json index 9e9bb98406..9103f7775f 100644 --- a/keyboards/mountainblocks/mb17/keyboard.json +++ b/keyboards/mountainblocks/mb17/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MB17", "manufacturer": "Mountainblocks", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D42", diff --git a/keyboards/mountainmechdesigns/teton_78/keyboard.json b/keyboards/mountainmechdesigns/teton_78/keyboard.json index d6f5ce9cd8..61ae4ac495 100644 --- a/keyboards/mountainmechdesigns/teton_78/keyboard.json +++ b/keyboards/mountainmechdesigns/teton_78/keyboard.json @@ -20,7 +20,6 @@ "rows": ["D0", "D1", "D2", "D3", "D5"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3349", diff --git a/keyboards/ms_sculpt/keyboard.json b/keyboards/ms_sculpt/keyboard.json index 5353a0df7e..4fa0dcca48 100644 --- a/keyboards/ms_sculpt/keyboard.json +++ b/keyboards/ms_sculpt/keyboard.json @@ -22,7 +22,6 @@ "io_delay": 5 }, "debounce": 3, - "url": "", "usb": { "polling_interval": 1, "device_version": "1.0.0", diff --git a/keyboards/mss_studio/m63_rgb/keyboard.json b/keyboards/mss_studio/m63_rgb/keyboard.json index 1b1745bc20..7647896711 100644 --- a/keyboards/mss_studio/m63_rgb/keyboard.json +++ b/keyboards/mss_studio/m63_rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M63 RGB", "manufacturer": "Mss Studio", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x4D4B", diff --git a/keyboards/mss_studio/m64_rgb/keyboard.json b/keyboards/mss_studio/m64_rgb/keyboard.json index eb1cabb305..885d55055e 100644 --- a/keyboards/mss_studio/m64_rgb/keyboard.json +++ b/keyboards/mss_studio/m64_rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M64 RGB", "manufacturer": "Mss Studio", - "url": "", "maintainer": "HorrorTroll", "usb": { "vid": "0x4D4B", diff --git a/keyboards/mt/blocked65/keyboard.json b/keyboards/mt/blocked65/keyboard.json index 9a0ce52043..d07ca870ae 100644 --- a/keyboards/mt/blocked65/keyboard.json +++ b/keyboards/mt/blocked65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Blocked65", "manufacturer": "Dou", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5746", diff --git a/keyboards/mt/mt40/keyboard.json b/keyboards/mt/mt40/keyboard.json index d1700389f7..e02109b1cc 100644 --- a/keyboards/mt/mt40/keyboard.json +++ b/keyboards/mt/mt40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MT40", "manufacturer": "ThomasDehaeze", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/mt/mt64rgb/keyboard.json b/keyboards/mt/mt64rgb/keyboard.json index 451be59f8f..bac2c213aa 100644 --- a/keyboards/mt/mt64rgb/keyboard.json +++ b/keyboards/mt/mt64rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MT64RGB", "manufacturer": "MT", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D54", diff --git a/keyboards/mt/mt84/keyboard.json b/keyboards/mt/mt84/keyboard.json index 26f66b31db..1f73f1d5a2 100644 --- a/keyboards/mt/mt84/keyboard.json +++ b/keyboards/mt/mt84/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MT84", "manufacturer": "MT", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D54", diff --git a/keyboards/mt/split75/keyboard.json b/keyboards/mt/split75/keyboard.json index c13fa28b80..611e25bb6f 100644 --- a/keyboards/mt/split75/keyboard.json +++ b/keyboards/mt/split75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Split75", "manufacturer": "YMDK", - "url": "", "maintainer": "Michael L. Walker", "usb": { "vid": "0x594D", diff --git a/keyboards/murcielago/rev1/keyboard.json b/keyboards/murcielago/rev1/keyboard.json index 4d3a82ef2c..bba7cf9089 100644 --- a/keyboards/murcielago/rev1/keyboard.json +++ b/keyboards/murcielago/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Murci\u00e9lago", "manufacturer": "elagil", - "url": "", "maintainer": "elagil", "usb": { "vid": "0x6166", diff --git a/keyboards/mwstudio/mmk_3/keyboard.json b/keyboards/mwstudio/mmk_3/keyboard.json index c63bd69f62..b812cb7e3b 100644 --- a/keyboards/mwstudio/mmk_3/keyboard.json +++ b/keyboards/mwstudio/mmk_3/keyboard.json @@ -31,7 +31,6 @@ "hue_steps": 10, "led_count": 5 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3001", diff --git a/keyboards/mwstudio/mw65_black/keyboard.json b/keyboards/mwstudio/mw65_black/keyboard.json index 8955cf9688..6ae4b6055e 100644 --- a/keyboards/mwstudio/mw65_black/keyboard.json +++ b/keyboards/mwstudio/mw65_black/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MW65 Black", "manufacturer": "MWStudio", - "url": "", "maintainer": "TW59420", "usb": { "vid": "0x7BA1", diff --git a/keyboards/mwstudio/mw65_rgb/keyboard.json b/keyboards/mwstudio/mw65_rgb/keyboard.json index f1a8190948..25a33783f5 100644 --- a/keyboards/mwstudio/mw65_rgb/keyboard.json +++ b/keyboards/mwstudio/mw65_rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MW65 RGB", "manufacturer": "MWStudio", - "url": "", "maintainer": "TW59420", "usb": { "vid": "0x7BA1", diff --git a/keyboards/mwstudio/mw660/keyboard.json b/keyboards/mwstudio/mw660/keyboard.json index fdbd7564a7..629eea2820 100644 --- a/keyboards/mwstudio/mw660/keyboard.json +++ b/keyboards/mwstudio/mw660/keyboard.json @@ -24,7 +24,6 @@ }, "processor": "STM32F103", "bootloader": "stm32duino", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x6601", diff --git a/keyboards/mwstudio/mw75/keyboard.json b/keyboards/mwstudio/mw75/keyboard.json index d9e540bca4..2d826b1c99 100644 --- a/keyboards/mwstudio/mw75/keyboard.json +++ b/keyboards/mwstudio/mw75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MW75", "manufacturer": "MWStudio", - "url": "", "maintainer": "TW59420", "usb": { "vid": "0x7BA1", diff --git a/keyboards/mwstudio/mw75r2/keyboard.json b/keyboards/mwstudio/mw75r2/keyboard.json index ae227830e5..144a848b18 100644 --- a/keyboards/mwstudio/mw75r2/keyboard.json +++ b/keyboards/mwstudio/mw75r2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MW75R2", "manufacturer": "MWStudio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7BA1", diff --git a/keyboards/mwstudio/mw80/keyboard.json b/keyboards/mwstudio/mw80/keyboard.json index 08591eb706..423ec94e0e 100644 --- a/keyboards/mwstudio/mw80/keyboard.json +++ b/keyboards/mwstudio/mw80/keyboard.json @@ -18,7 +18,6 @@ }, "processor": "STM32F103", "bootloader": "stm32duino", - "url": "", "indicators": { "caps_lock": "A0" }, diff --git a/keyboards/mykeyclub/jris65/hotswap/keyboard.json b/keyboards/mykeyclub/jris65/hotswap/keyboard.json index 3ed56136d1..134edbf4f0 100644 --- a/keyboards/mykeyclub/jris65/hotswap/keyboard.json +++ b/keyboards/mykeyclub/jris65/hotswap/keyboard.json @@ -15,7 +15,6 @@ "rows": ["F7", "F6", "F5", "B2", "F4"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "0.1.0", "pid": "0x4953", diff --git a/keyboards/nacly/splitreus62/keyboard.json b/keyboards/nacly/splitreus62/keyboard.json index a3b1544b9a..e91b4bdc75 100644 --- a/keyboards/nacly/splitreus62/keyboard.json +++ b/keyboards/nacly/splitreus62/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Splitreus62", "manufacturer": "NaCly", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBEEF", diff --git a/keyboards/nacly/ua62/keyboard.json b/keyboards/nacly/ua62/keyboard.json index 43f2e9e662..0bf01308f5 100644 --- a/keyboards/nacly/ua62/keyboard.json +++ b/keyboards/nacly/ua62/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UA62", "manufacturer": "NaCly", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBEEF", diff --git a/keyboards/navi60/keyboard.json b/keyboards/navi60/keyboard.json index 42c3e5da1d..8d41c7a1b3 100644 --- a/keyboards/navi60/keyboard.json +++ b/keyboards/navi60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Navi60", "manufacturer": "Navi60", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0x5001", diff --git a/keyboards/ncc1701kb/keyboard.json b/keyboards/ncc1701kb/keyboard.json index f30b85f47a..753db62d7f 100644 --- a/keyboards/ncc1701kb/keyboard.json +++ b/keyboards/ncc1701kb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NCC-1701-KB", "manufacturer": "J2L Designs", - "url": "", "maintainer": "jessel92", "usb": { "vid": "0xFEED", diff --git a/keyboards/nek_type_a/keyboard.json b/keyboards/nek_type_a/keyboard.json index 39bad11a18..a99a6b0301 100644 --- a/keyboards/nek_type_a/keyboard.json +++ b/keyboards/nek_type_a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEK Type A", "manufacturer": "miker", - "url": "", "maintainer": "ecopoesis", "usb": { "vid": "0xFEED", diff --git a/keyboards/nemui/keyboard.json b/keyboards/nemui/keyboard.json index fb2adb6ae4..5d607ee61e 100644 --- a/keyboards/nemui/keyboard.json +++ b/keyboards/nemui/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Nemui", "manufacturer": "Bachoo", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x6400", diff --git a/keyboards/neokeys/g67/element_hs/keyboard.json b/keyboards/neokeys/g67/element_hs/keyboard.json index f477c33d6a..489e2d90ed 100644 --- a/keyboards/neokeys/g67/element_hs/keyboard.json +++ b/keyboards/neokeys/g67/element_hs/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Element G67 Hotswap", "manufacturer": "NEO Keys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E4B", diff --git a/keyboards/neokeys/g67/hotswap/keyboard.json b/keyboards/neokeys/g67/hotswap/keyboard.json index 937e802fa0..ec28fdabb7 100644 --- a/keyboards/neokeys/g67/hotswap/keyboard.json +++ b/keyboards/neokeys/g67/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Palette G67 Hotswap", "manufacturer": "NEO Keys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E4B", diff --git a/keyboards/neokeys/g67/soldered/keyboard.json b/keyboards/neokeys/g67/soldered/keyboard.json index 541f07ee09..8944ff3d7b 100644 --- a/keyboards/neokeys/g67/soldered/keyboard.json +++ b/keyboards/neokeys/g67/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Palette G67 Soldered", "manufacturer": "NEO Keys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E4B", diff --git a/keyboards/neson_design/700e/keyboard.json b/keyboards/neson_design/700e/keyboard.json index 64a18f436b..4cd7de0d81 100644 --- a/keyboards/neson_design/700e/keyboard.json +++ b/keyboards/neson_design/700e/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "700E", "manufacturer": "Neson Design", - "url": "", "maintainer": "yulei", "usb": { "vid": "0x4E65", diff --git a/keyboards/neson_design/810e/keyboard.json b/keyboards/neson_design/810e/keyboard.json index 2c62eb1f88..ab52c1539e 100644 --- a/keyboards/neson_design/810e/keyboard.json +++ b/keyboards/neson_design/810e/keyboard.json @@ -19,7 +19,6 @@ "rows": ["C13", "C14", "A6", "A7", "A5"] }, "processor": "STM32F411", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x810E", diff --git a/keyboards/neson_design/n6/keyboard.json b/keyboards/neson_design/n6/keyboard.json index 66e6fb740c..9f7d3fb1c0 100644 --- a/keyboards/neson_design/n6/keyboard.json +++ b/keyboards/neson_design/n6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "N6", "manufacturer": "Neson Design", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E65", diff --git a/keyboards/neson_design/nico/keyboard.json b/keyboards/neson_design/nico/keyboard.json index 477ac3ba7c..6efa5ee703 100644 --- a/keyboards/neson_design/nico/keyboard.json +++ b/keyboards/neson_design/nico/keyboard.json @@ -27,7 +27,6 @@ "rgblight": { "led_count": 5 }, - "url": "", "usb": { "device_version": "0.0.1", "no_startup_check": true, diff --git a/keyboards/newgame40/keyboard.json b/keyboards/newgame40/keyboard.json index 063260b99f..63ae114f2e 100644 --- a/keyboards/newgame40/keyboard.json +++ b/keyboards/newgame40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEWGAME40", "manufacturer": "GoTakigawa", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/nibell/micropad4x4/keyboard.json b/keyboards/nibell/micropad4x4/keyboard.json index b992f501cf..0305412f8c 100644 --- a/keyboards/nibell/micropad4x4/keyboard.json +++ b/keyboards/nibell/micropad4x4/keyboard.json @@ -15,7 +15,6 @@ "rows": ["GP10", "GP11", "GP12", "GP13"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xFEED", diff --git a/keyboards/nibiria/stream15/keyboard.json b/keyboards/nibiria/stream15/keyboard.json index 9daeef7cf9..6edcb70183 100644 --- a/keyboards/nibiria/stream15/keyboard.json +++ b/keyboards/nibiria/stream15/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stream15", "manufacturer": "Nibiria", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E49", diff --git a/keyboards/nightly_boards/adellein/keyboard.json b/keyboards/nightly_boards/adellein/keyboard.json index 3f873ba5f5..64b345f073 100644 --- a/keyboards/nightly_boards/adellein/keyboard.json +++ b/keyboards/nightly_boards/adellein/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Adellein", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/alter/rev1/keyboard.json b/keyboards/nightly_boards/alter/rev1/keyboard.json index e02e7e5b1b..3f4d3055f6 100644 --- a/keyboards/nightly_boards/alter/rev1/keyboard.json +++ b/keyboards/nightly_boards/alter/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alter", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0x0717", diff --git a/keyboards/nightly_boards/alter_lite/keyboard.json b/keyboards/nightly_boards/alter_lite/keyboard.json index d06dd3aacd..8e51d6ae6b 100644 --- a/keyboards/nightly_boards/alter_lite/keyboard.json +++ b/keyboards/nightly_boards/alter_lite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alter Lite", "manufacturer": "DeskDaily", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/conde60/keyboard.json b/keyboards/nightly_boards/conde60/keyboard.json index 38e7b8383a..0c78a269b3 100644 --- a/keyboards/nightly_boards/conde60/keyboard.json +++ b/keyboards/nightly_boards/conde60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Conde60", "manufacturer": "DeskDaily", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/n2/keyboard.json b/keyboards/nightly_boards/n2/keyboard.json index 4aa554716f..db52cde6f9 100644 --- a/keyboards/nightly_boards/n2/keyboard.json +++ b/keyboards/nightly_boards/n2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "[n]2", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0x0717", diff --git a/keyboards/nightly_boards/n40_o/keyboard.json b/keyboards/nightly_boards/n40_o/keyboard.json index f749c143eb..c1b8381669 100644 --- a/keyboards/nightly_boards/n40_o/keyboard.json +++ b/keyboards/nightly_boards/n40_o/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "[n]40-o", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "features": { "bootmagic": true, diff --git a/keyboards/nightly_boards/n60_s/keyboard.json b/keyboards/nightly_boards/n60_s/keyboard.json index f6e235fec5..664ff84c18 100644 --- a/keyboards/nightly_boards/n60_s/keyboard.json +++ b/keyboards/nightly_boards/n60_s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "[n]60-S", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/n87/keyboard.json b/keyboards/nightly_boards/n87/keyboard.json index ddfd27125c..150022038c 100644 --- a/keyboards/nightly_boards/n87/keyboard.json +++ b/keyboards/nightly_boards/n87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "[n]87", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0x0717", diff --git a/keyboards/nightly_boards/n9/keyboard.json b/keyboards/nightly_boards/n9/keyboard.json index 83f9495445..23d09fbfb6 100644 --- a/keyboards/nightly_boards/n9/keyboard.json +++ b/keyboards/nightly_boards/n9/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "[n]9", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/octopad/keyboard.json b/keyboards/nightly_boards/octopad/keyboard.json index 797f26a2c2..9b0128e3d0 100644 --- a/keyboards/nightly_boards/octopad/keyboard.json +++ b/keyboards/nightly_boards/octopad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Octopad", "manufacturer": "Neil Brian Ramirez", - "url": "", "maintainer": "Neil Brian Ramirez", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/octopadplus/keyboard.json b/keyboards/nightly_boards/octopadplus/keyboard.json index 8b94b722a8..5ba2d414b6 100644 --- a/keyboards/nightly_boards/octopadplus/keyboard.json +++ b/keyboards/nightly_boards/octopadplus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Octopad+", "manufacturer": "DeskDaily", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0xD812", diff --git a/keyboards/nightly_boards/paraluman/keyboard.json b/keyboards/nightly_boards/paraluman/keyboard.json index f18cefe601..78fd1e6853 100644 --- a/keyboards/nightly_boards/paraluman/keyboard.json +++ b/keyboards/nightly_boards/paraluman/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Paraluman", "manufacturer": "DeskDaily", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0xD812", diff --git a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json index 57a2438c3d..3756537772 100644 --- a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json +++ b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json @@ -29,7 +29,6 @@ "pin": "B5" }, "development_board": "promicro", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/nix_studio/n60_a/keyboard.json b/keyboards/nix_studio/n60_a/keyboard.json index 3f9b4dd086..de5507c692 100644 --- a/keyboards/nix_studio/n60_a/keyboard.json +++ b/keyboards/nix_studio/n60_a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "N60A", "manufacturer": "Nix Studio", - "url": "", "maintainer": "Nix Studio", "usb": { "vid": "0x6E78", diff --git a/keyboards/nix_studio/oxalys80/keyboard.json b/keyboards/nix_studio/oxalys80/keyboard.json index 470c43ea2f..8cd4598957 100644 --- a/keyboards/nix_studio/oxalys80/keyboard.json +++ b/keyboards/nix_studio/oxalys80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OXALYS80", "manufacturer": "Nix Studio", - "url": "", "maintainer": "Nix Studio", "usb": { "vid": "0x6E78", diff --git a/keyboards/novelkeys/nk65/info.json b/keyboards/novelkeys/nk65/info.json index e3bff19346..ae02d3ac05 100755 --- a/keyboards/novelkeys/nk65/info.json +++ b/keyboards/novelkeys/nk65/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "NK65", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/novelkeys/novelpad/keyboard.json b/keyboards/novelkeys/novelpad/keyboard.json index bb190dd284..9cdaa81e5f 100644 --- a/keyboards/novelkeys/novelpad/keyboard.json +++ b/keyboards/novelkeys/novelpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NovelPad", "manufacturer": "NovelKeys.xyz", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/noxary/220/keyboard.json b/keyboards/noxary/220/keyboard.json index 3565316999..60e68305d3 100644 --- a/keyboards/noxary/220/keyboard.json +++ b/keyboards/noxary/220/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "220", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/260/keyboard.json b/keyboards/noxary/260/keyboard.json index d5353d4244..e5af9b3095 100644 --- a/keyboards/noxary/260/keyboard.json +++ b/keyboards/noxary/260/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "260", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/268_2/keyboard.json b/keyboards/noxary/268_2/keyboard.json index 08daee6d63..378d216f29 100644 --- a/keyboards/noxary/268_2/keyboard.json +++ b/keyboards/noxary/268_2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "268.2", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/268_2_rgb/keyboard.json b/keyboards/noxary/268_2_rgb/keyboard.json index 380a772767..a36c530863 100644 --- a/keyboards/noxary/268_2_rgb/keyboard.json +++ b/keyboards/noxary/268_2_rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "268.2 RGB", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/280/keyboard.json b/keyboards/noxary/280/keyboard.json index 4bd9257152..88bf9e2123 100644 --- a/keyboards/noxary/280/keyboard.json +++ b/keyboards/noxary/280/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "280", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/378/keyboard.json b/keyboards/noxary/378/keyboard.json index 3502604d6c..7c66448832 100644 --- a/keyboards/noxary/378/keyboard.json +++ b/keyboards/noxary/378/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "378", "manufacturer": "Noxary", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/valhalla/keyboard.json b/keyboards/noxary/valhalla/keyboard.json index 3bc3d80a34..817a46ed29 100644 --- a/keyboards/noxary/valhalla/keyboard.json +++ b/keyboards/noxary/valhalla/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Valhalla", "manufacturer": "Noxary", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/valhalla_v2/keyboard.json b/keyboards/noxary/valhalla_v2/keyboard.json index 671bd0b775..88ae2b8997 100644 --- a/keyboards/noxary/valhalla_v2/keyboard.json +++ b/keyboards/noxary/valhalla_v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Valhalla V2", "manufacturer": "Noxary", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x4E58", diff --git a/keyboards/noxary/x268/keyboard.json b/keyboards/noxary/x268/keyboard.json index 7ca5799de2..bc690815a6 100644 --- a/keyboards/noxary/x268/keyboard.json +++ b/keyboards/noxary/x268/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "x268", "manufacturer": "Noxary", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4E58", diff --git a/keyboards/numatreus/keyboard.json b/keyboards/numatreus/keyboard.json index 3120b48f55..3441a769e1 100644 --- a/keyboards/numatreus/keyboard.json +++ b/keyboards/numatreus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NumAtreus", "manufacturer": "yohewi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/obosob/arch_36/keyboard.json b/keyboards/obosob/arch_36/keyboard.json index 290446dd22..d24bab7334 100644 --- a/keyboards/obosob/arch_36/keyboard.json +++ b/keyboards/obosob/arch_36/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Arch-36", "manufacturer": "obosob", - "url": "", "maintainer": "obosob", "usb": { "vid": "0xFEED", diff --git a/keyboards/ocean/gin_v2/keyboard.json b/keyboards/ocean/gin_v2/keyboard.json index b6f22b813b..9485af7df6 100644 --- a/keyboards/ocean/gin_v2/keyboard.json +++ b/keyboards/ocean/gin_v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Gin V2", "manufacturer": "Ocean", - "url": "", "maintainer": "Ocean", "usb": { "vid": "0x9624", diff --git a/keyboards/ocean/slamz/keyboard.json b/keyboards/ocean/slamz/keyboard.json index 6712077763..56344963f1 100644 --- a/keyboards/ocean/slamz/keyboard.json +++ b/keyboards/ocean/slamz/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Slamz", "manufacturer": "Ocean", - "url": "", "maintainer": "Ocean", "usb": { "vid": "0x9624", diff --git a/keyboards/ocean/stealth/keyboard.json b/keyboards/ocean/stealth/keyboard.json index b094a5f4bf..f5ed562fab 100644 --- a/keyboards/ocean/stealth/keyboard.json +++ b/keyboards/ocean/stealth/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stealth", "manufacturer": "Ocean", - "url": "", "maintainer": "Ocean", "usb": { "vid": "0x9624", diff --git a/keyboards/ocean/wang_ergo/keyboard.json b/keyboards/ocean/wang_ergo/keyboard.json index 5debc4396d..758544e522 100644 --- a/keyboards/ocean/wang_ergo/keyboard.json +++ b/keyboards/ocean/wang_ergo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wang Ergo", "manufacturer": "Ocean", - "url": "", "maintainer": "oceeean", "usb": { "vid": "0x9624", diff --git a/keyboards/ocean/wang_v2/keyboard.json b/keyboards/ocean/wang_v2/keyboard.json index 6e80932ce2..1507d8634b 100644 --- a/keyboards/ocean/wang_v2/keyboard.json +++ b/keyboards/ocean/wang_v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wang V2", "manufacturer": "Ocean", - "url": "", "maintainer": "Ocean", "usb": { "vid": "0x9624", diff --git a/keyboards/odelia/keyboard.json b/keyboards/odelia/keyboard.json index 3c187b5c18..671d750e4e 100644 --- a/keyboards/odelia/keyboard.json +++ b/keyboards/odelia/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Odelia", "manufacturer": "InterpolKeeb", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x6BE3", diff --git a/keyboards/ogre/ergo_single/keyboard.json b/keyboards/ogre/ergo_single/keyboard.json index 3ebd88b0d2..9fbc54db42 100644 --- a/keyboards/ogre/ergo_single/keyboard.json +++ b/keyboards/ogre/ergo_single/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ogre Ergo Single", "manufacturer": "ctrlshiftba", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/ogre/ergo_split/keyboard.json b/keyboards/ogre/ergo_split/keyboard.json index 4dc3caa530..5c5d750add 100644 --- a/keyboards/ogre/ergo_split/keyboard.json +++ b/keyboards/ogre/ergo_split/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ogre Ergo Split", "manufacturer": "ctrlshiftba", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/ok60/keyboard.json b/keyboards/ok60/keyboard.json index 5cf55b666d..98d19c77b7 100644 --- a/keyboards/ok60/keyboard.json +++ b/keyboards/ok60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OK60", "manufacturer": "OK60", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4B36", diff --git a/keyboards/omkbd/ergodash/mini/keyboard.json b/keyboards/omkbd/ergodash/mini/keyboard.json index 7c15c4f6f7..ea12ea5a9e 100644 --- a/keyboards/omkbd/ergodash/mini/keyboard.json +++ b/keyboards/omkbd/ergodash/mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ErgoDash Mini", "manufacturer": "Omkbd", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/ergodash/rev1/keyboard.json b/keyboards/omkbd/ergodash/rev1/keyboard.json index 6a61950ba6..a25610be9c 100644 --- a/keyboards/omkbd/ergodash/rev1/keyboard.json +++ b/keyboards/omkbd/ergodash/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ErgoDash rev1.2", "manufacturer": "Omkbd", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/3x6/keyboard.json b/keyboards/omkbd/runner3680/3x6/keyboard.json index 44c5ce35a0..4b8c71a156 100644 --- a/keyboards/omkbd/runner3680/3x6/keyboard.json +++ b/keyboards/omkbd/runner3680/3x6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 3x6", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/3x7/keyboard.json b/keyboards/omkbd/runner3680/3x7/keyboard.json index 8a4c55ca71..974147f732 100644 --- a/keyboards/omkbd/runner3680/3x7/keyboard.json +++ b/keyboards/omkbd/runner3680/3x7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 3x7", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/3x8/keyboard.json b/keyboards/omkbd/runner3680/3x8/keyboard.json index 11fe738a8a..04fadf854b 100644 --- a/keyboards/omkbd/runner3680/3x8/keyboard.json +++ b/keyboards/omkbd/runner3680/3x8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 3x8", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/4x6/keyboard.json b/keyboards/omkbd/runner3680/4x6/keyboard.json index 2449f3431e..7f8ecd0239 100644 --- a/keyboards/omkbd/runner3680/4x6/keyboard.json +++ b/keyboards/omkbd/runner3680/4x6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 4x6", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/4x7/keyboard.json b/keyboards/omkbd/runner3680/4x7/keyboard.json index 01acfad1e7..5bee706192 100644 --- a/keyboards/omkbd/runner3680/4x7/keyboard.json +++ b/keyboards/omkbd/runner3680/4x7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 4x7", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/4x8/keyboard.json b/keyboards/omkbd/runner3680/4x8/keyboard.json index 748fc05508..e9142eec3d 100644 --- a/keyboards/omkbd/runner3680/4x8/keyboard.json +++ b/keyboards/omkbd/runner3680/4x8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 4x8", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/5x6/keyboard.json b/keyboards/omkbd/runner3680/5x6/keyboard.json index 9b043c7e19..5d2d22d7fa 100644 --- a/keyboards/omkbd/runner3680/5x6/keyboard.json +++ b/keyboards/omkbd/runner3680/5x6/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 5x6", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/5x6_5x8/keyboard.json b/keyboards/omkbd/runner3680/5x6_5x8/keyboard.json index b8a361f1b2..2d912a1445 100644 --- a/keyboards/omkbd/runner3680/5x6_5x8/keyboard.json +++ b/keyboards/omkbd/runner3680/5x6_5x8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 5x6+5x8", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0x3680", diff --git a/keyboards/omkbd/runner3680/5x7/keyboard.json b/keyboards/omkbd/runner3680/5x7/keyboard.json index 41df797770..41de1f80f5 100644 --- a/keyboards/omkbd/runner3680/5x7/keyboard.json +++ b/keyboards/omkbd/runner3680/5x7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 5x7", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/omkbd/runner3680/5x8/keyboard.json b/keyboards/omkbd/runner3680/5x8/keyboard.json index 04294371d7..11857942b8 100644 --- a/keyboards/omkbd/runner3680/5x8/keyboard.json +++ b/keyboards/omkbd/runner3680/5x8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "runner3680 5x8", "manufacturer": "Omkbd", - "url": "", "maintainer": "omkbd", "usb": { "vid": "0xFEED", diff --git a/keyboards/orange75/keyboard.json b/keyboards/orange75/keyboard.json index a0ef819651..e7941d242f 100644 --- a/keyboards/orange75/keyboard.json +++ b/keyboards/orange75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Orange75", "manufacturer": "Fox-Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEEB", diff --git a/keyboards/org60/keyboard.json b/keyboards/org60/keyboard.json index 2586d16b08..d5c5260700 100644 --- a/keyboards/org60/keyboard.json +++ b/keyboards/org60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Org60", "manufacturer": "\u5927\u6a58\u5b50\u5916\u8bbe (Large orange peripherals)", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/owlab/jelly_evolv/info.json b/keyboards/owlab/jelly_evolv/info.json index 999bcca477..cd67a95a8d 100644 --- a/keyboards/owlab/jelly_evolv/info.json +++ b/keyboards/owlab/jelly_evolv/info.json @@ -1,6 +1,5 @@ { "manufacturer": "OwLab", - "url": "", "maintainer": "Owlab", "usb": { "vid": "0x4F53" diff --git a/keyboards/owlab/spring/keyboard.json b/keyboards/owlab/spring/keyboard.json index 7dcb6ec717..7e2ce90bd4 100644 --- a/keyboards/owlab/spring/keyboard.json +++ b/keyboards/owlab/spring/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Spring", "manufacturer": "OwLab", - "url": "", "maintainer": "OwLab", "usb": { "vid": "0x4F53", diff --git a/keyboards/owlab/suit80/ansi/keyboard.json b/keyboards/owlab/suit80/ansi/keyboard.json index 22bf9f78cd..c76c9d16dd 100644 --- a/keyboards/owlab/suit80/ansi/keyboard.json +++ b/keyboards/owlab/suit80/ansi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Suit80 ANSI", "manufacturer": "OwLab", - "url": "", "maintainer": "Owlab", "usb": { "vid": "0x4F53", diff --git a/keyboards/owlab/suit80/iso/keyboard.json b/keyboards/owlab/suit80/iso/keyboard.json index 87e95e9bee..5bdd1cbacc 100644 --- a/keyboards/owlab/suit80/iso/keyboard.json +++ b/keyboards/owlab/suit80/iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Suit80 ISO", "manufacturer": "OwLab", - "url": "", "maintainer": "Owlab", "usb": { "vid": "0x4F53", diff --git a/keyboards/p3d/eu_isolation/keyboard.json b/keyboards/p3d/eu_isolation/keyboard.json index 715515c42d..c8f305a131 100644 --- a/keyboards/p3d/eu_isolation/keyboard.json +++ b/keyboards/p3d/eu_isolation/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "EU ISOlation", "manufacturer": "TuckTuckFloof", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/p3d/q4z/keyboard.json b/keyboards/p3d/q4z/keyboard.json index 9dfa123c6c..0ba3ff129b 100644 --- a/keyboards/p3d/q4z/keyboard.json +++ b/keyboards/p3d/q4z/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "q4z", "manufacturer": "drmmr", - "url": "", "maintainer": "rjboone", "usb": { "vid": "0x0001", diff --git a/keyboards/p3d/spacey/keyboard.json b/keyboards/p3d/spacey/keyboard.json index ed23c327ad..07e1ebf818 100644 --- a/keyboards/p3d/spacey/keyboard.json +++ b/keyboards/p3d/spacey/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "spacey", "manufacturer": "vanilla", - "url": "", "maintainer": "vanilla", "usb": { "vid": "0x5641", diff --git a/keyboards/p3d/synapse/keyboard.json b/keyboards/p3d/synapse/keyboard.json index accd9ad47e..a73b3d4315 100644 --- a/keyboards/p3d/synapse/keyboard.json +++ b/keyboards/p3d/synapse/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "synapse", "manufacturer": "drmmr", - "url": "", "maintainer": "qpockets", "usb": { "vid": "0x7170", diff --git a/keyboards/pabile/p20/info.json b/keyboards/pabile/p20/info.json index 2584130637..0bac40f010 100644 --- a/keyboards/pabile/p20/info.json +++ b/keyboards/pabile/p20/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Pabile", - "url": "", "maintainer": "pabile", "usb": { "vid": "0x6666", diff --git a/keyboards/panc40/keyboard.json b/keyboards/panc40/keyboard.json index fe98da7f2e..9aef199fb3 100644 --- a/keyboards/panc40/keyboard.json +++ b/keyboards/panc40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Panc40", "manufacturer": "Panc Interactive", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/panc60/keyboard.json b/keyboards/panc60/keyboard.json index e0f3a491c8..a1e61b7999 100644 --- a/keyboards/panc60/keyboard.json +++ b/keyboards/panc60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Panc60", "manufacturer": "Panc Interactive", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/papercranekeyboards/gerald65/keyboard.json b/keyboards/papercranekeyboards/gerald65/keyboard.json index 255727d508..55d42eb93c 100644 --- a/keyboards/papercranekeyboards/gerald65/keyboard.json +++ b/keyboards/papercranekeyboards/gerald65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "gerald65", "manufacturer": "PaperCraneKeyboards", - "url": "", "maintainer": "PaperCraneKeyboards", "usb": { "vid": "0x5012", diff --git a/keyboards/pdxkbc/keyboard.json b/keyboards/pdxkbc/keyboard.json index 642adc0878..7921c67190 100644 --- a/keyboards/pdxkbc/keyboard.json +++ b/keyboards/pdxkbc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "pdxkbc", "manufacturer": "Franklin Harding", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5044", diff --git a/keyboards/pearlboards/atlas/keyboard.json b/keyboards/pearlboards/atlas/keyboard.json index 6886885e03..ea9f86ec51 100644 --- a/keyboards/pearlboards/atlas/keyboard.json +++ b/keyboards/pearlboards/atlas/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Atlas", "manufacturer": "Koobaczech", - "url": "", "maintainer": "Koobaczech", "usb": { "vid": "0x6963", diff --git a/keyboards/pearlboards/pandora/keyboard.json b/keyboards/pearlboards/pandora/keyboard.json index 670aa6f75a..59dc1ed955 100644 --- a/keyboards/pearlboards/pandora/keyboard.json +++ b/keyboards/pearlboards/pandora/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pandora", "manufacturer": "Koobaczech", - "url": "", "maintainer": "Koobaczech", "usb": { "vid": "0x6963", diff --git a/keyboards/pearlboards/pearl/keyboard.json b/keyboards/pearlboards/pearl/keyboard.json index e91192475f..3f35aec006 100644 --- a/keyboards/pearlboards/pearl/keyboard.json +++ b/keyboards/pearlboards/pearl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pearl", "manufacturer": "Koobaczech", - "url": "", "maintainer": "Koobaczech", "usb": { "vid": "0x6963", diff --git a/keyboards/pearlboards/zeus/keyboard.json b/keyboards/pearlboards/zeus/keyboard.json index 9a3e7ead5f..72751a5fec 100644 --- a/keyboards/pearlboards/zeus/keyboard.json +++ b/keyboards/pearlboards/zeus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Zeus", "manufacturer": "Koobaczech", - "url": "", "maintainer": "Koobaczech", "usb": { "vid": "0x6963", diff --git a/keyboards/pearlboards/zeuspad/keyboard.json b/keyboards/pearlboards/zeuspad/keyboard.json index 93e1e64433..0e1c626782 100644 --- a/keyboards/pearlboards/zeuspad/keyboard.json +++ b/keyboards/pearlboards/zeuspad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Zeuspad", "manufacturer": "Koobaczech", - "url": "", "maintainer": "Koobaczech", "usb": { "vid": "0x6963", diff --git a/keyboards/pegasus/keyboard.json b/keyboards/pegasus/keyboard.json index 4de1631379..9c12de8ea0 100644 --- a/keyboards/pegasus/keyboard.json +++ b/keyboards/pegasus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pegasus", "manufacturer": "melonbred", - "url": "", "maintainer": "melonbred", "usb": { "vid": "0xFEED", diff --git a/keyboards/percent/booster/keyboard.json b/keyboards/percent/booster/keyboard.json index edd9afd18d..82701646ff 100644 --- a/keyboards/percent/booster/keyboard.json +++ b/keyboards/percent/booster/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Booster", "manufacturer": "Percent Studio", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5053", diff --git a/keyboards/percent/canoe/keyboard.json b/keyboards/percent/canoe/keyboard.json index 656f73f904..d88225c656 100644 --- a/keyboards/percent/canoe/keyboard.json +++ b/keyboards/percent/canoe/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CANOE", "manufacturer": "Percent Studios", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5053", diff --git a/keyboards/percent/canoe_gen2/keyboard.json b/keyboards/percent/canoe_gen2/keyboard.json index 85fbfd28b9..b6a8a47a5f 100644 --- a/keyboards/percent/canoe_gen2/keyboard.json +++ b/keyboards/percent/canoe_gen2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Canoe Gen2", "manufacturer": "Percent Studio", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x9C12", diff --git a/keyboards/percent/skog/keyboard.json b/keyboards/percent/skog/keyboard.json index 823c1638ac..56751e56b7 100644 --- a/keyboards/percent/skog/keyboard.json +++ b/keyboards/percent/skog/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Skog TKL", "manufacturer": "Percent Studios", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5053", diff --git a/keyboards/percent/skog_lite/keyboard.json b/keyboards/percent/skog_lite/keyboard.json index e52d910845..798ed34a5d 100644 --- a/keyboards/percent/skog_lite/keyboard.json +++ b/keyboards/percent/skog_lite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Skog Lite", "manufacturer": "Percent Studios", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5053", diff --git a/keyboards/phase_studio/titan65/hotswap/keyboard.json b/keyboards/phase_studio/titan65/hotswap/keyboard.json index 956f508701..c9d1b0f726 100644 --- a/keyboards/phase_studio/titan65/hotswap/keyboard.json +++ b/keyboards/phase_studio/titan65/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Titan 65 (hotswap)", "manufacturer": "Phase Studio", - "url": "", "maintainer": "drashna", "usb": { "vid": "0x5054", diff --git a/keyboards/phase_studio/titan65/soldered/keyboard.json b/keyboards/phase_studio/titan65/soldered/keyboard.json index c60c689932..8bb0f6f19c 100644 --- a/keyboards/phase_studio/titan65/soldered/keyboard.json +++ b/keyboards/phase_studio/titan65/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Titan 65 (soldered)", "manufacturer": "Phase Studio", - "url": "", "maintainer": "drashna", "usb": { "vid": "0x5054", diff --git a/keyboards/phdesign/phac/keyboard.json b/keyboards/phdesign/phac/keyboard.json index 660cf6c2ad..5e5db876c0 100644 --- a/keyboards/phdesign/phac/keyboard.json +++ b/keyboards/phdesign/phac/keyboard.json @@ -24,7 +24,6 @@ ] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "2.2.0", "pid": "0x0001", diff --git a/keyboards/phentech/rpk_001/keyboard.json b/keyboards/phentech/rpk_001/keyboard.json index 0ce2993897..ce822295b2 100644 --- a/keyboards/phentech/rpk_001/keyboard.json +++ b/keyboards/phentech/rpk_001/keyboard.json @@ -2,7 +2,6 @@ "manufacturer": "HENGCANG ELECTRONIC", "keyboard_name": "RPK-001", "maintainer": "JoyLee", - "url": "", "processor": "WB32FQ95", "bootloader": "wb32-dfu", "usb": { diff --git a/keyboards/pimentoso/paddino02/rev1/keyboard.json b/keyboards/pimentoso/paddino02/rev1/keyboard.json index 74f11ab7ad..20c144c795 100644 --- a/keyboards/pimentoso/paddino02/rev1/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Paddino02 rev1", "manufacturer": "Pimentoso", - "url": "", "maintainer": "Pimentoso", "usb": { "vid": "0xD00D", diff --git a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json index 8ba456e29e..00447c549b 100644 --- a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Paddino02 rev2 (left)", "manufacturer": "Pimentoso", - "url": "", "maintainer": "Pimentoso", "usb": { "vid": "0xD00D", diff --git a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json index 4da270119b..4c12bc23fa 100644 --- a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Paddino02 rev2 (right)", "manufacturer": "Pimentoso", - "url": "", "maintainer": "Pimentoso", "usb": { "vid": "0xD00D", diff --git a/keyboards/pinky/3/keyboard.json b/keyboards/pinky/3/keyboard.json index 32e1f893e5..f02b6c72d0 100644 --- a/keyboards/pinky/3/keyboard.json +++ b/keyboards/pinky/3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pinky3", "manufacturer": "tamanishi", - "url": "", "maintainer": "tamanishi", "usb": { "vid": "0x544E", diff --git a/keyboards/pinky/4/keyboard.json b/keyboards/pinky/4/keyboard.json index 20f86e3f38..68b1dcb14c 100644 --- a/keyboards/pinky/4/keyboard.json +++ b/keyboards/pinky/4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pinky4", "manufacturer": "tamanishi", - "url": "", "maintainer": "tamanishi", "usb": { "vid": "0x544E", diff --git a/keyboards/pixelspace/capsule65i/keyboard.json b/keyboards/pixelspace/capsule65i/keyboard.json index f8c9dc9c1d..f23f36018a 100644 --- a/keyboards/pixelspace/capsule65i/keyboard.json +++ b/keyboards/pixelspace/capsule65i/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Capsule65i", "manufacturer": "PixelSpace", - "url": "", "maintainer": "PixelSpace", "usb": { "vid": "0xE061", diff --git a/keyboards/pixelspace/shadow80/keyboard.json b/keyboards/pixelspace/shadow80/keyboard.json index c7c4901745..7644c9d6ac 100644 --- a/keyboards/pixelspace/shadow80/keyboard.json +++ b/keyboards/pixelspace/shadow80/keyboard.json @@ -3,7 +3,6 @@ "processor": "STM32F103", "bootloader": "stm32duino", "manufacturer": "Here VoLand", - "url": "", "maintainer": "Here VoLand @Vem", "usb": { "vid": "0x0011", diff --git a/keyboards/pkb65/keyboard.json b/keyboards/pkb65/keyboard.json index d645d278b7..394401328e 100644 --- a/keyboards/pkb65/keyboard.json +++ b/keyboards/pkb65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "PKB65", "manufacturer": "MCKeebs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D43", diff --git a/keyboards/playkbtw/ca66/keyboard.json b/keyboards/playkbtw/ca66/keyboard.json index d94a8d6b4d..e28876fb9a 100644 --- a/keyboards/playkbtw/ca66/keyboard.json +++ b/keyboards/playkbtw/ca66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "CA66", "manufacturer": "Barry", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5457", diff --git a/keyboards/playkbtw/helen80/keyboard.json b/keyboards/playkbtw/helen80/keyboard.json index 47f7e48ef6..be01d21da2 100644 --- a/keyboards/playkbtw/helen80/keyboard.json +++ b/keyboards/playkbtw/helen80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Helen 80", "manufacturer": "Play Keyboard", - "url": "", "maintainer": "yj7272098", "usb": { "vid": "0x706B", diff --git a/keyboards/playkbtw/pk60/keyboard.json b/keyboards/playkbtw/pk60/keyboard.json index 15de711ad1..de4f7a23f3 100644 --- a/keyboards/playkbtw/pk60/keyboard.json +++ b/keyboards/playkbtw/pk60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "pk60", "manufacturer": "Play Keyboard", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/playkbtw/pk64rgb/keyboard.json b/keyboards/playkbtw/pk64rgb/keyboard.json index 81ac5be596..49ef2f57b2 100644 --- a/keyboards/playkbtw/pk64rgb/keyboard.json +++ b/keyboards/playkbtw/pk64rgb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "PK64RGB", "manufacturer": "Play Keyboard", - "url": "", "maintainer": "yj7272098", "usb": { "vid": "0x706B", diff --git a/keyboards/plume/plume65/keyboard.json b/keyboards/plume/plume65/keyboard.json index 46f264e43e..9828a766f6 100644 --- a/keyboards/plume/plume65/keyboard.json +++ b/keyboards/plume/plume65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Plume65", "manufacturer": "Plume Keyboards LLC", - "url": "", "maintainer": "evyd13", "usb": { "vid": "0x5D66", diff --git a/keyboards/plut0nium/0x3e/keyboard.json b/keyboards/plut0nium/0x3e/keyboard.json index eb0a4fbe55..fe9c43ce4b 100644 --- a/keyboards/plut0nium/0x3e/keyboard.json +++ b/keyboards/plut0nium/0x3e/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "0x3E", "manufacturer": "plut0nium", - "url": "", "maintainer": "plut0nium", "usb": { "vid": "0xFEED", diff --git a/keyboards/plywrks/ahgase/keyboard.json b/keyboards/plywrks/ahgase/keyboard.json index 9c1da6d579..05ed4e6ff2 100644 --- a/keyboards/plywrks/ahgase/keyboard.json +++ b/keyboards/plywrks/ahgase/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ahgase", "manufacturer": "plywrks", - "url": "", "maintainer": "Ramon Imbao (ramonimbao)", "usb": { "vid": "0x706C", diff --git a/keyboards/plywrks/allaro/keyboard.json b/keyboards/plywrks/allaro/keyboard.json index a9a0a175b6..ca94fc8318 100644 --- a/keyboards/plywrks/allaro/keyboard.json +++ b/keyboards/plywrks/allaro/keyboard.json @@ -17,7 +17,6 @@ "cols": ["F0", "F7", "F6", "C7", "C6", "B6", "B5", "B4", "D7", "D6", "D4", "D5", "D3", "D2", "D1"], "rows": ["F1", "B7", "B0", "D0", "F5"] }, - "url": "", "usb": { "vid": "0x706C", "pid": "0x7903", diff --git a/keyboards/plywrks/ji_eun/keyboard.json b/keyboards/plywrks/ji_eun/keyboard.json index b470e29ebd..59355277f7 100644 --- a/keyboards/plywrks/ji_eun/keyboard.json +++ b/keyboards/plywrks/ji_eun/keyboard.json @@ -17,7 +17,6 @@ "rows": ["D7", "B4", "B0", "D4", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0x706C", diff --git a/keyboards/plywrks/lune/keyboard.json b/keyboards/plywrks/lune/keyboard.json index 5ec1d97c6b..fa05b5110b 100644 --- a/keyboards/plywrks/lune/keyboard.json +++ b/keyboards/plywrks/lune/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lune", "manufacturer": "plywrks", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0x706C", diff --git a/keyboards/plywrks/ply8x/hotswap/keyboard.json b/keyboards/plywrks/ply8x/hotswap/keyboard.json index 2dc2ac5c35..c4d3e9424e 100644 --- a/keyboards/plywrks/ply8x/hotswap/keyboard.json +++ b/keyboards/plywrks/ply8x/hotswap/keyboard.json @@ -16,7 +16,6 @@ "cols": ["A9", "A8", "B12", "B11", "B10", "A6", "A5", "A4", "A15", "C14", "C13", "B9", "B6", "B7", "B5", "B4", "B3"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0x706C", diff --git a/keyboards/plywrks/ply8x/solder/keyboard.json b/keyboards/plywrks/ply8x/solder/keyboard.json index 8bae31a1f1..435319dec8 100644 --- a/keyboards/plywrks/ply8x/solder/keyboard.json +++ b/keyboards/plywrks/ply8x/solder/keyboard.json @@ -18,7 +18,6 @@ "cols": ["A9", "A8", "B12", "B11", "B10", "A6", "A5", "A4", "A15", "C13", "C14", "B9", "B7", "B6", "B5", "B4", "B3"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0x706C", diff --git a/keyboards/poker87c/keyboard.json b/keyboards/poker87c/keyboard.json index ab626c8be9..08355d8a2b 100644 --- a/keyboards/poker87c/keyboard.json +++ b/keyboards/poker87c/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "POKER-87C Hotswap", "manufacturer": "mfkiiyd", - "url": "", "maintainer": "mfkiiyd", "usb": { "vid": "0x6D66", diff --git a/keyboards/poker87d/keyboard.json b/keyboards/poker87d/keyboard.json index 61710aac2c..7e6f08d82c 100644 --- a/keyboards/poker87d/keyboard.json +++ b/keyboards/poker87d/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "POKER-87D Hotswap", "manufacturer": "mfkiiyd", - "url": "", "maintainer": "mfkiiyd", "usb": { "vid": "0x6D66", diff --git a/keyboards/polilla/rev1/keyboard.json b/keyboards/polilla/rev1/keyboard.json index 746f47963e..27132202d2 100644 --- a/keyboards/polilla/rev1/keyboard.json +++ b/keyboards/polilla/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Polilla", "manufacturer": "elagil", - "url": "", "maintainer": "elagil", "usb": { "vid": "0x6166", diff --git a/keyboards/polycarbdiet/s20/keyboard.json b/keyboards/polycarbdiet/s20/keyboard.json index f87429b4a7..07cc8acc48 100644 --- a/keyboards/polycarbdiet/s20/keyboard.json +++ b/keyboards/polycarbdiet/s20/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "S20 revA", "manufacturer": "polycarbdiet", - "url": "", "maintainer": "polycarbdiet", "usb": { "vid": "0x5040", diff --git a/keyboards/primekb/prime_r/keyboard.json b/keyboards/primekb/prime_r/keyboard.json index b2a7ecec7a..d92903b897 100644 --- a/keyboards/primekb/prime_r/keyboard.json +++ b/keyboards/primekb/prime_r/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Prime_R", "manufacturer": "PrimeKB", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/printedpad/keyboard.json b/keyboards/printedpad/keyboard.json index 90a42c7313..d9fc996f33 100644 --- a/keyboards/printedpad/keyboard.json +++ b/keyboards/printedpad/keyboard.json @@ -18,7 +18,6 @@ "rows": ["A10", "C9", "A8", "A9"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/program_yoink/ortho/keyboard.json b/keyboards/program_yoink/ortho/keyboard.json index e9d5fd3e80..2d50640a41 100644 --- a/keyboards/program_yoink/ortho/keyboard.json +++ b/keyboards/program_yoink/ortho/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Program Yoink! Ortho", "manufacturer": "melonbred", - "url": "", "maintainer": "melonbred", "usb": { "vid": "0x7079", diff --git a/keyboards/program_yoink/staggered/keyboard.json b/keyboards/program_yoink/staggered/keyboard.json index c20e2c9fc7..82f41d8e27 100644 --- a/keyboards/program_yoink/staggered/keyboard.json +++ b/keyboards/program_yoink/staggered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Program Yoink! Staggered", "manufacturer": "melonbred", - "url": "", "maintainer": "melonbred", "usb": { "vid": "0x7079", diff --git a/keyboards/projectcain/relic/keyboard.json b/keyboards/projectcain/relic/keyboard.json index f9df6770d1..428240f923 100644 --- a/keyboards/projectcain/relic/keyboard.json +++ b/keyboards/projectcain/relic/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Relic", "manufacturer": "projectcain", - "url": "", "maintainer": "projectcain", "usb": { "vid": "0xFEED", diff --git a/keyboards/projectcain/vault45/keyboard.json b/keyboards/projectcain/vault45/keyboard.json index 2ab3e010e7..66199a620d 100644 --- a/keyboards/projectcain/vault45/keyboard.json +++ b/keyboards/projectcain/vault45/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vault45", "manufacturer": "projectcain", - "url": "", "maintainer": "projectcain", "usb": { "vid": "0xFEED", diff --git a/keyboards/projectd/65/projectd_65_ansi/keyboard.json b/keyboards/projectd/65/projectd_65_ansi/keyboard.json index 32a95f965e..1e1f5cce2a 100644 --- a/keyboards/projectd/65/projectd_65_ansi/keyboard.json +++ b/keyboards/projectd/65/projectd_65_ansi/keyboard.json @@ -161,7 +161,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "0.0.4", "pid": "0x5319", diff --git a/keyboards/projectd/75/ansi/keyboard.json b/keyboards/projectd/75/ansi/keyboard.json index d94db22bfc..3040981378 100644 --- a/keyboards/projectd/75/ansi/keyboard.json +++ b/keyboards/projectd/75/ansi/keyboard.json @@ -182,7 +182,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "0.0.2", "pid": "0x000F", diff --git a/keyboards/projectd/75/iso/keyboard.json b/keyboards/projectd/75/iso/keyboard.json index d42e8c4b33..a4d5e909c1 100644 --- a/keyboards/projectd/75/iso/keyboard.json +++ b/keyboards/projectd/75/iso/keyboard.json @@ -176,7 +176,6 @@ { "flags": 4, "matrix": [0, 5], "x": 152, "y": 52 } ] }, - "url": "", "usb": { "device_version": "0.0.2", "pid": "0x0011", diff --git a/keyboards/projectkb/signature87/keyboard.json b/keyboards/projectkb/signature87/keyboard.json index 2b18bf4572..adb3fd5fd7 100644 --- a/keyboards/projectkb/signature87/keyboard.json +++ b/keyboards/projectkb/signature87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Signature87", "manufacturer": "Project Keyboard", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x0159", diff --git a/keyboards/prototypist/oceanographer/keyboard.json b/keyboards/prototypist/oceanographer/keyboard.json index 13bc41355c..f76980499e 100644 --- a/keyboards/prototypist/oceanographer/keyboard.json +++ b/keyboards/prototypist/oceanographer/keyboard.json @@ -47,7 +47,6 @@ "rows": ["B0", "D5", "D3", "D2"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/prototypist/pt60/keyboard.json b/keyboards/prototypist/pt60/keyboard.json index 8018350e6f..2ae193c924 100644 --- a/keyboards/prototypist/pt60/keyboard.json +++ b/keyboards/prototypist/pt60/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B0", "B1", "B2", "B10", "B11"] }, "processor": "STM32F303", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/prototypist/pt80/keyboard.json b/keyboards/prototypist/pt80/keyboard.json index cb58643e3f..af7d6093cb 100644 --- a/keyboards/prototypist/pt80/keyboard.json +++ b/keyboards/prototypist/pt80/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B14", "A8", "A9", "B13", "B11", "B12"] }, "processor": "STM32F303", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/pteron36/keyboard.json b/keyboards/pteron36/keyboard.json index 2000593e62..25c4dc8c54 100644 --- a/keyboards/pteron36/keyboard.json +++ b/keyboards/pteron36/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pteron36", "manufacturer": "Harshit Goel", - "url": "", "maintainer": "harshitgoel96", "usb": { "vid": "0x4847", diff --git a/keyboards/pteropus/keyboard.json b/keyboards/pteropus/keyboard.json index 76cbe67eee..09356d1a99 100644 --- a/keyboards/pteropus/keyboard.json +++ b/keyboards/pteropus/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B10", "B2", "B1", "B0"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/puck/keyboard.json b/keyboards/puck/keyboard.json index 4ec04d72be..e69c7755d3 100644 --- a/keyboards/puck/keyboard.json +++ b/keyboards/puck/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Puck", "manufacturer": "OkKeebs LLC", - "url": "", "maintainer": "john-pettigrew", "usb": { "vid": "0xFEED", diff --git a/keyboards/punk75/keyboard.json b/keyboards/punk75/keyboard.json index c7082e564f..62501a885c 100644 --- a/keyboards/punk75/keyboard.json +++ b/keyboards/punk75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "punk75", "manufacturer": "dsanchezseco", - "url": "", "maintainer": "dsanchezseco", "usb": { "vid": "0xDEED", diff --git a/keyboards/purin/keyboard.json b/keyboards/purin/keyboard.json index 08a8b06e34..8da928ed03 100644 --- a/keyboards/purin/keyboard.json +++ b/keyboards/purin/keyboard.json @@ -17,7 +17,6 @@ "rows": ["F6", "F7", "D4", "D5", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/qck75/v1/keyboard.json b/keyboards/qck75/v1/keyboard.json index a8ae853ab3..04cc5dc3c1 100644 --- a/keyboards/qck75/v1/keyboard.json +++ b/keyboards/qck75/v1/keyboard.json @@ -25,7 +25,6 @@ "rows": ["C3", "A0", "A1", "A2", "B10", "A15"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0001", diff --git a/keyboards/qpockets/eggman/keyboard.json b/keyboards/qpockets/eggman/keyboard.json index 32cb76fc88..b784c6aec3 100644 --- a/keyboards/qpockets/eggman/keyboard.json +++ b/keyboards/qpockets/eggman/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "eggman", "manufacturer": "qpockets", - "url": "", "maintainer": "qpockets", "usb": { "vid": "0x7170", diff --git a/keyboards/qpockets/space_space/rev1/keyboard.json b/keyboards/qpockets/space_space/rev1/keyboard.json index cc8cda49a8..5284230e61 100644 --- a/keyboards/qpockets/space_space/rev1/keyboard.json +++ b/keyboards/qpockets/space_space/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "space_space", "manufacturer": "qpockets", - "url": "", "maintainer": "qpockets", "usb": { "vid": "0x7170", diff --git a/keyboards/qpockets/space_space/rev2/keyboard.json b/keyboards/qpockets/space_space/rev2/keyboard.json index e2f24032a3..7374ed4728 100644 --- a/keyboards/qpockets/space_space/rev2/keyboard.json +++ b/keyboards/qpockets/space_space/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "space_space", "manufacturer": "qpockets", - "url": "", "maintainer": "qpockets", "usb": { "vid": "0x7170", diff --git a/keyboards/qpockets/wanten/keyboard.json b/keyboards/qpockets/wanten/keyboard.json index 86bfe02300..e1c21b5d0f 100644 --- a/keyboards/qpockets/wanten/keyboard.json +++ b/keyboards/qpockets/wanten/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "wanten", "manufacturer": "qpockets", - "url": "", "maintainer": "qpockets", "usb": { "vid": "0x7170", diff --git a/keyboards/quad_h/lb75/keyboard.json b/keyboards/quad_h/lb75/keyboard.json index e88ba4b3a4..3dc43bdb69 100644 --- a/keyboards/quad_h/lb75/keyboard.json +++ b/keyboards/quad_h/lb75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LB75", "manufacturer": "QUADH", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/quadrum/delta/keyboard.json b/keyboards/quadrum/delta/keyboard.json index bfdc0afd62..6766bd2875 100644 --- a/keyboards/quadrum/delta/keyboard.json +++ b/keyboards/quadrum/delta/keyboard.json @@ -21,7 +21,6 @@ "rows": ["F5", "F4", "F1", "F0", "D2"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/quantrik/kyuu/keyboard.json b/keyboards/quantrik/kyuu/keyboard.json index 5827f08d21..b7a2a01807 100644 --- a/keyboards/quantrik/kyuu/keyboard.json +++ b/keyboards/quantrik/kyuu/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Kyuu", "manufacturer": "Quantrik", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5154", diff --git a/keyboards/qwertlekeys/calice/keyboard.json b/keyboards/qwertlekeys/calice/keyboard.json index 676ca7a433..6e57f37892 100644 --- a/keyboards/qwertlekeys/calice/keyboard.json +++ b/keyboards/qwertlekeys/calice/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Calice", "manufacturer": "QwertleKeys", - "url": "", "maintainer": "Jels02", "usb": { "vid": "0x716B", diff --git a/keyboards/qwertykeys/qk65/hotswap/keyboard.json b/keyboards/qwertykeys/qk65/hotswap/keyboard.json index 7c786a7038..a641e3cc7a 100644 --- a/keyboards/qwertykeys/qk65/hotswap/keyboard.json +++ b/keyboards/qwertykeys/qk65/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "QK65 Hotswap", "manufacturer": "qwertykeys", - "url": "", "maintainer": "qwertykeys", "usb": { "vid": "0x4F53", diff --git a/keyboards/qwertykeys/qk65/solder/keyboard.json b/keyboards/qwertykeys/qk65/solder/keyboard.json index b1795474d3..deb2c987b5 100644 --- a/keyboards/qwertykeys/qk65/solder/keyboard.json +++ b/keyboards/qwertykeys/qk65/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "QK65 Solder", "manufacturer": "qwertykeys", - "url": "", "maintainer": "qwertykeys", "usb": { "vid": "0x4F53", diff --git a/keyboards/qwertyydox/rev1/keyboard.json b/keyboards/qwertyydox/rev1/keyboard.json index 24284ff8c0..0010f9f7e8 100644 --- a/keyboards/qwertyydox/rev1/keyboard.json +++ b/keyboards/qwertyydox/rev1/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "QWERTYYdox", "manufacturer": "AYDENandDAD Youtube", "identifier": "0x1256", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCEEB", diff --git a/keyboards/rabbit/rabbit68/keyboard.json b/keyboards/rabbit/rabbit68/keyboard.json index ce35a7d3c2..016e453199 100644 --- a/keyboards/rabbit/rabbit68/keyboard.json +++ b/keyboards/rabbit/rabbit68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rabbit68", "manufacturer": "Kai Eckert", - "url": "", "maintainer": "kaiec", "usb": { "vid": "0xFEED", diff --git a/keyboards/rainkeebs/rainkeeb/keyboard.json b/keyboards/rainkeebs/rainkeeb/keyboard.json index a291d61d3b..af6021bc1a 100644 --- a/keyboards/rainkeebs/rainkeeb/keyboard.json +++ b/keyboards/rainkeebs/rainkeeb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rainkeeb", "manufacturer": "rainkeebs", - "url": "", "maintainer": "rain", "usb": { "vid": "0x726B", diff --git a/keyboards/ramlord/witf/keyboard.json b/keyboards/ramlord/witf/keyboard.json index 55049a3ffa..2e8b05eee9 100644 --- a/keyboards/ramlord/witf/keyboard.json +++ b/keyboards/ramlord/witf/keyboard.json @@ -22,7 +22,6 @@ "scroll_lock": "A4" }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x343F", diff --git a/keyboards/rart/rart45/keyboard.json b/keyboards/rart/rart45/keyboard.json index 42a5d054d7..a1cf03341e 100644 --- a/keyboards/rart/rart45/keyboard.json +++ b/keyboards/rart/rart45/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rart45", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart4x4/keyboard.json b/keyboards/rart/rart4x4/keyboard.json index c38e2103de..edd5ed12fe 100644 --- a/keyboards/rart/rart4x4/keyboard.json +++ b/keyboards/rart/rart4x4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART4X4", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart60/keyboard.json b/keyboards/rart/rart60/keyboard.json index d5cc7bf0b4..474c3512af 100644 --- a/keyboards/rart/rart60/keyboard.json +++ b/keyboards/rart/rart60/keyboard.json @@ -23,7 +23,6 @@ "rows": ["GP23", "GP25", "GP15", "GP16", "GP17"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0060", diff --git a/keyboards/rart/rart67/keyboard.json b/keyboards/rart/rart67/keyboard.json index 6651561743..e911a783be 100644 --- a/keyboards/rart/rart67/keyboard.json +++ b/keyboards/rart/rart67/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART67", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart67m/keyboard.json b/keyboards/rart/rart67m/keyboard.json index 0d6cfdeed1..83ff7f30a1 100644 --- a/keyboards/rart/rart67m/keyboard.json +++ b/keyboards/rart/rart67m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART67M", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart75/keyboard.json b/keyboards/rart/rart75/keyboard.json index beb8a7cc39..a087298e0a 100644 --- a/keyboards/rart/rart75/keyboard.json +++ b/keyboards/rart/rart75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART75", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart75hs/keyboard.json b/keyboards/rart/rart75hs/keyboard.json index f8763bfbee..9371daacf2 100644 --- a/keyboards/rart/rart75hs/keyboard.json +++ b/keyboards/rart/rart75hs/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART75 Hotswap", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart75m/keyboard.json b/keyboards/rart/rart75m/keyboard.json index 925e8dff5e..3af82c9bc5 100644 --- a/keyboards/rart/rart75m/keyboard.json +++ b/keyboards/rart/rart75m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART75M", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rart80/keyboard.json b/keyboards/rart/rart80/keyboard.json index 06fbd1add6..a2d4a7f3eb 100644 --- a/keyboards/rart/rart80/keyboard.json +++ b/keyboards/rart/rart80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RART80 Hotswap", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rartand/keyboard.json b/keyboards/rart/rartand/keyboard.json index 330beca3e1..57ff3f068f 100644 --- a/keyboards/rart/rartand/keyboard.json +++ b/keyboards/rart/rartand/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rartand", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rartlice/keyboard.json b/keyboards/rart/rartlice/keyboard.json index c55919e6a6..f568fbba47 100644 --- a/keyboards/rart/rartlice/keyboard.json +++ b/keyboards/rart/rartlice/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rartlice", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rartlite/keyboard.json b/keyboards/rart/rartlite/keyboard.json index f542654db7..baf65530d6 100644 --- a/keyboards/rart/rartlite/keyboard.json +++ b/keyboards/rart/rartlite/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RARTLITE", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rart/rartpad/keyboard.json b/keyboards/rart/rartpad/keyboard.json index ac9b2a38f1..dd4f778e26 100644 --- a/keyboards/rart/rartpad/keyboard.json +++ b/keyboards/rart/rartpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RARTPAD", "manufacturer": "Alabahuy", - "url": "", "maintainer": "Alabahuy", "usb": { "vid": "0x414C", diff --git a/keyboards/rate/pistachio/info.json b/keyboards/rate/pistachio/info.json index 0eaea7885d..7136860260 100644 --- a/keyboards/rate/pistachio/info.json +++ b/keyboards/rate/pistachio/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "pistachio", "manufacturer": "rate", - "url": "", "maintainer": "rate", "usb": { "vid": "0x5255", diff --git a/keyboards/rate/pistachio_mp/keyboard.json b/keyboards/rate/pistachio_mp/keyboard.json index dadb936942..dc016ffecb 100644 --- a/keyboards/rate/pistachio_mp/keyboard.json +++ b/keyboards/rate/pistachio_mp/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "pistachio_mp", "manufacturer": "rate", - "url": "", "maintainer": "rate", "usb": { "vid": "0x5255", diff --git a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json index fe40f12f46..eb8da169c4 100644 --- a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ratio65 Hotswap Rev A", "manufacturer": "4pplet", - "url": "", "maintainer": "4pplet", "usb": { "vid": "0x4446", diff --git a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json index 6953636dee..384760e535 100644 --- a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ratio65 Solder Rev A", "manufacturer": "4pplet", - "url": "", "maintainer": "4pplet", "usb": { "vid": "0x4446", diff --git a/keyboards/rect44/keyboard.json b/keyboards/rect44/keyboard.json index d331e48bd9..fd543f5299 100644 --- a/keyboards/rect44/keyboard.json +++ b/keyboards/rect44/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rect44", "manufacturer": "koshinoya", - "url": "", "maintainer": "koshinoya", "usb": { "vid": "0xFEED", diff --git a/keyboards/redox/rev1/info.json b/keyboards/redox/rev1/info.json index ee9786d838..b5df079969 100644 --- a/keyboards/redox/rev1/info.json +++ b/keyboards/redox/rev1/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Redox", "manufacturer": "Falbatech", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D44", diff --git a/keyboards/redox/wireless/keyboard.json b/keyboards/redox/wireless/keyboard.json index 86977f4602..7f167240b6 100644 --- a/keyboards/redox/wireless/keyboard.json +++ b/keyboards/redox/wireless/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Redox Wireless", "manufacturer": "Mattia Dal Ben", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D44", diff --git a/keyboards/redox_media/keyboard.json b/keyboards/redox_media/keyboard.json index 83057da79f..dba5657ea2 100644 --- a/keyboards/redox_media/keyboard.json +++ b/keyboards/redox_media/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Redox Media", "manufacturer": "shiftux", - "url": "", "maintainer": "shiftux", "usb": { "vid": "0xFEED", diff --git a/keyboards/redscarf_i/keyboard.json b/keyboards/redscarf_i/keyboard.json index 6a186dff0b..0e5dbd76a8 100644 --- a/keyboards/redscarf_i/keyboard.json +++ b/keyboards/redscarf_i/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Red Scarf I", "manufacturer": "Red Scarf", - "url": "", "maintainer": "qmk, defying", "usb": { "vid": "0xFEED", diff --git a/keyboards/redscarf_iiplus/verb/keyboard.json b/keyboards/redscarf_iiplus/verb/keyboard.json index 99d763e39a..2bb3910fb5 100644 --- a/keyboards/redscarf_iiplus/verb/keyboard.json +++ b/keyboards/redscarf_iiplus/verb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RedScarfII+ Ver.B (RS78)", "manufacturer": "RedScarf", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/redscarf_iiplus/verc/keyboard.json b/keyboards/redscarf_iiplus/verc/keyboard.json index a6defe4851..c9b960e7ba 100644 --- a/keyboards/redscarf_iiplus/verc/keyboard.json +++ b/keyboards/redscarf_iiplus/verc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RedScarfII+ Ver.C (RS68)", "manufacturer": "RedScarf", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/redscarf_iiplus/verd/keyboard.json b/keyboards/redscarf_iiplus/verd/keyboard.json index d0ba57553a..fbb0b14402 100644 --- a/keyboards/redscarf_iiplus/verd/keyboard.json +++ b/keyboards/redscarf_iiplus/verd/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RedScarfII+ Ver.D", "manufacturer": "RedScarf", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/relapsekb/or87/keyboard.json b/keyboards/relapsekb/or87/keyboard.json index 0ac5022aca..67ff9cd19b 100644 --- a/keyboards/relapsekb/or87/keyboard.json +++ b/keyboards/relapsekb/or87/keyboard.json @@ -15,7 +15,6 @@ "cols": ["F7", "C7", "C6", "B6", "B5", "B4", "D7", "D0", "B7"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "vid": "0x722D", diff --git a/keyboards/retro_75/keyboard.json b/keyboards/retro_75/keyboard.json index e077be2ee9..1e29a5a0fc 100644 --- a/keyboards/retro_75/keyboard.json +++ b/keyboards/retro_75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Retro75", "manufacturer": "PheonixStarr", - "url": "", "maintainer": "zvecr", "usb": { "vid": "0xFEED", diff --git a/keyboards/reversestudio/decadepad/keyboard.json b/keyboards/reversestudio/decadepad/keyboard.json index 601122aa37..e3f587d5dd 100644 --- a/keyboards/reversestudio/decadepad/keyboard.json +++ b/keyboards/reversestudio/decadepad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "DecadePad", "manufacturer": "ReverseStudio", - "url": "", "maintainer": "huajijam", "usb": { "vid": "0x5253", diff --git a/keyboards/reviung/reviung33/keyboard.json b/keyboards/reviung/reviung33/keyboard.json index 0b5ceb4e54..ab0df0195b 100644 --- a/keyboards/reviung/reviung33/keyboard.json +++ b/keyboards/reviung/reviung33/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung33", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0xFEED", diff --git a/keyboards/reviung/reviung34/keyboard.json b/keyboards/reviung/reviung34/keyboard.json index 8b354c00df..7495b7cc9d 100755 --- a/keyboards/reviung/reviung34/keyboard.json +++ b/keyboards/reviung/reviung34/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung34", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0x6774", diff --git a/keyboards/reviung/reviung39/keyboard.json b/keyboards/reviung/reviung39/keyboard.json index 04cbe909c3..e18c1c163e 100644 --- a/keyboards/reviung/reviung39/keyboard.json +++ b/keyboards/reviung/reviung39/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung39", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0xFEED", diff --git a/keyboards/reviung/reviung41/keyboard.json b/keyboards/reviung/reviung41/keyboard.json index 8e72ff5762..b44827c3d2 100644 --- a/keyboards/reviung/reviung41/keyboard.json +++ b/keyboards/reviung/reviung41/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung41", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0x7807", diff --git a/keyboards/reviung/reviung5/keyboard.json b/keyboards/reviung/reviung5/keyboard.json index 5c932020a2..78c37f4992 100644 --- a/keyboards/reviung/reviung5/keyboard.json +++ b/keyboards/reviung/reviung5/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung5", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0x5C06", diff --git a/keyboards/reviung/reviung53/keyboard.json b/keyboards/reviung/reviung53/keyboard.json index 33eec7d828..dfa2866f12 100644 --- a/keyboards/reviung/reviung53/keyboard.json +++ b/keyboards/reviung/reviung53/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung53", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0x4E94", diff --git a/keyboards/reviung/reviung61/keyboard.json b/keyboards/reviung/reviung61/keyboard.json index 99a297bde4..09497b203e 100644 --- a/keyboards/reviung/reviung61/keyboard.json +++ b/keyboards/reviung/reviung61/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "reviung61", "manufacturer": "gtips", - "url": "", "maintainer": "gtips", "usb": { "vid": "0xFEED", diff --git a/keyboards/rgbkb/sol/rev1/keyboard.json b/keyboards/rgbkb/sol/rev1/keyboard.json index 38932a78e1..9a4c538e55 100644 --- a/keyboards/rgbkb/sol/rev1/keyboard.json +++ b/keyboards/rgbkb/sol/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sol", "manufacturer": "RGBKB", - "url": "", "maintainer": "Legonut", "usb": { "vid": "0xFEED", diff --git a/keyboards/rgbkb/sol/rev2/keyboard.json b/keyboards/rgbkb/sol/rev2/keyboard.json index b6bad358e3..140ea1cd69 100644 --- a/keyboards/rgbkb/sol/rev2/keyboard.json +++ b/keyboards/rgbkb/sol/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sol", "manufacturer": "RGBKB", - "url": "", "maintainer": "Legonut", "usb": { "vid": "0xFEED", diff --git a/keyboards/rgbkb/sol3/rev1/keyboard.json b/keyboards/rgbkb/sol3/rev1/keyboard.json index 775e3f8629..dc9e6d4035 100644 --- a/keyboards/rgbkb/sol3/rev1/keyboard.json +++ b/keyboards/rgbkb/sol3/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sol 3", "manufacturer": "RGBKB", - "url": "", "maintainer": "XScorpion2, rgbkb", "usb": { "vid": "0x3535", diff --git a/keyboards/rgbkb/zen/rev1/keyboard.json b/keyboards/rgbkb/zen/rev1/keyboard.json index 91d127de58..b35381f607 100644 --- a/keyboards/rgbkb/zen/rev1/keyboard.json +++ b/keyboards/rgbkb/zen/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Project Zen", "manufacturer": "Legonut", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/rgbkb/zen/rev2/keyboard.json b/keyboards/rgbkb/zen/rev2/keyboard.json index b59af6dfdd..917274f186 100644 --- a/keyboards/rgbkb/zen/rev2/keyboard.json +++ b/keyboards/rgbkb/zen/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Project Zen", "manufacturer": "Legonut", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/rmi_kb/aelith/keyboard.json b/keyboards/rmi_kb/aelith/keyboard.json index de16e5ac31..b3f688913e 100644 --- a/keyboards/rmi_kb/aelith/keyboard.json +++ b/keyboards/rmi_kb/aelith/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "AELITH", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/chevron/keyboard.json b/keyboards/rmi_kb/chevron/keyboard.json index 8eda552902..8ae5c12ae1 100644 --- a/keyboards/rmi_kb/chevron/keyboard.json +++ b/keyboards/rmi_kb/chevron/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chevron", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/equator/keyboard.json b/keyboards/rmi_kb/equator/keyboard.json index 9e1ccab0fb..4eccede555 100644 --- a/keyboards/rmi_kb/equator/keyboard.json +++ b/keyboards/rmi_kb/equator/keyboard.json @@ -18,7 +18,6 @@ "rows": ["B12", "B10", "A15", "A10", "B1"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xE0A1", diff --git a/keyboards/rmi_kb/herringbone/pro/keyboard.json b/keyboards/rmi_kb/herringbone/pro/keyboard.json index 5303185692..a49983db07 100644 --- a/keyboards/rmi_kb/herringbone/pro/keyboard.json +++ b/keyboards/rmi_kb/herringbone/pro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Herringbone Pro", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/herringbone/v1/keyboard.json b/keyboards/rmi_kb/herringbone/v1/keyboard.json index 2883f341ab..0f624dbc99 100644 --- a/keyboards/rmi_kb/herringbone/v1/keyboard.json +++ b/keyboards/rmi_kb/herringbone/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Herringbone", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/mona/v1/keyboard.json b/keyboards/rmi_kb/mona/v1/keyboard.json index 9d8f66af2f..f56986df1a 100644 --- a/keyboards/rmi_kb/mona/v1/keyboard.json +++ b/keyboards/rmi_kb/mona/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mona", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/mona/v1_1/keyboard.json b/keyboards/rmi_kb/mona/v1_1/keyboard.json index b1e1f27fc0..95f7b9706e 100644 --- a/keyboards/rmi_kb/mona/v1_1/keyboard.json +++ b/keyboards/rmi_kb/mona/v1_1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mona", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/mona/v32a/keyboard.json b/keyboards/rmi_kb/mona/v32a/keyboard.json index e4b7760813..84a301d173 100644 --- a/keyboards/rmi_kb/mona/v32a/keyboard.json +++ b/keyboards/rmi_kb/mona/v32a/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mona", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/squishy65/keyboard.json b/keyboards/rmi_kb/squishy65/keyboard.json index adc83200d3..aecaaf9c04 100644 --- a/keyboards/rmi_kb/squishy65/keyboard.json +++ b/keyboards/rmi_kb/squishy65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Squishy65", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/squishyfrl/keyboard.json b/keyboards/rmi_kb/squishyfrl/keyboard.json index 8a14a2a4ed..5f5d305c6f 100644 --- a/keyboards/rmi_kb/squishyfrl/keyboard.json +++ b/keyboards/rmi_kb/squishyfrl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SquishyFRL", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/squishytkl/keyboard.json b/keyboards/rmi_kb/squishytkl/keyboard.json index ae63d83c5d..6fc61e6b3c 100644 --- a/keyboards/rmi_kb/squishytkl/keyboard.json +++ b/keyboards/rmi_kb/squishytkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SquishyTKL", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/tkl_ff/info.json b/keyboards/rmi_kb/tkl_ff/info.json index a4fe24cab7..96bbeb8159 100644 --- a/keyboards/rmi_kb/tkl_ff/info.json +++ b/keyboards/rmi_kb/tkl_ff/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "TKL FF", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/wete/v1/keyboard.json b/keyboards/rmi_kb/wete/v1/keyboard.json index c9a54f76c2..ff18fac5b5 100644 --- a/keyboards/rmi_kb/wete/v1/keyboard.json +++ b/keyboards/rmi_kb/wete/v1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wete", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmi_kb/wete/v2/keyboard.json b/keyboards/rmi_kb/wete/v2/keyboard.json index 2c925ee919..3ad1fc9a73 100644 --- a/keyboards/rmi_kb/wete/v2/keyboard.json +++ b/keyboards/rmi_kb/wete/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Wete R2", "manufacturer": "RMI-KB", - "url": "", "maintainer": "ramonimbao", "usb": { "vid": "0xB16B", diff --git a/keyboards/rmkeebs/rm_fullsize/keyboard.json b/keyboards/rmkeebs/rm_fullsize/keyboard.json index f9ff4dd5b8..a7e6ff99cb 100644 --- a/keyboards/rmkeebs/rm_fullsize/keyboard.json +++ b/keyboards/rmkeebs/rm_fullsize/keyboard.json @@ -18,7 +18,6 @@ "rows": ["GP8", "GP7", "GP9", "GP20", "GP18", "GP19"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/rocketboard_16/keyboard.json b/keyboards/rocketboard_16/keyboard.json index 4831911f4f..cacd37d1c3 100644 --- a/keyboards/rocketboard_16/keyboard.json +++ b/keyboards/rocketboard_16/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Rocketboard-16", "manufacturer": "Rocketboard", - "url": "", "maintainer": "fl3tching101", "usb": { "vid": "0xB034", diff --git a/keyboards/rominronin/katana60/rev1/keyboard.json b/keyboards/rominronin/katana60/rev1/keyboard.json index 0a9bb4ea49..b8d9df35a7 100644 --- a/keyboards/rominronin/katana60/rev1/keyboard.json +++ b/keyboards/rominronin/katana60/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Katana60 rev1", "manufacturer": "RominRonin CandyKeys", - "url": "", "maintainer": "rominronin", "usb": { "vid": "0x7272", diff --git a/keyboards/rot13labs/rotc0n/keyboard.json b/keyboards/rot13labs/rotc0n/keyboard.json index a9dc27a471..a340c37d62 100644 --- a/keyboards/rot13labs/rotc0n/keyboard.json +++ b/keyboards/rot13labs/rotc0n/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B1", "B0"] }, "processor": "atmega328p", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xBEEF", diff --git a/keyboards/rpiguy9907/southpaw66/keyboard.json b/keyboards/rpiguy9907/southpaw66/keyboard.json index f2fdf4f5ff..c751ee6d8e 100644 --- a/keyboards/rpiguy9907/southpaw66/keyboard.json +++ b/keyboards/rpiguy9907/southpaw66/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Southpaw66", "manufacturer": "rpiguy9907", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x9907", diff --git a/keyboards/ryanbaekr/rb1/keyboard.json b/keyboards/ryanbaekr/rb1/keyboard.json index 31f2fa20c4..dd54bd2998 100644 --- a/keyboards/ryanbaekr/rb1/keyboard.json +++ b/keyboards/ryanbaekr/rb1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rb1", "manufacturer": "ryanbaekr", - "url": "", "maintainer": "ryanbaekr", "usb": { "vid": "0x7262", diff --git a/keyboards/ryanbaekr/rb18/keyboard.json b/keyboards/ryanbaekr/rb18/keyboard.json index 03a1335c7b..cf9539c462 100644 --- a/keyboards/ryanbaekr/rb18/keyboard.json +++ b/keyboards/ryanbaekr/rb18/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rb18", "manufacturer": "ryanbaekr", - "url": "", "maintainer": "ryanbaekr", "usb": { "vid": "0x7262", diff --git a/keyboards/ryanbaekr/rb69/keyboard.json b/keyboards/ryanbaekr/rb69/keyboard.json index c1cce7508e..3a5fd3fee3 100644 --- a/keyboards/ryanbaekr/rb69/keyboard.json +++ b/keyboards/ryanbaekr/rb69/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rb69", "manufacturer": "ryanbaekr", - "url": "", "maintainer": "ryanbaekr", "usb": { "vid": "0x7262", diff --git a/keyboards/ryanbaekr/rb86/keyboard.json b/keyboards/ryanbaekr/rb86/keyboard.json index 5813a2fa7b..6cc5f0f9b0 100644 --- a/keyboards/ryanbaekr/rb86/keyboard.json +++ b/keyboards/ryanbaekr/rb86/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rb86", "manufacturer": "ryanbaekr", - "url": "", "maintainer": "ryanbaekr", "usb": { "vid": "0x7262", diff --git a/keyboards/ryanbaekr/rb87/keyboard.json b/keyboards/ryanbaekr/rb87/keyboard.json index 6d19c3c29d..42114b29d8 100644 --- a/keyboards/ryanbaekr/rb87/keyboard.json +++ b/keyboards/ryanbaekr/rb87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "rb87", "manufacturer": "ryanbaekr", - "url": "", "maintainer": "ryanbaekr", "development_board": "elite_c", "pin_compatible": "elite_c", diff --git a/keyboards/ryanskidmore/rskeys100/keyboard.json b/keyboards/ryanskidmore/rskeys100/keyboard.json index c77d3f4c90..27eae84a6e 100644 --- a/keyboards/ryanskidmore/rskeys100/keyboard.json +++ b/keyboards/ryanskidmore/rskeys100/keyboard.json @@ -158,7 +158,6 @@ }, "processor": "atmega32u4", "bootloader": "atmel-dfu", - "url": "", "maintainer": "ryanskidmore", "community_layouts": ["fullsize_iso"], "layouts": { diff --git a/keyboards/sakura_workshop/fuji75/info.json b/keyboards/sakura_workshop/fuji75/info.json index 7b56fd4d72..604c504641 100644 --- a/keyboards/sakura_workshop/fuji75/info.json +++ b/keyboards/sakura_workshop/fuji75/info.json @@ -1,6 +1,5 @@ { "manufacturer": "SakuraWorkshop", - "url": "", "maintainer": "Freather", "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/salane/ncr80alpsskfl/keyboard.json b/keyboards/salane/ncr80alpsskfl/keyboard.json index ce3f10c685..5f7bae802a 100644 --- a/keyboards/salane/ncr80alpsskfl/keyboard.json +++ b/keyboards/salane/ncr80alpsskfl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NCR80 ALPS SKFL", "manufacturer": "Salane", - "url": "", "maintainer": "Mai The San", "processor": "RP2040", "bootloader": "rp2040", diff --git a/keyboards/salane/starryfrl/keyboard.json b/keyboards/salane/starryfrl/keyboard.json index 43e434cb02..fa8bd1224b 100644 --- a/keyboards/salane/starryfrl/keyboard.json +++ b/keyboards/salane/starryfrl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Starry FRL", "manufacturer": "Salane", - "url": "", "maintainer": "Mai The San", "processor": "RP2040", "bootloader": "rp2040", diff --git a/keyboards/salicylic_acid3/guide68/keyboard.json b/keyboards/salicylic_acid3/guide68/keyboard.json index d2c6f10d11..8bdb68f8c1 100644 --- a/keyboards/salicylic_acid3/guide68/keyboard.json +++ b/keyboards/salicylic_acid3/guide68/keyboard.json @@ -18,7 +18,6 @@ "rows": ["D4", "C6", "D7", "E6", "B4"] }, "processor": "atmega32u4", - "url": "", "usb": { "vid": "0x04D8", "pid": "0xE6DD", diff --git a/keyboards/sam/s80/keyboard.json b/keyboards/sam/s80/keyboard.json index c721efdbd7..846ae198dd 100644 --- a/keyboards/sam/s80/keyboard.json +++ b/keyboards/sam/s80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "s8", "manufacturer": "Sam", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x534D", diff --git a/keyboards/sam/sg81m/keyboard.json b/keyboards/sam/sg81m/keyboard.json index 66e0f1ab9c..4909a62569 100644 --- a/keyboards/sam/sg81m/keyboard.json +++ b/keyboards/sam/sg81m/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SG81M", "manufacturer": "Sam", - "url": "", "maintainer": "CMMS-Freather", "usb": { "vid": "0x534D", diff --git a/keyboards/sanctified/dystopia/keyboard.json b/keyboards/sanctified/dystopia/keyboard.json index 1911081fc2..a7ae1a8ebb 100644 --- a/keyboards/sanctified/dystopia/keyboard.json +++ b/keyboards/sanctified/dystopia/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dystopia", "manufacturer": "Sanctified.Works", - "url": "", "maintainer": "Sanctified", "usb": { "vid": "0x5357", diff --git a/keyboards/sandwich/keeb68/keyboard.json b/keyboards/sandwich/keeb68/keyboard.json index ad3ced0da2..cb03d5a256 100644 --- a/keyboards/sandwich/keeb68/keyboard.json +++ b/keyboards/sandwich/keeb68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Keeb68 (Patron Saint Edition)", "manufacturer": "sandwich", - "url": "", "maintainer": "SandwichRising", "usb": { "vid": "0xFEED", diff --git a/keyboards/satt/comet46/keyboard.json b/keyboards/satt/comet46/keyboard.json index 0092f19c79..cd96686d6c 100644 --- a/keyboards/satt/comet46/keyboard.json +++ b/keyboards/satt/comet46/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Comet46", "manufacturer": "SatT", - "url": "", "maintainer": "SatT", "usb": { "vid": "0xFEED", diff --git a/keyboards/satt/vision/keyboard.json b/keyboards/satt/vision/keyboard.json index 88ec732cd6..15bbced9f5 100644 --- a/keyboards/satt/vision/keyboard.json +++ b/keyboards/satt/vision/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vision", "manufacturer": "SatT", - "url": "", "maintainer": "SatT", "usb": { "vid": "0x5454", diff --git a/keyboards/sauce/mild/keyboard.json b/keyboards/sauce/mild/keyboard.json index 5f827ec4be..125fee6734 100644 --- a/keyboards/sauce/mild/keyboard.json +++ b/keyboards/sauce/mild/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Mild", "manufacturer": "Sauce", - "url": "", "maintainer": "andyywz", "usb": { "vid": "0x8367", diff --git a/keyboards/sawnsprojects/amber80/solder/keyboard.json b/keyboards/sawnsprojects/amber80/solder/keyboard.json index dc8e718fd6..37f8382f53 100644 --- a/keyboards/sawnsprojects/amber80/solder/keyboard.json +++ b/keyboards/sawnsprojects/amber80/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Amber80 Solder", "manufacturer": "SawnsProjects X Yuutsu X Zlane", - "url": "", "maintainer": "SawnsProjects", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/bunnygirl65/keyboard.json b/keyboards/sawnsprojects/bunnygirl65/keyboard.json index 92dca8693d..3fab84c557 100644 --- a/keyboards/sawnsprojects/bunnygirl65/keyboard.json +++ b/keyboards/sawnsprojects/bunnygirl65/keyboard.json @@ -15,7 +15,6 @@ "rows": ["B4", "A15", "A3", "A8", "B14"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "force_nkro": true, diff --git a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json index e4b63753e2..7647131d9a 100644 --- a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Eclipse60", "manufacturer": "Salane", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x534C", diff --git a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json index 6790011807..360b42ead9 100644 --- a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "tinyneko", "manufacturer": "Salane", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x534C", diff --git a/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json b/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json index ccb9165c5b..3f1b8f622f 100644 --- a/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json +++ b/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Krush65 - Hotswap", "manufacturer": "SawnsProjects", - "url": "", "maintainer": "MaiTheSan", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json b/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json index a72c903d8c..bb4964f22c 100644 --- a/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json +++ b/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Krush65 - Solder", "manufacturer": "SawnsProjects", - "url": "", "maintainer": "MaiTheSan", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/okayu/info.json b/keyboards/sawnsprojects/okayu/info.json index 08c5afe688..74c5874b61 100644 --- a/keyboards/sawnsprojects/okayu/info.json +++ b/keyboards/sawnsprojects/okayu/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Okayu", "manufacturer": "Salane", - "url": "", "maintainer": "Mai The San", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/plaque80/keyboard.json b/keyboards/sawnsprojects/plaque80/keyboard.json index dd18cc12ee..6e7784e090 100644 --- a/keyboards/sawnsprojects/plaque80/keyboard.json +++ b/keyboards/sawnsprojects/plaque80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Plaque80", "manufacturer": "SawnsProjects", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/re65/keyboard.json b/keyboards/sawnsprojects/re65/keyboard.json index 45e874db6d..04f050cfe5 100644 --- a/keyboards/sawnsprojects/re65/keyboard.json +++ b/keyboards/sawnsprojects/re65/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "RE65", "maintainer": "Salane", "manufacturer": "Mai The San", - "url": "", "processor": "RP2040", "bootloader": "rp2040", "usb": { diff --git a/keyboards/sawnsprojects/satxri6key/keyboard.json b/keyboards/sawnsprojects/satxri6key/keyboard.json index 7049be25cf..717ea2c1f4 100644 --- a/keyboards/sawnsprojects/satxri6key/keyboard.json +++ b/keyboards/sawnsprojects/satxri6key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Satxri6key", "manufacturer": "MaiTheSan", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5350", diff --git a/keyboards/sawnsprojects/vcl65/solder/keyboard.json b/keyboards/sawnsprojects/vcl65/solder/keyboard.json index 4fc0f29766..10c10da8f2 100644 --- a/keyboards/sawnsprojects/vcl65/solder/keyboard.json +++ b/keyboards/sawnsprojects/vcl65/solder/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "VCL65", "manufacturer": "VCL x SawnsProjects", - "url": "", "maintainer": "MaiTheSan", "usb": { "vid": "0x5350", diff --git a/keyboards/sck/gtm/keyboard.json b/keyboards/sck/gtm/keyboard.json index 7ed3915114..88744edc84 100644 --- a/keyboards/sck/gtm/keyboard.json +++ b/keyboards/sck/gtm/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GTM Pad", "manufacturer": "SpaceCityKeyboards", - "url": "", "maintainer": "jrfhoutx", "usb": { "vid": "0xFEED", diff --git a/keyboards/sck/neiso/keyboard.json b/keyboards/sck/neiso/keyboard.json index 15cec58849..28ea132e2f 100644 --- a/keyboards/sck/neiso/keyboard.json +++ b/keyboards/sck/neiso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEISO", "manufacturer": "Space City Keyboards", - "url": "", "maintainer": "jrfhoutx", "usb": { "vid": "0xFEED", diff --git a/keyboards/sck/osa/keyboard.json b/keyboards/sck/osa/keyboard.json index 1cdd59367b..caff86da75 100644 --- a/keyboards/sck/osa/keyboard.json +++ b/keyboards/sck/osa/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OSA", "manufacturer": "Space City Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5343", diff --git a/keyboards/sentraq/s60_x/info.json b/keyboards/sentraq/s60_x/info.json index 11ebdcd7d1..f8a28d9e85 100644 --- a/keyboards/sentraq/s60_x/info.json +++ b/keyboards/sentraq/s60_x/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Sentraq", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/sentraq/s65_plus/keyboard.json b/keyboards/sentraq/s65_plus/keyboard.json index 01e2f0a275..c3f8851144 100644 --- a/keyboards/sentraq/s65_plus/keyboard.json +++ b/keyboards/sentraq/s65_plus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "S65-Plus", "manufacturer": "Sentraq", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/sentraq/s65_x/keyboard.json b/keyboards/sentraq/s65_x/keyboard.json index 0d0b0fc5fd..0329d36a49 100644 --- a/keyboards/sentraq/s65_x/keyboard.json +++ b/keyboards/sentraq/s65_x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "S65-X PCB", "manufacturer": "Sentraq", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/shambles/keyboard.json b/keyboards/shambles/keyboard.json index 34ec240cae..5f0e296ee8 100644 --- a/keyboards/shambles/keyboard.json +++ b/keyboards/shambles/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Shambles TKL", "manufacturer": "OsciX", - "url": "", "maintainer": "OsciX", "usb": { "vid": "0xFEED", diff --git a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json index f181c610ed..e06f1adf7d 100644 --- a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json @@ -19,7 +19,6 @@ "rows": ["B14", "B10", "F0", "C15", "C14"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0004", diff --git a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json index 2b717c4c59..ef145046ef 100644 --- a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json @@ -19,7 +19,6 @@ "rows": ["B9", "B8", "A2", "A1", "A0"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0003", diff --git a/keyboards/shandoncodes/riot_pad/keyboard.json b/keyboards/shandoncodes/riot_pad/keyboard.json index 7ecb52d8e0..8a019115d3 100644 --- a/keyboards/shandoncodes/riot_pad/keyboard.json +++ b/keyboards/shandoncodes/riot_pad/keyboard.json @@ -32,7 +32,6 @@ }, "led_count": 12 }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x1000", diff --git a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json index 39d59ffa55..f98fd659c3 100644 --- a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json @@ -185,7 +185,6 @@ "val_steps": 28, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3662", diff --git a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json index 6535ec63b7..cfc24397e9 100644 --- a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json @@ -169,7 +169,6 @@ "val_steps": 28, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3663", diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json index b7a628fd78..d6e42880ac 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json @@ -152,7 +152,6 @@ "sleep": true, "val_steps": 28 }, - "url": "", "usb": { "device_version": "1.1.0", "pid": "0x1020", diff --git a/keyboards/shorty/keyboard.json b/keyboards/shorty/keyboard.json index 158648badd..8310891c84 100644 --- a/keyboards/shorty/keyboard.json +++ b/keyboards/shorty/keyboard.json @@ -22,7 +22,6 @@ "rows": ["GP11", "GP10", "GP9", "GP29", "GP2"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x5400", diff --git a/keyboards/shostudio/arc/keyboard.json b/keyboards/shostudio/arc/keyboard.json index 33f9deb866..c1dd12e3db 100644 --- a/keyboards/shostudio/arc/keyboard.json +++ b/keyboards/shostudio/arc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ARC", "manufacturer": "Mechlovin Studio", - "url": "", "maintainer": "Shostudio", "usb": { "vid": "0x5050", diff --git a/keyboards/sidderskb/majbritt/rev1/keyboard.json b/keyboards/sidderskb/majbritt/rev1/keyboard.json index 717b4e85a0..bb18c1bb00 100644 --- a/keyboards/sidderskb/majbritt/rev1/keyboard.json +++ b/keyboards/sidderskb/majbritt/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Majbritt Rev1", "manufacturer": "SiddersKb", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x534B", diff --git a/keyboards/sirius/uni660/rev1/keyboard.json b/keyboards/sirius/uni660/rev1/keyboard.json index 793edcc685..c98c121bb8 100644 --- a/keyboards/sirius/uni660/rev1/keyboard.json +++ b/keyboards/sirius/uni660/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Uni660", "manufacturer": "SiRius", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5352", diff --git a/keyboards/sirius/uni660/rev2/ansi/keyboard.json b/keyboards/sirius/uni660/rev2/ansi/keyboard.json index 3db9fb966a..df039af1dc 100644 --- a/keyboards/sirius/uni660/rev2/ansi/keyboard.json +++ b/keyboards/sirius/uni660/rev2/ansi/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Uni660 V2 ANSI", "manufacturer": "SiRius", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5352", diff --git a/keyboards/sirius/uni660/rev2/iso/keyboard.json b/keyboards/sirius/uni660/rev2/iso/keyboard.json index 0e5958c117..062ca4f07e 100644 --- a/keyboards/sirius/uni660/rev2/iso/keyboard.json +++ b/keyboards/sirius/uni660/rev2/iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Uni660 V2 ISO", "manufacturer": "SiRius", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5352", diff --git a/keyboards/sixkeyboard/keyboard.json b/keyboards/sixkeyboard/keyboard.json index 1c103e03b3..5c29dee16f 100644 --- a/keyboards/sixkeyboard/keyboard.json +++ b/keyboards/sixkeyboard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SixKeyBoard", "manufacturer": "TechKeys", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x746B", diff --git a/keyboards/skeletn87/hotswap/keyboard.json b/keyboards/skeletn87/hotswap/keyboard.json index b0af230668..f90716fcbf 100644 --- a/keyboards/skeletn87/hotswap/keyboard.json +++ b/keyboards/skeletn87/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Skeletn87 Hotswap", "manufacturer": "BredWorks", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xF984", diff --git a/keyboards/skeletn87/soldered/keyboard.json b/keyboards/skeletn87/soldered/keyboard.json index 292914d8b4..a50eeb8b68 100644 --- a/keyboards/skeletn87/soldered/keyboard.json +++ b/keyboards/skeletn87/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Skeletn87", "manufacturer": "BredWorks", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xF984", diff --git a/keyboards/skippys_custom_pcs/roopad/keyboard.json b/keyboards/skippys_custom_pcs/roopad/keyboard.json index 0da722ff12..92cb0d1979 100644 --- a/keyboards/skippys_custom_pcs/roopad/keyboard.json +++ b/keyboards/skippys_custom_pcs/roopad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RooPad", "manufacturer": "ToastyStoemp", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x36B6", diff --git a/keyboards/smallkeyboard/keyboard.json b/keyboards/smallkeyboard/keyboard.json index 9963d83a47..dfbdee1cdd 100644 --- a/keyboards/smallkeyboard/keyboard.json +++ b/keyboards/smallkeyboard/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "smallkeyboard", "manufacturer": "zhouqiong19840119", - "url": "", "maintainer": "zhouqiong19840119", "usb": { "vid": "0x7A71", diff --git a/keyboards/smithrune/iron160/iron160_h/keyboard.json b/keyboards/smithrune/iron160/iron160_h/keyboard.json index c1dd4c9f54..c0c0eb1221 100644 --- a/keyboards/smithrune/iron160/iron160_h/keyboard.json +++ b/keyboards/smithrune/iron160/iron160_h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "I160-H", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/iron160/iron160_s/keyboard.json b/keyboards/smithrune/iron160/iron160_s/keyboard.json index fc14114826..d247ce3253 100644 --- a/keyboards/smithrune/iron160/iron160_s/keyboard.json +++ b/keyboards/smithrune/iron160/iron160_s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "I160-S", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/iron165r2/info.json b/keyboards/smithrune/iron165r2/info.json index cff9a97cb7..c0fb3634c3 100644 --- a/keyboards/smithrune/iron165r2/info.json +++ b/keyboards/smithrune/iron165r2/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iron165R2", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/iron180/keyboard.json b/keyboards/smithrune/iron180/keyboard.json index b0c6e1a8ff..23ffa323af 100644 --- a/keyboards/smithrune/iron180/keyboard.json +++ b/keyboards/smithrune/iron180/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iron180 V1", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/iron180v2/v2h/keyboard.json b/keyboards/smithrune/iron180v2/v2h/keyboard.json index 1580a12b8c..cf2d7163ed 100644 --- a/keyboards/smithrune/iron180v2/v2h/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iron180H v2", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/iron180v2/v2s/keyboard.json b/keyboards/smithrune/iron180v2/v2s/keyboard.json index f8f27f4cc1..2e21e17f28 100644 --- a/keyboards/smithrune/iron180v2/v2s/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Iron180 Sv2", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/magnus/m75h/keyboard.json b/keyboards/smithrune/magnus/m75h/keyboard.json index 325db7d1da..c8b2e47069 100644 --- a/keyboards/smithrune/magnus/m75h/keyboard.json +++ b/keyboards/smithrune/magnus/m75h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Magnus M75H", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smithrune/magnus/m75s/keyboard.json b/keyboards/smithrune/magnus/m75s/keyboard.json index 352b529bb0..a678c7eeaa 100644 --- a/keyboards/smithrune/magnus/m75s/keyboard.json +++ b/keyboards/smithrune/magnus/m75s/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Magnus M75S", "manufacturer": "SmithRune", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8384", diff --git a/keyboards/smk60/keyboard.json b/keyboards/smk60/keyboard.json index 67265a667c..13c81a21de 100644 --- a/keyboards/smk60/keyboard.json +++ b/keyboards/smk60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SMK60", "manufacturer": "astro", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xDEAD", diff --git a/keyboards/snampad/keyboard.json b/keyboards/snampad/keyboard.json index e2a269d5c7..b835f0bf35 100644 --- a/keyboards/snampad/keyboard.json +++ b/keyboards/snampad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "snampad", "manufacturer": "Snamellit", - "url": "", "maintainer": "ptillemans", "usb": { "vid": "0xFEED", diff --git a/keyboards/snes_macropad/keyboard.json b/keyboards/snes_macropad/keyboard.json index 91ee332357..c9d5e2aa59 100644 --- a/keyboards/snes_macropad/keyboard.json +++ b/keyboards/snes_macropad/keyboard.json @@ -19,7 +19,6 @@ "driver": "vendor" }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/soda/cherish/keyboard.json b/keyboards/soda/cherish/keyboard.json index b256e93965..9235fe3b3e 100644 --- a/keyboards/soda/cherish/keyboard.json +++ b/keyboards/soda/cherish/keyboard.json @@ -1,6 +1,5 @@ { "keyboard_name": "Cherish-75", - "url": "", "maintainer": "gezhaoyou", "manufacturer": "gezhaoyou", "usb": { diff --git a/keyboards/soy20/keyboard.json b/keyboards/soy20/keyboard.json index 77524eff6c..3a61743326 100644 --- a/keyboards/soy20/keyboard.json +++ b/keyboards/soy20/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Soy20", "manufacturer": "drewkeys", - "url": "", "maintainer": "twholt", "usb": { "vid": "0x4452", diff --git a/keyboards/spaceholdings/nebula12/keyboard.json b/keyboards/spaceholdings/nebula12/keyboard.json index 2b170e8e61..7157cfc05b 100755 --- a/keyboards/spaceholdings/nebula12/keyboard.json +++ b/keyboards/spaceholdings/nebula12/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEBULA12", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/spaceholdings/nebula12b/keyboard.json b/keyboards/spaceholdings/nebula12b/keyboard.json index 961e971885..38320bd1ea 100755 --- a/keyboards/spaceholdings/nebula12b/keyboard.json +++ b/keyboards/spaceholdings/nebula12b/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEBULA12B", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/spaceholdings/nebula68/keyboard.json b/keyboards/spaceholdings/nebula68/keyboard.json index 47cab7a5b0..8eb6d67a03 100755 --- a/keyboards/spaceholdings/nebula68/keyboard.json +++ b/keyboards/spaceholdings/nebula68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NEBULA68", "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/spaceholdings/nebula68b/info.json b/keyboards/spaceholdings/nebula68b/info.json index 3a7f6f9b25..b41a21f971 100644 --- a/keyboards/spaceholdings/nebula68b/info.json +++ b/keyboards/spaceholdings/nebula68b/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Yiancar-Designs", - "url": "", "maintainer": "yiancar", "usb": { "vid": "0x8968", diff --git a/keyboards/spaceman/2_milk/keyboard.json b/keyboards/spaceman/2_milk/keyboard.json index 4fdef6bace..aed735c58f 100644 --- a/keyboards/spaceman/2_milk/keyboard.json +++ b/keyboards/spaceman/2_milk/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "2% Milk", "manufacturer": "Spaceman", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0x5342", diff --git a/keyboards/spaceman/pancake/rev1/info.json b/keyboards/spaceman/pancake/rev1/info.json index 0814e11244..9d6f30ab51 100644 --- a/keyboards/spaceman/pancake/rev1/info.json +++ b/keyboards/spaceman/pancake/rev1/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pancake", "manufacturer": "Spaceman", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0x5342", diff --git a/keyboards/spaceman/pancake/rev2/keyboard.json b/keyboards/spaceman/pancake/rev2/keyboard.json index 88bf2a0b9f..2e7dd8f6b4 100644 --- a/keyboards/spaceman/pancake/rev2/keyboard.json +++ b/keyboards/spaceman/pancake/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pancake 2", "manufacturer": "Spaceman", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0x5342", diff --git a/keyboards/spaceman/yun65/keyboard.json b/keyboards/spaceman/yun65/keyboard.json index 017de06abb..1f57af8e0d 100644 --- a/keyboards/spaceman/yun65/keyboard.json +++ b/keyboards/spaceman/yun65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Yun 65", "manufacturer": "Spaceman", - "url": "", "maintainer": "Spaceman", "usb": { "vid": "0x5342", diff --git a/keyboards/specskeys/keyboard.json b/keyboards/specskeys/keyboard.json index 104b1ea13d..73d34e4a39 100644 --- a/keyboards/specskeys/keyboard.json +++ b/keyboards/specskeys/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Specskeys", "manufacturer": "Specs32", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xCAFE", diff --git a/keyboards/spiderisland/split78/keyboard.json b/keyboards/spiderisland/split78/keyboard.json index cd49755b0f..4a818470f8 100644 --- a/keyboards/spiderisland/split78/keyboard.json +++ b/keyboards/spiderisland/split78/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Split 78-key", "manufacturer": "SpiderIsland", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/split67/keyboard.json b/keyboards/split67/keyboard.json index 46b571420a..6462149d3b 100644 --- a/keyboards/split67/keyboard.json +++ b/keyboards/split67/keyboard.json @@ -37,7 +37,6 @@ "pin": "D0" } }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0xBBBC", diff --git a/keyboards/splitish/keyboard.json b/keyboards/splitish/keyboard.json index 3df635e6bc..9b9701a853 100644 --- a/keyboards/splitish/keyboard.json +++ b/keyboards/splitish/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Splitish", "manufacturer": "Reid Schneyer", - "url": "", "maintainer": "RSchneyer", "usb": { "vid": "0xFEED", diff --git a/keyboards/stello65/beta/keyboard.json b/keyboards/stello65/beta/keyboard.json index 5dbc3b1338..d6bf574b9a 100644 --- a/keyboards/stello65/beta/keyboard.json +++ b/keyboards/stello65/beta/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stello65", "manufacturer": "@wekey", - "url": "", "maintainer": "@wekey", "usb": { "vid": "0x5559", diff --git a/keyboards/stello65/hs_rev1/keyboard.json b/keyboards/stello65/hs_rev1/keyboard.json index 783b73c599..bf502de563 100644 --- a/keyboards/stello65/hs_rev1/keyboard.json +++ b/keyboards/stello65/hs_rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stello65", "manufacturer": "@wekey", - "url": "", "maintainer": "@wekey", "usb": { "vid": "0x5559", diff --git a/keyboards/stello65/sl_rev1/keyboard.json b/keyboards/stello65/sl_rev1/keyboard.json index 8be7b07d0a..e8ac4ea7de 100644 --- a/keyboards/stello65/sl_rev1/keyboard.json +++ b/keyboards/stello65/sl_rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Stello65", "manufacturer": "@wekey", - "url": "", "maintainer": "@wekey", "usb": { "vid": "0x5559", diff --git a/keyboards/stratos/keyboard.json b/keyboards/stratos/keyboard.json index 842c9b87a3..20a057ba88 100644 --- a/keyboards/stratos/keyboard.json +++ b/keyboards/stratos/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "stratos", "manufacturer": "eggyolk", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0xD5D0", diff --git a/keyboards/studiokestra/frl84/keyboard.json b/keyboards/studiokestra/frl84/keyboard.json index d131b09eac..3bb51c7606 100644 --- a/keyboards/studiokestra/frl84/keyboard.json +++ b/keyboards/studiokestra/frl84/keyboard.json @@ -45,7 +45,6 @@ } }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0F84", diff --git a/keyboards/studiokestra/galatea/rev1/keyboard.json b/keyboards/studiokestra/galatea/rev1/keyboard.json index ff2adbce4d..320b381e82 100644 --- a/keyboards/studiokestra/galatea/rev1/keyboard.json +++ b/keyboards/studiokestra/galatea/rev1/keyboard.json @@ -23,7 +23,6 @@ "rows": ["D1", "D0", "B0", "B7", "E6", "B3", "B6", "C6", "D6", "D7", "B4", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x8801", diff --git a/keyboards/studiokestra/galatea/rev2/keyboard.json b/keyboards/studiokestra/galatea/rev2/keyboard.json index 19bb235e33..6d59e14e64 100644 --- a/keyboards/studiokestra/galatea/rev2/keyboard.json +++ b/keyboards/studiokestra/galatea/rev2/keyboard.json @@ -24,7 +24,6 @@ "rows": ["D1", "D0", "B0", "B7", "E6", "B3", "B6", "C6", "D6", "D7", "B4", "D3"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x8802", diff --git a/keyboards/studiokestra/galatea/rev3/keyboard.json b/keyboards/studiokestra/galatea/rev3/keyboard.json index c077351bb9..1b948f426d 100644 --- a/keyboards/studiokestra/galatea/rev3/keyboard.json +++ b/keyboards/studiokestra/galatea/rev3/keyboard.json @@ -24,7 +24,6 @@ "rows": ["GP3", "GP4", "GP1", "GP2", "GP5", "GP29", "GP20", "GP19", "GP17", "GP16", "GP13", "GP12"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x8803", diff --git a/keyboards/suavity/ehan/keyboard.json b/keyboards/suavity/ehan/keyboard.json index 5a6675bfc3..acc470c8b6 100755 --- a/keyboards/suavity/ehan/keyboard.json +++ b/keyboards/suavity/ehan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ehan", "manufacturer": "Suavity Designs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5344", diff --git a/keyboards/subatomic/keyboard.json b/keyboards/subatomic/keyboard.json index 0816130bbb..20313a1318 100644 --- a/keyboards/subatomic/keyboard.json +++ b/keyboards/subatomic/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Subatomic", "manufacturer": "OLKB", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/superuser/ext/keyboard.json b/keyboards/superuser/ext/keyboard.json index c08213a13f..5a0ac65d64 100644 --- a/keyboards/superuser/ext/keyboard.json +++ b/keyboards/superuser/ext/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ext", "manufacturer": "superuser", - "url": "", "maintainer": "kaylanm", "usb": { "vid": "0x5355", diff --git a/keyboards/superuser/frl/keyboard.json b/keyboards/superuser/frl/keyboard.json index 4ede02d20d..d540622b69 100644 --- a/keyboards/superuser/frl/keyboard.json +++ b/keyboards/superuser/frl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "frl", "manufacturer": "superuser", - "url": "", "maintainer": "superuser", "usb": { "vid": "0x5355", diff --git a/keyboards/superuser/tkl/keyboard.json b/keyboards/superuser/tkl/keyboard.json index 79df5bac09..ecf8dc713b 100644 --- a/keyboards/superuser/tkl/keyboard.json +++ b/keyboards/superuser/tkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "tkl", "manufacturer": "superuser", - "url": "", "maintainer": "kaylanm", "usb": { "vid": "0x5355", diff --git a/keyboards/swiss/keyboard.json b/keyboards/swiss/keyboard.json index 039153cd7f..74f9ff23e3 100644 --- a/keyboards/swiss/keyboard.json +++ b/keyboards/swiss/keyboard.json @@ -17,7 +17,6 @@ "rows": ["D6", "D4", "D5", "B2", "D7"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0420", diff --git a/keyboards/switchplate/southpaw_fullsize/keyboard.json b/keyboards/switchplate/southpaw_fullsize/keyboard.json index 84942ccfa4..9f61bc9abc 100644 --- a/keyboards/switchplate/southpaw_fullsize/keyboard.json +++ b/keyboards/switchplate/southpaw_fullsize/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Southpaw Fullsize", "manufacturer": "Switchplate Peripherals", - "url": "", "maintainer": "ai03", "usb": { "vid": "0xA103", diff --git a/keyboards/switchplate/switchplate910/keyboard.json b/keyboards/switchplate/switchplate910/keyboard.json index 47353fe81e..43150834f5 100644 --- a/keyboards/switchplate/switchplate910/keyboard.json +++ b/keyboards/switchplate/switchplate910/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "910", "manufacturer": "Switchplate Peripherals", - "url": "", "maintainer": "MxBluE", "usb": { "vid": "0x54F3", diff --git a/keyboards/sx60/keyboard.json b/keyboards/sx60/keyboard.json index ba5b439cec..9d3663fecf 100644 --- a/keyboards/sx60/keyboard.json +++ b/keyboards/sx60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SX60", "manufacturer": "Quantrik", - "url": "", "maintainer": "https://github.com/amnobis", "usb": { "vid": "0x5154", diff --git a/keyboards/synthandkeys/bento_box/keyboard.json b/keyboards/synthandkeys/bento_box/keyboard.json index 3cdc7a5870..3fb784da75 100644 --- a/keyboards/synthandkeys/bento_box/keyboard.json +++ b/keyboards/synthandkeys/bento_box/keyboard.json @@ -31,7 +31,6 @@ ] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/synthandkeys/the_debit_card/keyboard.json b/keyboards/synthandkeys/the_debit_card/keyboard.json index a2d0a6964f..1d3798291b 100644 --- a/keyboards/synthandkeys/the_debit_card/keyboard.json +++ b/keyboards/synthandkeys/the_debit_card/keyboard.json @@ -19,7 +19,6 @@ ] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/tada68/keyboard.json b/keyboards/tada68/keyboard.json index 641def01a3..1daf936b53 100644 --- a/keyboards/tada68/keyboard.json +++ b/keyboards/tada68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TADA68", "manufacturer": "TADA", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5441", diff --git a/keyboards/takashicompany/baumkuchen/keyboard.json b/keyboards/takashicompany/baumkuchen/keyboard.json index 2c8b77851b..2cb3566703 100644 --- a/keyboards/takashicompany/baumkuchen/keyboard.json +++ b/keyboards/takashicompany/baumkuchen/keyboard.json @@ -45,7 +45,6 @@ "ws2812": { "pin": "D3" }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0045", diff --git a/keyboards/takashicompany/center_enter/keyboard.json b/keyboards/takashicompany/center_enter/keyboard.json index b8188bd718..7d660eaca8 100644 --- a/keyboards/takashicompany/center_enter/keyboard.json +++ b/keyboards/takashicompany/center_enter/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Center x Enter", "manufacturer": "takashicompany", - "url": "", "maintainer": "takashicompany", "usb": { "vid": "0x7463", diff --git a/keyboards/takashicompany/ejectix/keyboard.json b/keyboards/takashicompany/ejectix/keyboard.json index 560c253326..4767be03a6 100644 --- a/keyboards/takashicompany/ejectix/keyboard.json +++ b/keyboards/takashicompany/ejectix/keyboard.json @@ -36,7 +36,6 @@ "led_count": 11, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0049", diff --git a/keyboards/takashicompany/ergomirage/keyboard.json b/keyboards/takashicompany/ergomirage/keyboard.json index 1e34505b01..9bcff45e76 100644 --- a/keyboards/takashicompany/ergomirage/keyboard.json +++ b/keyboards/takashicompany/ergomirage/keyboard.json @@ -16,7 +16,6 @@ "cols": ["D4", "C6", "D7", "E6", "B4", "B5"], "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0044", diff --git a/keyboards/takashicompany/jourkey/keyboard.json b/keyboards/takashicompany/jourkey/keyboard.json index 01847cfa53..4201969219 100644 --- a/keyboards/takashicompany/jourkey/keyboard.json +++ b/keyboards/takashicompany/jourkey/keyboard.json @@ -23,7 +23,6 @@ ["D4", "C6", "D7", "E6", "B4", "F5", "F6", "F7", "B5", "B1", "B3", "B2", "B6"] ] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0062", diff --git a/keyboards/takashicompany/klec_01/keyboard.json b/keyboards/takashicompany/klec_01/keyboard.json index 36baa8bf60..b04f43ed1f 100644 --- a/keyboards/takashicompany/klec_01/keyboard.json +++ b/keyboards/takashicompany/klec_01/keyboard.json @@ -16,7 +16,6 @@ "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"], "rows": ["D4", "C6", "D7", "E6", "B4", "B5"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x1001", diff --git a/keyboards/takashicompany/klec_02/keyboard.json b/keyboards/takashicompany/klec_02/keyboard.json index 045c4ef315..22cea40ec7 100644 --- a/keyboards/takashicompany/klec_02/keyboard.json +++ b/keyboards/takashicompany/klec_02/keyboard.json @@ -22,7 +22,6 @@ "pin": "D2" } }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x1002", diff --git a/keyboards/takashicompany/minidivide/keyboard.json b/keyboards/takashicompany/minidivide/keyboard.json index d258baa694..5ac4dd7e9b 100644 --- a/keyboards/takashicompany/minidivide/keyboard.json +++ b/keyboards/takashicompany/minidivide/keyboard.json @@ -50,7 +50,6 @@ "pin": "D2" } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0037", diff --git a/keyboards/takashicompany/minidivide_max/keyboard.json b/keyboards/takashicompany/minidivide_max/keyboard.json index 54f9dbaf78..73f941c896 100644 --- a/keyboards/takashicompany/minidivide_max/keyboard.json +++ b/keyboards/takashicompany/minidivide_max/keyboard.json @@ -49,7 +49,6 @@ "pin": "D2" } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0054", diff --git a/keyboards/takashicompany/palmslave/keyboard.json b/keyboards/takashicompany/palmslave/keyboard.json index 03d3f3e849..4b452d678a 100644 --- a/keyboards/takashicompany/palmslave/keyboard.json +++ b/keyboards/takashicompany/palmslave/keyboard.json @@ -31,7 +31,6 @@ "pin": "D2" } }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0063", diff --git a/keyboards/takashicompany/tightwriter/keyboard.json b/keyboards/takashicompany/tightwriter/keyboard.json index 201e3f6ed5..c3684d9cf6 100644 --- a/keyboards/takashicompany/tightwriter/keyboard.json +++ b/keyboards/takashicompany/tightwriter/keyboard.json @@ -17,7 +17,6 @@ "cols": ["D4", "C6", "D7", "E6", "B4", "B5"], "rows": ["F6", "F7", "B1", "B3", "B2", "B6"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0025", diff --git a/keyboards/takashiski/otaku_split/rev0/keyboard.json b/keyboards/takashiski/otaku_split/rev0/keyboard.json index 193254aa1a..911d883eb3 100644 --- a/keyboards/takashiski/otaku_split/rev0/keyboard.json +++ b/keyboards/takashiski/otaku_split/rev0/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "otaku split rev.0", "manufacturer": "takashiski", - "url": "", "maintainer": "takashiski", "usb": { "vid": "0xFEED", diff --git a/keyboards/taleguers/taleguers75/keyboard.json b/keyboards/taleguers/taleguers75/keyboard.json index 8c3a1565e2..0798ea9637 100644 --- a/keyboards/taleguers/taleguers75/keyboard.json +++ b/keyboards/taleguers/taleguers75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Taleguers75", "manufacturer": "Taleguers", - "url": "", "maintainer": "borlopjim", "usb": { "vid": "0x8476", diff --git a/keyboards/tanuki/keyboard.json b/keyboards/tanuki/keyboard.json index 0c4045e320..2bc01addb6 100644 --- a/keyboards/tanuki/keyboard.json +++ b/keyboards/tanuki/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tanuki", "manufacturer": "Seth", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/technika/keyboard.json b/keyboards/technika/keyboard.json index a6f3c2bd01..fc894fefb5 100644 --- a/keyboards/technika/keyboard.json +++ b/keyboards/technika/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Technika", "manufacturer": "TealTechnik", - "url": "", "maintainer": "Gondolindrim", "usb": { "vid": "0x8484", diff --git a/keyboards/telophase/keyboard.json b/keyboards/telophase/keyboard.json index 8efbae5519..d3a86ebcbf 100644 --- a/keyboards/telophase/keyboard.json +++ b/keyboards/telophase/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Telophase", "manufacturer": "Unknown", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/terrazzo/keyboard.json b/keyboards/terrazzo/keyboard.json index fb8bc6b483..d2ea20b51a 100644 --- a/keyboards/terrazzo/keyboard.json +++ b/keyboards/terrazzo/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Terrazzo", "manufacturer": "MsMustard", - "url": "", "maintainer": "MsMustard", "usb": { "vid": "0x4D4D", diff --git a/keyboards/tetris/keyboard.json b/keyboards/tetris/keyboard.json index 57cfd42c70..3702172518 100644 --- a/keyboards/tetris/keyboard.json +++ b/keyboards/tetris/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tetris", "manufacturer": "Fengz", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/tg4x/keyboard.json b/keyboards/tg4x/keyboard.json index ae4cd53a28..31c16ee08d 100644 --- a/keyboards/tg4x/keyboard.json +++ b/keyboards/tg4x/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TG4x", "manufacturer": "MythosMann", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x4D4D", diff --git a/keyboards/tg67/keyboard.json b/keyboards/tg67/keyboard.json index 8c860e5996..308f16cc99 100644 --- a/keyboards/tg67/keyboard.json +++ b/keyboards/tg67/keyboard.json @@ -33,7 +33,6 @@ "led_count": 69, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x6667", diff --git a/keyboards/tgr/910/keyboard.json b/keyboards/tgr/910/keyboard.json index 072eb07ea1..7277c89b38 100644 --- a/keyboards/tgr/910/keyboard.json +++ b/keyboards/tgr/910/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TGR-910", "manufacturer": "Quadcube", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5447", diff --git a/keyboards/tgr/910ce/keyboard.json b/keyboards/tgr/910ce/keyboard.json index 4d70a5b5db..088eed218b 100644 --- a/keyboards/tgr/910ce/keyboard.json +++ b/keyboards/tgr/910ce/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "910CE", "manufacturer": "TGR", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5447", diff --git a/keyboards/tgr/alice/keyboard.json b/keyboards/tgr/alice/keyboard.json index d78185106b..83902990d1 100644 --- a/keyboards/tgr/alice/keyboard.json +++ b/keyboards/tgr/alice/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alice", "manufacturer": "TGR", - "url": "", "maintainer": "Felipe Coury", "usb": { "vid": "0x20A0", diff --git a/keyboards/tgr/jane/v2/keyboard.json b/keyboards/tgr/jane/v2/keyboard.json index dc36757eb5..efa3a88b3f 100644 --- a/keyboards/tgr/jane/v2/keyboard.json +++ b/keyboards/tgr/jane/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jane v2", "manufacturer": "TGR", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5447", diff --git a/keyboards/tgr/jane/v2ce/keyboard.json b/keyboards/tgr/jane/v2ce/keyboard.json index 107e2dee9e..62f6a37857 100644 --- a/keyboards/tgr/jane/v2ce/keyboard.json +++ b/keyboards/tgr/jane/v2ce/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Jane v2 CE", "manufacturer": "TGR", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5447", diff --git a/keyboards/tgr/tris/keyboard.json b/keyboards/tgr/tris/keyboard.json index 7776c7b2c9..5ce2fbe568 100644 --- a/keyboards/tgr/tris/keyboard.json +++ b/keyboards/tgr/tris/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Tris", "manufacturer": "TGR", - "url": "", "maintainer": "halfenergized", "usb": { "vid": "0x5447", diff --git a/keyboards/the_royal/liminal/keyboard.json b/keyboards/the_royal/liminal/keyboard.json index 0a5bd361e7..66a61eceea 100644 --- a/keyboards/the_royal/liminal/keyboard.json +++ b/keyboards/the_royal/liminal/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Liminal", "manufacturer": "TheRoyalSweatshirt", - "url": "", "maintainer": "TheRoyalSweatshirt", "usb": { "vid": "0x4B4B", diff --git a/keyboards/thevankeyboards/bananasplit/keyboard.json b/keyboards/thevankeyboards/bananasplit/keyboard.json index 1fb7fc5054..b8845f165c 100644 --- a/keyboards/thevankeyboards/bananasplit/keyboard.json +++ b/keyboards/thevankeyboards/bananasplit/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BananaSplit 60", "manufacturer": "TheVan Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEAE", diff --git a/keyboards/thevankeyboards/caravan/keyboard.json b/keyboards/thevankeyboards/caravan/keyboard.json index a5c00abf4e..5dce31e1ea 100644 --- a/keyboards/thevankeyboards/caravan/keyboard.json +++ b/keyboards/thevankeyboards/caravan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Caravan", "manufacturer": "TheVan Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEAE", diff --git a/keyboards/thevankeyboards/jetvan/keyboard.json b/keyboards/thevankeyboards/jetvan/keyboard.json index a5a9b96ac8..e8a8605bf6 100644 --- a/keyboards/thevankeyboards/jetvan/keyboard.json +++ b/keyboards/thevankeyboards/jetvan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "JetVan", "manufacturer": "evangs", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEAE", diff --git a/keyboards/thevankeyboards/minivan/keyboard.json b/keyboards/thevankeyboards/minivan/keyboard.json index 53b3e0d89c..554cbe0154 100644 --- a/keyboards/thevankeyboards/minivan/keyboard.json +++ b/keyboards/thevankeyboards/minivan/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Minivan", "manufacturer": "Evan Sailer", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEAE", diff --git a/keyboards/thevankeyboards/roadkit/keyboard.json b/keyboards/thevankeyboards/roadkit/keyboard.json index e3c282bffe..a5ad593cc2 100644 --- a/keyboards/thevankeyboards/roadkit/keyboard.json +++ b/keyboards/thevankeyboards/roadkit/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Roadkit Micro", "manufacturer": "TheVan Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEAE", diff --git a/keyboards/tkc/california/keyboard.json b/keyboards/tkc/california/keyboard.json index 465544bc03..5052b48f92 100644 --- a/keyboards/tkc/california/keyboard.json +++ b/keyboards/tkc/california/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "California", "manufacturer": "TKC", - "url": "", "maintainer": "TerryMathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/candybar/lefty/keyboard.json b/keyboards/tkc/candybar/lefty/keyboard.json index fe8814e54b..988338a095 100644 --- a/keyboards/tkc/candybar/lefty/keyboard.json +++ b/keyboards/tkc/candybar/lefty/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Candybar", "manufacturer": "The Key Company", - "url": "", "maintainer": "terrymathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/candybar/lefty_r3/keyboard.json b/keyboards/tkc/candybar/lefty_r3/keyboard.json index b09412ffc9..22ddc2f125 100644 --- a/keyboards/tkc/candybar/lefty_r3/keyboard.json +++ b/keyboards/tkc/candybar/lefty_r3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Candybar", "manufacturer": "The Key Company", - "url": "", "maintainer": "terrymathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/candybar/righty/keyboard.json b/keyboards/tkc/candybar/righty/keyboard.json index f529ac936f..1f10532a78 100644 --- a/keyboards/tkc/candybar/righty/keyboard.json +++ b/keyboards/tkc/candybar/righty/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Candybar", "manufacturer": "The Key Company", - "url": "", "maintainer": "terrymathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/candybar/righty_r3/keyboard.json b/keyboards/tkc/candybar/righty_r3/keyboard.json index 8064672583..81da5f1e20 100644 --- a/keyboards/tkc/candybar/righty_r3/keyboard.json +++ b/keyboards/tkc/candybar/righty_r3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Candybar", "manufacturer": "The Key Company", - "url": "", "maintainer": "terrymathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/godspeed75/keyboard.json b/keyboards/tkc/godspeed75/keyboard.json index 48cf06f3ca..b078a09efd 100644 --- a/keyboards/tkc/godspeed75/keyboard.json +++ b/keyboards/tkc/godspeed75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "GodSpeed75", "manufacturer": "The Key Company", - "url": "", "maintainer": "terrymathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/m0lly/keyboard.json b/keyboards/tkc/m0lly/keyboard.json index ae76f1e6d9..fda904c4f4 100644 --- a/keyboards/tkc/m0lly/keyboard.json +++ b/keyboards/tkc/m0lly/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "M0lly", "manufacturer": "The Key Company", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/osav2/keyboard.json b/keyboards/tkc/osav2/keyboard.json index ef4c789797..8e9c685b49 100644 --- a/keyboards/tkc/osav2/keyboard.json +++ b/keyboards/tkc/osav2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "OSA v2", "manufacturer": "The Key Company", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/portico/keyboard.json b/keyboards/tkc/portico/keyboard.json index 29b7d8246b..49efe0a942 100644 --- a/keyboards/tkc/portico/keyboard.json +++ b/keyboards/tkc/portico/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Portico", "manufacturer": "TKC", - "url": "", "maintainer": "TerryMathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/portico68v2/keyboard.json b/keyboards/tkc/portico68v2/keyboard.json index 914dee8760..5b9e5e3324 100644 --- a/keyboards/tkc/portico68v2/keyboard.json +++ b/keyboards/tkc/portico68v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Portico68 v2", "manufacturer": "TKC", - "url": "", "maintainer": "TerryMathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/portico75/keyboard.json b/keyboards/tkc/portico75/keyboard.json index 4228f20145..1e84f25ebe 100644 --- a/keyboards/tkc/portico75/keyboard.json +++ b/keyboards/tkc/portico75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Portico75", "manufacturer": "TKC", - "url": "", "maintainer": "TerryMathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/tkc1800/keyboard.json b/keyboards/tkc/tkc1800/keyboard.json index 2965c61d83..1b98e8e090 100644 --- a/keyboards/tkc/tkc1800/keyboard.json +++ b/keyboards/tkc/tkc1800/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TKC1800", "manufacturer": "The Key Company", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x544B", diff --git a/keyboards/tkc/tkl_ab87/keyboard.json b/keyboards/tkc/tkl_ab87/keyboard.json index c3d14bd8cf..c8f9631827 100644 --- a/keyboards/tkc/tkl_ab87/keyboard.json +++ b/keyboards/tkc/tkl_ab87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TKL A/B87", "manufacturer": "TKC", - "url": "", "maintainer": "TerryMathews", "usb": { "vid": "0x544B", diff --git a/keyboards/tmo50/keyboard.json b/keyboards/tmo50/keyboard.json index dbb79802ca..5398595d56 100644 --- a/keyboards/tmo50/keyboard.json +++ b/keyboards/tmo50/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TMO50", "manufacturer": "funderburker", - "url": "", "maintainer": "funderburker", "usb": { "vid": "0xFBFB", diff --git a/keyboards/toad/keyboard.json b/keyboards/toad/keyboard.json index 073fa6411c..52b7c26387 100644 --- a/keyboards/toad/keyboard.json +++ b/keyboards/toad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Toad", "manufacturer": "farmakon", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/toffee_studio/blueberry/keyboard.json b/keyboards/toffee_studio/blueberry/keyboard.json index 99a87b0a95..1b2308c3da 100644 --- a/keyboards/toffee_studio/blueberry/keyboard.json +++ b/keyboards/toffee_studio/blueberry/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Blueberry", "manufacturer": "Toffee Studio", - "url": "", "maintainer": "Toffee Studio", "usb": { "vid": "0x1067", diff --git a/keyboards/tominabox1/bigboy/keyboard.json b/keyboards/tominabox1/bigboy/keyboard.json index a25189f35e..4862e216df 100644 --- a/keyboards/tominabox1/bigboy/keyboard.json +++ b/keyboards/tominabox1/bigboy/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigBoy", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/tominabox1/le_chiffre/info.json b/keyboards/tominabox1/le_chiffre/info.json index cb4097d61d..c521928adf 100644 --- a/keyboards/tominabox1/le_chiffre/info.json +++ b/keyboards/tominabox1/le_chiffre/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Le Chiffre", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "features": { "bootmagic": true, diff --git a/keyboards/tominabox1/littlefoot_lx/rev1/keyboard.json b/keyboards/tominabox1/littlefoot_lx/rev1/keyboard.json index b021ba9c8d..9ccfb5f27b 100644 --- a/keyboards/tominabox1/littlefoot_lx/rev1/keyboard.json +++ b/keyboards/tominabox1/littlefoot_lx/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Littlefoot LX", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/tominabox1/littlefoot_lx/rev2/keyboard.json b/keyboards/tominabox1/littlefoot_lx/rev2/keyboard.json index fe1cf6e596..38d1d62345 100644 --- a/keyboards/tominabox1/littlefoot_lx/rev2/keyboard.json +++ b/keyboards/tominabox1/littlefoot_lx/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Littlefoot LX", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/tominabox1/qaz/keyboard.json b/keyboards/tominabox1/qaz/keyboard.json index 9e18f0ddf4..9e3ea95ad4 100644 --- a/keyboards/tominabox1/qaz/keyboard.json +++ b/keyboards/tominabox1/qaz/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "qaz", "manufacturer": "whydobearsexplod", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/tominabox1/underscore33/rev1/keyboard.json b/keyboards/tominabox1/underscore33/rev1/keyboard.json index 221ecccb04..d13e20a7c6 100644 --- a/keyboards/tominabox1/underscore33/rev1/keyboard.json +++ b/keyboards/tominabox1/underscore33/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "underscore33", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/tominabox1/underscore33/rev2/keyboard.json b/keyboards/tominabox1/underscore33/rev2/keyboard.json index 4375116963..d4b922e240 100644 --- a/keyboards/tominabox1/underscore33/rev2/keyboard.json +++ b/keyboards/tominabox1/underscore33/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "underscore33", "manufacturer": "tominabox1", - "url": "", "maintainer": "tominabox1", "usb": { "vid": "0x7431", diff --git a/keyboards/touchpad/keyboard.json b/keyboards/touchpad/keyboard.json index 5429b5844d..0d2b450782 100644 --- a/keyboards/touchpad/keyboard.json +++ b/keyboards/touchpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TouchPad", "manufacturer": "JacoBurge", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x16D0", diff --git a/keyboards/tr60w/keyboard.json b/keyboards/tr60w/keyboard.json index ef483ed2e2..dcfc8f48d6 100644 --- a/keyboards/tr60w/keyboard.json +++ b/keyboards/tr60w/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TR60W", "manufacturer": "Triangle Lab", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/trainpad/keyboard.json b/keyboards/trainpad/keyboard.json index e7e74b0e91..346fd54027 100644 --- a/keyboards/trainpad/keyboard.json +++ b/keyboards/trainpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "TrainPad", "manufacturer": "Ananya Kirti", - "url": "", "maintainer": "AnanyaKirti", "usb": { "vid": "0x416B", diff --git a/keyboards/treasure/type9/keyboard.json b/keyboards/treasure/type9/keyboard.json index 0c1ee1987a..ab7599730f 100644 --- a/keyboards/treasure/type9/keyboard.json +++ b/keyboards/treasure/type9/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Type-9", "manufacturer": "Treasure", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/treasure/type9s3/keyboard.json b/keyboards/treasure/type9s3/keyboard.json index cb2bcf3a7a..350746e00c 100644 --- a/keyboards/treasure/type9s3/keyboard.json +++ b/keyboards/treasure/type9s3/keyboard.json @@ -21,7 +21,6 @@ ] }, "processor": "atmega32u2", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x5493", diff --git a/keyboards/trnthsn/e8ghty/info.json b/keyboards/trnthsn/e8ghty/info.json index ec4e724878..bce77e0a5f 100644 --- a/keyboards/trnthsn/e8ghty/info.json +++ b/keyboards/trnthsn/e8ghty/info.json @@ -37,7 +37,6 @@ "indicators": { "caps_lock": "B4" }, - "url": "", "usb": { "vid": "0x5453", "pid": "0x3830", diff --git a/keyboards/trnthsn/e8ghtyneo/info.json b/keyboards/trnthsn/e8ghtyneo/info.json index fef6259d24..eb1244c9cb 100644 --- a/keyboards/trnthsn/e8ghtyneo/info.json +++ b/keyboards/trnthsn/e8ghtyneo/info.json @@ -40,7 +40,6 @@ "indicators": { "caps_lock": "B3" }, - "url": "", "usb": { "vid": "0x5453", "pid": "0x3845", diff --git a/keyboards/trnthsn/s6xty/keyboard.json b/keyboards/trnthsn/s6xty/keyboard.json index 3ec2f87f3d..ef1f5113bf 100644 --- a/keyboards/trnthsn/s6xty/keyboard.json +++ b/keyboards/trnthsn/s6xty/keyboard.json @@ -35,7 +35,6 @@ "led_count": 22, "sleep": true }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x5336", diff --git a/keyboards/trnthsn/s6xty5neor2/info.json b/keyboards/trnthsn/s6xty5neor2/info.json index ba20dbc2ba..47f09623cc 100644 --- a/keyboards/trnthsn/s6xty5neor2/info.json +++ b/keyboards/trnthsn/s6xty5neor2/info.json @@ -18,7 +18,6 @@ "indicators": { "caps_lock": "C13" }, - "url": "", "usb": { "vid": "0x5453", "pid": "0x4E45", diff --git a/keyboards/ubest/vn/keyboard.json b/keyboards/ubest/vn/keyboard.json index c50ceebbba..477c16fb96 100644 --- a/keyboards/ubest/vn/keyboard.json +++ b/keyboards/ubest/vn/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "vn", "manufacturer": "ubest", - "url": "", "maintainer": "mfkiiyd", "usb": { "vid": "0x6D66", diff --git a/keyboards/uk78/keyboard.json b/keyboards/uk78/keyboard.json index 673497ca9c..ea1e030b2c 100644 --- a/keyboards/uk78/keyboard.json +++ b/keyboards/uk78/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UK78", "manufacturer": "UK Keyboards", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x554B", diff --git a/keyboards/unikeyboard/diverge3/keyboard.json b/keyboards/unikeyboard/diverge3/keyboard.json index 767f44b198..e50bdfa129 100644 --- a/keyboards/unikeyboard/diverge3/keyboard.json +++ b/keyboards/unikeyboard/diverge3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Diverge3", "manufacturer": "UniKeyboard", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/unikeyboard/divergetm2/keyboard.json b/keyboards/unikeyboard/divergetm2/keyboard.json index 09d481149c..8a7b5bb2df 100644 --- a/keyboards/unikeyboard/divergetm2/keyboard.json +++ b/keyboards/unikeyboard/divergetm2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Diverge TM 2", "manufacturer": "UniKeyboard", - "url": "", "maintainer": "islandman93, xton", "usb": { "vid": "0xFEED", diff --git a/keyboards/unikeyboard/felix/keyboard.json b/keyboards/unikeyboard/felix/keyboard.json index b55138a15c..8daef4227e 100644 --- a/keyboards/unikeyboard/felix/keyboard.json +++ b/keyboards/unikeyboard/felix/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Felix", "manufacturer": "UniKeyboard", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/unikorn/keyboard.json b/keyboards/unikorn/keyboard.json index 1a3c46d691..77eaa81cbf 100644 --- a/keyboards/unikorn/keyboard.json +++ b/keyboards/unikorn/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Unikorn60", "manufacturer": "Singa x TGR", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5354", diff --git a/keyboards/uranuma/keyboard.json b/keyboards/uranuma/keyboard.json index b24ce74d9f..670823bda9 100644 --- a/keyboards/uranuma/keyboard.json +++ b/keyboards/uranuma/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UraNuma", "manufacturer": "yohewi", - "url": "", "maintainer": "yohewi", "usb": { "vid": "0xFEED", diff --git a/keyboards/utd80/keyboard.json b/keyboards/utd80/keyboard.json index 41bd35c66a..7c618e96b1 100644 --- a/keyboards/utd80/keyboard.json +++ b/keyboards/utd80/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "UTD80", "manufacturer": "UTD", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/v60_type_r/keyboard.json b/keyboards/v60_type_r/keyboard.json index eba729220a..c186167ff2 100644 --- a/keyboards/v60_type_r/keyboard.json +++ b/keyboards/v60_type_r/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "V60 Type R", "manufacturer": "KB Paradise", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7432", diff --git a/keyboards/vertex/angle65/keyboard.json b/keyboards/vertex/angle65/keyboard.json index ef0aacfef4..3047d82dfa 100644 --- a/keyboards/vertex/angle65/keyboard.json +++ b/keyboards/vertex/angle65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ANGLE65", "manufacturer": "vertex", - "url": "", "maintainer": "EasonQian1, Vertex-kb", "usb": { "vid": "0x9954", diff --git a/keyboards/vertex/arc60/keyboard.json b/keyboards/vertex/arc60/keyboard.json index ab98c446f0..7bca331f44 100644 --- a/keyboards/vertex/arc60/keyboard.json +++ b/keyboards/vertex/arc60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ARC60", "manufacturer": "vertex", - "url": "", "maintainer": "EasonQian1, Vertex-kb", "usb": { "vid": "0x8354", diff --git a/keyboards/vertex/arc60h/keyboard.json b/keyboards/vertex/arc60h/keyboard.json index e6fed06bc1..684bbb9538 100644 --- a/keyboards/vertex/arc60h/keyboard.json +++ b/keyboards/vertex/arc60h/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "ARC60H", "manufacturer": "vertex", - "url": "", "maintainer": "EasonQian1, Vertex-kb", "usb": { "vid": "0x7374", diff --git a/keyboards/vertex/cycle8/keyboard.json b/keyboards/vertex/cycle8/keyboard.json index 100c2d21f1..6531e0f6fa 100644 --- a/keyboards/vertex/cycle8/keyboard.json +++ b/keyboards/vertex/cycle8/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Cycle8", "manufacturer": "vertex", - "url": "", "maintainer": "Eason", "usb": { "vid": "0x8A94", diff --git a/keyboards/viktus/omnikey_bh/keyboard.json b/keyboards/viktus/omnikey_bh/keyboard.json index 3356bf1eb2..af2b596bf8 100644 --- a/keyboards/viktus/omnikey_bh/keyboard.json +++ b/keyboards/viktus/omnikey_bh/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Omnikey Blackheart", "manufacturer": "blindassassin111", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/viktus/smolka/keyboard.json b/keyboards/viktus/smolka/keyboard.json index e2cd55a405..a5f5735e09 100644 --- a/keyboards/viktus/smolka/keyboard.json +++ b/keyboards/viktus/smolka/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Smolka", "manufacturer": "Viktus Design LLC", - "url": "", "maintainer": "jrfhoutx", "usb": { "vid": "0x5644", diff --git a/keyboards/viktus/sp_mini/keyboard.json b/keyboards/viktus/sp_mini/keyboard.json index 25aa4c9494..6b9627b462 100644 --- a/keyboards/viktus/sp_mini/keyboard.json +++ b/keyboards/viktus/sp_mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SP_Mini", "manufacturer": "Viktus Design LLC", - "url": "", "maintainer": "jrfhoutx", "usb": { "vid": "0x5644", diff --git a/keyboards/viktus/vkr94/keyboard.json b/keyboards/viktus/vkr94/keyboard.json index 31fd8ee1c7..a3f4ff35a2 100644 --- a/keyboards/viktus/vkr94/keyboard.json +++ b/keyboards/viktus/vkr94/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "VKR 94", "manufacturer": "Viktus Design", - "url": "", "maintainer": "BlindAssassin111", "usb": { "vid": "0x5644", diff --git a/keyboards/viktus/z150_bh/keyboard.json b/keyboards/viktus/z150_bh/keyboard.json index 27754da543..bbd7c1c1c3 100644 --- a/keyboards/viktus/z150_bh/keyboard.json +++ b/keyboards/viktus/z150_bh/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Z-150 Blackheart", "manufacturer": "blindassassin111", - "url": "", "maintainer": "qmk, blindassassin111", "usb": { "vid": "0xFEED", diff --git a/keyboards/vinhcatba/uncertainty/keyboard.json b/keyboards/vinhcatba/uncertainty/keyboard.json index 551e30c823..004e998966 100644 --- a/keyboards/vinhcatba/uncertainty/keyboard.json +++ b/keyboards/vinhcatba/uncertainty/keyboard.json @@ -49,7 +49,6 @@ "led_count": 14, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/vitamins_included/info.json b/keyboards/vitamins_included/info.json index 60907cdba3..d293e7c940 100644 --- a/keyboards/vitamins_included/info.json +++ b/keyboards/vitamins_included/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Vitamins Included", "manufacturer": "Duckle29", - "url": "", "maintainer": "Duckle29", "build": { "lto": true diff --git a/keyboards/void/voidhhkb_hotswap/keyboard.json b/keyboards/void/voidhhkb_hotswap/keyboard.json index 460454cc5f..1e29c220dc 100644 --- a/keyboards/void/voidhhkb_hotswap/keyboard.json +++ b/keyboards/void/voidhhkb_hotswap/keyboard.json @@ -17,7 +17,6 @@ "rows": ["B11", "B10", "B2", "B1", "B0"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/waterfowl/keyboard.json b/keyboards/waterfowl/keyboard.json index 73f62a77eb..9e08da57c0 100644 --- a/keyboards/waterfowl/keyboard.json +++ b/keyboards/waterfowl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Waterfowl", "manufacturer": "CyanDuck", - "url": "", "maintainer": "JW2586", "usb": { "vid": "0xFEED", diff --git a/keyboards/wavtype/foundation/keyboard.json b/keyboards/wavtype/foundation/keyboard.json index 4b1dd1d348..d8e9782f7e 100644 --- a/keyboards/wavtype/foundation/keyboard.json +++ b/keyboards/wavtype/foundation/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "foundation", "manufacturer": "protozoa.studio", - "url": "", "maintainer": "wavtype", "usb": { "vid": "0x03A7", diff --git a/keyboards/wavtype/p01_ultra/keyboard.json b/keyboards/wavtype/p01_ultra/keyboard.json index c44f0bd3bd..73633ee460 100644 --- a/keyboards/wavtype/p01_ultra/keyboard.json +++ b/keyboards/wavtype/p01_ultra/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "p01_ultra", "manufacturer": "wavtype", - "url": "", "maintainer": "wavtype", "usb": { "vid": "0x03A7", diff --git a/keyboards/weirdo/geminate60/keyboard.json b/keyboards/weirdo/geminate60/keyboard.json index 12bc42b30d..336f25fdc8 100644 --- a/keyboards/weirdo/geminate60/keyboard.json +++ b/keyboards/weirdo/geminate60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Geminate60", "manufacturer": "Weirdo", - "url": "", "maintainer": "Weirdo-F", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/kelowna/rgb64/keyboard.json b/keyboards/weirdo/kelowna/rgb64/keyboard.json index 4822f979fe..d4d3294f50 100644 --- a/keyboards/weirdo/kelowna/rgb64/keyboard.json +++ b/keyboards/weirdo/kelowna/rgb64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kelownaRGB64", "manufacturer": "Weirdo", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/ls_60/keyboard.json b/keyboards/weirdo/ls_60/keyboard.json index 7ab1f2f6cb..3325dc057d 100644 --- a/keyboards/weirdo/ls_60/keyboard.json +++ b/keyboards/weirdo/ls_60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LS_60", "manufacturer": "Weirdo", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/naiping/np64/keyboard.json b/keyboards/weirdo/naiping/np64/keyboard.json index f620fb1169..f7cdff55b5 100644 --- a/keyboards/weirdo/naiping/np64/keyboard.json +++ b/keyboards/weirdo/naiping/np64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NP64", "manufacturer": "Weirdo", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/naiping/nphhkb/keyboard.json b/keyboards/weirdo/naiping/nphhkb/keyboard.json index cc791374b4..ed5485d9de 100644 --- a/keyboards/weirdo/naiping/nphhkb/keyboard.json +++ b/keyboards/weirdo/naiping/nphhkb/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NPhhkb", "manufacturer": "Weirdo", - "url": "", "maintainer": "weirdo-f", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/naiping/npminila/keyboard.json b/keyboards/weirdo/naiping/npminila/keyboard.json index b4048a52cf..e5ed93e193 100644 --- a/keyboards/weirdo/naiping/npminila/keyboard.json +++ b/keyboards/weirdo/naiping/npminila/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NPminila", "manufacturer": "Weirdo", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7764", diff --git a/keyboards/weirdo/tiger910/keyboard.json b/keyboards/weirdo/tiger910/keyboard.json index ca24561ebd..34bd01970a 100644 --- a/keyboards/weirdo/tiger910/keyboard.json +++ b/keyboards/weirdo/tiger910/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "tiger910", "manufacturer": "Weirdo", - "url": "", "maintainer": "Weirdo", "usb": { "vid": "0x7764", diff --git a/keyboards/wekey/polaris/keyboard.json b/keyboards/wekey/polaris/keyboard.json index c3fe12f144..4fd5b5f46d 100644 --- a/keyboards/wekey/polaris/keyboard.json +++ b/keyboards/wekey/polaris/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Polaris", "manufacturer": "@wekey", - "url": "", "maintainer": "@wekey.dev", "usb": { "vid": "0x5559", diff --git a/keyboards/wekey/we27/keyboard.json b/keyboards/wekey/we27/keyboard.json index d8cb7b0f80..91731cdc39 100644 --- a/keyboards/wekey/we27/keyboard.json +++ b/keyboards/wekey/we27/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "We27", "manufacturer": "@wekey", - "url": "", "maintainer": "@wekey.dev", "usb": { "vid": "0x5559", diff --git a/keyboards/westfoxtrot/aanzee/keyboard.json b/keyboards/westfoxtrot/aanzee/keyboard.json index 3a15014c4e..303ead3367 100644 --- a/keyboards/westfoxtrot/aanzee/keyboard.json +++ b/keyboards/westfoxtrot/aanzee/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "aanzee", "manufacturer": "westfoxtrot", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x21FF", diff --git a/keyboards/westfoxtrot/cyclops/keyboard.json b/keyboards/westfoxtrot/cyclops/keyboard.json index a74926511d..bf08026551 100644 --- a/keyboards/westfoxtrot/cyclops/keyboard.json +++ b/keyboards/westfoxtrot/cyclops/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "cyclops", "manufacturer": "westfoxtrot", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x21FF", diff --git a/keyboards/westfoxtrot/prophet/keyboard.json b/keyboards/westfoxtrot/prophet/keyboard.json index b431adddae..50a7583736 100644 --- a/keyboards/westfoxtrot/prophet/keyboard.json +++ b/keyboards/westfoxtrot/prophet/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "prophet", "manufacturer": "westfoxtrot", - "url": "", "maintainer": "westfoxtrot", "usb": { "vid": "0xFF21", diff --git a/keyboards/windstudio/wind_x/r1/keyboard.json b/keyboards/windstudio/wind_x/r1/keyboard.json index 1b5f34fe3e..44202e9685 100644 --- a/keyboards/windstudio/wind_x/r1/keyboard.json +++ b/keyboards/windstudio/wind_x/r1/keyboard.json @@ -15,7 +15,6 @@ "rows": ["F0", "F1", "D2", "D1", "D0"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x6801", diff --git a/keyboards/winkeyless/b87/keyboard.json b/keyboards/winkeyless/b87/keyboard.json index a941445d72..5977058d44 100644 --- a/keyboards/winkeyless/b87/keyboard.json +++ b/keyboards/winkeyless/b87/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "B87", "manufacturer": "Winkeyless", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/winkeyless/bface/keyboard.json b/keyboards/winkeyless/bface/keyboard.json index cc5194ef34..d6599722c9 100644 --- a/keyboards/winkeyless/bface/keyboard.json +++ b/keyboards/winkeyless/bface/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "B.face", "manufacturer": "Winkeyless", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/winkeyless/bmini/keyboard.json b/keyboards/winkeyless/bmini/keyboard.json index 6fdaf62182..f5bf8d40cf 100644 --- a/keyboards/winkeyless/bmini/keyboard.json +++ b/keyboards/winkeyless/bmini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "B.mini", "manufacturer": "Winkeyless", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/winry/winry25tc/keyboard.json b/keyboards/winry/winry25tc/keyboard.json index 9a83aded2c..2f9f88ea4a 100644 --- a/keyboards/winry/winry25tc/keyboard.json +++ b/keyboards/winry/winry25tc/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Winry 25tc", "manufacturer": "SpiderIsland", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/winry/winry315/keyboard.json b/keyboards/winry/winry315/keyboard.json index 81971b339f..3f57dbe802 100644 --- a/keyboards/winry/winry315/keyboard.json +++ b/keyboards/winry/winry315/keyboard.json @@ -2,7 +2,6 @@ "manufacturer": "Winry", "keyboard_name": "Winry315", "maintainer": "sigprof", - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x0315", diff --git a/keyboards/wolf/kuku65/keyboard.json b/keyboards/wolf/kuku65/keyboard.json index 5146d77d1b..93321a2e0b 100644 --- a/keyboards/wolf/kuku65/keyboard.json +++ b/keyboards/wolf/kuku65/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "kuku65", "manufacturer": "ToastyStoemp", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x5453", diff --git a/keyboards/wolf/m60_b/keyboard.json b/keyboards/wolf/m60_b/keyboard.json index 474974d383..ba25ebaa92 100644 --- a/keyboards/wolf/m60_b/keyboard.json +++ b/keyboards/wolf/m60_b/keyboard.json @@ -134,7 +134,6 @@ "max_brightness": 120, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0059", diff --git a/keyboards/wolf/m6_c/keyboard.json b/keyboards/wolf/m6_c/keyboard.json index f6f2416902..8c1d361f8c 100644 --- a/keyboards/wolf/m6_c/keyboard.json +++ b/keyboards/wolf/m6_c/keyboard.json @@ -82,7 +82,6 @@ ], "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0060", diff --git a/keyboards/wolf/neely65/keyboard.json b/keyboards/wolf/neely65/keyboard.json index 9a90105b96..5e55bf7bfc 100644 --- a/keyboards/wolf/neely65/keyboard.json +++ b/keyboards/wolf/neely65/keyboard.json @@ -17,7 +17,6 @@ "rows": ["D5", "D3", "D2", "D1", "D0"] }, "processor": "atmega32u4", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0071", diff --git a/keyboards/wolf/ryujin/keyboard.json b/keyboards/wolf/ryujin/keyboard.json index 8e72cccd9e..f34cebb4f6 100644 --- a/keyboards/wolf/ryujin/keyboard.json +++ b/keyboards/wolf/ryujin/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ryujin", "manufacturer": "Miroticaps", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x5453", diff --git a/keyboards/wolf/sabre/keyboard.json b/keyboards/wolf/sabre/keyboard.json index 11b235efe7..02c298a59e 100644 --- a/keyboards/wolf/sabre/keyboard.json +++ b/keyboards/wolf/sabre/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Sabre", "manufacturer": "ToastyStoemp", - "url": "", "maintainer": "ToastyStoemp", "usb": { "vid": "0x5453", diff --git a/keyboards/wolf/silhouette/keyboard.json b/keyboards/wolf/silhouette/keyboard.json index 548a89aa19..83c2d03999 100644 --- a/keyboards/wolf/silhouette/keyboard.json +++ b/keyboards/wolf/silhouette/keyboard.json @@ -20,7 +20,6 @@ "rows": ["GP27", "GP26", "GP25", "GP13", "GP3"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0080", diff --git a/keyboards/wolf/twilight/keyboard.json b/keyboards/wolf/twilight/keyboard.json index ed426e85d9..8a90b3656e 100644 --- a/keyboards/wolf/twilight/keyboard.json +++ b/keyboards/wolf/twilight/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP28", "GP27", "GP26", "GP25", "GP13", "GP3"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0077", diff --git a/keyboards/wolf/ziggurat/keyboard.json b/keyboards/wolf/ziggurat/keyboard.json index bb12d5ab2f..32627b479f 100644 --- a/keyboards/wolf/ziggurat/keyboard.json +++ b/keyboards/wolf/ziggurat/keyboard.json @@ -17,7 +17,6 @@ "rows": ["GP11", "GP10", "GP7", "GP6", "GP23", "GP24", "GP25", "GP26", "GP19", "GP18"] }, "processor": "RP2040", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0084", diff --git a/keyboards/wolfmarkclub/wm1/keyboard.json b/keyboards/wolfmarkclub/wm1/keyboard.json index 0cea5546c8..6b0c896266 100644 --- a/keyboards/wolfmarkclub/wm1/keyboard.json +++ b/keyboards/wolfmarkclub/wm1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "WM1", "manufacturer": "Wolfmark Club", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/bigseries/1key/keyboard.json b/keyboards/woodkeys/bigseries/1key/keyboard.json index 2440b1974b..c3f545e53c 100644 --- a/keyboards/woodkeys/bigseries/1key/keyboard.json +++ b/keyboards/woodkeys/bigseries/1key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigSeries 1-Key", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/bigseries/2key/keyboard.json b/keyboards/woodkeys/bigseries/2key/keyboard.json index 9c8c34914a..bb4ac4db64 100644 --- a/keyboards/woodkeys/bigseries/2key/keyboard.json +++ b/keyboards/woodkeys/bigseries/2key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigSeries 2-Key", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/bigseries/3key/keyboard.json b/keyboards/woodkeys/bigseries/3key/keyboard.json index 17870d98ad..35f94cb27f 100644 --- a/keyboards/woodkeys/bigseries/3key/keyboard.json +++ b/keyboards/woodkeys/bigseries/3key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigSeries 3-Key", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/bigseries/4key/keyboard.json b/keyboards/woodkeys/bigseries/4key/keyboard.json index 1e44fc2375..5637e1ab5a 100644 --- a/keyboards/woodkeys/bigseries/4key/keyboard.json +++ b/keyboards/woodkeys/bigseries/4key/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "BigSeries 4-Key", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/meira/info.json b/keyboards/woodkeys/meira/info.json index 3ad2918d8e..0b73ffd7e6 100644 --- a/keyboards/woodkeys/meira/info.json +++ b/keyboards/woodkeys/meira/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Meira", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "colemarkham", "usb": { "vid": "0xFEED", diff --git a/keyboards/woodkeys/scarletbandana/keyboard.json b/keyboards/woodkeys/scarletbandana/keyboard.json index f6c4342efa..155ca508e7 100644 --- a/keyboards/woodkeys/scarletbandana/keyboard.json +++ b/keyboards/woodkeys/scarletbandana/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Scarlet Bandana Version IV Mark 2", "manufacturer": "WoodKeys.click", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/wsk/alpha9/keyboard.json b/keyboards/wsk/alpha9/keyboard.json index 41b95130c6..79c01c4c2a 100644 --- a/keyboards/wsk/alpha9/keyboard.json +++ b/keyboards/wsk/alpha9/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Alpha9", "manufacturer": "Worldspawn00", - "url": "", "maintainer": "Worldspawn00", "usb": { "vid": "0x5753", diff --git a/keyboards/wsk/g4m3ralpha/keyboard.json b/keyboards/wsk/g4m3ralpha/keyboard.json index b5cdb7ce10..d2ba034be1 100644 --- a/keyboards/wsk/g4m3ralpha/keyboard.json +++ b/keyboards/wsk/g4m3ralpha/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "G4M3Ralpha", "manufacturer": "Worldspawn00", - "url": "", "maintainer": "Worldspawn00", "usb": { "vid": "0x5753", diff --git a/keyboards/x16/keyboard.json b/keyboards/x16/keyboard.json index 4d407e5332..d8aa2468ca 100644 --- a/keyboards/x16/keyboard.json +++ b/keyboards/x16/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "x16", "manufacturer": "yinxianwei", - "url": "", "maintainer": "yinxianwei", "usb": { "vid": "0x4B50", diff --git a/keyboards/xbows/knight/keyboard.json b/keyboards/xbows/knight/keyboard.json index b675ee1946..b5adc0b946 100644 --- a/keyboards/xbows/knight/keyboard.json +++ b/keyboards/xbows/knight/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KNIGHT", "manufacturer": "X-BOWS", - "url": "", "maintainer": "xbows-qmk", "usb": { "vid": "0x5842", diff --git a/keyboards/xbows/knight_plus/keyboard.json b/keyboards/xbows/knight_plus/keyboard.json index 0d1600c614..b3c43645d9 100644 --- a/keyboards/xbows/knight_plus/keyboard.json +++ b/keyboards/xbows/knight_plus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "KNIGHT_PLUS", "manufacturer": "X-BOWS", - "url": "", "maintainer": "xbows-qmk", "usb": { "vid": "0x5842", diff --git a/keyboards/xbows/nature/keyboard.json b/keyboards/xbows/nature/keyboard.json index 6e28c9de30..7f23e781d2 100644 --- a/keyboards/xbows/nature/keyboard.json +++ b/keyboards/xbows/nature/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NATURE", "manufacturer": "X-BOWS", - "url": "", "maintainer": "xbows-qmk", "usb": { "vid": "0x5842", diff --git a/keyboards/xbows/numpad/keyboard.json b/keyboards/xbows/numpad/keyboard.json index 070cc3a288..7be91ae2a4 100644 --- a/keyboards/xbows/numpad/keyboard.json +++ b/keyboards/xbows/numpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "NUMPAD", "manufacturer": "X-BOWS", - "url": "", "maintainer": "xbows-qmk", "usb": { "vid": "0x5842", diff --git a/keyboards/xbows/ranger/keyboard.json b/keyboards/xbows/ranger/keyboard.json index 945eaafcba..c5a47413ec 100644 --- a/keyboards/xbows/ranger/keyboard.json +++ b/keyboards/xbows/ranger/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ranger", "manufacturer": "X-BOWS", - "url": "", "maintainer": "xbows-qmk", "usb": { "vid": "0x5842", diff --git a/keyboards/xbows/woody/keyboard.json b/keyboards/xbows/woody/keyboard.json index 538354507e..da403bacaf 100644 --- a/keyboards/xbows/woody/keyboard.json +++ b/keyboards/xbows/woody/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "WOO-DY", "manufacturer": "X-BOWS", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/xelus/dawn60/info.json b/keyboards/xelus/dawn60/info.json index 2c71fef898..2eca36e46c 100644 --- a/keyboards/xelus/dawn60/info.json +++ b/keyboards/xelus/dawn60/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dawn60", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/dharma/keyboard.json b/keyboards/xelus/dharma/keyboard.json index 8d6b746527..0e5fd1217b 100644 --- a/keyboards/xelus/dharma/keyboard.json +++ b/keyboards/xelus/dharma/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Dharma", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/la_plus/keyboard.json b/keyboards/xelus/la_plus/keyboard.json index 902364471f..78e16d59dc 100644 --- a/keyboards/xelus/la_plus/keyboard.json +++ b/keyboards/xelus/la_plus/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MechaMaker La+", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/ninjin/keyboard.json b/keyboards/xelus/ninjin/keyboard.json index 2e7b1640df..cf601d8a80 100644 --- a/keyboards/xelus/ninjin/keyboard.json +++ b/keyboards/xelus/ninjin/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ninjin", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/pachi/mini_32u4/keyboard.json b/keyboards/xelus/pachi/mini_32u4/keyboard.json index 590b32de6b..c3144bca15 100644 --- a/keyboards/xelus/pachi/mini_32u4/keyboard.json +++ b/keyboards/xelus/pachi/mini_32u4/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pachi Mini", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/pachi/rev1/keyboard.json b/keyboards/xelus/pachi/rev1/keyboard.json index 98b59c8641..fff3be7646 100644 --- a/keyboards/xelus/pachi/rev1/keyboard.json +++ b/keyboards/xelus/pachi/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pachi Rev 1", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/pachi/rgb/rev1/keyboard.json b/keyboards/xelus/pachi/rgb/rev1/keyboard.json index fe88e695be..a27bcae0fc 100644 --- a/keyboards/xelus/pachi/rgb/rev1/keyboard.json +++ b/keyboards/xelus/pachi/rgb/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pachi RGB Rev 1", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/pachi/rgb/rev2/keyboard.json b/keyboards/xelus/pachi/rgb/rev2/keyboard.json index ea712b78d8..8d97dfe49b 100644 --- a/keyboards/xelus/pachi/rgb/rev2/keyboard.json +++ b/keyboards/xelus/pachi/rgb/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Pachi RGB Rev 2", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/rs108/keyboard.json b/keyboards/xelus/rs108/keyboard.json index 12ffbb3fdc..c524ae09ed 100644 --- a/keyboards/xelus/rs108/keyboard.json +++ b/keyboards/xelus/rs108/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "RS108", "manufacturer": "Xelus", - "url": "", "maintainer": "xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/rs60/info.json b/keyboards/xelus/rs60/info.json index c36d968d37..a62157826e 100644 --- a/keyboards/xelus/rs60/info.json +++ b/keyboards/xelus/rs60/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "RS60", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/snap96/keyboard.json b/keyboards/xelus/snap96/keyboard.json index 0be9968c5a..e32b7db4e0 100644 --- a/keyboards/xelus/snap96/keyboard.json +++ b/keyboards/xelus/snap96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Snap96", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/trinityxttkl/keyboard.json b/keyboards/xelus/trinityxttkl/keyboard.json index eea94c5979..c650626e4b 100644 --- a/keyboards/xelus/trinityxttkl/keyboard.json +++ b/keyboards/xelus/trinityxttkl/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Trinity XT TKL", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/valor/rev1/keyboard.json b/keyboards/xelus/valor/rev1/keyboard.json index 5b5695f34b..e85f9b2aaa 100644 --- a/keyboards/xelus/valor/rev1/keyboard.json +++ b/keyboards/xelus/valor/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Valor Rev1", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/valor/rev2/keyboard.json b/keyboards/xelus/valor/rev2/keyboard.json index 21de5fb4a2..451eeb99ff 100644 --- a/keyboards/xelus/valor/rev2/keyboard.json +++ b/keyboards/xelus/valor/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Valor Rev2", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/valor/rev3/keyboard.json b/keyboards/xelus/valor/rev3/keyboard.json index 52954fb784..002cdeff5c 100644 --- a/keyboards/xelus/valor/rev3/keyboard.json +++ b/keyboards/xelus/valor/rev3/keyboard.json @@ -45,7 +45,6 @@ "max_brightness": 200, "saturation_steps": 8 }, - "url": "", "usb": { "device_version": "0.0.1", "pid": "0x5652", diff --git a/keyboards/xelus/valor_frl_tkl/info.json b/keyboards/xelus/valor_frl_tkl/info.json index a0b7a70a89..9c909634f7 100644 --- a/keyboards/xelus/valor_frl_tkl/info.json +++ b/keyboards/xelus/valor_frl_tkl/info.json @@ -1,6 +1,5 @@ { "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/xs108/keyboard.json b/keyboards/xelus/xs108/keyboard.json index 14d442d197..d4a022ce7f 100644 --- a/keyboards/xelus/xs108/keyboard.json +++ b/keyboards/xelus/xs108/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XS108", "manufacturer": "Xelus", - "url": "", "maintainer": "xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/xs60/hotswap/keyboard.json b/keyboards/xelus/xs60/hotswap/keyboard.json index 45a5e57542..3cceb144ae 100644 --- a/keyboards/xelus/xs60/hotswap/keyboard.json +++ b/keyboards/xelus/xs60/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XS60 Hotswap", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xelus/xs60/soldered/keyboard.json b/keyboards/xelus/xs60/soldered/keyboard.json index 41af87ba7c..8dace88ce8 100644 --- a/keyboards/xelus/xs60/soldered/keyboard.json +++ b/keyboards/xelus/xs60/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XS60 Soldered", "manufacturer": "Xelus", - "url": "", "maintainer": "Xelus22", "usb": { "vid": "0x5845", diff --git a/keyboards/xiaomi/mk02/keyboard.json b/keyboards/xiaomi/mk02/keyboard.json index 28d5d8a17d..60326a335b 100644 --- a/keyboards/xiaomi/mk02/keyboard.json +++ b/keyboards/xiaomi/mk02/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "MK02", "manufacturer": "Xiaomi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/xiudi/xd68/keyboard.json b/keyboards/xiudi/xd68/keyboard.json index 620c0b5963..35fc7f61dd 100644 --- a/keyboards/xiudi/xd68/keyboard.json +++ b/keyboards/xiudi/xd68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XD68", "manufacturer": "xiudi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7844", diff --git a/keyboards/xiudi/xd75/keyboard.json b/keyboards/xiudi/xd75/keyboard.json index df1ec33577..95aaa6f182 100644 --- a/keyboards/xiudi/xd75/keyboard.json +++ b/keyboards/xiudi/xd75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XD75", "manufacturer": "xiudi", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7844", diff --git a/keyboards/xiudi/xd84/keyboard.json b/keyboards/xiudi/xd84/keyboard.json index 0411869633..7c9fc32865 100644 --- a/keyboards/xiudi/xd84/keyboard.json +++ b/keyboards/xiudi/xd84/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XD84", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7844", diff --git a/keyboards/xiudi/xd84pro/keyboard.json b/keyboards/xiudi/xd84pro/keyboard.json index 5388d8f7c2..070dd32396 100644 --- a/keyboards/xiudi/xd84pro/keyboard.json +++ b/keyboards/xiudi/xd84pro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XD84 Pro", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7844", diff --git a/keyboards/xiudi/xd96/keyboard.json b/keyboards/xiudi/xd96/keyboard.json index df1fd1cfd4..cae3f223b0 100644 --- a/keyboards/xiudi/xd96/keyboard.json +++ b/keyboards/xiudi/xd96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XD96", "manufacturer": "KPrepublic", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7844", diff --git a/keyboards/xmmx/keyboard.json b/keyboards/xmmx/keyboard.json index 2e6813520c..bb8d7e0977 100644 --- a/keyboards/xmmx/keyboard.json +++ b/keyboards/xmmx/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XMMX", "manufacturer": "farmakon", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/xw60/keyboard.json b/keyboards/xw60/keyboard.json index 3bd11e21c1..5c428f4f5b 100644 --- a/keyboards/xw60/keyboard.json +++ b/keyboards/xw60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "XW60", "manufacturer": "Drclick", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/yampad/keyboard.json b/keyboards/yampad/keyboard.json index 76efef72ad..789565e342 100644 --- a/keyboards/yampad/keyboard.json +++ b/keyboards/yampad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Yampad", "manufacturer": "Mattia Dal Ben", - "url": "", "maintainer": "mattdibi", "usb": { "vid": "0x5950", diff --git a/keyboards/ydkb/chili/keyboard.json b/keyboards/ydkb/chili/keyboard.json index 92552d96a3..13b46d8b12 100644 --- a/keyboards/ydkb/chili/keyboard.json +++ b/keyboards/ydkb/chili/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Chili", "manufacturer": "YDKB", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5945", diff --git a/keyboards/ydkb/just60/keyboard.json b/keyboards/ydkb/just60/keyboard.json index 586ea80f21..f8bd5a3503 100644 --- a/keyboards/ydkb/just60/keyboard.json +++ b/keyboards/ydkb/just60/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Just60", "manufacturer": "YDKB", - "url": "", "maintainer": "thinxer", "usb": { "vid": "0xFEED", diff --git a/keyboards/ydkb/yd68/keyboard.json b/keyboards/ydkb/yd68/keyboard.json index a3542e72c2..439272a927 100644 --- a/keyboards/ydkb/yd68/keyboard.json +++ b/keyboards/ydkb/yd68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YD68v2", "manufacturer": "YANG", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/ydkb/ydpm40/keyboard.json b/keyboards/ydkb/ydpm40/keyboard.json index b0916f297c..f19139d566 100644 --- a/keyboards/ydkb/ydpm40/keyboard.json +++ b/keyboards/ydkb/ydpm40/keyboard.json @@ -17,7 +17,6 @@ "rows": ["D4", "D5", "D6", "D7"] }, "processor": "atmega328p", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0240", diff --git a/keyboards/ymdk/bface/keyboard.json b/keyboards/ymdk/bface/keyboard.json index 8a0025c01a..9662adaba2 100644 --- a/keyboards/ymdk/bface/keyboard.json +++ b/keyboards/ymdk/bface/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "B.face", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/melody96/hotswap/keyboard.json b/keyboards/ymdk/melody96/hotswap/keyboard.json index 6a00e05050..901afc8651 100644 --- a/keyboards/ymdk/melody96/hotswap/keyboard.json +++ b/keyboards/ymdk/melody96/hotswap/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Melody96 Hotswap", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/melody96/soldered/keyboard.json b/keyboards/ymdk/melody96/soldered/keyboard.json index dbb2ddc32b..6a47c6c685 100644 --- a/keyboards/ymdk/melody96/soldered/keyboard.json +++ b/keyboards/ymdk/melody96/soldered/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Melody96 Soldered", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/sp64/keyboard.json b/keyboards/ymdk/sp64/keyboard.json index bfb140873a..d1d0d8296c 100644 --- a/keyboards/ymdk/sp64/keyboard.json +++ b/keyboards/ymdk/sp64/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "SP64", "manufacturer": "YMDK", - "url": "", "maintainer": "walston", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/yd60mq/info.json b/keyboards/ymdk/yd60mq/info.json index 1af04be687..d5a3a20c71 100644 --- a/keyboards/ymdk/yd60mq/info.json +++ b/keyboards/ymdk/yd60mq/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "YD60MQ", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/ym68/keyboard.json b/keyboards/ymdk/ym68/keyboard.json index 5bea9b2e48..032774b282 100644 --- a/keyboards/ymdk/ym68/keyboard.json +++ b/keyboards/ymdk/ym68/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YM68", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/ymd21/v2/keyboard.json b/keyboards/ymdk/ymd21/v2/keyboard.json index 3e2e992ccc..d7c4b75855 100644 --- a/keyboards/ymdk/ymd21/v2/keyboard.json +++ b/keyboards/ymdk/ymd21/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD21 v2", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x45D4", diff --git a/keyboards/ymdk/ymd40/air40/keyboard.json b/keyboards/ymdk/ymd40/air40/keyboard.json index aaca80156b..0adc965cc7 100644 --- a/keyboards/ymdk/ymd40/air40/keyboard.json +++ b/keyboards/ymdk/ymd40/air40/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMDK Air40", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x45D4", diff --git a/keyboards/ymdk/ymd40/v2/keyboard.json b/keyboards/ymdk/ymd40/v2/keyboard.json index 08f5f0a4e3..baecfbb579 100644 --- a/keyboards/ymdk/ymd40/v2/keyboard.json +++ b/keyboards/ymdk/ymd40/v2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD40 v2", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x594D", diff --git a/keyboards/ymdk/ymd75/rev1/keyboard.json b/keyboards/ymdk/ymd75/rev1/keyboard.json index f2b664c67f..fd46bf0d99 100644 --- a/keyboards/ymdk/ymd75/rev1/keyboard.json +++ b/keyboards/ymdk/ymd75/rev1/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD75 / MT84", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/ymdk/ymd75/rev2/keyboard.json b/keyboards/ymdk/ymd75/rev2/keyboard.json index 272140fd82..3bee673ceb 100644 --- a/keyboards/ymdk/ymd75/rev2/keyboard.json +++ b/keyboards/ymdk/ymd75/rev2/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD75 / MT84", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/ymdk/ymd75/rev3/keyboard.json b/keyboards/ymdk/ymd75/rev3/keyboard.json index ae8c20990b..4377fbd742 100644 --- a/keyboards/ymdk/ymd75/rev3/keyboard.json +++ b/keyboards/ymdk/ymd75/rev3/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD75 / MT84", "manufacturer": "YMDK", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x20A0", diff --git a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json index 180c68beaa..21c688bc82 100644 --- a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json +++ b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD75 V4", "manufacturer": "YMDK", - "url": "", "maintainer": "zvecr", "processor": "STM32F103", "bootloader": "uf2boot", diff --git a/keyboards/ymdk/ymd96/keyboard.json b/keyboards/ymdk/ymd96/keyboard.json index ed7edd490a..7ff17de0c2 100644 --- a/keyboards/ymdk/ymd96/keyboard.json +++ b/keyboards/ymdk/ymd96/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "YMD96", "manufacturer": "YMDK", - "url": "", "maintainer": "sparkyman215", "usb": { "vid": "0x20A0", diff --git a/keyboards/yncognito/batpad/keyboard.json b/keyboards/yncognito/batpad/keyboard.json index 06a1f9b090..6e962aefce 100644 --- a/keyboards/yncognito/batpad/keyboard.json +++ b/keyboards/yncognito/batpad/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Batpad", "manufacturer": "Yncognito", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x7979", diff --git a/keyboards/yoichiro/lunakey_macro/keyboard.json b/keyboards/yoichiro/lunakey_macro/keyboard.json index 7268dd3143..3742a4d467 100644 --- a/keyboards/yoichiro/lunakey_macro/keyboard.json +++ b/keyboards/yoichiro/lunakey_macro/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lunakey Macro", "manufacturer": "yoichiro", - "url": "", "maintainer": "Yoichiro Tanaka", "usb": { "vid": "0x5954", diff --git a/keyboards/yoichiro/lunakey_mini/keyboard.json b/keyboards/yoichiro/lunakey_mini/keyboard.json index 177b3afaa6..41503fe598 100644 --- a/keyboards/yoichiro/lunakey_mini/keyboard.json +++ b/keyboards/yoichiro/lunakey_mini/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Lunakey Mini", "manufacturer": "yoichiro", - "url": "", "maintainer": "qmk", "usb": { "vid": "0x5954", diff --git a/keyboards/yushakobo/ergo68/keyboard.json b/keyboards/yushakobo/ergo68/keyboard.json index bc61e979b7..ac86eae70b 100644 --- a/keyboards/yushakobo/ergo68/keyboard.json +++ b/keyboards/yushakobo/ergo68/keyboard.json @@ -14,7 +14,6 @@ "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], "rows": ["D4", "C6", "D7", "E6", "B4"] }, - "url": "", "usb": { "vid": "0x3265", "pid": "0x0011", diff --git a/keyboards/yushakobo/navpad/10_helix_r/keyboard.json b/keyboards/yushakobo/navpad/10_helix_r/keyboard.json index e91f96f0ac..89613390c1 100644 --- a/keyboards/yushakobo/navpad/10_helix_r/keyboard.json +++ b/keyboards/yushakobo/navpad/10_helix_r/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "navpad 1.0 with helix keyboard", "manufacturer": "yushakobo", - "url": "", "maintainer": "yushakobo", "usb": { "vid": "0x3265", diff --git a/keyboards/yushakobo/quick7/keyboard.json b/keyboards/yushakobo/quick7/keyboard.json index ba4854015b..146397d088 100644 --- a/keyboards/yushakobo/quick7/keyboard.json +++ b/keyboards/yushakobo/quick7/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "quick7", "manufacturer": "yushakobo", - "url": "", "maintainer": "yushakobo", "usb": { "vid": "0x3265", diff --git a/keyboards/ziggurat/keyboard.json b/keyboards/ziggurat/keyboard.json index 11ae657256..ef86511b36 100644 --- a/keyboards/ziggurat/keyboard.json +++ b/keyboards/ziggurat/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Ziggurat", "manufacturer": "LaminarWoob", - "url": "", "maintainer": "kb-elmo", "usb": { "vid": "0x8F5D", diff --git a/keyboards/zlant/keyboard.json b/keyboards/zlant/keyboard.json index 965a259c3b..4185d22d94 100644 --- a/keyboards/zlant/keyboard.json +++ b/keyboards/zlant/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Zlant", "manufacturer": "Matthew Cordier", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xFEED", diff --git a/keyboards/zvecr/split_blackpill/keyboard.json b/keyboards/zvecr/split_blackpill/keyboard.json index d22914d3bd..407314b71a 100644 --- a/keyboards/zvecr/split_blackpill/keyboard.json +++ b/keyboards/zvecr/split_blackpill/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "split_blackpill", "manufacturer": "zvecr", - "url": "", "maintainer": "zvecr", "usb": { "vid": "0x5A56", diff --git a/keyboards/zvecr/zv48/info.json b/keyboards/zvecr/zv48/info.json index 39a05a61e6..0a6e8f7ae9 100644 --- a/keyboards/zvecr/zv48/info.json +++ b/keyboards/zvecr/zv48/info.json @@ -1,7 +1,6 @@ { "keyboard_name": "zv48", "manufacturer": "zvecr", - "url": "", "maintainer": "zvecr", "usb": { "vid": "0x5A56", diff --git a/keyboards/zwag/zwag75/keyboard.json b/keyboards/zwag/zwag75/keyboard.json index 03b97cefc8..899e21dfa5 100644 --- a/keyboards/zwag/zwag75/keyboard.json +++ b/keyboards/zwag/zwag75/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "Zwag75", "manufacturer": "Zwag.gg", - "url": "", "maintainer": "DeskDaily", "usb": { "vid": "0x5102", From 83818d1d6f7d1f590946756ad552e407bf9a2e1f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 22 Apr 2025 17:59:16 +0100 Subject: [PATCH 312/592] Prompt for converter when creating new keymap (#25116) --- lib/python/qmk/cli/new/keymap.py | 56 +++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index 8b7160f5f2..16865ceb00 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -1,10 +1,12 @@ """This script automates the copying of the default keymap into your own keymap. """ import re +import json import shutil +from pathlib import Path from milc import cli -from milc.questions import question +from milc.questions import question, choice from qmk.constants import HAS_QMK_USERSPACE, QMK_USERSPACE from qmk.path import is_keyboard, keymaps, keymap @@ -12,6 +14,34 @@ from qmk.git import git_get_username from qmk.decorators import automagic_keyboard, automagic_keymap from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.userspace import UserspaceDefs +from qmk.json_schema import json_load +from qmk.json_encoders import KeymapJSONEncoder +from qmk.info import info_json + + +def _list_available_converters(kb_name): + """Search for converters that can be applied to a given keyboard + """ + if not is_keyboard(kb_name): + return None + + info = info_json(kb_name) + pin_compatible = info.get('pin_compatible') + if not pin_compatible: + return None + + return sorted(folder.name.split('_to_')[-1] for folder in Path('platforms').glob(f'*/converters/{pin_compatible}_to_*')) + + +def _set_converter(file, converter): + """add/overwrite any existing converter specified in keymap.json + """ + json_data = json_load(file) if file.exists() else {} + + json_data['converter'] = converter + + output = json.dumps(json_data, cls=KeymapJSONEncoder, sort_keys=True) + file.write_text(output + '\n', encoding='utf-8') def validate_keymap_name(name): @@ -37,8 +67,28 @@ Keymap name? """ return question(prompt, default=git_get_username()) +def prompt_converter(kb_name): + prompt = """ +{fg_yellow}Configure Development Board{style_reset_all} +For more information, see: +https://docs.qmk.fm/feature_converters + +Use converter? """ + + converters = _list_available_converters(kb_name) + if not converters: + return None + + choices = ['No (default)', *converters] + + answer = choice(prompt, options=choices, default=0) + return None if choices.index(answer) == 0 else answer + + @cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Specify keyboard name. Example: 1upkeyboards/1up60hse') @cli.argument('-km', '--keymap', help='Specify the name for the new keymap directory') +@cli.argument('--converter', help='Specify the name of a converter to configure') +@cli.argument('--skip-converter', arg_only=True, action='store_true', help='Skip converter') @cli.subcommand('Creates a new keymap for the keyboard of your choosing') @automagic_keyboard @automagic_keymap @@ -51,6 +101,7 @@ def new_keymap(cli): # ask for user input if keyboard or keymap was not provided in the command line kb_name = cli.config.new_keymap.keyboard if cli.config.new_keymap.keyboard else prompt_keyboard() user_name = cli.config.new_keymap.keymap if cli.config.new_keymap.keymap else prompt_user() + converter = cli.config.new_keymap.converter if cli.args.skip_converter or cli.config.new_keymap.converter else prompt_converter(kb_name) # check directories if not is_keyboard(kb_name): @@ -77,6 +128,9 @@ def new_keymap(cli): # create user directory with default keymap files shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True) + if converter: + _set_converter(keymap_path_new / 'keymap.json', converter) + # end message to user cli.log.info(f'{{fg_green}}Created a new keymap called {{fg_cyan}}{user_name}{{fg_green}} in: {{fg_cyan}}{keymap_path_new}.{{fg_reset}}') cli.log.info(f"Compile a firmware with your new keymap by typing: {{fg_yellow}}qmk compile -kb {kb_name} -km {user_name}{{fg_reset}}.") From 7a2cd0fa962eb5e6e18ce8b0213a7171bc823c1f Mon Sep 17 00:00:00 2001 From: eynsai <47629346+eynsai@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:04:31 -0400 Subject: [PATCH 313/592] High resolution scrolling (without feature report parsing) (#24423) * hires scrolling without feature report parsing * fix valid range for exponent * fix incorrect minimum exponent value documentation --- docs/features/pointing_device.md | 26 +++++++++++++++++++++ quantum/pointing_device/pointing_device.c | 19 +++++++++++++++ quantum/pointing_device/pointing_device.h | 4 ++++ tmk_core/protocol/usb_descriptor.c | 24 +++++++++++++++++++ tmk_core/protocol/usb_descriptor_common.h | 20 ++++++++++++++++ tmk_core/protocol/vusb/vusb.c | 28 +++++++++++++++++++++-- 6 files changed, 119 insertions(+), 2 deletions(-) diff --git a/docs/features/pointing_device.md b/docs/features/pointing_device.md index 0ecf82c8df..a139df9dc4 100644 --- a/docs/features/pointing_device.md +++ b/docs/features/pointing_device.md @@ -419,6 +419,32 @@ The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_S Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports. ::: +## High Resolution Scrolling + +| Setting | Description | Default | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ | +| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution mutiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` | +| `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` | + +The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels). +This works by adding a resolution multiplier to the HID descriptor for mouse wheel reports, causing the host computer to interpret each wheel tick sent by the keyboard as a fraction of a normal wheel tick. +The resolution multiplier is set to `1 / (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER * (10 ^ POINTING_DEVICE_HIRES_SCROLL_EXPONENT))`, which is `1 / 120` by default. +If even smoother scrolling than provided by this default value is desired, first try using `#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 1` which will result in a multiplier of `1 / 1200`. + +The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`. + +::: warning +High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer. +To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent. +::: + +::: warning +Many programs, especially those that implement their own smoothing for scrolling, don't work well when they receive simultaneous vertical and horizontal wheel inputs (e.g. from high resolution drag-scroll using a trackball). +These programs typically implement their smoothing in a way that assumes the user will only scroll in one axis at a time, resulting in slow or jittery motion when trying to scroll at an angle. +This can be addressed by snapping scrolling to one axis at a time. +::: + ## Split Keyboard Configuration The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device. diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c index e26416f968..5ee65c9c61 100644 --- a/quantum/pointing_device/pointing_device.c +++ b/quantum/pointing_device/pointing_device.c @@ -25,6 +25,10 @@ # include "mousekey.h" #endif +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE +# include "usb_descriptor_common.h" +#endif + #if (defined(POINTING_DEVICE_ROTATION_90) + defined(POINTING_DEVICE_ROTATION_180) + defined(POINTING_DEVICE_ROTATION_270)) > 1 # error More than one rotation selected. This is not supported. #endif @@ -78,6 +82,9 @@ uint16_t pointing_device_get_shared_cpi(void) { static report_mouse_t local_mouse_report = {}; static bool pointing_device_force_send = false; +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE +static uint16_t hires_scroll_resolution; +#endif #define POINTING_DEVICE_DRIVER_CONCAT(name) name##_pointing_device_driver #define POINTING_DEVICE_DRIVER(name) POINTING_DEVICE_DRIVER_CONCAT(name) @@ -176,6 +183,12 @@ __attribute__((weak)) void pointing_device_init(void) { # endif #endif } +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE + hires_scroll_resolution = POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER; + for (int i = 0; i < POINTING_DEVICE_HIRES_SCROLL_EXPONENT; i++) { + hires_scroll_resolution *= 10; + } +#endif pointing_device_init_kb(); pointing_device_init_user(); @@ -523,3 +536,9 @@ __attribute__((weak)) void pointing_device_keycode_handler(uint16_t keycode, boo pointing_device_send(); } } + +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE +uint16_t pointing_device_get_hires_scroll_resolution(void) { + return hires_scroll_resolution; +} +#endif \ No newline at end of file diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h index 7bc059e594..d8b583c87e 100644 --- a/quantum/pointing_device/pointing_device.h +++ b/quantum/pointing_device/pointing_device.h @@ -122,6 +122,10 @@ uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, poi report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report); void pointing_device_keycode_handler(uint16_t keycode, bool pressed); +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE +uint16_t pointing_device_get_hires_scroll_resolution(void); +#endif + #if defined(SPLIT_POINTING_ENABLE) void pointing_device_set_shared_report(report_mouse_t report); uint16_t pointing_device_get_shared_cpi(void); diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index c7fb660b65..ceab9eef9a 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -165,6 +165,24 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { # endif HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), +# ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE + HID_RI_COLLECTION(8, 0x02), + // Feature report and padding (1 byte) + HID_RI_USAGE(8, 0x48), // Resolution Multiplier + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x02), + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_PHYSICAL_MINIMUM(8, 1), + HID_RI_PHYSICAL_MAXIMUM(8, POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER), + HID_RI_UNIT_EXPONENT(8, POINTING_DEVICE_HIRES_SCROLL_EXPONENT), + HID_RI_FEATURE(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_PHYSICAL_MINIMUM(8, 0x00), + HID_RI_PHYSICAL_MAXIMUM(8, 0x00), + HID_RI_REPORT_SIZE(8, 0x06), + HID_RI_FEATURE(8, HID_IOF_CONSTANT), +# endif + // Vertical wheel (1 or 2 bytes) HID_RI_USAGE(8, 0x38), // Wheel # ifndef WHEEL_EXTENDED_REPORT @@ -179,6 +197,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_REPORT_SIZE(8, 0x10), # endif HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + // Horizontal wheel (1 or 2 bytes) HID_RI_USAGE_PAGE(8, 0x0C),// Consumer HID_RI_USAGE(16, 0x0238), // AC Pan @@ -194,6 +213,11 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_REPORT_SIZE(8, 0x10), # endif HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + +# ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE + HID_RI_END_COLLECTION(0), +# endif + HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), # ifndef MOUSE_SHARED_EP diff --git a/tmk_core/protocol/usb_descriptor_common.h b/tmk_core/protocol/usb_descriptor_common.h index 909c230a99..f782d83fbc 100644 --- a/tmk_core/protocol/usb_descriptor_common.h +++ b/tmk_core/protocol/usb_descriptor_common.h @@ -32,3 +32,23 @@ #ifndef RAW_USAGE_ID # define RAW_USAGE_ID 0x61 #endif + +///////////////////// +// Hires Scroll Defaults + +#ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE +# ifdef POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER +# if POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER > 127 || POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER < 1 +# error "POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER must be between 1 and 127, inclusive!" +# endif +# else +# define POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER 120 +# endif +# ifdef POINTING_DEVICE_HIRES_SCROLL_EXPONENT +# if POINTING_DEVICE_HIRES_SCROLL_EXPONENT > 127 || POINTING_DEVICE_HIRES_SCROLL_EXPONENT < 0 +# error "POINTING_DEVICE_HIRES_SCROLL_EXPONENT must be between 0 and 127, inclusive!" +# endif +# else +# define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 0 +# endif +#endif \ No newline at end of file diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index fdbfcc17dc..56cf82e5a6 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -520,6 +520,24 @@ const PROGMEM uchar shared_hid_report[] = { # endif 0x81, 0x06, // Input (Data, Variable, Relative) +# ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE + // Feature report and padding (1 byte) + 0xA1, 0x02, // Collection (Logical) + 0x09, 0x48, // Usage (Resolution Multiplier) + 0x95, 0x01, // Report Count (1) + 0x75, 0x02, // Report Size (2) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x01, // Physical Minimum (1) + 0x45, POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER, // Physical Maximum (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER) + 0x55, POINTING_DEVICE_HIRES_SCROLL_EXPONENT, // Unit Exponent (POINTING_DEVICE_HIRES_SCROLL_EXPONENT) + 0xB1, 0x02, // Feature (Data, Variable, Absolute) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x00, // Physical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0xB1, 0x03, // Feature (Constant) +# endif + // Vertical wheel (1 or 2 bytes) 0x09, 0x38, // Usage (Wheel) # ifndef WHEEL_EXTENDED_REPORT @@ -534,6 +552,7 @@ const PROGMEM uchar shared_hid_report[] = { 0x75, 0x10, // Report Size (16) # endif 0x81, 0x06, // Input (Data, Variable, Relative) + // Horizontal wheel (1 or 2 bytes) 0x05, 0x0C, // Usage Page (Consumer) 0x0A, 0x38, 0x02, // Usage (AC Pan) @@ -549,8 +568,13 @@ const PROGMEM uchar shared_hid_report[] = { 0x75, 0x10, // Report Size (16) # endif 0x81, 0x06, // Input (Data, Variable, Relative) - 0xC0, // End Collection - 0xC0, // End Collection + +# ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE + 0xC0, // End Collection +# endif + + 0xC0, // End Collection + 0xC0, // End Collection #endif #ifdef EXTRAKEY_ENABLE From 8cd71917ce74dd8301e24d80f4eabb2bfa1a7c69 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 01:27:47 +0100 Subject: [PATCH 314/592] Avoid duplication in generated community modules `rules.mk` (#25135) --- builddefs/build_keyboard.mk | 3 + .../qmk/cli/generate/community_modules.py | 65 ++++++++++++++++++- lib/python/qmk/cli/generate/rules_mk.py | 36 +--------- lib/python/qmk/info.py | 16 +---- 4 files changed, 72 insertions(+), 48 deletions(-) diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index fb07042bb7..514191b17d 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -251,6 +251,9 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/ endif # Community modules +COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON)) +include $(COMMUNITY_RULES_MK) + $(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) $(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON)) diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py index 23678a2fb5..e12daccf1c 100644 --- a/lib/python/qmk/cli/generate/community_modules.py +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -8,7 +8,7 @@ import qmk.path from qmk.info import get_modules from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines -from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE +from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE from qmk.community_modules import module_api_list, load_module_jsons, find_module_path @@ -121,6 +121,69 @@ def _render_core_implementation(api, modules): return lines +def _generate_features_rules(features_dict): + lines = [] + for feature, enabled in features_dict.items(): + feature = feature.upper() + enabled = 'yes' if enabled else 'no' + lines.append(f'{feature}_ENABLE={enabled}') + return lines + + +def _generate_modules_rules(keyboard, filename): + lines = [] + modules = get_modules(keyboard, filename) + if len(modules) > 0: + lines.append('') + lines.append('OPT_DEFS += -DCOMMUNITY_MODULES_ENABLE=TRUE') + for module in modules: + module_path = qmk.path.unix_style_path(find_module_path(module)) + if not module_path: + raise FileNotFoundError(f"Module '{module}' not found.") + lines.append('') + lines.append(f'COMMUNITY_MODULES += {module_path.name}') # use module_path here instead of module as it may be a subdirectory + lines.append(f'OPT_DEFS += -DCOMMUNITY_MODULE_{module_path.name.upper()}_ENABLE=TRUE') + lines.append(f'COMMUNITY_MODULE_PATHS += {module_path}') + lines.append(f'VPATH += {module_path}') + lines.append(f'SRC += $(wildcard {module_path}/{module_path.name}.c)') + lines.append(f'MODULE_NAME_{module_path.name.upper()} := {module_path.name}') + lines.append(f'MODULE_PATH_{module_path.name.upper()} := {module_path}') + lines.append(f'-include {module_path}/rules.mk') + + module_jsons = load_module_jsons(modules) + for module_json in module_jsons: + if 'features' in module_json: + lines.append('') + lines.append(f'# Module: {module_json["module_name"]}') + lines.extend(_generate_features_rules(module_json['features'])) + return lines + + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-e', '--escape', arg_only=True, action='store_true', help="Escape spaces in quiet mode") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate rules.mk for.') +@cli.argument('filename', nargs='?', arg_only=True, type=qmk.path.FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') +@cli.subcommand('Creates a community_modules_rules_mk from a keymap.json file.') +def generate_community_modules_rules_mk(cli): + + rules_mk_lines = [GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE] + + rules_mk_lines.extend(_generate_modules_rules(cli.args.keyboard, cli.args.filename)) + + # Show the results + dump_lines(cli.args.output, rules_mk_lines) + + if cli.args.output: + if cli.args.quiet: + if cli.args.escape: + print(cli.args.output.as_posix().replace(' ', '\\ ')) + else: + print(cli.args.output) + else: + cli.log.info('Wrote rules.mk to %s.', cli.args.output) + + @cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.h for.') diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py index 01d71d277f..358a22fd1d 100755 --- a/lib/python/qmk/cli/generate/rules_mk.py +++ b/lib/python/qmk/cli/generate/rules_mk.py @@ -6,13 +6,12 @@ from dotty_dict import dotty from argcomplete.completers import FilesCompleter from milc import cli -from qmk.info import info_json, get_modules +from qmk.info import info_json from qmk.json_schema import json_load from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.commands import dump_lines, parse_configurator_json -from qmk.path import normpath, unix_style_path, FileType +from qmk.path import normpath, FileType from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE -from qmk.community_modules import find_module_path, load_module_jsons def generate_rule(rules_key, rules_value): @@ -56,35 +55,6 @@ def generate_features_rules(features_dict): return lines -def generate_modules_rules(keyboard, filename): - lines = [] - modules = get_modules(keyboard, filename) - if len(modules) > 0: - lines.append('') - lines.append('OPT_DEFS += -DCOMMUNITY_MODULES_ENABLE=TRUE') - for module in modules: - module_path = unix_style_path(find_module_path(module)) - if not module_path: - raise FileNotFoundError(f"Module '{module}' not found.") - lines.append('') - lines.append(f'COMMUNITY_MODULES += {module_path.name}') # use module_path here instead of module as it may be a subdirectory - lines.append(f'OPT_DEFS += -DCOMMUNITY_MODULE_{module_path.name.upper()}_ENABLE=TRUE') - lines.append(f'COMMUNITY_MODULE_PATHS += {module_path}') - lines.append(f'VPATH += {module_path}') - lines.append(f'SRC += $(wildcard {module_path}/{module_path.name}.c)') - lines.append(f'MODULE_NAME_{module_path.name.upper()} := {module_path.name}') - lines.append(f'MODULE_PATH_{module_path.name.upper()} := {module_path}') - lines.append(f'-include {module_path}/rules.mk') - - module_jsons = load_module_jsons(modules) - for module_json in module_jsons: - if 'features' in module_json: - lines.append('') - lines.append(f'# Module: {module_json["module_name"]}') - lines.extend(generate_features_rules(module_json['features'])) - return lines - - @cli.argument('filename', nargs='?', arg_only=True, type=FileType('r'), completer=FilesCompleter('.json'), help='A configurator export JSON to be compiled and flashed or a pre-compiled binary firmware file (bin/hex) to be flashed.') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @@ -135,8 +105,6 @@ def generate_rules_mk(cli): if converter: rules_mk_lines.append(generate_rule('CONVERT_TO', converter)) - rules_mk_lines.extend(generate_modules_rules(cli.args.keyboard, cli.args.filename)) - # Show the results dump_lines(cli.args.output, rules_mk_lines) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 93eba7376a..d95fd3d799 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -1066,23 +1066,13 @@ def get_modules(keyboard, keymap_filename): """ modules = [] + kb_info_json = info_json(keyboard) + modules.extend(kb_info_json.get('modules', [])) + if keymap_filename: keymap_json = parse_configurator_json(keymap_filename) if keymap_json: - kb = keymap_json.get('keyboard', None) - if not kb: - kb = keyboard - - if kb: - kb_info_json = info_json(kb) - if kb_info_json: - modules.extend(kb_info_json.get('modules', [])) - modules.extend(keymap_json.get('modules', [])) - elif keyboard: - kb_info_json = info_json(keyboard) - modules.extend(kb_info_json.get('modules', [])) - return list(dict.fromkeys(modules)) # remove dupes From c6a93b5a56c068d654ab2d44aec529dc5d3fac0b Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 03:03:02 +0100 Subject: [PATCH 315/592] Bump rlespinasse/github-slug-action from 3 to 5 (#25021) --- .github/workflows/format_push.yml | 2 +- .github/workflows/regen_push.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/format_push.yml b/.github/workflows/format_push.yml index c861b2c111..b865ea9eec 100644 --- a/.github/workflows/format_push.yml +++ b/.github/workflows/format_push.yml @@ -39,7 +39,7 @@ jobs: qmk format-text -a git diff - - uses: rlespinasse/github-slug-action@v3.x + - uses: rlespinasse/github-slug-action@v5 - name: Become QMK Bot run: | diff --git a/.github/workflows/regen_push.yml b/.github/workflows/regen_push.yml index 9a05a9461d..8f22e931f1 100644 --- a/.github/workflows/regen_push.yml +++ b/.github/workflows/regen_push.yml @@ -26,7 +26,7 @@ jobs: util/regen.sh git diff - - uses: rlespinasse/github-slug-action@v3.x + - uses: rlespinasse/github-slug-action@v5 - name: Become QMK Bot run: | From 07684bcc99515c04a9edda3e1dfac2fc9eb79fac Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 03:09:56 +0100 Subject: [PATCH 316/592] Remove `"console":false` from keyboards (#25190) --- keyboards/0xc7/61key/keyboard.json | 1 - keyboards/0xcb/1337/keyboard.json | 1 - keyboards/0xcb/static/keyboard.json | 1 - keyboards/0xcb/tutelpad/keyboard.json | 1 - keyboards/1upkeyboards/1up60hte/keyboard.json | 1 - keyboards/1upkeyboards/1up60rgb/keyboard.json | 1 - keyboards/1upkeyboards/1upocarina/keyboard.json | 1 - keyboards/1upkeyboards/1upslider8/keyboard.json | 1 - keyboards/1upkeyboards/1upsuper16v3/keyboard.json | 1 - keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json | 1 - keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json | 1 - keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json | 1 - keyboards/1upkeyboards/pi50/info.json | 1 - keyboards/1upkeyboards/pi60/keyboard.json | 1 - keyboards/1upkeyboards/pi60_hse/keyboard.json | 1 - keyboards/1upkeyboards/pi60_rgb/keyboard.json | 1 - keyboards/1upkeyboards/super16/keyboard.json | 1 - keyboards/1upkeyboards/super16v2/keyboard.json | 1 - keyboards/1upkeyboards/sweet16/info.json | 1 - keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json | 1 - keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json | 1 - keyboards/3keyecosystem/2key2/keyboard.json | 1 - keyboards/40percentclub/4pack/keyboard.json | 1 - keyboards/40percentclub/luddite/keyboard.json | 1 - keyboards/40percentclub/mf68/keyboard.json | 1 - keyboards/40percentclub/nano/keyboard.json | 1 - keyboards/40percentclub/nein/keyboard.json | 1 - keyboards/40percentclub/polyandry/info.json | 1 - keyboards/40percentclub/sixpack/keyboard.json | 1 - keyboards/40percentclub/tomato/keyboard.json | 1 - keyboards/4pplet/aekiso60/rev_a/keyboard.json | 1 - keyboards/4pplet/bootleg/rev_a/keyboard.json | 1 - keyboards/4pplet/perk60_iso/rev_a/keyboard.json | 1 - keyboards/4pplet/steezy60/rev_a/keyboard.json | 1 - keyboards/4pplet/steezy60/rev_b/keyboard.json | 1 - keyboards/4pplet/unextended_std/rev_a/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_a/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_b/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_c/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e_iso/keyboard.json | 1 - keyboards/4pplet/waffling80/rev_a/keyboard.json | 1 - keyboards/4pplet/yakiimo/rev_a/keyboard.json | 1 - keyboards/7c8/framework/keyboard.json | 1 - keyboards/9key/keyboard.json | 1 - keyboards/abatskeyboardclub/nayeon/keyboard.json | 1 - keyboards/abstract/ellipse/rev1/keyboard.json | 1 - keyboards/acekeyboard/titan60/keyboard.json | 1 - keyboards/acheron/apollo/87h/delta/keyboard.json | 1 - keyboards/acheron/apollo/87htsc/keyboard.json | 1 - keyboards/acheron/apollo/88htsc/keyboard.json | 1 - keyboards/acheron/athena/alpha/keyboard.json | 1 - keyboards/acheron/athena/beta/keyboard.json | 1 - keyboards/acheron/elongate/beta/keyboard.json | 1 - keyboards/acheron/elongate/delta/keyboard.json | 1 - keyboards/acheron/shark/beta/keyboard.json | 1 - keyboards/acheron/themis/87h/keyboard.json | 1 - keyboards/acheron/themis/87htsc/keyboard.json | 1 - keyboards/acheron/themis/88htsc/keyboard.json | 1 - keyboards/ada/infinity81/keyboard.json | 1 - keyboards/adelheid/keyboard.json | 1 - keyboards/adm42/rev4/keyboard.json | 1 - keyboards/adpenrose/akemipad/keyboard.json | 1 - keyboards/adpenrose/kintsugi/keyboard.json | 1 - keyboards/adpenrose/obi/keyboard.json | 1 - keyboards/adpenrose/shisaku/keyboard.json | 1 - keyboards/aeboards/aegis/keyboard.json | 1 - keyboards/afternoonlabs/gust/rev1/keyboard.json | 1 - keyboards/ai/keyboard.json | 1 - keyboards/ai03/altair/keyboard.json | 1 - keyboards/ai03/altair_x/keyboard.json | 1 - keyboards/ai03/duet/keyboard.json | 1 - keyboards/ai03/equinox/rev0/keyboard.json | 1 - keyboards/ai03/equinox/rev1/keyboard.json | 1 - keyboards/ai03/equinox_xl/keyboard.json | 1 - keyboards/ai03/jp60/keyboard.json | 1 - keyboards/ai03/polaris/keyboard.json | 1 - keyboards/ai03/quasar/keyboard.json | 1 - keyboards/ai03/soyuz/keyboard.json | 1 - keyboards/ai03/voyager60_alps/keyboard.json | 1 - keyboards/aidansmithdotdev/fine40/keyboard.json | 1 - keyboards/akb/ogr/keyboard.json | 1 - keyboards/akb/ogrn/keyboard.json | 1 - keyboards/akb/vero/keyboard.json | 1 - keyboards/akko/5087/keyboard.json | 1 - keyboards/akko/5108/keyboard.json | 1 - keyboards/akko/acr87/keyboard.json | 1 - keyboards/akko/top40/keyboard.json | 1 - keyboards/alf/x11/keyboard.json | 1 - keyboards/alf/x2/keyboard.json | 1 - keyboards/alfredslab/swift65/hotswap/keyboard.json | 1 - keyboards/alfredslab/swift65/solder/keyboard.json | 1 - keyboards/alhenkb/macropad5x4/keyboard.json | 1 - keyboards/alpha/keyboard.json | 1 - keyboards/amag23/keyboard.json | 1 - keyboards/amjkeyboard/amj40/keyboard.json | 1 - keyboards/amjkeyboard/amj60/keyboard.json | 1 - keyboards/amjkeyboard/amj84/keyboard.json | 1 - keyboards/an_achronism/tetromino/keyboard.json | 1 - keyboards/anavi/arrows/keyboard.json | 1 - keyboards/anavi/knob1/keyboard.json | 1 - keyboards/anavi/knobs3/keyboard.json | 1 - keyboards/anavi/macropad10/keyboard.json | 1 - keyboards/anavi/macropad12/keyboard.json | 1 - keyboards/anavi/macropad8/keyboard.json | 1 - keyboards/andean_condor/keyboard.json | 1 - keyboards/ano/keyboard.json | 1 - keyboards/aos/tkl/keyboard.json | 1 - keyboards/aplyard/aplx6/rev1/keyboard.json | 1 - keyboards/aplyard/aplx6/rev2/keyboard.json | 1 - keyboards/ares/keyboard.json | 1 - keyboards/argo_works/ishi/80/mk0_avr/keyboard.json | 1 - keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json | 1 - keyboards/arisu/keyboard.json | 1 - keyboards/arrayperipherals/1x4p1/keyboard.json | 1 - keyboards/artemis/paragon/info.json | 1 - keyboards/ash_xiix/keyboard.json | 1 - keyboards/ask55/keyboard.json | 1 - keyboards/atlantis/ak81_ve/keyboard.json | 1 - keyboards/atlantis/ps17/keyboard.json | 1 - keyboards/atlas_65/keyboard.json | 1 - keyboards/atomic/keyboard.json | 1 - keyboards/atreus/feather/keyboard.json | 3 +-- keyboards/atxkb/1894/keyboard.json | 1 - keyboards/aves60/keyboard.json | 1 - keyboards/aves65/keyboard.json | 1 - keyboards/axolstudio/foundation_gamma/keyboard.json | 1 - keyboards/axolstudio/yeti/hotswap/keyboard.json | 1 - keyboards/axolstudio/yeti/soldered/keyboard.json | 1 - keyboards/bacca70/keyboard.json | 1 - keyboards/baguette/keyboard.json | 1 - keyboards/balloondogcaps/tr90/keyboard.json | 1 - keyboards/balloondogcaps/tr90pm/keyboard.json | 1 - keyboards/barracuda/keyboard.json | 1 - keyboards/bastardkb/dilemma/3x5_3/keyboard.json | 1 - keyboards/bastardkb/dilemma/4x6_4/keyboard.json | 1 - keyboards/bear_face/info.json | 1 - keyboards/beatervan/keyboard.json | 1 - keyboards/beekeeb/piantor/keyboard.json | 1 - keyboards/beekeeb/piantor_pro/keyboard.json | 1 - keyboards/bfake/keyboard.json | 1 - keyboards/binepad/bn006/keyboard.json | 1 - keyboards/binepad/bn009/info.json | 1 - keyboards/binepad/bnr1/info.json | 1 - keyboards/binepad/pixie/keyboard.json | 1 - keyboards/bioi/f60/keyboard.json | 1 - keyboards/bioi/s65/keyboard.json | 1 - keyboards/black_hellebore/keyboard.json | 1 - keyboards/blackplum/keyboard.json | 1 - keyboards/blank/blank01/keyboard.json | 1 - keyboards/blockboy/ac980mini/keyboard.json | 1 - keyboards/boardrun/bizarre/keyboard.json | 1 - keyboards/boardrun/classic/keyboard.json | 1 - keyboards/boardwalk/keyboard.json | 1 - keyboards/bobpad/keyboard.json | 1 - keyboards/bolsa/bolsalice/keyboard.json | 1 - keyboards/bolsa/damapad/keyboard.json | 1 - keyboards/bop/keyboard.json | 1 - keyboards/boston/keyboard.json | 1 - keyboards/bpiphany/four_banger/keyboard.json | 1 - keyboards/bpiphany/frosty_flake/20130602/keyboard.json | 1 - keyboards/bpiphany/frosty_flake/20140521/keyboard.json | 1 - keyboards/bpiphany/sixshooter/keyboard.json | 1 - keyboards/bredworks/wyvern_hs/keyboard.json | 1 - keyboards/bschwind/key_ripper/keyboard.json | 1 - keyboards/bthlabs/geekpad/keyboard.json | 1 - keyboards/budgy/keyboard.json | 1 - keyboards/buildakb/mw60/keyboard.json | 1 - keyboards/buildakb/potato65/keyboard.json | 1 - keyboards/buildakb/potato65hs/keyboard.json | 1 - keyboards/buildakb/potato65s/keyboard.json | 1 - keyboards/butterkeebs/pocketpad/keyboard.json | 1 - keyboards/cablecardesigns/cypher/rev6/keyboard.json | 1 - keyboards/cablecardesigns/phoenix/keyboard.json | 1 - keyboards/caffeinated/serpent65/keyboard.json | 1 - keyboards/canary/canary60rgb/v1/keyboard.json | 1 - keyboards/cannonkeys/adelie/keyboard.json | 1 - keyboards/cannonkeys/atlas_alps/keyboard.json | 1 - keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json | 1 - keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json | 1 - keyboards/cannonkeys/bastion60/keyboard.json | 1 - keyboards/cannonkeys/bastion65/keyboard.json | 1 - keyboards/cannonkeys/bastion75/keyboard.json | 1 - keyboards/cannonkeys/bastiontkl/keyboard.json | 1 - keyboards/cannonkeys/brutalv2_1800/keyboard.json | 1 - keyboards/cannonkeys/caerdroia/keyboard.json | 1 - keyboards/cannonkeys/chimera65_hs/keyboard.json | 1 - keyboards/cannonkeys/ellipse/keyboard.json | 1 - keyboards/cannonkeys/ellipse_hs/keyboard.json | 1 - keyboards/cannonkeys/leviatan/keyboard.json | 1 - keyboards/cannonkeys/meetuppad2023/keyboard.json | 1 - keyboards/cannonkeys/moment/keyboard.json | 1 - keyboards/cannonkeys/moment_hs/keyboard.json | 1 - keyboards/cannonkeys/nearfield/keyboard.json | 1 - keyboards/cannonkeys/ortho48v2/keyboard.json | 1 - keyboards/cannonkeys/ortho60v2/keyboard.json | 1 - keyboards/cannonkeys/petrichor/keyboard.json | 1 - keyboards/cannonkeys/reverie/info.json | 1 - keyboards/cannonkeys/ripple/keyboard.json | 1 - keyboards/cannonkeys/ripple_hs/keyboard.json | 1 - keyboards/cannonkeys/satisfaction75/info.json | 1 - keyboards/cannonkeys/serenity/keyboard.json | 1 - keyboards/cannonkeys/typeb/keyboard.json | 1 - keyboards/cannonkeys/vector/keyboard.json | 1 - keyboards/cannonkeys/vida/info.json | 1 - keyboards/cantor/keyboard.json | 1 - keyboards/capsunlocked/cu24/keyboard.json | 1 - keyboards/capsunlocked/cu65/keyboard.json | 1 - keyboards/capsunlocked/cu7/keyboard.json | 1 - keyboards/capsunlocked/cu80/v1/keyboard.json | 1 - keyboards/carbo65/keyboard.json | 1 - keyboards/cest73/tkm/keyboard.json | 1 - keyboards/chalice/keyboard.json | 1 - keyboards/chaos65/keyboard.json | 1 - keyboards/charue/sunsetter_r2/keyboard.json | 1 - keyboards/chavdai40/rev1/keyboard.json | 1 - keyboards/chavdai40/rev2/keyboard.json | 1 - keyboards/checkerboards/axon40/keyboard.json | 1 - keyboards/checkerboards/candybar_ortho/keyboard.json | 1 - keyboards/checkerboards/g_idb60/keyboard.json | 1 - keyboards/checkerboards/nop60/keyboard.json | 1 - keyboards/checkerboards/plexus75/keyboard.json | 1 - keyboards/checkerboards/plexus75_he/keyboard.json | 1 - keyboards/checkerboards/pursuit40/keyboard.json | 1 - keyboards/checkerboards/quark_lp/keyboard.json | 1 - keyboards/checkerboards/quark_plus/keyboard.json | 1 - keyboards/checkerboards/ud40_ortho_alt/keyboard.json | 1 - keyboards/cherrybstudio/cb1800/keyboard.json | 1 - keyboards/cherrybstudio/cb65/keyboard.json | 1 - keyboards/cherrybstudio/cb87/keyboard.json | 1 - keyboards/cherrybstudio/cb87rgb/keyboard.json | 1 - keyboards/cherrybstudio/cb87v2/keyboard.json | 1 - keyboards/cheshire/curiosity/keyboard.json | 1 - keyboards/chew/keyboard.json | 1 - keyboards/chickenman/ciel/keyboard.json | 1 - keyboards/chickenman/ciel65/keyboard.json | 1 - keyboards/chill/ghoul/keyboard.json | 1 - keyboards/chlx/lfn_merro60/keyboard.json | 1 - keyboards/chlx/merro60/keyboard.json | 1 - keyboards/chlx/piche60/keyboard.json | 1 - keyboards/chlx/ppr_merro60/keyboard.json | 1 - keyboards/chocofly/v1/keyboard.json | 1 - keyboards/chocv/keyboard.json | 1 - keyboards/chord/zero/keyboard.json | 1 - keyboards/chosfox/cf81/keyboard.json | 1 - keyboards/chouchou/keyboard.json | 1 - keyboards/chromatonemini/keyboard.json | 1 - keyboards/churrosoft/deck8/info.json | 1 - keyboards/cipulot/kallos/keyboard.json | 1 - keyboards/ck60i/keyboard.json | 1 - keyboards/ckeys/handwire_101/keyboard.json | 1 - keyboards/ckeys/obelus/keyboard.json | 1 - keyboards/ckeys/thedora/keyboard.json | 1 - keyboards/ckeys/washington/keyboard.json | 1 - keyboards/clap_studio/flame60/keyboard.json | 1 - keyboards/clawsome/fightpad/keyboard.json | 1 - keyboards/clueboard/66/rev3/keyboard.json | 1 - keyboards/cmm_studio/saka68/solder/keyboard.json | 1 - keyboards/coban/pad3a/keyboard.json | 1 - keyboards/compound/keyboard.json | 1 - keyboards/concreteflowers/cor/keyboard.json | 1 - keyboards/concreteflowers/cor_tkl/keyboard.json | 1 - keyboards/contender/keyboard.json | 1 - keyboards/controllerworks/city42/keyboard.json | 1 - keyboards/controllerworks/mini36/keyboard.json | 1 - keyboards/controllerworks/mini42/keyboard.json | 1 - keyboards/converter/a1200/miss1200/keyboard.json | 1 - keyboards/converter/a1200/mistress1200/keyboard.json | 1 - keyboards/converter/a1200/teensy2pp/keyboard.json | 1 - keyboards/cool836a/keyboard.json | 1 - keyboards/copenhagen_click/click_pad_v1/keyboard.json | 1 - keyboards/coseyfannitutti/discipad/keyboard.json | 1 - keyboards/coseyfannitutti/romeo/keyboard.json | 1 - keyboards/cosmo65/keyboard.json | 1 - keyboards/cozykeys/bloomer/v2/keyboard.json | 1 - keyboards/cozykeys/bloomer/v3/keyboard.json | 1 - keyboards/cozykeys/speedo/v2/keyboard.json | 1 - keyboards/cradio/keyboard.json | 1 - keyboards/crawlpad/keyboard.json | 1 - keyboards/crazy_keyboard_68/keyboard.json | 1 - keyboards/crbn/keyboard.json | 1 - keyboards/creatkeebs/glacier/keyboard.json | 1 - keyboards/creatkeebs/thera/keyboard.json | 1 - keyboards/custommk/ergostrafer/keyboard.json | 1 - keyboards/custommk/evo70/keyboard.json | 1 - keyboards/custommk/evo70_r2/keyboard.json | 1 - keyboards/cutie_club/borsdorf/keyboard.json | 1 - keyboards/cutie_club/fidelity/keyboard.json | 1 - keyboards/cutie_club/giant_macro_pad/keyboard.json | 1 - keyboards/cutie_club/keebcats/denis/keyboard.json | 1 - keyboards/cutie_club/keebcats/dougal/keyboard.json | 1 - keyboards/cutie_club/novus/keyboard.json | 1 - keyboards/cutie_club/wraith/keyboard.json | 1 - keyboards/cx60/keyboard.json | 1 - keyboards/cybergear/macro25/keyboard.json | 1 - keyboards/dailycraft/bat43/info.json | 1 - keyboards/dailycraft/owl8/keyboard.json | 1 - keyboards/dailycraft/stickey4/keyboard.json | 1 - keyboards/daji/seis_cinco/keyboard.json | 1 - keyboards/dark/magnum_ergo_1/keyboard.json | 1 - keyboards/darkproject/kd83a_bfg_edition/keyboard.json | 1 - keyboards/darmoshark/k3/keyboard.json | 1 - keyboards/db/db63/keyboard.json | 1 - keyboards/decent/tkl/keyboard.json | 1 - keyboards/delikeeb/flatbread60/keyboard.json | 1 - keyboards/delikeeb/vaguettelite/keyboard.json | 1 - keyboards/delikeeb/vanana/rev1/keyboard.json | 1 - keyboards/delikeeb/vanana/rev2/keyboard.json | 1 - keyboards/delikeeb/vaneela/keyboard.json | 1 - keyboards/delikeeb/vaneelaex/keyboard.json | 1 - keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json | 1 - keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json | 1 - keyboards/deltapad/keyboard.json | 1 - keyboards/demiurge/keyboard.json | 1 - keyboards/deng/djam/keyboard.json | 1 - keyboards/dinofizz/fnrow/v1/keyboard.json | 1 - keyboards/dk60/keyboard.json | 1 - keyboards/dm9records/lain/keyboard.json | 1 - keyboards/dmqdesign/spin/keyboard.json | 1 - keyboards/dnworks/frltkl/keyboard.json | 1 - keyboards/dnworks/sbl/keyboard.json | 1 - keyboards/do60/keyboard.json | 1 - keyboards/doio/kb04/keyboard.json | 1 - keyboards/doio/kb09/keyboard.json | 1 - keyboards/doio/kb12/keyboard.json | 1 - keyboards/doio/kb19/keyboard.json | 1 - keyboards/doio/kb30/keyboard.json | 1 - keyboards/doio/kb38/keyboard.json | 1 - keyboards/donutcables/budget96/keyboard.json | 1 - keyboards/donutcables/scrabblepad/keyboard.json | 1 - keyboards/doro67/rgb/keyboard.json | 1 - keyboards/dotmod/dymium65/keyboard.json | 1 - keyboards/dp3000/rev1/keyboard.json | 1 - keyboards/dp3000/rev2/keyboard.json | 1 - keyboards/draytronics/daisy/keyboard.json | 1 - keyboards/draytronics/elise/keyboard.json | 1 - keyboards/draytronics/elise_v2/keyboard.json | 1 - keyboards/drewkeys/iskar/keyboard.json | 1 - keyboards/drhigsby/bkf/keyboard.json | 1 - keyboards/drhigsby/dubba175/keyboard.json | 1 - keyboards/drhigsby/ogurec/info.json | 1 - keyboards/drhigsby/packrat/keyboard.json | 1 - keyboards/drop/alt/v2/keyboard.json | 1 - keyboards/drop/cstm65/keyboard.json | 1 - keyboards/drop/cstm80/keyboard.json | 1 - keyboards/drop/ctrl/v2/keyboard.json | 1 - keyboards/drop/sense75/keyboard.json | 1 - keyboards/drop/shift/v2/keyboard.json | 1 - keyboards/drop/thekey/v1/keyboard.json | 1 - keyboards/drop/thekey/v2/keyboard.json | 1 - keyboards/druah/dk_saver_redux/keyboard.json | 1 - keyboards/dtisaac/cg108/keyboard.json | 1 - keyboards/dtisaac/dosa40rgb/keyboard.json | 1 - keyboards/dtisaac/dtisaac01/keyboard.json | 1 - keyboards/durgod/k320/base/keyboard.json | 1 - keyboards/dyz/dyz40/keyboard.json | 1 - keyboards/dyz/dyz60/keyboard.json | 1 - keyboards/dyz/dyz60_hs/keyboard.json | 1 - keyboards/dyz/dyz_tkl/keyboard.json | 1 - keyboards/dyz/selka40/keyboard.json | 1 - keyboards/dyz/synthesis60/keyboard.json | 1 - keyboards/dz60/keyboard.json | 1 - keyboards/dztech/bocc/keyboard.json | 1 - keyboards/dztech/duo_s/keyboard.json | 1 - keyboards/dztech/dz60v2/keyboard.json | 1 - keyboards/dztech/dz65rgb/v1/keyboard.json | 1 - keyboards/dztech/dz65rgb/v2/keyboard.json | 1 - keyboards/dztech/dz96/keyboard.json | 1 - keyboards/dztech/endless80/keyboard.json | 1 - keyboards/dztech/mellow/keyboard.json | 1 - keyboards/dztech/pluto/keyboard.json | 1 - keyboards/dztech/tofu/ii/v1/keyboard.json | 1 - keyboards/dztech/tofu/jr/v1/keyboard.json | 1 - keyboards/dztech/tofu/jr/v2/keyboard.json | 1 - keyboards/dztech/tofu60/keyboard.json | 1 - keyboards/earth_rover/keyboard.json | 1 - keyboards/eason/aeroboard/keyboard.json | 1 - keyboards/eason/capsule65/keyboard.json | 1 - keyboards/eason/greatsword80/keyboard.json | 1 - keyboards/eason/meow65/keyboard.json | 1 - keyboards/eason/void65h/keyboard.json | 1 - keyboards/ebastler/e80_1800/keyboard.json | 1 - keyboards/ebastler/isometria_75/rev1/keyboard.json | 1 - keyboards/eco/rev1/keyboard.json | 1 - keyboards/eco/rev2/keyboard.json | 1 - keyboards/edc40/keyboard.json | 1 - keyboards/edda/keyboard.json | 1 - keyboards/emajesty/eiri/keyboard.json | 1 - keyboards/emi20/keyboard.json | 1 - keyboards/emptystring/nqg/keyboard.json | 1 - keyboards/eniigmakeyboards/ek60/keyboard.json | 1 - keyboards/eniigmakeyboards/ek65/keyboard.json | 1 - keyboards/eniigmakeyboards/ek87/keyboard.json | 1 - keyboards/enviousdesign/60f/keyboard.json | 1 - keyboards/enviousdesign/65m/keyboard.json | 1 - keyboards/enviousdesign/commissions/mini1800/keyboard.json | 1 - keyboards/enviousdesign/delirium/rev0/keyboard.json | 1 - keyboards/enviousdesign/delirium/rev1/keyboard.json | 1 - keyboards/enviousdesign/delirium/rgb/keyboard.json | 1 - keyboards/enviousdesign/mcro/rev1/keyboard.json | 1 - keyboards/era/divine/keyboard.json | 1 - keyboards/era/era65/keyboard.json | 1 - keyboards/esca/getawayvan/keyboard.json | 1 - keyboards/esca/getawayvan_f042/keyboard.json | 1 - keyboards/eternal_keypad/keyboard.json | 1 - keyboards/etiennecollin/wave/keyboard.json | 1 - keyboards/eve/meteor/keyboard.json | 1 - keyboards/evil80/keyboard.json | 1 - keyboards/evolv/keyboard.json | 1 - keyboards/evyd13/fin_pad/keyboard.json | 1 - keyboards/evyd13/gh80_3700/keyboard.json | 1 - keyboards/evyd13/gud70/keyboard.json | 1 - keyboards/evyd13/mx5160/keyboard.json | 1 - keyboards/evyd13/nt210/keyboard.json | 1 - keyboards/evyd13/nt650/keyboard.json | 1 - keyboards/evyd13/nt750/keyboard.json | 1 - keyboards/evyd13/nt980/keyboard.json | 1 - keyboards/evyd13/plain60/keyboard.json | 1 - keyboards/evyd13/quackfire/keyboard.json | 1 - keyboards/evyd13/solheim68/keyboard.json | 1 - keyboards/exclusive/e65/keyboard.json | 1 - keyboards/exclusive/e6_rgb/keyboard.json | 1 - keyboards/exclusive/e6v2/le/keyboard.json | 1 - keyboards/exclusive/e6v2/le_bmc/keyboard.json | 1 - keyboards/exclusive/e6v2/oe/keyboard.json | 1 - keyboards/exclusive/e6v2/oe_bmc/keyboard.json | 1 - keyboards/exclusive/e7v1/keyboard.json | 1 - keyboards/exclusive/e7v1se/keyboard.json | 1 - keyboards/exent/keyboard.json | 1 - keyboards/eyeohdesigns/babyv/keyboard.json | 1 - keyboards/eyeohdesigns/theboulevard/keyboard.json | 1 - keyboards/facew/keyboard.json | 1 - keyboards/falsonix/fx19/keyboard.json | 1 - keyboards/fatotesa/keyboard.json | 1 - keyboards/feker/ik75/keyboard.json | 1 - keyboards/ffkeebs/puca/keyboard.json | 1 - keyboards/ffkeebs/siris/keyboard.json | 1 - keyboards/flashquark/horizon_z/keyboard.json | 1 - keyboards/flehrad/numbrero/keyboard.json | 1 - keyboards/flehrad/snagpad/keyboard.json | 1 - keyboards/flehrad/tradestation/keyboard.json | 1 - keyboards/fleuron/keyboard.json | 1 - keyboards/flx/lodestone/keyboard.json | 1 - keyboards/flx/virgo/keyboard.json | 1 - keyboards/flxlb/zplit/keyboard.json | 1 - keyboards/foostan/cornelius/keyboard.json | 1 - keyboards/forever65/keyboard.json | 1 - keyboards/foxlab/key65/hotswap/keyboard.json | 1 - keyboards/foxlab/key65/universal/keyboard.json | 1 - keyboards/foxlab/leaf60/hotswap/keyboard.json | 1 - keyboards/foxlab/leaf60/universal/keyboard.json | 1 - keyboards/foxlab/time80/keyboard.json | 1 - keyboards/foxlab/time_re/hotswap/keyboard.json | 1 - keyboards/foxlab/time_re/universal/keyboard.json | 1 - keyboards/fr4/southpaw75/keyboard.json | 1 - keyboards/fr4/unix60/keyboard.json | 1 - keyboards/free_willy/keyboard.json | 1 - keyboards/friedrich/keyboard.json | 1 - keyboards/frobiac/blackbowl/keyboard.json | 1 - keyboards/frobiac/blackflat/keyboard.json | 1 - keyboards/frobiac/hypernano/keyboard.json | 1 - keyboards/frobiac/redtilt/keyboard.json | 1 - keyboards/frooastboard/nano/keyboard.json | 1 - keyboards/frooastboard/walnut/keyboard.json | 1 - keyboards/fs_streampad/keyboard.json | 1 - keyboards/ft/mars65/keyboard.json | 1 - keyboards/ft/mars80/keyboard.json | 1 - keyboards/function96/v1/keyboard.json | 1 - keyboards/function96/v2/keyboard.json | 1 - keyboards/fungo/rev1/keyboard.json | 1 - keyboards/funky40/keyboard.json | 1 - keyboards/gami_studio/lex60/keyboard.json | 1 - keyboards/geekboards/macropad_v2/keyboard.json | 1 - keyboards/geekboards/tester/keyboard.json | 1 - keyboards/geistmaschine/geist/keyboard.json | 1 - keyboards/geistmaschine/macropod/keyboard.json | 1 - keyboards/generic_panda/panda65_01/keyboard.json | 1 - keyboards/genone/eclipse_65/keyboard.json | 1 - keyboards/genone/g1_65/keyboard.json | 1 - keyboards/geonworks/ee_at/keyboard.json | 1 - keyboards/geonworks/frogmini/fmh/keyboard.json | 1 - keyboards/geonworks/frogmini/fms/keyboard.json | 1 - keyboards/geonworks/w1_at/keyboard.json | 1 - keyboards/gh60/revc/keyboard.json | 1 - keyboards/gh60/v1p3/keyboard.json | 1 - keyboards/gh80_3000/keyboard.json | 1 - keyboards/ghs/jem/info.json | 1 - keyboards/ghs/rar/keyboard.json | 1 - keyboards/ghs/xls/keyboard.json | 1 - keyboards/giabalanai/keyboard.json | 1 - keyboards/gizmo_engineering/gk6/keyboard.json | 1 - keyboards/gkeyboard/gkb_m16/keyboard.json | 1 - keyboards/gkeyboard/gpad8_2r/keyboard.json | 1 - keyboards/gkeyboard/greatpad/keyboard.json | 1 - keyboards/gl516/xr63gl/keyboard.json | 1 - keyboards/gmmk/gmmk2/p65/ansi/keyboard.json | 1 - keyboards/gmmk/gmmk2/p65/iso/keyboard.json | 1 - keyboards/gmmk/gmmk2/p96/ansi/keyboard.json | 1 - keyboards/gmmk/gmmk2/p96/iso/keyboard.json | 1 - keyboards/gmmk/pro/rev1/ansi/keyboard.json | 1 - keyboards/gmmk/pro/rev1/iso/keyboard.json | 1 - keyboards/gmmk/pro/rev2/ansi/keyboard.json | 1 - keyboards/gmmk/pro/rev2/iso/keyboard.json | 1 - keyboards/gorthage_truck/keyboard.json | 1 - keyboards/gowla/keyboard.json | 1 - keyboards/gray_studio/aero75/keyboard.json | 1 - keyboards/gray_studio/apollo80/keyboard.json | 1 - keyboards/gray_studio/hb85/keyboard.json | 1 - keyboards/gray_studio/space65/keyboard.json | 1 - keyboards/gray_studio/space65r3/keyboard.json | 1 - keyboards/gray_studio/think65v3/keyboard.json | 1 - keyboards/gregandcin/teaqueen/keyboard.json | 1 - keyboards/gummykey/keyboard.json | 1 - keyboards/gvalchca/ga150/keyboard.json | 1 - keyboards/gvalchca/spaccboard/keyboard.json | 1 - keyboards/h0oni/deskpad/keyboard.json | 1 - keyboards/h0oni/hotduck/keyboard.json | 1 - keyboards/hackpad/keyboard.json | 1 - keyboards/halokeys/elemental75/keyboard.json | 1 - keyboards/han60/keyboard.json | 1 - keyboards/hand88/keyboard.json | 1 - keyboards/handwired/10k/keyboard.json | 1 - keyboards/handwired/2x5keypad/keyboard.json | 1 - keyboards/handwired/6key/keyboard.json | 1 - keyboards/handwired/6macro/keyboard.json | 1 - keyboards/handwired/acacia/keyboard.json | 1 - keyboards/handwired/aim65/keyboard.json | 1 - keyboards/handwired/alcor_dactyl/keyboard.json | 1 - keyboards/handwired/amigopunk/keyboard.json | 1 - keyboards/handwired/angel/keyboard.json | 1 - keyboards/handwired/aplx2/keyboard.json | 1 - keyboards/handwired/aranck/keyboard.json | 1 - keyboards/handwired/atreus50/keyboard.json | 1 - keyboards/handwired/axon/keyboard.json | 1 - keyboards/handwired/baredev/rev1/keyboard.json | 1 - keyboards/handwired/bolek/keyboard.json | 1 - keyboards/handwired/boss566y/redragon_vara/keyboard.json | 1 - keyboards/handwired/brain/keyboard.json | 1 - keyboards/handwired/bstk100/keyboard.json | 1 - keyboards/handwired/cans12er/keyboard.json | 1 - keyboards/handwired/chiron/keyboard.json | 1 - keyboards/handwired/co60/rev1/keyboard.json | 1 - keyboards/handwired/co60/rev6/keyboard.json | 1 - keyboards/handwired/co60/rev7/keyboard.json | 1 - keyboards/handwired/colorlice/keyboard.json | 1 - keyboards/handwired/concertina/64key/keyboard.json | 1 - keyboards/handwired/consolekeyboard/18key/keyboard.json | 1 - keyboards/handwired/consolekeyboard/20key/keyboard.json | 1 - keyboards/handwired/consolekeyboard/27key/keyboard.json | 1 - keyboards/handwired/consolekeyboard/30key/keyboard.json | 1 - keyboards/handwired/croxsplit44/keyboard.json | 1 - keyboards/handwired/curiosity/keyboard.json | 1 - keyboards/handwired/dactyl_cc/keyboard.json | 1 - keyboards/handwired/dactyl_kinesis/keyboard.json | 1 - keyboards/handwired/dactyl_lightcycle/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x7/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/6x7/keyboard.json | 1 - keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json | 1 - keyboards/handwired/dactyl_maximus/keyboard.json | 1 - keyboards/handwired/dactyl_promicro/keyboard.json | 1 - keyboards/handwired/dactyl_rah/keyboard.json | 1 - keyboards/handwired/dactyl_tracer/keyboard.json | 1 - keyboards/handwired/dactylmacropad/keyboard.json | 1 - keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json | 1 - keyboards/handwired/dc/mc/001/keyboard.json | 1 - keyboards/handwired/ddg_56/keyboard.json | 1 - keyboards/handwired/dmote/keyboard.json | 1 - keyboards/handwired/eagleii/keyboard.json | 1 - keyboards/handwired/elrgo_s/keyboard.json | 1 - keyboards/handwired/frankie_macropad/keyboard.json | 1 - keyboards/handwired/freoduo/keyboard.json | 1 - keyboards/handwired/heisenberg/keyboard.json | 1 - keyboards/handwired/hnah108/keyboard.json | 1 - keyboards/handwired/hnah40/keyboard.json | 1 - keyboards/handwired/hnah40rgb/keyboard.json | 1 - keyboards/handwired/hwpm87/keyboard.json | 1 - keyboards/handwired/iso85k/keyboard.json | 1 - keyboards/handwired/itstleo9/info.json | 1 - keyboards/handwired/jn68m/keyboard.json | 1 - keyboards/handwired/jopr/keyboard.json | 1 - keyboards/handwired/jotanck/keyboard.json | 1 - keyboards/handwired/jotlily60/keyboard.json | 1 - keyboards/handwired/juliet/keyboard.json | 1 - keyboards/handwired/k8split/keyboard.json | 1 - keyboards/handwired/kbod/keyboard.json | 1 - keyboards/handwired/ks63/keyboard.json | 1 - keyboards/handwired/leftynumpad/keyboard.json | 1 - keyboards/handwired/lovelive9/keyboard.json | 1 - keyboards/handwired/marauder/keyboard.json | 1 - keyboards/handwired/marek128b/ergosplit44/keyboard.json | 1 - keyboards/handwired/mechboards_micropad/keyboard.json | 1 - keyboards/handwired/minorca/keyboard.json | 1 - keyboards/handwired/mutepad/keyboard.json | 1 - keyboards/handwired/nicekey/keyboard.json | 1 - keyboards/handwired/not_so_minidox/keyboard.json | 1 - keyboards/handwired/nozbe_macro/keyboard.json | 1 - keyboards/handwired/obuwunkunubi/spaget/keyboard.json | 1 - keyboards/handwired/oem_ansi_fullsize/keyboard.json | 1 - keyboards/handwired/onekey/info.json | 1 - keyboards/handwired/orbweaver/keyboard.json | 1 - keyboards/handwired/ortho5x14/keyboard.json | 1 - keyboards/handwired/p65rgb/keyboard.json | 1 - keyboards/handwired/petruziamini/keyboard.json | 1 - keyboards/handwired/phantagom/baragon/keyboard.json | 1 - keyboards/handwired/phantagom/varan/keyboard.json | 1 - keyboards/handwired/polly40/keyboard.json | 1 - keyboards/handwired/prime_exl/keyboard.json | 1 - keyboards/handwired/prime_exl_plus/keyboard.json | 1 - keyboards/handwired/pteron/keyboard.json | 1 - keyboards/handwired/pteron38/keyboard.json | 1 - keyboards/handwired/pteron44/keyboard.json | 1 - keyboards/handwired/qc60/proto/keyboard.json | 1 - keyboards/handwired/rabijl/rotary_numpad/keyboard.json | 1 - keyboards/handwired/riblee_split/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto34/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto36/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto37/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto40/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto61/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto9/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoalp/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottocmd/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottodeck/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoergo/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottofly/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottofrog/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottogame/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottohazard/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoinvader/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottokatana/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottolong/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottomouse/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottonum/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoslant/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottosplit/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottostarter/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottowing/keyboard.json | 1 - keyboards/handwired/sejin_eat1010r2/keyboard.json | 1 - keyboards/handwired/sick_pad/keyboard.json | 1 - keyboards/handwired/skakunm_dactyl/keyboard.json | 1 - keyboards/handwired/snatchpad/keyboard.json | 1 - keyboards/handwired/space_oddity/keyboard.json | 1 - keyboards/handwired/split65/promicro/keyboard.json | 1 - keyboards/handwired/split89/keyboard.json | 1 - keyboards/handwired/starrykeebs/dude09/keyboard.json | 1 - keyboards/handwired/steamvan/rev1/keyboard.json | 1 - keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x3/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x4/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x5/keyboard.json | 1 - keyboards/handwired/swiftrax/astro65/keyboard.json | 1 - keyboards/handwired/swiftrax/bebol/keyboard.json | 1 - keyboards/handwired/swiftrax/beegboy/keyboard.json | 1 - keyboards/handwired/swiftrax/bumblebee/keyboard.json | 1 - keyboards/handwired/swiftrax/cowfish/keyboard.json | 1 - keyboards/handwired/swiftrax/digicarp65/keyboard.json | 1 - keyboards/handwired/swiftrax/digicarpice/keyboard.json | 1 - keyboards/handwired/swiftrax/equator/keyboard.json | 1 - keyboards/handwired/swiftrax/glacier/keyboard.json | 1 - keyboards/handwired/swiftrax/joypad/keyboard.json | 1 - keyboards/handwired/swiftrax/koalafications/keyboard.json | 1 - keyboards/handwired/swiftrax/nodu/keyboard.json | 1 - keyboards/handwired/swiftrax/pandamic/keyboard.json | 1 - keyboards/handwired/swiftrax/the_galleon/keyboard.json | 1 - keyboards/handwired/swiftrax/unsplit/keyboard.json | 1 - keyboards/handwired/swiftrax/walter/keyboard.json | 1 - keyboards/handwired/tennie/keyboard.json | 1 - keyboards/handwired/terminus_mini/keyboard.json | 1 - keyboards/handwired/tkk/keyboard.json | 1 - keyboards/handwired/traveller/keyboard.json | 1 - keyboards/handwired/tsubasa/keyboard.json | 1 - keyboards/handwired/twig/twig50/keyboard.json | 1 - keyboards/handwired/uthol/rev1/keyboard.json | 1 - keyboards/handwired/uthol/rev2/keyboard.json | 1 - keyboards/handwired/videowriter/keyboard.json | 1 - keyboards/handwired/wwa/helios/keyboard.json | 1 - keyboards/handwired/wwa/kepler/keyboard.json | 1 - keyboards/handwired/wwa/mercury/keyboard.json | 1 - keyboards/handwired/wwa/soyuz/keyboard.json | 1 - keyboards/handwired/wwa/soyuzxl/keyboard.json | 1 - keyboards/handwired/z150/keyboard.json | 1 - keyboards/handwired/zergo/keyboard.json | 1 - keyboards/handwired/ziyoulang_k3_mod/keyboard.json | 1 - keyboards/hardlineworks/otd_plus/keyboard.json | 1 - keyboards/hardwareabstraction/handwire/keyboard.json | 1 - keyboards/heliar/wm1_hotswap/keyboard.json | 1 - keyboards/heliotrope/keyboard.json | 1 - keyboards/hfdkb/ac001/keyboard.json | 1 - keyboards/hhkb_lite_2/keyboard.json | 1 - keyboards/hidtech/bastyl/keyboard.json | 1 - keyboards/hifumi/keyboard.json | 1 - keyboards/hineybush/h08_ocelot/keyboard.json | 1 - keyboards/hineybush/h101/keyboard.json | 1 - keyboards/hineybush/h60/keyboard.json | 1 - keyboards/hineybush/h65/keyboard.json | 1 - keyboards/hineybush/h65_hotswap/keyboard.json | 1 - keyboards/hineybush/h660s/keyboard.json | 1 - keyboards/hineybush/h75_singa/keyboard.json | 1 - keyboards/hineybush/h87_g2/keyboard.json | 1 - keyboards/hineybush/h87a/keyboard.json | 1 - keyboards/hineybush/h88/keyboard.json | 1 - keyboards/hineybush/h88_g2/keyboard.json | 1 - keyboards/hineybush/ibis/keyboard.json | 1 - keyboards/hineybush/physix/keyboard.json | 1 - keyboards/hineybush/sm68/keyboard.json | 1 - keyboards/holyswitch/lightweight65/keyboard.json | 1 - keyboards/holyswitch/southpaw75/keyboard.json | 1 - keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json | 1 - keyboards/horrortroll/caticorn/rev1/solder/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json | 1 - keyboards/horrortroll/nyx/rev1/keyboard.json | 1 - keyboards/horrortroll/paws60/keyboard.json | 1 - keyboards/hotdox76v2/keyboard.json | 1 - keyboards/hp69/keyboard.json | 1 - keyboards/hubble/keyboard.json | 1 - keyboards/huytbt/h50/keyboard.json | 1 - keyboards/ianklug/grooveboard/keyboard.json | 1 - keyboards/ibm/model_m/ashpil_usbc/keyboard.json | 1 - keyboards/ibm/model_m/modelh/keyboard.json | 1 - keyboards/ibm/model_m/teensy2/keyboard.json | 1 - keyboards/ibm/model_m/yugo_m/keyboard.json | 1 - keyboards/ibm/model_m_ssk/teensypp_ssk/keyboard.json | 1 - keyboards/ibnuda/alicia_cook/keyboard.json | 1 - keyboards/ibnuda/gurindam/keyboard.json | 1 - keyboards/icebreaker/hotswap/keyboard.json | 1 - keyboards/idank/sweeq/keyboard.json | 1 - keyboards/idb/idb_60/keyboard.json | 1 - keyboards/idobao/id42/keyboard.json | 1 - keyboards/idobao/id61/keyboard.json | 1 - keyboards/idobao/id63/keyboard.json | 1 - keyboards/idobao/id67/keyboard.json | 1 - keyboards/idobao/id75/v2/keyboard.json | 1 - keyboards/idobao/id80/v2/info.json | 1 - keyboards/idobao/id80/v3/ansi/keyboard.json | 1 - keyboards/idobao/id87/v1/keyboard.json | 1 - keyboards/idobao/id87/v2/keyboard.json | 1 - keyboards/idobao/id96/keyboard.json | 1 - keyboards/idobao/montex/v1/keyboard.json | 1 - keyboards/idobao/montex/v1rgb/keyboard.json | 1 - keyboards/idobao/montex/v2/keyboard.json | 1 - keyboards/idyllic/tinny50_rgb/keyboard.json | 1 - keyboards/igloo/keyboard.json | 1 - keyboards/illuminati/is0/keyboard.json | 1 - keyboards/illusion/rosa/keyboard.json | 1 - keyboards/ilumkb/primus75/keyboard.json | 1 - keyboards/ilumkb/simpler61/keyboard.json | 1 - keyboards/ilumkb/simpler64/keyboard.json | 1 - keyboards/ilumkb/volcano660/keyboard.json | 1 - keyboards/inett_studio/sqx/hotswap/keyboard.json | 1 - keyboards/inett_studio/sqx/universal/keyboard.json | 1 - keyboards/inland/mk47/keyboard.json | 1 - keyboards/inland/v83p/keyboard.json | 1 - keyboards/input_club/k_type/keyboard.json | 1 - keyboards/input_club/whitefox/keyboard.json | 1 - keyboards/io_mini1800/keyboard.json | 1 - keyboards/irene/keyboard.json | 1 - keyboards/iriskeyboards/keyboard.json | 1 - keyboards/itstleo/itstleo40/keyboard.json | 1 - keyboards/j80/keyboard.json | 1 - keyboards/jacky_studio/s7_elephant/rev1/keyboard.json | 1 - keyboards/jacky_studio/s7_elephant/rev2/keyboard.json | 1 - keyboards/jadookb/jkb65/info.json | 1 - keyboards/janus/keyboard.json | 1 - keyboards/jaykeeb/aumz_work/info.json | 1 - keyboards/jaykeeb/jk60/keyboard.json | 1 - keyboards/jaykeeb/jk60rgb/keyboard.json | 1 - keyboards/jaykeeb/jk65/keyboard.json | 1 - keyboards/jaykeeb/joker/keyboard.json | 1 - keyboards/jaykeeb/kamigakushi/keyboard.json | 1 - keyboards/jaykeeb/orba/keyboard.json | 1 - keyboards/jaykeeb/sebelas/keyboard.json | 1 - keyboards/jaykeeb/skyline/keyboard.json | 1 - keyboards/jaykeeb/sriwedari70/keyboard.json | 1 - keyboards/jaykeeb/tokki/keyboard.json | 1 - keyboards/jc65/v32a/keyboard.json | 1 - keyboards/jc65/v32u4/keyboard.json | 1 - keyboards/jd40/keyboard.json | 1 - keyboards/jels/boaty/keyboard.json | 1 - keyboards/jels/jels60/v1/keyboard.json | 1 - keyboards/jels/jels60/v2/keyboard.json | 1 - keyboards/jels/jels88/keyboard.json | 1 - keyboards/jkdlab/binary_monkey/keyboard.json | 1 - keyboards/jkeys_design/gentleman65/keyboard.json | 1 - keyboards/jkeys_design/gentleman65_se_s/keyboard.json | 1 - keyboards/jolofsor/denial75/keyboard.json | 1 - keyboards/joshajohnson/hub20/keyboard.json | 1 - keyboards/jukaie/jk01/keyboard.json | 1 - keyboards/k34/keyboard.json | 1 - keyboards/kabedon/kabedon78s/keyboard.json | 1 - keyboards/kabedon/kabedon980/keyboard.json | 1 - keyboards/kabedon/kabedon98e/keyboard.json | 1 - keyboards/kagizaraya/halberd/keyboard.json | 1 - keyboards/kagizaraya/miniaxe/keyboard.json | 1 - keyboards/kakunpc/rabbit_capture_plan/keyboard.json | 1 - keyboards/kalakos/bahrnob/keyboard.json | 1 - keyboards/kaly/kaly42/keyboard.json | 1 - keyboards/kapcave/arya/keyboard.json | 1 - keyboards/kapcave/paladinpad/info.json | 1 - keyboards/karn/keyboard.json | 1 - keyboards/kb_elmo/67mk_e/keyboard.json | 1 - keyboards/kb_elmo/noah_avr/keyboard.json | 1 - keyboards/kb_elmo/qez/keyboard.json | 1 - keyboards/kb_elmo/vertex/keyboard.json | 1 - keyboards/kbdcraft/adam64/keyboard.json | 1 - keyboards/kbdfans/baguette66/rgb/keyboard.json | 1 - keyboards/kbdfans/baguette66/soldered/keyboard.json | 1 - keyboards/kbdfans/bella/soldered/keyboard.json | 1 - keyboards/kbdfans/boop65/rgb/keyboard.json | 1 - keyboards/kbdfans/bounce/75/hotswap/keyboard.json | 1 - keyboards/kbdfans/bounce/75/soldered/keyboard.json | 1 - keyboards/kbdfans/bounce/pad/keyboard.json | 1 - keyboards/kbdfans/d45/v2/keyboard.json | 1 - keyboards/kbdfans/epoch80/keyboard.json | 1 - keyboards/kbdfans/kbd19x/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json | 1 - keyboards/kbdfans/kbd67/rev2/keyboard.json | 1 - keyboards/kbdfans/kbd75hs/keyboard.json | 1 - keyboards/kbdfans/kbd75rgb/keyboard.json | 1 - keyboards/kbdfans/kbd8x/keyboard.json | 1 - keyboards/kbdfans/kbd8x_mk2/keyboard.json | 1 - keyboards/kbdfans/kbdmini/keyboard.json | 1 - keyboards/kbdfans/kbdpad/mk1/keyboard.json | 1 - keyboards/kbdfans/kbdpad/mk2/keyboard.json | 1 - keyboards/kbdfans/kbdpad/mk3/keyboard.json | 1 - keyboards/kbdfans/maja/keyboard.json | 1 - keyboards/kbdfans/maja_soldered/keyboard.json | 1 - keyboards/kbdfans/odin/rgb/keyboard.json | 1 - keyboards/kbdfans/odin/soldered/keyboard.json | 1 - keyboards/kbdfans/odin/v2/keyboard.json | 1 - keyboards/kbdfans/odin75/keyboard.json | 1 - keyboards/kbdfans/phaseone/keyboard.json | 1 - keyboards/kbdfans/tiger80/keyboard.json | 1 - keyboards/kbnordic/nordic60/rev_a/keyboard.json | 1 - keyboards/kbnordic/nordic65/rev_a/keyboard.json | 1 - keyboards/kc60se/keyboard.json | 1 - keyboards/keebio/bfo9000/keyboard.json | 1 - keyboards/keebio/dilly/keyboard.json | 1 - keyboards/keebio/fourier/keyboard.json | 1 - keyboards/keebio/iris/rev5/keyboard.json | 1 - keyboards/keebio/laplace/keyboard.json | 1 - keyboards/keebio/nyquist/rev1/keyboard.json | 1 - keyboards/keebio/nyquist/rev2/keyboard.json | 1 - keyboards/keebio/nyquist/rev3/keyboard.json | 1 - keyboards/keebio/sinc/info.json | 1 - keyboards/keebio/stick/keyboard.json | 1 - keyboards/keebio/tragicforce68/keyboard.json | 1 - keyboards/keebio/wtf60/keyboard.json | 1 - keyboards/keebmonkey/kbmg68/keyboard.json | 1 - keyboards/keebsforall/freebird60/keyboard.json | 1 - keyboards/keebsforall/freebird75/keyboard.json | 1 - keyboards/keebsforall/freebirdnp/lite/keyboard.json | 1 - keyboards/keebsforall/freebirdnp/pro/keyboard.json | 1 - keyboards/keebsforall/freebirdtkl/keyboard.json | 1 - keyboards/keebzdotnet/fme/keyboard.json | 1 - keyboards/keebzdotnet/wazowski/keyboard.json | 1 - keyboards/kegen/gboy/keyboard.json | 1 - keyboards/kelwin/utopia88/keyboard.json | 1 - keyboards/kepler_33/proto/keyboard.json | 1 - keyboards/keybage/radpad/keyboard.json | 1 - keyboards/keybee/keybee65/keyboard.json | 1 - keyboards/keycapsss/o4l_5x12/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev1/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev2/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev3/keyboard.json | 1 - keyboards/keychron/c1_pro/info.json | 1 - keyboards/keychron/c1_pro_v2/info.json | 1 - keyboards/keychron/c2_pro/info.json | 1 - keyboards/keychron/c2_pro_v2/info.json | 1 - keyboards/keychron/c3_pro/info.json | 1 - keyboards/keychron/q0/info.json | 1 - keyboards/keychron/q11/info.json | 1 - keyboards/keychron/q1v1/info.json | 1 - keyboards/keychron/q1v2/info.json | 1 - keyboards/keychron/q2/info.json | 1 - keyboards/keychron/q3/info.json | 1 - keyboards/keychron/q4/info.json | 1 - keyboards/keychron/q5/info.json | 1 - keyboards/keychron/q60/ansi/keyboard.json | 1 - keyboards/keychron/q7/info.json | 1 - keyboards/keychron/q8/info.json | 1 - keyboards/keychron/q9/info.json | 1 - keyboards/keychron/q9_plus/info.json | 1 - keyboards/keychron/s1/ansi/rgb/keyboard.json | 1 - keyboards/keychron/s1/ansi/white/keyboard.json | 1 - keyboards/keychron/v2/ansi/keyboard.json | 1 - keyboards/keychron/v2/ansi_encoder/keyboard.json | 1 - keyboards/keychron/v2/iso/keyboard.json | 1 - keyboards/keychron/v2/iso_encoder/keyboard.json | 1 - keyboards/keychron/v2/jis/keyboard.json | 1 - keyboards/keychron/v2/jis_encoder/keyboard.json | 1 - keyboards/keychron/v3/ansi/keyboard.json | 1 - keyboards/keychron/v3/jis/keyboard.json | 1 - keyboards/keychron/v4/ansi/keyboard.json | 1 - keyboards/keychron/v4/iso/keyboard.json | 1 - keyboards/keychron/v7/ansi/keyboard.json | 1 - keyboards/keychron/v7/iso/keyboard.json | 1 - keyboards/keychron/v8/ansi/keyboard.json | 1 - keyboards/keychron/v8/ansi_encoder/keyboard.json | 1 - keyboards/keychron/v8/iso/keyboard.json | 1 - keyboards/keychron/v8/iso_encoder/keyboard.json | 1 - keyboards/keyhive/absinthe/keyboard.json | 1 - keyboards/keyhive/opus/keyboard.json | 1 - keyboards/keyhive/smallice/keyboard.json | 1 - keyboards/keyhive/southpole/keyboard.json | 1 - keyboards/keyhive/ut472/keyboard.json | 1 - keyboards/keyprez/bison/keyboard.json | 1 - keyboards/keyprez/corgi/keyboard.json | 1 - keyboards/keyprez/rhino/keyboard.json | 1 - keyboards/keyprez/unicorn/keyboard.json | 1 - keyboards/keyquest/enclave/keyboard.json | 1 - keyboards/keysofkings/twokey/keyboard.json | 1 - keyboards/keyspensory/kp60/keyboard.json | 1 - keyboards/keystonecaps/gameroyadvance/keyboard.json | 1 - keyboards/keyten/aperture/keyboard.json | 1 - keyboards/keyten/diablo/keyboard.json | 1 - keyboards/keyten/kt3700/keyboard.json | 1 - keyboards/keyten/kt60_m/keyboard.json | 1 - keyboards/keyten/lisa/keyboard.json | 1 - keyboards/kibou/fukuro/keyboard.json | 1 - keyboards/kibou/harbour/keyboard.json | 1 - keyboards/kibou/suisei/keyboard.json | 1 - keyboards/kibou/wendy/keyboard.json | 1 - keyboards/kibou/winter/keyboard.json | 1 - keyboards/kikkou/keyboard.json | 1 - keyboards/kikoslab/ellora65/keyboard.json | 1 - keyboards/kikoslab/kl90/keyboard.json | 1 - keyboards/kin80/info.json | 1 - keyboards/kindakeyboards/conone65/keyboard.json | 1 - keyboards/kinesis/alvicstep/keyboard.json | 1 - keyboards/kinesis/kint2pp/keyboard.json | 1 - keyboards/kinesis/kint36/keyboard.json | 1 - keyboards/kinesis/kint41/keyboard.json | 1 - keyboards/kinesis/kintlc/keyboard.json | 1 - keyboards/kinesis/kintwin/keyboard.json | 1 - keyboards/kinesis/nguyenvietyen/keyboard.json | 1 - keyboards/kinesis/stapelberg/keyboard.json | 1 - keyboards/kineticlabs/emu/hotswap/keyboard.json | 1 - keyboards/kineticlabs/emu/soldered/keyboard.json | 1 - keyboards/kingly_keys/ave/ortho/keyboard.json | 1 - keyboards/kingly_keys/ave/staggered/keyboard.json | 1 - keyboards/kingly_keys/little_foot/keyboard.json | 1 - keyboards/kingly_keys/romac/keyboard.json | 1 - keyboards/kingly_keys/romac_plus/keyboard.json | 1 - keyboards/kingly_keys/ropro/keyboard.json | 1 - keyboards/kingly_keys/soap/keyboard.json | 1 - keyboards/kira/kira80/keyboard.json | 1 - keyboards/kiserdesigns/madeline/keyboard.json | 1 - keyboards/kiwikeebs/macro/keyboard.json | 1 - keyboards/kiwikeebs/macro_v2/keyboard.json | 1 - keyboards/kiwikey/wanderland/keyboard.json | 1 - keyboards/kj_modify/rs40/keyboard.json | 1 - keyboards/kk/65/keyboard.json | 1 - keyboards/kkatano/bakeneko60/keyboard.json | 1 - keyboards/kkatano/bakeneko65/rev2/keyboard.json | 1 - keyboards/kkatano/bakeneko65/rev3/keyboard.json | 1 - keyboards/kopibeng/mnk60/keyboard.json | 1 - keyboards/kopibeng/mnk60_stm32/keyboard.json | 1 - keyboards/kopibeng/mnk65_stm32/keyboard.json | 1 - keyboards/kopibeng/tgr_lena/keyboard.json | 1 - keyboards/kopibeng/typ65/keyboard.json | 1 - keyboards/kopibeng/xt60/keyboard.json | 1 - keyboards/kopibeng/xt60_singa/keyboard.json | 1 - keyboards/kopibeng/xt65/keyboard.json | 1 - keyboards/kprepublic/bm16a/v1/keyboard.json | 1 - keyboards/kprepublic/bm16a/v2/keyboard.json | 1 - keyboards/kprepublic/bm16s/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm43hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm80hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm80v2/keyboard.json | 1 - keyboards/kprepublic/bm80v2_iso/keyboard.json | 1 - keyboards/kprepublic/bm980hsrgb/keyboard.json | 1 - keyboards/kprepublic/cospad/keyboard.json | 1 - keyboards/kprepublic/cstc40/info.json | 1 - keyboards/kprepublic/jj4x4/keyboard.json | 1 - keyboards/kradoindustries/kousa/keyboard.json | 1 - keyboards/kradoindustries/krado66/keyboard.json | 1 - keyboards/kradoindustries/promenade/keyboard.json | 1 - keyboards/kradoindustries/promenade_rp24s/keyboard.json | 1 - keyboards/kraken_jones/pteron56/keyboard.json | 1 - keyboards/ktec/daisy/keyboard.json | 1 - keyboards/ktec/staryu/keyboard.json | 1 - keyboards/kumaokobo/kudox_game/rev1/keyboard.json | 1 - keyboards/kumaokobo/kudox_game/rev2/keyboard.json | 1 - keyboards/kuro/kuro65/keyboard.json | 1 - keyboards/kwstudio/pisces/keyboard.json | 1 - keyboards/kwub/bloop/keyboard.json | 1 - keyboards/labbe/labbeminiv1/keyboard.json | 1 - keyboards/labyrinth75/keyboard.json | 1 - keyboards/laneware/lpad/keyboard.json | 1 - keyboards/laneware/lw67/keyboard.json | 1 - keyboards/laneware/lw75/keyboard.json | 1 - keyboards/laneware/macro1/keyboard.json | 1 - keyboards/laneware/raindrop/keyboard.json | 1 - keyboards/large_lad/keyboard.json | 1 - keyboards/laser_ninja/pumpkinpad/keyboard.json | 1 - keyboards/latincompass/latin17rgb/keyboard.json | 1 - keyboards/latincompass/latin60rgb/keyboard.json | 1 - keyboards/latincompass/latinpad/keyboard.json | 1 - keyboards/latincompass/latinpadble/keyboard.json | 1 - keyboards/lazydesigners/bolt/keyboard.json | 1 - keyboards/lazydesigners/cassette8/keyboard.json | 1 - keyboards/lazydesigners/dimpleplus/keyboard.json | 1 - keyboards/lazydesigners/the30/keyboard.json | 1 - keyboards/lazydesigners/the40/keyboard.json | 1 - keyboards/lazydesigners/the50/keyboard.json | 1 - keyboards/lazydesigners/the60/rev1/keyboard.json | 1 - keyboards/lazydesigners/the60/rev2/keyboard.json | 1 - keyboards/leafcutterlabs/bigknob/keyboard.json | 1 - keyboards/leeku/finger65/keyboard.json | 1 - keyboards/lendunistus/rpneko65/rev1/keyboard.json | 1 - keyboards/lfkeyboards/lfk87/info.json | 1 - keyboards/lfkeyboards/lfkpad/keyboard.json | 1 - keyboards/lgbtkl/keyboard.json | 1 - keyboards/linworks/dolice/keyboard.json | 1 - keyboards/linworks/em8/keyboard.json | 1 - keyboards/linworks/fave104/keyboard.json | 1 - keyboards/linworks/fave60/keyboard.json | 1 - keyboards/linworks/fave84h/keyboard.json | 1 - keyboards/linworks/fave87/keyboard.json | 1 - keyboards/linworks/whale75/keyboard.json | 1 - keyboards/littlealby/mute/keyboard.json | 1 - keyboards/lizard_trick/tenkey_plusplus/keyboard.json | 1 - keyboards/ll3macorn/bongopad/keyboard.json | 1 - keyboards/lm_keyboard/lm60n/keyboard.json | 1 - keyboards/longnald/corin/keyboard.json | 1 - keyboards/lostdotfish/rp2040_orbweaver/keyboard.json | 1 - keyboards/lxxt/keyboard.json | 1 - keyboards/lyso1/lefishe/keyboard.json | 1 - keyboards/m10a/keyboard.json | 1 - keyboards/machine_industries/m4_a/keyboard.json | 1 - keyboards/machkeyboards/mach3/keyboard.json | 1 - keyboards/macrocat/keyboard.json | 1 - keyboards/madjax_macropad/keyboard.json | 1 - keyboards/makeymakey/keyboard.json | 1 - keyboards/makrosu/keyboard.json | 1 - keyboards/malevolti/superlyra/rev1/keyboard.json | 1 - keyboards/manta60/keyboard.json | 1 - keyboards/manyboard/macro/keyboard.json | 1 - keyboards/maple_computing/6ball/keyboard.json | 1 - keyboards/maple_computing/the_ruler/keyboard.json | 1 - keyboards/mariorion_v25/prod/keyboard.json | 1 - keyboards/mariorion_v25/proto/keyboard.json | 1 - keyboards/marksard/leftover30/keyboard.json | 1 - keyboards/marksard/treadstone32/info.json | 1 - keyboards/matchstickworks/normiepad/keyboard.json | 1 - keyboards/matchstickworks/southpad/rev1/keyboard.json | 1 - keyboards/matchstickworks/southpad/rev2/keyboard.json | 1 - keyboards/matrix/cain_re/keyboard.json | 1 - keyboards/matrix/falcon/keyboard.json | 1 - keyboards/matrix/m12og/rev2/keyboard.json | 1 - keyboards/matrix/me/keyboard.json | 1 - keyboards/matthewdias/m3n3van/keyboard.json | 1 - keyboards/matthewdias/minim/keyboard.json | 1 - keyboards/matthewdias/model_v/keyboard.json | 1 - keyboards/matthewdias/txuu/keyboard.json | 1 - keyboards/maxipad/info.json | 1 - keyboards/mazestudio/jocker/keyboard.json | 1 - keyboards/mb44/keyboard.json | 1 - keyboards/mc_76k/keyboard.json | 1 - keyboards/mechanickeys/miniashen40/keyboard.json | 1 - keyboards/mechanickeys/undead60m/keyboard.json | 1 - keyboards/mechbrewery/mb65h/keyboard.json | 1 - keyboards/mechbrewery/mb65s/keyboard.json | 1 - keyboards/mechkeys/acr60/keyboard.json | 1 - keyboards/mechkeys/alu84/keyboard.json | 1 - keyboards/mechkeys/espectro/keyboard.json | 1 - keyboards/mechkeys/mk60/keyboard.json | 1 - keyboards/mechllama/g35/info.json | 1 - keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json | 1 - .../mechlovin/adelais/standard_led/avr/rev1/keyboard.json | 1 - keyboards/mechlovin/infinityce/keyboard.json | 1 - keyboards/mechlovin/kanu/keyboard.json | 1 - keyboards/mechlovin/kay60/keyboard.json | 1 - keyboards/mechlovin/kay65/keyboard.json | 1 - keyboards/mechlovin/pisces/keyboard.json | 1 - keyboards/mechstudio/dawn/keyboard.json | 1 - keyboards/mechwild/mercutio/keyboard.json | 1 - keyboards/mechwild/murphpad/keyboard.json | 1 - keyboards/mechwild/obe/info.json | 1 - keyboards/mechwild/sugarglider/f401/keyboard.json | 1 - keyboards/mechwild/sugarglider/f411/keyboard.json | 1 - keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json | 1 - keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json | 1 - keyboards/mehkee96/keyboard.json | 1 - keyboards/meletrix/zoom75/keyboard.json | 1 - keyboards/meletrix/zoom98/keyboard.json | 1 - keyboards/melgeek/mach80/rev1/keyboard.json | 1 - keyboards/melgeek/mach80/rev2/keyboard.json | 1 - keyboards/melgeek/mj61/rev1/keyboard.json | 1 - keyboards/melgeek/mj61/rev2/keyboard.json | 1 - keyboards/melgeek/mj63/rev1/keyboard.json | 1 - keyboards/melgeek/mj63/rev2/keyboard.json | 1 - keyboards/melgeek/mj64/rev1/keyboard.json | 1 - keyboards/melgeek/mj64/rev2/keyboard.json | 1 - keyboards/melgeek/mj64/rev3/keyboard.json | 1 - keyboards/melgeek/mj6xy/rev3/keyboard.json | 1 - keyboards/melgeek/mojo68/rev1/keyboard.json | 1 - keyboards/melgeek/mojo75/rev1/keyboard.json | 1 - keyboards/melgeek/tegic/rev1/keyboard.json | 1 - keyboards/melgeek/z70ultra/rev1/keyboard.json | 1 - keyboards/meow48/keyboard.json | 1 - keyboards/meow65/keyboard.json | 1 - keyboards/merge/iso_macro/keyboard.json | 1 - keyboards/merge/uc1/keyboard.json | 1 - keyboards/merge/um70/keyboard.json | 1 - keyboards/merge/um80/keyboard.json | 1 - keyboards/mesa/mesa_tkl/keyboard.json | 1 - keyboards/meson/keyboard.json | 1 - keyboards/metamechs/timberwolf/keyboard.json | 1 - keyboards/miiiw/blackio83/rev_0100/keyboard.json | 1 - keyboards/mikeneko65/keyboard.json | 1 - keyboards/miller/gm862/keyboard.json | 1 - keyboards/millipad/keyboard.json | 1 - keyboards/mincedshon/ecila/keyboard.json | 1 - keyboards/mini_elixivy/keyboard.json | 1 - keyboards/mini_ten_key_plus/keyboard.json | 1 - keyboards/minimacro5/keyboard.json | 1 - keyboards/minimon/bartlesplit/keyboard.json | 1 - keyboards/minimon/index_tab/keyboard.json | 1 - keyboards/mint60/keyboard.json | 1 - keyboards/misonoworks/chocolatebar/keyboard.json | 1 - keyboards/misonoworks/karina/keyboard.json | 1 - keyboards/misterknife/knife66/keyboard.json | 1 - keyboards/misterknife/knife66_iso/keyboard.json | 1 - keyboards/miuni32/keyboard.json | 1 - keyboards/mk65/keyboard.json | 1 - keyboards/ml/gas75/keyboard.json | 1 - keyboards/mlego/m48/rev1/keyboard.json | 1 - keyboards/mlego/m60/rev1/keyboard.json | 1 - keyboards/mlego/m65/rev1/keyboard.json | 1 - keyboards/mlego/m65/rev2/keyboard.json | 1 - keyboards/mlego/m65/rev3/keyboard.json | 1 - keyboards/mmkzoo65/keyboard.json | 1 - keyboards/mntre/keyboard.json | 1 - keyboards/mode/m256ws/keyboard.json | 1 - keyboards/mode/m60h/keyboard.json | 1 - keyboards/mode/m60h_f/keyboard.json | 1 - keyboards/mode/m60s/keyboard.json | 1 - keyboards/mode/m65ha_alpha/keyboard.json | 1 - keyboards/mode/m65hi_alpha/keyboard.json | 1 - keyboards/mode/m65s/keyboard.json | 1 - keyboards/mode/m75h/keyboard.json | 1 - keyboards/mode/m75s/keyboard.json | 1 - keyboards/mode/m80v1/m80h/keyboard.json | 1 - keyboards/mode/m80v1/m80s/keyboard.json | 1 - keyboards/mode/m80v2/m80v2h/keyboard.json | 1 - keyboards/mode/m80v2/m80v2s/keyboard.json | 1 - keyboards/mokey/ginkgo65/keyboard.json | 1 - keyboards/mokey/ginkgo65hot/keyboard.json | 1 - keyboards/mokey/ibis80/keyboard.json | 1 - keyboards/mokey/luckycat70/keyboard.json | 1 - keyboards/mokey/mokey63/keyboard.json | 1 - keyboards/mokey/mokey64/keyboard.json | 1 - keyboards/mokey/xox70/keyboard.json | 1 - keyboards/mokey/xox70hot/keyboard.json | 1 - keyboards/momoka_ergo/keyboard.json | 1 - keyboards/momokai/aurora/keyboard.json | 1 - keyboards/momokai/tap_duo/keyboard.json | 1 - keyboards/momokai/tap_trio/keyboard.json | 1 - keyboards/monoflex60/keyboard.json | 1 - keyboards/monsgeek/m1/keyboard.json | 1 - keyboards/monsgeek/m3/keyboard.json | 1 - keyboards/monsgeek/m5/keyboard.json | 1 - keyboards/monsgeek/m6/keyboard.json | 1 - keyboards/monstargear/xo87/rgb/keyboard.json | 1 - keyboards/monstargear/xo87/solderable/keyboard.json | 1 - keyboards/moondrop/dash75/info.json | 1 - keyboards/mountainmechdesigns/teton_78/keyboard.json | 1 - keyboards/ms_sculpt/keyboard.json | 1 - keyboards/mss_studio/m63_rgb/keyboard.json | 1 - keyboards/mss_studio/m64_rgb/keyboard.json | 1 - keyboards/mt/blocked65/keyboard.json | 1 - keyboards/mt/mt40/keyboard.json | 1 - keyboards/mt/mt64rgb/keyboard.json | 1 - keyboards/mt/mt84/keyboard.json | 1 - keyboards/mt/mt980/keyboard.json | 1 - keyboards/mtbkeys/mtb60/hotswap/keyboard.json | 1 - keyboards/mtbkeys/mtb60/solder/keyboard.json | 1 - keyboards/murcielago/rev1/keyboard.json | 1 - keyboards/mwstudio/alicekk/keyboard.json | 1 - keyboards/mwstudio/mw65_black/keyboard.json | 1 - keyboards/mwstudio/mw65_rgb/keyboard.json | 1 - keyboards/mwstudio/mw660/keyboard.json | 1 - keyboards/mwstudio/mw75/keyboard.json | 1 - keyboards/mwstudio/mw75r2/keyboard.json | 1 - keyboards/mwstudio/mw80/keyboard.json | 1 - keyboards/mxss/keyboard.json | 1 - keyboards/mysticworks/wyvern/keyboard.json | 1 - keyboards/nacly/sodium42/keyboard.json | 1 - keyboards/nacly/sodium50/keyboard.json | 1 - keyboards/nacly/sodium62/keyboard.json | 1 - keyboards/nacly/splitreus62/keyboard.json | 1 - keyboards/navi60/keyboard.json | 1 - keyboards/ncc1701kb/keyboard.json | 1 - keyboards/neito/keyboard.json | 1 - keyboards/neokeys/g67/element_hs/keyboard.json | 1 - keyboards/neokeys/g67/hotswap/keyboard.json | 1 - keyboards/neokeys/g67/soldered/keyboard.json | 1 - keyboards/neson_design/nico/keyboard.json | 1 - keyboards/newgame40/keyboard.json | 1 - keyboards/nibiria/stream15/keyboard.json | 1 - keyboards/nightingale_studios/hailey/keyboard.json | 1 - keyboards/nightly_boards/adellein/keyboard.json | 1 - keyboards/nightly_boards/alter/rev1/keyboard.json | 1 - keyboards/nightly_boards/alter_lite/keyboard.json | 1 - keyboards/nightly_boards/conde60/keyboard.json | 1 - keyboards/nightly_boards/daily60/keyboard.json | 1 - keyboards/nightly_boards/jisoo/keyboard.json | 1 - keyboards/nightly_boards/n2/keyboard.json | 1 - keyboards/nightly_boards/n60_s/keyboard.json | 1 - keyboards/nightly_boards/n87/keyboard.json | 1 - keyboards/nightly_boards/n9/keyboard.json | 1 - keyboards/nightly_boards/octopad/keyboard.json | 1 - keyboards/nightly_boards/octopadplus/keyboard.json | 1 - keyboards/nightly_boards/paraluman/keyboard.json | 1 - keyboards/nightly_boards/ph_arisu/keyboard.json | 1 - keyboards/nimrod/keyboard.json | 1 - keyboards/ning/tiny_board/tb16_rgb/keyboard.json | 1 - keyboards/nix_studio/lilith/keyboard.json | 1 - keyboards/nix_studio/oxalys80/keyboard.json | 1 - keyboards/nixkeyboards/day_off/keyboard.json | 1 - keyboards/nopunin10did/jabberwocky/v1/keyboard.json | 1 - keyboards/nopunin10did/jabberwocky/v2/keyboard.json | 1 - keyboards/nopunin10did/kastenwagen1840/keyboard.json | 1 - keyboards/nopunin10did/kastenwagen48/keyboard.json | 1 - keyboards/nopunin10did/railroad/rev0/keyboard.json | 1 - keyboards/nopunin10did/styrkatmel/keyboard.json | 1 - keyboards/novelkeys/nk1/keyboard.json | 1 - keyboards/novelkeys/nk_classic_tkl/keyboard.json | 1 - keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json | 1 - keyboards/novelkeys/nk_plus/keyboard.json | 1 - keyboards/noxary/268_2/keyboard.json | 1 - keyboards/noxary/268_2_rgb/keyboard.json | 1 - keyboards/noxary/378/keyboard.json | 1 - keyboards/noxary/valhalla/keyboard.json | 1 - keyboards/noxary/valhalla_v2/keyboard.json | 1 - keyboards/noxary/vulcan/keyboard.json | 1 - keyboards/noxary/x268/keyboard.json | 1 - keyboards/np12/keyboard.json | 1 - keyboards/null/st110r2/keyboard.json | 1 - keyboards/nyhxis/nfr_70/keyboard.json | 1 - keyboards/obosob/arch_36/keyboard.json | 1 - keyboards/obosob/steal_this_keyboard/keyboard.json | 1 - keyboards/ocean/addon/keyboard.json | 1 - keyboards/ocean/gin_v2/keyboard.json | 1 - keyboards/ocean/slamz/keyboard.json | 1 - keyboards/ocean/stealth/keyboard.json | 1 - keyboards/ocean/sus/keyboard.json | 1 - keyboards/ocean/wang_ergo/keyboard.json | 1 - keyboards/ocean/wang_v2/keyboard.json | 1 - keyboards/ocean/yuri/keyboard.json | 1 - keyboards/odelia/keyboard.json | 1 - keyboards/ogre/ergo_single/keyboard.json | 1 - keyboards/ogre/ergo_split/keyboard.json | 1 - keyboards/ok60/keyboard.json | 1 - keyboards/onekeyco/dango40/keyboard.json | 1 - keyboards/orange75/keyboard.json | 1 - keyboards/org60/keyboard.json | 1 - keyboards/ortho5by12/keyboard.json | 1 - keyboards/orthograph/keyboard.json | 1 - keyboards/owlab/jelly_epoch/hotswap/keyboard.json | 1 - keyboards/owlab/jelly_epoch/soldered/keyboard.json | 1 - keyboards/owlab/spring/keyboard.json | 1 - keyboards/owlab/suit80/ansi/keyboard.json | 1 - keyboards/owlab/suit80/iso/keyboard.json | 1 - keyboards/owlab/voice65/hotswap/keyboard.json | 1 - keyboards/owlab/voice65/soldered/keyboard.json | 1 - keyboards/p3d/glitch/keyboard.json | 1 - keyboards/p3d/q4z/keyboard.json | 1 - keyboards/p3d/spacey/keyboard.json | 1 - keyboards/p3d/synapse/keyboard.json | 1 - keyboards/p3d/tw40/keyboard.json | 1 - keyboards/pabile/p18/keyboard.json | 1 - keyboards/pabile/p20/ver1/keyboard.json | 1 - keyboards/pabile/p20/ver2/keyboard.json | 1 - keyboards/pabile/p40/keyboard.json | 1 - keyboards/pabile/p40_ortho/keyboard.json | 1 - keyboards/pabile/p42/keyboard.json | 1 - keyboards/panc40/keyboard.json | 1 - keyboards/panc60/keyboard.json | 1 - keyboards/pangorin/tan67/keyboard.json | 1 - keyboards/papercranekeyboards/gerald65/keyboard.json | 1 - keyboards/paprikman/albacore/keyboard.json | 1 - keyboards/parallel/parallel_65/hotswap/keyboard.json | 1 - keyboards/parallel/parallel_65/soldered/keyboard.json | 1 - keyboards/pauperboards/brick/keyboard.json | 1 - keyboards/pearl/keyboard.json | 1 - keyboards/pearlboards/pandora/keyboard.json | 1 - keyboards/pearlboards/zeuspad/keyboard.json | 1 - keyboards/peej/lumberjack/keyboard.json | 1 - keyboards/peej/tripel/info.json | 1 - keyboards/pegasus/keyboard.json | 1 - keyboards/percent/canoe/keyboard.json | 1 - keyboards/percent/skog/keyboard.json | 1 - keyboards/percent/skog_lite/keyboard.json | 1 - keyboards/phantom/keyboard.json | 1 - keyboards/phdesign/phac/keyboard.json | 1 - keyboards/phrygian/ph100/keyboard.json | 1 - keyboards/piantoruv44/keyboard.json | 1 - keyboards/pica40/rev1/keyboard.json | 1 - keyboards/pica40/rev2/keyboard.json | 1 - keyboards/picolab/frusta_fundamental/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev1/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/left/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/right/keyboard.json | 1 - keyboards/pimentoso/touhoupad/keyboard.json | 1 - keyboards/pisces/keyboard.json | 1 - keyboards/pixelspace/capsule65i/keyboard.json | 1 - keyboards/pizzakeyboards/pizza65/keyboard.json | 1 - keyboards/pjb/eros/keyboard.json | 1 - keyboards/pkb65/keyboard.json | 1 - keyboards/playkbtw/ca66/keyboard.json | 1 - keyboards/playkbtw/helen80/keyboard.json | 1 - keyboards/playkbtw/pk60/keyboard.json | 1 - keyboards/playkbtw/pk64rgb/keyboard.json | 1 - keyboards/pluckey/keyboard.json | 1 - keyboards/plum47/keyboard.json | 1 - keyboards/plume/plume65/keyboard.json | 1 - keyboards/plut0nium/0x3e/keyboard.json | 1 - keyboards/plx/keyboard.json | 1 - keyboards/plywrks/ahgase/keyboard.json | 1 - keyboards/plywrks/allaro/keyboard.json | 1 - keyboards/plywrks/ji_eun/keyboard.json | 1 - keyboards/plywrks/lune/keyboard.json | 1 - keyboards/plywrks/ply8x/solder/keyboard.json | 1 - keyboards/pmk/posey_split/v4/keyboard.json | 1 - keyboards/pmk/posey_split/v5/keyboard.json | 1 - keyboards/pohjolaworks/louhi/keyboard.json | 1 - keyboards/poker87c/keyboard.json | 1 - keyboards/poker87d/keyboard.json | 1 - keyboards/polilla/rev1/keyboard.json | 1 - keyboards/polycarbdiet/s20/keyboard.json | 1 - keyboards/pom_keyboards/tnln95/keyboard.json | 1 - keyboards/portal_66/hotswap/keyboard.json | 1 - keyboards/portal_66/soldered/keyboard.json | 1 - keyboards/pos78/keyboard.json | 1 - keyboards/preonic/rev1/keyboard.json | 1 - keyboards/primekb/prime_e/info.json | 1 - keyboards/primekb/prime_l/info.json | 1 - keyboards/primekb/prime_m/keyboard.json | 1 - keyboards/primekb/prime_o/keyboard.json | 1 - keyboards/primekb/prime_r/keyboard.json | 1 - keyboards/printedpad/keyboard.json | 1 - keyboards/projectcain/vault45/keyboard.json | 1 - keyboards/projectd/65/projectd_65_ansi/keyboard.json | 1 - keyboards/projectd/75/ansi/keyboard.json | 1 - keyboards/projectd/75/iso/keyboard.json | 1 - keyboards/projectkb/signature65/keyboard.json | 1 - keyboards/prototypist/allison/keyboard.json | 1 - keyboards/prototypist/allison_numpad/keyboard.json | 1 - keyboards/prototypist/j01/keyboard.json | 1 - keyboards/prototypist/pt60/keyboard.json | 1 - keyboards/prototypist/pt80/keyboard.json | 1 - keyboards/protozoa/event_horizon/keyboard.json | 1 - keyboards/psuieee/pluto12/keyboard.json | 1 - keyboards/pteron36/keyboard.json | 1 - keyboards/pteropus/keyboard.json | 1 - keyboards/puck/keyboard.json | 1 - keyboards/purin/keyboard.json | 1 - keyboards/qck75/v1/keyboard.json | 1 - keyboards/qpockets/eggman/keyboard.json | 1 - keyboards/qpockets/wanten/keyboard.json | 1 - keyboards/quad_h/lb75/keyboard.json | 1 - keyboards/quarkeys/z40/keyboard.json | 1 - keyboards/quarkeys/z60/hotswap/keyboard.json | 1 - keyboards/quarkeys/z60/solder/keyboard.json | 1 - keyboards/quarkeys/z67/hotswap/keyboard.json | 1 - keyboards/quarkeys/z67/solder/keyboard.json | 1 - keyboards/qvex/lynepad/keyboard.json | 1 - keyboards/qwertlekeys/calice/keyboard.json | 1 - keyboards/qwertykeys/qk65/hotswap/keyboard.json | 1 - keyboards/qwertykeys/qk65/solder/keyboard.json | 1 - keyboards/rad/keyboard.json | 1 - keyboards/rainkeebs/delilah/keyboard.json | 1 - keyboards/rainkeebs/rainkeeb/keyboard.json | 1 - keyboards/rainkeebs/yasui/keyboard.json | 1 - keyboards/ramlord/witf/keyboard.json | 1 - keyboards/rart/rart45/keyboard.json | 1 - keyboards/rart/rart4x4/keyboard.json | 1 - keyboards/rart/rart67m/keyboard.json | 1 - keyboards/rart/rart75m/keyboard.json | 1 - keyboards/rart/rartand/keyboard.json | 1 - keyboards/rart/rartlite/keyboard.json | 1 - keyboards/rart/rartpad/keyboard.json | 1 - keyboards/rate/pistachio_mp/keyboard.json | 1 - keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json | 1 - keyboards/rationalist/ratio65_solder/rev_a/keyboard.json | 1 - keyboards/recompile_keys/cocoa40/keyboard.json | 1 - keyboards/recompile_keys/mio/keyboard.json | 1 - keyboards/rect44/keyboard.json | 1 - keyboards/redox/rev1/info.json | 1 - keyboards/redscarf_i/keyboard.json | 1 - keyboards/retro_75/keyboard.json | 1 - keyboards/reviung/reviung33/keyboard.json | 1 - keyboards/reviung/reviung46/keyboard.json | 1 - keyboards/reviung/reviung5/keyboard.json | 1 - keyboards/reviung/reviung53/keyboard.json | 1 - keyboards/rico/phoenix_project_no1/keyboard.json | 1 - keyboards/rmi_kb/equator/keyboard.json | 1 - keyboards/rmi_kb/squishyfrl/keyboard.json | 1 - keyboards/rmi_kb/squishytkl/keyboard.json | 1 - keyboards/rmi_kb/tkl_ff/info.json | 1 - keyboards/rmkeebs/rm_fullsize/keyboard.json | 1 - keyboards/rmkeebs/rm_numpad/keyboard.json | 1 - keyboards/rose75/keyboard.json | 1 - keyboards/roseslite/keyboard.json | 1 - keyboards/rot13labs/h4ckb0ard/keyboard.json | 1 - keyboards/rot13labs/rotc0n/keyboard.json | 1 - keyboards/rot13labs/veilid_sao/keyboard.json | 1 - keyboards/rotr/keyboard.json | 1 - keyboards/runes/vaengr/keyboard.json | 1 - keyboards/ryanbaekr/rb1/keyboard.json | 1 - keyboards/ryanbaekr/rb18/keyboard.json | 1 - keyboards/ryanbaekr/rb69/keyboard.json | 1 - keyboards/ryanbaekr/rb87/keyboard.json | 1 - keyboards/ryloo_studio/m0110/keyboard.json | 1 - keyboards/s_ol/0xc_pad/keyboard.json | 1 - keyboards/salane/starryfrl/keyboard.json | 1 - keyboards/salicylic_acid3/7splus/keyboard.json | 1 - keyboards/salicylic_acid3/ajisai74/keyboard.json | 1 - keyboards/salicylic_acid3/ergoarrows/keyboard.json | 1 - keyboards/salicylic_acid3/guide68/keyboard.json | 1 - keyboards/salicylic_acid3/nafuda/keyboard.json | 1 - keyboards/salicylic_acid3/nknl7en/keyboard.json | 1 - keyboards/salicylic_acid3/nknl7jp/keyboard.json | 1 - keyboards/sam/s80/keyboard.json | 1 - keyboards/sam/sg81m/keyboard.json | 1 - keyboards/sanctified/dystopia/keyboard.json | 1 - keyboards/sandwich/keeb68/keyboard.json | 1 - keyboards/sapuseven/macropad12/keyboard.json | 1 - keyboards/sauce/mild/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json | 1 - keyboards/sawnsprojects/plaque80/keyboard.json | 1 - keyboards/sawnsprojects/re65/keyboard.json | 1 - keyboards/sawnsprojects/satxri6key/keyboard.json | 1 - keyboards/scatter42/keyboard.json | 1 - keyboards/scottokeebs/scotto34/keyboard.json | 1 - keyboards/scottokeebs/scotto69/keyboard.json | 1 - keyboards/scottokeebs/scottowing/keyboard.json | 1 - keyboards/sendyyeah/75pixels/keyboard.json | 1 - keyboards/sendyyeah/bevi/keyboard.json | 1 - keyboards/sendyyeah/pix/keyboard.json | 1 - keyboards/senselessclay/ck60/keyboard.json | 1 - keyboards/senselessclay/ck65/keyboard.json | 1 - keyboards/senselessclay/gos65/keyboard.json | 1 - keyboards/senselessclay/had60/keyboard.json | 1 - keyboards/sentraq/s60_x/default/keyboard.json | 1 - keyboards/sentraq/s60_x/rgb/keyboard.json | 1 - keyboards/sentraq/s65_plus/keyboard.json | 1 - keyboards/sentraq/s65_x/keyboard.json | 1 - keyboards/sets3n/kk980/keyboard.json | 1 - keyboards/sha/keyboard.json | 1 - keyboards/shambles/keyboard.json | 1 - keyboards/shandoncodes/flygone60/rev3/keyboard.json | 1 - keyboards/shandoncodes/mino/hotswap/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/hotswap/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/soldered/keyboard.json | 1 - keyboards/shandoncodes/riot_pad/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s2/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s3/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s4/keyboard.json | 1 - keyboards/shk9/keyboard.json | 1 - keyboards/shoc/keyboard.json | 1 - keyboards/sidderskb/majbritt/rev2/keyboard.json | 1 - keyboards/singa/keyboard.json | 1 - keyboards/skeletn87/hotswap/keyboard.json | 1 - keyboards/skeletn87/soldered/keyboard.json | 1 - keyboards/skeletonkbd/frost68/keyboard.json | 1 - keyboards/skeletonkbd/skeletonnumpad/keyboard.json | 1 - keyboards/skme/zeno/keyboard.json | 1 - keyboards/skmt/15k/keyboard.json | 1 - keyboards/skyloong/dt40/keyboard.json | 1 - keyboards/skyloong/gk61/pro/keyboard.json | 1 - keyboards/skyloong/gk61/pro_48/keyboard.json | 1 - keyboards/skyloong/gk61/v1/keyboard.json | 1 - keyboards/skyloong/qk21/v1/keyboard.json | 1 - keyboards/slz40/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2h/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2s/keyboard.json | 1 - keyboards/smithrune/magnus/m75h/keyboard.json | 1 - keyboards/smithrune/magnus/m75s/keyboard.json | 1 - keyboards/smk60/keyboard.json | 1 - keyboards/smoll/lefty/info.json | 1 - keyboards/sneakbox/aliceclone/keyboard.json | 1 - keyboards/sneakbox/aliceclonergb/keyboard.json | 1 - keyboards/sneakbox/ava/keyboard.json | 1 - keyboards/sneakbox/disarray/ortho/keyboard.json | 1 - keyboards/sneakbox/disarray/staggered/keyboard.json | 1 - keyboards/soup10/keyboard.json | 1 - keyboards/sowbug/68keys/keyboard.json | 1 - keyboards/sowbug/ansi_tkl/keyboard.json | 1 - keyboards/soy20/keyboard.json | 1 - keyboards/spaceholdings/nebula12b/keyboard.json | 1 - keyboards/spaceholdings/nebula68b/info.json | 1 - keyboards/sparrow62/keyboard.json | 1 - keyboards/splitish/keyboard.json | 1 - keyboards/splitography/keyboard.json | 1 - keyboards/sporewoh/banime40/keyboard.json | 1 - keyboards/star75/keyboard.json | 1 - keyboards/stello65/beta/keyboard.json | 1 - keyboards/stello65/hs_rev1/keyboard.json | 1 - keyboards/stello65/sl_rev1/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/usb_c/keyboard.json | 1 - keyboards/sthlmkb/lagom/keyboard.json | 1 - keyboards/sthlmkb/litl/keyboard.json | 1 - keyboards/stratos/keyboard.json | 1 - keyboards/strech/soulstone/keyboard.json | 1 - keyboards/stront/keyboard.json | 1 - keyboards/studiokestra/bourgeau/keyboard.json | 1 - keyboards/studiokestra/cascade/keyboard.json | 1 - keyboards/studiokestra/fairholme/keyboard.json | 1 - keyboards/studiokestra/frl84/keyboard.json | 1 - keyboards/studiokestra/galatea/rev1/keyboard.json | 1 - keyboards/studiokestra/galatea/rev2/keyboard.json | 1 - keyboards/studiokestra/galatea/rev3/keyboard.json | 1 - keyboards/studiokestra/line_friends_tkl/keyboard.json | 1 - keyboards/subatomic/keyboard.json | 1 - keyboards/subrezon/la_nc/keyboard.json | 1 - keyboards/subrezon/lancer/keyboard.json | 1 - keyboards/suikagiken/suika15tone/keyboard.json | 1 - keyboards/suikagiken/suika27melo/keyboard.json | 1 - keyboards/suikagiken/suika83opti/keyboard.json | 1 - keyboards/suikagiken/suika85ergo/keyboard.json | 1 - keyboards/supersplit/keyboard.json | 1 - keyboards/superuser/ext/keyboard.json | 1 - keyboards/superuser/frl/keyboard.json | 1 - keyboards/superuser/tkl/keyboard.json | 1 - keyboards/swiftrax/retropad/keyboard.json | 1 - keyboards/swiss/keyboard.json | 1 - keyboards/switchplate/southpaw_fullsize/keyboard.json | 1 - keyboards/switchplate/switchplate910/keyboard.json | 1 - keyboards/synthandkeys/bento_box/keyboard.json | 1 - keyboards/synthandkeys/the_debit_card/keyboard.json | 1 - keyboards/synthlabs/060/keyboard.json | 1 - keyboards/synthlabs/065/keyboard.json | 1 - keyboards/synthlabs/solo/keyboard.json | 1 - keyboards/tacworks/tac_k1/keyboard.json | 1 - keyboards/takashicompany/baumkuchen/keyboard.json | 1 - keyboards/takashicompany/center_enter/keyboard.json | 1 - keyboards/takashicompany/ejectix/keyboard.json | 1 - keyboards/takashicompany/endzone34/keyboard.json | 1 - keyboards/takashicompany/ergomirage/keyboard.json | 1 - keyboards/takashicompany/goat51/keyboard.json | 1 - keyboards/takashicompany/jourkey/keyboard.json | 1 - keyboards/takashicompany/klec_01/keyboard.json | 1 - keyboards/takashicompany/klec_02/keyboard.json | 1 - keyboards/takashicompany/minidivide/keyboard.json | 1 - keyboards/takashicompany/minidivide_max/keyboard.json | 1 - keyboards/takashicompany/palmslave/keyboard.json | 1 - keyboards/takashicompany/qoolee/keyboard.json | 1 - keyboards/takashicompany/radialex/keyboard.json | 1 - keyboards/takashicompany/rookey/keyboard.json | 1 - keyboards/takashicompany/tightwriter/keyboard.json | 1 - keyboards/taleguers/taleguers75/keyboard.json | 1 - keyboards/tanuki/keyboard.json | 1 - keyboards/teahouse/ayleen/keyboard.json | 1 - keyboards/team0110/p1800fl/keyboard.json | 1 - keyboards/teleport/native/info.json | 1 - keyboards/teleport/numpad/keyboard.json | 1 - keyboards/teleport/tkl/keyboard.json | 1 - keyboards/tempo_turtle/bradpad/keyboard.json | 1 - keyboards/tender/macrowo_pad/keyboard.json | 1 - keyboards/tenki/keyboard.json | 1 - keyboards/terrazzo/keyboard.json | 1 - keyboards/tetris/keyboard.json | 1 - keyboards/tg4x/keyboard.json | 1 - keyboards/tgr/910/keyboard.json | 1 - keyboards/tgr/910ce/keyboard.json | 1 - keyboards/tgr/alice/keyboard.json | 1 - keyboards/tgr/jane/v2/keyboard.json | 1 - keyboards/tgr/jane/v2ce/keyboard.json | 1 - keyboards/tgr/tris/keyboard.json | 1 - keyboards/the_royal/liminal/keyboard.json | 1 - keyboards/the_royal/schwann/keyboard.json | 1 - keyboards/themadnoodle/ncc1701kb/v2/keyboard.json | 1 - keyboards/themadnoodle/noodlepad/info.json | 1 - keyboards/themadnoodle/noodlepad_micro/keyboard.json | 1 - keyboards/themadnoodle/udon13/keyboard.json | 1 - keyboards/theone/keyboard.json | 1 - keyboards/thepanduuh/degenpad/keyboard.json | 1 - keyboards/thevankeyboards/jetvan/keyboard.json | 1 - keyboards/thevankeyboards/minivan/keyboard.json | 1 - keyboards/thevankeyboards/roadkit/keyboard.json | 1 - keyboards/tkc/california/keyboard.json | 1 - keyboards/tkc/candybar/lefty/keyboard.json | 1 - keyboards/tkc/candybar/lefty_r3/keyboard.json | 1 - keyboards/tkc/candybar/righty/keyboard.json | 1 - keyboards/tkc/candybar/righty_r3/keyboard.json | 1 - keyboards/tkc/godspeed75/keyboard.json | 1 - keyboards/tkc/portico68v2/keyboard.json | 1 - keyboards/tkc/tkc1800/keyboard.json | 1 - keyboards/tkc/tkl_ab87/keyboard.json | 1 - keyboards/tmo50/keyboard.json | 1 - keyboards/toad/keyboard.json | 1 - keyboards/toffee_studio/blueberry/keyboard.json | 1 - keyboards/tokyokeyboard/tokyo60/keyboard.json | 1 - keyboards/tominabox1/adalyn/keyboard.json | 1 - keyboards/tominabox1/bigboy/keyboard.json | 1 - keyboards/tominabox1/qaz/keyboard.json | 1 - keyboards/tr60w/keyboard.json | 1 - keyboards/trainpad/keyboard.json | 1 - keyboards/trashman/ketch/keyboard.json | 1 - keyboards/treasure/type9s2/keyboard.json | 1 - keyboards/treasure/type9s3/keyboard.json | 1 - keyboards/trkeyboards/trk1/keyboard.json | 1 - keyboards/trnthsn/e8ghty/info.json | 1 - keyboards/trnthsn/e8ghtyneo/info.json | 1 - keyboards/trnthsn/s6xty/keyboard.json | 1 - keyboards/trnthsn/s6xty5neor2/info.json | 1 - keyboards/trojan_pinata/model_b/rev0/keyboard.json | 1 - keyboards/tunks/ergo33/keyboard.json | 1 - keyboards/tweetydabird/lbs4/keyboard.json | 1 - keyboards/tweetydabird/lbs6/keyboard.json | 1 - keyboards/tweetydabird/lotus58/info.json | 1 - keyboards/ubest/vn/keyboard.json | 1 - keyboards/uk78/keyboard.json | 1 - keyboards/ungodly/nines/keyboard.json | 1 - keyboards/unikeyboard/diverge3/keyboard.json | 1 - keyboards/unikeyboard/divergetm2/keyboard.json | 1 - keyboards/unikeyboard/felix/keyboard.json | 1 - keyboards/unikorn/keyboard.json | 1 - keyboards/utd80/keyboard.json | 1 - keyboards/v60_type_r/keyboard.json | 1 - keyboards/vagrant_10/keyboard.json | 1 - keyboards/vertex/angler2/keyboard.json | 1 - keyboards/vertex/cycle7/keyboard.json | 1 - keyboards/vertex/cycle8/keyboard.json | 1 - keyboards/viendi8l/keyboard.json | 1 - keyboards/viktus/at101_bh/keyboard.json | 1 - keyboards/viktus/minne/keyboard.json | 1 - keyboards/viktus/minne_topre/keyboard.json | 1 - keyboards/viktus/omnikey_bh/keyboard.json | 1 - keyboards/viktus/osav2/keyboard.json | 1 - keyboards/viktus/osav2_numpad/keyboard.json | 1 - keyboards/viktus/osav2_numpad_topre/keyboard.json | 1 - keyboards/viktus/osav2_topre/keyboard.json | 1 - keyboards/viktus/smolka/keyboard.json | 1 - keyboards/viktus/sp111_v2/keyboard.json | 1 - keyboards/viktus/sp_mini/keyboard.json | 1 - keyboards/viktus/styrka/keyboard.json | 1 - keyboards/viktus/styrka_topre/keyboard.json | 1 - keyboards/viktus/vkr94/keyboard.json | 1 - keyboards/viktus/z150_bh/keyboard.json | 1 - keyboards/vinhcatba/uncertainty/keyboard.json | 1 - keyboards/vitamins_included/info.json | 1 - keyboards/void/voidhhkb_hotswap/keyboard.json | 1 - keyboards/vt40/keyboard.json | 1 - keyboards/walletburner/cajal/keyboard.json | 1 - keyboards/walletburner/neuron/keyboard.json | 1 - keyboards/wavtype/foundation/keyboard.json | 1 - keyboards/wavtype/p01_ultra/keyboard.json | 1 - keyboards/weirdo/geminate60/keyboard.json | 1 - keyboards/weirdo/kelowna/rgb64/keyboard.json | 1 - keyboards/weirdo/ls_60/keyboard.json | 1 - keyboards/weirdo/naiping/np64/keyboard.json | 1 - keyboards/weirdo/naiping/nphhkb/keyboard.json | 1 - keyboards/weirdo/naiping/npminila/keyboard.json | 1 - keyboards/wekey/polaris/keyboard.json | 1 - keyboards/werk_technica/one/keyboard.json | 1 - keyboards/westfoxtrot/aanzee/keyboard.json | 1 - keyboards/westfoxtrot/cyclops/keyboard.json | 1 - keyboards/westfoxtrot/cypher/rev1/keyboard.json | 1 - keyboards/westfoxtrot/cypher/rev5/keyboard.json | 1 - keyboards/westfoxtrot/prophet/keyboard.json | 1 - keyboards/wilba_tech/rama_works_m10_b/keyboard.json | 1 - keyboards/wilba_tech/rama_works_m50_ax/keyboard.json | 1 - keyboards/wilba_tech/wt60_g/keyboard.json | 1 - keyboards/wilba_tech/wt60_g2/keyboard.json | 1 - keyboards/wilba_tech/wt60_h1/keyboard.json | 1 - keyboards/wilba_tech/wt60_h2/keyboard.json | 1 - keyboards/wilba_tech/wt60_h3/keyboard.json | 1 - keyboards/wilba_tech/wt60_xt/keyboard.json | 1 - keyboards/wilba_tech/wt65_d/keyboard.json | 1 - keyboards/wilba_tech/wt65_f/keyboard.json | 1 - keyboards/wilba_tech/wt65_fx/keyboard.json | 1 - keyboards/wilba_tech/wt65_g/keyboard.json | 1 - keyboards/wilba_tech/wt65_g2/keyboard.json | 1 - keyboards/wilba_tech/wt65_h1/keyboard.json | 1 - keyboards/wilba_tech/wt65_xt/keyboard.json | 1 - keyboards/wilba_tech/wt65_xtx/keyboard.json | 1 - keyboards/wilba_tech/wt70_jb/keyboard.json | 1 - keyboards/wilba_tech/wt80_g/keyboard.json | 1 - keyboards/willoucom/keypad/keyboard.json | 1 - keyboards/winkeyless/b87/keyboard.json | 1 - keyboards/winkeyless/bface/keyboard.json | 1 - keyboards/winkeyless/bmini/keyboard.json | 1 - keyboards/winkeyless/bminiex/keyboard.json | 1 - keyboards/winkeys/mini_winni/keyboard.json | 1 - keyboards/winry/winry25tc/keyboard.json | 1 - keyboards/winry/winry315/keyboard.json | 1 - keyboards/wolf/frogpad/keyboard.json | 1 - keyboards/wolf/m60_b/keyboard.json | 1 - keyboards/wolf/m6_c/keyboard.json | 1 - keyboards/wolf/neely65/keyboard.json | 1 - keyboards/wolf/silhouette/keyboard.json | 1 - keyboards/wolf/twilight/keyboard.json | 1 - keyboards/wolf/ziggurat/keyboard.json | 1 - keyboards/woodkeys/scarletbandana/keyboard.json | 1 - keyboards/work_louder/micro/keyboard.json | 1 - keyboards/work_louder/numpad/keyboard.json | 1 - keyboards/wsk/alpha9/keyboard.json | 1 - keyboards/wsk/g4m3ralpha/keyboard.json | 1 - keyboards/wsk/houndstooth/keyboard.json | 1 - keyboards/wsk/jerkin/keyboard.json | 1 - keyboards/wsk/kodachi50/keyboard.json | 1 - keyboards/wsk/pain27/keyboard.json | 1 - keyboards/wsk/sl40/keyboard.json | 1 - keyboards/wsk/tkl30/keyboard.json | 1 - keyboards/wuque/creek70/keyboard.json | 1 - keyboards/wuque/ikki68/keyboard.json | 1 - keyboards/wuque/nemui65/keyboard.json | 1 - keyboards/wuque/tata80/wk/keyboard.json | 1 - keyboards/wuque/tata80/wkl/keyboard.json | 1 - keyboards/x16/keyboard.json | 1 - keyboards/xbows/knight/keyboard.json | 1 - keyboards/xbows/knight_plus/keyboard.json | 1 - keyboards/xbows/nature/keyboard.json | 1 - keyboards/xbows/numpad/keyboard.json | 1 - keyboards/xbows/ranger/keyboard.json | 1 - keyboards/xelus/dharma/keyboard.json | 1 - keyboards/xelus/pachi/mini_32u4/keyboard.json | 1 - keyboards/xelus/pachi/rev1/keyboard.json | 1 - keyboards/xelus/snap96/keyboard.json | 1 - keyboards/xelus/valor/rev1/keyboard.json | 1 - keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json | 1 - keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json | 1 - keyboards/xiudi/xd004/v1/keyboard.json | 1 - keyboards/xiudi/xd60/rev2/keyboard.json | 1 - keyboards/xiudi/xd60/rev3/keyboard.json | 1 - keyboards/xiudi/xd68/keyboard.json | 1 - keyboards/xiudi/xd75/keyboard.json | 1 - keyboards/xiudi/xd84pro/keyboard.json | 1 - keyboards/xmmx/keyboard.json | 1 - keyboards/yandrstudio/nz64/keyboard.json | 1 - keyboards/yandrstudio/zhou65/keyboard.json | 1 - keyboards/yatara/drink_me/keyboard.json | 1 - keyboards/ydkb/chili/keyboard.json | 1 - keyboards/ydkb/yd68/keyboard.json | 1 - keyboards/ydkb/ydpm40/keyboard.json | 1 - keyboards/yeehaw/keyboard.json | 1 - keyboards/ymdk/bface/keyboard.json | 1 - keyboards/ymdk/melody96/hotswap/keyboard.json | 1 - keyboards/ymdk/np21/keyboard.json | 1 - keyboards/ymdk/np24/u4rgb6/keyboard.json | 1 - keyboards/ymdk/wings/keyboard.json | 1 - keyboards/ymdk/wingshs/keyboard.json | 1 - keyboards/ymdk/yd60mq/info.json | 1 - keyboards/ymdk/ym68/keyboard.json | 1 - keyboards/ymdk/ymd09/keyboard.json | 1 - keyboards/ymdk/ymd21/v2/keyboard.json | 1 - keyboards/ymdk/ymd67/keyboard.json | 1 - keyboards/ymdk/ymd75/rev1/keyboard.json | 1 - keyboards/ymdk/ymd75/rev2/keyboard.json | 1 - keyboards/ymdk/ymd75/rev3/keyboard.json | 1 - keyboards/ymdk/ymd75/rev4/iso/keyboard.json | 1 - keyboards/ymdk/ymd96/keyboard.json | 1 - keyboards/yncognito/batpad/keyboard.json | 1 - keyboards/yoichiro/lunakey_macro/keyboard.json | 1 - keyboards/yoichiro/lunakey_pico/keyboard.json | 1 - keyboards/yynmt/dozen0/keyboard.json | 1 - keyboards/zeix/eden/keyboard.json | 1 - keyboards/zeix/qwertyqop60hs/keyboard.json | 1 - keyboards/zicodia/tklfrlnrlmlao/keyboard.json | 1 - keyboards/ziggurat/keyboard.json | 1 - keyboards/zigotica/z12/keyboard.json | 1 - keyboards/ziptyze/lets_split_v3/keyboard.json | 1 - keyboards/zj68/keyboard.json | 1 - keyboards/zoo/wampus/keyboard.json | 1 - keyboards/zos/65s/keyboard.json | 1 - keyboards/ztboards/after/keyboard.json | 1 - keyboards/ztboards/noon/keyboard.json | 1 - keyboards/zwag/zwag75/keyboard.json | 1 - keyboards/zwerg/keyboard.json | 1 - keyboards/zykrah/fuyu/keyboard.json | 1 - keyboards/zykrah/slime88/keyboard.json | 1 - 1806 files changed, 1 insertion(+), 1807 deletions(-) diff --git a/keyboards/0xc7/61key/keyboard.json b/keyboards/0xc7/61key/keyboard.json index 6b1e2e809e..969d0ce7f9 100644 --- a/keyboards/0xc7/61key/keyboard.json +++ b/keyboards/0xc7/61key/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": false, "key_lock": true, "mousekey": false, diff --git a/keyboards/0xcb/1337/keyboard.json b/keyboards/0xcb/1337/keyboard.json index b2ef00906b..f4c45adc2f 100644 --- a/keyboards/0xcb/1337/keyboard.json +++ b/keyboards/0xcb/1337/keyboard.json @@ -66,7 +66,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/0xcb/static/keyboard.json b/keyboards/0xcb/static/keyboard.json index 73a6a802cc..064d437731 100644 --- a/keyboards/0xcb/static/keyboard.json +++ b/keyboards/0xcb/static/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/0xcb/tutelpad/keyboard.json b/keyboards/0xcb/tutelpad/keyboard.json index 2367e6ce2e..15a09b0f00 100644 --- a/keyboards/0xcb/tutelpad/keyboard.json +++ b/keyboards/0xcb/tutelpad/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/1upkeyboards/1up60hte/keyboard.json b/keyboards/1upkeyboards/1up60hte/keyboard.json index 7f8a660d80..c080b04cb8 100644 --- a/keyboards/1upkeyboards/1up60hte/keyboard.json +++ b/keyboards/1upkeyboards/1up60hte/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/1upkeyboards/1up60rgb/keyboard.json b/keyboards/1upkeyboards/1up60rgb/keyboard.json index 5b0d9ef5d4..914bbcb7c7 100644 --- a/keyboards/1upkeyboards/1up60rgb/keyboard.json +++ b/keyboards/1upkeyboards/1up60rgb/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/1upkeyboards/1upocarina/keyboard.json b/keyboards/1upkeyboards/1upocarina/keyboard.json index 1f33c048c1..c3bee81eb8 100644 --- a/keyboards/1upkeyboards/1upocarina/keyboard.json +++ b/keyboards/1upkeyboards/1upocarina/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/1upslider8/keyboard.json b/keyboards/1upkeyboards/1upslider8/keyboard.json index 6b65361f67..1f80ef23b8 100644 --- a/keyboards/1upkeyboards/1upslider8/keyboard.json +++ b/keyboards/1upkeyboards/1upslider8/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/1upsuper16v3/keyboard.json b/keyboards/1upkeyboards/1upsuper16v3/keyboard.json index 7ef33a0342..0d7e9eb27c 100644 --- a/keyboards/1upkeyboards/1upsuper16v3/keyboard.json +++ b/keyboards/1upkeyboards/1upsuper16v3/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json b/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json index 63f76eb1a6..022ed75338 100644 --- a/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json +++ b/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json b/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json index ed1f139126..d038a973bf 100644 --- a/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json +++ b/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json b/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json index aa19a502b9..d133078564 100644 --- a/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json +++ b/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi50/info.json b/keyboards/1upkeyboards/pi50/info.json index 409fbecbc8..83add323b0 100644 --- a/keyboards/1upkeyboards/pi50/info.json +++ b/keyboards/1upkeyboards/pi50/info.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi60/keyboard.json b/keyboards/1upkeyboards/pi60/keyboard.json index ca3007ee76..1074313c2e 100644 --- a/keyboards/1upkeyboards/pi60/keyboard.json +++ b/keyboards/1upkeyboards/pi60/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/pi60_hse/keyboard.json b/keyboards/1upkeyboards/pi60_hse/keyboard.json index d5a5f86187..3b99d43a0a 100644 --- a/keyboards/1upkeyboards/pi60_hse/keyboard.json +++ b/keyboards/1upkeyboards/pi60_hse/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi60_rgb/keyboard.json b/keyboards/1upkeyboards/pi60_rgb/keyboard.json index 21dab3f71a..bd590dc049 100644 --- a/keyboards/1upkeyboards/pi60_rgb/keyboard.json +++ b/keyboards/1upkeyboards/pi60_rgb/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/super16/keyboard.json b/keyboards/1upkeyboards/super16/keyboard.json index f43d5d7037..fcc1ec1620 100644 --- a/keyboards/1upkeyboards/super16/keyboard.json +++ b/keyboards/1upkeyboards/super16/keyboard.json @@ -79,7 +79,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/super16v2/keyboard.json b/keyboards/1upkeyboards/super16v2/keyboard.json index 2e423d7d5a..888bdcc20d 100644 --- a/keyboards/1upkeyboards/super16v2/keyboard.json +++ b/keyboards/1upkeyboards/super16v2/keyboard.json @@ -51,7 +51,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/sweet16/info.json b/keyboards/1upkeyboards/sweet16/info.json index 65ce40a658..a1f9de54ba 100644 --- a/keyboards/1upkeyboards/sweet16/info.json +++ b/keyboards/1upkeyboards/sweet16/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json b/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json index d8d6c5e3ea..f5225fce85 100644 --- a/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json +++ b/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json b/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json index d46f723a17..ba22994765 100644 --- a/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json +++ b/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/3keyecosystem/2key2/keyboard.json b/keyboards/3keyecosystem/2key2/keyboard.json index 5c77fdf6ae..de34f387c1 100644 --- a/keyboards/3keyecosystem/2key2/keyboard.json +++ b/keyboards/3keyecosystem/2key2/keyboard.json @@ -70,7 +70,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/40percentclub/4pack/keyboard.json b/keyboards/40percentclub/4pack/keyboard.json index 6be4ab5e8a..79aedd88c3 100644 --- a/keyboards/40percentclub/4pack/keyboard.json +++ b/keyboards/40percentclub/4pack/keyboard.json @@ -17,7 +17,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/40percentclub/luddite/keyboard.json b/keyboards/40percentclub/luddite/keyboard.json index 774aed72db..a892f041cb 100644 --- a/keyboards/40percentclub/luddite/keyboard.json +++ b/keyboards/40percentclub/luddite/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/40percentclub/mf68/keyboard.json b/keyboards/40percentclub/mf68/keyboard.json index 161c4345af..55e0bc4a07 100644 --- a/keyboards/40percentclub/mf68/keyboard.json +++ b/keyboards/40percentclub/mf68/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/40percentclub/nano/keyboard.json b/keyboards/40percentclub/nano/keyboard.json index 39aa46098f..b72c6c8d73 100644 --- a/keyboards/40percentclub/nano/keyboard.json +++ b/keyboards/40percentclub/nano/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/40percentclub/nein/keyboard.json b/keyboards/40percentclub/nein/keyboard.json index 9e1711f71e..1f35c04e81 100644 --- a/keyboards/40percentclub/nein/keyboard.json +++ b/keyboards/40percentclub/nein/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/40percentclub/polyandry/info.json b/keyboards/40percentclub/polyandry/info.json index 25e560f780..0413fbfb87 100644 --- a/keyboards/40percentclub/polyandry/info.json +++ b/keyboards/40percentclub/polyandry/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/40percentclub/sixpack/keyboard.json b/keyboards/40percentclub/sixpack/keyboard.json index 059c9de091..69daf6b79c 100644 --- a/keyboards/40percentclub/sixpack/keyboard.json +++ b/keyboards/40percentclub/sixpack/keyboard.json @@ -25,7 +25,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/40percentclub/tomato/keyboard.json b/keyboards/40percentclub/tomato/keyboard.json index ecc7b19570..79e1e657f0 100644 --- a/keyboards/40percentclub/tomato/keyboard.json +++ b/keyboards/40percentclub/tomato/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/4pplet/aekiso60/rev_a/keyboard.json b/keyboards/4pplet/aekiso60/rev_a/keyboard.json index 5e236adc9a..1461015ca8 100644 --- a/keyboards/4pplet/aekiso60/rev_a/keyboard.json +++ b/keyboards/4pplet/aekiso60/rev_a/keyboard.json @@ -27,7 +27,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/bootleg/rev_a/keyboard.json b/keyboards/4pplet/bootleg/rev_a/keyboard.json index 10aa3de678..59ec6979be 100644 --- a/keyboards/4pplet/bootleg/rev_a/keyboard.json +++ b/keyboards/4pplet/bootleg/rev_a/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json index 50babdab71..de73016d57 100644 --- a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json +++ b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json @@ -42,7 +42,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/steezy60/rev_a/keyboard.json b/keyboards/4pplet/steezy60/rev_a/keyboard.json index bbc3d1601b..1ac0eaaff6 100644 --- a/keyboards/4pplet/steezy60/rev_a/keyboard.json +++ b/keyboards/4pplet/steezy60/rev_a/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/steezy60/rev_b/keyboard.json b/keyboards/4pplet/steezy60/rev_b/keyboard.json index 810f7f8cb9..b429cfd70b 100644 --- a/keyboards/4pplet/steezy60/rev_b/keyboard.json +++ b/keyboards/4pplet/steezy60/rev_b/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/unextended_std/rev_a/keyboard.json b/keyboards/4pplet/unextended_std/rev_a/keyboard.json index 1b1909854a..a34560f91b 100644 --- a/keyboards/4pplet/unextended_std/rev_a/keyboard.json +++ b/keyboards/4pplet/unextended_std/rev_a/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/4pplet/waffling60/rev_a/keyboard.json b/keyboards/4pplet/waffling60/rev_a/keyboard.json index cbb24bd56a..2df4067ecf 100644 --- a/keyboards/4pplet/waffling60/rev_a/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_a/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/waffling60/rev_b/keyboard.json b/keyboards/4pplet/waffling60/rev_b/keyboard.json index 54e51b388b..51d21d5b5e 100644 --- a/keyboards/4pplet/waffling60/rev_b/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_b/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/4pplet/waffling60/rev_c/keyboard.json b/keyboards/4pplet/waffling60/rev_c/keyboard.json index a7c23cc349..2995f98646 100644 --- a/keyboards/4pplet/waffling60/rev_c/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_c/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/4pplet/waffling60/rev_e/keyboard.json b/keyboards/4pplet/waffling60/rev_e/keyboard.json index 9adf6dada3..13d03d15c3 100644 --- a/keyboards/4pplet/waffling60/rev_e/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json b/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json index 15d3c7cfe9..e32e9b17b8 100644 --- a/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json b/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json index a9bfad4d62..5b026334f6 100644 --- a/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling80/rev_a/keyboard.json b/keyboards/4pplet/waffling80/rev_a/keyboard.json index 157cefa536..4dff811194 100644 --- a/keyboards/4pplet/waffling80/rev_a/keyboard.json +++ b/keyboards/4pplet/waffling80/rev_a/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/4pplet/yakiimo/rev_a/keyboard.json b/keyboards/4pplet/yakiimo/rev_a/keyboard.json index f22f67ac6a..f4c016afc1 100644 --- a/keyboards/4pplet/yakiimo/rev_a/keyboard.json +++ b/keyboards/4pplet/yakiimo/rev_a/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/7c8/framework/keyboard.json b/keyboards/7c8/framework/keyboard.json index a6ebdfbfc6..72302b3e4a 100644 --- a/keyboards/7c8/framework/keyboard.json +++ b/keyboards/7c8/framework/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "leader": true, diff --git a/keyboards/9key/keyboard.json b/keyboards/9key/keyboard.json index f63fdf3607..baa8bb4c18 100644 --- a/keyboards/9key/keyboard.json +++ b/keyboards/9key/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/abatskeyboardclub/nayeon/keyboard.json b/keyboards/abatskeyboardclub/nayeon/keyboard.json index 4949b17072..6b1a748617 100644 --- a/keyboards/abatskeyboardclub/nayeon/keyboard.json +++ b/keyboards/abatskeyboardclub/nayeon/keyboard.json @@ -10,7 +10,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgb_matrix": true diff --git a/keyboards/abstract/ellipse/rev1/keyboard.json b/keyboards/abstract/ellipse/rev1/keyboard.json index 8e38f29d56..95ea435ae8 100644 --- a/keyboards/abstract/ellipse/rev1/keyboard.json +++ b/keyboards/abstract/ellipse/rev1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/acekeyboard/titan60/keyboard.json b/keyboards/acekeyboard/titan60/keyboard.json index 4446927ab8..1718b6fa22 100644 --- a/keyboards/acekeyboard/titan60/keyboard.json +++ b/keyboards/acekeyboard/titan60/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/acheron/apollo/87h/delta/keyboard.json b/keyboards/acheron/apollo/87h/delta/keyboard.json index 5d01c1b8f7..1676297ab7 100644 --- a/keyboards/acheron/apollo/87h/delta/keyboard.json +++ b/keyboards/acheron/apollo/87h/delta/keyboard.json @@ -62,7 +62,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/apollo/87htsc/keyboard.json b/keyboards/acheron/apollo/87htsc/keyboard.json index e40f18da92..654a99c404 100644 --- a/keyboards/acheron/apollo/87htsc/keyboard.json +++ b/keyboards/acheron/apollo/87htsc/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/apollo/88htsc/keyboard.json b/keyboards/acheron/apollo/88htsc/keyboard.json index 02831f8c62..539fc5bcdd 100644 --- a/keyboards/acheron/apollo/88htsc/keyboard.json +++ b/keyboards/acheron/apollo/88htsc/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/athena/alpha/keyboard.json b/keyboards/acheron/athena/alpha/keyboard.json index 7e29cdc037..47f626f1cc 100644 --- a/keyboards/acheron/athena/alpha/keyboard.json +++ b/keyboards/acheron/athena/alpha/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/acheron/athena/beta/keyboard.json b/keyboards/acheron/athena/beta/keyboard.json index ba96b20151..bded4b8805 100644 --- a/keyboards/acheron/athena/beta/keyboard.json +++ b/keyboards/acheron/athena/beta/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/acheron/elongate/beta/keyboard.json b/keyboards/acheron/elongate/beta/keyboard.json index d15f178991..d998d80506 100644 --- a/keyboards/acheron/elongate/beta/keyboard.json +++ b/keyboards/acheron/elongate/beta/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/elongate/delta/keyboard.json b/keyboards/acheron/elongate/delta/keyboard.json index 1c6d0927d6..18d5b539b3 100644 --- a/keyboards/acheron/elongate/delta/keyboard.json +++ b/keyboards/acheron/elongate/delta/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/acheron/shark/beta/keyboard.json b/keyboards/acheron/shark/beta/keyboard.json index 2433f61fec..2281c24b30 100644 --- a/keyboards/acheron/shark/beta/keyboard.json +++ b/keyboards/acheron/shark/beta/keyboard.json @@ -8,7 +8,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/acheron/themis/87h/keyboard.json b/keyboards/acheron/themis/87h/keyboard.json index 488cb324c1..d94f7b0ff3 100644 --- a/keyboards/acheron/themis/87h/keyboard.json +++ b/keyboards/acheron/themis/87h/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "rgblight": true, "nkro": true }, diff --git a/keyboards/acheron/themis/87htsc/keyboard.json b/keyboards/acheron/themis/87htsc/keyboard.json index 46cdb09247..460c1f8f8e 100644 --- a/keyboards/acheron/themis/87htsc/keyboard.json +++ b/keyboards/acheron/themis/87htsc/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "rgblight": true, "nkro": true }, diff --git a/keyboards/acheron/themis/88htsc/keyboard.json b/keyboards/acheron/themis/88htsc/keyboard.json index 1e193d2661..5449461e15 100644 --- a/keyboards/acheron/themis/88htsc/keyboard.json +++ b/keyboards/acheron/themis/88htsc/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "rgblight": true, "nkro": true }, diff --git a/keyboards/ada/infinity81/keyboard.json b/keyboards/ada/infinity81/keyboard.json index f1f928697b..df5b0fd975 100644 --- a/keyboards/ada/infinity81/keyboard.json +++ b/keyboards/ada/infinity81/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/adelheid/keyboard.json b/keyboards/adelheid/keyboard.json index 7766a44a8d..4247a06b21 100644 --- a/keyboards/adelheid/keyboard.json +++ b/keyboards/adelheid/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/adm42/rev4/keyboard.json b/keyboards/adm42/rev4/keyboard.json index 827c127b86..b22273e3d3 100644 --- a/keyboards/adm42/rev4/keyboard.json +++ b/keyboards/adm42/rev4/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/adpenrose/akemipad/keyboard.json b/keyboards/adpenrose/akemipad/keyboard.json index 50003fbb5f..f372b7bd04 100644 --- a/keyboards/adpenrose/akemipad/keyboard.json +++ b/keyboards/adpenrose/akemipad/keyboard.json @@ -24,7 +24,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/kintsugi/keyboard.json b/keyboards/adpenrose/kintsugi/keyboard.json index 46504298f8..f86d344cdb 100644 --- a/keyboards/adpenrose/kintsugi/keyboard.json +++ b/keyboards/adpenrose/kintsugi/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/obi/keyboard.json b/keyboards/adpenrose/obi/keyboard.json index 8c1428ca81..1102878dc7 100644 --- a/keyboards/adpenrose/obi/keyboard.json +++ b/keyboards/adpenrose/obi/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/shisaku/keyboard.json b/keyboards/adpenrose/shisaku/keyboard.json index 1382ee3b62..d3d6b4607e 100644 --- a/keyboards/adpenrose/shisaku/keyboard.json +++ b/keyboards/adpenrose/shisaku/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/aeboards/aegis/keyboard.json b/keyboards/aeboards/aegis/keyboard.json index 63705b7043..4f70eaf131 100644 --- a/keyboards/aeboards/aegis/keyboard.json +++ b/keyboards/aeboards/aegis/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/afternoonlabs/gust/rev1/keyboard.json b/keyboards/afternoonlabs/gust/rev1/keyboard.json index 93ad60ad7d..9ba40a6426 100644 --- a/keyboards/afternoonlabs/gust/rev1/keyboard.json +++ b/keyboards/afternoonlabs/gust/rev1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ai/keyboard.json b/keyboards/ai/keyboard.json index d25459b507..5a41e18a53 100644 --- a/keyboards/ai/keyboard.json +++ b/keyboards/ai/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/altair/keyboard.json b/keyboards/ai03/altair/keyboard.json index a8cd8b02a7..f4c17ce425 100644 --- a/keyboards/ai03/altair/keyboard.json +++ b/keyboards/ai03/altair/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/altair_x/keyboard.json b/keyboards/ai03/altair_x/keyboard.json index 27f36af97b..7277184e9a 100644 --- a/keyboards/ai03/altair_x/keyboard.json +++ b/keyboards/ai03/altair_x/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/duet/keyboard.json b/keyboards/ai03/duet/keyboard.json index 1d11c868a3..055e23e4d7 100644 --- a/keyboards/ai03/duet/keyboard.json +++ b/keyboards/ai03/duet/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ai03/equinox/rev0/keyboard.json b/keyboards/ai03/equinox/rev0/keyboard.json index e38fada333..5006c88239 100644 --- a/keyboards/ai03/equinox/rev0/keyboard.json +++ b/keyboards/ai03/equinox/rev0/keyboard.json @@ -3,7 +3,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/equinox/rev1/keyboard.json b/keyboards/ai03/equinox/rev1/keyboard.json index 590a84b31c..59a311e577 100644 --- a/keyboards/ai03/equinox/rev1/keyboard.json +++ b/keyboards/ai03/equinox/rev1/keyboard.json @@ -3,7 +3,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/equinox_xl/keyboard.json b/keyboards/ai03/equinox_xl/keyboard.json index e6abf4a0c2..051f4452c0 100644 --- a/keyboards/ai03/equinox_xl/keyboard.json +++ b/keyboards/ai03/equinox_xl/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/jp60/keyboard.json b/keyboards/ai03/jp60/keyboard.json index 389993626d..c54062977a 100644 --- a/keyboards/ai03/jp60/keyboard.json +++ b/keyboards/ai03/jp60/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/polaris/keyboard.json b/keyboards/ai03/polaris/keyboard.json index 7e6ab9aec7..72fe915cb2 100644 --- a/keyboards/ai03/polaris/keyboard.json +++ b/keyboards/ai03/polaris/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ai03/quasar/keyboard.json b/keyboards/ai03/quasar/keyboard.json index 52902e3067..bd4b1b51d9 100644 --- a/keyboards/ai03/quasar/keyboard.json +++ b/keyboards/ai03/quasar/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ai03/soyuz/keyboard.json b/keyboards/ai03/soyuz/keyboard.json index 2abfbd5ead..be41a01798 100644 --- a/keyboards/ai03/soyuz/keyboard.json +++ b/keyboards/ai03/soyuz/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/voyager60_alps/keyboard.json b/keyboards/ai03/voyager60_alps/keyboard.json index 9b8fa051b5..25546cfb74 100644 --- a/keyboards/ai03/voyager60_alps/keyboard.json +++ b/keyboards/ai03/voyager60_alps/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/aidansmithdotdev/fine40/keyboard.json b/keyboards/aidansmithdotdev/fine40/keyboard.json index 9663106607..a7b4d54e92 100644 --- a/keyboards/aidansmithdotdev/fine40/keyboard.json +++ b/keyboards/aidansmithdotdev/fine40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "encoder": true, diff --git a/keyboards/akb/ogr/keyboard.json b/keyboards/akb/ogr/keyboard.json index d1b062820a..57dbfbdd3f 100644 --- a/keyboards/akb/ogr/keyboard.json +++ b/keyboards/akb/ogr/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akb/ogrn/keyboard.json b/keyboards/akb/ogrn/keyboard.json index 780c353747..66b682af23 100644 --- a/keyboards/akb/ogrn/keyboard.json +++ b/keyboards/akb/ogrn/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akb/vero/keyboard.json b/keyboards/akb/vero/keyboard.json index a598578c0c..f443c1afad 100644 --- a/keyboards/akb/vero/keyboard.json +++ b/keyboards/akb/vero/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akko/5087/keyboard.json b/keyboards/akko/5087/keyboard.json index a2f72351ed..3a309711e3 100644 --- a/keyboards/akko/5087/keyboard.json +++ b/keyboards/akko/5087/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/akko/5108/keyboard.json b/keyboards/akko/5108/keyboard.json index e98e421089..6429885b82 100644 --- a/keyboards/akko/5108/keyboard.json +++ b/keyboards/akko/5108/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/akko/acr87/keyboard.json b/keyboards/akko/acr87/keyboard.json index 9f37a91b9a..df51b0b4b9 100644 --- a/keyboards/akko/acr87/keyboard.json +++ b/keyboards/akko/acr87/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/akko/top40/keyboard.json b/keyboards/akko/top40/keyboard.json index fd7cf497e7..f206a2a70b 100644 --- a/keyboards/akko/top40/keyboard.json +++ b/keyboards/akko/top40/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/alf/x11/keyboard.json b/keyboards/alf/x11/keyboard.json index 0396093435..a368123e84 100644 --- a/keyboards/alf/x11/keyboard.json +++ b/keyboards/alf/x11/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/alf/x2/keyboard.json b/keyboards/alf/x2/keyboard.json index ec3eae179a..2135a46683 100644 --- a/keyboards/alf/x2/keyboard.json +++ b/keyboards/alf/x2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/alfredslab/swift65/hotswap/keyboard.json b/keyboards/alfredslab/swift65/hotswap/keyboard.json index d2a6e6da03..8100b7bcbd 100644 --- a/keyboards/alfredslab/swift65/hotswap/keyboard.json +++ b/keyboards/alfredslab/swift65/hotswap/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/alfredslab/swift65/solder/keyboard.json b/keyboards/alfredslab/swift65/solder/keyboard.json index cb419d4cc1..9fecc6a5f6 100644 --- a/keyboards/alfredslab/swift65/solder/keyboard.json +++ b/keyboards/alfredslab/swift65/solder/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/alhenkb/macropad5x4/keyboard.json b/keyboards/alhenkb/macropad5x4/keyboard.json index 7415068b2c..fd2645619e 100644 --- a/keyboards/alhenkb/macropad5x4/keyboard.json +++ b/keyboards/alhenkb/macropad5x4/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/alpha/keyboard.json b/keyboards/alpha/keyboard.json index 1cb2fe71cd..4412177fbb 100644 --- a/keyboards/alpha/keyboard.json +++ b/keyboards/alpha/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/amag23/keyboard.json b/keyboards/amag23/keyboard.json index e3eb16cdad..8b144cdef1 100644 --- a/keyboards/amag23/keyboard.json +++ b/keyboards/amag23/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/amjkeyboard/amj40/keyboard.json b/keyboards/amjkeyboard/amj40/keyboard.json index c3bbe72039..dd27bd46ae 100644 --- a/keyboards/amjkeyboard/amj40/keyboard.json +++ b/keyboards/amjkeyboard/amj40/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/amjkeyboard/amj60/keyboard.json b/keyboards/amjkeyboard/amj60/keyboard.json index f16d178b06..d5d7bc1804 100644 --- a/keyboards/amjkeyboard/amj60/keyboard.json +++ b/keyboards/amjkeyboard/amj60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/amjkeyboard/amj84/keyboard.json b/keyboards/amjkeyboard/amj84/keyboard.json index d5f1f11a4d..9293bf1581 100644 --- a/keyboards/amjkeyboard/amj84/keyboard.json +++ b/keyboards/amjkeyboard/amj84/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/an_achronism/tetromino/keyboard.json b/keyboards/an_achronism/tetromino/keyboard.json index 98cb9faf3e..b9a0e2005d 100644 --- a/keyboards/an_achronism/tetromino/keyboard.json +++ b/keyboards/an_achronism/tetromino/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/arrows/keyboard.json b/keyboards/anavi/arrows/keyboard.json index 48dae7b2ea..7b9aa2985c 100644 --- a/keyboards/anavi/arrows/keyboard.json +++ b/keyboards/anavi/arrows/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/knob1/keyboard.json b/keyboards/anavi/knob1/keyboard.json index 9c4c60640e..176ee6472d 100644 --- a/keyboards/anavi/knob1/keyboard.json +++ b/keyboards/anavi/knob1/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/knobs3/keyboard.json b/keyboards/anavi/knobs3/keyboard.json index 86aaadf98f..5e6cca99dc 100644 --- a/keyboards/anavi/knobs3/keyboard.json +++ b/keyboards/anavi/knobs3/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/macropad10/keyboard.json b/keyboards/anavi/macropad10/keyboard.json index 2e1218d45f..36f4e0cde8 100644 --- a/keyboards/anavi/macropad10/keyboard.json +++ b/keyboards/anavi/macropad10/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/macropad12/keyboard.json b/keyboards/anavi/macropad12/keyboard.json index 3a1a07a0a1..be7c7cc963 100644 --- a/keyboards/anavi/macropad12/keyboard.json +++ b/keyboards/anavi/macropad12/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/macropad8/keyboard.json b/keyboards/anavi/macropad8/keyboard.json index 27d34c18f3..9ed6601cff 100644 --- a/keyboards/anavi/macropad8/keyboard.json +++ b/keyboards/anavi/macropad8/keyboard.json @@ -37,7 +37,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/andean_condor/keyboard.json b/keyboards/andean_condor/keyboard.json index cfc3eefa87..67502ed56a 100644 --- a/keyboards/andean_condor/keyboard.json +++ b/keyboards/andean_condor/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ano/keyboard.json b/keyboards/ano/keyboard.json index 9c46895f1a..c0522ab1cc 100644 --- a/keyboards/ano/keyboard.json +++ b/keyboards/ano/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/aos/tkl/keyboard.json b/keyboards/aos/tkl/keyboard.json index 8cd47a44a5..4d2476a518 100644 --- a/keyboards/aos/tkl/keyboard.json +++ b/keyboards/aos/tkl/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/aplyard/aplx6/rev1/keyboard.json b/keyboards/aplyard/aplx6/rev1/keyboard.json index e7f59d12c6..288093b240 100644 --- a/keyboards/aplyard/aplx6/rev1/keyboard.json +++ b/keyboards/aplyard/aplx6/rev1/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/aplyard/aplx6/rev2/keyboard.json b/keyboards/aplyard/aplx6/rev2/keyboard.json index 7cd8d00544..597076ef55 100644 --- a/keyboards/aplyard/aplx6/rev2/keyboard.json +++ b/keyboards/aplyard/aplx6/rev2/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ares/keyboard.json b/keyboards/ares/keyboard.json index b6e5544511..21bf1a55f2 100644 --- a/keyboards/ares/keyboard.json +++ b/keyboards/ares/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json b/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json index 47414ee0c4..5c8978f08a 100644 --- a/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json +++ b/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json b/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json index 89b9b1994f..c18440971f 100644 --- a/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json +++ b/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/arisu/keyboard.json b/keyboards/arisu/keyboard.json index 43bb668b99..27bec90b09 100644 --- a/keyboards/arisu/keyboard.json +++ b/keyboards/arisu/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/arrayperipherals/1x4p1/keyboard.json b/keyboards/arrayperipherals/1x4p1/keyboard.json index f9344e3538..fff3b1af04 100644 --- a/keyboards/arrayperipherals/1x4p1/keyboard.json +++ b/keyboards/arrayperipherals/1x4p1/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/artemis/paragon/info.json b/keyboards/artemis/paragon/info.json index 93c547faa9..fe0983e194 100644 --- a/keyboards/artemis/paragon/info.json +++ b/keyboards/artemis/paragon/info.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ash_xiix/keyboard.json b/keyboards/ash_xiix/keyboard.json index e743b80a8f..ce8579af04 100644 --- a/keyboards/ash_xiix/keyboard.json +++ b/keyboards/ash_xiix/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ask55/keyboard.json b/keyboards/ask55/keyboard.json index 53451e5329..1916cace64 100644 --- a/keyboards/ask55/keyboard.json +++ b/keyboards/ask55/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/atlantis/ak81_ve/keyboard.json b/keyboards/atlantis/ak81_ve/keyboard.json index aa85a55e0a..fd6123b02b 100644 --- a/keyboards/atlantis/ak81_ve/keyboard.json +++ b/keyboards/atlantis/ak81_ve/keyboard.json @@ -182,7 +182,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dynamic_macro": true, "encoder": true, "extrakey": true, diff --git a/keyboards/atlantis/ps17/keyboard.json b/keyboards/atlantis/ps17/keyboard.json index ee7255c8fa..2231ae1ceb 100644 --- a/keyboards/atlantis/ps17/keyboard.json +++ b/keyboards/atlantis/ps17/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/atlas_65/keyboard.json b/keyboards/atlas_65/keyboard.json index 4e8db96d3a..354ff6f4e8 100644 --- a/keyboards/atlas_65/keyboard.json +++ b/keyboards/atlas_65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/atomic/keyboard.json b/keyboards/atomic/keyboard.json index 5a269316cf..3e0ac225c9 100644 --- a/keyboards/atomic/keyboard.json +++ b/keyboards/atomic/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/atreus/feather/keyboard.json b/keyboards/atreus/feather/keyboard.json index 7f5866e502..1392849fd4 100644 --- a/keyboards/atreus/feather/keyboard.json +++ b/keyboards/atreus/feather/keyboard.json @@ -7,8 +7,7 @@ "processor": "atmega32u4", "bootloader": "caterina", "features": { - "bluetooth": true, - "console": false + "bluetooth": true }, "build": { "lto": true diff --git a/keyboards/atxkb/1894/keyboard.json b/keyboards/atxkb/1894/keyboard.json index 878c3d998c..3fdd217171 100644 --- a/keyboards/atxkb/1894/keyboard.json +++ b/keyboards/atxkb/1894/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/aves60/keyboard.json b/keyboards/aves60/keyboard.json index 6d58d43b6a..e26bc47fae 100644 --- a/keyboards/aves60/keyboard.json +++ b/keyboards/aves60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/aves65/keyboard.json b/keyboards/aves65/keyboard.json index 9d8a70b78c..9a0895efaf 100644 --- a/keyboards/aves65/keyboard.json +++ b/keyboards/aves65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/axolstudio/foundation_gamma/keyboard.json b/keyboards/axolstudio/foundation_gamma/keyboard.json index 86ba316268..62db475c2f 100644 --- a/keyboards/axolstudio/foundation_gamma/keyboard.json +++ b/keyboards/axolstudio/foundation_gamma/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/axolstudio/yeti/hotswap/keyboard.json b/keyboards/axolstudio/yeti/hotswap/keyboard.json index 728c359880..0bba4d9d81 100644 --- a/keyboards/axolstudio/yeti/hotswap/keyboard.json +++ b/keyboards/axolstudio/yeti/hotswap/keyboard.json @@ -52,7 +52,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/axolstudio/yeti/soldered/keyboard.json b/keyboards/axolstudio/yeti/soldered/keyboard.json index 9edb808330..9e017af945 100644 --- a/keyboards/axolstudio/yeti/soldered/keyboard.json +++ b/keyboards/axolstudio/yeti/soldered/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/bacca70/keyboard.json b/keyboards/bacca70/keyboard.json index 8d4483bc6f..8f3b2d840d 100644 --- a/keyboards/bacca70/keyboard.json +++ b/keyboards/bacca70/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/baguette/keyboard.json b/keyboards/baguette/keyboard.json index 1d86c43ad9..37b0be164a 100644 --- a/keyboards/baguette/keyboard.json +++ b/keyboards/baguette/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/balloondogcaps/tr90/keyboard.json b/keyboards/balloondogcaps/tr90/keyboard.json index 957953fd69..c4176f4ff3 100644 --- a/keyboards/balloondogcaps/tr90/keyboard.json +++ b/keyboards/balloondogcaps/tr90/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/balloondogcaps/tr90pm/keyboard.json b/keyboards/balloondogcaps/tr90pm/keyboard.json index e095c1eda1..66ef389a7f 100644 --- a/keyboards/balloondogcaps/tr90pm/keyboard.json +++ b/keyboards/balloondogcaps/tr90pm/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/barracuda/keyboard.json b/keyboards/barracuda/keyboard.json index 6e606e11ea..be92c5c6de 100644 --- a/keyboards/barracuda/keyboard.json +++ b/keyboards/barracuda/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json index 3ae31d0b46..e283b2409b 100644 --- a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json index 4f0ea648c8..9e85e7af1e 100644 --- a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json +++ b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bear_face/info.json b/keyboards/bear_face/info.json index 90191299d8..f81f4c4536 100644 --- a/keyboards/bear_face/info.json +++ b/keyboards/bear_face/info.json @@ -10,7 +10,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false }, diff --git a/keyboards/beatervan/keyboard.json b/keyboards/beatervan/keyboard.json index 5bc27c8265..f1a6380727 100644 --- a/keyboards/beatervan/keyboard.json +++ b/keyboards/beatervan/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/beekeeb/piantor/keyboard.json b/keyboards/beekeeb/piantor/keyboard.json index 77bfc3678c..8d58efb90e 100644 --- a/keyboards/beekeeb/piantor/keyboard.json +++ b/keyboards/beekeeb/piantor/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/beekeeb/piantor_pro/keyboard.json b/keyboards/beekeeb/piantor_pro/keyboard.json index e7605acd1a..558114b67e 100644 --- a/keyboards/beekeeb/piantor_pro/keyboard.json +++ b/keyboards/beekeeb/piantor_pro/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bfake/keyboard.json b/keyboards/bfake/keyboard.json index 8892d81112..febcc29f91 100644 --- a/keyboards/bfake/keyboard.json +++ b/keyboards/bfake/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/binepad/bn006/keyboard.json b/keyboards/binepad/bn006/keyboard.json index e5e25b4b90..b535aabfcc 100755 --- a/keyboards/binepad/bn006/keyboard.json +++ b/keyboards/binepad/bn006/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/binepad/bn009/info.json b/keyboards/binepad/bn009/info.json index 5e06ee9ef6..d5ad51eb8c 100644 --- a/keyboards/binepad/bn009/info.json +++ b/keyboards/binepad/bn009/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/binepad/bnr1/info.json b/keyboards/binepad/bnr1/info.json index 42067200cd..3c844d8512 100755 --- a/keyboards/binepad/bnr1/info.json +++ b/keyboards/binepad/bnr1/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/binepad/pixie/keyboard.json b/keyboards/binepad/pixie/keyboard.json index 7d9d2ceb9a..0c906aef03 100644 --- a/keyboards/binepad/pixie/keyboard.json +++ b/keyboards/binepad/pixie/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/bioi/f60/keyboard.json b/keyboards/bioi/f60/keyboard.json index 67fa1c1c9a..a27533713b 100644 --- a/keyboards/bioi/f60/keyboard.json +++ b/keyboards/bioi/f60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/bioi/s65/keyboard.json b/keyboards/bioi/s65/keyboard.json index 73baaf98c4..c07fd9158d 100644 --- a/keyboards/bioi/s65/keyboard.json +++ b/keyboards/bioi/s65/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/black_hellebore/keyboard.json b/keyboards/black_hellebore/keyboard.json index b59cb8f7b9..7d7d6ea52f 100644 --- a/keyboards/black_hellebore/keyboard.json +++ b/keyboards/black_hellebore/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/blackplum/keyboard.json b/keyboards/blackplum/keyboard.json index 277e0eae62..cf6ed8fd3e 100644 --- a/keyboards/blackplum/keyboard.json +++ b/keyboards/blackplum/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/blank/blank01/keyboard.json b/keyboards/blank/blank01/keyboard.json index 5e29f192f2..bc55401c4f 100644 --- a/keyboards/blank/blank01/keyboard.json +++ b/keyboards/blank/blank01/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/blockboy/ac980mini/keyboard.json b/keyboards/blockboy/ac980mini/keyboard.json index 8675daad8d..568cfa17b5 100644 --- a/keyboards/blockboy/ac980mini/keyboard.json +++ b/keyboards/blockboy/ac980mini/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/boardrun/bizarre/keyboard.json b/keyboards/boardrun/bizarre/keyboard.json index f61f3b053f..22ddfb005d 100644 --- a/keyboards/boardrun/bizarre/keyboard.json +++ b/keyboards/boardrun/bizarre/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/boardrun/classic/keyboard.json b/keyboards/boardrun/classic/keyboard.json index be21483c8e..320eaa4103 100644 --- a/keyboards/boardrun/classic/keyboard.json +++ b/keyboards/boardrun/classic/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/boardwalk/keyboard.json b/keyboards/boardwalk/keyboard.json index d0cb4b1383..50a00b0f65 100644 --- a/keyboards/boardwalk/keyboard.json +++ b/keyboards/boardwalk/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/bobpad/keyboard.json b/keyboards/bobpad/keyboard.json index d96c875011..cc14263d0d 100644 --- a/keyboards/bobpad/keyboard.json +++ b/keyboards/bobpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bolsa/bolsalice/keyboard.json b/keyboards/bolsa/bolsalice/keyboard.json index 377da8a1d2..a6a37514f9 100644 --- a/keyboards/bolsa/bolsalice/keyboard.json +++ b/keyboards/bolsa/bolsalice/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bolsa/damapad/keyboard.json b/keyboards/bolsa/damapad/keyboard.json index a5d95add81..7417f4f7d7 100644 --- a/keyboards/bolsa/damapad/keyboard.json +++ b/keyboards/bolsa/damapad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bop/keyboard.json b/keyboards/bop/keyboard.json index 6a88bb4617..dbd97ad2ff 100644 --- a/keyboards/bop/keyboard.json +++ b/keyboards/bop/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/boston/keyboard.json b/keyboards/boston/keyboard.json index 050076c7a6..fc91b72873 100644 --- a/keyboards/boston/keyboard.json +++ b/keyboards/boston/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bpiphany/four_banger/keyboard.json b/keyboards/bpiphany/four_banger/keyboard.json index d74864d18f..fe7cd2f32a 100644 --- a/keyboards/bpiphany/four_banger/keyboard.json +++ b/keyboards/bpiphany/four_banger/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bpiphany/frosty_flake/20130602/keyboard.json b/keyboards/bpiphany/frosty_flake/20130602/keyboard.json index 142010c9c4..4aba74d038 100644 --- a/keyboards/bpiphany/frosty_flake/20130602/keyboard.json +++ b/keyboards/bpiphany/frosty_flake/20130602/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bpiphany/frosty_flake/20140521/keyboard.json b/keyboards/bpiphany/frosty_flake/20140521/keyboard.json index 2ca004c24d..e1aae95566 100644 --- a/keyboards/bpiphany/frosty_flake/20140521/keyboard.json +++ b/keyboards/bpiphany/frosty_flake/20140521/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bpiphany/sixshooter/keyboard.json b/keyboards/bpiphany/sixshooter/keyboard.json index 21e52f3629..f3d0aeeca6 100644 --- a/keyboards/bpiphany/sixshooter/keyboard.json +++ b/keyboards/bpiphany/sixshooter/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bredworks/wyvern_hs/keyboard.json b/keyboards/bredworks/wyvern_hs/keyboard.json index 63e85496ae..87f2ef02c0 100644 --- a/keyboards/bredworks/wyvern_hs/keyboard.json +++ b/keyboards/bredworks/wyvern_hs/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bschwind/key_ripper/keyboard.json b/keyboards/bschwind/key_ripper/keyboard.json index ee30687d4f..b4b01b30ec 100644 --- a/keyboards/bschwind/key_ripper/keyboard.json +++ b/keyboards/bschwind/key_ripper/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bthlabs/geekpad/keyboard.json b/keyboards/bthlabs/geekpad/keyboard.json index 43ce11edf5..9bd1a92c5b 100644 --- a/keyboards/bthlabs/geekpad/keyboard.json +++ b/keyboards/bthlabs/geekpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/budgy/keyboard.json b/keyboards/budgy/keyboard.json index cfb60d85ae..5397def52c 100644 --- a/keyboards/budgy/keyboard.json +++ b/keyboards/budgy/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/buildakb/mw60/keyboard.json b/keyboards/buildakb/mw60/keyboard.json index 9c944277de..08b917c77a 100644 --- a/keyboards/buildakb/mw60/keyboard.json +++ b/keyboards/buildakb/mw60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/buildakb/potato65/keyboard.json b/keyboards/buildakb/potato65/keyboard.json index db20353142..12b175600d 100644 --- a/keyboards/buildakb/potato65/keyboard.json +++ b/keyboards/buildakb/potato65/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/buildakb/potato65hs/keyboard.json b/keyboards/buildakb/potato65hs/keyboard.json index 9e5edd6adb..c6daaf7b6b 100644 --- a/keyboards/buildakb/potato65hs/keyboard.json +++ b/keyboards/buildakb/potato65hs/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/buildakb/potato65s/keyboard.json b/keyboards/buildakb/potato65s/keyboard.json index 8dd9b6cc53..a85bbd1000 100644 --- a/keyboards/buildakb/potato65s/keyboard.json +++ b/keyboards/buildakb/potato65s/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/butterkeebs/pocketpad/keyboard.json b/keyboards/butterkeebs/pocketpad/keyboard.json index 0b42d5fb17..a36cab3cbe 100644 --- a/keyboards/butterkeebs/pocketpad/keyboard.json +++ b/keyboards/butterkeebs/pocketpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cablecardesigns/cypher/rev6/keyboard.json b/keyboards/cablecardesigns/cypher/rev6/keyboard.json index 644f2f1aa6..71891cdb53 100644 --- a/keyboards/cablecardesigns/cypher/rev6/keyboard.json +++ b/keyboards/cablecardesigns/cypher/rev6/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cablecardesigns/phoenix/keyboard.json b/keyboards/cablecardesigns/phoenix/keyboard.json index 0d2ea10ad6..753b706746 100755 --- a/keyboards/cablecardesigns/phoenix/keyboard.json +++ b/keyboards/cablecardesigns/phoenix/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/caffeinated/serpent65/keyboard.json b/keyboards/caffeinated/serpent65/keyboard.json index ef0f926759..55a9f27dcc 100644 --- a/keyboards/caffeinated/serpent65/keyboard.json +++ b/keyboards/caffeinated/serpent65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/canary/canary60rgb/v1/keyboard.json b/keyboards/canary/canary60rgb/v1/keyboard.json index 4980a6f224..474460d5b5 100644 --- a/keyboards/canary/canary60rgb/v1/keyboard.json +++ b/keyboards/canary/canary60rgb/v1/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/cannonkeys/adelie/keyboard.json b/keyboards/cannonkeys/adelie/keyboard.json index c6792f4c90..1f30a3c41c 100644 --- a/keyboards/cannonkeys/adelie/keyboard.json +++ b/keyboards/cannonkeys/adelie/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/cannonkeys/atlas_alps/keyboard.json b/keyboards/cannonkeys/atlas_alps/keyboard.json index 39bfa968b9..7179ea2fcc 100644 --- a/keyboards/cannonkeys/atlas_alps/keyboard.json +++ b/keyboards/cannonkeys/atlas_alps/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json b/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json index cba8980b9d..858db3c20f 100644 --- a/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json +++ b/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json b/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json index c8ef323906..f0ab41a0b9 100644 --- a/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json +++ b/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion60/keyboard.json b/keyboards/cannonkeys/bastion60/keyboard.json index 26cf507984..ddc3513434 100644 --- a/keyboards/cannonkeys/bastion60/keyboard.json +++ b/keyboards/cannonkeys/bastion60/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion65/keyboard.json b/keyboards/cannonkeys/bastion65/keyboard.json index dd7dd4516e..936b23c396 100644 --- a/keyboards/cannonkeys/bastion65/keyboard.json +++ b/keyboards/cannonkeys/bastion65/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion75/keyboard.json b/keyboards/cannonkeys/bastion75/keyboard.json index 276cc03c51..fcaecbdb60 100644 --- a/keyboards/cannonkeys/bastion75/keyboard.json +++ b/keyboards/cannonkeys/bastion75/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastiontkl/keyboard.json b/keyboards/cannonkeys/bastiontkl/keyboard.json index 72733b3d8f..71c12d4e88 100644 --- a/keyboards/cannonkeys/bastiontkl/keyboard.json +++ b/keyboards/cannonkeys/bastiontkl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/brutalv2_1800/keyboard.json b/keyboards/cannonkeys/brutalv2_1800/keyboard.json index 13f1b12733..2a0c5deb52 100644 --- a/keyboards/cannonkeys/brutalv2_1800/keyboard.json +++ b/keyboards/cannonkeys/brutalv2_1800/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/caerdroia/keyboard.json b/keyboards/cannonkeys/caerdroia/keyboard.json index 4b5baf21dd..dcea5e06be 100644 --- a/keyboards/cannonkeys/caerdroia/keyboard.json +++ b/keyboards/cannonkeys/caerdroia/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/chimera65_hs/keyboard.json b/keyboards/cannonkeys/chimera65_hs/keyboard.json index a126a007b5..5792251916 100644 --- a/keyboards/cannonkeys/chimera65_hs/keyboard.json +++ b/keyboards/cannonkeys/chimera65_hs/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ellipse/keyboard.json b/keyboards/cannonkeys/ellipse/keyboard.json index c7e37befbd..4bc159617e 100644 --- a/keyboards/cannonkeys/ellipse/keyboard.json +++ b/keyboards/cannonkeys/ellipse/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ellipse_hs/keyboard.json b/keyboards/cannonkeys/ellipse_hs/keyboard.json index da79dea27a..52b7a4a918 100644 --- a/keyboards/cannonkeys/ellipse_hs/keyboard.json +++ b/keyboards/cannonkeys/ellipse_hs/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/leviatan/keyboard.json b/keyboards/cannonkeys/leviatan/keyboard.json index c929447e89..880d30c1e3 100644 --- a/keyboards/cannonkeys/leviatan/keyboard.json +++ b/keyboards/cannonkeys/leviatan/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/meetuppad2023/keyboard.json b/keyboards/cannonkeys/meetuppad2023/keyboard.json index e55d4361d8..f43892a949 100644 --- a/keyboards/cannonkeys/meetuppad2023/keyboard.json +++ b/keyboards/cannonkeys/meetuppad2023/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/moment/keyboard.json b/keyboards/cannonkeys/moment/keyboard.json index 4aec3c9c06..aa718a6c72 100644 --- a/keyboards/cannonkeys/moment/keyboard.json +++ b/keyboards/cannonkeys/moment/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/moment_hs/keyboard.json b/keyboards/cannonkeys/moment_hs/keyboard.json index dc1f650322..4729376080 100644 --- a/keyboards/cannonkeys/moment_hs/keyboard.json +++ b/keyboards/cannonkeys/moment_hs/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/nearfield/keyboard.json b/keyboards/cannonkeys/nearfield/keyboard.json index 784d26bd6f..0afc36ced0 100644 --- a/keyboards/cannonkeys/nearfield/keyboard.json +++ b/keyboards/cannonkeys/nearfield/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ortho48v2/keyboard.json b/keyboards/cannonkeys/ortho48v2/keyboard.json index 4ead7db042..607b687e05 100644 --- a/keyboards/cannonkeys/ortho48v2/keyboard.json +++ b/keyboards/cannonkeys/ortho48v2/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ortho60v2/keyboard.json b/keyboards/cannonkeys/ortho60v2/keyboard.json index 360c98bff9..be60c49d37 100644 --- a/keyboards/cannonkeys/ortho60v2/keyboard.json +++ b/keyboards/cannonkeys/ortho60v2/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/petrichor/keyboard.json b/keyboards/cannonkeys/petrichor/keyboard.json index ecec61e7cf..16e03eacb6 100644 --- a/keyboards/cannonkeys/petrichor/keyboard.json +++ b/keyboards/cannonkeys/petrichor/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/reverie/info.json b/keyboards/cannonkeys/reverie/info.json index 1e2a885781..793365bb60 100644 --- a/keyboards/cannonkeys/reverie/info.json +++ b/keyboards/cannonkeys/reverie/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ripple/keyboard.json b/keyboards/cannonkeys/ripple/keyboard.json index bce98e226c..605b180847 100644 --- a/keyboards/cannonkeys/ripple/keyboard.json +++ b/keyboards/cannonkeys/ripple/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ripple_hs/keyboard.json b/keyboards/cannonkeys/ripple_hs/keyboard.json index 7892acc6c6..55a47524a3 100644 --- a/keyboards/cannonkeys/ripple_hs/keyboard.json +++ b/keyboards/cannonkeys/ripple_hs/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/satisfaction75/info.json b/keyboards/cannonkeys/satisfaction75/info.json index 96aeca80ee..a5d21c9384 100644 --- a/keyboards/cannonkeys/satisfaction75/info.json +++ b/keyboards/cannonkeys/satisfaction75/info.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cannonkeys/serenity/keyboard.json b/keyboards/cannonkeys/serenity/keyboard.json index 3259baaca9..ad972da149 100644 --- a/keyboards/cannonkeys/serenity/keyboard.json +++ b/keyboards/cannonkeys/serenity/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/typeb/keyboard.json b/keyboards/cannonkeys/typeb/keyboard.json index 1f16991205..ef89d38caf 100644 --- a/keyboards/cannonkeys/typeb/keyboard.json +++ b/keyboards/cannonkeys/typeb/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/vector/keyboard.json b/keyboards/cannonkeys/vector/keyboard.json index 1c3e6e0ac2..b0481ea474 100644 --- a/keyboards/cannonkeys/vector/keyboard.json +++ b/keyboards/cannonkeys/vector/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/vida/info.json b/keyboards/cannonkeys/vida/info.json index 8a5ddfe8bd..d3a4f01aa4 100644 --- a/keyboards/cannonkeys/vida/info.json +++ b/keyboards/cannonkeys/vida/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cantor/keyboard.json b/keyboards/cantor/keyboard.json index 26b79c0280..5df6f972ee 100644 --- a/keyboards/cantor/keyboard.json +++ b/keyboards/cantor/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/capsunlocked/cu24/keyboard.json b/keyboards/capsunlocked/cu24/keyboard.json index db367ceba3..0d393d1d8d 100644 --- a/keyboards/capsunlocked/cu24/keyboard.json +++ b/keyboards/capsunlocked/cu24/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/capsunlocked/cu65/keyboard.json b/keyboards/capsunlocked/cu65/keyboard.json index aa45e9e498..dbb4f35fb2 100644 --- a/keyboards/capsunlocked/cu65/keyboard.json +++ b/keyboards/capsunlocked/cu65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/capsunlocked/cu7/keyboard.json b/keyboards/capsunlocked/cu7/keyboard.json index 46f8b34213..1eb8a56944 100644 --- a/keyboards/capsunlocked/cu7/keyboard.json +++ b/keyboards/capsunlocked/cu7/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/capsunlocked/cu80/v1/keyboard.json b/keyboards/capsunlocked/cu80/v1/keyboard.json index e3283d99cb..0cc05a554b 100644 --- a/keyboards/capsunlocked/cu80/v1/keyboard.json +++ b/keyboards/capsunlocked/cu80/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/carbo65/keyboard.json b/keyboards/carbo65/keyboard.json index f2a4ce0dac..61a11d3c49 100644 --- a/keyboards/carbo65/keyboard.json +++ b/keyboards/carbo65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cest73/tkm/keyboard.json b/keyboards/cest73/tkm/keyboard.json index e9aad4461b..05d857c329 100644 --- a/keyboards/cest73/tkm/keyboard.json +++ b/keyboards/cest73/tkm/keyboard.json @@ -13,7 +13,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/chalice/keyboard.json b/keyboards/chalice/keyboard.json index b8b4436966..455ee6ba43 100644 --- a/keyboards/chalice/keyboard.json +++ b/keyboards/chalice/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/chaos65/keyboard.json b/keyboards/chaos65/keyboard.json index ed3f33e0c3..5cd34b1bb0 100644 --- a/keyboards/chaos65/keyboard.json +++ b/keyboards/chaos65/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/charue/sunsetter_r2/keyboard.json b/keyboards/charue/sunsetter_r2/keyboard.json index b7b7cc8d92..6763a55865 100644 --- a/keyboards/charue/sunsetter_r2/keyboard.json +++ b/keyboards/charue/sunsetter_r2/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/chavdai40/rev1/keyboard.json b/keyboards/chavdai40/rev1/keyboard.json index 22c4ccfb7b..1e4590b648 100644 --- a/keyboards/chavdai40/rev1/keyboard.json +++ b/keyboards/chavdai40/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/chavdai40/rev2/keyboard.json b/keyboards/chavdai40/rev2/keyboard.json index b43c68604f..2930c599a2 100644 --- a/keyboards/chavdai40/rev2/keyboard.json +++ b/keyboards/chavdai40/rev2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/checkerboards/axon40/keyboard.json b/keyboards/checkerboards/axon40/keyboard.json index 432602659e..b83093709c 100644 --- a/keyboards/checkerboards/axon40/keyboard.json +++ b/keyboards/checkerboards/axon40/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/checkerboards/candybar_ortho/keyboard.json b/keyboards/checkerboards/candybar_ortho/keyboard.json index 1b9e264653..e9735a0bca 100644 --- a/keyboards/checkerboards/candybar_ortho/keyboard.json +++ b/keyboards/checkerboards/candybar_ortho/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/checkerboards/g_idb60/keyboard.json b/keyboards/checkerboards/g_idb60/keyboard.json index cf1530b50b..8d61bfc691 100644 --- a/keyboards/checkerboards/g_idb60/keyboard.json +++ b/keyboards/checkerboards/g_idb60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/checkerboards/nop60/keyboard.json b/keyboards/checkerboards/nop60/keyboard.json index fb0e7b23df..d4648387f5 100644 --- a/keyboards/checkerboards/nop60/keyboard.json +++ b/keyboards/checkerboards/nop60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/checkerboards/plexus75/keyboard.json b/keyboards/checkerboards/plexus75/keyboard.json index e457f7f3e6..4bab1ce986 100644 --- a/keyboards/checkerboards/plexus75/keyboard.json +++ b/keyboards/checkerboards/plexus75/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/checkerboards/plexus75_he/keyboard.json b/keyboards/checkerboards/plexus75_he/keyboard.json index 2da1bf34f3..aa9a62c85b 100644 --- a/keyboards/checkerboards/plexus75_he/keyboard.json +++ b/keyboards/checkerboards/plexus75_he/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/checkerboards/pursuit40/keyboard.json b/keyboards/checkerboards/pursuit40/keyboard.json index 996a55850d..61fabc55fe 100644 --- a/keyboards/checkerboards/pursuit40/keyboard.json +++ b/keyboards/checkerboards/pursuit40/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/checkerboards/quark_lp/keyboard.json b/keyboards/checkerboards/quark_lp/keyboard.json index 59fda2efc8..8e53b1e846 100644 --- a/keyboards/checkerboards/quark_lp/keyboard.json +++ b/keyboards/checkerboards/quark_lp/keyboard.json @@ -41,7 +41,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/checkerboards/quark_plus/keyboard.json b/keyboards/checkerboards/quark_plus/keyboard.json index 311d21c219..12b92e2518 100644 --- a/keyboards/checkerboards/quark_plus/keyboard.json +++ b/keyboards/checkerboards/quark_plus/keyboard.json @@ -33,7 +33,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json index aaf5fb3e61..acd55fe0f7 100644 --- a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json +++ b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb1800/keyboard.json b/keyboards/cherrybstudio/cb1800/keyboard.json index fedcc1c75e..e083ebb447 100644 --- a/keyboards/cherrybstudio/cb1800/keyboard.json +++ b/keyboards/cherrybstudio/cb1800/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb65/keyboard.json b/keyboards/cherrybstudio/cb65/keyboard.json index 8f14ec0941..18d550debf 100644 --- a/keyboards/cherrybstudio/cb65/keyboard.json +++ b/keyboards/cherrybstudio/cb65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87/keyboard.json b/keyboards/cherrybstudio/cb87/keyboard.json index 417c40e53d..ecac5771c0 100644 --- a/keyboards/cherrybstudio/cb87/keyboard.json +++ b/keyboards/cherrybstudio/cb87/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87rgb/keyboard.json b/keyboards/cherrybstudio/cb87rgb/keyboard.json index d2cc0c72de..9388e8e4da 100644 --- a/keyboards/cherrybstudio/cb87rgb/keyboard.json +++ b/keyboards/cherrybstudio/cb87rgb/keyboard.json @@ -59,7 +59,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87v2/keyboard.json b/keyboards/cherrybstudio/cb87v2/keyboard.json index c40bb1778f..0de77d8f76 100644 --- a/keyboards/cherrybstudio/cb87v2/keyboard.json +++ b/keyboards/cherrybstudio/cb87v2/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cheshire/curiosity/keyboard.json b/keyboards/cheshire/curiosity/keyboard.json index b408a5b6e9..33daaa5781 100644 --- a/keyboards/cheshire/curiosity/keyboard.json +++ b/keyboards/cheshire/curiosity/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/chew/keyboard.json b/keyboards/chew/keyboard.json index 01175e6341..767ffb7d84 100644 --- a/keyboards/chew/keyboard.json +++ b/keyboards/chew/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chickenman/ciel/keyboard.json b/keyboards/chickenman/ciel/keyboard.json index 45c4c76048..239acefe2a 100644 --- a/keyboards/chickenman/ciel/keyboard.json +++ b/keyboards/chickenman/ciel/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/chickenman/ciel65/keyboard.json b/keyboards/chickenman/ciel65/keyboard.json index 7943e44311..db147c8e00 100644 --- a/keyboards/chickenman/ciel65/keyboard.json +++ b/keyboards/chickenman/ciel65/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true diff --git a/keyboards/chill/ghoul/keyboard.json b/keyboards/chill/ghoul/keyboard.json index ff7435959c..c32380715f 100644 --- a/keyboards/chill/ghoul/keyboard.json +++ b/keyboards/chill/ghoul/keyboard.json @@ -13,7 +13,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/lfn_merro60/keyboard.json b/keyboards/chlx/lfn_merro60/keyboard.json index 54a235c7f8..f4cbc35fb4 100644 --- a/keyboards/chlx/lfn_merro60/keyboard.json +++ b/keyboards/chlx/lfn_merro60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/merro60/keyboard.json b/keyboards/chlx/merro60/keyboard.json index 31f83f80a5..671197041f 100644 --- a/keyboards/chlx/merro60/keyboard.json +++ b/keyboards/chlx/merro60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/piche60/keyboard.json b/keyboards/chlx/piche60/keyboard.json index 7eafe4f84f..194e8c0353 100644 --- a/keyboards/chlx/piche60/keyboard.json +++ b/keyboards/chlx/piche60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/ppr_merro60/keyboard.json b/keyboards/chlx/ppr_merro60/keyboard.json index 9f056fef52..ea819dcc93 100644 --- a/keyboards/chlx/ppr_merro60/keyboard.json +++ b/keyboards/chlx/ppr_merro60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chocofly/v1/keyboard.json b/keyboards/chocofly/v1/keyboard.json index 195d1e9a9f..1670cc1475 100644 --- a/keyboards/chocofly/v1/keyboard.json +++ b/keyboards/chocofly/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/chocv/keyboard.json b/keyboards/chocv/keyboard.json index 670e46f817..fe828da592 100644 --- a/keyboards/chocv/keyboard.json +++ b/keyboards/chocv/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chord/zero/keyboard.json b/keyboards/chord/zero/keyboard.json index 63e74546d5..20db51cf8c 100644 --- a/keyboards/chord/zero/keyboard.json +++ b/keyboards/chord/zero/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/chosfox/cf81/keyboard.json b/keyboards/chosfox/cf81/keyboard.json index aae2421a03..4776d1f0a4 100644 --- a/keyboards/chosfox/cf81/keyboard.json +++ b/keyboards/chosfox/cf81/keyboard.json @@ -22,7 +22,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true, diff --git a/keyboards/chouchou/keyboard.json b/keyboards/chouchou/keyboard.json index 726f190aab..3494f2e3b0 100644 --- a/keyboards/chouchou/keyboard.json +++ b/keyboards/chouchou/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/chromatonemini/keyboard.json b/keyboards/chromatonemini/keyboard.json index 963496a0c0..454938ca0c 100644 --- a/keyboards/chromatonemini/keyboard.json +++ b/keyboards/chromatonemini/keyboard.json @@ -12,7 +12,6 @@ "extrakey": true, "encoder": true, "bootmagic": false, - "console": false, "mousekey": false, "nkro": false }, diff --git a/keyboards/churrosoft/deck8/info.json b/keyboards/churrosoft/deck8/info.json index 00fc2d1bad..d656997b78 100644 --- a/keyboards/churrosoft/deck8/info.json +++ b/keyboards/churrosoft/deck8/info.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cipulot/kallos/keyboard.json b/keyboards/cipulot/kallos/keyboard.json index 8a2e45e012..beb9849f83 100644 --- a/keyboards/cipulot/kallos/keyboard.json +++ b/keyboards/cipulot/kallos/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/ck60i/keyboard.json b/keyboards/ck60i/keyboard.json index 70535c5a76..d628275c48 100644 --- a/keyboards/ck60i/keyboard.json +++ b/keyboards/ck60i/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ckeys/handwire_101/keyboard.json b/keyboards/ckeys/handwire_101/keyboard.json index 642d0d8a25..42391dc48d 100644 --- a/keyboards/ckeys/handwire_101/keyboard.json +++ b/keyboards/ckeys/handwire_101/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ckeys/obelus/keyboard.json b/keyboards/ckeys/obelus/keyboard.json index 39e3cbb115..da2af2d7f2 100644 --- a/keyboards/ckeys/obelus/keyboard.json +++ b/keyboards/ckeys/obelus/keyboard.json @@ -11,7 +11,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/ckeys/thedora/keyboard.json b/keyboards/ckeys/thedora/keyboard.json index d287e81a0b..c3b44a37c3 100644 --- a/keyboards/ckeys/thedora/keyboard.json +++ b/keyboards/ckeys/thedora/keyboard.json @@ -12,7 +12,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "midi": true, diff --git a/keyboards/ckeys/washington/keyboard.json b/keyboards/ckeys/washington/keyboard.json index b410e16f93..e0dda049b8 100644 --- a/keyboards/ckeys/washington/keyboard.json +++ b/keyboards/ckeys/washington/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clap_studio/flame60/keyboard.json b/keyboards/clap_studio/flame60/keyboard.json index 7f6b9014ae..0f768d4fae 100644 --- a/keyboards/clap_studio/flame60/keyboard.json +++ b/keyboards/clap_studio/flame60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/clawsome/fightpad/keyboard.json b/keyboards/clawsome/fightpad/keyboard.json index 7333349028..fa3ac4a655 100644 --- a/keyboards/clawsome/fightpad/keyboard.json +++ b/keyboards/clawsome/fightpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/clueboard/66/rev3/keyboard.json b/keyboards/clueboard/66/rev3/keyboard.json index 7713c73481..dac09573f2 100644 --- a/keyboards/clueboard/66/rev3/keyboard.json +++ b/keyboards/clueboard/66/rev3/keyboard.json @@ -9,7 +9,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cmm_studio/saka68/solder/keyboard.json b/keyboards/cmm_studio/saka68/solder/keyboard.json index 1ce357aabf..c5b2e0b677 100644 --- a/keyboards/cmm_studio/saka68/solder/keyboard.json +++ b/keyboards/cmm_studio/saka68/solder/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/coban/pad3a/keyboard.json b/keyboards/coban/pad3a/keyboard.json index a9a78b8220..fe8bd12571 100644 --- a/keyboards/coban/pad3a/keyboard.json +++ b/keyboards/coban/pad3a/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/compound/keyboard.json b/keyboards/compound/keyboard.json index a0a1e1e949..cbb5eb711f 100644 --- a/keyboards/compound/keyboard.json +++ b/keyboards/compound/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/concreteflowers/cor/keyboard.json b/keyboards/concreteflowers/cor/keyboard.json index a4553229a7..c105338b5e 100644 --- a/keyboards/concreteflowers/cor/keyboard.json +++ b/keyboards/concreteflowers/cor/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/concreteflowers/cor_tkl/keyboard.json b/keyboards/concreteflowers/cor_tkl/keyboard.json index 3d98077e13..d162bb386c 100644 --- a/keyboards/concreteflowers/cor_tkl/keyboard.json +++ b/keyboards/concreteflowers/cor_tkl/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgb_matrix": true diff --git a/keyboards/contender/keyboard.json b/keyboards/contender/keyboard.json index 2e5ef84412..cc4139d167 100644 --- a/keyboards/contender/keyboard.json +++ b/keyboards/contender/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/controllerworks/city42/keyboard.json b/keyboards/controllerworks/city42/keyboard.json index 6657a7485b..bb3b060c42 100644 --- a/keyboards/controllerworks/city42/keyboard.json +++ b/keyboards/controllerworks/city42/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/controllerworks/mini36/keyboard.json b/keyboards/controllerworks/mini36/keyboard.json index 8039025a28..ad880660c0 100644 --- a/keyboards/controllerworks/mini36/keyboard.json +++ b/keyboards/controllerworks/mini36/keyboard.json @@ -55,7 +55,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/controllerworks/mini42/keyboard.json b/keyboards/controllerworks/mini42/keyboard.json index ceb7f8ce1f..cbd90c890f 100644 --- a/keyboards/controllerworks/mini42/keyboard.json +++ b/keyboards/controllerworks/mini42/keyboard.json @@ -55,7 +55,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/converter/a1200/miss1200/keyboard.json b/keyboards/converter/a1200/miss1200/keyboard.json index 1f7bfcda3f..1ce08f9b3e 100644 --- a/keyboards/converter/a1200/miss1200/keyboard.json +++ b/keyboards/converter/a1200/miss1200/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/converter/a1200/mistress1200/keyboard.json b/keyboards/converter/a1200/mistress1200/keyboard.json index c2cf110b2a..15cc0e24f3 100644 --- a/keyboards/converter/a1200/mistress1200/keyboard.json +++ b/keyboards/converter/a1200/mistress1200/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "grave_esc": false, "magic": false, diff --git a/keyboards/converter/a1200/teensy2pp/keyboard.json b/keyboards/converter/a1200/teensy2pp/keyboard.json index 0766123913..6c04e55d77 100644 --- a/keyboards/converter/a1200/teensy2pp/keyboard.json +++ b/keyboards/converter/a1200/teensy2pp/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/cool836a/keyboard.json b/keyboards/cool836a/keyboard.json index 3d32f45c9d..660ab72612 100644 --- a/keyboards/cool836a/keyboard.json +++ b/keyboards/cool836a/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/copenhagen_click/click_pad_v1/keyboard.json b/keyboards/copenhagen_click/click_pad_v1/keyboard.json index d84630cfbc..0b133d8963 100755 --- a/keyboards/copenhagen_click/click_pad_v1/keyboard.json +++ b/keyboards/copenhagen_click/click_pad_v1/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/coseyfannitutti/discipad/keyboard.json b/keyboards/coseyfannitutti/discipad/keyboard.json index 5c491876e4..177129b6f9 100644 --- a/keyboards/coseyfannitutti/discipad/keyboard.json +++ b/keyboards/coseyfannitutti/discipad/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/coseyfannitutti/romeo/keyboard.json b/keyboards/coseyfannitutti/romeo/keyboard.json index 260589889a..d4edb56150 100644 --- a/keyboards/coseyfannitutti/romeo/keyboard.json +++ b/keyboards/coseyfannitutti/romeo/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cosmo65/keyboard.json b/keyboards/cosmo65/keyboard.json index 1814b3f0d0..690170b1d1 100644 --- a/keyboards/cosmo65/keyboard.json +++ b/keyboards/cosmo65/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cozykeys/bloomer/v2/keyboard.json b/keyboards/cozykeys/bloomer/v2/keyboard.json index 9f09db86fa..e6611921e7 100644 --- a/keyboards/cozykeys/bloomer/v2/keyboard.json +++ b/keyboards/cozykeys/bloomer/v2/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/cozykeys/bloomer/v3/keyboard.json b/keyboards/cozykeys/bloomer/v3/keyboard.json index a0f04956af..1b58004d2e 100644 --- a/keyboards/cozykeys/bloomer/v3/keyboard.json +++ b/keyboards/cozykeys/bloomer/v3/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/cozykeys/speedo/v2/keyboard.json b/keyboards/cozykeys/speedo/v2/keyboard.json index 69dd33d6b6..de5215bcce 100644 --- a/keyboards/cozykeys/speedo/v2/keyboard.json +++ b/keyboards/cozykeys/speedo/v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cradio/keyboard.json b/keyboards/cradio/keyboard.json index 433c6e96e9..1600a1fd24 100644 --- a/keyboards/cradio/keyboard.json +++ b/keyboards/cradio/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/crawlpad/keyboard.json b/keyboards/crawlpad/keyboard.json index a10d1ca9c3..0fbda2e6e7 100644 --- a/keyboards/crawlpad/keyboard.json +++ b/keyboards/crawlpad/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/crazy_keyboard_68/keyboard.json b/keyboards/crazy_keyboard_68/keyboard.json index f87a3675af..62d08a4849 100644 --- a/keyboards/crazy_keyboard_68/keyboard.json +++ b/keyboards/crazy_keyboard_68/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/crbn/keyboard.json b/keyboards/crbn/keyboard.json index 9febd33ed6..8ea9c9de2f 100644 --- a/keyboards/crbn/keyboard.json +++ b/keyboards/crbn/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/creatkeebs/glacier/keyboard.json b/keyboards/creatkeebs/glacier/keyboard.json index e1e94ab8eb..ccda609975 100644 --- a/keyboards/creatkeebs/glacier/keyboard.json +++ b/keyboards/creatkeebs/glacier/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/creatkeebs/thera/keyboard.json b/keyboards/creatkeebs/thera/keyboard.json index ab10fda324..956987da87 100644 --- a/keyboards/creatkeebs/thera/keyboard.json +++ b/keyboards/creatkeebs/thera/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/custommk/ergostrafer/keyboard.json b/keyboards/custommk/ergostrafer/keyboard.json index 4f23417415..7c4f90d00a 100644 --- a/keyboards/custommk/ergostrafer/keyboard.json +++ b/keyboards/custommk/ergostrafer/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/custommk/evo70/keyboard.json b/keyboards/custommk/evo70/keyboard.json index 95464e691a..4dd8f8c01b 100644 --- a/keyboards/custommk/evo70/keyboard.json +++ b/keyboards/custommk/evo70/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "backlight": true, diff --git a/keyboards/custommk/evo70_r2/keyboard.json b/keyboards/custommk/evo70_r2/keyboard.json index 5f10d6705d..7fb79f3a7e 100644 --- a/keyboards/custommk/evo70_r2/keyboard.json +++ b/keyboards/custommk/evo70_r2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cutie_club/borsdorf/keyboard.json b/keyboards/cutie_club/borsdorf/keyboard.json index ddf8dfeda4..b428915801 100644 --- a/keyboards/cutie_club/borsdorf/keyboard.json +++ b/keyboards/cutie_club/borsdorf/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/fidelity/keyboard.json b/keyboards/cutie_club/fidelity/keyboard.json index e1ca2a430e..565cf90729 100644 --- a/keyboards/cutie_club/fidelity/keyboard.json +++ b/keyboards/cutie_club/fidelity/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true }, diff --git a/keyboards/cutie_club/giant_macro_pad/keyboard.json b/keyboards/cutie_club/giant_macro_pad/keyboard.json index 2eb2542603..ab447987ec 100644 --- a/keyboards/cutie_club/giant_macro_pad/keyboard.json +++ b/keyboards/cutie_club/giant_macro_pad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/keebcats/denis/keyboard.json b/keyboards/cutie_club/keebcats/denis/keyboard.json index 052e22c1b1..9744aefb3e 100644 --- a/keyboards/cutie_club/keebcats/denis/keyboard.json +++ b/keyboards/cutie_club/keebcats/denis/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/keebcats/dougal/keyboard.json b/keyboards/cutie_club/keebcats/dougal/keyboard.json index c607977564..a357f4a8ac 100644 --- a/keyboards/cutie_club/keebcats/dougal/keyboard.json +++ b/keyboards/cutie_club/keebcats/dougal/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/novus/keyboard.json b/keyboards/cutie_club/novus/keyboard.json index a5f47f8d51..b1de3503a6 100644 --- a/keyboards/cutie_club/novus/keyboard.json +++ b/keyboards/cutie_club/novus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/wraith/keyboard.json b/keyboards/cutie_club/wraith/keyboard.json index 6da586acfe..b163eb76a9 100644 --- a/keyboards/cutie_club/wraith/keyboard.json +++ b/keyboards/cutie_club/wraith/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cx60/keyboard.json b/keyboards/cx60/keyboard.json index 24bbee5a28..c988151e04 100644 --- a/keyboards/cx60/keyboard.json +++ b/keyboards/cx60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cybergear/macro25/keyboard.json b/keyboards/cybergear/macro25/keyboard.json index a1fca49406..0f5971fc08 100644 --- a/keyboards/cybergear/macro25/keyboard.json +++ b/keyboards/cybergear/macro25/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dailycraft/bat43/info.json b/keyboards/dailycraft/bat43/info.json index 6b4026f6d4..a84438d6f2 100644 --- a/keyboards/dailycraft/bat43/info.json +++ b/keyboards/dailycraft/bat43/info.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": true, "nkro": false diff --git a/keyboards/dailycraft/owl8/keyboard.json b/keyboards/dailycraft/owl8/keyboard.json index 482a3d905f..bc4e19edf5 100644 --- a/keyboards/dailycraft/owl8/keyboard.json +++ b/keyboards/dailycraft/owl8/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/dailycraft/stickey4/keyboard.json b/keyboards/dailycraft/stickey4/keyboard.json index d6ec02f784..0075f53aa6 100644 --- a/keyboards/dailycraft/stickey4/keyboard.json +++ b/keyboards/dailycraft/stickey4/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/daji/seis_cinco/keyboard.json b/keyboards/daji/seis_cinco/keyboard.json index 3957dd4d0c..fd95b96224 100644 --- a/keyboards/daji/seis_cinco/keyboard.json +++ b/keyboards/daji/seis_cinco/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dark/magnum_ergo_1/keyboard.json b/keyboards/dark/magnum_ergo_1/keyboard.json index 6d3b3a5592..4e0548f061 100644 --- a/keyboards/dark/magnum_ergo_1/keyboard.json +++ b/keyboards/dark/magnum_ergo_1/keyboard.json @@ -19,7 +19,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json index 9f2ad70f12..270a5c57e5 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json +++ b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/darmoshark/k3/keyboard.json b/keyboards/darmoshark/k3/keyboard.json index e62d1908ed..d3fb379427 100644 --- a/keyboards/darmoshark/k3/keyboard.json +++ b/keyboards/darmoshark/k3/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/db/db63/keyboard.json b/keyboards/db/db63/keyboard.json index ec41b8c313..b3db08c01c 100644 --- a/keyboards/db/db63/keyboard.json +++ b/keyboards/db/db63/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/decent/tkl/keyboard.json b/keyboards/decent/tkl/keyboard.json index 96b472c6fc..ff51650197 100644 --- a/keyboards/decent/tkl/keyboard.json +++ b/keyboards/decent/tkl/keyboard.json @@ -12,7 +12,6 @@ "rgb_matrix": true, "oled": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/delikeeb/flatbread60/keyboard.json b/keyboards/delikeeb/flatbread60/keyboard.json index 2de307ab2a..2e55e673a4 100644 --- a/keyboards/delikeeb/flatbread60/keyboard.json +++ b/keyboards/delikeeb/flatbread60/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/delikeeb/vaguettelite/keyboard.json b/keyboards/delikeeb/vaguettelite/keyboard.json index e438fd9bfb..e78cc9592f 100644 --- a/keyboards/delikeeb/vaguettelite/keyboard.json +++ b/keyboards/delikeeb/vaguettelite/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vanana/rev1/keyboard.json b/keyboards/delikeeb/vanana/rev1/keyboard.json index d8d5d2e4c9..d2e2573193 100644 --- a/keyboards/delikeeb/vanana/rev1/keyboard.json +++ b/keyboards/delikeeb/vanana/rev1/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vanana/rev2/keyboard.json b/keyboards/delikeeb/vanana/rev2/keyboard.json index 9da7a9dd88..bffa44ab8e 100644 --- a/keyboards/delikeeb/vanana/rev2/keyboard.json +++ b/keyboards/delikeeb/vanana/rev2/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vaneela/keyboard.json b/keyboards/delikeeb/vaneela/keyboard.json index 5f76c8b7ab..be59169e3c 100644 --- a/keyboards/delikeeb/vaneela/keyboard.json +++ b/keyboards/delikeeb/vaneela/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/delikeeb/vaneelaex/keyboard.json b/keyboards/delikeeb/vaneelaex/keyboard.json index 9810d341ab..716ec96b73 100644 --- a/keyboards/delikeeb/vaneelaex/keyboard.json +++ b/keyboards/delikeeb/vaneelaex/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json b/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json index 22fb33aade..fc723363e8 100644 --- a/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json +++ b/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json @@ -4,7 +4,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json b/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json index 55e68c4393..d92c0fd0ec 100644 --- a/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json +++ b/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json @@ -4,7 +4,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/deltapad/keyboard.json b/keyboards/deltapad/keyboard.json index 262f6bc41b..64c17bf562 100644 --- a/keyboards/deltapad/keyboard.json +++ b/keyboards/deltapad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/demiurge/keyboard.json b/keyboards/demiurge/keyboard.json index 80b1b477e1..bf42c58cb6 100644 --- a/keyboards/demiurge/keyboard.json +++ b/keyboards/demiurge/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/deng/djam/keyboard.json b/keyboards/deng/djam/keyboard.json index 0589af4938..6e40eef155 100644 --- a/keyboards/deng/djam/keyboard.json +++ b/keyboards/deng/djam/keyboard.json @@ -21,7 +21,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dinofizz/fnrow/v1/keyboard.json b/keyboards/dinofizz/fnrow/v1/keyboard.json index 16f80b780d..be4284e4b5 100644 --- a/keyboards/dinofizz/fnrow/v1/keyboard.json +++ b/keyboards/dinofizz/fnrow/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/dk60/keyboard.json b/keyboards/dk60/keyboard.json index 990cd7cfcc..63b81384f7 100644 --- a/keyboards/dk60/keyboard.json +++ b/keyboards/dk60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dm9records/lain/keyboard.json b/keyboards/dm9records/lain/keyboard.json index 32cece9f15..79a4bbfb4b 100644 --- a/keyboards/dm9records/lain/keyboard.json +++ b/keyboards/dm9records/lain/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dmqdesign/spin/keyboard.json b/keyboards/dmqdesign/spin/keyboard.json index b271f1ebd5..1e3c51f395 100644 --- a/keyboards/dmqdesign/spin/keyboard.json +++ b/keyboards/dmqdesign/spin/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "midi": true, diff --git a/keyboards/dnworks/frltkl/keyboard.json b/keyboards/dnworks/frltkl/keyboard.json index 86796a6084..88a9db338b 100644 --- a/keyboards/dnworks/frltkl/keyboard.json +++ b/keyboards/dnworks/frltkl/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/dnworks/sbl/keyboard.json b/keyboards/dnworks/sbl/keyboard.json index 2086fc5aa1..44cb250533 100644 --- a/keyboards/dnworks/sbl/keyboard.json +++ b/keyboards/dnworks/sbl/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/do60/keyboard.json b/keyboards/do60/keyboard.json index 88cf1873e5..2a16cf0adf 100644 --- a/keyboards/do60/keyboard.json +++ b/keyboards/do60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/doio/kb04/keyboard.json b/keyboards/doio/kb04/keyboard.json index 2455f82e03..8936c7ff36 100644 --- a/keyboards/doio/kb04/keyboard.json +++ b/keyboards/doio/kb04/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb09/keyboard.json b/keyboards/doio/kb09/keyboard.json index f80f19cfda..9cf880f39d 100644 --- a/keyboards/doio/kb09/keyboard.json +++ b/keyboards/doio/kb09/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb12/keyboard.json b/keyboards/doio/kb12/keyboard.json index fa450de512..708e4a97d7 100644 --- a/keyboards/doio/kb12/keyboard.json +++ b/keyboards/doio/kb12/keyboard.json @@ -94,7 +94,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/doio/kb19/keyboard.json b/keyboards/doio/kb19/keyboard.json index 6b97350b31..4fe6758a62 100644 --- a/keyboards/doio/kb19/keyboard.json +++ b/keyboards/doio/kb19/keyboard.json @@ -12,7 +12,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "encoder": true, "nkro": false, diff --git a/keyboards/doio/kb30/keyboard.json b/keyboards/doio/kb30/keyboard.json index 68b79d0393..6b815eb929 100644 --- a/keyboards/doio/kb30/keyboard.json +++ b/keyboards/doio/kb30/keyboard.json @@ -93,7 +93,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb38/keyboard.json b/keyboards/doio/kb38/keyboard.json index a46f1a6a45..55c5b7df89 100644 --- a/keyboards/doio/kb38/keyboard.json +++ b/keyboards/doio/kb38/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/donutcables/budget96/keyboard.json b/keyboards/donutcables/budget96/keyboard.json index 972149440d..6b9b99abd9 100644 --- a/keyboards/donutcables/budget96/keyboard.json +++ b/keyboards/donutcables/budget96/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/donutcables/scrabblepad/keyboard.json b/keyboards/donutcables/scrabblepad/keyboard.json index 9ee05346a0..a6d668c2ad 100644 --- a/keyboards/donutcables/scrabblepad/keyboard.json +++ b/keyboards/donutcables/scrabblepad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/doro67/rgb/keyboard.json b/keyboards/doro67/rgb/keyboard.json index 520ffbc870..d0fb842bf5 100644 --- a/keyboards/doro67/rgb/keyboard.json +++ b/keyboards/doro67/rgb/keyboard.json @@ -56,7 +56,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/dotmod/dymium65/keyboard.json b/keyboards/dotmod/dymium65/keyboard.json index c5cd1b2cb7..d4406f979a 100644 --- a/keyboards/dotmod/dymium65/keyboard.json +++ b/keyboards/dotmod/dymium65/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "mousekey": true, diff --git a/keyboards/dp3000/rev1/keyboard.json b/keyboards/dp3000/rev1/keyboard.json index aa7ff8bc0a..2723edb778 100644 --- a/keyboards/dp3000/rev1/keyboard.json +++ b/keyboards/dp3000/rev1/keyboard.json @@ -3,7 +3,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "encoder": true, "oled": true, diff --git a/keyboards/dp3000/rev2/keyboard.json b/keyboards/dp3000/rev2/keyboard.json index 7d82c38460..241915a66f 100644 --- a/keyboards/dp3000/rev2/keyboard.json +++ b/keyboards/dp3000/rev2/keyboard.json @@ -3,7 +3,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "encoder": true, "oled": true, diff --git a/keyboards/draytronics/daisy/keyboard.json b/keyboards/draytronics/daisy/keyboard.json index 92b0b54f43..069570c930 100644 --- a/keyboards/draytronics/daisy/keyboard.json +++ b/keyboards/draytronics/daisy/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/draytronics/elise/keyboard.json b/keyboards/draytronics/elise/keyboard.json index 782c61d764..6a273d0d1d 100644 --- a/keyboards/draytronics/elise/keyboard.json +++ b/keyboards/draytronics/elise/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/draytronics/elise_v2/keyboard.json b/keyboards/draytronics/elise_v2/keyboard.json index 217f837e19..1feabdbb7c 100644 --- a/keyboards/draytronics/elise_v2/keyboard.json +++ b/keyboards/draytronics/elise_v2/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/drewkeys/iskar/keyboard.json b/keyboards/drewkeys/iskar/keyboard.json index 66d4ebd74d..8a3b081b6a 100644 --- a/keyboards/drewkeys/iskar/keyboard.json +++ b/keyboards/drewkeys/iskar/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drhigsby/bkf/keyboard.json b/keyboards/drhigsby/bkf/keyboard.json index a3933c8228..c087c29389 100644 --- a/keyboards/drhigsby/bkf/keyboard.json +++ b/keyboards/drhigsby/bkf/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/drhigsby/dubba175/keyboard.json b/keyboards/drhigsby/dubba175/keyboard.json index 69570a1c2f..3d11c2772c 100644 --- a/keyboards/drhigsby/dubba175/keyboard.json +++ b/keyboards/drhigsby/dubba175/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drhigsby/ogurec/info.json b/keyboards/drhigsby/ogurec/info.json index f3c753f2c0..08158faeb3 100644 --- a/keyboards/drhigsby/ogurec/info.json +++ b/keyboards/drhigsby/ogurec/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/drhigsby/packrat/keyboard.json b/keyboards/drhigsby/packrat/keyboard.json index a836b0bf96..feda74b7a9 100644 --- a/keyboards/drhigsby/packrat/keyboard.json +++ b/keyboards/drhigsby/packrat/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/drop/alt/v2/keyboard.json b/keyboards/drop/alt/v2/keyboard.json index 8363aca5cf..9ef109bb8a 100644 --- a/keyboards/drop/alt/v2/keyboard.json +++ b/keyboards/drop/alt/v2/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/cstm65/keyboard.json b/keyboards/drop/cstm65/keyboard.json index 708649966e..736f57399e 100644 --- a/keyboards/drop/cstm65/keyboard.json +++ b/keyboards/drop/cstm65/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/cstm80/keyboard.json b/keyboards/drop/cstm80/keyboard.json index 5ce4e666b1..c599815bc0 100644 --- a/keyboards/drop/cstm80/keyboard.json +++ b/keyboards/drop/cstm80/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/ctrl/v2/keyboard.json b/keyboards/drop/ctrl/v2/keyboard.json index f461800dde..917ed3556f 100644 --- a/keyboards/drop/ctrl/v2/keyboard.json +++ b/keyboards/drop/ctrl/v2/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/sense75/keyboard.json b/keyboards/drop/sense75/keyboard.json index 052b494375..4e28b647ab 100644 --- a/keyboards/drop/sense75/keyboard.json +++ b/keyboards/drop/sense75/keyboard.json @@ -22,7 +22,6 @@ "encoder": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/shift/v2/keyboard.json b/keyboards/drop/shift/v2/keyboard.json index 212263d71c..8c3f97970f 100644 --- a/keyboards/drop/shift/v2/keyboard.json +++ b/keyboards/drop/shift/v2/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/thekey/v1/keyboard.json b/keyboards/drop/thekey/v1/keyboard.json index f1f204e3a0..b975610372 100644 --- a/keyboards/drop/thekey/v1/keyboard.json +++ b/keyboards/drop/thekey/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "backlight": true, diff --git a/keyboards/drop/thekey/v2/keyboard.json b/keyboards/drop/thekey/v2/keyboard.json index ced9901bea..8a29df34bb 100644 --- a/keyboards/drop/thekey/v2/keyboard.json +++ b/keyboards/drop/thekey/v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "rgblight": true diff --git a/keyboards/druah/dk_saver_redux/keyboard.json b/keyboards/druah/dk_saver_redux/keyboard.json index 6c76e10756..8f2b8023e2 100644 --- a/keyboards/druah/dk_saver_redux/keyboard.json +++ b/keyboards/druah/dk_saver_redux/keyboard.json @@ -16,7 +16,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dtisaac/cg108/keyboard.json b/keyboards/dtisaac/cg108/keyboard.json index b2d7ed34fe..9d8df8dad2 100644 --- a/keyboards/dtisaac/cg108/keyboard.json +++ b/keyboards/dtisaac/cg108/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/dtisaac/dosa40rgb/keyboard.json b/keyboards/dtisaac/dosa40rgb/keyboard.json index 6795625260..09db50aee1 100644 --- a/keyboards/dtisaac/dosa40rgb/keyboard.json +++ b/keyboards/dtisaac/dosa40rgb/keyboard.json @@ -72,7 +72,6 @@ "bluetooth": true, "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/dtisaac/dtisaac01/keyboard.json b/keyboards/dtisaac/dtisaac01/keyboard.json index a9650a8112..0d72c3f9e1 100644 --- a/keyboards/dtisaac/dtisaac01/keyboard.json +++ b/keyboards/dtisaac/dtisaac01/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/durgod/k320/base/keyboard.json b/keyboards/durgod/k320/base/keyboard.json index 89ea273baf..7c794cf8ec 100644 --- a/keyboards/durgod/k320/base/keyboard.json +++ b/keyboards/durgod/k320/base/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/dyz/dyz40/keyboard.json b/keyboards/dyz/dyz40/keyboard.json index 4916ec7ecd..e5618468a0 100644 --- a/keyboards/dyz/dyz40/keyboard.json +++ b/keyboards/dyz/dyz40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/dyz60/keyboard.json b/keyboards/dyz/dyz60/keyboard.json index 824e23d709..af5c50184e 100644 --- a/keyboards/dyz/dyz60/keyboard.json +++ b/keyboards/dyz/dyz60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/dyz60_hs/keyboard.json b/keyboards/dyz/dyz60_hs/keyboard.json index 112b128577..94d60f3b6c 100644 --- a/keyboards/dyz/dyz60_hs/keyboard.json +++ b/keyboards/dyz/dyz60_hs/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dyz/dyz_tkl/keyboard.json b/keyboards/dyz/dyz_tkl/keyboard.json index 4d8bba1710..62e0073bd4 100644 --- a/keyboards/dyz/dyz_tkl/keyboard.json +++ b/keyboards/dyz/dyz_tkl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dyz/selka40/keyboard.json b/keyboards/dyz/selka40/keyboard.json index 4a8df19633..abf627584a 100644 --- a/keyboards/dyz/selka40/keyboard.json +++ b/keyboards/dyz/selka40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/synthesis60/keyboard.json b/keyboards/dyz/synthesis60/keyboard.json index cdb4760381..1ec2c9d1cd 100644 --- a/keyboards/dyz/synthesis60/keyboard.json +++ b/keyboards/dyz/synthesis60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dz60/keyboard.json b/keyboards/dz60/keyboard.json index 3bf56b90f1..c28508105f 100644 --- a/keyboards/dz60/keyboard.json +++ b/keyboards/dz60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/bocc/keyboard.json b/keyboards/dztech/bocc/keyboard.json index e05e1828a3..2f133433b8 100644 --- a/keyboards/dztech/bocc/keyboard.json +++ b/keyboards/dztech/bocc/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/duo_s/keyboard.json b/keyboards/dztech/duo_s/keyboard.json index 76cbb57261..f05f4d41c5 100644 --- a/keyboards/dztech/duo_s/keyboard.json +++ b/keyboards/dztech/duo_s/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz60v2/keyboard.json b/keyboards/dztech/dz60v2/keyboard.json index 7714e4b7d2..292bbcfcea 100644 --- a/keyboards/dztech/dz60v2/keyboard.json +++ b/keyboards/dztech/dz60v2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz65rgb/v1/keyboard.json b/keyboards/dztech/dz65rgb/v1/keyboard.json index 6dcc88b59e..3066105727 100644 --- a/keyboards/dztech/dz65rgb/v1/keyboard.json +++ b/keyboards/dztech/dz65rgb/v1/keyboard.json @@ -47,7 +47,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz65rgb/v2/keyboard.json b/keyboards/dztech/dz65rgb/v2/keyboard.json index 16d38a3af5..523fdfb23e 100644 --- a/keyboards/dztech/dz65rgb/v2/keyboard.json +++ b/keyboards/dztech/dz65rgb/v2/keyboard.json @@ -47,7 +47,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz96/keyboard.json b/keyboards/dztech/dz96/keyboard.json index e51f574419..95c78b80f5 100644 --- a/keyboards/dztech/dz96/keyboard.json +++ b/keyboards/dztech/dz96/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/dztech/endless80/keyboard.json b/keyboards/dztech/endless80/keyboard.json index 835ef0d652..cf12595046 100644 --- a/keyboards/dztech/endless80/keyboard.json +++ b/keyboards/dztech/endless80/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/mellow/keyboard.json b/keyboards/dztech/mellow/keyboard.json index 24cd11028c..cb08e086d5 100644 --- a/keyboards/dztech/mellow/keyboard.json +++ b/keyboards/dztech/mellow/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dztech/pluto/keyboard.json b/keyboards/dztech/pluto/keyboard.json index d64e941346..790282d254 100644 --- a/keyboards/dztech/pluto/keyboard.json +++ b/keyboards/dztech/pluto/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dztech/tofu/ii/v1/keyboard.json b/keyboards/dztech/tofu/ii/v1/keyboard.json index 60ccc5ec9b..8cab6f2f1b 100644 --- a/keyboards/dztech/tofu/ii/v1/keyboard.json +++ b/keyboards/dztech/tofu/ii/v1/keyboard.json @@ -4,7 +4,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu/jr/v1/keyboard.json b/keyboards/dztech/tofu/jr/v1/keyboard.json index 12930f65d0..ede74c7368 100644 --- a/keyboards/dztech/tofu/jr/v1/keyboard.json +++ b/keyboards/dztech/tofu/jr/v1/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu/jr/v2/keyboard.json b/keyboards/dztech/tofu/jr/v2/keyboard.json index 6a60565b22..9a027e6ca8 100644 --- a/keyboards/dztech/tofu/jr/v2/keyboard.json +++ b/keyboards/dztech/tofu/jr/v2/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu60/keyboard.json b/keyboards/dztech/tofu60/keyboard.json index 149f04d46a..bc9f0f9bba 100644 --- a/keyboards/dztech/tofu60/keyboard.json +++ b/keyboards/dztech/tofu60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/earth_rover/keyboard.json b/keyboards/earth_rover/keyboard.json index 0c760f612c..e236043b84 100644 --- a/keyboards/earth_rover/keyboard.json +++ b/keyboards/earth_rover/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eason/aeroboard/keyboard.json b/keyboards/eason/aeroboard/keyboard.json index cc0771f82c..918f447dff 100644 --- a/keyboards/eason/aeroboard/keyboard.json +++ b/keyboards/eason/aeroboard/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/eason/capsule65/keyboard.json b/keyboards/eason/capsule65/keyboard.json index 9f51508a70..4e04e45831 100644 --- a/keyboards/eason/capsule65/keyboard.json +++ b/keyboards/eason/capsule65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/eason/greatsword80/keyboard.json b/keyboards/eason/greatsword80/keyboard.json index 6500fac978..88102d569b 100644 --- a/keyboards/eason/greatsword80/keyboard.json +++ b/keyboards/eason/greatsword80/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/eason/meow65/keyboard.json b/keyboards/eason/meow65/keyboard.json index df995ea359..c001dde318 100644 --- a/keyboards/eason/meow65/keyboard.json +++ b/keyboards/eason/meow65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/eason/void65h/keyboard.json b/keyboards/eason/void65h/keyboard.json index 664cfac81b..8387993a75 100644 --- a/keyboards/eason/void65h/keyboard.json +++ b/keyboards/eason/void65h/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ebastler/e80_1800/keyboard.json b/keyboards/ebastler/e80_1800/keyboard.json index dfb669e72e..1e10fd45c4 100644 --- a/keyboards/ebastler/e80_1800/keyboard.json +++ b/keyboards/ebastler/e80_1800/keyboard.json @@ -17,7 +17,6 @@ "backlight": true, "nkro": true, "command": false, - "console": false, "mousekey": false }, "matrix_pins": { diff --git a/keyboards/ebastler/isometria_75/rev1/keyboard.json b/keyboards/ebastler/isometria_75/rev1/keyboard.json index cf36d60df1..148f8b6b3f 100644 --- a/keyboards/ebastler/isometria_75/rev1/keyboard.json +++ b/keyboards/ebastler/isometria_75/rev1/keyboard.json @@ -25,7 +25,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/eco/rev1/keyboard.json b/keyboards/eco/rev1/keyboard.json index 1b3cb5f8df..e241774e81 100644 --- a/keyboards/eco/rev1/keyboard.json +++ b/keyboards/eco/rev1/keyboard.json @@ -11,7 +11,6 @@ "backlight": false, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/eco/rev2/keyboard.json b/keyboards/eco/rev2/keyboard.json index 8effdd85e5..ca8709a266 100644 --- a/keyboards/eco/rev2/keyboard.json +++ b/keyboards/eco/rev2/keyboard.json @@ -11,7 +11,6 @@ "backlight": false, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/edc40/keyboard.json b/keyboards/edc40/keyboard.json index a9a2527520..33998f4747 100644 --- a/keyboards/edc40/keyboard.json +++ b/keyboards/edc40/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/edda/keyboard.json b/keyboards/edda/keyboard.json index 4a997abeac..4482b6f70d 100644 --- a/keyboards/edda/keyboard.json +++ b/keyboards/edda/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/emajesty/eiri/keyboard.json b/keyboards/emajesty/eiri/keyboard.json index 6941bb921d..94bcb60f6c 100644 --- a/keyboards/emajesty/eiri/keyboard.json +++ b/keyboards/emajesty/eiri/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/emi20/keyboard.json b/keyboards/emi20/keyboard.json index d6fd12356a..ce623505b3 100644 --- a/keyboards/emi20/keyboard.json +++ b/keyboards/emi20/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/emptystring/nqg/keyboard.json b/keyboards/emptystring/nqg/keyboard.json index 52fae23604..a425812c4f 100644 --- a/keyboards/emptystring/nqg/keyboard.json +++ b/keyboards/emptystring/nqg/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/eniigmakeyboards/ek60/keyboard.json b/keyboards/eniigmakeyboards/ek60/keyboard.json index 09e34dfbc1..203a1f11b0 100644 --- a/keyboards/eniigmakeyboards/ek60/keyboard.json +++ b/keyboards/eniigmakeyboards/ek60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eniigmakeyboards/ek65/keyboard.json b/keyboards/eniigmakeyboards/ek65/keyboard.json index cd158f3b9a..ad64fcca0e 100644 --- a/keyboards/eniigmakeyboards/ek65/keyboard.json +++ b/keyboards/eniigmakeyboards/ek65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eniigmakeyboards/ek87/keyboard.json b/keyboards/eniigmakeyboards/ek87/keyboard.json index a136d53729..27bcc9a844 100644 --- a/keyboards/eniigmakeyboards/ek87/keyboard.json +++ b/keyboards/eniigmakeyboards/ek87/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/enviousdesign/60f/keyboard.json b/keyboards/enviousdesign/60f/keyboard.json index c163ca5d6d..84047b8d41 100644 --- a/keyboards/enviousdesign/60f/keyboard.json +++ b/keyboards/enviousdesign/60f/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/65m/keyboard.json b/keyboards/enviousdesign/65m/keyboard.json index 2328932462..d5196872f5 100644 --- a/keyboards/enviousdesign/65m/keyboard.json +++ b/keyboards/enviousdesign/65m/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/commissions/mini1800/keyboard.json b/keyboards/enviousdesign/commissions/mini1800/keyboard.json index 9303e7af23..5f3b1ee8f5 100644 --- a/keyboards/enviousdesign/commissions/mini1800/keyboard.json +++ b/keyboards/enviousdesign/commissions/mini1800/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rev0/keyboard.json b/keyboards/enviousdesign/delirium/rev0/keyboard.json index f1eb3dc59b..2895a0f2c8 100644 --- a/keyboards/enviousdesign/delirium/rev0/keyboard.json +++ b/keyboards/enviousdesign/delirium/rev0/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rev1/keyboard.json b/keyboards/enviousdesign/delirium/rev1/keyboard.json index e548d02814..bb4cb70ba5 100644 --- a/keyboards/enviousdesign/delirium/rev1/keyboard.json +++ b/keyboards/enviousdesign/delirium/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rgb/keyboard.json b/keyboards/enviousdesign/delirium/rgb/keyboard.json index b6e0bb0e0c..7e77be2a35 100644 --- a/keyboards/enviousdesign/delirium/rgb/keyboard.json +++ b/keyboards/enviousdesign/delirium/rgb/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/enviousdesign/mcro/rev1/keyboard.json b/keyboards/enviousdesign/mcro/rev1/keyboard.json index c7e4c38765..1428c87abe 100644 --- a/keyboards/enviousdesign/mcro/rev1/keyboard.json +++ b/keyboards/enviousdesign/mcro/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/era/divine/keyboard.json b/keyboards/era/divine/keyboard.json index cc67932131..cc8670de12 100644 --- a/keyboards/era/divine/keyboard.json +++ b/keyboards/era/divine/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/era/era65/keyboard.json b/keyboards/era/era65/keyboard.json index 63b96666c1..47f0046fe8 100644 --- a/keyboards/era/era65/keyboard.json +++ b/keyboards/era/era65/keyboard.json @@ -19,7 +19,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/esca/getawayvan/keyboard.json b/keyboards/esca/getawayvan/keyboard.json index 999430307b..8f9bc53776 100644 --- a/keyboards/esca/getawayvan/keyboard.json +++ b/keyboards/esca/getawayvan/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/esca/getawayvan_f042/keyboard.json b/keyboards/esca/getawayvan_f042/keyboard.json index cf27a89693..c3bce35121 100644 --- a/keyboards/esca/getawayvan_f042/keyboard.json +++ b/keyboards/esca/getawayvan_f042/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/eternal_keypad/keyboard.json b/keyboards/eternal_keypad/keyboard.json index f50f235c98..607c738cb1 100644 --- a/keyboards/eternal_keypad/keyboard.json +++ b/keyboards/eternal_keypad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/etiennecollin/wave/keyboard.json b/keyboards/etiennecollin/wave/keyboard.json index 272cbdd002..70c9cb8519 100644 --- a/keyboards/etiennecollin/wave/keyboard.json +++ b/keyboards/etiennecollin/wave/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/eve/meteor/keyboard.json b/keyboards/eve/meteor/keyboard.json index 4b3239c38c..f012bb6520 100644 --- a/keyboards/eve/meteor/keyboard.json +++ b/keyboards/eve/meteor/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/evil80/keyboard.json b/keyboards/evil80/keyboard.json index c5a6283716..629065db23 100644 --- a/keyboards/evil80/keyboard.json +++ b/keyboards/evil80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/evolv/keyboard.json b/keyboards/evolv/keyboard.json index 872f80085d..2f27fe2c10 100644 --- a/keyboards/evolv/keyboard.json +++ b/keyboards/evolv/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/evyd13/fin_pad/keyboard.json b/keyboards/evyd13/fin_pad/keyboard.json index 79d87d7153..32afce7fb1 100644 --- a/keyboards/evyd13/fin_pad/keyboard.json +++ b/keyboards/evyd13/fin_pad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/evyd13/gh80_3700/keyboard.json b/keyboards/evyd13/gh80_3700/keyboard.json index a647f46118..8bc1a40222 100644 --- a/keyboards/evyd13/gh80_3700/keyboard.json +++ b/keyboards/evyd13/gh80_3700/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/evyd13/gud70/keyboard.json b/keyboards/evyd13/gud70/keyboard.json index 00211d6167..df0b1c4e5d 100644 --- a/keyboards/evyd13/gud70/keyboard.json +++ b/keyboards/evyd13/gud70/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/mx5160/keyboard.json b/keyboards/evyd13/mx5160/keyboard.json index b50f6130ce..3d077ef4ba 100644 --- a/keyboards/evyd13/mx5160/keyboard.json +++ b/keyboards/evyd13/mx5160/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/nt210/keyboard.json b/keyboards/evyd13/nt210/keyboard.json index 1c9fab2fcc..c6c54ccf56 100644 --- a/keyboards/evyd13/nt210/keyboard.json +++ b/keyboards/evyd13/nt210/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/evyd13/nt650/keyboard.json b/keyboards/evyd13/nt650/keyboard.json index 54f3f8cce0..dc6fc74aca 100644 --- a/keyboards/evyd13/nt650/keyboard.json +++ b/keyboards/evyd13/nt650/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/evyd13/nt750/keyboard.json b/keyboards/evyd13/nt750/keyboard.json index 03c76f1040..ad6a540179 100644 --- a/keyboards/evyd13/nt750/keyboard.json +++ b/keyboards/evyd13/nt750/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/nt980/keyboard.json b/keyboards/evyd13/nt980/keyboard.json index b51a67903e..44395ae6e6 100644 --- a/keyboards/evyd13/nt980/keyboard.json +++ b/keyboards/evyd13/nt980/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/evyd13/plain60/keyboard.json b/keyboards/evyd13/plain60/keyboard.json index dd59768dbf..1fbcfd9beb 100644 --- a/keyboards/evyd13/plain60/keyboard.json +++ b/keyboards/evyd13/plain60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/quackfire/keyboard.json b/keyboards/evyd13/quackfire/keyboard.json index 85c2ae81fb..154f9cfd0e 100644 --- a/keyboards/evyd13/quackfire/keyboard.json +++ b/keyboards/evyd13/quackfire/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/evyd13/solheim68/keyboard.json b/keyboards/evyd13/solheim68/keyboard.json index 9e04b9caab..de150e3984 100644 --- a/keyboards/evyd13/solheim68/keyboard.json +++ b/keyboards/evyd13/solheim68/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/exclusive/e65/keyboard.json b/keyboards/exclusive/e65/keyboard.json index 6efd89e94f..d235ad028f 100644 --- a/keyboards/exclusive/e65/keyboard.json +++ b/keyboards/exclusive/e65/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e6_rgb/keyboard.json b/keyboards/exclusive/e6_rgb/keyboard.json index 5e6e3999be..780fd1c1ab 100644 --- a/keyboards/exclusive/e6_rgb/keyboard.json +++ b/keyboards/exclusive/e6_rgb/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/exclusive/e6v2/le/keyboard.json b/keyboards/exclusive/e6v2/le/keyboard.json index aa6be48997..25ca2ca4f8 100644 --- a/keyboards/exclusive/e6v2/le/keyboard.json +++ b/keyboards/exclusive/e6v2/le/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e6v2/le_bmc/keyboard.json b/keyboards/exclusive/e6v2/le_bmc/keyboard.json index 09d99d670f..1e36043e5a 100644 --- a/keyboards/exclusive/e6v2/le_bmc/keyboard.json +++ b/keyboards/exclusive/e6v2/le_bmc/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/exclusive/e6v2/oe/keyboard.json b/keyboards/exclusive/e6v2/oe/keyboard.json index e619e542b1..120fb76635 100644 --- a/keyboards/exclusive/e6v2/oe/keyboard.json +++ b/keyboards/exclusive/e6v2/oe/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e6v2/oe_bmc/keyboard.json b/keyboards/exclusive/e6v2/oe_bmc/keyboard.json index 7ff3099249..f287417943 100644 --- a/keyboards/exclusive/e6v2/oe_bmc/keyboard.json +++ b/keyboards/exclusive/e6v2/oe_bmc/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/exclusive/e7v1/keyboard.json b/keyboards/exclusive/e7v1/keyboard.json index 711d1e3908..0cafc27d2d 100644 --- a/keyboards/exclusive/e7v1/keyboard.json +++ b/keyboards/exclusive/e7v1/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e7v1se/keyboard.json b/keyboards/exclusive/e7v1se/keyboard.json index 4cd9484ae4..7f24f0102b 100644 --- a/keyboards/exclusive/e7v1se/keyboard.json +++ b/keyboards/exclusive/e7v1se/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/exent/keyboard.json b/keyboards/exent/keyboard.json index e6ac763d13..5f3e058af0 100644 --- a/keyboards/exent/keyboard.json +++ b/keyboards/exent/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/eyeohdesigns/babyv/keyboard.json b/keyboards/eyeohdesigns/babyv/keyboard.json index 849d59a227..72373d9c46 100644 --- a/keyboards/eyeohdesigns/babyv/keyboard.json +++ b/keyboards/eyeohdesigns/babyv/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/eyeohdesigns/theboulevard/keyboard.json b/keyboards/eyeohdesigns/theboulevard/keyboard.json index cb2cd6b3c2..816ad06917 100644 --- a/keyboards/eyeohdesigns/theboulevard/keyboard.json +++ b/keyboards/eyeohdesigns/theboulevard/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/facew/keyboard.json b/keyboards/facew/keyboard.json index 395207d348..b8d22bdf96 100644 --- a/keyboards/facew/keyboard.json +++ b/keyboards/facew/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/falsonix/fx19/keyboard.json b/keyboards/falsonix/fx19/keyboard.json index b940c914af..95e1e9cd78 100644 --- a/keyboards/falsonix/fx19/keyboard.json +++ b/keyboards/falsonix/fx19/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/fatotesa/keyboard.json b/keyboards/fatotesa/keyboard.json index dd74076812..6ea6b7199b 100644 --- a/keyboards/fatotesa/keyboard.json +++ b/keyboards/fatotesa/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/feker/ik75/keyboard.json b/keyboards/feker/ik75/keyboard.json index 8f5614098c..0f86148ebe 100644 --- a/keyboards/feker/ik75/keyboard.json +++ b/keyboards/feker/ik75/keyboard.json @@ -63,7 +63,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ffkeebs/puca/keyboard.json b/keyboards/ffkeebs/puca/keyboard.json index 2abd0cfc36..2c0780f4be 100644 --- a/keyboards/ffkeebs/puca/keyboard.json +++ b/keyboards/ffkeebs/puca/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ffkeebs/siris/keyboard.json b/keyboards/ffkeebs/siris/keyboard.json index 86531b6d01..5886f98874 100644 --- a/keyboards/ffkeebs/siris/keyboard.json +++ b/keyboards/ffkeebs/siris/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/flashquark/horizon_z/keyboard.json b/keyboards/flashquark/horizon_z/keyboard.json index 0fe14e7c60..b2354889cc 100755 --- a/keyboards/flashquark/horizon_z/keyboard.json +++ b/keyboards/flashquark/horizon_z/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/flehrad/numbrero/keyboard.json b/keyboards/flehrad/numbrero/keyboard.json index 723204fbc1..28a6ab23de 100644 --- a/keyboards/flehrad/numbrero/keyboard.json +++ b/keyboards/flehrad/numbrero/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flehrad/snagpad/keyboard.json b/keyboards/flehrad/snagpad/keyboard.json index 48022f5518..821117f245 100644 --- a/keyboards/flehrad/snagpad/keyboard.json +++ b/keyboards/flehrad/snagpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flehrad/tradestation/keyboard.json b/keyboards/flehrad/tradestation/keyboard.json index f99ee313d3..4122d6e5e6 100644 --- a/keyboards/flehrad/tradestation/keyboard.json +++ b/keyboards/flehrad/tradestation/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/fleuron/keyboard.json b/keyboards/fleuron/keyboard.json index 5cd7b7d8b2..041ed9061c 100644 --- a/keyboards/fleuron/keyboard.json +++ b/keyboards/fleuron/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/flx/lodestone/keyboard.json b/keyboards/flx/lodestone/keyboard.json index 3a70655f2a..138ea8216e 100644 --- a/keyboards/flx/lodestone/keyboard.json +++ b/keyboards/flx/lodestone/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flx/virgo/keyboard.json b/keyboards/flx/virgo/keyboard.json index 73100da1e9..11935c38f2 100644 --- a/keyboards/flx/virgo/keyboard.json +++ b/keyboards/flx/virgo/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/flxlb/zplit/keyboard.json b/keyboards/flxlb/zplit/keyboard.json index cd16ef7a15..fdbe34fc7e 100644 --- a/keyboards/flxlb/zplit/keyboard.json +++ b/keyboards/flxlb/zplit/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/foostan/cornelius/keyboard.json b/keyboards/foostan/cornelius/keyboard.json index 4f9312825e..024247b894 100644 --- a/keyboards/foostan/cornelius/keyboard.json +++ b/keyboards/foostan/cornelius/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/forever65/keyboard.json b/keyboards/forever65/keyboard.json index 9f128c1177..f1f7262929 100644 --- a/keyboards/forever65/keyboard.json +++ b/keyboards/forever65/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/foxlab/key65/hotswap/keyboard.json b/keyboards/foxlab/key65/hotswap/keyboard.json index c635903804..892903f4ad 100644 --- a/keyboards/foxlab/key65/hotswap/keyboard.json +++ b/keyboards/foxlab/key65/hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/key65/universal/keyboard.json b/keyboards/foxlab/key65/universal/keyboard.json index 94cc4c94c2..3133a89b5c 100644 --- a/keyboards/foxlab/key65/universal/keyboard.json +++ b/keyboards/foxlab/key65/universal/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/leaf60/hotswap/keyboard.json b/keyboards/foxlab/leaf60/hotswap/keyboard.json index 20dd487c27..76b22849c8 100644 --- a/keyboards/foxlab/leaf60/hotswap/keyboard.json +++ b/keyboards/foxlab/leaf60/hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/foxlab/leaf60/universal/keyboard.json b/keyboards/foxlab/leaf60/universal/keyboard.json index 758e949aa2..ee1f59bd0d 100644 --- a/keyboards/foxlab/leaf60/universal/keyboard.json +++ b/keyboards/foxlab/leaf60/universal/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/foxlab/time80/keyboard.json b/keyboards/foxlab/time80/keyboard.json index d4111207ed..c922c821ca 100644 --- a/keyboards/foxlab/time80/keyboard.json +++ b/keyboards/foxlab/time80/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/foxlab/time_re/hotswap/keyboard.json b/keyboards/foxlab/time_re/hotswap/keyboard.json index 2391284ee0..262bcbf8e1 100644 --- a/keyboards/foxlab/time_re/hotswap/keyboard.json +++ b/keyboards/foxlab/time_re/hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/time_re/universal/keyboard.json b/keyboards/foxlab/time_re/universal/keyboard.json index cd4fca6df8..a7849bdba3 100644 --- a/keyboards/foxlab/time_re/universal/keyboard.json +++ b/keyboards/foxlab/time_re/universal/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/fr4/southpaw75/keyboard.json b/keyboards/fr4/southpaw75/keyboard.json index 47fb954bf9..9152b2758a 100644 --- a/keyboards/fr4/southpaw75/keyboard.json +++ b/keyboards/fr4/southpaw75/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/fr4/unix60/keyboard.json b/keyboards/fr4/unix60/keyboard.json index a6c3d0cb6a..4a34065ece 100644 --- a/keyboards/fr4/unix60/keyboard.json +++ b/keyboards/fr4/unix60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/free_willy/keyboard.json b/keyboards/free_willy/keyboard.json index 512d56516a..74177bdc5e 100644 --- a/keyboards/free_willy/keyboard.json +++ b/keyboards/free_willy/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/friedrich/keyboard.json b/keyboards/friedrich/keyboard.json index d5dd68e0bc..49da41a947 100644 --- a/keyboards/friedrich/keyboard.json +++ b/keyboards/friedrich/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/frobiac/blackbowl/keyboard.json b/keyboards/frobiac/blackbowl/keyboard.json index 8a4aed1948..27cbd78209 100644 --- a/keyboards/frobiac/blackbowl/keyboard.json +++ b/keyboards/frobiac/blackbowl/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/blackflat/keyboard.json b/keyboards/frobiac/blackflat/keyboard.json index 086d90d8f8..0d9229f96a 100644 --- a/keyboards/frobiac/blackflat/keyboard.json +++ b/keyboards/frobiac/blackflat/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/hypernano/keyboard.json b/keyboards/frobiac/hypernano/keyboard.json index 403beed952..28a8e9b766 100644 --- a/keyboards/frobiac/hypernano/keyboard.json +++ b/keyboards/frobiac/hypernano/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/redtilt/keyboard.json b/keyboards/frobiac/redtilt/keyboard.json index f3cbd96e1c..764bc9be7b 100644 --- a/keyboards/frobiac/redtilt/keyboard.json +++ b/keyboards/frobiac/redtilt/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frooastboard/nano/keyboard.json b/keyboards/frooastboard/nano/keyboard.json index 5d7783145e..78764d2536 100644 --- a/keyboards/frooastboard/nano/keyboard.json +++ b/keyboards/frooastboard/nano/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/frooastboard/walnut/keyboard.json b/keyboards/frooastboard/walnut/keyboard.json index 4387452d38..4807a28801 100644 --- a/keyboards/frooastboard/walnut/keyboard.json +++ b/keyboards/frooastboard/walnut/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/fs_streampad/keyboard.json b/keyboards/fs_streampad/keyboard.json index bf4f36a950..d932315419 100644 --- a/keyboards/fs_streampad/keyboard.json +++ b/keyboards/fs_streampad/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ft/mars65/keyboard.json b/keyboards/ft/mars65/keyboard.json index ab5e968b90..3b9c5fe0e6 100644 --- a/keyboards/ft/mars65/keyboard.json +++ b/keyboards/ft/mars65/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ft/mars80/keyboard.json b/keyboards/ft/mars80/keyboard.json index 4862e84ab9..38261ad547 100644 --- a/keyboards/ft/mars80/keyboard.json +++ b/keyboards/ft/mars80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/function96/v1/keyboard.json b/keyboards/function96/v1/keyboard.json index 945042b284..a3f6db9a1e 100644 --- a/keyboards/function96/v1/keyboard.json +++ b/keyboards/function96/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/function96/v2/keyboard.json b/keyboards/function96/v2/keyboard.json index 21d677d9a5..2d2b7bafcf 100644 --- a/keyboards/function96/v2/keyboard.json +++ b/keyboards/function96/v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/fungo/rev1/keyboard.json b/keyboards/fungo/rev1/keyboard.json index 0970a027c8..eacf9cf21c 100644 --- a/keyboards/fungo/rev1/keyboard.json +++ b/keyboards/fungo/rev1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "key_lock": true, "mousekey": true, diff --git a/keyboards/funky40/keyboard.json b/keyboards/funky40/keyboard.json index 0aafa58041..9d05de1562 100644 --- a/keyboards/funky40/keyboard.json +++ b/keyboards/funky40/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gami_studio/lex60/keyboard.json b/keyboards/gami_studio/lex60/keyboard.json index d458d6a667..7fd735d6ff 100644 --- a/keyboards/gami_studio/lex60/keyboard.json +++ b/keyboards/gami_studio/lex60/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/geekboards/macropad_v2/keyboard.json b/keyboards/geekboards/macropad_v2/keyboard.json index 31f21b97bf..4e0eff3a5e 100644 --- a/keyboards/geekboards/macropad_v2/keyboard.json +++ b/keyboards/geekboards/macropad_v2/keyboard.json @@ -58,7 +58,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/geekboards/tester/keyboard.json b/keyboards/geekboards/tester/keyboard.json index 57073ebdc0..ef6e6ee352 100644 --- a/keyboards/geekboards/tester/keyboard.json +++ b/keyboards/geekboards/tester/keyboard.json @@ -55,7 +55,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/geistmaschine/geist/keyboard.json b/keyboards/geistmaschine/geist/keyboard.json index 079dd8d6d9..723f3d4e7f 100644 --- a/keyboards/geistmaschine/geist/keyboard.json +++ b/keyboards/geistmaschine/geist/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/geistmaschine/macropod/keyboard.json b/keyboards/geistmaschine/macropod/keyboard.json index 333e7c0a50..32094981c7 100644 --- a/keyboards/geistmaschine/macropod/keyboard.json +++ b/keyboards/geistmaschine/macropod/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/generic_panda/panda65_01/keyboard.json b/keyboards/generic_panda/panda65_01/keyboard.json index 098f3df1c0..59ed646543 100644 --- a/keyboards/generic_panda/panda65_01/keyboard.json +++ b/keyboards/generic_panda/panda65_01/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/genone/eclipse_65/keyboard.json b/keyboards/genone/eclipse_65/keyboard.json index aeb2d8973c..f416e538d5 100644 --- a/keyboards/genone/eclipse_65/keyboard.json +++ b/keyboards/genone/eclipse_65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/genone/g1_65/keyboard.json b/keyboards/genone/g1_65/keyboard.json index 367bdfe7bb..bb85dd82bc 100644 --- a/keyboards/genone/g1_65/keyboard.json +++ b/keyboards/genone/g1_65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/ee_at/keyboard.json b/keyboards/geonworks/ee_at/keyboard.json index 803e0d3640..a619ca43e3 100644 --- a/keyboards/geonworks/ee_at/keyboard.json +++ b/keyboards/geonworks/ee_at/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/geonworks/frogmini/fmh/keyboard.json b/keyboards/geonworks/frogmini/fmh/keyboard.json index 414aa18e12..d8f1db093a 100644 --- a/keyboards/geonworks/frogmini/fmh/keyboard.json +++ b/keyboards/geonworks/frogmini/fmh/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/frogmini/fms/keyboard.json b/keyboards/geonworks/frogmini/fms/keyboard.json index c34765288b..63945434eb 100644 --- a/keyboards/geonworks/frogmini/fms/keyboard.json +++ b/keyboards/geonworks/frogmini/fms/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/w1_at/keyboard.json b/keyboards/geonworks/w1_at/keyboard.json index 8b7991c03d..49834c3730 100644 --- a/keyboards/geonworks/w1_at/keyboard.json +++ b/keyboards/geonworks/w1_at/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gh60/revc/keyboard.json b/keyboards/gh60/revc/keyboard.json index 8e1c03c151..cc73e0649e 100644 --- a/keyboards/gh60/revc/keyboard.json +++ b/keyboards/gh60/revc/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gh60/v1p3/keyboard.json b/keyboards/gh60/v1p3/keyboard.json index 34d8c992b4..978b1e0b57 100644 --- a/keyboards/gh60/v1p3/keyboard.json +++ b/keyboards/gh60/v1p3/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gh80_3000/keyboard.json b/keyboards/gh80_3000/keyboard.json index 929f11f7c0..c747264be4 100644 --- a/keyboards/gh80_3000/keyboard.json +++ b/keyboards/gh80_3000/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ghs/jem/info.json b/keyboards/ghs/jem/info.json index 4bda443ac5..92d09c9c83 100644 --- a/keyboards/ghs/jem/info.json +++ b/keyboards/ghs/jem/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "rgblight": true, diff --git a/keyboards/ghs/rar/keyboard.json b/keyboards/ghs/rar/keyboard.json index 96184abe6a..2e3a205ad9 100644 --- a/keyboards/ghs/rar/keyboard.json +++ b/keyboards/ghs/rar/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ghs/xls/keyboard.json b/keyboards/ghs/xls/keyboard.json index acd916884a..2115fe456e 100644 --- a/keyboards/ghs/xls/keyboard.json +++ b/keyboards/ghs/xls/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "encoder": true, diff --git a/keyboards/giabalanai/keyboard.json b/keyboards/giabalanai/keyboard.json index ae43139dad..817bed0f57 100644 --- a/keyboards/giabalanai/keyboard.json +++ b/keyboards/giabalanai/keyboard.json @@ -34,7 +34,6 @@ "extrakey": true, "encoder": true, "bootmagic": false, - "console": false, "mousekey": false, "nkro": false, "command": false, diff --git a/keyboards/gizmo_engineering/gk6/keyboard.json b/keyboards/gizmo_engineering/gk6/keyboard.json index d68b356d9c..bd9588f251 100644 --- a/keyboards/gizmo_engineering/gk6/keyboard.json +++ b/keyboards/gizmo_engineering/gk6/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/gkeyboard/gkb_m16/keyboard.json b/keyboards/gkeyboard/gkb_m16/keyboard.json index fe846b4bd2..408d391cb3 100644 --- a/keyboards/gkeyboard/gkb_m16/keyboard.json +++ b/keyboards/gkeyboard/gkb_m16/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gkeyboard/gpad8_2r/keyboard.json b/keyboards/gkeyboard/gpad8_2r/keyboard.json index 6c9a779b05..a2e3144bb4 100644 --- a/keyboards/gkeyboard/gpad8_2r/keyboard.json +++ b/keyboards/gkeyboard/gpad8_2r/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gkeyboard/greatpad/keyboard.json b/keyboards/gkeyboard/greatpad/keyboard.json index 62edd1aef3..6f11479357 100644 --- a/keyboards/gkeyboard/greatpad/keyboard.json +++ b/keyboards/gkeyboard/greatpad/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gl516/xr63gl/keyboard.json b/keyboards/gl516/xr63gl/keyboard.json index 808bd9d1b1..19716eb60c 100644 --- a/keyboards/gl516/xr63gl/keyboard.json +++ b/keyboards/gl516/xr63gl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json b/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json index a5c4c92552..197b08e419 100644 --- a/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json +++ b/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p65/iso/keyboard.json b/keyboards/gmmk/gmmk2/p65/iso/keyboard.json index a4576c8c7f..2ba4bf0616 100644 --- a/keyboards/gmmk/gmmk2/p65/iso/keyboard.json +++ b/keyboards/gmmk/gmmk2/p65/iso/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json b/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json index 8fd81ba1a0..43ebfbf620 100644 --- a/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json +++ b/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p96/iso/keyboard.json b/keyboards/gmmk/gmmk2/p96/iso/keyboard.json index 040b6f9c6f..7f1989324f 100644 --- a/keyboards/gmmk/gmmk2/p96/iso/keyboard.json +++ b/keyboards/gmmk/gmmk2/p96/iso/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/pro/rev1/ansi/keyboard.json b/keyboards/gmmk/pro/rev1/ansi/keyboard.json index 867f7e1d02..074949efaa 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keyboard.json +++ b/keyboards/gmmk/pro/rev1/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev1/iso/keyboard.json b/keyboards/gmmk/pro/rev1/iso/keyboard.json index 6eabec96fe..9b26290fbc 100644 --- a/keyboards/gmmk/pro/rev1/iso/keyboard.json +++ b/keyboards/gmmk/pro/rev1/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev2/ansi/keyboard.json b/keyboards/gmmk/pro/rev2/ansi/keyboard.json index 21bc7df7fb..e113374dc7 100644 --- a/keyboards/gmmk/pro/rev2/ansi/keyboard.json +++ b/keyboards/gmmk/pro/rev2/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev2/iso/keyboard.json b/keyboards/gmmk/pro/rev2/iso/keyboard.json index 83d1fd3028..b4aad81323 100644 --- a/keyboards/gmmk/pro/rev2/iso/keyboard.json +++ b/keyboards/gmmk/pro/rev2/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gorthage_truck/keyboard.json b/keyboards/gorthage_truck/keyboard.json index 1a0a364f96..40c901e21c 100644 --- a/keyboards/gorthage_truck/keyboard.json +++ b/keyboards/gorthage_truck/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gowla/keyboard.json b/keyboards/gowla/keyboard.json index 0f64cad79b..0272611013 100644 --- a/keyboards/gowla/keyboard.json +++ b/keyboards/gowla/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/gray_studio/aero75/keyboard.json b/keyboards/gray_studio/aero75/keyboard.json index c0ede794c2..9357ca3903 100644 --- a/keyboards/gray_studio/aero75/keyboard.json +++ b/keyboards/gray_studio/aero75/keyboard.json @@ -40,7 +40,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/apollo80/keyboard.json b/keyboards/gray_studio/apollo80/keyboard.json index f3425aa20d..0bbb3bf804 100644 --- a/keyboards/gray_studio/apollo80/keyboard.json +++ b/keyboards/gray_studio/apollo80/keyboard.json @@ -36,7 +36,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gray_studio/hb85/keyboard.json b/keyboards/gray_studio/hb85/keyboard.json index 0fcf30a925..9d182a458e 100644 --- a/keyboards/gray_studio/hb85/keyboard.json +++ b/keyboards/gray_studio/hb85/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/gray_studio/space65/keyboard.json b/keyboards/gray_studio/space65/keyboard.json index 6534f165a8..630f9d4e26 100644 --- a/keyboards/gray_studio/space65/keyboard.json +++ b/keyboards/gray_studio/space65/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/space65r3/keyboard.json b/keyboards/gray_studio/space65r3/keyboard.json index bdf3624c58..3a5880caf5 100644 --- a/keyboards/gray_studio/space65r3/keyboard.json +++ b/keyboards/gray_studio/space65r3/keyboard.json @@ -40,7 +40,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/think65v3/keyboard.json b/keyboards/gray_studio/think65v3/keyboard.json index 0c6b8e7938..c561c3e8a2 100644 --- a/keyboards/gray_studio/think65v3/keyboard.json +++ b/keyboards/gray_studio/think65v3/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gregandcin/teaqueen/keyboard.json b/keyboards/gregandcin/teaqueen/keyboard.json index 871c34587d..dfb7e64146 100644 --- a/keyboards/gregandcin/teaqueen/keyboard.json +++ b/keyboards/gregandcin/teaqueen/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gummykey/keyboard.json b/keyboards/gummykey/keyboard.json index bb7001438d..36fa06455f 100644 --- a/keyboards/gummykey/keyboard.json +++ b/keyboards/gummykey/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/gvalchca/ga150/keyboard.json b/keyboards/gvalchca/ga150/keyboard.json index cdea8ea976..ff0c0502c0 100644 --- a/keyboards/gvalchca/ga150/keyboard.json +++ b/keyboards/gvalchca/ga150/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gvalchca/spaccboard/keyboard.json b/keyboards/gvalchca/spaccboard/keyboard.json index ad03737fd5..33af104d42 100644 --- a/keyboards/gvalchca/spaccboard/keyboard.json +++ b/keyboards/gvalchca/spaccboard/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/h0oni/deskpad/keyboard.json b/keyboards/h0oni/deskpad/keyboard.json index 1d84fe3ee4..e7de03edb8 100644 --- a/keyboards/h0oni/deskpad/keyboard.json +++ b/keyboards/h0oni/deskpad/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/h0oni/hotduck/keyboard.json b/keyboards/h0oni/hotduck/keyboard.json index a2a709d71d..bda7a295b2 100644 --- a/keyboards/h0oni/hotduck/keyboard.json +++ b/keyboards/h0oni/hotduck/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hackpad/keyboard.json b/keyboards/hackpad/keyboard.json index 0a77c9320c..5813874e59 100644 --- a/keyboards/hackpad/keyboard.json +++ b/keyboards/hackpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/halokeys/elemental75/keyboard.json b/keyboards/halokeys/elemental75/keyboard.json index b26d094c4b..b9319d2f21 100644 --- a/keyboards/halokeys/elemental75/keyboard.json +++ b/keyboards/halokeys/elemental75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/han60/keyboard.json b/keyboards/han60/keyboard.json index 41d33b1ba8..d2b1c24159 100644 --- a/keyboards/han60/keyboard.json +++ b/keyboards/han60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/hand88/keyboard.json b/keyboards/hand88/keyboard.json index cb8a320aaf..1ee33b8415 100755 --- a/keyboards/hand88/keyboard.json +++ b/keyboards/hand88/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/10k/keyboard.json b/keyboards/handwired/10k/keyboard.json index a3293601e3..c49d046fde 100644 --- a/keyboards/handwired/10k/keyboard.json +++ b/keyboards/handwired/10k/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/2x5keypad/keyboard.json b/keyboards/handwired/2x5keypad/keyboard.json index f4ee815c10..88932b689b 100644 --- a/keyboards/handwired/2x5keypad/keyboard.json +++ b/keyboards/handwired/2x5keypad/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/6key/keyboard.json b/keyboards/handwired/6key/keyboard.json index 7883c1e784..8b4a41b0bf 100644 --- a/keyboards/handwired/6key/keyboard.json +++ b/keyboards/handwired/6key/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/6macro/keyboard.json b/keyboards/handwired/6macro/keyboard.json index 10c59bbbac..19e2191c22 100644 --- a/keyboards/handwired/6macro/keyboard.json +++ b/keyboards/handwired/6macro/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/acacia/keyboard.json b/keyboards/handwired/acacia/keyboard.json index d761764727..bdb63430af 100644 --- a/keyboards/handwired/acacia/keyboard.json +++ b/keyboards/handwired/acacia/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/aim65/keyboard.json b/keyboards/handwired/aim65/keyboard.json index 3f026a91fa..e5f48d7ef6 100644 --- a/keyboards/handwired/aim65/keyboard.json +++ b/keyboards/handwired/aim65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/alcor_dactyl/keyboard.json b/keyboards/handwired/alcor_dactyl/keyboard.json index 81d0228dd6..36b0cc849b 100644 --- a/keyboards/handwired/alcor_dactyl/keyboard.json +++ b/keyboards/handwired/alcor_dactyl/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/amigopunk/keyboard.json b/keyboards/handwired/amigopunk/keyboard.json index e8e45d2b99..11df6261ac 100644 --- a/keyboards/handwired/amigopunk/keyboard.json +++ b/keyboards/handwired/amigopunk/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/angel/keyboard.json b/keyboards/handwired/angel/keyboard.json index 6a4b40bb21..89635b7bab 100644 --- a/keyboards/handwired/angel/keyboard.json +++ b/keyboards/handwired/angel/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/aplx2/keyboard.json b/keyboards/handwired/aplx2/keyboard.json index 3e43576f58..f47646d5bf 100644 --- a/keyboards/handwired/aplx2/keyboard.json +++ b/keyboards/handwired/aplx2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/aranck/keyboard.json b/keyboards/handwired/aranck/keyboard.json index 435d6da696..e64a4b5263 100644 --- a/keyboards/handwired/aranck/keyboard.json +++ b/keyboards/handwired/aranck/keyboard.json @@ -12,7 +12,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/atreus50/keyboard.json b/keyboards/handwired/atreus50/keyboard.json index 029d622f98..cedc231964 100644 --- a/keyboards/handwired/atreus50/keyboard.json +++ b/keyboards/handwired/atreus50/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/axon/keyboard.json b/keyboards/handwired/axon/keyboard.json index 007f90fbc8..6332e0c95b 100644 --- a/keyboards/handwired/axon/keyboard.json +++ b/keyboards/handwired/axon/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/baredev/rev1/keyboard.json b/keyboards/handwired/baredev/rev1/keyboard.json index 470b926bb4..66d37c1f6e 100644 --- a/keyboards/handwired/baredev/rev1/keyboard.json +++ b/keyboards/handwired/baredev/rev1/keyboard.json @@ -25,7 +25,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/bolek/keyboard.json b/keyboards/handwired/bolek/keyboard.json index 68fe7958bf..00d47a2b06 100644 --- a/keyboards/handwired/bolek/keyboard.json +++ b/keyboards/handwired/bolek/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/boss566y/redragon_vara/keyboard.json b/keyboards/handwired/boss566y/redragon_vara/keyboard.json index 579cfe0576..1b35bf4c49 100644 --- a/keyboards/handwired/boss566y/redragon_vara/keyboard.json +++ b/keyboards/handwired/boss566y/redragon_vara/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/brain/keyboard.json b/keyboards/handwired/brain/keyboard.json index 9593ad4471..6b5e76b323 100644 --- a/keyboards/handwired/brain/keyboard.json +++ b/keyboards/handwired/brain/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/bstk100/keyboard.json b/keyboards/handwired/bstk100/keyboard.json index 0fc255f9c4..3eb02037a5 100644 --- a/keyboards/handwired/bstk100/keyboard.json +++ b/keyboards/handwired/bstk100/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/cans12er/keyboard.json b/keyboards/handwired/cans12er/keyboard.json index 31fe7ebc83..a1bfe51902 100644 --- a/keyboards/handwired/cans12er/keyboard.json +++ b/keyboards/handwired/cans12er/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/chiron/keyboard.json b/keyboards/handwired/chiron/keyboard.json index 7000421646..5be09e0a3d 100644 --- a/keyboards/handwired/chiron/keyboard.json +++ b/keyboards/handwired/chiron/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/co60/rev1/keyboard.json b/keyboards/handwired/co60/rev1/keyboard.json index 1bf60673fb..7d5ba93fac 100644 --- a/keyboards/handwired/co60/rev1/keyboard.json +++ b/keyboards/handwired/co60/rev1/keyboard.json @@ -7,7 +7,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/co60/rev6/keyboard.json b/keyboards/handwired/co60/rev6/keyboard.json index 743a738ff0..2688ab2739 100644 --- a/keyboards/handwired/co60/rev6/keyboard.json +++ b/keyboards/handwired/co60/rev6/keyboard.json @@ -7,7 +7,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/co60/rev7/keyboard.json b/keyboards/handwired/co60/rev7/keyboard.json index 4319c9aedf..d1967ce147 100644 --- a/keyboards/handwired/co60/rev7/keyboard.json +++ b/keyboards/handwired/co60/rev7/keyboard.json @@ -7,7 +7,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/colorlice/keyboard.json b/keyboards/handwired/colorlice/keyboard.json index 7292137dff..2159dbe54c 100644 --- a/keyboards/handwired/colorlice/keyboard.json +++ b/keyboards/handwired/colorlice/keyboard.json @@ -73,7 +73,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/concertina/64key/keyboard.json b/keyboards/handwired/concertina/64key/keyboard.json index dedc240d3f..435c846342 100644 --- a/keyboards/handwired/concertina/64key/keyboard.json +++ b/keyboards/handwired/concertina/64key/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/consolekeyboard/18key/keyboard.json b/keyboards/handwired/consolekeyboard/18key/keyboard.json index c75e324cf3..b0e4853038 100644 --- a/keyboards/handwired/consolekeyboard/18key/keyboard.json +++ b/keyboards/handwired/consolekeyboard/18key/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/consolekeyboard/20key/keyboard.json b/keyboards/handwired/consolekeyboard/20key/keyboard.json index 87449fc21e..18b1da288e 100644 --- a/keyboards/handwired/consolekeyboard/20key/keyboard.json +++ b/keyboards/handwired/consolekeyboard/20key/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/consolekeyboard/27key/keyboard.json b/keyboards/handwired/consolekeyboard/27key/keyboard.json index 21a894d5e4..ecb46b9f0e 100644 --- a/keyboards/handwired/consolekeyboard/27key/keyboard.json +++ b/keyboards/handwired/consolekeyboard/27key/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/consolekeyboard/30key/keyboard.json b/keyboards/handwired/consolekeyboard/30key/keyboard.json index 159558e355..2ecef968ac 100644 --- a/keyboards/handwired/consolekeyboard/30key/keyboard.json +++ b/keyboards/handwired/consolekeyboard/30key/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/croxsplit44/keyboard.json b/keyboards/handwired/croxsplit44/keyboard.json index 0d29f6fd66..f5e36d22b9 100644 --- a/keyboards/handwired/croxsplit44/keyboard.json +++ b/keyboards/handwired/croxsplit44/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/curiosity/keyboard.json b/keyboards/handwired/curiosity/keyboard.json index 85428b33ca..273033b0bf 100644 --- a/keyboards/handwired/curiosity/keyboard.json +++ b/keyboards/handwired/curiosity/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_cc/keyboard.json b/keyboards/handwired/dactyl_cc/keyboard.json index f4097b0487..8c2ef8061c 100644 --- a/keyboards/handwired/dactyl_cc/keyboard.json +++ b/keyboards/handwired/dactyl_cc/keyboard.json @@ -12,7 +12,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": true, "nkro": false }, diff --git a/keyboards/handwired/dactyl_kinesis/keyboard.json b/keyboards/handwired/dactyl_kinesis/keyboard.json index a536159532..a1a108f8fa 100644 --- a/keyboards/handwired/dactyl_kinesis/keyboard.json +++ b/keyboards/handwired/dactyl_kinesis/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_lightcycle/keyboard.json b/keyboards/handwired/dactyl_lightcycle/keyboard.json index 6e56b18f6f..cf8fa3d84c 100644 --- a/keyboards/handwired/dactyl_lightcycle/keyboard.json +++ b/keyboards/handwired/dactyl_lightcycle/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "mousekey": true, "extrakey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json index e66bfa2ff6..7ef1482028 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json index 134793cac8..207f8c06a7 100644 --- a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json index f69fb8d426..7b25b2d936 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json index 1846f2a661..8f5f08a81c 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json index d4674042a2..b875d322da 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json index 020bf43fdd..2021e082e2 100644 --- a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json index 739eb573ff..0ee888d40c 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json index 7c89289bb2..cfbe5bf21a 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json index ae73995d49..a6122f8492 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json index 33d8c3c080..dc53bea60b 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json index 2534a76d78..bdafd60366 100644 --- a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json index e60fa249f4..8663f20eb4 100644 --- a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json index 7d1e72ff9e..2c5af325aa 100644 --- a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json index 57202c802a..d87c333aa5 100644 --- a/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json +++ b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_maximus/keyboard.json b/keyboards/handwired/dactyl_maximus/keyboard.json index f9f5160ee6..3638ae329d 100644 --- a/keyboards/handwired/dactyl_maximus/keyboard.json +++ b/keyboards/handwired/dactyl_maximus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_promicro/keyboard.json b/keyboards/handwired/dactyl_promicro/keyboard.json index 86576b3e09..32511d576d 100644 --- a/keyboards/handwired/dactyl_promicro/keyboard.json +++ b/keyboards/handwired/dactyl_promicro/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_rah/keyboard.json b/keyboards/handwired/dactyl_rah/keyboard.json index 903aafc973..2cb7741cc7 100644 --- a/keyboards/handwired/dactyl_rah/keyboard.json +++ b/keyboards/handwired/dactyl_rah/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_tracer/keyboard.json b/keyboards/handwired/dactyl_tracer/keyboard.json index 92a8a2c76b..f6ec68108d 100644 --- a/keyboards/handwired/dactyl_tracer/keyboard.json +++ b/keyboards/handwired/dactyl_tracer/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/handwired/dactylmacropad/keyboard.json b/keyboards/handwired/dactylmacropad/keyboard.json index 5d40a240a9..9cfa0bf642 100644 --- a/keyboards/handwired/dactylmacropad/keyboard.json +++ b/keyboards/handwired/dactylmacropad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json index d40ef0210b..888ec24e37 100644 --- a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json +++ b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/dc/mc/001/keyboard.json b/keyboards/handwired/dc/mc/001/keyboard.json index c91df1ca8b..924829ad7d 100644 --- a/keyboards/handwired/dc/mc/001/keyboard.json +++ b/keyboards/handwired/dc/mc/001/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/ddg_56/keyboard.json b/keyboards/handwired/ddg_56/keyboard.json index 5d4a21bba6..d415494159 100644 --- a/keyboards/handwired/ddg_56/keyboard.json +++ b/keyboards/handwired/ddg_56/keyboard.json @@ -11,7 +11,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/dmote/keyboard.json b/keyboards/handwired/dmote/keyboard.json index e6514b17ba..2928f21152 100644 --- a/keyboards/handwired/dmote/keyboard.json +++ b/keyboards/handwired/dmote/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/eagleii/keyboard.json b/keyboards/handwired/eagleii/keyboard.json index 43a4d5a2f7..7f3f2662d8 100644 --- a/keyboards/handwired/eagleii/keyboard.json +++ b/keyboards/handwired/eagleii/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/elrgo_s/keyboard.json b/keyboards/handwired/elrgo_s/keyboard.json index 2a0e57dabe..cc7258ba5e 100644 --- a/keyboards/handwired/elrgo_s/keyboard.json +++ b/keyboards/handwired/elrgo_s/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/frankie_macropad/keyboard.json b/keyboards/handwired/frankie_macropad/keyboard.json index f994b1fa48..e00291fc52 100644 --- a/keyboards/handwired/frankie_macropad/keyboard.json +++ b/keyboards/handwired/frankie_macropad/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "grave_esc": false, diff --git a/keyboards/handwired/freoduo/keyboard.json b/keyboards/handwired/freoduo/keyboard.json index d9f4ad4808..84939fa1ff 100644 --- a/keyboards/handwired/freoduo/keyboard.json +++ b/keyboards/handwired/freoduo/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/heisenberg/keyboard.json b/keyboards/handwired/heisenberg/keyboard.json index 460018ef1e..38e98982c7 100644 --- a/keyboards/handwired/heisenberg/keyboard.json +++ b/keyboards/handwired/heisenberg/keyboard.json @@ -30,7 +30,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/hnah108/keyboard.json b/keyboards/handwired/hnah108/keyboard.json index b4daac3fab..f1e89a268d 100644 --- a/keyboards/handwired/hnah108/keyboard.json +++ b/keyboards/handwired/hnah108/keyboard.json @@ -57,7 +57,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/hnah40/keyboard.json b/keyboards/handwired/hnah40/keyboard.json index e80bbdaec5..ba63a984cc 100644 --- a/keyboards/handwired/hnah40/keyboard.json +++ b/keyboards/handwired/hnah40/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/hnah40rgb/keyboard.json b/keyboards/handwired/hnah40rgb/keyboard.json index 4775259f35..233613c590 100644 --- a/keyboards/handwired/hnah40rgb/keyboard.json +++ b/keyboards/handwired/hnah40rgb/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/hwpm87/keyboard.json b/keyboards/handwired/hwpm87/keyboard.json index 302dc23316..3eb64e28b1 100644 --- a/keyboards/handwired/hwpm87/keyboard.json +++ b/keyboards/handwired/hwpm87/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/iso85k/keyboard.json b/keyboards/handwired/iso85k/keyboard.json index 415bcf54f0..51e5a347c4 100644 --- a/keyboards/handwired/iso85k/keyboard.json +++ b/keyboards/handwired/iso85k/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/itstleo9/info.json b/keyboards/handwired/itstleo9/info.json index dba1078701..f80b516028 100644 --- a/keyboards/handwired/itstleo9/info.json +++ b/keyboards/handwired/itstleo9/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/jn68m/keyboard.json b/keyboards/handwired/jn68m/keyboard.json index d2c506c8c9..267a190fdc 100644 --- a/keyboards/handwired/jn68m/keyboard.json +++ b/keyboards/handwired/jn68m/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/jopr/keyboard.json b/keyboards/handwired/jopr/keyboard.json index 36aa7276b5..f47f31e6b2 100644 --- a/keyboards/handwired/jopr/keyboard.json +++ b/keyboards/handwired/jopr/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/jotanck/keyboard.json b/keyboards/handwired/jotanck/keyboard.json index 94ec9c15e5..c8327f6b6c 100644 --- a/keyboards/handwired/jotanck/keyboard.json +++ b/keyboards/handwired/jotanck/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/jotlily60/keyboard.json b/keyboards/handwired/jotlily60/keyboard.json index 7a8a2a50d9..802584ae3a 100644 --- a/keyboards/handwired/jotlily60/keyboard.json +++ b/keyboards/handwired/jotlily60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/juliet/keyboard.json b/keyboards/handwired/juliet/keyboard.json index 49c2489e66..0063017054 100644 --- a/keyboards/handwired/juliet/keyboard.json +++ b/keyboards/handwired/juliet/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/k8split/keyboard.json b/keyboards/handwired/k8split/keyboard.json index 186cf804e1..9d47ebd7ba 100644 --- a/keyboards/handwired/k8split/keyboard.json +++ b/keyboards/handwired/k8split/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/kbod/keyboard.json b/keyboards/handwired/kbod/keyboard.json index a025952119..ae6481efe6 100644 --- a/keyboards/handwired/kbod/keyboard.json +++ b/keyboards/handwired/kbod/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/ks63/keyboard.json b/keyboards/handwired/ks63/keyboard.json index da0d2e0a3f..8b5a6c4e4c 100644 --- a/keyboards/handwired/ks63/keyboard.json +++ b/keyboards/handwired/ks63/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/leftynumpad/keyboard.json b/keyboards/handwired/leftynumpad/keyboard.json index bb178be5be..a9d7804364 100644 --- a/keyboards/handwired/leftynumpad/keyboard.json +++ b/keyboards/handwired/leftynumpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/lovelive9/keyboard.json b/keyboards/handwired/lovelive9/keyboard.json index f8962bf761..cf20b13b20 100644 --- a/keyboards/handwired/lovelive9/keyboard.json +++ b/keyboards/handwired/lovelive9/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/marauder/keyboard.json b/keyboards/handwired/marauder/keyboard.json index aa612c1ff0..6fbdcdc66f 100644 --- a/keyboards/handwired/marauder/keyboard.json +++ b/keyboards/handwired/marauder/keyboard.json @@ -23,7 +23,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/marek128b/ergosplit44/keyboard.json b/keyboards/handwired/marek128b/ergosplit44/keyboard.json index 7e14cbc172..aa9574472a 100644 --- a/keyboards/handwired/marek128b/ergosplit44/keyboard.json +++ b/keyboards/handwired/marek128b/ergosplit44/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/mechboards_micropad/keyboard.json b/keyboards/handwired/mechboards_micropad/keyboard.json index 7f830771c3..87cffe005a 100644 --- a/keyboards/handwired/mechboards_micropad/keyboard.json +++ b/keyboards/handwired/mechboards_micropad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/minorca/keyboard.json b/keyboards/handwired/minorca/keyboard.json index 0d27200cb1..32e3c9f92d 100644 --- a/keyboards/handwired/minorca/keyboard.json +++ b/keyboards/handwired/minorca/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/mutepad/keyboard.json b/keyboards/handwired/mutepad/keyboard.json index f727569c98..072db498ed 100644 --- a/keyboards/handwired/mutepad/keyboard.json +++ b/keyboards/handwired/mutepad/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/nicekey/keyboard.json b/keyboards/handwired/nicekey/keyboard.json index 66866de548..f166d68774 100644 --- a/keyboards/handwired/nicekey/keyboard.json +++ b/keyboards/handwired/nicekey/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/not_so_minidox/keyboard.json b/keyboards/handwired/not_so_minidox/keyboard.json index abd1f43708..6e5b5932ce 100644 --- a/keyboards/handwired/not_so_minidox/keyboard.json +++ b/keyboards/handwired/not_so_minidox/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/nozbe_macro/keyboard.json b/keyboards/handwired/nozbe_macro/keyboard.json index 494d52d221..1f219c9d09 100644 --- a/keyboards/handwired/nozbe_macro/keyboard.json +++ b/keyboards/handwired/nozbe_macro/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/obuwunkunubi/spaget/keyboard.json b/keyboards/handwired/obuwunkunubi/spaget/keyboard.json index 44d22e71d6..3926b96db5 100644 --- a/keyboards/handwired/obuwunkunubi/spaget/keyboard.json +++ b/keyboards/handwired/obuwunkunubi/spaget/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/oem_ansi_fullsize/keyboard.json b/keyboards/handwired/oem_ansi_fullsize/keyboard.json index e83b2c61d3..eb63c481b1 100644 --- a/keyboards/handwired/oem_ansi_fullsize/keyboard.json +++ b/keyboards/handwired/oem_ansi_fullsize/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json index 577cb68a6b..f09810129f 100644 --- a/keyboards/handwired/onekey/info.json +++ b/keyboards/handwired/onekey/info.json @@ -11,7 +11,6 @@ "bootmagic": false, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": false }, diff --git a/keyboards/handwired/orbweaver/keyboard.json b/keyboards/handwired/orbweaver/keyboard.json index 5ba08dfc2d..d6d599a704 100644 --- a/keyboards/handwired/orbweaver/keyboard.json +++ b/keyboards/handwired/orbweaver/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/ortho5x14/keyboard.json b/keyboards/handwired/ortho5x14/keyboard.json index 281ad1c0e0..f0b7e923c1 100644 --- a/keyboards/handwired/ortho5x14/keyboard.json +++ b/keyboards/handwired/ortho5x14/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/p65rgb/keyboard.json b/keyboards/handwired/p65rgb/keyboard.json index a0c75b7e4f..36a4d8671b 100644 --- a/keyboards/handwired/p65rgb/keyboard.json +++ b/keyboards/handwired/p65rgb/keyboard.json @@ -164,7 +164,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/petruziamini/keyboard.json b/keyboards/handwired/petruziamini/keyboard.json index 1d864d5dbb..d76643c6be 100644 --- a/keyboards/handwired/petruziamini/keyboard.json +++ b/keyboards/handwired/petruziamini/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/phantagom/baragon/keyboard.json b/keyboards/handwired/phantagom/baragon/keyboard.json index 390f114dd9..529ed949e3 100644 --- a/keyboards/handwired/phantagom/baragon/keyboard.json +++ b/keyboards/handwired/phantagom/baragon/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/phantagom/varan/keyboard.json b/keyboards/handwired/phantagom/varan/keyboard.json index a767d45de0..fcc39918d6 100644 --- a/keyboards/handwired/phantagom/varan/keyboard.json +++ b/keyboards/handwired/phantagom/varan/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/polly40/keyboard.json b/keyboards/handwired/polly40/keyboard.json index fde1b77aab..5b2438f999 100644 --- a/keyboards/handwired/polly40/keyboard.json +++ b/keyboards/handwired/polly40/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/handwired/prime_exl/keyboard.json b/keyboards/handwired/prime_exl/keyboard.json index 13993a61b4..1462b37b96 100644 --- a/keyboards/handwired/prime_exl/keyboard.json +++ b/keyboards/handwired/prime_exl/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/prime_exl_plus/keyboard.json b/keyboards/handwired/prime_exl_plus/keyboard.json index a234bceb02..47222e0eb2 100644 --- a/keyboards/handwired/prime_exl_plus/keyboard.json +++ b/keyboards/handwired/prime_exl_plus/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/pteron/keyboard.json b/keyboards/handwired/pteron/keyboard.json index acaa1b7d62..ee8d85ec7d 100644 --- a/keyboards/handwired/pteron/keyboard.json +++ b/keyboards/handwired/pteron/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/pteron38/keyboard.json b/keyboards/handwired/pteron38/keyboard.json index f0c219f2e2..ef9f31f50d 100644 --- a/keyboards/handwired/pteron38/keyboard.json +++ b/keyboards/handwired/pteron38/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/pteron44/keyboard.json b/keyboards/handwired/pteron44/keyboard.json index 497fd95f58..4ad3b22318 100644 --- a/keyboards/handwired/pteron44/keyboard.json +++ b/keyboards/handwired/pteron44/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/qc60/proto/keyboard.json b/keyboards/handwired/qc60/proto/keyboard.json index b9919c4465..d9ee9858ec 100644 --- a/keyboards/handwired/qc60/proto/keyboard.json +++ b/keyboards/handwired/qc60/proto/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/rabijl/rotary_numpad/keyboard.json b/keyboards/handwired/rabijl/rotary_numpad/keyboard.json index dafeec0fc0..a5476735c9 100644 --- a/keyboards/handwired/rabijl/rotary_numpad/keyboard.json +++ b/keyboards/handwired/rabijl/rotary_numpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/riblee_split/keyboard.json b/keyboards/handwired/riblee_split/keyboard.json index 9748bf1ec2..b38219d645 100644 --- a/keyboards/handwired/riblee_split/keyboard.json +++ b/keyboards/handwired/riblee_split/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto34/keyboard.json b/keyboards/handwired/scottokeebs/scotto34/keyboard.json index 6fcce38d70..323c1132a7 100644 --- a/keyboards/handwired/scottokeebs/scotto34/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto34/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto36/keyboard.json b/keyboards/handwired/scottokeebs/scotto36/keyboard.json index fe8ecb6629..c1c748456d 100644 --- a/keyboards/handwired/scottokeebs/scotto36/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto36/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto37/keyboard.json b/keyboards/handwired/scottokeebs/scotto37/keyboard.json index 579840e8d1..7e45ce3ad5 100644 --- a/keyboards/handwired/scottokeebs/scotto37/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto37/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto40/keyboard.json b/keyboards/handwired/scottokeebs/scotto40/keyboard.json index b10f677c4d..ce47a5f1bf 100644 --- a/keyboards/handwired/scottokeebs/scotto40/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto61/keyboard.json b/keyboards/handwired/scottokeebs/scotto61/keyboard.json index cf321a2e97..f0adfd4081 100644 --- a/keyboards/handwired/scottokeebs/scotto61/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto61/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto9/keyboard.json b/keyboards/handwired/scottokeebs/scotto9/keyboard.json index a42d206300..e48fd54686 100644 --- a/keyboards/handwired/scottokeebs/scotto9/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto9/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoalp/keyboard.json b/keyboards/handwired/scottokeebs/scottoalp/keyboard.json index 5bce6ae62c..fad006c488 100644 --- a/keyboards/handwired/scottokeebs/scottoalp/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoalp/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottocmd/keyboard.json b/keyboards/handwired/scottokeebs/scottocmd/keyboard.json index a26b95c1db..cd7372855a 100644 --- a/keyboards/handwired/scottokeebs/scottocmd/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottocmd/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/scottokeebs/scottodeck/keyboard.json b/keyboards/handwired/scottokeebs/scottodeck/keyboard.json index 0607918cae..50bdf99321 100644 --- a/keyboards/handwired/scottokeebs/scottodeck/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottodeck/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/scottokeebs/scottoergo/keyboard.json b/keyboards/handwired/scottokeebs/scottoergo/keyboard.json index 4f6d955271..12c1495dc0 100644 --- a/keyboards/handwired/scottokeebs/scottoergo/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoergo/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottofly/keyboard.json b/keyboards/handwired/scottokeebs/scottofly/keyboard.json index 5255a5baf4..eda0385497 100644 --- a/keyboards/handwired/scottokeebs/scottofly/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottofly/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottofrog/keyboard.json b/keyboards/handwired/scottokeebs/scottofrog/keyboard.json index 147f2d8aa7..5d50e893a7 100644 --- a/keyboards/handwired/scottokeebs/scottofrog/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottofrog/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottogame/keyboard.json b/keyboards/handwired/scottokeebs/scottogame/keyboard.json index 912cfdfaaa..694f25fbd5 100644 --- a/keyboards/handwired/scottokeebs/scottogame/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottogame/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/scottokeebs/scottohazard/keyboard.json b/keyboards/handwired/scottokeebs/scottohazard/keyboard.json index 45adcec3c8..34915ca7bc 100644 --- a/keyboards/handwired/scottokeebs/scottohazard/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottohazard/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json b/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json index 2a9054cd4f..23ab2e7310 100644 --- a/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottokatana/keyboard.json b/keyboards/handwired/scottokeebs/scottokatana/keyboard.json index 4b5779b6d9..1b0369968c 100644 --- a/keyboards/handwired/scottokeebs/scottokatana/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottokatana/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottolong/keyboard.json b/keyboards/handwired/scottokeebs/scottolong/keyboard.json index 156772d213..664d0d47c9 100644 --- a/keyboards/handwired/scottokeebs/scottolong/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottolong/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json b/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json index f238564c7f..beb47c013b 100644 --- a/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottomouse/keyboard.json b/keyboards/handwired/scottokeebs/scottomouse/keyboard.json index 36f92f48e2..9c19e86472 100644 --- a/keyboards/handwired/scottokeebs/scottomouse/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottomouse/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottonum/keyboard.json b/keyboards/handwired/scottokeebs/scottonum/keyboard.json index f71f75d62b..256768fc60 100644 --- a/keyboards/handwired/scottokeebs/scottonum/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottonum/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoslant/keyboard.json b/keyboards/handwired/scottokeebs/scottoslant/keyboard.json index 8c9de39cd6..a6b1566c98 100644 --- a/keyboards/handwired/scottokeebs/scottoslant/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoslant/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottosplit/keyboard.json b/keyboards/handwired/scottokeebs/scottosplit/keyboard.json index 66d24db0cd..9761aec4d4 100644 --- a/keyboards/handwired/scottokeebs/scottosplit/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottosplit/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottostarter/keyboard.json b/keyboards/handwired/scottokeebs/scottostarter/keyboard.json index 5e6a70114b..03b50b5fdb 100644 --- a/keyboards/handwired/scottokeebs/scottostarter/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottostarter/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottowing/keyboard.json b/keyboards/handwired/scottokeebs/scottowing/keyboard.json index 91bfaa1f92..f4f0e32e94 100644 --- a/keyboards/handwired/scottokeebs/scottowing/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottowing/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/sejin_eat1010r2/keyboard.json b/keyboards/handwired/sejin_eat1010r2/keyboard.json index e31a0063b5..26abf44dfd 100644 --- a/keyboards/handwired/sejin_eat1010r2/keyboard.json +++ b/keyboards/handwired/sejin_eat1010r2/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/sick_pad/keyboard.json b/keyboards/handwired/sick_pad/keyboard.json index ce76294a0d..883f26bafb 100644 --- a/keyboards/handwired/sick_pad/keyboard.json +++ b/keyboards/handwired/sick_pad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/skakunm_dactyl/keyboard.json b/keyboards/handwired/skakunm_dactyl/keyboard.json index d14023e6c0..c004c75c71 100644 --- a/keyboards/handwired/skakunm_dactyl/keyboard.json +++ b/keyboards/handwired/skakunm_dactyl/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/snatchpad/keyboard.json b/keyboards/handwired/snatchpad/keyboard.json index 61a8555135..09cce2b36c 100644 --- a/keyboards/handwired/snatchpad/keyboard.json +++ b/keyboards/handwired/snatchpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "key_lock": true, diff --git a/keyboards/handwired/space_oddity/keyboard.json b/keyboards/handwired/space_oddity/keyboard.json index a432372d97..c6186b3b20 100644 --- a/keyboards/handwired/space_oddity/keyboard.json +++ b/keyboards/handwired/space_oddity/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/split65/promicro/keyboard.json b/keyboards/handwired/split65/promicro/keyboard.json index 8b50ea8429..fa17a7ea1b 100644 --- a/keyboards/handwired/split65/promicro/keyboard.json +++ b/keyboards/handwired/split65/promicro/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/split89/keyboard.json b/keyboards/handwired/split89/keyboard.json index fdd092745f..aa87be8e31 100644 --- a/keyboards/handwired/split89/keyboard.json +++ b/keyboards/handwired/split89/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/starrykeebs/dude09/keyboard.json b/keyboards/handwired/starrykeebs/dude09/keyboard.json index 6e91adeb1e..a28c319804 100644 --- a/keyboards/handwired/starrykeebs/dude09/keyboard.json +++ b/keyboards/handwired/starrykeebs/dude09/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true }, diff --git a/keyboards/handwired/steamvan/rev1/keyboard.json b/keyboards/handwired/steamvan/rev1/keyboard.json index 575f5f1a7c..6949652c3e 100644 --- a/keyboards/handwired/steamvan/rev1/keyboard.json +++ b/keyboards/handwired/steamvan/rev1/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json b/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json index 2dc64b445e..45c5a057bc 100644 --- a/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json +++ b/keyboards/handwired/stef9998/split_5x7/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/stream_cheap/2x3/keyboard.json b/keyboards/handwired/stream_cheap/2x3/keyboard.json index ff62fa8a27..8329fefd88 100644 --- a/keyboards/handwired/stream_cheap/2x3/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x3/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/stream_cheap/2x4/keyboard.json b/keyboards/handwired/stream_cheap/2x4/keyboard.json index 3f058cfbe4..aa87b4a765 100644 --- a/keyboards/handwired/stream_cheap/2x4/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x4/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/stream_cheap/2x5/keyboard.json b/keyboards/handwired/stream_cheap/2x5/keyboard.json index 8e2de67e62..744a3c92a4 100644 --- a/keyboards/handwired/stream_cheap/2x5/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x5/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/swiftrax/astro65/keyboard.json b/keyboards/handwired/swiftrax/astro65/keyboard.json index c72c0e4b3d..786e25d4ec 100644 --- a/keyboards/handwired/swiftrax/astro65/keyboard.json +++ b/keyboards/handwired/swiftrax/astro65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/bebol/keyboard.json b/keyboards/handwired/swiftrax/bebol/keyboard.json index 242d1b99a9..63d1356fcc 100644 --- a/keyboards/handwired/swiftrax/bebol/keyboard.json +++ b/keyboards/handwired/swiftrax/bebol/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/beegboy/keyboard.json b/keyboards/handwired/swiftrax/beegboy/keyboard.json index 75edd62c1e..74c82b22e8 100644 --- a/keyboards/handwired/swiftrax/beegboy/keyboard.json +++ b/keyboards/handwired/swiftrax/beegboy/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/swiftrax/bumblebee/keyboard.json b/keyboards/handwired/swiftrax/bumblebee/keyboard.json index 6dec52b59a..e280d9155a 100644 --- a/keyboards/handwired/swiftrax/bumblebee/keyboard.json +++ b/keyboards/handwired/swiftrax/bumblebee/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/swiftrax/cowfish/keyboard.json b/keyboards/handwired/swiftrax/cowfish/keyboard.json index b4387bb94b..675670d6b7 100644 --- a/keyboards/handwired/swiftrax/cowfish/keyboard.json +++ b/keyboards/handwired/swiftrax/cowfish/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/swiftrax/digicarp65/keyboard.json b/keyboards/handwired/swiftrax/digicarp65/keyboard.json index 59442c33ec..41636da219 100644 --- a/keyboards/handwired/swiftrax/digicarp65/keyboard.json +++ b/keyboards/handwired/swiftrax/digicarp65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/swiftrax/digicarpice/keyboard.json b/keyboards/handwired/swiftrax/digicarpice/keyboard.json index 6d857f5998..cf77a0d6a1 100644 --- a/keyboards/handwired/swiftrax/digicarpice/keyboard.json +++ b/keyboards/handwired/swiftrax/digicarpice/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/equator/keyboard.json b/keyboards/handwired/swiftrax/equator/keyboard.json index 6a539c786a..f5881aad0a 100644 --- a/keyboards/handwired/swiftrax/equator/keyboard.json +++ b/keyboards/handwired/swiftrax/equator/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/glacier/keyboard.json b/keyboards/handwired/swiftrax/glacier/keyboard.json index d455cbe266..c126ec6feb 100644 --- a/keyboards/handwired/swiftrax/glacier/keyboard.json +++ b/keyboards/handwired/swiftrax/glacier/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/joypad/keyboard.json b/keyboards/handwired/swiftrax/joypad/keyboard.json index b894dcbe54..dc167bb863 100644 --- a/keyboards/handwired/swiftrax/joypad/keyboard.json +++ b/keyboards/handwired/swiftrax/joypad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/swiftrax/koalafications/keyboard.json b/keyboards/handwired/swiftrax/koalafications/keyboard.json index 78686a8e70..6215e4f06a 100644 --- a/keyboards/handwired/swiftrax/koalafications/keyboard.json +++ b/keyboards/handwired/swiftrax/koalafications/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/nodu/keyboard.json b/keyboards/handwired/swiftrax/nodu/keyboard.json index 47c604c35f..93a7b9b6b8 100644 --- a/keyboards/handwired/swiftrax/nodu/keyboard.json +++ b/keyboards/handwired/swiftrax/nodu/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/pandamic/keyboard.json b/keyboards/handwired/swiftrax/pandamic/keyboard.json index 9fce9c80c5..9cf92812cb 100644 --- a/keyboards/handwired/swiftrax/pandamic/keyboard.json +++ b/keyboards/handwired/swiftrax/pandamic/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/swiftrax/the_galleon/keyboard.json b/keyboards/handwired/swiftrax/the_galleon/keyboard.json index 1d87ce1893..2efd3eb382 100644 --- a/keyboards/handwired/swiftrax/the_galleon/keyboard.json +++ b/keyboards/handwired/swiftrax/the_galleon/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/unsplit/keyboard.json b/keyboards/handwired/swiftrax/unsplit/keyboard.json index bb18c0dea8..3155282317 100644 --- a/keyboards/handwired/swiftrax/unsplit/keyboard.json +++ b/keyboards/handwired/swiftrax/unsplit/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/walter/keyboard.json b/keyboards/handwired/swiftrax/walter/keyboard.json index cbf603a4ff..e5c42b2aff 100644 --- a/keyboards/handwired/swiftrax/walter/keyboard.json +++ b/keyboards/handwired/swiftrax/walter/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/tennie/keyboard.json b/keyboards/handwired/tennie/keyboard.json index 05143c1cb0..2b56ae379a 100644 --- a/keyboards/handwired/tennie/keyboard.json +++ b/keyboards/handwired/tennie/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/terminus_mini/keyboard.json b/keyboards/handwired/terminus_mini/keyboard.json index 0e1fdcee91..0d495bf55b 100644 --- a/keyboards/handwired/terminus_mini/keyboard.json +++ b/keyboards/handwired/terminus_mini/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/tkk/keyboard.json b/keyboards/handwired/tkk/keyboard.json index 3cf67ce24e..7f95b49a04 100644 --- a/keyboards/handwired/tkk/keyboard.json +++ b/keyboards/handwired/tkk/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/traveller/keyboard.json b/keyboards/handwired/traveller/keyboard.json index 31161efe64..65214cd618 100644 --- a/keyboards/handwired/traveller/keyboard.json +++ b/keyboards/handwired/traveller/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/tsubasa/keyboard.json b/keyboards/handwired/tsubasa/keyboard.json index 31e6bb72cc..74ae9348f4 100644 --- a/keyboards/handwired/tsubasa/keyboard.json +++ b/keyboards/handwired/tsubasa/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/twig/twig50/keyboard.json b/keyboards/handwired/twig/twig50/keyboard.json index 67054b6795..8403e62f0b 100644 --- a/keyboards/handwired/twig/twig50/keyboard.json +++ b/keyboards/handwired/twig/twig50/keyboard.json @@ -15,7 +15,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/uthol/rev1/keyboard.json b/keyboards/handwired/uthol/rev1/keyboard.json index dd5746e884..c03503bb4d 100644 --- a/keyboards/handwired/uthol/rev1/keyboard.json +++ b/keyboards/handwired/uthol/rev1/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/uthol/rev2/keyboard.json b/keyboards/handwired/uthol/rev2/keyboard.json index 95ca5946a9..f1ee97ece3 100644 --- a/keyboards/handwired/uthol/rev2/keyboard.json +++ b/keyboards/handwired/uthol/rev2/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/videowriter/keyboard.json b/keyboards/handwired/videowriter/keyboard.json index f82a0cd07e..8ffd4a608c 100644 --- a/keyboards/handwired/videowriter/keyboard.json +++ b/keyboards/handwired/videowriter/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/wwa/helios/keyboard.json b/keyboards/handwired/wwa/helios/keyboard.json index af894cad64..4da75c0389 100644 --- a/keyboards/handwired/wwa/helios/keyboard.json +++ b/keyboards/handwired/wwa/helios/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/kepler/keyboard.json b/keyboards/handwired/wwa/kepler/keyboard.json index 2b1ac39337..67acae2c7d 100644 --- a/keyboards/handwired/wwa/kepler/keyboard.json +++ b/keyboards/handwired/wwa/kepler/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/mercury/keyboard.json b/keyboards/handwired/wwa/mercury/keyboard.json index 2a31875b01..a621286b27 100644 --- a/keyboards/handwired/wwa/mercury/keyboard.json +++ b/keyboards/handwired/wwa/mercury/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/soyuz/keyboard.json b/keyboards/handwired/wwa/soyuz/keyboard.json index 1783782754..072ed1628b 100644 --- a/keyboards/handwired/wwa/soyuz/keyboard.json +++ b/keyboards/handwired/wwa/soyuz/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/soyuzxl/keyboard.json b/keyboards/handwired/wwa/soyuzxl/keyboard.json index 98f4bc649d..fa67e37ad9 100644 --- a/keyboards/handwired/wwa/soyuzxl/keyboard.json +++ b/keyboards/handwired/wwa/soyuzxl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/z150/keyboard.json b/keyboards/handwired/z150/keyboard.json index e3e7b5c769..f8b9e6451d 100644 --- a/keyboards/handwired/z150/keyboard.json +++ b/keyboards/handwired/z150/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/zergo/keyboard.json b/keyboards/handwired/zergo/keyboard.json index 7ee2cd4774..44bd80c0cd 100644 --- a/keyboards/handwired/zergo/keyboard.json +++ b/keyboards/handwired/zergo/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json index decb70c78e..855fabeb8f 100644 --- a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json +++ b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/hardlineworks/otd_plus/keyboard.json b/keyboards/hardlineworks/otd_plus/keyboard.json index 38d9f40ae8..f084fabead 100644 --- a/keyboards/hardlineworks/otd_plus/keyboard.json +++ b/keyboards/hardlineworks/otd_plus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hardwareabstraction/handwire/keyboard.json b/keyboards/hardwareabstraction/handwire/keyboard.json index 225712dcc4..e875305508 100644 --- a/keyboards/hardwareabstraction/handwire/keyboard.json +++ b/keyboards/hardwareabstraction/handwire/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/heliar/wm1_hotswap/keyboard.json b/keyboards/heliar/wm1_hotswap/keyboard.json index 704710d948..748c2c5353 100644 --- a/keyboards/heliar/wm1_hotswap/keyboard.json +++ b/keyboards/heliar/wm1_hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/heliotrope/keyboard.json b/keyboards/heliotrope/keyboard.json index e173c785e0..c1701b07b2 100644 --- a/keyboards/heliotrope/keyboard.json +++ b/keyboards/heliotrope/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hfdkb/ac001/keyboard.json b/keyboards/hfdkb/ac001/keyboard.json index b5fd8eb4a9..4317f7071d 100644 --- a/keyboards/hfdkb/ac001/keyboard.json +++ b/keyboards/hfdkb/ac001/keyboard.json @@ -23,7 +23,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/hhkb_lite_2/keyboard.json b/keyboards/hhkb_lite_2/keyboard.json index df69582b65..f9315e8c83 100644 --- a/keyboards/hhkb_lite_2/keyboard.json +++ b/keyboards/hhkb_lite_2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hidtech/bastyl/keyboard.json b/keyboards/hidtech/bastyl/keyboard.json index 1155caa320..77f27cf8e6 100644 --- a/keyboards/hidtech/bastyl/keyboard.json +++ b/keyboards/hidtech/bastyl/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hifumi/keyboard.json b/keyboards/hifumi/keyboard.json index 457c8a7398..1da0a7a3e0 100644 --- a/keyboards/hifumi/keyboard.json +++ b/keyboards/hifumi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/hineybush/h08_ocelot/keyboard.json b/keyboards/hineybush/h08_ocelot/keyboard.json index 46de9a63f8..69ef5d2280 100644 --- a/keyboards/hineybush/h08_ocelot/keyboard.json +++ b/keyboards/hineybush/h08_ocelot/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hineybush/h101/keyboard.json b/keyboards/hineybush/h101/keyboard.json index 7d17c1922f..9264897399 100644 --- a/keyboards/hineybush/h101/keyboard.json +++ b/keyboards/hineybush/h101/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/h60/keyboard.json b/keyboards/hineybush/h60/keyboard.json index 3ee6d66c17..53fd5175a1 100644 --- a/keyboards/hineybush/h60/keyboard.json +++ b/keyboards/hineybush/h60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/hineybush/h65/keyboard.json b/keyboards/hineybush/h65/keyboard.json index 0c85733e7d..838c005bea 100644 --- a/keyboards/hineybush/h65/keyboard.json +++ b/keyboards/hineybush/h65/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h65_hotswap/keyboard.json b/keyboards/hineybush/h65_hotswap/keyboard.json index 12e7f65330..9293702975 100644 --- a/keyboards/hineybush/h65_hotswap/keyboard.json +++ b/keyboards/hineybush/h65_hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h660s/keyboard.json b/keyboards/hineybush/h660s/keyboard.json index c1ca43de5b..c5e28561aa 100644 --- a/keyboards/hineybush/h660s/keyboard.json +++ b/keyboards/hineybush/h660s/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h75_singa/keyboard.json b/keyboards/hineybush/h75_singa/keyboard.json index 02d2b13d09..c819d51492 100644 --- a/keyboards/hineybush/h75_singa/keyboard.json +++ b/keyboards/hineybush/h75_singa/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h87_g2/keyboard.json b/keyboards/hineybush/h87_g2/keyboard.json index ae97c5aadd..8d70fd2e3d 100644 --- a/keyboards/hineybush/h87_g2/keyboard.json +++ b/keyboards/hineybush/h87_g2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/h87a/keyboard.json b/keyboards/hineybush/h87a/keyboard.json index a03727e4f5..67734ea87d 100644 --- a/keyboards/hineybush/h87a/keyboard.json +++ b/keyboards/hineybush/h87a/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h88/keyboard.json b/keyboards/hineybush/h88/keyboard.json index c623416e7a..d8cceb2e48 100644 --- a/keyboards/hineybush/h88/keyboard.json +++ b/keyboards/hineybush/h88/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h88_g2/keyboard.json b/keyboards/hineybush/h88_g2/keyboard.json index a23216bd86..f4e19247b4 100644 --- a/keyboards/hineybush/h88_g2/keyboard.json +++ b/keyboards/hineybush/h88_g2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hineybush/ibis/keyboard.json b/keyboards/hineybush/ibis/keyboard.json index 40cba1c8f9..bc8069d74d 100644 --- a/keyboards/hineybush/ibis/keyboard.json +++ b/keyboards/hineybush/ibis/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/physix/keyboard.json b/keyboards/hineybush/physix/keyboard.json index ee6c5f3978..cbe073d2d3 100644 --- a/keyboards/hineybush/physix/keyboard.json +++ b/keyboards/hineybush/physix/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/sm68/keyboard.json b/keyboards/hineybush/sm68/keyboard.json index f499fa605c..3224a7906f 100644 --- a/keyboards/hineybush/sm68/keyboard.json +++ b/keyboards/hineybush/sm68/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/holyswitch/lightweight65/keyboard.json b/keyboards/holyswitch/lightweight65/keyboard.json index bc2fdc9504..237b40d447 100644 --- a/keyboards/holyswitch/lightweight65/keyboard.json +++ b/keyboards/holyswitch/lightweight65/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/holyswitch/southpaw75/keyboard.json b/keyboards/holyswitch/southpaw75/keyboard.json index e735895f20..3215c525a0 100644 --- a/keyboards/holyswitch/southpaw75/keyboard.json +++ b/keyboards/holyswitch/southpaw75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json b/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json index ecd3c8a043..2ec09c45c8 100644 --- a/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json +++ b/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json b/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json index d14278f989..673c13b382 100644 --- a/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json +++ b/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json index 6e8f7a00ff..18405f251f 100644 --- a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json index f19a338721..d157fca7be 100644 --- a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json @@ -60,7 +60,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/horrortroll/nyx/rev1/keyboard.json b/keyboards/horrortroll/nyx/rev1/keyboard.json index f3b859de0a..2e2d3a0243 100644 --- a/keyboards/horrortroll/nyx/rev1/keyboard.json +++ b/keyboards/horrortroll/nyx/rev1/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/horrortroll/paws60/keyboard.json b/keyboards/horrortroll/paws60/keyboard.json index fb158d5791..edf59c6ef9 100644 --- a/keyboards/horrortroll/paws60/keyboard.json +++ b/keyboards/horrortroll/paws60/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/hotdox76v2/keyboard.json b/keyboards/hotdox76v2/keyboard.json index 438099827e..a2957b2177 100644 --- a/keyboards/hotdox76v2/keyboard.json +++ b/keyboards/hotdox76v2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hp69/keyboard.json b/keyboards/hp69/keyboard.json index 577606be5d..f0f079a0ac 100644 --- a/keyboards/hp69/keyboard.json +++ b/keyboards/hp69/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hubble/keyboard.json b/keyboards/hubble/keyboard.json index 2b75235cbb..15f729e5c2 100644 --- a/keyboards/hubble/keyboard.json +++ b/keyboards/hubble/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/huytbt/h50/keyboard.json b/keyboards/huytbt/h50/keyboard.json index cd62966e58..d36d18d4b8 100644 --- a/keyboards/huytbt/h50/keyboard.json +++ b/keyboards/huytbt/h50/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ianklug/grooveboard/keyboard.json b/keyboards/ianklug/grooveboard/keyboard.json index ce7ac8cc22..a974d172e0 100644 --- a/keyboards/ianklug/grooveboard/keyboard.json +++ b/keyboards/ianklug/grooveboard/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ibm/model_m/ashpil_usbc/keyboard.json b/keyboards/ibm/model_m/ashpil_usbc/keyboard.json index a43e16a04c..c410216610 100644 --- a/keyboards/ibm/model_m/ashpil_usbc/keyboard.json +++ b/keyboards/ibm/model_m/ashpil_usbc/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/modelh/keyboard.json b/keyboards/ibm/model_m/modelh/keyboard.json index 6b9cf20c1d..0f2f858076 100644 --- a/keyboards/ibm/model_m/modelh/keyboard.json +++ b/keyboards/ibm/model_m/modelh/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/teensy2/keyboard.json b/keyboards/ibm/model_m/teensy2/keyboard.json index 173f9e772f..297e422fd1 100644 --- a/keyboards/ibm/model_m/teensy2/keyboard.json +++ b/keyboards/ibm/model_m/teensy2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/yugo_m/keyboard.json b/keyboards/ibm/model_m/yugo_m/keyboard.json index 10fe637f03..a05ae6feff 100644 --- a/keyboards/ibm/model_m/yugo_m/keyboard.json +++ b/keyboards/ibm/model_m/yugo_m/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ibm/model_m_ssk/teensypp_ssk/keyboard.json b/keyboards/ibm/model_m_ssk/teensypp_ssk/keyboard.json index 5994d820f4..50ce403130 100644 --- a/keyboards/ibm/model_m_ssk/teensypp_ssk/keyboard.json +++ b/keyboards/ibm/model_m_ssk/teensypp_ssk/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibnuda/alicia_cook/keyboard.json b/keyboards/ibnuda/alicia_cook/keyboard.json index fd3b23285c..c83a5b43d3 100644 --- a/keyboards/ibnuda/alicia_cook/keyboard.json +++ b/keyboards/ibnuda/alicia_cook/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/ibnuda/gurindam/keyboard.json b/keyboards/ibnuda/gurindam/keyboard.json index 1cf74068b6..e2693b7f21 100644 --- a/keyboards/ibnuda/gurindam/keyboard.json +++ b/keyboards/ibnuda/gurindam/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/icebreaker/hotswap/keyboard.json b/keyboards/icebreaker/hotswap/keyboard.json index 5102da60c1..29daba253c 100644 --- a/keyboards/icebreaker/hotswap/keyboard.json +++ b/keyboards/icebreaker/hotswap/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/idank/sweeq/keyboard.json b/keyboards/idank/sweeq/keyboard.json index a9b8d7411e..36a9ceeb12 100644 --- a/keyboards/idank/sweeq/keyboard.json +++ b/keyboards/idank/sweeq/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/idb/idb_60/keyboard.json b/keyboards/idb/idb_60/keyboard.json index 22ed07b71b..e739a2dbf4 100644 --- a/keyboards/idb/idb_60/keyboard.json +++ b/keyboards/idb/idb_60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/idobao/id42/keyboard.json b/keyboards/idobao/id42/keyboard.json index 14db7641ea..9689356400 100644 --- a/keyboards/idobao/id42/keyboard.json +++ b/keyboards/idobao/id42/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/idobao/id61/keyboard.json b/keyboards/idobao/id61/keyboard.json index cb55f1750d..b712d276f2 100644 --- a/keyboards/idobao/id61/keyboard.json +++ b/keyboards/idobao/id61/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id63/keyboard.json b/keyboards/idobao/id63/keyboard.json index 1969ca4cf7..f7e5a7743a 100644 --- a/keyboards/idobao/id63/keyboard.json +++ b/keyboards/idobao/id63/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id67/keyboard.json b/keyboards/idobao/id67/keyboard.json index 64c3623fd6..f4cc52495c 100644 --- a/keyboards/idobao/id67/keyboard.json +++ b/keyboards/idobao/id67/keyboard.json @@ -9,7 +9,6 @@ "mousekey": true, "extrakey": true, "command": false, - "console": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/idobao/id75/v2/keyboard.json b/keyboards/idobao/id75/v2/keyboard.json index 69cbc037c4..053ea68f60 100644 --- a/keyboards/idobao/id75/v2/keyboard.json +++ b/keyboards/idobao/id75/v2/keyboard.json @@ -52,7 +52,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/idobao/id80/v2/info.json b/keyboards/idobao/id80/v2/info.json index 66123fcb2a..6f063fe32b 100644 --- a/keyboards/idobao/id80/v2/info.json +++ b/keyboards/idobao/id80/v2/info.json @@ -49,7 +49,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "backlight": true, diff --git a/keyboards/idobao/id80/v3/ansi/keyboard.json b/keyboards/idobao/id80/v3/ansi/keyboard.json index 6200c2e88c..03d54f5e30 100644 --- a/keyboards/idobao/id80/v3/ansi/keyboard.json +++ b/keyboards/idobao/id80/v3/ansi/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/idobao/id87/v1/keyboard.json b/keyboards/idobao/id87/v1/keyboard.json index 5ae86f8d5e..854f345616 100644 --- a/keyboards/idobao/id87/v1/keyboard.json +++ b/keyboards/idobao/id87/v1/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id87/v2/keyboard.json b/keyboards/idobao/id87/v2/keyboard.json index 0ece932274..f21fd70b7b 100644 --- a/keyboards/idobao/id87/v2/keyboard.json +++ b/keyboards/idobao/id87/v2/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/idobao/id96/keyboard.json b/keyboards/idobao/id96/keyboard.json index c06dfdd454..abd9b61958 100644 --- a/keyboards/idobao/id96/keyboard.json +++ b/keyboards/idobao/id96/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/montex/v1/keyboard.json b/keyboards/idobao/montex/v1/keyboard.json index 2d9f503832..cbece8a392 100644 --- a/keyboards/idobao/montex/v1/keyboard.json +++ b/keyboards/idobao/montex/v1/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/montex/v1rgb/keyboard.json b/keyboards/idobao/montex/v1rgb/keyboard.json index f4c18764b1..58369f7169 100755 --- a/keyboards/idobao/montex/v1rgb/keyboard.json +++ b/keyboards/idobao/montex/v1rgb/keyboard.json @@ -38,7 +38,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/idobao/montex/v2/keyboard.json b/keyboards/idobao/montex/v2/keyboard.json index 6c00fd538d..27f6c02d76 100755 --- a/keyboards/idobao/montex/v2/keyboard.json +++ b/keyboards/idobao/montex/v2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idyllic/tinny50_rgb/keyboard.json b/keyboards/idyllic/tinny50_rgb/keyboard.json index b3eb34a4c0..f7bd204567 100644 --- a/keyboards/idyllic/tinny50_rgb/keyboard.json +++ b/keyboards/idyllic/tinny50_rgb/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/igloo/keyboard.json b/keyboards/igloo/keyboard.json index cf64823104..ceb7a03a75 100644 --- a/keyboards/igloo/keyboard.json +++ b/keyboards/igloo/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/illuminati/is0/keyboard.json b/keyboards/illuminati/is0/keyboard.json index 78bbe029ab..33f7208a47 100644 --- a/keyboards/illuminati/is0/keyboard.json +++ b/keyboards/illuminati/is0/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/illusion/rosa/keyboard.json b/keyboards/illusion/rosa/keyboard.json index f1077ecdbd..932b1a91d6 100644 --- a/keyboards/illusion/rosa/keyboard.json +++ b/keyboards/illusion/rosa/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ilumkb/primus75/keyboard.json b/keyboards/ilumkb/primus75/keyboard.json index 52d2982097..4441187254 100644 --- a/keyboards/ilumkb/primus75/keyboard.json +++ b/keyboards/ilumkb/primus75/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ilumkb/simpler61/keyboard.json b/keyboards/ilumkb/simpler61/keyboard.json index a9fc9913c8..10e182dac8 100644 --- a/keyboards/ilumkb/simpler61/keyboard.json +++ b/keyboards/ilumkb/simpler61/keyboard.json @@ -50,7 +50,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ilumkb/simpler64/keyboard.json b/keyboards/ilumkb/simpler64/keyboard.json index 30ec37c977..240d0d67c2 100644 --- a/keyboards/ilumkb/simpler64/keyboard.json +++ b/keyboards/ilumkb/simpler64/keyboard.json @@ -50,7 +50,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ilumkb/volcano660/keyboard.json b/keyboards/ilumkb/volcano660/keyboard.json index e353c8cce0..616098da01 100644 --- a/keyboards/ilumkb/volcano660/keyboard.json +++ b/keyboards/ilumkb/volcano660/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/inett_studio/sqx/hotswap/keyboard.json b/keyboards/inett_studio/sqx/hotswap/keyboard.json index 6c04e4fbe5..f4b1bcc4ce 100644 --- a/keyboards/inett_studio/sqx/hotswap/keyboard.json +++ b/keyboards/inett_studio/sqx/hotswap/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/inett_studio/sqx/universal/keyboard.json b/keyboards/inett_studio/sqx/universal/keyboard.json index 7c7b4e479e..7f27ca0cc9 100644 --- a/keyboards/inett_studio/sqx/universal/keyboard.json +++ b/keyboards/inett_studio/sqx/universal/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/inland/mk47/keyboard.json b/keyboards/inland/mk47/keyboard.json index de6f792f6d..a15701db26 100644 --- a/keyboards/inland/mk47/keyboard.json +++ b/keyboards/inland/mk47/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/inland/v83p/keyboard.json b/keyboards/inland/v83p/keyboard.json index 139cfb693b..96b6cd9551 100644 --- a/keyboards/inland/v83p/keyboard.json +++ b/keyboards/inland/v83p/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/input_club/k_type/keyboard.json b/keyboards/input_club/k_type/keyboard.json index 3769bdae83..cc93783dc9 100644 --- a/keyboards/input_club/k_type/keyboard.json +++ b/keyboards/input_club/k_type/keyboard.json @@ -58,7 +58,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/input_club/whitefox/keyboard.json b/keyboards/input_club/whitefox/keyboard.json index 1d3799b867..60f2dca4d0 100644 --- a/keyboards/input_club/whitefox/keyboard.json +++ b/keyboards/input_club/whitefox/keyboard.json @@ -113,7 +113,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "led_matrix": true, "mousekey": true, diff --git a/keyboards/io_mini1800/keyboard.json b/keyboards/io_mini1800/keyboard.json index 884d17aa06..d0333c75cf 100644 --- a/keyboards/io_mini1800/keyboard.json +++ b/keyboards/io_mini1800/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/irene/keyboard.json b/keyboards/irene/keyboard.json index b9189bc864..7844a66377 100644 --- a/keyboards/irene/keyboard.json +++ b/keyboards/irene/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/iriskeyboards/keyboard.json b/keyboards/iriskeyboards/keyboard.json index c568e8e232..b8c5195ae9 100644 --- a/keyboards/iriskeyboards/keyboard.json +++ b/keyboards/iriskeyboards/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/itstleo/itstleo40/keyboard.json b/keyboards/itstleo/itstleo40/keyboard.json index 637f8e5d7e..10ffa78e07 100644 --- a/keyboards/itstleo/itstleo40/keyboard.json +++ b/keyboards/itstleo/itstleo40/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "leader": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/j80/keyboard.json b/keyboards/j80/keyboard.json index c7fee83834..91e9683c26 100644 --- a/keyboards/j80/keyboard.json +++ b/keyboards/j80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json b/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json index cbbb27ca04..d96d52514e 100644 --- a/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json +++ b/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json b/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json index 23112f5b33..c6c5ef06c5 100644 --- a/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json +++ b/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/jadookb/jkb65/info.json b/keyboards/jadookb/jkb65/info.json index c4a44a0d74..527016499c 100644 --- a/keyboards/jadookb/jkb65/info.json +++ b/keyboards/jadookb/jkb65/info.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/janus/keyboard.json b/keyboards/janus/keyboard.json index 8c4f522b86..c50b5ef19a 100644 --- a/keyboards/janus/keyboard.json +++ b/keyboards/janus/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/aumz_work/info.json b/keyboards/jaykeeb/aumz_work/info.json index 8a1107127a..2b85958486 100644 --- a/keyboards/jaykeeb/aumz_work/info.json +++ b/keyboards/jaykeeb/aumz_work/info.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/jk60/keyboard.json b/keyboards/jaykeeb/jk60/keyboard.json index 813f4d1e87..7d0aff2dfd 100644 --- a/keyboards/jaykeeb/jk60/keyboard.json +++ b/keyboards/jaykeeb/jk60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/jk60rgb/keyboard.json b/keyboards/jaykeeb/jk60rgb/keyboard.json index 45a708615e..1bcbbf0561 100644 --- a/keyboards/jaykeeb/jk60rgb/keyboard.json +++ b/keyboards/jaykeeb/jk60rgb/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/jk65/keyboard.json b/keyboards/jaykeeb/jk65/keyboard.json index 320725509e..484e449b26 100644 --- a/keyboards/jaykeeb/jk65/keyboard.json +++ b/keyboards/jaykeeb/jk65/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/joker/keyboard.json b/keyboards/jaykeeb/joker/keyboard.json index 3d3663d38d..82df51cbbf 100644 --- a/keyboards/jaykeeb/joker/keyboard.json +++ b/keyboards/jaykeeb/joker/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/kamigakushi/keyboard.json b/keyboards/jaykeeb/kamigakushi/keyboard.json index 72c6d19937..b901171310 100644 --- a/keyboards/jaykeeb/kamigakushi/keyboard.json +++ b/keyboards/jaykeeb/kamigakushi/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/orba/keyboard.json b/keyboards/jaykeeb/orba/keyboard.json index 8d6a27d90b..4af3d6a9c2 100644 --- a/keyboards/jaykeeb/orba/keyboard.json +++ b/keyboards/jaykeeb/orba/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/sebelas/keyboard.json b/keyboards/jaykeeb/sebelas/keyboard.json index 4e5dc822b9..d07889fc4f 100644 --- a/keyboards/jaykeeb/sebelas/keyboard.json +++ b/keyboards/jaykeeb/sebelas/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/skyline/keyboard.json b/keyboards/jaykeeb/skyline/keyboard.json index 66d3390fc8..c81c37acab 100644 --- a/keyboards/jaykeeb/skyline/keyboard.json +++ b/keyboards/jaykeeb/skyline/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/sriwedari70/keyboard.json b/keyboards/jaykeeb/sriwedari70/keyboard.json index 20f7e00ba4..a1a548901e 100644 --- a/keyboards/jaykeeb/sriwedari70/keyboard.json +++ b/keyboards/jaykeeb/sriwedari70/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/tokki/keyboard.json b/keyboards/jaykeeb/tokki/keyboard.json index 82c8056ebc..48a046e784 100644 --- a/keyboards/jaykeeb/tokki/keyboard.json +++ b/keyboards/jaykeeb/tokki/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jc65/v32a/keyboard.json b/keyboards/jc65/v32a/keyboard.json index 4cb14e54d4..cfdbec8663 100644 --- a/keyboards/jc65/v32a/keyboard.json +++ b/keyboards/jc65/v32a/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/jc65/v32u4/keyboard.json b/keyboards/jc65/v32u4/keyboard.json index 0abdbf6a18..4f681f2d1b 100644 --- a/keyboards/jc65/v32u4/keyboard.json +++ b/keyboards/jc65/v32u4/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jd40/keyboard.json b/keyboards/jd40/keyboard.json index 062972d43f..22badb3508 100644 --- a/keyboards/jd40/keyboard.json +++ b/keyboards/jd40/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jels/boaty/keyboard.json b/keyboards/jels/boaty/keyboard.json index 6bfcf25f16..3e02a2d9ce 100644 --- a/keyboards/jels/boaty/keyboard.json +++ b/keyboards/jels/boaty/keyboard.json @@ -14,7 +14,6 @@ "nkro": false, "mousekey": false, "extrakey": true, - "console": false, "command": false }, "qmk": { diff --git a/keyboards/jels/jels60/v1/keyboard.json b/keyboards/jels/jels60/v1/keyboard.json index 1f7b45adef..87a7667b3d 100644 --- a/keyboards/jels/jels60/v1/keyboard.json +++ b/keyboards/jels/jels60/v1/keyboard.json @@ -10,7 +10,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false }, diff --git a/keyboards/jels/jels60/v2/keyboard.json b/keyboards/jels/jels60/v2/keyboard.json index 4ab87eff49..9d8de45cb9 100644 --- a/keyboards/jels/jels60/v2/keyboard.json +++ b/keyboards/jels/jels60/v2/keyboard.json @@ -5,7 +5,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false }, diff --git a/keyboards/jels/jels88/keyboard.json b/keyboards/jels/jels88/keyboard.json index 430396ccf1..aa71b5692d 100644 --- a/keyboards/jels/jels88/keyboard.json +++ b/keyboards/jels/jels88/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jkdlab/binary_monkey/keyboard.json b/keyboards/jkdlab/binary_monkey/keyboard.json index c1aad15cb4..43ba02e3d5 100644 --- a/keyboards/jkdlab/binary_monkey/keyboard.json +++ b/keyboards/jkdlab/binary_monkey/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/jkeys_design/gentleman65/keyboard.json b/keyboards/jkeys_design/gentleman65/keyboard.json index 150cf4d351..5f4019a5aa 100644 --- a/keyboards/jkeys_design/gentleman65/keyboard.json +++ b/keyboards/jkeys_design/gentleman65/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jkeys_design/gentleman65_se_s/keyboard.json b/keyboards/jkeys_design/gentleman65_se_s/keyboard.json index cd4570a765..7b1d10ce43 100644 --- a/keyboards/jkeys_design/gentleman65_se_s/keyboard.json +++ b/keyboards/jkeys_design/gentleman65_se_s/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jolofsor/denial75/keyboard.json b/keyboards/jolofsor/denial75/keyboard.json index 14fbb07328..f2e8216c21 100644 --- a/keyboards/jolofsor/denial75/keyboard.json +++ b/keyboards/jolofsor/denial75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/joshajohnson/hub20/keyboard.json b/keyboards/joshajohnson/hub20/keyboard.json index 44a3361838..d374e2f404 100644 --- a/keyboards/joshajohnson/hub20/keyboard.json +++ b/keyboards/joshajohnson/hub20/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jukaie/jk01/keyboard.json b/keyboards/jukaie/jk01/keyboard.json index 3a6845258a..452d9bf5fa 100644 --- a/keyboards/jukaie/jk01/keyboard.json +++ b/keyboards/jukaie/jk01/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/k34/keyboard.json b/keyboards/k34/keyboard.json index b9a69fb667..205382cff6 100644 --- a/keyboards/k34/keyboard.json +++ b/keyboards/k34/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kabedon/kabedon78s/keyboard.json b/keyboards/kabedon/kabedon78s/keyboard.json index 393dcd4b3e..dc3ea77791 100644 --- a/keyboards/kabedon/kabedon78s/keyboard.json +++ b/keyboards/kabedon/kabedon78s/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kabedon/kabedon980/keyboard.json b/keyboards/kabedon/kabedon980/keyboard.json index b8e100ceac..4209a04fd0 100644 --- a/keyboards/kabedon/kabedon980/keyboard.json +++ b/keyboards/kabedon/kabedon980/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kabedon/kabedon98e/keyboard.json b/keyboards/kabedon/kabedon98e/keyboard.json index 85cc538d7d..3684248ddd 100644 --- a/keyboards/kabedon/kabedon98e/keyboard.json +++ b/keyboards/kabedon/kabedon98e/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kagizaraya/halberd/keyboard.json b/keyboards/kagizaraya/halberd/keyboard.json index da82556271..bf30654d08 100644 --- a/keyboards/kagizaraya/halberd/keyboard.json +++ b/keyboards/kagizaraya/halberd/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kagizaraya/miniaxe/keyboard.json b/keyboards/kagizaraya/miniaxe/keyboard.json index 52ecbbac5a..e568cf6eff 100644 --- a/keyboards/kagizaraya/miniaxe/keyboard.json +++ b/keyboards/kagizaraya/miniaxe/keyboard.json @@ -38,7 +38,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json index 8bf5d708c9..de6adc8529 100644 --- a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json +++ b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kalakos/bahrnob/keyboard.json b/keyboards/kalakos/bahrnob/keyboard.json index 2e127e555a..a3a559b8ce 100644 --- a/keyboards/kalakos/bahrnob/keyboard.json +++ b/keyboards/kalakos/bahrnob/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true diff --git a/keyboards/kaly/kaly42/keyboard.json b/keyboards/kaly/kaly42/keyboard.json index 3115d051df..15a4fc6b5b 100644 --- a/keyboards/kaly/kaly42/keyboard.json +++ b/keyboards/kaly/kaly42/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kapcave/arya/keyboard.json b/keyboards/kapcave/arya/keyboard.json index 986e9eec8b..a3893b44b2 100644 --- a/keyboards/kapcave/arya/keyboard.json +++ b/keyboards/kapcave/arya/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/kapcave/paladinpad/info.json b/keyboards/kapcave/paladinpad/info.json index 1a639180d0..678f094524 100644 --- a/keyboards/kapcave/paladinpad/info.json +++ b/keyboards/kapcave/paladinpad/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/karn/keyboard.json b/keyboards/karn/keyboard.json index 1ddd8e5a98..1c2c3a4301 100644 --- a/keyboards/karn/keyboard.json +++ b/keyboards/karn/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kb_elmo/67mk_e/keyboard.json b/keyboards/kb_elmo/67mk_e/keyboard.json index 046b08c667..a2c747d61f 100644 --- a/keyboards/kb_elmo/67mk_e/keyboard.json +++ b/keyboards/kb_elmo/67mk_e/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kb_elmo/noah_avr/keyboard.json b/keyboards/kb_elmo/noah_avr/keyboard.json index 48cbb6e5e2..918adbdd37 100644 --- a/keyboards/kb_elmo/noah_avr/keyboard.json +++ b/keyboards/kb_elmo/noah_avr/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kb_elmo/qez/keyboard.json b/keyboards/kb_elmo/qez/keyboard.json index fa53745b31..cefc2e1b51 100644 --- a/keyboards/kb_elmo/qez/keyboard.json +++ b/keyboards/kb_elmo/qez/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kb_elmo/vertex/keyboard.json b/keyboards/kb_elmo/vertex/keyboard.json index c40e87ad62..b3562e9315 100644 --- a/keyboards/kb_elmo/vertex/keyboard.json +++ b/keyboards/kb_elmo/vertex/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kbdcraft/adam64/keyboard.json b/keyboards/kbdcraft/adam64/keyboard.json index d7a96fa577..19e22c37cc 100644 --- a/keyboards/kbdcraft/adam64/keyboard.json +++ b/keyboards/kbdcraft/adam64/keyboard.json @@ -20,7 +20,6 @@ "mousekey": true, "extrakey": true, "nkro": true, - "console": false, "command": false, "rgb_matrix": true }, diff --git a/keyboards/kbdfans/baguette66/rgb/keyboard.json b/keyboards/kbdfans/baguette66/rgb/keyboard.json index 61579473cd..1ca4fefb4b 100644 --- a/keyboards/kbdfans/baguette66/rgb/keyboard.json +++ b/keyboards/kbdfans/baguette66/rgb/keyboard.json @@ -67,7 +67,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/baguette66/soldered/keyboard.json b/keyboards/kbdfans/baguette66/soldered/keyboard.json index f9c87dad06..45b744cd66 100644 --- a/keyboards/kbdfans/baguette66/soldered/keyboard.json +++ b/keyboards/kbdfans/baguette66/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/kbdfans/bella/soldered/keyboard.json b/keyboards/kbdfans/bella/soldered/keyboard.json index e99a4fb224..cbecfa6056 100644 --- a/keyboards/kbdfans/bella/soldered/keyboard.json +++ b/keyboards/kbdfans/bella/soldered/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/boop65/rgb/keyboard.json b/keyboards/kbdfans/boop65/rgb/keyboard.json index 6fbd28816b..5fd5585844 100644 --- a/keyboards/kbdfans/boop65/rgb/keyboard.json +++ b/keyboards/kbdfans/boop65/rgb/keyboard.json @@ -64,7 +64,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/bounce/75/hotswap/keyboard.json b/keyboards/kbdfans/bounce/75/hotswap/keyboard.json index 478b4bc372..592ba0de52 100644 --- a/keyboards/kbdfans/bounce/75/hotswap/keyboard.json +++ b/keyboards/kbdfans/bounce/75/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/bounce/75/soldered/keyboard.json b/keyboards/kbdfans/bounce/75/soldered/keyboard.json index 73c6d63d3a..c82833d700 100644 --- a/keyboards/kbdfans/bounce/75/soldered/keyboard.json +++ b/keyboards/kbdfans/bounce/75/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/bounce/pad/keyboard.json b/keyboards/kbdfans/bounce/pad/keyboard.json index d95010954b..96a5214551 100644 --- a/keyboards/kbdfans/bounce/pad/keyboard.json +++ b/keyboards/kbdfans/bounce/pad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/d45/v2/keyboard.json b/keyboards/kbdfans/d45/v2/keyboard.json index 6eadfa0860..95211e097b 100644 --- a/keyboards/kbdfans/d45/v2/keyboard.json +++ b/keyboards/kbdfans/d45/v2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/epoch80/keyboard.json b/keyboards/kbdfans/epoch80/keyboard.json index 08ed973b92..6e7ce41653 100644 --- a/keyboards/kbdfans/epoch80/keyboard.json +++ b/keyboards/kbdfans/epoch80/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kbdfans/kbd19x/keyboard.json b/keyboards/kbdfans/kbd19x/keyboard.json index 080cf82d80..cd57436a11 100644 --- a/keyboards/kbdfans/kbd19x/keyboard.json +++ b/keyboards/kbdfans/kbd19x/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json b/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json index f4bc2437d9..06f9238483 100644 --- a/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkii_soldered/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json index a90fd8b26b..e2efb6287b 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json @@ -45,7 +45,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json index 561c4df2ac..b43d634404 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json @@ -42,7 +42,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json index 79853d2d0f..719d5d3d83 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json @@ -61,7 +61,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/rev2/keyboard.json b/keyboards/kbdfans/kbd67/rev2/keyboard.json index 1190d3bd8a..118da461b6 100644 --- a/keyboards/kbdfans/kbd67/rev2/keyboard.json +++ b/keyboards/kbdfans/kbd67/rev2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd75hs/keyboard.json b/keyboards/kbdfans/kbd75hs/keyboard.json index 3545f2357d..dca52de53d 100644 --- a/keyboards/kbdfans/kbd75hs/keyboard.json +++ b/keyboards/kbdfans/kbd75hs/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd75rgb/keyboard.json b/keyboards/kbdfans/kbd75rgb/keyboard.json index b30fb22126..1076626ec7 100644 --- a/keyboards/kbdfans/kbd75rgb/keyboard.json +++ b/keyboards/kbdfans/kbd75rgb/keyboard.json @@ -70,7 +70,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/kbd8x/keyboard.json b/keyboards/kbdfans/kbd8x/keyboard.json index b8d34f8277..3e6aa88d4d 100644 --- a/keyboards/kbdfans/kbd8x/keyboard.json +++ b/keyboards/kbdfans/kbd8x/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/kbd8x_mk2/keyboard.json b/keyboards/kbdfans/kbd8x_mk2/keyboard.json index b5d1ee6a25..ff566fd864 100644 --- a/keyboards/kbdfans/kbd8x_mk2/keyboard.json +++ b/keyboards/kbdfans/kbd8x_mk2/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbdmini/keyboard.json b/keyboards/kbdfans/kbdmini/keyboard.json index 2f47097309..3cc5a73d17 100644 --- a/keyboards/kbdfans/kbdmini/keyboard.json +++ b/keyboards/kbdfans/kbdmini/keyboard.json @@ -42,7 +42,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbdpad/mk1/keyboard.json b/keyboards/kbdfans/kbdpad/mk1/keyboard.json index 10de0d0436..0fa231c303 100644 --- a/keyboards/kbdfans/kbdpad/mk1/keyboard.json +++ b/keyboards/kbdfans/kbdpad/mk1/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kbdfans/kbdpad/mk2/keyboard.json b/keyboards/kbdfans/kbdpad/mk2/keyboard.json index c4af51f034..6c7dba1293 100644 --- a/keyboards/kbdfans/kbdpad/mk2/keyboard.json +++ b/keyboards/kbdfans/kbdpad/mk2/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbdpad/mk3/keyboard.json b/keyboards/kbdfans/kbdpad/mk3/keyboard.json index 7c741f7633..726a8c7a08 100644 --- a/keyboards/kbdfans/kbdpad/mk3/keyboard.json +++ b/keyboards/kbdfans/kbdpad/mk3/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/maja/keyboard.json b/keyboards/kbdfans/maja/keyboard.json index a1ba96af51..91c8aec845 100644 --- a/keyboards/kbdfans/maja/keyboard.json +++ b/keyboards/kbdfans/maja/keyboard.json @@ -47,7 +47,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/maja_soldered/keyboard.json b/keyboards/kbdfans/maja_soldered/keyboard.json index 7879fd9962..5864cc445d 100644 --- a/keyboards/kbdfans/maja_soldered/keyboard.json +++ b/keyboards/kbdfans/maja_soldered/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/odin/rgb/keyboard.json b/keyboards/kbdfans/odin/rgb/keyboard.json index f1a0e7b8e8..aadd2cb29f 100644 --- a/keyboards/kbdfans/odin/rgb/keyboard.json +++ b/keyboards/kbdfans/odin/rgb/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/odin/soldered/keyboard.json b/keyboards/kbdfans/odin/soldered/keyboard.json index 4832e90096..60a5c0d3a3 100644 --- a/keyboards/kbdfans/odin/soldered/keyboard.json +++ b/keyboards/kbdfans/odin/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/odin/v2/keyboard.json b/keyboards/kbdfans/odin/v2/keyboard.json index 4ac47226bc..9136aae1e3 100644 --- a/keyboards/kbdfans/odin/v2/keyboard.json +++ b/keyboards/kbdfans/odin/v2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/odin75/keyboard.json b/keyboards/kbdfans/odin75/keyboard.json index b6fb124c93..0fd942f515 100644 --- a/keyboards/kbdfans/odin75/keyboard.json +++ b/keyboards/kbdfans/odin75/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/phaseone/keyboard.json b/keyboards/kbdfans/phaseone/keyboard.json index ff6b3fe6d1..35ce8ab42a 100644 --- a/keyboards/kbdfans/phaseone/keyboard.json +++ b/keyboards/kbdfans/phaseone/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/tiger80/keyboard.json b/keyboards/kbdfans/tiger80/keyboard.json index ccef4de81a..ce6a83dd8f 100644 --- a/keyboards/kbdfans/tiger80/keyboard.json +++ b/keyboards/kbdfans/tiger80/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbnordic/nordic60/rev_a/keyboard.json b/keyboards/kbnordic/nordic60/rev_a/keyboard.json index 0b1da369b3..711b0d5312 100644 --- a/keyboards/kbnordic/nordic60/rev_a/keyboard.json +++ b/keyboards/kbnordic/nordic60/rev_a/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kbnordic/nordic65/rev_a/keyboard.json b/keyboards/kbnordic/nordic65/rev_a/keyboard.json index 8cd90949ea..f636b0ca4e 100644 --- a/keyboards/kbnordic/nordic65/rev_a/keyboard.json +++ b/keyboards/kbnordic/nordic65/rev_a/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/kc60se/keyboard.json b/keyboards/kc60se/keyboard.json index c7c18b4a76..e265667f07 100644 --- a/keyboards/kc60se/keyboard.json +++ b/keyboards/kc60se/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/keebio/bfo9000/keyboard.json b/keyboards/keebio/bfo9000/keyboard.json index 2dcc6076a0..08d9997d43 100644 --- a/keyboards/keebio/bfo9000/keyboard.json +++ b/keyboards/keebio/bfo9000/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebio/dilly/keyboard.json b/keyboards/keebio/dilly/keyboard.json index 223228a8e0..cbd3be1b1c 100644 --- a/keyboards/keebio/dilly/keyboard.json +++ b/keyboards/keebio/dilly/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keebio/fourier/keyboard.json b/keyboards/keebio/fourier/keyboard.json index 057598a259..ae4985787d 100644 --- a/keyboards/keebio/fourier/keyboard.json +++ b/keyboards/keebio/fourier/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/keebio/iris/rev5/keyboard.json b/keyboards/keebio/iris/rev5/keyboard.json index 043ecdb95e..cfaeecfeb2 100644 --- a/keyboards/keebio/iris/rev5/keyboard.json +++ b/keyboards/keebio/iris/rev5/keyboard.json @@ -8,7 +8,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/laplace/keyboard.json b/keyboards/keebio/laplace/keyboard.json index 22cced0ee3..00609eaa12 100644 --- a/keyboards/keebio/laplace/keyboard.json +++ b/keyboards/keebio/laplace/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keebio/nyquist/rev1/keyboard.json b/keyboards/keebio/nyquist/rev1/keyboard.json index ef20252c53..f684332bdb 100644 --- a/keyboards/keebio/nyquist/rev1/keyboard.json +++ b/keyboards/keebio/nyquist/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebio/nyquist/rev2/keyboard.json b/keyboards/keebio/nyquist/rev2/keyboard.json index d327d74599..627f0cd003 100644 --- a/keyboards/keebio/nyquist/rev2/keyboard.json +++ b/keyboards/keebio/nyquist/rev2/keyboard.json @@ -8,7 +8,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keebio/nyquist/rev3/keyboard.json b/keyboards/keebio/nyquist/rev3/keyboard.json index f1aa1522f7..b67ad820b9 100644 --- a/keyboards/keebio/nyquist/rev3/keyboard.json +++ b/keyboards/keebio/nyquist/rev3/keyboard.json @@ -8,7 +8,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keebio/sinc/info.json b/keyboards/keebio/sinc/info.json index aa1e08f39d..794eac6a24 100644 --- a/keyboards/keebio/sinc/info.json +++ b/keyboards/keebio/sinc/info.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/keebio/stick/keyboard.json b/keyboards/keebio/stick/keyboard.json index 2e2b3539ab..dbd5062f74 100644 --- a/keyboards/keebio/stick/keyboard.json +++ b/keyboards/keebio/stick/keyboard.json @@ -88,7 +88,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebio/tragicforce68/keyboard.json b/keyboards/keebio/tragicforce68/keyboard.json index f2f27a7194..f82e1808fb 100644 --- a/keyboards/keebio/tragicforce68/keyboard.json +++ b/keyboards/keebio/tragicforce68/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebio/wtf60/keyboard.json b/keyboards/keebio/wtf60/keyboard.json index 2c14740eff..8947dac904 100644 --- a/keyboards/keebio/wtf60/keyboard.json +++ b/keyboards/keebio/wtf60/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/keebmonkey/kbmg68/keyboard.json b/keyboards/keebmonkey/kbmg68/keyboard.json index 110da77d37..4de7098b2d 100644 --- a/keyboards/keebmonkey/kbmg68/keyboard.json +++ b/keyboards/keebmonkey/kbmg68/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/keebsforall/freebird60/keyboard.json b/keyboards/keebsforall/freebird60/keyboard.json index 813275857d..d97752753a 100644 --- a/keyboards/keebsforall/freebird60/keyboard.json +++ b/keyboards/keebsforall/freebird60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebsforall/freebird75/keyboard.json b/keyboards/keebsforall/freebird75/keyboard.json index 2bd9579f60..5a4d3deee9 100644 --- a/keyboards/keebsforall/freebird75/keyboard.json +++ b/keyboards/keebsforall/freebird75/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keebsforall/freebirdnp/lite/keyboard.json b/keyboards/keebsforall/freebirdnp/lite/keyboard.json index af98661426..21b1aafe42 100644 --- a/keyboards/keebsforall/freebirdnp/lite/keyboard.json +++ b/keyboards/keebsforall/freebirdnp/lite/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebsforall/freebirdnp/pro/keyboard.json b/keyboards/keebsforall/freebirdnp/pro/keyboard.json index 8eae2f89f9..7afbcc4ca2 100644 --- a/keyboards/keebsforall/freebirdnp/pro/keyboard.json +++ b/keyboards/keebsforall/freebirdnp/pro/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebsforall/freebirdtkl/keyboard.json b/keyboards/keebsforall/freebirdtkl/keyboard.json index 37a6243beb..e58ce7ac0f 100644 --- a/keyboards/keebsforall/freebirdtkl/keyboard.json +++ b/keyboards/keebsforall/freebirdtkl/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebzdotnet/fme/keyboard.json b/keyboards/keebzdotnet/fme/keyboard.json index 5d6a908a81..e850843cb1 100644 --- a/keyboards/keebzdotnet/fme/keyboard.json +++ b/keyboards/keebzdotnet/fme/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keebzdotnet/wazowski/keyboard.json b/keyboards/keebzdotnet/wazowski/keyboard.json index 150fa3c790..5e64c99180 100644 --- a/keyboards/keebzdotnet/wazowski/keyboard.json +++ b/keyboards/keebzdotnet/wazowski/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kegen/gboy/keyboard.json b/keyboards/kegen/gboy/keyboard.json index 8c611d6664..eeba8f1d0c 100644 --- a/keyboards/kegen/gboy/keyboard.json +++ b/keyboards/kegen/gboy/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kelwin/utopia88/keyboard.json b/keyboards/kelwin/utopia88/keyboard.json index fb4640e2bb..86ff707be9 100644 --- a/keyboards/kelwin/utopia88/keyboard.json +++ b/keyboards/kelwin/utopia88/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/kepler_33/proto/keyboard.json b/keyboards/kepler_33/proto/keyboard.json index 1ac13e81f8..e4a0e85576 100644 --- a/keyboards/kepler_33/proto/keyboard.json +++ b/keyboards/kepler_33/proto/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keybage/radpad/keyboard.json b/keyboards/keybage/radpad/keyboard.json index 6fa5163bee..798a3c49c3 100644 --- a/keyboards/keybage/radpad/keyboard.json +++ b/keyboards/keybage/radpad/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keybee/keybee65/keyboard.json b/keyboards/keybee/keybee65/keyboard.json index 56c5d33175..8583523f81 100644 --- a/keyboards/keybee/keybee65/keyboard.json +++ b/keyboards/keybee/keybee65/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/keycapsss/o4l_5x12/keyboard.json b/keyboards/keycapsss/o4l_5x12/keyboard.json index d83bc58795..5a516adca0 100644 --- a/keyboards/keycapsss/o4l_5x12/keyboard.json +++ b/keyboards/keycapsss/o4l_5x12/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/keycapsss/plaid_pad/rev1/keyboard.json b/keyboards/keycapsss/plaid_pad/rev1/keyboard.json index e4a8a8d3c8..83fefde3e7 100644 --- a/keyboards/keycapsss/plaid_pad/rev1/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev1/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keycapsss/plaid_pad/rev2/keyboard.json b/keyboards/keycapsss/plaid_pad/rev2/keyboard.json index 8dc84d4ee8..9805679c53 100644 --- a/keyboards/keycapsss/plaid_pad/rev2/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev2/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keycapsss/plaid_pad/rev3/keyboard.json b/keyboards/keycapsss/plaid_pad/rev3/keyboard.json index 4e1d071287..e00cd3a43b 100644 --- a/keyboards/keycapsss/plaid_pad/rev3/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev3/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keychron/c1_pro/info.json b/keyboards/keychron/c1_pro/info.json index e40c2b9960..2c5f1af58f 100644 --- a/keyboards/keychron/c1_pro/info.json +++ b/keyboards/keychron/c1_pro/info.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c1_pro_v2/info.json b/keyboards/keychron/c1_pro_v2/info.json index bec58b2a8d..b25b5d6f88 100644 --- a/keyboards/keychron/c1_pro_v2/info.json +++ b/keyboards/keychron/c1_pro_v2/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c2_pro/info.json b/keyboards/keychron/c2_pro/info.json index 4b11fc213a..21ee1d6b2e 100644 --- a/keyboards/keychron/c2_pro/info.json +++ b/keyboards/keychron/c2_pro/info.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c2_pro_v2/info.json b/keyboards/keychron/c2_pro_v2/info.json index b210151800..c981d9ab4b 100644 --- a/keyboards/keychron/c2_pro_v2/info.json +++ b/keyboards/keychron/c2_pro_v2/info.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c3_pro/info.json b/keyboards/keychron/c3_pro/info.json index 2bcd155c1b..1e24b32ceb 100644 --- a/keyboards/keychron/c3_pro/info.json +++ b/keyboards/keychron/c3_pro/info.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keychron/q0/info.json b/keyboards/keychron/q0/info.json index a301746831..d5e0ba22e0 100644 --- a/keyboards/keychron/q0/info.json +++ b/keyboards/keychron/q0/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q11/info.json b/keyboards/keychron/q11/info.json index 73c4233876..75274318f3 100755 --- a/keyboards/keychron/q11/info.json +++ b/keyboards/keychron/q11/info.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q1v1/info.json b/keyboards/keychron/q1v1/info.json index 0107c60b9c..c8db178952 100644 --- a/keyboards/keychron/q1v1/info.json +++ b/keyboards/keychron/q1v1/info.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q1v2/info.json b/keyboards/keychron/q1v2/info.json index 7eb7038696..b7b612b613 100644 --- a/keyboards/keychron/q1v2/info.json +++ b/keyboards/keychron/q1v2/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q2/info.json b/keyboards/keychron/q2/info.json index d0bb48d7cb..87f405cb17 100644 --- a/keyboards/keychron/q2/info.json +++ b/keyboards/keychron/q2/info.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q3/info.json b/keyboards/keychron/q3/info.json index a07fc670d8..2b8b89dc87 100644 --- a/keyboards/keychron/q3/info.json +++ b/keyboards/keychron/q3/info.json @@ -15,7 +15,6 @@ "bootmagic": true, "dip_switch": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q4/info.json b/keyboards/keychron/q4/info.json index 4b9f246b4c..b09d4cb790 100644 --- a/keyboards/keychron/q4/info.json +++ b/keyboards/keychron/q4/info.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q5/info.json b/keyboards/keychron/q5/info.json index b35996d341..2140b8226d 100644 --- a/keyboards/keychron/q5/info.json +++ b/keyboards/keychron/q5/info.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q60/ansi/keyboard.json b/keyboards/keychron/q60/ansi/keyboard.json index 4d6f680890..a98781c9d0 100644 --- a/keyboards/keychron/q60/ansi/keyboard.json +++ b/keyboards/keychron/q60/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q7/info.json b/keyboards/keychron/q7/info.json index 6b8a94ce99..90dd59f3f4 100644 --- a/keyboards/keychron/q7/info.json +++ b/keyboards/keychron/q7/info.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q8/info.json b/keyboards/keychron/q8/info.json index da4c9c6f79..626942c108 100644 --- a/keyboards/keychron/q8/info.json +++ b/keyboards/keychron/q8/info.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q9/info.json b/keyboards/keychron/q9/info.json index 322fcfa1ad..e92a91cb31 100644 --- a/keyboards/keychron/q9/info.json +++ b/keyboards/keychron/q9/info.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q9_plus/info.json b/keyboards/keychron/q9_plus/info.json index 927f5094a6..7f73c690c8 100755 --- a/keyboards/keychron/q9_plus/info.json +++ b/keyboards/keychron/q9_plus/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "dip_switch": true, diff --git a/keyboards/keychron/s1/ansi/rgb/keyboard.json b/keyboards/keychron/s1/ansi/rgb/keyboard.json index 23ea66071e..e226473b43 100644 --- a/keyboards/keychron/s1/ansi/rgb/keyboard.json +++ b/keyboards/keychron/s1/ansi/rgb/keyboard.json @@ -38,7 +38,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/s1/ansi/white/keyboard.json b/keyboards/keychron/s1/ansi/white/keyboard.json index 40cc99a23f..8915afafdf 100644 --- a/keyboards/keychron/s1/ansi/white/keyboard.json +++ b/keyboards/keychron/s1/ansi/white/keyboard.json @@ -124,7 +124,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "led_matrix": true, diff --git a/keyboards/keychron/v2/ansi/keyboard.json b/keyboards/keychron/v2/ansi/keyboard.json index 015aae6e3e..b1377cd60b 100644 --- a/keyboards/keychron/v2/ansi/keyboard.json +++ b/keyboards/keychron/v2/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/ansi_encoder/keyboard.json b/keyboards/keychron/v2/ansi_encoder/keyboard.json index ca62bab148..e23268e60d 100644 --- a/keyboards/keychron/v2/ansi_encoder/keyboard.json +++ b/keyboards/keychron/v2/ansi_encoder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v2/iso/keyboard.json b/keyboards/keychron/v2/iso/keyboard.json index 827f613247..118840b2df 100644 --- a/keyboards/keychron/v2/iso/keyboard.json +++ b/keyboards/keychron/v2/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/iso_encoder/keyboard.json b/keyboards/keychron/v2/iso_encoder/keyboard.json index 10774d6974..0af482cd83 100644 --- a/keyboards/keychron/v2/iso_encoder/keyboard.json +++ b/keyboards/keychron/v2/iso_encoder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v2/jis/keyboard.json b/keyboards/keychron/v2/jis/keyboard.json index c775944009..c62a60075d 100644 --- a/keyboards/keychron/v2/jis/keyboard.json +++ b/keyboards/keychron/v2/jis/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/jis_encoder/keyboard.json b/keyboards/keychron/v2/jis_encoder/keyboard.json index c783b3553e..cf81648ed5 100644 --- a/keyboards/keychron/v2/jis_encoder/keyboard.json +++ b/keyboards/keychron/v2/jis_encoder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v3/ansi/keyboard.json b/keyboards/keychron/v3/ansi/keyboard.json index b8489a43b4..e339ef6fc6 100644 --- a/keyboards/keychron/v3/ansi/keyboard.json +++ b/keyboards/keychron/v3/ansi/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v3/jis/keyboard.json b/keyboards/keychron/v3/jis/keyboard.json index f00716b2db..b7179af273 100644 --- a/keyboards/keychron/v3/jis/keyboard.json +++ b/keyboards/keychron/v3/jis/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v4/ansi/keyboard.json b/keyboards/keychron/v4/ansi/keyboard.json index d66eb3f956..201517128c 100644 --- a/keyboards/keychron/v4/ansi/keyboard.json +++ b/keyboards/keychron/v4/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v4/iso/keyboard.json b/keyboards/keychron/v4/iso/keyboard.json index c7854307e4..8e906694d2 100644 --- a/keyboards/keychron/v4/iso/keyboard.json +++ b/keyboards/keychron/v4/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v7/ansi/keyboard.json b/keyboards/keychron/v7/ansi/keyboard.json index a60b46dc97..7ce47faa04 100644 --- a/keyboards/keychron/v7/ansi/keyboard.json +++ b/keyboards/keychron/v7/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v7/iso/keyboard.json b/keyboards/keychron/v7/iso/keyboard.json index 0022222635..ee9bd794b3 100644 --- a/keyboards/keychron/v7/iso/keyboard.json +++ b/keyboards/keychron/v7/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/ansi/keyboard.json b/keyboards/keychron/v8/ansi/keyboard.json index 7827270228..2abc2e8c1a 100644 --- a/keyboards/keychron/v8/ansi/keyboard.json +++ b/keyboards/keychron/v8/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/ansi_encoder/keyboard.json b/keyboards/keychron/v8/ansi_encoder/keyboard.json index a5d84021d0..7f88d39a83 100644 --- a/keyboards/keychron/v8/ansi_encoder/keyboard.json +++ b/keyboards/keychron/v8/ansi_encoder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v8/iso/keyboard.json b/keyboards/keychron/v8/iso/keyboard.json index 89310111f5..81d5c41fe3 100644 --- a/keyboards/keychron/v8/iso/keyboard.json +++ b/keyboards/keychron/v8/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/iso_encoder/keyboard.json b/keyboards/keychron/v8/iso_encoder/keyboard.json index 2e50de7421..a440192b1b 100644 --- a/keyboards/keychron/v8/iso_encoder/keyboard.json +++ b/keyboards/keychron/v8/iso_encoder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keyhive/absinthe/keyboard.json b/keyboards/keyhive/absinthe/keyboard.json index 82a5ae5631..e426f63a56 100644 --- a/keyboards/keyhive/absinthe/keyboard.json +++ b/keyboards/keyhive/absinthe/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keyhive/opus/keyboard.json b/keyboards/keyhive/opus/keyboard.json index e92c8604ce..76ec93d260 100644 --- a/keyboards/keyhive/opus/keyboard.json +++ b/keyboards/keyhive/opus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keyhive/smallice/keyboard.json b/keyboards/keyhive/smallice/keyboard.json index f7118ed3cf..41d2bba12b 100644 --- a/keyboards/keyhive/smallice/keyboard.json +++ b/keyboards/keyhive/smallice/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keyhive/southpole/keyboard.json b/keyboards/keyhive/southpole/keyboard.json index 38cb349ef9..5cbd091760 100644 --- a/keyboards/keyhive/southpole/keyboard.json +++ b/keyboards/keyhive/southpole/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyhive/ut472/keyboard.json b/keyboards/keyhive/ut472/keyboard.json index 4fc67962da..f419940813 100644 --- a/keyboards/keyhive/ut472/keyboard.json +++ b/keyboards/keyhive/ut472/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keyprez/bison/keyboard.json b/keyboards/keyprez/bison/keyboard.json index 1dfe883880..e4ff719dd6 100644 --- a/keyboards/keyprez/bison/keyboard.json +++ b/keyboards/keyprez/bison/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/corgi/keyboard.json b/keyboards/keyprez/corgi/keyboard.json index 4dc9af92a2..da046f8d7b 100644 --- a/keyboards/keyprez/corgi/keyboard.json +++ b/keyboards/keyprez/corgi/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/rhino/keyboard.json b/keyboards/keyprez/rhino/keyboard.json index c00219c119..0cdd027da5 100644 --- a/keyboards/keyprez/rhino/keyboard.json +++ b/keyboards/keyprez/rhino/keyboard.json @@ -11,7 +11,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/unicorn/keyboard.json b/keyboards/keyprez/unicorn/keyboard.json index 9b10351081..a07466f151 100644 --- a/keyboards/keyprez/unicorn/keyboard.json +++ b/keyboards/keyprez/unicorn/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyquest/enclave/keyboard.json b/keyboards/keyquest/enclave/keyboard.json index 9b2dbb6519..cc1a9f6a42 100644 --- a/keyboards/keyquest/enclave/keyboard.json +++ b/keyboards/keyquest/enclave/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keysofkings/twokey/keyboard.json b/keyboards/keysofkings/twokey/keyboard.json index 3163a30e6b..765183426b 100644 --- a/keyboards/keysofkings/twokey/keyboard.json +++ b/keyboards/keysofkings/twokey/keyboard.json @@ -32,7 +32,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keyspensory/kp60/keyboard.json b/keyboards/keyspensory/kp60/keyboard.json index 8672cf10e8..5caa3f178a 100644 --- a/keyboards/keyspensory/kp60/keyboard.json +++ b/keyboards/keyspensory/kp60/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keystonecaps/gameroyadvance/keyboard.json b/keyboards/keystonecaps/gameroyadvance/keyboard.json index 15cce9afd5..dc590082e5 100644 --- a/keyboards/keystonecaps/gameroyadvance/keyboard.json +++ b/keyboards/keystonecaps/gameroyadvance/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyten/aperture/keyboard.json b/keyboards/keyten/aperture/keyboard.json index 5ed3ecfb8e..306c73f6fd 100644 --- a/keyboards/keyten/aperture/keyboard.json +++ b/keyboards/keyten/aperture/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/diablo/keyboard.json b/keyboards/keyten/diablo/keyboard.json index 3882d4e160..c63a91295a 100644 --- a/keyboards/keyten/diablo/keyboard.json +++ b/keyboards/keyten/diablo/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/kt3700/keyboard.json b/keyboards/keyten/kt3700/keyboard.json index 83df8285d0..b7daf709c1 100644 --- a/keyboards/keyten/kt3700/keyboard.json +++ b/keyboards/keyten/kt3700/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/kt60_m/keyboard.json b/keyboards/keyten/kt60_m/keyboard.json index 5426bff85f..3894b5d915 100644 --- a/keyboards/keyten/kt60_m/keyboard.json +++ b/keyboards/keyten/kt60_m/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/lisa/keyboard.json b/keyboards/keyten/lisa/keyboard.json index deac0f3740..44e71db705 100644 --- a/keyboards/keyten/lisa/keyboard.json +++ b/keyboards/keyten/lisa/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/fukuro/keyboard.json b/keyboards/kibou/fukuro/keyboard.json index 97dcaaac4b..c8ad6cc808 100644 --- a/keyboards/kibou/fukuro/keyboard.json +++ b/keyboards/kibou/fukuro/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/harbour/keyboard.json b/keyboards/kibou/harbour/keyboard.json index a5417e1ae5..b6ee841d8b 100644 --- a/keyboards/kibou/harbour/keyboard.json +++ b/keyboards/kibou/harbour/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/suisei/keyboard.json b/keyboards/kibou/suisei/keyboard.json index f212df1bc7..7b74912e76 100644 --- a/keyboards/kibou/suisei/keyboard.json +++ b/keyboards/kibou/suisei/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/wendy/keyboard.json b/keyboards/kibou/wendy/keyboard.json index 1ab0ca8e7f..2f78f8f634 100644 --- a/keyboards/kibou/wendy/keyboard.json +++ b/keyboards/kibou/wendy/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/winter/keyboard.json b/keyboards/kibou/winter/keyboard.json index 47a359ec9b..5602ae39e6 100644 --- a/keyboards/kibou/winter/keyboard.json +++ b/keyboards/kibou/winter/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kikkou/keyboard.json b/keyboards/kikkou/keyboard.json index 7e018aa62b..21c83ef3ea 100644 --- a/keyboards/kikkou/keyboard.json +++ b/keyboards/kikkou/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kikoslab/ellora65/keyboard.json b/keyboards/kikoslab/ellora65/keyboard.json index fdb60e4791..5f0c4f8d25 100644 --- a/keyboards/kikoslab/ellora65/keyboard.json +++ b/keyboards/kikoslab/ellora65/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kikoslab/kl90/keyboard.json b/keyboards/kikoslab/kl90/keyboard.json index 0a107dfba8..ededcf280f 100644 --- a/keyboards/kikoslab/kl90/keyboard.json +++ b/keyboards/kikoslab/kl90/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kin80/info.json b/keyboards/kin80/info.json index 395742d88b..c531c329a4 100644 --- a/keyboards/kin80/info.json +++ b/keyboards/kin80/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kindakeyboards/conone65/keyboard.json b/keyboards/kindakeyboards/conone65/keyboard.json index 6786b6a3d5..9f5f7af4b7 100644 --- a/keyboards/kindakeyboards/conone65/keyboard.json +++ b/keyboards/kindakeyboards/conone65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kinesis/alvicstep/keyboard.json b/keyboards/kinesis/alvicstep/keyboard.json index 951f01203c..78ea71c0b4 100644 --- a/keyboards/kinesis/alvicstep/keyboard.json +++ b/keyboards/kinesis/alvicstep/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/kint2pp/keyboard.json b/keyboards/kinesis/kint2pp/keyboard.json index 48d77942db..590ad0fb42 100644 --- a/keyboards/kinesis/kint2pp/keyboard.json +++ b/keyboards/kinesis/kint2pp/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/kint36/keyboard.json b/keyboards/kinesis/kint36/keyboard.json index 592fade4cb..a2273a65ba 100644 --- a/keyboards/kinesis/kint36/keyboard.json +++ b/keyboards/kinesis/kint36/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/kint41/keyboard.json b/keyboards/kinesis/kint41/keyboard.json index c1eb7b8465..e08d75e211 100644 --- a/keyboards/kinesis/kint41/keyboard.json +++ b/keyboards/kinesis/kint41/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/kintlc/keyboard.json b/keyboards/kinesis/kintlc/keyboard.json index 07c81e1c89..9a40c912f2 100644 --- a/keyboards/kinesis/kintlc/keyboard.json +++ b/keyboards/kinesis/kintlc/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/kintwin/keyboard.json b/keyboards/kinesis/kintwin/keyboard.json index 92727e9ecb..528a2ca7a2 100644 --- a/keyboards/kinesis/kintwin/keyboard.json +++ b/keyboards/kinesis/kintwin/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/nguyenvietyen/keyboard.json b/keyboards/kinesis/nguyenvietyen/keyboard.json index 68bdd0f767..f1765183cc 100644 --- a/keyboards/kinesis/nguyenvietyen/keyboard.json +++ b/keyboards/kinesis/nguyenvietyen/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": true, "mousekey": true, "extrakey": true, diff --git a/keyboards/kinesis/stapelberg/keyboard.json b/keyboards/kinesis/stapelberg/keyboard.json index 6ad972d247..a17fdbf8fe 100644 --- a/keyboards/kinesis/stapelberg/keyboard.json +++ b/keyboards/kinesis/stapelberg/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "console": false, "command": false, "mousekey": true, "extrakey": true, diff --git a/keyboards/kineticlabs/emu/hotswap/keyboard.json b/keyboards/kineticlabs/emu/hotswap/keyboard.json index a199af4805..e685ffb5d9 100644 --- a/keyboards/kineticlabs/emu/hotswap/keyboard.json +++ b/keyboards/kineticlabs/emu/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kineticlabs/emu/soldered/keyboard.json b/keyboards/kineticlabs/emu/soldered/keyboard.json index 59de15184a..a48048ef2f 100644 --- a/keyboards/kineticlabs/emu/soldered/keyboard.json +++ b/keyboards/kineticlabs/emu/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kingly_keys/ave/ortho/keyboard.json b/keyboards/kingly_keys/ave/ortho/keyboard.json index d945664ba2..ffb4bf723c 100644 --- a/keyboards/kingly_keys/ave/ortho/keyboard.json +++ b/keyboards/kingly_keys/ave/ortho/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/ave/staggered/keyboard.json b/keyboards/kingly_keys/ave/staggered/keyboard.json index 6296e8c8d1..72719811d1 100644 --- a/keyboards/kingly_keys/ave/staggered/keyboard.json +++ b/keyboards/kingly_keys/ave/staggered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/little_foot/keyboard.json b/keyboards/kingly_keys/little_foot/keyboard.json index ddbe877b6d..cea54a0171 100644 --- a/keyboards/kingly_keys/little_foot/keyboard.json +++ b/keyboards/kingly_keys/little_foot/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kingly_keys/romac/keyboard.json b/keyboards/kingly_keys/romac/keyboard.json index 8088152db7..cd3c61bb20 100644 --- a/keyboards/kingly_keys/romac/keyboard.json +++ b/keyboards/kingly_keys/romac/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kingly_keys/romac_plus/keyboard.json b/keyboards/kingly_keys/romac_plus/keyboard.json index 920ed39fa2..847a0f8983 100644 --- a/keyboards/kingly_keys/romac_plus/keyboard.json +++ b/keyboards/kingly_keys/romac_plus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/ropro/keyboard.json b/keyboards/kingly_keys/ropro/keyboard.json index fb22d06a7d..9fcd31fce9 100644 --- a/keyboards/kingly_keys/ropro/keyboard.json +++ b/keyboards/kingly_keys/ropro/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/soap/keyboard.json b/keyboards/kingly_keys/soap/keyboard.json index 615014ffbf..a8c558bbba 100644 --- a/keyboards/kingly_keys/soap/keyboard.json +++ b/keyboards/kingly_keys/soap/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kira/kira80/keyboard.json b/keyboards/kira/kira80/keyboard.json index 858b500408..c66c919a42 100644 --- a/keyboards/kira/kira80/keyboard.json +++ b/keyboards/kira/kira80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kiserdesigns/madeline/keyboard.json b/keyboards/kiserdesigns/madeline/keyboard.json index 8a1a988a6f..a953f869ef 100644 --- a/keyboards/kiserdesigns/madeline/keyboard.json +++ b/keyboards/kiserdesigns/madeline/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kiwikeebs/macro/keyboard.json b/keyboards/kiwikeebs/macro/keyboard.json index faaebe88cf..9e8e9cbf7b 100644 --- a/keyboards/kiwikeebs/macro/keyboard.json +++ b/keyboards/kiwikeebs/macro/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kiwikeebs/macro_v2/keyboard.json b/keyboards/kiwikeebs/macro_v2/keyboard.json index 3848457990..51fd39a67a 100644 --- a/keyboards/kiwikeebs/macro_v2/keyboard.json +++ b/keyboards/kiwikeebs/macro_v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kiwikey/wanderland/keyboard.json b/keyboards/kiwikey/wanderland/keyboard.json index 3dd7c668ac..3675f8a86e 100644 --- a/keyboards/kiwikey/wanderland/keyboard.json +++ b/keyboards/kiwikey/wanderland/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kj_modify/rs40/keyboard.json b/keyboards/kj_modify/rs40/keyboard.json index a869383bd7..b2ebe8b08c 100644 --- a/keyboards/kj_modify/rs40/keyboard.json +++ b/keyboards/kj_modify/rs40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kk/65/keyboard.json b/keyboards/kk/65/keyboard.json index d7fd74ec9f..fe5296fd5b 100644 --- a/keyboards/kk/65/keyboard.json +++ b/keyboards/kk/65/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kkatano/bakeneko60/keyboard.json b/keyboards/kkatano/bakeneko60/keyboard.json index 094cc71728..6eff62e1dc 100644 --- a/keyboards/kkatano/bakeneko60/keyboard.json +++ b/keyboards/kkatano/bakeneko60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kkatano/bakeneko65/rev2/keyboard.json b/keyboards/kkatano/bakeneko65/rev2/keyboard.json index 93ac8a5e50..173863f565 100644 --- a/keyboards/kkatano/bakeneko65/rev2/keyboard.json +++ b/keyboards/kkatano/bakeneko65/rev2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kkatano/bakeneko65/rev3/keyboard.json b/keyboards/kkatano/bakeneko65/rev3/keyboard.json index 3892da5d04..f1d99dac55 100644 --- a/keyboards/kkatano/bakeneko65/rev3/keyboard.json +++ b/keyboards/kkatano/bakeneko65/rev3/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kopibeng/mnk60/keyboard.json b/keyboards/kopibeng/mnk60/keyboard.json index 0477ac560d..3daec9131d 100644 --- a/keyboards/kopibeng/mnk60/keyboard.json +++ b/keyboards/kopibeng/mnk60/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/mnk60_stm32/keyboard.json b/keyboards/kopibeng/mnk60_stm32/keyboard.json index 8b2278aff0..75d7361aec 100644 --- a/keyboards/kopibeng/mnk60_stm32/keyboard.json +++ b/keyboards/kopibeng/mnk60_stm32/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/mnk65_stm32/keyboard.json b/keyboards/kopibeng/mnk65_stm32/keyboard.json index c71394ba84..e425863d70 100644 --- a/keyboards/kopibeng/mnk65_stm32/keyboard.json +++ b/keyboards/kopibeng/mnk65_stm32/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/tgr_lena/keyboard.json b/keyboards/kopibeng/tgr_lena/keyboard.json index 2460b04a5a..af9568fb8e 100644 --- a/keyboards/kopibeng/tgr_lena/keyboard.json +++ b/keyboards/kopibeng/tgr_lena/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/typ65/keyboard.json b/keyboards/kopibeng/typ65/keyboard.json index 57a23da4ad..aedb7cb7d9 100644 --- a/keyboards/kopibeng/typ65/keyboard.json +++ b/keyboards/kopibeng/typ65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kopibeng/xt60/keyboard.json b/keyboards/kopibeng/xt60/keyboard.json index 7b0b74db0e..8fbd8793a3 100644 --- a/keyboards/kopibeng/xt60/keyboard.json +++ b/keyboards/kopibeng/xt60/keyboard.json @@ -25,7 +25,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/xt60_singa/keyboard.json b/keyboards/kopibeng/xt60_singa/keyboard.json index 7f717adf35..a6a27191d4 100644 --- a/keyboards/kopibeng/xt60_singa/keyboard.json +++ b/keyboards/kopibeng/xt60_singa/keyboard.json @@ -25,7 +25,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/xt65/keyboard.json b/keyboards/kopibeng/xt65/keyboard.json index 60fff35ca1..47d1fdeeed 100644 --- a/keyboards/kopibeng/xt65/keyboard.json +++ b/keyboards/kopibeng/xt65/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm16a/v1/keyboard.json b/keyboards/kprepublic/bm16a/v1/keyboard.json index fba123ccb7..5c37f26354 100644 --- a/keyboards/kprepublic/bm16a/v1/keyboard.json +++ b/keyboards/kprepublic/bm16a/v1/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "backlight": true, diff --git a/keyboards/kprepublic/bm16a/v2/keyboard.json b/keyboards/kprepublic/bm16a/v2/keyboard.json index ac65e4affb..92973e875e 100644 --- a/keyboards/kprepublic/bm16a/v2/keyboard.json +++ b/keyboards/kprepublic/bm16a/v2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm16s/keyboard.json b/keyboards/kprepublic/bm16s/keyboard.json index d7b31b5651..0c339b7d0b 100644 --- a/keyboards/kprepublic/bm16s/keyboard.json +++ b/keyboards/kprepublic/bm16s/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json index 430d525a71..f2c80e1781 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json index 21689cb958..eff8d8eb66 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json @@ -9,7 +9,6 @@ "rgblight": true, "rgb_matrix": true, "tri_layer": true, - "console": false, "command": false, "nkro": false }, diff --git a/keyboards/kprepublic/bm43hsrgb/keyboard.json b/keyboards/kprepublic/bm43hsrgb/keyboard.json index 9dff2d8ddc..b69ba814c3 100755 --- a/keyboards/kprepublic/bm43hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm43hsrgb/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json index 3640dad2a8..82c23ed3ef 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json @@ -68,7 +68,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json index e93a616c95..42d04a4781 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json @@ -59,7 +59,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json index 1f0dffa260..ac83b152af 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json index 8cdb855aa2..b1daf2e718 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json index d1f5c9fb53..9e5e1ea3e7 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json @@ -80,7 +80,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json index c5fa1d9026..060fa19e7e 100644 --- a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json index 43d213a1a7..e596453e7e 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json @@ -86,7 +86,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json index 9b6975bddc..047f74d32a 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json index e294562e0d..e549820452 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json @@ -72,7 +72,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm80hsrgb/keyboard.json b/keyboards/kprepublic/bm80hsrgb/keyboard.json index 8c51e2ea98..3bfb9e2d29 100644 --- a/keyboards/kprepublic/bm80hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm80hsrgb/keyboard.json @@ -63,7 +63,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm80v2/keyboard.json b/keyboards/kprepublic/bm80v2/keyboard.json index e8f061115f..6982c69f12 100644 --- a/keyboards/kprepublic/bm80v2/keyboard.json +++ b/keyboards/kprepublic/bm80v2/keyboard.json @@ -54,7 +54,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm80v2_iso/keyboard.json b/keyboards/kprepublic/bm80v2_iso/keyboard.json index 9143f9df07..c7210e05ad 100644 --- a/keyboards/kprepublic/bm80v2_iso/keyboard.json +++ b/keyboards/kprepublic/bm80v2_iso/keyboard.json @@ -54,7 +54,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm980hsrgb/keyboard.json b/keyboards/kprepublic/bm980hsrgb/keyboard.json index addd87de4f..9d9578b948 100644 --- a/keyboards/kprepublic/bm980hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm980hsrgb/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/cospad/keyboard.json b/keyboards/kprepublic/cospad/keyboard.json index 8d65d30271..b7b3682be5 100644 --- a/keyboards/kprepublic/cospad/keyboard.json +++ b/keyboards/kprepublic/cospad/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/cstc40/info.json b/keyboards/kprepublic/cstc40/info.json index bd79ef2afe..79b9a0ae63 100644 --- a/keyboards/kprepublic/cstc40/info.json +++ b/keyboards/kprepublic/cstc40/info.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/jj4x4/keyboard.json b/keyboards/kprepublic/jj4x4/keyboard.json index d7d785b054..ac28cba94e 100644 --- a/keyboards/kprepublic/jj4x4/keyboard.json +++ b/keyboards/kprepublic/jj4x4/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kradoindustries/kousa/keyboard.json b/keyboards/kradoindustries/kousa/keyboard.json index 196e863bf5..f387d69eef 100644 --- a/keyboards/kradoindustries/kousa/keyboard.json +++ b/keyboards/kradoindustries/kousa/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true, diff --git a/keyboards/kradoindustries/krado66/keyboard.json b/keyboards/kradoindustries/krado66/keyboard.json index aefadf12de..188ac66c60 100644 --- a/keyboards/kradoindustries/krado66/keyboard.json +++ b/keyboards/kradoindustries/krado66/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true, diff --git a/keyboards/kradoindustries/promenade/keyboard.json b/keyboards/kradoindustries/promenade/keyboard.json index 1de6ef7315..fb0d380993 100644 --- a/keyboards/kradoindustries/promenade/keyboard.json +++ b/keyboards/kradoindustries/promenade/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true diff --git a/keyboards/kradoindustries/promenade_rp24s/keyboard.json b/keyboards/kradoindustries/promenade_rp24s/keyboard.json index c0d4a7f535..bb68b6ece5 100644 --- a/keyboards/kradoindustries/promenade_rp24s/keyboard.json +++ b/keyboards/kradoindustries/promenade_rp24s/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true, diff --git a/keyboards/kraken_jones/pteron56/keyboard.json b/keyboards/kraken_jones/pteron56/keyboard.json index 0af1f6b735..79357e3609 100644 --- a/keyboards/kraken_jones/pteron56/keyboard.json +++ b/keyboards/kraken_jones/pteron56/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/ktec/daisy/keyboard.json b/keyboards/ktec/daisy/keyboard.json index 8ca734534e..44c3a789a6 100644 --- a/keyboards/ktec/daisy/keyboard.json +++ b/keyboards/ktec/daisy/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/ktec/staryu/keyboard.json b/keyboards/ktec/staryu/keyboard.json index 9272642c3e..42adb61df5 100644 --- a/keyboards/ktec/staryu/keyboard.json +++ b/keyboards/ktec/staryu/keyboard.json @@ -40,7 +40,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kumaokobo/kudox_game/rev1/keyboard.json b/keyboards/kumaokobo/kudox_game/rev1/keyboard.json index 975fbcd546..bd3d8053ff 100644 --- a/keyboards/kumaokobo/kudox_game/rev1/keyboard.json +++ b/keyboards/kumaokobo/kudox_game/rev1/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kumaokobo/kudox_game/rev2/keyboard.json b/keyboards/kumaokobo/kudox_game/rev2/keyboard.json index ac13e1b216..84f272d712 100644 --- a/keyboards/kumaokobo/kudox_game/rev2/keyboard.json +++ b/keyboards/kumaokobo/kudox_game/rev2/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kuro/kuro65/keyboard.json b/keyboards/kuro/kuro65/keyboard.json index 8ca2310692..09c80d4882 100644 --- a/keyboards/kuro/kuro65/keyboard.json +++ b/keyboards/kuro/kuro65/keyboard.json @@ -21,7 +21,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/kwstudio/pisces/keyboard.json b/keyboards/kwstudio/pisces/keyboard.json index e69993b963..1dc3b780c3 100644 --- a/keyboards/kwstudio/pisces/keyboard.json +++ b/keyboards/kwstudio/pisces/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kwub/bloop/keyboard.json b/keyboards/kwub/bloop/keyboard.json index 2889ef1598..b20fb706fe 100644 --- a/keyboards/kwub/bloop/keyboard.json +++ b/keyboards/kwub/bloop/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/labbe/labbeminiv1/keyboard.json b/keyboards/labbe/labbeminiv1/keyboard.json index d976ea5d36..38865f8215 100644 --- a/keyboards/labbe/labbeminiv1/keyboard.json +++ b/keyboards/labbe/labbeminiv1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/labyrinth75/keyboard.json b/keyboards/labyrinth75/keyboard.json index 99f79b9a2b..700d3821cb 100644 --- a/keyboards/labyrinth75/keyboard.json +++ b/keyboards/labyrinth75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/laneware/lpad/keyboard.json b/keyboards/laneware/lpad/keyboard.json index a42ba2c13f..b26552ac55 100644 --- a/keyboards/laneware/lpad/keyboard.json +++ b/keyboards/laneware/lpad/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/lw67/keyboard.json b/keyboards/laneware/lw67/keyboard.json index d1b85ea50d..280373679b 100644 --- a/keyboards/laneware/lw67/keyboard.json +++ b/keyboards/laneware/lw67/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/lw75/keyboard.json b/keyboards/laneware/lw75/keyboard.json index 6aee9461a8..e2c475cb77 100644 --- a/keyboards/laneware/lw75/keyboard.json +++ b/keyboards/laneware/lw75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/macro1/keyboard.json b/keyboards/laneware/macro1/keyboard.json index 12fce7b920..45b6c41a90 100644 --- a/keyboards/laneware/macro1/keyboard.json +++ b/keyboards/laneware/macro1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/raindrop/keyboard.json b/keyboards/laneware/raindrop/keyboard.json index 4e5d674b2b..fd15c21965 100644 --- a/keyboards/laneware/raindrop/keyboard.json +++ b/keyboards/laneware/raindrop/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/large_lad/keyboard.json b/keyboards/large_lad/keyboard.json index 665a279799..e8f750fcd1 100644 --- a/keyboards/large_lad/keyboard.json +++ b/keyboards/large_lad/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/laser_ninja/pumpkinpad/keyboard.json b/keyboards/laser_ninja/pumpkinpad/keyboard.json index 96b4049121..e254cb76b5 100644 --- a/keyboards/laser_ninja/pumpkinpad/keyboard.json +++ b/keyboards/laser_ninja/pumpkinpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/latincompass/latin17rgb/keyboard.json b/keyboards/latincompass/latin17rgb/keyboard.json index 934653b6fe..20d7086d4c 100644 --- a/keyboards/latincompass/latin17rgb/keyboard.json +++ b/keyboards/latincompass/latin17rgb/keyboard.json @@ -66,7 +66,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/latincompass/latin60rgb/keyboard.json b/keyboards/latincompass/latin60rgb/keyboard.json index 4252387c12..30e64a4f14 100644 --- a/keyboards/latincompass/latin60rgb/keyboard.json +++ b/keyboards/latincompass/latin60rgb/keyboard.json @@ -110,7 +110,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/latincompass/latinpad/keyboard.json b/keyboards/latincompass/latinpad/keyboard.json index 1e2c8ca90c..a1dd38e097 100644 --- a/keyboards/latincompass/latinpad/keyboard.json +++ b/keyboards/latincompass/latinpad/keyboard.json @@ -45,7 +45,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/latincompass/latinpadble/keyboard.json b/keyboards/latincompass/latinpadble/keyboard.json index fe35f74e79..cfdf271402 100644 --- a/keyboards/latincompass/latinpadble/keyboard.json +++ b/keyboards/latincompass/latinpadble/keyboard.json @@ -12,7 +12,6 @@ "bluetooth": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/lazydesigners/bolt/keyboard.json b/keyboards/lazydesigners/bolt/keyboard.json index c155c852df..e6d4482283 100644 --- a/keyboards/lazydesigners/bolt/keyboard.json +++ b/keyboards/lazydesigners/bolt/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/cassette8/keyboard.json b/keyboards/lazydesigners/cassette8/keyboard.json index 623b804efe..8cb1428122 100755 --- a/keyboards/lazydesigners/cassette8/keyboard.json +++ b/keyboards/lazydesigners/cassette8/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lazydesigners/dimpleplus/keyboard.json b/keyboards/lazydesigners/dimpleplus/keyboard.json index afae905c7b..7fb7260894 100644 --- a/keyboards/lazydesigners/dimpleplus/keyboard.json +++ b/keyboards/lazydesigners/dimpleplus/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/the30/keyboard.json b/keyboards/lazydesigners/the30/keyboard.json index 64562ada66..bf24fa0e08 100644 --- a/keyboards/lazydesigners/the30/keyboard.json +++ b/keyboards/lazydesigners/the30/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the40/keyboard.json b/keyboards/lazydesigners/the40/keyboard.json index 0e06e16ea8..103d2fa78e 100644 --- a/keyboards/lazydesigners/the40/keyboard.json +++ b/keyboards/lazydesigners/the40/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/the50/keyboard.json b/keyboards/lazydesigners/the50/keyboard.json index 1039625f06..55caf81d3a 100644 --- a/keyboards/lazydesigners/the50/keyboard.json +++ b/keyboards/lazydesigners/the50/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the60/rev1/keyboard.json b/keyboards/lazydesigners/the60/rev1/keyboard.json index 815cf8e04d..7dd1cde022 100755 --- a/keyboards/lazydesigners/the60/rev1/keyboard.json +++ b/keyboards/lazydesigners/the60/rev1/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the60/rev2/keyboard.json b/keyboards/lazydesigners/the60/rev2/keyboard.json index f9a0fd95b5..2d6eb276d8 100755 --- a/keyboards/lazydesigners/the60/rev2/keyboard.json +++ b/keyboards/lazydesigners/the60/rev2/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/leafcutterlabs/bigknob/keyboard.json b/keyboards/leafcutterlabs/bigknob/keyboard.json index 7d1fc6fb72..ca3b7a0e2a 100644 --- a/keyboards/leafcutterlabs/bigknob/keyboard.json +++ b/keyboards/leafcutterlabs/bigknob/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/leeku/finger65/keyboard.json b/keyboards/leeku/finger65/keyboard.json index cdb67f0e36..8cfb94c20b 100644 --- a/keyboards/leeku/finger65/keyboard.json +++ b/keyboards/leeku/finger65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/lendunistus/rpneko65/rev1/keyboard.json b/keyboards/lendunistus/rpneko65/rev1/keyboard.json index 29682cf2a7..b28ca4b5fa 100644 --- a/keyboards/lendunistus/rpneko65/rev1/keyboard.json +++ b/keyboards/lendunistus/rpneko65/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lfkeyboards/lfk87/info.json b/keyboards/lfkeyboards/lfk87/info.json index d38a397da3..a9c3d56f7b 100644 --- a/keyboards/lfkeyboards/lfk87/info.json +++ b/keyboards/lfkeyboards/lfk87/info.json @@ -6,7 +6,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/lfkeyboards/lfkpad/keyboard.json b/keyboards/lfkeyboards/lfkpad/keyboard.json index f422507a5b..c78d6e2635 100644 --- a/keyboards/lfkeyboards/lfkpad/keyboard.json +++ b/keyboards/lfkeyboards/lfkpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/lgbtkl/keyboard.json b/keyboards/lgbtkl/keyboard.json index a3f126e862..11e02f7cf0 100644 --- a/keyboards/lgbtkl/keyboard.json +++ b/keyboards/lgbtkl/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/linworks/dolice/keyboard.json b/keyboards/linworks/dolice/keyboard.json index 6a556db654..5f47c8af0a 100644 --- a/keyboards/linworks/dolice/keyboard.json +++ b/keyboards/linworks/dolice/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/em8/keyboard.json b/keyboards/linworks/em8/keyboard.json index cf17b94a4d..de096b7b62 100644 --- a/keyboards/linworks/em8/keyboard.json +++ b/keyboards/linworks/em8/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/fave104/keyboard.json b/keyboards/linworks/fave104/keyboard.json index 01c49af4c9..34279ec0ba 100644 --- a/keyboards/linworks/fave104/keyboard.json +++ b/keyboards/linworks/fave104/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/fave60/keyboard.json b/keyboards/linworks/fave60/keyboard.json index eb72e9c3e2..ef50543ab7 100644 --- a/keyboards/linworks/fave60/keyboard.json +++ b/keyboards/linworks/fave60/keyboard.json @@ -27,7 +27,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/linworks/fave84h/keyboard.json b/keyboards/linworks/fave84h/keyboard.json index 6b66dd946c..ee2473c77b 100644 --- a/keyboards/linworks/fave84h/keyboard.json +++ b/keyboards/linworks/fave84h/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/linworks/fave87/keyboard.json b/keyboards/linworks/fave87/keyboard.json index 9083b8c8ec..ec039718a7 100644 --- a/keyboards/linworks/fave87/keyboard.json +++ b/keyboards/linworks/fave87/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/linworks/whale75/keyboard.json b/keyboards/linworks/whale75/keyboard.json index 88598d8e8c..e0dc3e1712 100644 --- a/keyboards/linworks/whale75/keyboard.json +++ b/keyboards/linworks/whale75/keyboard.json @@ -25,7 +25,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/littlealby/mute/keyboard.json b/keyboards/littlealby/mute/keyboard.json index 3bd6ab3747..7686ec174c 100644 --- a/keyboards/littlealby/mute/keyboard.json +++ b/keyboards/littlealby/mute/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/lizard_trick/tenkey_plusplus/keyboard.json b/keyboards/lizard_trick/tenkey_plusplus/keyboard.json index 0877d99885..e501cbfdc0 100644 --- a/keyboards/lizard_trick/tenkey_plusplus/keyboard.json +++ b/keyboards/lizard_trick/tenkey_plusplus/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ll3macorn/bongopad/keyboard.json b/keyboards/ll3macorn/bongopad/keyboard.json index 7a6f0ff043..188cc2527f 100644 --- a/keyboards/ll3macorn/bongopad/keyboard.json +++ b/keyboards/ll3macorn/bongopad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/lm_keyboard/lm60n/keyboard.json b/keyboards/lm_keyboard/lm60n/keyboard.json index 317c61aee2..0301e35ae0 100644 --- a/keyboards/lm_keyboard/lm60n/keyboard.json +++ b/keyboards/lm_keyboard/lm60n/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/longnald/corin/keyboard.json b/keyboards/longnald/corin/keyboard.json index a423348b78..1c32741762 100644 --- a/keyboards/longnald/corin/keyboard.json +++ b/keyboards/longnald/corin/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json index b711d9c4a8..8d6723c9f6 100644 --- a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json +++ b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lxxt/keyboard.json b/keyboards/lxxt/keyboard.json index 57c8350b2a..725b6ee2c2 100644 --- a/keyboards/lxxt/keyboard.json +++ b/keyboards/lxxt/keyboard.json @@ -46,7 +46,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/lyso1/lefishe/keyboard.json b/keyboards/lyso1/lefishe/keyboard.json index 677fb11e18..4d0cc7842f 100644 --- a/keyboards/lyso1/lefishe/keyboard.json +++ b/keyboards/lyso1/lefishe/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/m10a/keyboard.json b/keyboards/m10a/keyboard.json index e0ba10e096..d1799bae55 100644 --- a/keyboards/m10a/keyboard.json +++ b/keyboards/m10a/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/machine_industries/m4_a/keyboard.json b/keyboards/machine_industries/m4_a/keyboard.json index 04510f92e1..e96e2a6b1a 100644 --- a/keyboards/machine_industries/m4_a/keyboard.json +++ b/keyboards/machine_industries/m4_a/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/machkeyboards/mach3/keyboard.json b/keyboards/machkeyboards/mach3/keyboard.json index 9f9d492bcc..0679ad7f3c 100644 --- a/keyboards/machkeyboards/mach3/keyboard.json +++ b/keyboards/machkeyboards/mach3/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/macrocat/keyboard.json b/keyboards/macrocat/keyboard.json index 470ce8973a..ed0a2d17a5 100644 --- a/keyboards/macrocat/keyboard.json +++ b/keyboards/macrocat/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/madjax_macropad/keyboard.json b/keyboards/madjax_macropad/keyboard.json index ac2802faef..031e396866 100644 --- a/keyboards/madjax_macropad/keyboard.json +++ b/keyboards/madjax_macropad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/makeymakey/keyboard.json b/keyboards/makeymakey/keyboard.json index 8f04535032..81b23f0125 100644 --- a/keyboards/makeymakey/keyboard.json +++ b/keyboards/makeymakey/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": true, "nkro": true diff --git a/keyboards/makrosu/keyboard.json b/keyboards/makrosu/keyboard.json index a9790e22d2..54dcea4cb9 100644 --- a/keyboards/makrosu/keyboard.json +++ b/keyboards/makrosu/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/malevolti/superlyra/rev1/keyboard.json b/keyboards/malevolti/superlyra/rev1/keyboard.json index 4db7558302..56a0edc90e 100644 --- a/keyboards/malevolti/superlyra/rev1/keyboard.json +++ b/keyboards/malevolti/superlyra/rev1/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/manta60/keyboard.json b/keyboards/manta60/keyboard.json index d2f308e89c..007f015379 100644 --- a/keyboards/manta60/keyboard.json +++ b/keyboards/manta60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": false, "mousekey": true, "nkro": false, diff --git a/keyboards/manyboard/macro/keyboard.json b/keyboards/manyboard/macro/keyboard.json index b40861414f..187e1976fe 100644 --- a/keyboards/manyboard/macro/keyboard.json +++ b/keyboards/manyboard/macro/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/maple_computing/6ball/keyboard.json b/keyboards/maple_computing/6ball/keyboard.json index 0db90d176e..61ec5f1131 100644 --- a/keyboards/maple_computing/6ball/keyboard.json +++ b/keyboards/maple_computing/6ball/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/maple_computing/the_ruler/keyboard.json b/keyboards/maple_computing/the_ruler/keyboard.json index a6c9304d60..3cca7e577a 100644 --- a/keyboards/maple_computing/the_ruler/keyboard.json +++ b/keyboards/maple_computing/the_ruler/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mariorion_v25/prod/keyboard.json b/keyboards/mariorion_v25/prod/keyboard.json index 6c2ba94ec1..b950162618 100644 --- a/keyboards/mariorion_v25/prod/keyboard.json +++ b/keyboards/mariorion_v25/prod/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mariorion_v25/proto/keyboard.json b/keyboards/mariorion_v25/proto/keyboard.json index 5e46f64754..2e42fedccf 100644 --- a/keyboards/mariorion_v25/proto/keyboard.json +++ b/keyboards/mariorion_v25/proto/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/marksard/leftover30/keyboard.json b/keyboards/marksard/leftover30/keyboard.json index ae2250a5f2..aac594097a 100644 --- a/keyboards/marksard/leftover30/keyboard.json +++ b/keyboards/marksard/leftover30/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/marksard/treadstone32/info.json b/keyboards/marksard/treadstone32/info.json index d93277472c..35f72490f0 100644 --- a/keyboards/marksard/treadstone32/info.json +++ b/keyboards/marksard/treadstone32/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": true, "nkro": false diff --git a/keyboards/matchstickworks/normiepad/keyboard.json b/keyboards/matchstickworks/normiepad/keyboard.json index 3063b820aa..de2362f99e 100644 --- a/keyboards/matchstickworks/normiepad/keyboard.json +++ b/keyboards/matchstickworks/normiepad/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matchstickworks/southpad/rev1/keyboard.json b/keyboards/matchstickworks/southpad/rev1/keyboard.json index 15db9823b1..c893882b4f 100644 --- a/keyboards/matchstickworks/southpad/rev1/keyboard.json +++ b/keyboards/matchstickworks/southpad/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/matchstickworks/southpad/rev2/keyboard.json b/keyboards/matchstickworks/southpad/rev2/keyboard.json index 717b56ef63..1364885d55 100644 --- a/keyboards/matchstickworks/southpad/rev2/keyboard.json +++ b/keyboards/matchstickworks/southpad/rev2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matrix/cain_re/keyboard.json b/keyboards/matrix/cain_re/keyboard.json index e806e9a427..82f8c98525 100644 --- a/keyboards/matrix/cain_re/keyboard.json +++ b/keyboards/matrix/cain_re/keyboard.json @@ -37,7 +37,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/matrix/falcon/keyboard.json b/keyboards/matrix/falcon/keyboard.json index bf5fc640ce..2dc0e17e26 100644 --- a/keyboards/matrix/falcon/keyboard.json +++ b/keyboards/matrix/falcon/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/matrix/m12og/rev2/keyboard.json b/keyboards/matrix/m12og/rev2/keyboard.json index 5a04161d1b..f7fdb5ce63 100644 --- a/keyboards/matrix/m12og/rev2/keyboard.json +++ b/keyboards/matrix/m12og/rev2/keyboard.json @@ -37,7 +37,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/matrix/me/keyboard.json b/keyboards/matrix/me/keyboard.json index 6abfe38435..6d4cebb82b 100644 --- a/keyboards/matrix/me/keyboard.json +++ b/keyboards/matrix/me/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/matthewdias/m3n3van/keyboard.json b/keyboards/matthewdias/m3n3van/keyboard.json index 3fdfb7f61d..d46949cff5 100644 --- a/keyboards/matthewdias/m3n3van/keyboard.json +++ b/keyboards/matthewdias/m3n3van/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/matthewdias/minim/keyboard.json b/keyboards/matthewdias/minim/keyboard.json index b9ff70ca40..47d85abdb6 100644 --- a/keyboards/matthewdias/minim/keyboard.json +++ b/keyboards/matthewdias/minim/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matthewdias/model_v/keyboard.json b/keyboards/matthewdias/model_v/keyboard.json index 00d4c4c0eb..24c88c8caa 100644 --- a/keyboards/matthewdias/model_v/keyboard.json +++ b/keyboards/matthewdias/model_v/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matthewdias/txuu/keyboard.json b/keyboards/matthewdias/txuu/keyboard.json index b4c1597e5f..4bc078f7e5 100644 --- a/keyboards/matthewdias/txuu/keyboard.json +++ b/keyboards/matthewdias/txuu/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/maxipad/info.json b/keyboards/maxipad/info.json index 73b563edc1..29d8e3598a 100644 --- a/keyboards/maxipad/info.json +++ b/keyboards/maxipad/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mazestudio/jocker/keyboard.json b/keyboards/mazestudio/jocker/keyboard.json index 51c09eea32..3b49629aa3 100644 --- a/keyboards/mazestudio/jocker/keyboard.json +++ b/keyboards/mazestudio/jocker/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mb44/keyboard.json b/keyboards/mb44/keyboard.json index f6ab714a5c..d8c1216233 100644 --- a/keyboards/mb44/keyboard.json +++ b/keyboards/mb44/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mc_76k/keyboard.json b/keyboards/mc_76k/keyboard.json index 18aef48d01..7be3c8f1ec 100644 --- a/keyboards/mc_76k/keyboard.json +++ b/keyboards/mc_76k/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mechanickeys/miniashen40/keyboard.json b/keyboards/mechanickeys/miniashen40/keyboard.json index 8e5821cc29..6ce6d4a2dc 100644 --- a/keyboards/mechanickeys/miniashen40/keyboard.json +++ b/keyboards/mechanickeys/miniashen40/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mechanickeys/undead60m/keyboard.json b/keyboards/mechanickeys/undead60m/keyboard.json index 9f88f13346..f54284387c 100644 --- a/keyboards/mechanickeys/undead60m/keyboard.json +++ b/keyboards/mechanickeys/undead60m/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechbrewery/mb65h/keyboard.json b/keyboards/mechbrewery/mb65h/keyboard.json index 99d49d698d..897dfc2b12 100644 --- a/keyboards/mechbrewery/mb65h/keyboard.json +++ b/keyboards/mechbrewery/mb65h/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mechbrewery/mb65s/keyboard.json b/keyboards/mechbrewery/mb65s/keyboard.json index eeafcaba1a..aac50f2219 100644 --- a/keyboards/mechbrewery/mb65s/keyboard.json +++ b/keyboards/mechbrewery/mb65s/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mechkeys/acr60/keyboard.json b/keyboards/mechkeys/acr60/keyboard.json index 0be2ec47c1..5a34ca17c7 100644 --- a/keyboards/mechkeys/acr60/keyboard.json +++ b/keyboards/mechkeys/acr60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechkeys/alu84/keyboard.json b/keyboards/mechkeys/alu84/keyboard.json index 1d7d8cbee2..21a227e71b 100644 --- a/keyboards/mechkeys/alu84/keyboard.json +++ b/keyboards/mechkeys/alu84/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mechkeys/espectro/keyboard.json b/keyboards/mechkeys/espectro/keyboard.json index d9a7dda165..d9c292d5e5 100644 --- a/keyboards/mechkeys/espectro/keyboard.json +++ b/keyboards/mechkeys/espectro/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mechkeys/mk60/keyboard.json b/keyboards/mechkeys/mk60/keyboard.json index bb9a69daf5..2ef534f2f4 100644 --- a/keyboards/mechkeys/mk60/keyboard.json +++ b/keyboards/mechkeys/mk60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechllama/g35/info.json b/keyboards/mechllama/g35/info.json index 2fa3871405..b223cd6441 100644 --- a/keyboards/mechllama/g35/info.json +++ b/keyboards/mechllama/g35/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json b/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json index 628eb404a5..2ae6877f08 100644 --- a/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json +++ b/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json @@ -7,7 +7,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json b/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json index 3758a8f085..e2b3346763 100644 --- a/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json +++ b/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json @@ -7,7 +7,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "backlight": true, diff --git a/keyboards/mechlovin/infinityce/keyboard.json b/keyboards/mechlovin/infinityce/keyboard.json index 2de1bde499..08981c7cb5 100644 --- a/keyboards/mechlovin/infinityce/keyboard.json +++ b/keyboards/mechlovin/infinityce/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kanu/keyboard.json b/keyboards/mechlovin/kanu/keyboard.json index 233b82f71e..2ade6f1962 100644 --- a/keyboards/mechlovin/kanu/keyboard.json +++ b/keyboards/mechlovin/kanu/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kay60/keyboard.json b/keyboards/mechlovin/kay60/keyboard.json index b42fd73b88..b666450bd8 100644 --- a/keyboards/mechlovin/kay60/keyboard.json +++ b/keyboards/mechlovin/kay60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kay65/keyboard.json b/keyboards/mechlovin/kay65/keyboard.json index d5008ec48f..fa2fdf0095 100644 --- a/keyboards/mechlovin/kay65/keyboard.json +++ b/keyboards/mechlovin/kay65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechlovin/pisces/keyboard.json b/keyboards/mechlovin/pisces/keyboard.json index b24afb6465..9dc1e34e0c 100644 --- a/keyboards/mechlovin/pisces/keyboard.json +++ b/keyboards/mechlovin/pisces/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechstudio/dawn/keyboard.json b/keyboards/mechstudio/dawn/keyboard.json index dc1894f4e5..76d990a677 100644 --- a/keyboards/mechstudio/dawn/keyboard.json +++ b/keyboards/mechstudio/dawn/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mechwild/mercutio/keyboard.json b/keyboards/mechwild/mercutio/keyboard.json index 0a7d758128..aff9485140 100644 --- a/keyboards/mechwild/mercutio/keyboard.json +++ b/keyboards/mechwild/mercutio/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/murphpad/keyboard.json b/keyboards/mechwild/murphpad/keyboard.json index 47d99f78e9..303f3a9c96 100644 --- a/keyboards/mechwild/murphpad/keyboard.json +++ b/keyboards/mechwild/murphpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/obe/info.json b/keyboards/mechwild/obe/info.json index 2247f69fac..ca2709675d 100644 --- a/keyboards/mechwild/obe/info.json +++ b/keyboards/mechwild/obe/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/sugarglider/f401/keyboard.json b/keyboards/mechwild/sugarglider/f401/keyboard.json index 7bf58c1b45..bac52694ac 100644 --- a/keyboards/mechwild/sugarglider/f401/keyboard.json +++ b/keyboards/mechwild/sugarglider/f401/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/mechwild/sugarglider/f411/keyboard.json b/keyboards/mechwild/sugarglider/f411/keyboard.json index dd76af1f10..91c830f371 100644 --- a/keyboards/mechwild/sugarglider/f411/keyboard.json +++ b/keyboards/mechwild/sugarglider/f411/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json b/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json index 7bf58c1b45..bac52694ac 100644 --- a/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json +++ b/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json b/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json index dd76af1f10..91c830f371 100644 --- a/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json +++ b/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/mehkee96/keyboard.json b/keyboards/mehkee96/keyboard.json index 326e91670d..4a72232d36 100644 --- a/keyboards/mehkee96/keyboard.json +++ b/keyboards/mehkee96/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/meletrix/zoom75/keyboard.json b/keyboards/meletrix/zoom75/keyboard.json index 20d7dc064a..0cf5fd7ee9 100644 --- a/keyboards/meletrix/zoom75/keyboard.json +++ b/keyboards/meletrix/zoom75/keyboard.json @@ -21,7 +21,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/meletrix/zoom98/keyboard.json b/keyboards/meletrix/zoom98/keyboard.json index b7d5672950..d8f870af85 100644 --- a/keyboards/meletrix/zoom98/keyboard.json +++ b/keyboards/meletrix/zoom98/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "rgb_matrix": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/melgeek/mach80/rev1/keyboard.json b/keyboards/melgeek/mach80/rev1/keyboard.json index 5cb145793d..5c504c4d23 100644 --- a/keyboards/melgeek/mach80/rev1/keyboard.json +++ b/keyboards/melgeek/mach80/rev1/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mach80/rev2/keyboard.json b/keyboards/melgeek/mach80/rev2/keyboard.json index 5cb145793d..5c504c4d23 100644 --- a/keyboards/melgeek/mach80/rev2/keyboard.json +++ b/keyboards/melgeek/mach80/rev2/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj61/rev1/keyboard.json b/keyboards/melgeek/mj61/rev1/keyboard.json index e0bd315865..24ca981a32 100644 --- a/keyboards/melgeek/mj61/rev1/keyboard.json +++ b/keyboards/melgeek/mj61/rev1/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj61/rev2/keyboard.json b/keyboards/melgeek/mj61/rev2/keyboard.json index 779cfc091c..c731085751 100644 --- a/keyboards/melgeek/mj61/rev2/keyboard.json +++ b/keyboards/melgeek/mj61/rev2/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj63/rev1/keyboard.json b/keyboards/melgeek/mj63/rev1/keyboard.json index e0bd315865..24ca981a32 100644 --- a/keyboards/melgeek/mj63/rev1/keyboard.json +++ b/keyboards/melgeek/mj63/rev1/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj63/rev2/keyboard.json b/keyboards/melgeek/mj63/rev2/keyboard.json index 779cfc091c..c731085751 100644 --- a/keyboards/melgeek/mj63/rev2/keyboard.json +++ b/keyboards/melgeek/mj63/rev2/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev1/keyboard.json b/keyboards/melgeek/mj64/rev1/keyboard.json index e0bd315865..24ca981a32 100644 --- a/keyboards/melgeek/mj64/rev1/keyboard.json +++ b/keyboards/melgeek/mj64/rev1/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev2/keyboard.json b/keyboards/melgeek/mj64/rev2/keyboard.json index e0bd315865..24ca981a32 100644 --- a/keyboards/melgeek/mj64/rev2/keyboard.json +++ b/keyboards/melgeek/mj64/rev2/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev3/keyboard.json b/keyboards/melgeek/mj64/rev3/keyboard.json index 779cfc091c..c731085751 100644 --- a/keyboards/melgeek/mj64/rev3/keyboard.json +++ b/keyboards/melgeek/mj64/rev3/keyboard.json @@ -2,7 +2,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj6xy/rev3/keyboard.json b/keyboards/melgeek/mj6xy/rev3/keyboard.json index ae44451236..7207652c47 100644 --- a/keyboards/melgeek/mj6xy/rev3/keyboard.json +++ b/keyboards/melgeek/mj6xy/rev3/keyboard.json @@ -3,7 +3,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mojo68/rev1/keyboard.json b/keyboards/melgeek/mojo68/rev1/keyboard.json index d6388b089d..5ea109520a 100755 --- a/keyboards/melgeek/mojo68/rev1/keyboard.json +++ b/keyboards/melgeek/mojo68/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mojo75/rev1/keyboard.json b/keyboards/melgeek/mojo75/rev1/keyboard.json index dbc6cbceee..5b2ab380a7 100644 --- a/keyboards/melgeek/mojo75/rev1/keyboard.json +++ b/keyboards/melgeek/mojo75/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/tegic/rev1/keyboard.json b/keyboards/melgeek/tegic/rev1/keyboard.json index c15a54b39f..b39f2345fa 100644 --- a/keyboards/melgeek/tegic/rev1/keyboard.json +++ b/keyboards/melgeek/tegic/rev1/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/z70ultra/rev1/keyboard.json b/keyboards/melgeek/z70ultra/rev1/keyboard.json index 8f79b395fc..ef59825d70 100644 --- a/keyboards/melgeek/z70ultra/rev1/keyboard.json +++ b/keyboards/melgeek/z70ultra/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/meow48/keyboard.json b/keyboards/meow48/keyboard.json index 3bb78af116..456d2fb58e 100644 --- a/keyboards/meow48/keyboard.json +++ b/keyboards/meow48/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/meow65/keyboard.json b/keyboards/meow65/keyboard.json index 5870152ee0..f72098cb4c 100644 --- a/keyboards/meow65/keyboard.json +++ b/keyboards/meow65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/merge/iso_macro/keyboard.json b/keyboards/merge/iso_macro/keyboard.json index bdf3737906..087fda9616 100644 --- a/keyboards/merge/iso_macro/keyboard.json +++ b/keyboards/merge/iso_macro/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/uc1/keyboard.json b/keyboards/merge/uc1/keyboard.json index 85e9b03c64..84059afdab 100644 --- a/keyboards/merge/uc1/keyboard.json +++ b/keyboards/merge/uc1/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/um70/keyboard.json b/keyboards/merge/um70/keyboard.json index afb52d3d4f..cd15bc90ac 100644 --- a/keyboards/merge/um70/keyboard.json +++ b/keyboards/merge/um70/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/um80/keyboard.json b/keyboards/merge/um80/keyboard.json index ea233e8f1c..5ef7c427cd 100644 --- a/keyboards/merge/um80/keyboard.json +++ b/keyboards/merge/um80/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mesa/mesa_tkl/keyboard.json b/keyboards/mesa/mesa_tkl/keyboard.json index 85d1c2b5a0..8c9c3425fc 100644 --- a/keyboards/mesa/mesa_tkl/keyboard.json +++ b/keyboards/mesa/mesa_tkl/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/meson/keyboard.json b/keyboards/meson/keyboard.json index 62640890ca..81a6140c23 100644 --- a/keyboards/meson/keyboard.json +++ b/keyboards/meson/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/metamechs/timberwolf/keyboard.json b/keyboards/metamechs/timberwolf/keyboard.json index 262022d2d6..a78af54062 100644 --- a/keyboards/metamechs/timberwolf/keyboard.json +++ b/keyboards/metamechs/timberwolf/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/miiiw/blackio83/rev_0100/keyboard.json b/keyboards/miiiw/blackio83/rev_0100/keyboard.json index d3fb31d109..00f6402ec2 100644 --- a/keyboards/miiiw/blackio83/rev_0100/keyboard.json +++ b/keyboards/miiiw/blackio83/rev_0100/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "deferred_exec": true, "dip_switch": true, "extrakey": true, diff --git a/keyboards/mikeneko65/keyboard.json b/keyboards/mikeneko65/keyboard.json index 873bb7d042..4b3c5142de 100644 --- a/keyboards/mikeneko65/keyboard.json +++ b/keyboards/mikeneko65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/miller/gm862/keyboard.json b/keyboards/miller/gm862/keyboard.json index 210b37b7b0..20aeffe1e6 100644 --- a/keyboards/miller/gm862/keyboard.json +++ b/keyboards/miller/gm862/keyboard.json @@ -44,7 +44,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/millipad/keyboard.json b/keyboards/millipad/keyboard.json index 7230fa750b..b3970fceb2 100644 --- a/keyboards/millipad/keyboard.json +++ b/keyboards/millipad/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mincedshon/ecila/keyboard.json b/keyboards/mincedshon/ecila/keyboard.json index 73e52b7590..a5ec2f5a0b 100644 --- a/keyboards/mincedshon/ecila/keyboard.json +++ b/keyboards/mincedshon/ecila/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mini_elixivy/keyboard.json b/keyboards/mini_elixivy/keyboard.json index 2d45d70cf4..b2b26f99c4 100644 --- a/keyboards/mini_elixivy/keyboard.json +++ b/keyboards/mini_elixivy/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mini_ten_key_plus/keyboard.json b/keyboards/mini_ten_key_plus/keyboard.json index 10507fa6e5..da3d467068 100644 --- a/keyboards/mini_ten_key_plus/keyboard.json +++ b/keyboards/mini_ten_key_plus/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/minimacro5/keyboard.json b/keyboards/minimacro5/keyboard.json index e500efa251..18d21acc7a 100644 --- a/keyboards/minimacro5/keyboard.json +++ b/keyboards/minimacro5/keyboard.json @@ -39,7 +39,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/minimon/bartlesplit/keyboard.json b/keyboards/minimon/bartlesplit/keyboard.json index 83f93560b6..ceae2bb88e 100644 --- a/keyboards/minimon/bartlesplit/keyboard.json +++ b/keyboards/minimon/bartlesplit/keyboard.json @@ -5,7 +5,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/minimon/index_tab/keyboard.json b/keyboards/minimon/index_tab/keyboard.json index 14e4524114..5fe07014bb 100644 --- a/keyboards/minimon/index_tab/keyboard.json +++ b/keyboards/minimon/index_tab/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mint60/keyboard.json b/keyboards/mint60/keyboard.json index 9fa69f5a3c..85eef9889c 100644 --- a/keyboards/mint60/keyboard.json +++ b/keyboards/mint60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/misonoworks/chocolatebar/keyboard.json b/keyboards/misonoworks/chocolatebar/keyboard.json index cf34557bb1..0ecfa3b660 100644 --- a/keyboards/misonoworks/chocolatebar/keyboard.json +++ b/keyboards/misonoworks/chocolatebar/keyboard.json @@ -27,7 +27,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/misonoworks/karina/keyboard.json b/keyboards/misonoworks/karina/keyboard.json index 0d9d55d206..5c095c8957 100644 --- a/keyboards/misonoworks/karina/keyboard.json +++ b/keyboards/misonoworks/karina/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/misterknife/knife66/keyboard.json b/keyboards/misterknife/knife66/keyboard.json index 3670b8a07f..43e65e66ac 100644 --- a/keyboards/misterknife/knife66/keyboard.json +++ b/keyboards/misterknife/knife66/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/misterknife/knife66_iso/keyboard.json b/keyboards/misterknife/knife66_iso/keyboard.json index 3370afa1b5..9f02cc4fd5 100644 --- a/keyboards/misterknife/knife66_iso/keyboard.json +++ b/keyboards/misterknife/knife66_iso/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/miuni32/keyboard.json b/keyboards/miuni32/keyboard.json index b105d2f2b8..1ff7d1a39a 100644 --- a/keyboards/miuni32/keyboard.json +++ b/keyboards/miuni32/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mk65/keyboard.json b/keyboards/mk65/keyboard.json index 0a768ece5e..c8cac57e39 100644 --- a/keyboards/mk65/keyboard.json +++ b/keyboards/mk65/keyboard.json @@ -26,7 +26,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true diff --git a/keyboards/ml/gas75/keyboard.json b/keyboards/ml/gas75/keyboard.json index 25289db9c8..9fe14a6d99 100644 --- a/keyboards/ml/gas75/keyboard.json +++ b/keyboards/ml/gas75/keyboard.json @@ -59,7 +59,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mlego/m48/rev1/keyboard.json b/keyboards/mlego/m48/rev1/keyboard.json index efd3888295..951d8713a1 100644 --- a/keyboards/mlego/m48/rev1/keyboard.json +++ b/keyboards/mlego/m48/rev1/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m60/rev1/keyboard.json b/keyboards/mlego/m60/rev1/keyboard.json index 126338b0c8..c2bb7df614 100644 --- a/keyboards/mlego/m60/rev1/keyboard.json +++ b/keyboards/mlego/m60/rev1/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev1/keyboard.json b/keyboards/mlego/m65/rev1/keyboard.json index b763c2e2cf..656128fdfa 100644 --- a/keyboards/mlego/m65/rev1/keyboard.json +++ b/keyboards/mlego/m65/rev1/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev2/keyboard.json b/keyboards/mlego/m65/rev2/keyboard.json index f07f1280a4..f0aa70e90b 100644 --- a/keyboards/mlego/m65/rev2/keyboard.json +++ b/keyboards/mlego/m65/rev2/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev3/keyboard.json b/keyboards/mlego/m65/rev3/keyboard.json index 168a214a88..386f929a11 100644 --- a/keyboards/mlego/m65/rev3/keyboard.json +++ b/keyboards/mlego/m65/rev3/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mmkzoo65/keyboard.json b/keyboards/mmkzoo65/keyboard.json index 6e1c33273c..d94cf6cf18 100644 --- a/keyboards/mmkzoo65/keyboard.json +++ b/keyboards/mmkzoo65/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mntre/keyboard.json b/keyboards/mntre/keyboard.json index 26dc66dc48..258ffca9c4 100644 --- a/keyboards/mntre/keyboard.json +++ b/keyboards/mntre/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/mode/m256ws/keyboard.json b/keyboards/mode/m256ws/keyboard.json index 3a754fe7db..01190c2de5 100644 --- a/keyboards/mode/m256ws/keyboard.json +++ b/keyboards/mode/m256ws/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mode/m60h/keyboard.json b/keyboards/mode/m60h/keyboard.json index 26095bb828..c4c1297c19 100644 --- a/keyboards/mode/m60h/keyboard.json +++ b/keyboards/mode/m60h/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mode/m60h_f/keyboard.json b/keyboards/mode/m60h_f/keyboard.json index 8a9a64ee65..b3a5aa5b3d 100644 --- a/keyboards/mode/m60h_f/keyboard.json +++ b/keyboards/mode/m60h_f/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mode/m60s/keyboard.json b/keyboards/mode/m60s/keyboard.json index 4a435967d6..18de64284b 100644 --- a/keyboards/mode/m60s/keyboard.json +++ b/keyboards/mode/m60s/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mode/m65ha_alpha/keyboard.json b/keyboards/mode/m65ha_alpha/keyboard.json index acf8845cd7..2623a6643a 100644 --- a/keyboards/mode/m65ha_alpha/keyboard.json +++ b/keyboards/mode/m65ha_alpha/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m65hi_alpha/keyboard.json b/keyboards/mode/m65hi_alpha/keyboard.json index f85e1f3756..db301ccb19 100644 --- a/keyboards/mode/m65hi_alpha/keyboard.json +++ b/keyboards/mode/m65hi_alpha/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m65s/keyboard.json b/keyboards/mode/m65s/keyboard.json index bd11e38bf4..91e39293cb 100644 --- a/keyboards/mode/m65s/keyboard.json +++ b/keyboards/mode/m65s/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m75h/keyboard.json b/keyboards/mode/m75h/keyboard.json index 6df6f28ab0..39fae0eb3a 100644 --- a/keyboards/mode/m75h/keyboard.json +++ b/keyboards/mode/m75h/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m75s/keyboard.json b/keyboards/mode/m75s/keyboard.json index f345874bbf..18090c8c28 100644 --- a/keyboards/mode/m75s/keyboard.json +++ b/keyboards/mode/m75s/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m80v1/m80h/keyboard.json b/keyboards/mode/m80v1/m80h/keyboard.json index 9b7eeb85d2..5acb6a3fdd 100644 --- a/keyboards/mode/m80v1/m80h/keyboard.json +++ b/keyboards/mode/m80v1/m80h/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v1/m80s/keyboard.json b/keyboards/mode/m80v1/m80s/keyboard.json index 4f93ef676c..166d071640 100644 --- a/keyboards/mode/m80v1/m80s/keyboard.json +++ b/keyboards/mode/m80v1/m80s/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v2/m80v2h/keyboard.json b/keyboards/mode/m80v2/m80v2h/keyboard.json index 1844e0775c..86e4f563cc 100644 --- a/keyboards/mode/m80v2/m80v2h/keyboard.json +++ b/keyboards/mode/m80v2/m80v2h/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v2/m80v2s/keyboard.json b/keyboards/mode/m80v2/m80v2s/keyboard.json index d8b4c8ee85..46fde3c1ca 100644 --- a/keyboards/mode/m80v2/m80v2s/keyboard.json +++ b/keyboards/mode/m80v2/m80v2s/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mokey/ginkgo65/keyboard.json b/keyboards/mokey/ginkgo65/keyboard.json index bdee6ebf80..fe3e5ad6ef 100644 --- a/keyboards/mokey/ginkgo65/keyboard.json +++ b/keyboards/mokey/ginkgo65/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/ginkgo65hot/keyboard.json b/keyboards/mokey/ginkgo65hot/keyboard.json index c42c2a87ff..d11c81be58 100644 --- a/keyboards/mokey/ginkgo65hot/keyboard.json +++ b/keyboards/mokey/ginkgo65hot/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/ibis80/keyboard.json b/keyboards/mokey/ibis80/keyboard.json index 536de9aab6..2dc9ec4e05 100644 --- a/keyboards/mokey/ibis80/keyboard.json +++ b/keyboards/mokey/ibis80/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mokey/luckycat70/keyboard.json b/keyboards/mokey/luckycat70/keyboard.json index 81d077f8a5..e0f0ee9029 100644 --- a/keyboards/mokey/luckycat70/keyboard.json +++ b/keyboards/mokey/luckycat70/keyboard.json @@ -12,7 +12,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/mokey/mokey63/keyboard.json b/keyboards/mokey/mokey63/keyboard.json index 40b45bcd41..6374ec508f 100644 --- a/keyboards/mokey/mokey63/keyboard.json +++ b/keyboards/mokey/mokey63/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/mokey64/keyboard.json b/keyboards/mokey/mokey64/keyboard.json index fbc50d4fd8..f5b34d69a2 100644 --- a/keyboards/mokey/mokey64/keyboard.json +++ b/keyboards/mokey/mokey64/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/xox70/keyboard.json b/keyboards/mokey/xox70/keyboard.json index 41980ed4ad..74c0dcbc86 100644 --- a/keyboards/mokey/xox70/keyboard.json +++ b/keyboards/mokey/xox70/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/xox70hot/keyboard.json b/keyboards/mokey/xox70hot/keyboard.json index 011e031ffe..152839a674 100644 --- a/keyboards/mokey/xox70hot/keyboard.json +++ b/keyboards/mokey/xox70hot/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/momoka_ergo/keyboard.json b/keyboards/momoka_ergo/keyboard.json index 23e0535d61..9886dd4d4e 100644 --- a/keyboards/momoka_ergo/keyboard.json +++ b/keyboards/momoka_ergo/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/momokai/aurora/keyboard.json b/keyboards/momokai/aurora/keyboard.json index 572d302663..e095daa8b1 100644 --- a/keyboards/momokai/aurora/keyboard.json +++ b/keyboards/momokai/aurora/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/momokai/tap_duo/keyboard.json b/keyboards/momokai/tap_duo/keyboard.json index 7658a7c5c6..636ed0209c 100644 --- a/keyboards/momokai/tap_duo/keyboard.json +++ b/keyboards/momokai/tap_duo/keyboard.json @@ -51,7 +51,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/momokai/tap_trio/keyboard.json b/keyboards/momokai/tap_trio/keyboard.json index 9ce41ff5ad..c0e297a782 100644 --- a/keyboards/momokai/tap_trio/keyboard.json +++ b/keyboards/momokai/tap_trio/keyboard.json @@ -51,7 +51,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/monoflex60/keyboard.json b/keyboards/monoflex60/keyboard.json index 9be4b39202..c7ea113099 100644 --- a/keyboards/monoflex60/keyboard.json +++ b/keyboards/monoflex60/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/monsgeek/m1/keyboard.json b/keyboards/monsgeek/m1/keyboard.json index 1551b2a113..937961a866 100644 --- a/keyboards/monsgeek/m1/keyboard.json +++ b/keyboards/monsgeek/m1/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "encoder": true, diff --git a/keyboards/monsgeek/m3/keyboard.json b/keyboards/monsgeek/m3/keyboard.json index cb7c3abf21..8373271fb3 100644 --- a/keyboards/monsgeek/m3/keyboard.json +++ b/keyboards/monsgeek/m3/keyboard.json @@ -21,7 +21,6 @@ "features": { "bootmagic": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/monsgeek/m5/keyboard.json b/keyboards/monsgeek/m5/keyboard.json index 3927181e2d..db19740b1a 100644 --- a/keyboards/monsgeek/m5/keyboard.json +++ b/keyboards/monsgeek/m5/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/monsgeek/m6/keyboard.json b/keyboards/monsgeek/m6/keyboard.json index 12d7def4c7..e770b8d4af 100644 --- a/keyboards/monsgeek/m6/keyboard.json +++ b/keyboards/monsgeek/m6/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/monstargear/xo87/rgb/keyboard.json b/keyboards/monstargear/xo87/rgb/keyboard.json index 5571b91990..9ee83deb00 100644 --- a/keyboards/monstargear/xo87/rgb/keyboard.json +++ b/keyboards/monstargear/xo87/rgb/keyboard.json @@ -67,7 +67,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/monstargear/xo87/solderable/keyboard.json b/keyboards/monstargear/xo87/solderable/keyboard.json index a230649b49..c825b22ac1 100644 --- a/keyboards/monstargear/xo87/solderable/keyboard.json +++ b/keyboards/monstargear/xo87/solderable/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/moondrop/dash75/info.json b/keyboards/moondrop/dash75/info.json index 59f956815e..7d04d7916e 100644 --- a/keyboards/moondrop/dash75/info.json +++ b/keyboards/moondrop/dash75/info.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mountainmechdesigns/teton_78/keyboard.json b/keyboards/mountainmechdesigns/teton_78/keyboard.json index 61ae4ac495..9385edb8a4 100644 --- a/keyboards/mountainmechdesigns/teton_78/keyboard.json +++ b/keyboards/mountainmechdesigns/teton_78/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ms_sculpt/keyboard.json b/keyboards/ms_sculpt/keyboard.json index 4fa0dcca48..153668baaf 100644 --- a/keyboards/ms_sculpt/keyboard.json +++ b/keyboards/ms_sculpt/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/mss_studio/m63_rgb/keyboard.json b/keyboards/mss_studio/m63_rgb/keyboard.json index 7647896711..7ca20ede1b 100644 --- a/keyboards/mss_studio/m63_rgb/keyboard.json +++ b/keyboards/mss_studio/m63_rgb/keyboard.json @@ -62,7 +62,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mss_studio/m64_rgb/keyboard.json b/keyboards/mss_studio/m64_rgb/keyboard.json index 885d55055e..52f0ccc8fc 100644 --- a/keyboards/mss_studio/m64_rgb/keyboard.json +++ b/keyboards/mss_studio/m64_rgb/keyboard.json @@ -62,7 +62,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mt/blocked65/keyboard.json b/keyboards/mt/blocked65/keyboard.json index d07ca870ae..da7e4fc6ee 100644 --- a/keyboards/mt/blocked65/keyboard.json +++ b/keyboards/mt/blocked65/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mt/mt40/keyboard.json b/keyboards/mt/mt40/keyboard.json index e02109b1cc..6afa3f12a7 100644 --- a/keyboards/mt/mt40/keyboard.json +++ b/keyboards/mt/mt40/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/mt/mt64rgb/keyboard.json b/keyboards/mt/mt64rgb/keyboard.json index bac2c213aa..a901136e6e 100644 --- a/keyboards/mt/mt64rgb/keyboard.json +++ b/keyboards/mt/mt64rgb/keyboard.json @@ -139,7 +139,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mt/mt84/keyboard.json b/keyboards/mt/mt84/keyboard.json index 1f73f1d5a2..1e17e5681f 100644 --- a/keyboards/mt/mt84/keyboard.json +++ b/keyboards/mt/mt84/keyboard.json @@ -156,7 +156,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mt/mt980/keyboard.json b/keyboards/mt/mt980/keyboard.json index 2fa17224cb..bdf8e9db80 100644 --- a/keyboards/mt/mt980/keyboard.json +++ b/keyboards/mt/mt980/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/mtbkeys/mtb60/hotswap/keyboard.json b/keyboards/mtbkeys/mtb60/hotswap/keyboard.json index cca7bb726a..c8ef4316be 100644 --- a/keyboards/mtbkeys/mtb60/hotswap/keyboard.json +++ b/keyboards/mtbkeys/mtb60/hotswap/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mtbkeys/mtb60/solder/keyboard.json b/keyboards/mtbkeys/mtb60/solder/keyboard.json index e128981626..b8e3287de7 100644 --- a/keyboards/mtbkeys/mtb60/solder/keyboard.json +++ b/keyboards/mtbkeys/mtb60/solder/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/murcielago/rev1/keyboard.json b/keyboards/murcielago/rev1/keyboard.json index bba7cf9089..2b2aa862e3 100644 --- a/keyboards/murcielago/rev1/keyboard.json +++ b/keyboards/murcielago/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/alicekk/keyboard.json b/keyboards/mwstudio/alicekk/keyboard.json index 141be9909e..61f03115d0 100644 --- a/keyboards/mwstudio/alicekk/keyboard.json +++ b/keyboards/mwstudio/alicekk/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw65_black/keyboard.json b/keyboards/mwstudio/mw65_black/keyboard.json index 6ae4b6055e..c6667671d8 100644 --- a/keyboards/mwstudio/mw65_black/keyboard.json +++ b/keyboards/mwstudio/mw65_black/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw65_rgb/keyboard.json b/keyboards/mwstudio/mw65_rgb/keyboard.json index 25a33783f5..e68ed85111 100644 --- a/keyboards/mwstudio/mw65_rgb/keyboard.json +++ b/keyboards/mwstudio/mw65_rgb/keyboard.json @@ -59,7 +59,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw660/keyboard.json b/keyboards/mwstudio/mw660/keyboard.json index 629eea2820..3e8fc91eef 100644 --- a/keyboards/mwstudio/mw660/keyboard.json +++ b/keyboards/mwstudio/mw660/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mwstudio/mw75/keyboard.json b/keyboards/mwstudio/mw75/keyboard.json index 2d826b1c99..e7169d37a6 100644 --- a/keyboards/mwstudio/mw75/keyboard.json +++ b/keyboards/mwstudio/mw75/keyboard.json @@ -56,7 +56,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw75r2/keyboard.json b/keyboards/mwstudio/mw75r2/keyboard.json index 144a848b18..2ec31300e9 100644 --- a/keyboards/mwstudio/mw75r2/keyboard.json +++ b/keyboards/mwstudio/mw75r2/keyboard.json @@ -44,7 +44,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw80/keyboard.json b/keyboards/mwstudio/mw80/keyboard.json index 423ec94e0e..c5d7c8d037 100644 --- a/keyboards/mwstudio/mw80/keyboard.json +++ b/keyboards/mwstudio/mw80/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mxss/keyboard.json b/keyboards/mxss/keyboard.json index defa0ae6b7..d6dc4b2a79 100644 --- a/keyboards/mxss/keyboard.json +++ b/keyboards/mxss/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mysticworks/wyvern/keyboard.json b/keyboards/mysticworks/wyvern/keyboard.json index 77f2aa19bd..bccf089120 100644 --- a/keyboards/mysticworks/wyvern/keyboard.json +++ b/keyboards/mysticworks/wyvern/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/nacly/sodium42/keyboard.json b/keyboards/nacly/sodium42/keyboard.json index 2db83408ac..a1d7b65ab3 100644 --- a/keyboards/nacly/sodium42/keyboard.json +++ b/keyboards/nacly/sodium42/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nacly/sodium50/keyboard.json b/keyboards/nacly/sodium50/keyboard.json index b9448c8217..e41495755f 100644 --- a/keyboards/nacly/sodium50/keyboard.json +++ b/keyboards/nacly/sodium50/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nacly/sodium62/keyboard.json b/keyboards/nacly/sodium62/keyboard.json index 904fa9568a..ab16bf45fa 100644 --- a/keyboards/nacly/sodium62/keyboard.json +++ b/keyboards/nacly/sodium62/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nacly/splitreus62/keyboard.json b/keyboards/nacly/splitreus62/keyboard.json index e91b4bdc75..d356578690 100644 --- a/keyboards/nacly/splitreus62/keyboard.json +++ b/keyboards/nacly/splitreus62/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/navi60/keyboard.json b/keyboards/navi60/keyboard.json index 8d41c7a1b3..8266e9b2b1 100644 --- a/keyboards/navi60/keyboard.json +++ b/keyboards/navi60/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/ncc1701kb/keyboard.json b/keyboards/ncc1701kb/keyboard.json index 753db62d7f..13e244f7ce 100644 --- a/keyboards/ncc1701kb/keyboard.json +++ b/keyboards/ncc1701kb/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/neito/keyboard.json b/keyboards/neito/keyboard.json index d79ab68508..7c9934fa65 100644 --- a/keyboards/neito/keyboard.json +++ b/keyboards/neito/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/element_hs/keyboard.json b/keyboards/neokeys/g67/element_hs/keyboard.json index 489e2d90ed..5245fb3fa0 100644 --- a/keyboards/neokeys/g67/element_hs/keyboard.json +++ b/keyboards/neokeys/g67/element_hs/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/hotswap/keyboard.json b/keyboards/neokeys/g67/hotswap/keyboard.json index ec28fdabb7..47a1786a5b 100644 --- a/keyboards/neokeys/g67/hotswap/keyboard.json +++ b/keyboards/neokeys/g67/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/soldered/keyboard.json b/keyboards/neokeys/g67/soldered/keyboard.json index 8944ff3d7b..896673f23e 100644 --- a/keyboards/neokeys/g67/soldered/keyboard.json +++ b/keyboards/neokeys/g67/soldered/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/neson_design/nico/keyboard.json b/keyboards/neson_design/nico/keyboard.json index 6efa5ee703..96cfff16ef 100644 --- a/keyboards/neson_design/nico/keyboard.json +++ b/keyboards/neson_design/nico/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/newgame40/keyboard.json b/keyboards/newgame40/keyboard.json index 63ae114f2e..0886f55623 100644 --- a/keyboards/newgame40/keyboard.json +++ b/keyboards/newgame40/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nibiria/stream15/keyboard.json b/keyboards/nibiria/stream15/keyboard.json index 6edcb70183..12f24d41bb 100644 --- a/keyboards/nibiria/stream15/keyboard.json +++ b/keyboards/nibiria/stream15/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightingale_studios/hailey/keyboard.json b/keyboards/nightingale_studios/hailey/keyboard.json index f8c2455958..564be592a5 100644 --- a/keyboards/nightingale_studios/hailey/keyboard.json +++ b/keyboards/nightingale_studios/hailey/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/adellein/keyboard.json b/keyboards/nightly_boards/adellein/keyboard.json index 64b345f073..889270637d 100644 --- a/keyboards/nightly_boards/adellein/keyboard.json +++ b/keyboards/nightly_boards/adellein/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/alter/rev1/keyboard.json b/keyboards/nightly_boards/alter/rev1/keyboard.json index 3f4d3055f6..df3d755ce8 100644 --- a/keyboards/nightly_boards/alter/rev1/keyboard.json +++ b/keyboards/nightly_boards/alter/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/nightly_boards/alter_lite/keyboard.json b/keyboards/nightly_boards/alter_lite/keyboard.json index 8e51d6ae6b..01ec32939c 100644 --- a/keyboards/nightly_boards/alter_lite/keyboard.json +++ b/keyboards/nightly_boards/alter_lite/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/conde60/keyboard.json b/keyboards/nightly_boards/conde60/keyboard.json index 0c78a269b3..65de34d6d7 100644 --- a/keyboards/nightly_boards/conde60/keyboard.json +++ b/keyboards/nightly_boards/conde60/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nightly_boards/daily60/keyboard.json b/keyboards/nightly_boards/daily60/keyboard.json index d3614d1b44..8c9f2616ec 100644 --- a/keyboards/nightly_boards/daily60/keyboard.json +++ b/keyboards/nightly_boards/daily60/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/jisoo/keyboard.json b/keyboards/nightly_boards/jisoo/keyboard.json index 21b8122497..c48c006d29 100644 --- a/keyboards/nightly_boards/jisoo/keyboard.json +++ b/keyboards/nightly_boards/jisoo/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/n2/keyboard.json b/keyboards/nightly_boards/n2/keyboard.json index db52cde6f9..44b113c574 100644 --- a/keyboards/nightly_boards/n2/keyboard.json +++ b/keyboards/nightly_boards/n2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/nightly_boards/n60_s/keyboard.json b/keyboards/nightly_boards/n60_s/keyboard.json index 664ff84c18..4689a631ac 100644 --- a/keyboards/nightly_boards/n60_s/keyboard.json +++ b/keyboards/nightly_boards/n60_s/keyboard.json @@ -14,7 +14,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/n87/keyboard.json b/keyboards/nightly_boards/n87/keyboard.json index 150022038c..327389384a 100644 --- a/keyboards/nightly_boards/n87/keyboard.json +++ b/keyboards/nightly_boards/n87/keyboard.json @@ -11,7 +11,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nightly_boards/n9/keyboard.json b/keyboards/nightly_boards/n9/keyboard.json index 23d09fbfb6..2bf12b196f 100644 --- a/keyboards/nightly_boards/n9/keyboard.json +++ b/keyboards/nightly_boards/n9/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/nightly_boards/octopad/keyboard.json b/keyboards/nightly_boards/octopad/keyboard.json index 9b0128e3d0..e2263a0ac1 100644 --- a/keyboards/nightly_boards/octopad/keyboard.json +++ b/keyboards/nightly_boards/octopad/keyboard.json @@ -14,7 +14,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/octopadplus/keyboard.json b/keyboards/nightly_boards/octopadplus/keyboard.json index 5ba2d414b6..78d89ab14c 100644 --- a/keyboards/nightly_boards/octopadplus/keyboard.json +++ b/keyboards/nightly_boards/octopadplus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/paraluman/keyboard.json b/keyboards/nightly_boards/paraluman/keyboard.json index 78fd1e6853..9478617b3b 100644 --- a/keyboards/nightly_boards/paraluman/keyboard.json +++ b/keyboards/nightly_boards/paraluman/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/ph_arisu/keyboard.json b/keyboards/nightly_boards/ph_arisu/keyboard.json index 55f9e6e90c..1c307f0527 100644 --- a/keyboards/nightly_boards/ph_arisu/keyboard.json +++ b/keyboards/nightly_boards/ph_arisu/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nimrod/keyboard.json b/keyboards/nimrod/keyboard.json index 08351efb20..162b13341e 100644 --- a/keyboards/nimrod/keyboard.json +++ b/keyboards/nimrod/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json index 3756537772..260153a622 100644 --- a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json +++ b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nix_studio/lilith/keyboard.json b/keyboards/nix_studio/lilith/keyboard.json index 7fe03ef806..d41a656d9d 100644 --- a/keyboards/nix_studio/lilith/keyboard.json +++ b/keyboards/nix_studio/lilith/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nix_studio/oxalys80/keyboard.json b/keyboards/nix_studio/oxalys80/keyboard.json index 8cd4598957..97d23456af 100644 --- a/keyboards/nix_studio/oxalys80/keyboard.json +++ b/keyboards/nix_studio/oxalys80/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/nixkeyboards/day_off/keyboard.json b/keyboards/nixkeyboards/day_off/keyboard.json index 2edbcdf883..82719eb1ae 100644 --- a/keyboards/nixkeyboards/day_off/keyboard.json +++ b/keyboards/nixkeyboards/day_off/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/jabberwocky/v1/keyboard.json b/keyboards/nopunin10did/jabberwocky/v1/keyboard.json index 6c8b71460e..277d5bf775 100644 --- a/keyboards/nopunin10did/jabberwocky/v1/keyboard.json +++ b/keyboards/nopunin10did/jabberwocky/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/jabberwocky/v2/keyboard.json b/keyboards/nopunin10did/jabberwocky/v2/keyboard.json index 7c688039a3..53c035bc03 100644 --- a/keyboards/nopunin10did/jabberwocky/v2/keyboard.json +++ b/keyboards/nopunin10did/jabberwocky/v2/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/kastenwagen1840/keyboard.json b/keyboards/nopunin10did/kastenwagen1840/keyboard.json index 771df3d82c..0118c3a4a8 100644 --- a/keyboards/nopunin10did/kastenwagen1840/keyboard.json +++ b/keyboards/nopunin10did/kastenwagen1840/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/kastenwagen48/keyboard.json b/keyboards/nopunin10did/kastenwagen48/keyboard.json index 58a9d7c2a8..f7b1264f00 100644 --- a/keyboards/nopunin10did/kastenwagen48/keyboard.json +++ b/keyboards/nopunin10did/kastenwagen48/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/railroad/rev0/keyboard.json b/keyboards/nopunin10did/railroad/rev0/keyboard.json index 7dcc17f762..6e70455d4a 100644 --- a/keyboards/nopunin10did/railroad/rev0/keyboard.json +++ b/keyboards/nopunin10did/railroad/rev0/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/styrkatmel/keyboard.json b/keyboards/nopunin10did/styrkatmel/keyboard.json index 98a9597b34..cc38a59f75 100644 --- a/keyboards/nopunin10did/styrkatmel/keyboard.json +++ b/keyboards/nopunin10did/styrkatmel/keyboard.json @@ -12,7 +12,6 @@ "backlight": false, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/novelkeys/nk1/keyboard.json b/keyboards/novelkeys/nk1/keyboard.json index 0fa15cf9f2..8df47acb66 100755 --- a/keyboards/novelkeys/nk1/keyboard.json +++ b/keyboards/novelkeys/nk1/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_classic_tkl/keyboard.json b/keyboards/novelkeys/nk_classic_tkl/keyboard.json index 53d10ce32a..00f2c763d2 100755 --- a/keyboards/novelkeys/nk_classic_tkl/keyboard.json +++ b/keyboards/novelkeys/nk_classic_tkl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json b/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json index 12085cbacc..54173de266 100755 --- a/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json +++ b/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_plus/keyboard.json b/keyboards/novelkeys/nk_plus/keyboard.json index b823d2808b..a7e065e4f5 100755 --- a/keyboards/novelkeys/nk_plus/keyboard.json +++ b/keyboards/novelkeys/nk_plus/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/noxary/268_2/keyboard.json b/keyboards/noxary/268_2/keyboard.json index 378d216f29..ee37cb2800 100644 --- a/keyboards/noxary/268_2/keyboard.json +++ b/keyboards/noxary/268_2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/noxary/268_2_rgb/keyboard.json b/keyboards/noxary/268_2_rgb/keyboard.json index a36c530863..7db5f23050 100644 --- a/keyboards/noxary/268_2_rgb/keyboard.json +++ b/keyboards/noxary/268_2_rgb/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/noxary/378/keyboard.json b/keyboards/noxary/378/keyboard.json index 7c66448832..2927dc1f3d 100644 --- a/keyboards/noxary/378/keyboard.json +++ b/keyboards/noxary/378/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/noxary/valhalla/keyboard.json b/keyboards/noxary/valhalla/keyboard.json index 817a46ed29..9d5a521fb5 100644 --- a/keyboards/noxary/valhalla/keyboard.json +++ b/keyboards/noxary/valhalla/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/noxary/valhalla_v2/keyboard.json b/keyboards/noxary/valhalla_v2/keyboard.json index 88ae2b8997..cf187e5ba0 100644 --- a/keyboards/noxary/valhalla_v2/keyboard.json +++ b/keyboards/noxary/valhalla_v2/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "backlight": true, "nkro": true }, diff --git a/keyboards/noxary/vulcan/keyboard.json b/keyboards/noxary/vulcan/keyboard.json index 821cb000b5..18dab7063d 100644 --- a/keyboards/noxary/vulcan/keyboard.json +++ b/keyboards/noxary/vulcan/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/noxary/x268/keyboard.json b/keyboards/noxary/x268/keyboard.json index bc690815a6..2de3163fcc 100644 --- a/keyboards/noxary/x268/keyboard.json +++ b/keyboards/noxary/x268/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/np12/keyboard.json b/keyboards/np12/keyboard.json index d7f6f8cfb7..f21ef00d08 100644 --- a/keyboards/np12/keyboard.json +++ b/keyboards/np12/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/null/st110r2/keyboard.json b/keyboards/null/st110r2/keyboard.json index b83e9746e1..7a3589cdcb 100644 --- a/keyboards/null/st110r2/keyboard.json +++ b/keyboards/null/st110r2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nyhxis/nfr_70/keyboard.json b/keyboards/nyhxis/nfr_70/keyboard.json index 0fbb4681d8..993beb0332 100644 --- a/keyboards/nyhxis/nfr_70/keyboard.json +++ b/keyboards/nyhxis/nfr_70/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/obosob/arch_36/keyboard.json b/keyboards/obosob/arch_36/keyboard.json index d24bab7334..625eec4a45 100644 --- a/keyboards/obosob/arch_36/keyboard.json +++ b/keyboards/obosob/arch_36/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/obosob/steal_this_keyboard/keyboard.json b/keyboards/obosob/steal_this_keyboard/keyboard.json index cc99431b5a..38d7936536 100644 --- a/keyboards/obosob/steal_this_keyboard/keyboard.json +++ b/keyboards/obosob/steal_this_keyboard/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ocean/addon/keyboard.json b/keyboards/ocean/addon/keyboard.json index b7502a28b6..9a7ad77272 100644 --- a/keyboards/ocean/addon/keyboard.json +++ b/keyboards/ocean/addon/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/gin_v2/keyboard.json b/keyboards/ocean/gin_v2/keyboard.json index 9485af7df6..9c5ae278b2 100644 --- a/keyboards/ocean/gin_v2/keyboard.json +++ b/keyboards/ocean/gin_v2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/slamz/keyboard.json b/keyboards/ocean/slamz/keyboard.json index 56344963f1..53fc0f609e 100644 --- a/keyboards/ocean/slamz/keyboard.json +++ b/keyboards/ocean/slamz/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/stealth/keyboard.json b/keyboards/ocean/stealth/keyboard.json index f5ed562fab..6232c641fb 100644 --- a/keyboards/ocean/stealth/keyboard.json +++ b/keyboards/ocean/stealth/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/sus/keyboard.json b/keyboards/ocean/sus/keyboard.json index ea2b1e326a..0bfdaa7b45 100644 --- a/keyboards/ocean/sus/keyboard.json +++ b/keyboards/ocean/sus/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/wang_ergo/keyboard.json b/keyboards/ocean/wang_ergo/keyboard.json index 758544e522..ef32964937 100644 --- a/keyboards/ocean/wang_ergo/keyboard.json +++ b/keyboards/ocean/wang_ergo/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/wang_v2/keyboard.json b/keyboards/ocean/wang_v2/keyboard.json index 1507d8634b..c5913f25b2 100644 --- a/keyboards/ocean/wang_v2/keyboard.json +++ b/keyboards/ocean/wang_v2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/yuri/keyboard.json b/keyboards/ocean/yuri/keyboard.json index 6542de2cda..ec0a7f60e2 100644 --- a/keyboards/ocean/yuri/keyboard.json +++ b/keyboards/ocean/yuri/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/odelia/keyboard.json b/keyboards/odelia/keyboard.json index 671d750e4e..373fea5f06 100644 --- a/keyboards/odelia/keyboard.json +++ b/keyboards/odelia/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ogre/ergo_single/keyboard.json b/keyboards/ogre/ergo_single/keyboard.json index 9fbc54db42..a79046cdae 100644 --- a/keyboards/ogre/ergo_single/keyboard.json +++ b/keyboards/ogre/ergo_single/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/ogre/ergo_split/keyboard.json b/keyboards/ogre/ergo_split/keyboard.json index 5c5d750add..fbe2204bcc 100644 --- a/keyboards/ogre/ergo_split/keyboard.json +++ b/keyboards/ogre/ergo_split/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/ok60/keyboard.json b/keyboards/ok60/keyboard.json index 98d19c77b7..7aea8463d8 100644 --- a/keyboards/ok60/keyboard.json +++ b/keyboards/ok60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/onekeyco/dango40/keyboard.json b/keyboards/onekeyco/dango40/keyboard.json index 8a41f25325..5ff823a981 100644 --- a/keyboards/onekeyco/dango40/keyboard.json +++ b/keyboards/onekeyco/dango40/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/orange75/keyboard.json b/keyboards/orange75/keyboard.json index e7941d242f..7da52e2795 100644 --- a/keyboards/orange75/keyboard.json +++ b/keyboards/orange75/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/org60/keyboard.json b/keyboards/org60/keyboard.json index d5c5260700..e0a735d2d9 100644 --- a/keyboards/org60/keyboard.json +++ b/keyboards/org60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ortho5by12/keyboard.json b/keyboards/ortho5by12/keyboard.json index 5bcd1e00fc..cb0fec114c 100644 --- a/keyboards/ortho5by12/keyboard.json +++ b/keyboards/ortho5by12/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/orthograph/keyboard.json b/keyboards/orthograph/keyboard.json index a3fbf634e5..7215a133d5 100644 --- a/keyboards/orthograph/keyboard.json +++ b/keyboards/orthograph/keyboard.json @@ -17,7 +17,6 @@ "rgb_matrix": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json index 38db4c965b..a92fa1212b 100644 --- a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json +++ b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/owlab/jelly_epoch/soldered/keyboard.json b/keyboards/owlab/jelly_epoch/soldered/keyboard.json index 5a12cdf0e9..29a963b1b9 100644 --- a/keyboards/owlab/jelly_epoch/soldered/keyboard.json +++ b/keyboards/owlab/jelly_epoch/soldered/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/owlab/spring/keyboard.json b/keyboards/owlab/spring/keyboard.json index 7e2ce90bd4..8716d2f80f 100644 --- a/keyboards/owlab/spring/keyboard.json +++ b/keyboards/owlab/spring/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/owlab/suit80/ansi/keyboard.json b/keyboards/owlab/suit80/ansi/keyboard.json index c76c9d16dd..00f54e6656 100644 --- a/keyboards/owlab/suit80/ansi/keyboard.json +++ b/keyboards/owlab/suit80/ansi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/suit80/iso/keyboard.json b/keyboards/owlab/suit80/iso/keyboard.json index 5bdd1cbacc..f3c6afb79c 100644 --- a/keyboards/owlab/suit80/iso/keyboard.json +++ b/keyboards/owlab/suit80/iso/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/voice65/hotswap/keyboard.json b/keyboards/owlab/voice65/hotswap/keyboard.json index 088cde4001..e85d4b69ec 100644 --- a/keyboards/owlab/voice65/hotswap/keyboard.json +++ b/keyboards/owlab/voice65/hotswap/keyboard.json @@ -67,7 +67,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/owlab/voice65/soldered/keyboard.json b/keyboards/owlab/voice65/soldered/keyboard.json index 7aab520f76..a1de099f43 100644 --- a/keyboards/owlab/voice65/soldered/keyboard.json +++ b/keyboards/owlab/voice65/soldered/keyboard.json @@ -67,7 +67,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/glitch/keyboard.json b/keyboards/p3d/glitch/keyboard.json index 5de1405f4f..7dd6eff6f0 100644 --- a/keyboards/p3d/glitch/keyboard.json +++ b/keyboards/p3d/glitch/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/q4z/keyboard.json b/keyboards/p3d/q4z/keyboard.json index 0ba3ff129b..6e5ef8bd80 100644 --- a/keyboards/p3d/q4z/keyboard.json +++ b/keyboards/p3d/q4z/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/p3d/spacey/keyboard.json b/keyboards/p3d/spacey/keyboard.json index 07e1ebf818..e3f1350a83 100644 --- a/keyboards/p3d/spacey/keyboard.json +++ b/keyboards/p3d/spacey/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/synapse/keyboard.json b/keyboards/p3d/synapse/keyboard.json index a73b3d4315..4cb0f84382 100644 --- a/keyboards/p3d/synapse/keyboard.json +++ b/keyboards/p3d/synapse/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/tw40/keyboard.json b/keyboards/p3d/tw40/keyboard.json index 459e187533..d5a6ac3292 100644 --- a/keyboards/p3d/tw40/keyboard.json +++ b/keyboards/p3d/tw40/keyboard.json @@ -29,7 +29,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pabile/p18/keyboard.json b/keyboards/pabile/p18/keyboard.json index 4bc6047ec0..5c3bc11fd6 100644 --- a/keyboards/pabile/p18/keyboard.json +++ b/keyboards/pabile/p18/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pabile/p20/ver1/keyboard.json b/keyboards/pabile/p20/ver1/keyboard.json index e909617faa..1a97045691 100644 --- a/keyboards/pabile/p20/ver1/keyboard.json +++ b/keyboards/pabile/p20/ver1/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pabile/p20/ver2/keyboard.json b/keyboards/pabile/p20/ver2/keyboard.json index b6688d870e..a69c7b14a1 100644 --- a/keyboards/pabile/p20/ver2/keyboard.json +++ b/keyboards/pabile/p20/ver2/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pabile/p40/keyboard.json b/keyboards/pabile/p40/keyboard.json index 980da54a06..4eedf0e7a8 100644 --- a/keyboards/pabile/p40/keyboard.json +++ b/keyboards/pabile/p40/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pabile/p40_ortho/keyboard.json b/keyboards/pabile/p40_ortho/keyboard.json index 305c0ad331..cea0e6fb36 100644 --- a/keyboards/pabile/p40_ortho/keyboard.json +++ b/keyboards/pabile/p40_ortho/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pabile/p42/keyboard.json b/keyboards/pabile/p42/keyboard.json index 70dcb09744..4c16123bd6 100644 --- a/keyboards/pabile/p42/keyboard.json +++ b/keyboards/pabile/p42/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/panc40/keyboard.json b/keyboards/panc40/keyboard.json index 9aef199fb3..4c89f6132f 100644 --- a/keyboards/panc40/keyboard.json +++ b/keyboards/panc40/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/panc60/keyboard.json b/keyboards/panc60/keyboard.json index a1e61b7999..5dbfe257e9 100644 --- a/keyboards/panc60/keyboard.json +++ b/keyboards/panc60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pangorin/tan67/keyboard.json b/keyboards/pangorin/tan67/keyboard.json index 5b36fd7a40..aef7b60765 100644 --- a/keyboards/pangorin/tan67/keyboard.json +++ b/keyboards/pangorin/tan67/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/papercranekeyboards/gerald65/keyboard.json b/keyboards/papercranekeyboards/gerald65/keyboard.json index 55d42eb93c..dd57037b02 100644 --- a/keyboards/papercranekeyboards/gerald65/keyboard.json +++ b/keyboards/papercranekeyboards/gerald65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/paprikman/albacore/keyboard.json b/keyboards/paprikman/albacore/keyboard.json index 1ee4b998f7..579b4b37e3 100644 --- a/keyboards/paprikman/albacore/keyboard.json +++ b/keyboards/paprikman/albacore/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/parallel/parallel_65/hotswap/keyboard.json b/keyboards/parallel/parallel_65/hotswap/keyboard.json index 8b1e31191f..f9ce4752bc 100644 --- a/keyboards/parallel/parallel_65/hotswap/keyboard.json +++ b/keyboards/parallel/parallel_65/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/parallel/parallel_65/soldered/keyboard.json b/keyboards/parallel/parallel_65/soldered/keyboard.json index 2e8d049dbf..d854960f68 100644 --- a/keyboards/parallel/parallel_65/soldered/keyboard.json +++ b/keyboards/parallel/parallel_65/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pauperboards/brick/keyboard.json b/keyboards/pauperboards/brick/keyboard.json index d1267f0891..53678f0f40 100644 --- a/keyboards/pauperboards/brick/keyboard.json +++ b/keyboards/pauperboards/brick/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pearl/keyboard.json b/keyboards/pearl/keyboard.json index 60c5bb3a37..c839c54e19 100644 --- a/keyboards/pearl/keyboard.json +++ b/keyboards/pearl/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/pearlboards/pandora/keyboard.json b/keyboards/pearlboards/pandora/keyboard.json index 59dc1ed955..5cedcaa630 100644 --- a/keyboards/pearlboards/pandora/keyboard.json +++ b/keyboards/pearlboards/pandora/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/pearlboards/zeuspad/keyboard.json b/keyboards/pearlboards/zeuspad/keyboard.json index 0e1c626782..686636f427 100644 --- a/keyboards/pearlboards/zeuspad/keyboard.json +++ b/keyboards/pearlboards/zeuspad/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/peej/lumberjack/keyboard.json b/keyboards/peej/lumberjack/keyboard.json index c94cb008be..79dc4e4b22 100644 --- a/keyboards/peej/lumberjack/keyboard.json +++ b/keyboards/peej/lumberjack/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/peej/tripel/info.json b/keyboards/peej/tripel/info.json index 8e357205f9..7a5c12461a 100644 --- a/keyboards/peej/tripel/info.json +++ b/keyboards/peej/tripel/info.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/pegasus/keyboard.json b/keyboards/pegasus/keyboard.json index 9c12de8ea0..50579bf86a 100644 --- a/keyboards/pegasus/keyboard.json +++ b/keyboards/pegasus/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/percent/canoe/keyboard.json b/keyboards/percent/canoe/keyboard.json index d88225c656..354b1164d9 100644 --- a/keyboards/percent/canoe/keyboard.json +++ b/keyboards/percent/canoe/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/percent/skog/keyboard.json b/keyboards/percent/skog/keyboard.json index 56751e56b7..da210410ef 100644 --- a/keyboards/percent/skog/keyboard.json +++ b/keyboards/percent/skog/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/percent/skog_lite/keyboard.json b/keyboards/percent/skog_lite/keyboard.json index 798ed34a5d..f1e925d2ea 100644 --- a/keyboards/percent/skog_lite/keyboard.json +++ b/keyboards/percent/skog_lite/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/phantom/keyboard.json b/keyboards/phantom/keyboard.json index 6f2b99b2b1..79d94cce6e 100644 --- a/keyboards/phantom/keyboard.json +++ b/keyboards/phantom/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/phdesign/phac/keyboard.json b/keyboards/phdesign/phac/keyboard.json index 5e5db876c0..615232791f 100644 --- a/keyboards/phdesign/phac/keyboard.json +++ b/keyboards/phdesign/phac/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/phrygian/ph100/keyboard.json b/keyboards/phrygian/ph100/keyboard.json index 3d0c611862..927b31e797 100644 --- a/keyboards/phrygian/ph100/keyboard.json +++ b/keyboards/phrygian/ph100/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/piantoruv44/keyboard.json b/keyboards/piantoruv44/keyboard.json index e2374dca6d..96267e18e8 100644 --- a/keyboards/piantoruv44/keyboard.json +++ b/keyboards/piantoruv44/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pica40/rev1/keyboard.json b/keyboards/pica40/rev1/keyboard.json index fdb4cb09b3..2f4e15aaa1 100644 --- a/keyboards/pica40/rev1/keyboard.json +++ b/keyboards/pica40/rev1/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "mousekey": true, "extrakey": true, "encoder": true, diff --git a/keyboards/pica40/rev2/keyboard.json b/keyboards/pica40/rev2/keyboard.json index 64b043f274..52cc64f39e 100644 --- a/keyboards/pica40/rev2/keyboard.json +++ b/keyboards/pica40/rev2/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "mousekey": true, "extrakey": true, "encoder": true, diff --git a/keyboards/picolab/frusta_fundamental/keyboard.json b/keyboards/picolab/frusta_fundamental/keyboard.json index 56c145e03c..b171e59318 100644 --- a/keyboards/picolab/frusta_fundamental/keyboard.json +++ b/keyboards/picolab/frusta_fundamental/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pimentoso/paddino02/rev1/keyboard.json b/keyboards/pimentoso/paddino02/rev1/keyboard.json index 20c144c795..37cbd3cd73 100644 --- a/keyboards/pimentoso/paddino02/rev1/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json index 00447c549b..86aa9c91ac 100644 --- a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json index 4c12bc23fa..f43ced53e8 100644 --- a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/touhoupad/keyboard.json b/keyboards/pimentoso/touhoupad/keyboard.json index 3e4655abfb..2deeb6d763 100644 --- a/keyboards/pimentoso/touhoupad/keyboard.json +++ b/keyboards/pimentoso/touhoupad/keyboard.json @@ -26,7 +26,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pisces/keyboard.json b/keyboards/pisces/keyboard.json index 1601cbc3a9..792ec0b48a 100644 --- a/keyboards/pisces/keyboard.json +++ b/keyboards/pisces/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pixelspace/capsule65i/keyboard.json b/keyboards/pixelspace/capsule65i/keyboard.json index f23f36018a..01210de441 100644 --- a/keyboards/pixelspace/capsule65i/keyboard.json +++ b/keyboards/pixelspace/capsule65i/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pizzakeyboards/pizza65/keyboard.json b/keyboards/pizzakeyboards/pizza65/keyboard.json index ee0a68dea5..cf5efa6281 100644 --- a/keyboards/pizzakeyboards/pizza65/keyboard.json +++ b/keyboards/pizzakeyboards/pizza65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pjb/eros/keyboard.json b/keyboards/pjb/eros/keyboard.json index 888a6aa02c..4cca23be94 100644 --- a/keyboards/pjb/eros/keyboard.json +++ b/keyboards/pjb/eros/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pkb65/keyboard.json b/keyboards/pkb65/keyboard.json index 394401328e..4a1e02fcc1 100644 --- a/keyboards/pkb65/keyboard.json +++ b/keyboards/pkb65/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/playkbtw/ca66/keyboard.json b/keyboards/playkbtw/ca66/keyboard.json index e28876fb9a..edce25cb10 100644 --- a/keyboards/playkbtw/ca66/keyboard.json +++ b/keyboards/playkbtw/ca66/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/helen80/keyboard.json b/keyboards/playkbtw/helen80/keyboard.json index be01d21da2..ba6c2f60df 100644 --- a/keyboards/playkbtw/helen80/keyboard.json +++ b/keyboards/playkbtw/helen80/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/pk60/keyboard.json b/keyboards/playkbtw/pk60/keyboard.json index de4f7a23f3..68c956239b 100644 --- a/keyboards/playkbtw/pk60/keyboard.json +++ b/keyboards/playkbtw/pk60/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/pk64rgb/keyboard.json b/keyboards/playkbtw/pk64rgb/keyboard.json index 49ef2f57b2..4bcf40315c 100644 --- a/keyboards/playkbtw/pk64rgb/keyboard.json +++ b/keyboards/playkbtw/pk64rgb/keyboard.json @@ -89,7 +89,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/pluckey/keyboard.json b/keyboards/pluckey/keyboard.json index 57f6b2467f..a6cad0a56c 100644 --- a/keyboards/pluckey/keyboard.json +++ b/keyboards/pluckey/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/plum47/keyboard.json b/keyboards/plum47/keyboard.json index 81b87e92db..426a062db2 100644 --- a/keyboards/plum47/keyboard.json +++ b/keyboards/plum47/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/plume/plume65/keyboard.json b/keyboards/plume/plume65/keyboard.json index 9828a766f6..f4aea13765 100644 --- a/keyboards/plume/plume65/keyboard.json +++ b/keyboards/plume/plume65/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/plut0nium/0x3e/keyboard.json b/keyboards/plut0nium/0x3e/keyboard.json index fe9c43ce4b..d331921d80 100644 --- a/keyboards/plut0nium/0x3e/keyboard.json +++ b/keyboards/plut0nium/0x3e/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/plx/keyboard.json b/keyboards/plx/keyboard.json index dd47ce7037..c7a82961ec 100644 --- a/keyboards/plx/keyboard.json +++ b/keyboards/plx/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/plywrks/ahgase/keyboard.json b/keyboards/plywrks/ahgase/keyboard.json index 05ed4e6ff2..9e5d8baed6 100644 --- a/keyboards/plywrks/ahgase/keyboard.json +++ b/keyboards/plywrks/ahgase/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/plywrks/allaro/keyboard.json b/keyboards/plywrks/allaro/keyboard.json index ca94fc8318..abf1b8773d 100644 --- a/keyboards/plywrks/allaro/keyboard.json +++ b/keyboards/plywrks/allaro/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/plywrks/ji_eun/keyboard.json b/keyboards/plywrks/ji_eun/keyboard.json index 59355277f7..e94b3ad6b0 100644 --- a/keyboards/plywrks/ji_eun/keyboard.json +++ b/keyboards/plywrks/ji_eun/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/plywrks/lune/keyboard.json b/keyboards/plywrks/lune/keyboard.json index fa05b5110b..7ec645b1b1 100644 --- a/keyboards/plywrks/lune/keyboard.json +++ b/keyboards/plywrks/lune/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/plywrks/ply8x/solder/keyboard.json b/keyboards/plywrks/ply8x/solder/keyboard.json index 435319dec8..f05b34e13b 100644 --- a/keyboards/plywrks/ply8x/solder/keyboard.json +++ b/keyboards/plywrks/ply8x/solder/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pmk/posey_split/v4/keyboard.json b/keyboards/pmk/posey_split/v4/keyboard.json index e27991783d..533ba81867 100644 --- a/keyboards/pmk/posey_split/v4/keyboard.json +++ b/keyboards/pmk/posey_split/v4/keyboard.json @@ -11,7 +11,6 @@ "bootmagic": true, "rgblight": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pmk/posey_split/v5/keyboard.json b/keyboards/pmk/posey_split/v5/keyboard.json index 02c04dbba2..341a8cd9be 100644 --- a/keyboards/pmk/posey_split/v5/keyboard.json +++ b/keyboards/pmk/posey_split/v5/keyboard.json @@ -11,7 +11,6 @@ "bootmagic": true, "rgblight": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pohjolaworks/louhi/keyboard.json b/keyboards/pohjolaworks/louhi/keyboard.json index 90d7a96433..b0bca3e0ed 100644 --- a/keyboards/pohjolaworks/louhi/keyboard.json +++ b/keyboards/pohjolaworks/louhi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/poker87c/keyboard.json b/keyboards/poker87c/keyboard.json index 08355d8a2b..02e0906562 100644 --- a/keyboards/poker87c/keyboard.json +++ b/keyboards/poker87c/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/poker87d/keyboard.json b/keyboards/poker87d/keyboard.json index 7e6f08d82c..e52b5a4149 100644 --- a/keyboards/poker87d/keyboard.json +++ b/keyboards/poker87d/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/polilla/rev1/keyboard.json b/keyboards/polilla/rev1/keyboard.json index 27132202d2..52c1b7fab8 100644 --- a/keyboards/polilla/rev1/keyboard.json +++ b/keyboards/polilla/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/polycarbdiet/s20/keyboard.json b/keyboards/polycarbdiet/s20/keyboard.json index 07cc8acc48..678327f167 100644 --- a/keyboards/polycarbdiet/s20/keyboard.json +++ b/keyboards/polycarbdiet/s20/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pom_keyboards/tnln95/keyboard.json b/keyboards/pom_keyboards/tnln95/keyboard.json index 09b3f71f7c..9f2983b541 100644 --- a/keyboards/pom_keyboards/tnln95/keyboard.json +++ b/keyboards/pom_keyboards/tnln95/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/portal_66/hotswap/keyboard.json b/keyboards/portal_66/hotswap/keyboard.json index 266ca516ec..67179ad185 100644 --- a/keyboards/portal_66/hotswap/keyboard.json +++ b/keyboards/portal_66/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/portal_66/soldered/keyboard.json b/keyboards/portal_66/soldered/keyboard.json index 369a6efa13..349184cbab 100644 --- a/keyboards/portal_66/soldered/keyboard.json +++ b/keyboards/portal_66/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pos78/keyboard.json b/keyboards/pos78/keyboard.json index 0a6a814155..6519f1ba5c 100644 --- a/keyboards/pos78/keyboard.json +++ b/keyboards/pos78/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/preonic/rev1/keyboard.json b/keyboards/preonic/rev1/keyboard.json index 648dafe576..ddd1d68426 100644 --- a/keyboards/preonic/rev1/keyboard.json +++ b/keyboards/preonic/rev1/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/primekb/prime_e/info.json b/keyboards/primekb/prime_e/info.json index e7ed77e403..01208f70b8 100644 --- a/keyboards/primekb/prime_e/info.json +++ b/keyboards/primekb/prime_e/info.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/primekb/prime_l/info.json b/keyboards/primekb/prime_l/info.json index ed905f2b0b..2403dec963 100644 --- a/keyboards/primekb/prime_l/info.json +++ b/keyboards/primekb/prime_l/info.json @@ -5,7 +5,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_m/keyboard.json b/keyboards/primekb/prime_m/keyboard.json index eb06dcdb7e..f9d72061c5 100644 --- a/keyboards/primekb/prime_m/keyboard.json +++ b/keyboards/primekb/prime_m/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_o/keyboard.json b/keyboards/primekb/prime_o/keyboard.json index 04da8ab134..159ed92d7a 100644 --- a/keyboards/primekb/prime_o/keyboard.json +++ b/keyboards/primekb/prime_o/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_r/keyboard.json b/keyboards/primekb/prime_r/keyboard.json index d92903b897..cc2fe7a0c7 100644 --- a/keyboards/primekb/prime_r/keyboard.json +++ b/keyboards/primekb/prime_r/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/printedpad/keyboard.json b/keyboards/printedpad/keyboard.json index d9fc996f33..5441df5e7c 100644 --- a/keyboards/printedpad/keyboard.json +++ b/keyboards/printedpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectcain/vault45/keyboard.json b/keyboards/projectcain/vault45/keyboard.json index 66199a620d..a66aea94e2 100644 --- a/keyboards/projectcain/vault45/keyboard.json +++ b/keyboards/projectcain/vault45/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/projectd/65/projectd_65_ansi/keyboard.json b/keyboards/projectd/65/projectd_65_ansi/keyboard.json index 1e1f5cce2a..a0113302b1 100644 --- a/keyboards/projectd/65/projectd_65_ansi/keyboard.json +++ b/keyboards/projectd/65/projectd_65_ansi/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectd/75/ansi/keyboard.json b/keyboards/projectd/75/ansi/keyboard.json index 3040981378..16995c697c 100644 --- a/keyboards/projectd/75/ansi/keyboard.json +++ b/keyboards/projectd/75/ansi/keyboard.json @@ -20,7 +20,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectd/75/iso/keyboard.json b/keyboards/projectd/75/iso/keyboard.json index a4d5e909c1..871efba1da 100644 --- a/keyboards/projectd/75/iso/keyboard.json +++ b/keyboards/projectd/75/iso/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectkb/signature65/keyboard.json b/keyboards/projectkb/signature65/keyboard.json index b72ff9926c..7393fc280d 100644 --- a/keyboards/projectkb/signature65/keyboard.json +++ b/keyboards/projectkb/signature65/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/allison/keyboard.json b/keyboards/prototypist/allison/keyboard.json index ea80e853bf..5fc003a93c 100644 --- a/keyboards/prototypist/allison/keyboard.json +++ b/keyboards/prototypist/allison/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/allison_numpad/keyboard.json b/keyboards/prototypist/allison_numpad/keyboard.json index a995cd6bbf..56c08df27d 100644 --- a/keyboards/prototypist/allison_numpad/keyboard.json +++ b/keyboards/prototypist/allison_numpad/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/j01/keyboard.json b/keyboards/prototypist/j01/keyboard.json index 68296e1b77..2cf6753cc5 100644 --- a/keyboards/prototypist/j01/keyboard.json +++ b/keyboards/prototypist/j01/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/pt60/keyboard.json b/keyboards/prototypist/pt60/keyboard.json index 2ae193c924..688559e093 100644 --- a/keyboards/prototypist/pt60/keyboard.json +++ b/keyboards/prototypist/pt60/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/pt80/keyboard.json b/keyboards/prototypist/pt80/keyboard.json index af7d6093cb..aacb53bdb6 100644 --- a/keyboards/prototypist/pt80/keyboard.json +++ b/keyboards/prototypist/pt80/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/protozoa/event_horizon/keyboard.json b/keyboards/protozoa/event_horizon/keyboard.json index 42482c09ba..1b622e3a4e 100644 --- a/keyboards/protozoa/event_horizon/keyboard.json +++ b/keyboards/protozoa/event_horizon/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/psuieee/pluto12/keyboard.json b/keyboards/psuieee/pluto12/keyboard.json index 382d9fe030..22c91841c4 100644 --- a/keyboards/psuieee/pluto12/keyboard.json +++ b/keyboards/psuieee/pluto12/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pteron36/keyboard.json b/keyboards/pteron36/keyboard.json index 25c4dc8c54..711dabf986 100644 --- a/keyboards/pteron36/keyboard.json +++ b/keyboards/pteron36/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pteropus/keyboard.json b/keyboards/pteropus/keyboard.json index 09356d1a99..c4660a537f 100644 --- a/keyboards/pteropus/keyboard.json +++ b/keyboards/pteropus/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/puck/keyboard.json b/keyboards/puck/keyboard.json index e69c7755d3..5c843e3249 100644 --- a/keyboards/puck/keyboard.json +++ b/keyboards/puck/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/purin/keyboard.json b/keyboards/purin/keyboard.json index 8da928ed03..820e285ccc 100644 --- a/keyboards/purin/keyboard.json +++ b/keyboards/purin/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/qck75/v1/keyboard.json b/keyboards/qck75/v1/keyboard.json index 04cc5dc3c1..56ffa17dd3 100644 --- a/keyboards/qck75/v1/keyboard.json +++ b/keyboards/qck75/v1/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qpockets/eggman/keyboard.json b/keyboards/qpockets/eggman/keyboard.json index b784c6aec3..53fd05758e 100644 --- a/keyboards/qpockets/eggman/keyboard.json +++ b/keyboards/qpockets/eggman/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qpockets/wanten/keyboard.json b/keyboards/qpockets/wanten/keyboard.json index e1c21b5d0f..3404308b52 100644 --- a/keyboards/qpockets/wanten/keyboard.json +++ b/keyboards/qpockets/wanten/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/quad_h/lb75/keyboard.json b/keyboards/quad_h/lb75/keyboard.json index 3dc43bdb69..d205ecbc27 100644 --- a/keyboards/quad_h/lb75/keyboard.json +++ b/keyboards/quad_h/lb75/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z40/keyboard.json b/keyboards/quarkeys/z40/keyboard.json index fb945dba5a..cb5e1f9764 100644 --- a/keyboards/quarkeys/z40/keyboard.json +++ b/keyboards/quarkeys/z40/keyboard.json @@ -55,7 +55,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z60/hotswap/keyboard.json b/keyboards/quarkeys/z60/hotswap/keyboard.json index c586d62ef4..5e08fa1c1d 100644 --- a/keyboards/quarkeys/z60/hotswap/keyboard.json +++ b/keyboards/quarkeys/z60/hotswap/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z60/solder/keyboard.json b/keyboards/quarkeys/z60/solder/keyboard.json index e85f7e6dc8..8e2c0392ba 100644 --- a/keyboards/quarkeys/z60/solder/keyboard.json +++ b/keyboards/quarkeys/z60/solder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z67/hotswap/keyboard.json b/keyboards/quarkeys/z67/hotswap/keyboard.json index 266a9a879e..03c83fea90 100644 --- a/keyboards/quarkeys/z67/hotswap/keyboard.json +++ b/keyboards/quarkeys/z67/hotswap/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z67/solder/keyboard.json b/keyboards/quarkeys/z67/solder/keyboard.json index c1e1412d21..380aa187d4 100644 --- a/keyboards/quarkeys/z67/solder/keyboard.json +++ b/keyboards/quarkeys/z67/solder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/qvex/lynepad/keyboard.json b/keyboards/qvex/lynepad/keyboard.json index 65afceb26a..6b6e765869 100644 --- a/keyboards/qvex/lynepad/keyboard.json +++ b/keyboards/qvex/lynepad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qwertlekeys/calice/keyboard.json b/keyboards/qwertlekeys/calice/keyboard.json index 6e57f37892..21ad107e46 100644 --- a/keyboards/qwertlekeys/calice/keyboard.json +++ b/keyboards/qwertlekeys/calice/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/qwertykeys/qk65/hotswap/keyboard.json b/keyboards/qwertykeys/qk65/hotswap/keyboard.json index a641e3cc7a..78d7e0753f 100644 --- a/keyboards/qwertykeys/qk65/hotswap/keyboard.json +++ b/keyboards/qwertykeys/qk65/hotswap/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/qwertykeys/qk65/solder/keyboard.json b/keyboards/qwertykeys/qk65/solder/keyboard.json index deb2c987b5..2797309c95 100644 --- a/keyboards/qwertykeys/qk65/solder/keyboard.json +++ b/keyboards/qwertykeys/qk65/solder/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rad/keyboard.json b/keyboards/rad/keyboard.json index 0d86f25275..a6636951ac 100644 --- a/keyboards/rad/keyboard.json +++ b/keyboards/rad/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rainkeebs/delilah/keyboard.json b/keyboards/rainkeebs/delilah/keyboard.json index bd3d142741..b14d7b871d 100644 --- a/keyboards/rainkeebs/delilah/keyboard.json +++ b/keyboards/rainkeebs/delilah/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rainkeebs/rainkeeb/keyboard.json b/keyboards/rainkeebs/rainkeeb/keyboard.json index af6021bc1a..55224de473 100644 --- a/keyboards/rainkeebs/rainkeeb/keyboard.json +++ b/keyboards/rainkeebs/rainkeeb/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rainkeebs/yasui/keyboard.json b/keyboards/rainkeebs/yasui/keyboard.json index 43bbc46fae..75d8297090 100644 --- a/keyboards/rainkeebs/yasui/keyboard.json +++ b/keyboards/rainkeebs/yasui/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ramlord/witf/keyboard.json b/keyboards/ramlord/witf/keyboard.json index 2e8b05eee9..983941c316 100644 --- a/keyboards/ramlord/witf/keyboard.json +++ b/keyboards/ramlord/witf/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rart/rart45/keyboard.json b/keyboards/rart/rart45/keyboard.json index a1cf03341e..52af4d77ef 100644 --- a/keyboards/rart/rart45/keyboard.json +++ b/keyboards/rart/rart45/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/rart/rart4x4/keyboard.json b/keyboards/rart/rart4x4/keyboard.json index edd5ed12fe..c693ea977d 100644 --- a/keyboards/rart/rart4x4/keyboard.json +++ b/keyboards/rart/rart4x4/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rart/rart67m/keyboard.json b/keyboards/rart/rart67m/keyboard.json index 83ff7f30a1..338f63b808 100644 --- a/keyboards/rart/rart67m/keyboard.json +++ b/keyboards/rart/rart67m/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rart/rart75m/keyboard.json b/keyboards/rart/rart75m/keyboard.json index 3af82c9bc5..f87f24aada 100644 --- a/keyboards/rart/rart75m/keyboard.json +++ b/keyboards/rart/rart75m/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rart/rartand/keyboard.json b/keyboards/rart/rartand/keyboard.json index 57ff3f068f..f97820bb06 100644 --- a/keyboards/rart/rartand/keyboard.json +++ b/keyboards/rart/rartand/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rart/rartlite/keyboard.json b/keyboards/rart/rartlite/keyboard.json index baf65530d6..f1d3af3c72 100644 --- a/keyboards/rart/rartlite/keyboard.json +++ b/keyboards/rart/rartlite/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rart/rartpad/keyboard.json b/keyboards/rart/rartpad/keyboard.json index dd4f778e26..18b5081dac 100644 --- a/keyboards/rart/rartpad/keyboard.json +++ b/keyboards/rart/rartpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rate/pistachio_mp/keyboard.json b/keyboards/rate/pistachio_mp/keyboard.json index dc016ffecb..0252db6f5d 100644 --- a/keyboards/rate/pistachio_mp/keyboard.json +++ b/keyboards/rate/pistachio_mp/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json index eb8da169c4..7b5f27e07a 100644 --- a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json index 384760e535..ee9687192a 100644 --- a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/recompile_keys/cocoa40/keyboard.json b/keyboards/recompile_keys/cocoa40/keyboard.json index 45f0cba2ff..5386bbe9e0 100644 --- a/keyboards/recompile_keys/cocoa40/keyboard.json +++ b/keyboards/recompile_keys/cocoa40/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/recompile_keys/mio/keyboard.json b/keyboards/recompile_keys/mio/keyboard.json index 700bb09c07..1a2467f6ee 100644 --- a/keyboards/recompile_keys/mio/keyboard.json +++ b/keyboards/recompile_keys/mio/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rect44/keyboard.json b/keyboards/rect44/keyboard.json index fd543f5299..b90b6a7e69 100644 --- a/keyboards/rect44/keyboard.json +++ b/keyboards/rect44/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/redox/rev1/info.json b/keyboards/redox/rev1/info.json index b5df079969..c205548e21 100644 --- a/keyboards/redox/rev1/info.json +++ b/keyboards/redox/rev1/info.json @@ -10,7 +10,6 @@ "features":{ "bootmagic": true, "command": true, - "console": false, "mousekey": true, "extrakey": true, "nkro": true, diff --git a/keyboards/redscarf_i/keyboard.json b/keyboards/redscarf_i/keyboard.json index 0e5dbd76a8..531ee382c7 100644 --- a/keyboards/redscarf_i/keyboard.json +++ b/keyboards/redscarf_i/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/retro_75/keyboard.json b/keyboards/retro_75/keyboard.json index 1e29a5a0fc..efd13cfcc5 100644 --- a/keyboards/retro_75/keyboard.json +++ b/keyboards/retro_75/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/reviung/reviung33/keyboard.json b/keyboards/reviung/reviung33/keyboard.json index ab0df0195b..509debb9cb 100644 --- a/keyboards/reviung/reviung33/keyboard.json +++ b/keyboards/reviung/reviung33/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/reviung/reviung46/keyboard.json b/keyboards/reviung/reviung46/keyboard.json index cdf9a24e17..3c0dc096a1 100644 --- a/keyboards/reviung/reviung46/keyboard.json +++ b/keyboards/reviung/reviung46/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/reviung/reviung5/keyboard.json b/keyboards/reviung/reviung5/keyboard.json index 78c37f4992..4eee855091 100644 --- a/keyboards/reviung/reviung5/keyboard.json +++ b/keyboards/reviung/reviung5/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/reviung/reviung53/keyboard.json b/keyboards/reviung/reviung53/keyboard.json index dfa2866f12..010743c2b8 100644 --- a/keyboards/reviung/reviung53/keyboard.json +++ b/keyboards/reviung/reviung53/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/rico/phoenix_project_no1/keyboard.json b/keyboards/rico/phoenix_project_no1/keyboard.json index 4d354ce0af..692b7c9828 100644 --- a/keyboards/rico/phoenix_project_no1/keyboard.json +++ b/keyboards/rico/phoenix_project_no1/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rmi_kb/equator/keyboard.json b/keyboards/rmi_kb/equator/keyboard.json index 4eccede555..051ab84e4b 100644 --- a/keyboards/rmi_kb/equator/keyboard.json +++ b/keyboards/rmi_kb/equator/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rmi_kb/squishyfrl/keyboard.json b/keyboards/rmi_kb/squishyfrl/keyboard.json index 5f5d305c6f..65a56e61f0 100644 --- a/keyboards/rmi_kb/squishyfrl/keyboard.json +++ b/keyboards/rmi_kb/squishyfrl/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rmi_kb/squishytkl/keyboard.json b/keyboards/rmi_kb/squishytkl/keyboard.json index 6fc61e6b3c..30c32edd27 100644 --- a/keyboards/rmi_kb/squishytkl/keyboard.json +++ b/keyboards/rmi_kb/squishytkl/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rmi_kb/tkl_ff/info.json b/keyboards/rmi_kb/tkl_ff/info.json index 96bbeb8159..239d664ff3 100644 --- a/keyboards/rmi_kb/tkl_ff/info.json +++ b/keyboards/rmi_kb/tkl_ff/info.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/rmkeebs/rm_fullsize/keyboard.json b/keyboards/rmkeebs/rm_fullsize/keyboard.json index a7e6ff99cb..60b73110c7 100644 --- a/keyboards/rmkeebs/rm_fullsize/keyboard.json +++ b/keyboards/rmkeebs/rm_fullsize/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rmkeebs/rm_numpad/keyboard.json b/keyboards/rmkeebs/rm_numpad/keyboard.json index eb3d11ca86..4885d56f37 100644 --- a/keyboards/rmkeebs/rm_numpad/keyboard.json +++ b/keyboards/rmkeebs/rm_numpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rose75/keyboard.json b/keyboards/rose75/keyboard.json index 9306cb211b..4b45a3d845 100644 --- a/keyboards/rose75/keyboard.json +++ b/keyboards/rose75/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/roseslite/keyboard.json b/keyboards/roseslite/keyboard.json index 88b8c7a205..4c1849dc7d 100644 --- a/keyboards/roseslite/keyboard.json +++ b/keyboards/roseslite/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rot13labs/h4ckb0ard/keyboard.json b/keyboards/rot13labs/h4ckb0ard/keyboard.json index 4ac783774d..cd028f08c8 100644 --- a/keyboards/rot13labs/h4ckb0ard/keyboard.json +++ b/keyboards/rot13labs/h4ckb0ard/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rot13labs/rotc0n/keyboard.json b/keyboards/rot13labs/rotc0n/keyboard.json index a340c37d62..2ee71daa18 100644 --- a/keyboards/rot13labs/rotc0n/keyboard.json +++ b/keyboards/rot13labs/rotc0n/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rot13labs/veilid_sao/keyboard.json b/keyboards/rot13labs/veilid_sao/keyboard.json index 0a0d8eecab..38271afbe9 100644 --- a/keyboards/rot13labs/veilid_sao/keyboard.json +++ b/keyboards/rot13labs/veilid_sao/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/rotr/keyboard.json b/keyboards/rotr/keyboard.json index cb1a7e923d..6d3599a506 100644 --- a/keyboards/rotr/keyboard.json +++ b/keyboards/rotr/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/runes/vaengr/keyboard.json b/keyboards/runes/vaengr/keyboard.json index 42389043d4..c962d19892 100644 --- a/keyboards/runes/vaengr/keyboard.json +++ b/keyboards/runes/vaengr/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ryanbaekr/rb1/keyboard.json b/keyboards/ryanbaekr/rb1/keyboard.json index dd54bd2998..19ddbb9402 100644 --- a/keyboards/ryanbaekr/rb1/keyboard.json +++ b/keyboards/ryanbaekr/rb1/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ryanbaekr/rb18/keyboard.json b/keyboards/ryanbaekr/rb18/keyboard.json index cf9539c462..4485bdff00 100644 --- a/keyboards/ryanbaekr/rb18/keyboard.json +++ b/keyboards/ryanbaekr/rb18/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryanbaekr/rb69/keyboard.json b/keyboards/ryanbaekr/rb69/keyboard.json index 3a5fd3fee3..ffe4ba1674 100644 --- a/keyboards/ryanbaekr/rb69/keyboard.json +++ b/keyboards/ryanbaekr/rb69/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryanbaekr/rb87/keyboard.json b/keyboards/ryanbaekr/rb87/keyboard.json index 42114b29d8..8c3bffdbfe 100644 --- a/keyboards/ryanbaekr/rb87/keyboard.json +++ b/keyboards/ryanbaekr/rb87/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryloo_studio/m0110/keyboard.json b/keyboards/ryloo_studio/m0110/keyboard.json index 9eb4662e36..ae9535173a 100644 --- a/keyboards/ryloo_studio/m0110/keyboard.json +++ b/keyboards/ryloo_studio/m0110/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/s_ol/0xc_pad/keyboard.json b/keyboards/s_ol/0xc_pad/keyboard.json index 4eb4bd9055..6623effb7a 100644 --- a/keyboards/s_ol/0xc_pad/keyboard.json +++ b/keyboards/s_ol/0xc_pad/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/salane/starryfrl/keyboard.json b/keyboards/salane/starryfrl/keyboard.json index fa8bd1224b..9ca8cf81bc 100644 --- a/keyboards/salane/starryfrl/keyboard.json +++ b/keyboards/salane/starryfrl/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true, diff --git a/keyboards/salicylic_acid3/7splus/keyboard.json b/keyboards/salicylic_acid3/7splus/keyboard.json index d04b8ad45b..aa04293c9c 100644 --- a/keyboards/salicylic_acid3/7splus/keyboard.json +++ b/keyboards/salicylic_acid3/7splus/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/salicylic_acid3/ajisai74/keyboard.json b/keyboards/salicylic_acid3/ajisai74/keyboard.json index 62d475d9df..c104c5a854 100644 --- a/keyboards/salicylic_acid3/ajisai74/keyboard.json +++ b/keyboards/salicylic_acid3/ajisai74/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/salicylic_acid3/ergoarrows/keyboard.json b/keyboards/salicylic_acid3/ergoarrows/keyboard.json index 122d2e0ee6..a5ad1de718 100644 --- a/keyboards/salicylic_acid3/ergoarrows/keyboard.json +++ b/keyboards/salicylic_acid3/ergoarrows/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/salicylic_acid3/guide68/keyboard.json b/keyboards/salicylic_acid3/guide68/keyboard.json index 8bdb68f8c1..b7e6a81d5c 100644 --- a/keyboards/salicylic_acid3/guide68/keyboard.json +++ b/keyboards/salicylic_acid3/guide68/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "rgblight": true, diff --git a/keyboards/salicylic_acid3/nafuda/keyboard.json b/keyboards/salicylic_acid3/nafuda/keyboard.json index 87dceed05f..e3c84885cf 100644 --- a/keyboards/salicylic_acid3/nafuda/keyboard.json +++ b/keyboards/salicylic_acid3/nafuda/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/salicylic_acid3/nknl7en/keyboard.json b/keyboards/salicylic_acid3/nknl7en/keyboard.json index 554430f6c4..c047a34b77 100644 --- a/keyboards/salicylic_acid3/nknl7en/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7en/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/salicylic_acid3/nknl7jp/keyboard.json b/keyboards/salicylic_acid3/nknl7jp/keyboard.json index b8a9196f88..496ac96a86 100644 --- a/keyboards/salicylic_acid3/nknl7jp/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7jp/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/sam/s80/keyboard.json b/keyboards/sam/s80/keyboard.json index 846ae198dd..ee2e7c2a5d 100644 --- a/keyboards/sam/s80/keyboard.json +++ b/keyboards/sam/s80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sam/sg81m/keyboard.json b/keyboards/sam/sg81m/keyboard.json index 4909a62569..f509504d0a 100644 --- a/keyboards/sam/sg81m/keyboard.json +++ b/keyboards/sam/sg81m/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sanctified/dystopia/keyboard.json b/keyboards/sanctified/dystopia/keyboard.json index a7ae1a8ebb..cebf255416 100644 --- a/keyboards/sanctified/dystopia/keyboard.json +++ b/keyboards/sanctified/dystopia/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/sandwich/keeb68/keyboard.json b/keyboards/sandwich/keeb68/keyboard.json index cb03d5a256..4d509d4a8b 100644 --- a/keyboards/sandwich/keeb68/keyboard.json +++ b/keyboards/sandwich/keeb68/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sapuseven/macropad12/keyboard.json b/keyboards/sapuseven/macropad12/keyboard.json index 28e8c19bf8..93f535215c 100644 --- a/keyboards/sapuseven/macropad12/keyboard.json +++ b/keyboards/sapuseven/macropad12/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sauce/mild/keyboard.json b/keyboards/sauce/mild/keyboard.json index 125fee6734..d2ecd024a1 100644 --- a/keyboards/sauce/mild/keyboard.json +++ b/keyboards/sauce/mild/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json index 7647131d9a..6035920a2f 100644 --- a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json index 360b42ead9..25d7e4ac52 100644 --- a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/sawnsprojects/plaque80/keyboard.json b/keyboards/sawnsprojects/plaque80/keyboard.json index 6e7784e090..623f1459f9 100644 --- a/keyboards/sawnsprojects/plaque80/keyboard.json +++ b/keyboards/sawnsprojects/plaque80/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/sawnsprojects/re65/keyboard.json b/keyboards/sawnsprojects/re65/keyboard.json index 04f050cfe5..a2d29894c3 100644 --- a/keyboards/sawnsprojects/re65/keyboard.json +++ b/keyboards/sawnsprojects/re65/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgblight": true, diff --git a/keyboards/sawnsprojects/satxri6key/keyboard.json b/keyboards/sawnsprojects/satxri6key/keyboard.json index 717ea2c1f4..3fc2f96eb0 100644 --- a/keyboards/sawnsprojects/satxri6key/keyboard.json +++ b/keyboards/sawnsprojects/satxri6key/keyboard.json @@ -83,7 +83,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/scatter42/keyboard.json b/keyboards/scatter42/keyboard.json index 7bb7a63ffe..16471f9e2b 100644 --- a/keyboards/scatter42/keyboard.json +++ b/keyboards/scatter42/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/scottokeebs/scotto34/keyboard.json b/keyboards/scottokeebs/scotto34/keyboard.json index ecf3fed933..8b0dee8694 100644 --- a/keyboards/scottokeebs/scotto34/keyboard.json +++ b/keyboards/scottokeebs/scotto34/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/scottokeebs/scotto69/keyboard.json b/keyboards/scottokeebs/scotto69/keyboard.json index 144e7b3a7e..48c145abc3 100644 --- a/keyboards/scottokeebs/scotto69/keyboard.json +++ b/keyboards/scottokeebs/scotto69/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/scottokeebs/scottowing/keyboard.json b/keyboards/scottokeebs/scottowing/keyboard.json index 770e2fd18e..41693bd7cc 100644 --- a/keyboards/scottokeebs/scottowing/keyboard.json +++ b/keyboards/scottokeebs/scottowing/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/75pixels/keyboard.json b/keyboards/sendyyeah/75pixels/keyboard.json index a9300bb19a..e72f6793a3 100644 --- a/keyboards/sendyyeah/75pixels/keyboard.json +++ b/keyboards/sendyyeah/75pixels/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/bevi/keyboard.json b/keyboards/sendyyeah/bevi/keyboard.json index e0c54f03db..2e59d930b3 100644 --- a/keyboards/sendyyeah/bevi/keyboard.json +++ b/keyboards/sendyyeah/bevi/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/pix/keyboard.json b/keyboards/sendyyeah/pix/keyboard.json index 6a9864cc35..d71fdff7c6 100644 --- a/keyboards/sendyyeah/pix/keyboard.json +++ b/keyboards/sendyyeah/pix/keyboard.json @@ -39,7 +39,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/senselessclay/ck60/keyboard.json b/keyboards/senselessclay/ck60/keyboard.json index 0208ea24bc..66f0dafba7 100644 --- a/keyboards/senselessclay/ck60/keyboard.json +++ b/keyboards/senselessclay/ck60/keyboard.json @@ -42,7 +42,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/ck65/keyboard.json b/keyboards/senselessclay/ck65/keyboard.json index 150479177d..b492cfa558 100644 --- a/keyboards/senselessclay/ck65/keyboard.json +++ b/keyboards/senselessclay/ck65/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/gos65/keyboard.json b/keyboards/senselessclay/gos65/keyboard.json index ee6bb5727a..f7f5ffa766 100644 --- a/keyboards/senselessclay/gos65/keyboard.json +++ b/keyboards/senselessclay/gos65/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/had60/keyboard.json b/keyboards/senselessclay/had60/keyboard.json index 03ace8014b..0dba4faf3c 100644 --- a/keyboards/senselessclay/had60/keyboard.json +++ b/keyboards/senselessclay/had60/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/sentraq/s60_x/default/keyboard.json b/keyboards/sentraq/s60_x/default/keyboard.json index 1f65b90775..799c5c16c0 100644 --- a/keyboards/sentraq/s60_x/default/keyboard.json +++ b/keyboards/sentraq/s60_x/default/keyboard.json @@ -3,7 +3,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/sentraq/s60_x/rgb/keyboard.json b/keyboards/sentraq/s60_x/rgb/keyboard.json index c2be7f4356..226f5eecb4 100644 --- a/keyboards/sentraq/s60_x/rgb/keyboard.json +++ b/keyboards/sentraq/s60_x/rgb/keyboard.json @@ -4,7 +4,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sentraq/s65_plus/keyboard.json b/keyboards/sentraq/s65_plus/keyboard.json index c3f8851144..afd14f8455 100644 --- a/keyboards/sentraq/s65_plus/keyboard.json +++ b/keyboards/sentraq/s65_plus/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/sentraq/s65_x/keyboard.json b/keyboards/sentraq/s65_x/keyboard.json index 0329d36a49..74f0aaffbd 100644 --- a/keyboards/sentraq/s65_x/keyboard.json +++ b/keyboards/sentraq/s65_x/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/sets3n/kk980/keyboard.json b/keyboards/sets3n/kk980/keyboard.json index 1589b0a7b4..1211f84f52 100644 --- a/keyboards/sets3n/kk980/keyboard.json +++ b/keyboards/sets3n/kk980/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sha/keyboard.json b/keyboards/sha/keyboard.json index 8bb4091843..5e7b2e3960 100644 --- a/keyboards/sha/keyboard.json +++ b/keyboards/sha/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shambles/keyboard.json b/keyboards/shambles/keyboard.json index 5f0e296ee8..157360237c 100644 --- a/keyboards/shambles/keyboard.json +++ b/keyboards/shambles/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/shandoncodes/flygone60/rev3/keyboard.json b/keyboards/shandoncodes/flygone60/rev3/keyboard.json index 6e2e62701f..04015cc488 100644 --- a/keyboards/shandoncodes/flygone60/rev3/keyboard.json +++ b/keyboards/shandoncodes/flygone60/rev3/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/shandoncodes/mino/hotswap/keyboard.json b/keyboards/shandoncodes/mino/hotswap/keyboard.json index 5bd0b933ce..52ed12f39b 100644 --- a/keyboards/shandoncodes/mino/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino/hotswap/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json index e06f1adf7d..b15a8e6316 100644 --- a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json index ef145046ef..b4c78ad28b 100644 --- a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shandoncodes/riot_pad/keyboard.json b/keyboards/shandoncodes/riot_pad/keyboard.json index 8a019115d3..d68a0da390 100644 --- a/keyboards/shandoncodes/riot_pad/keyboard.json +++ b/keyboards/shandoncodes/riot_pad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "nkro": true, "rgblight": true, "extrakey": true diff --git a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json index f98fd659c3..70b08ee880 100644 --- a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json index cfc24397e9..e739b3775a 100644 --- a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json index d6e42880ac..9686cb15c3 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shk9/keyboard.json b/keyboards/shk9/keyboard.json index 968f2d91f7..fc769aaec4 100644 --- a/keyboards/shk9/keyboard.json +++ b/keyboards/shk9/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/shoc/keyboard.json b/keyboards/shoc/keyboard.json index f044ab1b4e..5b98bb6dad 100644 --- a/keyboards/shoc/keyboard.json +++ b/keyboards/shoc/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/sidderskb/majbritt/rev2/keyboard.json b/keyboards/sidderskb/majbritt/rev2/keyboard.json index 69c24b08ab..0fcde53bc4 100644 --- a/keyboards/sidderskb/majbritt/rev2/keyboard.json +++ b/keyboards/sidderskb/majbritt/rev2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/singa/keyboard.json b/keyboards/singa/keyboard.json index ef9176211b..12962eedfe 100644 --- a/keyboards/singa/keyboard.json +++ b/keyboards/singa/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/skeletn87/hotswap/keyboard.json b/keyboards/skeletn87/hotswap/keyboard.json index f90716fcbf..663236018c 100644 --- a/keyboards/skeletn87/hotswap/keyboard.json +++ b/keyboards/skeletn87/hotswap/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/skeletn87/soldered/keyboard.json b/keyboards/skeletn87/soldered/keyboard.json index a50eeb8b68..22486837f7 100644 --- a/keyboards/skeletn87/soldered/keyboard.json +++ b/keyboards/skeletn87/soldered/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/skeletonkbd/frost68/keyboard.json b/keyboards/skeletonkbd/frost68/keyboard.json index 28b819e0d0..127c695aed 100644 --- a/keyboards/skeletonkbd/frost68/keyboard.json +++ b/keyboards/skeletonkbd/frost68/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skeletonkbd/skeletonnumpad/keyboard.json b/keyboards/skeletonkbd/skeletonnumpad/keyboard.json index cd007f81b6..4d6a7edea9 100644 --- a/keyboards/skeletonkbd/skeletonnumpad/keyboard.json +++ b/keyboards/skeletonkbd/skeletonnumpad/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/skme/zeno/keyboard.json b/keyboards/skme/zeno/keyboard.json index bbea513ed5..e5c7142cc9 100644 --- a/keyboards/skme/zeno/keyboard.json +++ b/keyboards/skme/zeno/keyboard.json @@ -20,7 +20,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/skmt/15k/keyboard.json b/keyboards/skmt/15k/keyboard.json index 9cf215f4d4..c16a970d1e 100644 --- a/keyboards/skmt/15k/keyboard.json +++ b/keyboards/skmt/15k/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skyloong/dt40/keyboard.json b/keyboards/skyloong/dt40/keyboard.json index a79b48289a..1f15227a19 100644 --- a/keyboards/skyloong/dt40/keyboard.json +++ b/keyboards/skyloong/dt40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skyloong/gk61/pro/keyboard.json b/keyboards/skyloong/gk61/pro/keyboard.json index 5a2302a92c..67fa3be066 100644 --- a/keyboards/skyloong/gk61/pro/keyboard.json +++ b/keyboards/skyloong/gk61/pro/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/skyloong/gk61/pro_48/keyboard.json b/keyboards/skyloong/gk61/pro_48/keyboard.json index 0c7065ec48..399de2f5b0 100644 --- a/keyboards/skyloong/gk61/pro_48/keyboard.json +++ b/keyboards/skyloong/gk61/pro_48/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/skyloong/gk61/v1/keyboard.json b/keyboards/skyloong/gk61/v1/keyboard.json index 0bafe1bd4e..3d93d6355e 100644 --- a/keyboards/skyloong/gk61/v1/keyboard.json +++ b/keyboards/skyloong/gk61/v1/keyboard.json @@ -10,7 +10,6 @@ "mousekey": true, "nkro": true, "command": false, - "console": false, "rgb_matrix": true }, "processor": "STM32F103", diff --git a/keyboards/skyloong/qk21/v1/keyboard.json b/keyboards/skyloong/qk21/v1/keyboard.json index 3f22fc0ccb..31f90acb52 100644 --- a/keyboards/skyloong/qk21/v1/keyboard.json +++ b/keyboards/skyloong/qk21/v1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/slz40/keyboard.json b/keyboards/slz40/keyboard.json index 138c7d21cf..ba67dc7fc1 100644 --- a/keyboards/slz40/keyboard.json +++ b/keyboards/slz40/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/smithrune/iron180v2/v2h/keyboard.json b/keyboards/smithrune/iron180v2/v2h/keyboard.json index cf2d7163ed..fae25b8c65 100644 --- a/keyboards/smithrune/iron180v2/v2h/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2h/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/smithrune/iron180v2/v2s/keyboard.json b/keyboards/smithrune/iron180v2/v2s/keyboard.json index 2e21e17f28..3489d8f177 100644 --- a/keyboards/smithrune/iron180v2/v2s/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2s/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/smithrune/magnus/m75h/keyboard.json b/keyboards/smithrune/magnus/m75h/keyboard.json index c8b2e47069..4b5c0974c1 100644 --- a/keyboards/smithrune/magnus/m75h/keyboard.json +++ b/keyboards/smithrune/magnus/m75h/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/smithrune/magnus/m75s/keyboard.json b/keyboards/smithrune/magnus/m75s/keyboard.json index a678c7eeaa..911f3ff7d8 100644 --- a/keyboards/smithrune/magnus/m75s/keyboard.json +++ b/keyboards/smithrune/magnus/m75s/keyboard.json @@ -19,7 +19,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/smk60/keyboard.json b/keyboards/smk60/keyboard.json index 13c81a21de..484b76ad05 100644 --- a/keyboards/smk60/keyboard.json +++ b/keyboards/smk60/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/smoll/lefty/info.json b/keyboards/smoll/lefty/info.json index c34e264176..0cfe860ded 100644 --- a/keyboards/smoll/lefty/info.json +++ b/keyboards/smoll/lefty/info.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/sneakbox/aliceclone/keyboard.json b/keyboards/sneakbox/aliceclone/keyboard.json index bb0cd8e4b8..0cde1275c4 100644 --- a/keyboards/sneakbox/aliceclone/keyboard.json +++ b/keyboards/sneakbox/aliceclone/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/aliceclonergb/keyboard.json b/keyboards/sneakbox/aliceclonergb/keyboard.json index be3d48fa87..539404b338 100644 --- a/keyboards/sneakbox/aliceclonergb/keyboard.json +++ b/keyboards/sneakbox/aliceclonergb/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/ava/keyboard.json b/keyboards/sneakbox/ava/keyboard.json index 41712f7e95..94369ad467 100644 --- a/keyboards/sneakbox/ava/keyboard.json +++ b/keyboards/sneakbox/ava/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/disarray/ortho/keyboard.json b/keyboards/sneakbox/disarray/ortho/keyboard.json index 31a201e0d2..994b0cd115 100644 --- a/keyboards/sneakbox/disarray/ortho/keyboard.json +++ b/keyboards/sneakbox/disarray/ortho/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/disarray/staggered/keyboard.json b/keyboards/sneakbox/disarray/staggered/keyboard.json index 4631795130..a03c80948c 100644 --- a/keyboards/sneakbox/disarray/staggered/keyboard.json +++ b/keyboards/sneakbox/disarray/staggered/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/soup10/keyboard.json b/keyboards/soup10/keyboard.json index f4e1947652..df8cfcc2c4 100644 --- a/keyboards/soup10/keyboard.json +++ b/keyboards/soup10/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/sowbug/68keys/keyboard.json b/keyboards/sowbug/68keys/keyboard.json index 7143f341b5..e031da1bb9 100644 --- a/keyboards/sowbug/68keys/keyboard.json +++ b/keyboards/sowbug/68keys/keyboard.json @@ -64,7 +64,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sowbug/ansi_tkl/keyboard.json b/keyboards/sowbug/ansi_tkl/keyboard.json index 837e08a59e..9cbc13dce0 100644 --- a/keyboards/sowbug/ansi_tkl/keyboard.json +++ b/keyboards/sowbug/ansi_tkl/keyboard.json @@ -64,7 +64,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/soy20/keyboard.json b/keyboards/soy20/keyboard.json index 3a61743326..901aa9e868 100644 --- a/keyboards/soy20/keyboard.json +++ b/keyboards/soy20/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/spaceholdings/nebula12b/keyboard.json b/keyboards/spaceholdings/nebula12b/keyboard.json index 38320bd1ea..f9e9b960d7 100755 --- a/keyboards/spaceholdings/nebula12b/keyboard.json +++ b/keyboards/spaceholdings/nebula12b/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/spaceholdings/nebula68b/info.json b/keyboards/spaceholdings/nebula68b/info.json index b41a21f971..9c8274a8ed 100644 --- a/keyboards/spaceholdings/nebula68b/info.json +++ b/keyboards/spaceholdings/nebula68b/info.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sparrow62/keyboard.json b/keyboards/sparrow62/keyboard.json index 96447b6a36..e9c83a0356 100644 --- a/keyboards/sparrow62/keyboard.json +++ b/keyboards/sparrow62/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/splitish/keyboard.json b/keyboards/splitish/keyboard.json index 9b9701a853..986a08709f 100644 --- a/keyboards/splitish/keyboard.json +++ b/keyboards/splitish/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/splitography/keyboard.json b/keyboards/splitography/keyboard.json index 947622096c..698ded2e95 100644 --- a/keyboards/splitography/keyboard.json +++ b/keyboards/splitography/keyboard.json @@ -10,7 +10,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "console": false, "command": false }, "qmk": { diff --git a/keyboards/sporewoh/banime40/keyboard.json b/keyboards/sporewoh/banime40/keyboard.json index dfe71070a1..62a814e1c2 100644 --- a/keyboards/sporewoh/banime40/keyboard.json +++ b/keyboards/sporewoh/banime40/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/star75/keyboard.json b/keyboards/star75/keyboard.json index e4ea684a0f..155481d753 100644 --- a/keyboards/star75/keyboard.json +++ b/keyboards/star75/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/stello65/beta/keyboard.json b/keyboards/stello65/beta/keyboard.json index d6bf574b9a..e8c23a1d4d 100644 --- a/keyboards/stello65/beta/keyboard.json +++ b/keyboards/stello65/beta/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/stello65/hs_rev1/keyboard.json b/keyboards/stello65/hs_rev1/keyboard.json index bf502de563..ec5db7023e 100644 --- a/keyboards/stello65/hs_rev1/keyboard.json +++ b/keyboards/stello65/hs_rev1/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/stello65/sl_rev1/keyboard.json b/keyboards/stello65/sl_rev1/keyboard.json index e8ac4ea7de..453fe742c4 100644 --- a/keyboards/stello65/sl_rev1/keyboard.json +++ b/keyboards/stello65/sl_rev1/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json index 03466935b0..eeadba9390 100644 --- a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json index 1ca94185ab..e54f31703f 100644 --- a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json index efe3b979be..2ed5532bda 100644 --- a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/sthlmkb/lagom/keyboard.json b/keyboards/sthlmkb/lagom/keyboard.json index e30455109d..423605b17f 100644 --- a/keyboards/sthlmkb/lagom/keyboard.json +++ b/keyboards/sthlmkb/lagom/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "debug": false, "mousekey": false, diff --git a/keyboards/sthlmkb/litl/keyboard.json b/keyboards/sthlmkb/litl/keyboard.json index 50960dd6d0..d9208b53f1 100644 --- a/keyboards/sthlmkb/litl/keyboard.json +++ b/keyboards/sthlmkb/litl/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "debug": false, "mousekey": false, diff --git a/keyboards/stratos/keyboard.json b/keyboards/stratos/keyboard.json index 20a057ba88..984f488ebd 100644 --- a/keyboards/stratos/keyboard.json +++ b/keyboards/stratos/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/strech/soulstone/keyboard.json b/keyboards/strech/soulstone/keyboard.json index 32671eba11..27773b88f2 100644 --- a/keyboards/strech/soulstone/keyboard.json +++ b/keyboards/strech/soulstone/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/stront/keyboard.json b/keyboards/stront/keyboard.json index 573730a12b..250d5b56e1 100644 --- a/keyboards/stront/keyboard.json +++ b/keyboards/stront/keyboard.json @@ -85,7 +85,6 @@ "features": { "backlight": true, "bootmagic": true, - "console": false, "encoder": true, "extrakey": true, "nkro": false, diff --git a/keyboards/studiokestra/bourgeau/keyboard.json b/keyboards/studiokestra/bourgeau/keyboard.json index 3e0111a618..22e4235415 100644 --- a/keyboards/studiokestra/bourgeau/keyboard.json +++ b/keyboards/studiokestra/bourgeau/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/studiokestra/cascade/keyboard.json b/keyboards/studiokestra/cascade/keyboard.json index 8e7673da0e..b6a11688c2 100644 --- a/keyboards/studiokestra/cascade/keyboard.json +++ b/keyboards/studiokestra/cascade/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/studiokestra/fairholme/keyboard.json b/keyboards/studiokestra/fairholme/keyboard.json index f789c2059b..13170ce65c 100644 --- a/keyboards/studiokestra/fairholme/keyboard.json +++ b/keyboards/studiokestra/fairholme/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/studiokestra/frl84/keyboard.json b/keyboards/studiokestra/frl84/keyboard.json index 3bb51c7606..c4dda59ddd 100644 --- a/keyboards/studiokestra/frl84/keyboard.json +++ b/keyboards/studiokestra/frl84/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/galatea/rev1/keyboard.json b/keyboards/studiokestra/galatea/rev1/keyboard.json index 320b381e82..63a073fc56 100644 --- a/keyboards/studiokestra/galatea/rev1/keyboard.json +++ b/keyboards/studiokestra/galatea/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/studiokestra/galatea/rev2/keyboard.json b/keyboards/studiokestra/galatea/rev2/keyboard.json index 6d59e14e64..fa2911a7eb 100644 --- a/keyboards/studiokestra/galatea/rev2/keyboard.json +++ b/keyboards/studiokestra/galatea/rev2/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/galatea/rev3/keyboard.json b/keyboards/studiokestra/galatea/rev3/keyboard.json index 1b948f426d..d5dd8e3e87 100644 --- a/keyboards/studiokestra/galatea/rev3/keyboard.json +++ b/keyboards/studiokestra/galatea/rev3/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/line_friends_tkl/keyboard.json b/keyboards/studiokestra/line_friends_tkl/keyboard.json index d8902e2a2f..d7e050315d 100644 --- a/keyboards/studiokestra/line_friends_tkl/keyboard.json +++ b/keyboards/studiokestra/line_friends_tkl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/subatomic/keyboard.json b/keyboards/subatomic/keyboard.json index 20313a1318..a69e18efa2 100644 --- a/keyboards/subatomic/keyboard.json +++ b/keyboards/subatomic/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/subrezon/la_nc/keyboard.json b/keyboards/subrezon/la_nc/keyboard.json index 471bf09051..9a9a511fbf 100644 --- a/keyboards/subrezon/la_nc/keyboard.json +++ b/keyboards/subrezon/la_nc/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/subrezon/lancer/keyboard.json b/keyboards/subrezon/lancer/keyboard.json index cf678c84bc..43e80edff1 100644 --- a/keyboards/subrezon/lancer/keyboard.json +++ b/keyboards/subrezon/lancer/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/suikagiken/suika15tone/keyboard.json b/keyboards/suikagiken/suika15tone/keyboard.json index de3c8f33f3..985c3f9845 100644 --- a/keyboards/suikagiken/suika15tone/keyboard.json +++ b/keyboards/suikagiken/suika15tone/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "midi": true, "mousekey": true, diff --git a/keyboards/suikagiken/suika27melo/keyboard.json b/keyboards/suikagiken/suika27melo/keyboard.json index cba2561129..8b58362db1 100644 --- a/keyboards/suikagiken/suika27melo/keyboard.json +++ b/keyboards/suikagiken/suika27melo/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "midi": true, "mousekey": true, diff --git a/keyboards/suikagiken/suika83opti/keyboard.json b/keyboards/suikagiken/suika83opti/keyboard.json index d9876434fe..b3b8a975bc 100644 --- a/keyboards/suikagiken/suika83opti/keyboard.json +++ b/keyboards/suikagiken/suika83opti/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/suikagiken/suika85ergo/keyboard.json b/keyboards/suikagiken/suika85ergo/keyboard.json index e0514dfab8..0bca9ab578 100644 --- a/keyboards/suikagiken/suika85ergo/keyboard.json +++ b/keyboards/suikagiken/suika85ergo/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/supersplit/keyboard.json b/keyboards/supersplit/keyboard.json index 3950d2bbce..efce5060d9 100644 --- a/keyboards/supersplit/keyboard.json +++ b/keyboards/supersplit/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/superuser/ext/keyboard.json b/keyboards/superuser/ext/keyboard.json index 5a0ac65d64..f0aebb6514 100644 --- a/keyboards/superuser/ext/keyboard.json +++ b/keyboards/superuser/ext/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/superuser/frl/keyboard.json b/keyboards/superuser/frl/keyboard.json index d540622b69..e02d785a7c 100644 --- a/keyboards/superuser/frl/keyboard.json +++ b/keyboards/superuser/frl/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/superuser/tkl/keyboard.json b/keyboards/superuser/tkl/keyboard.json index ecf8dc713b..8c947d33d0 100644 --- a/keyboards/superuser/tkl/keyboard.json +++ b/keyboards/superuser/tkl/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/swiftrax/retropad/keyboard.json b/keyboards/swiftrax/retropad/keyboard.json index c8dd0e3327..97ffc5b6fe 100644 --- a/keyboards/swiftrax/retropad/keyboard.json +++ b/keyboards/swiftrax/retropad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/swiss/keyboard.json b/keyboards/swiss/keyboard.json index 74f9ff23e3..5d40df4225 100644 --- a/keyboards/swiss/keyboard.json +++ b/keyboards/swiss/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/switchplate/southpaw_fullsize/keyboard.json b/keyboards/switchplate/southpaw_fullsize/keyboard.json index 9f61bc9abc..96724e5870 100644 --- a/keyboards/switchplate/southpaw_fullsize/keyboard.json +++ b/keyboards/switchplate/southpaw_fullsize/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/switchplate/switchplate910/keyboard.json b/keyboards/switchplate/switchplate910/keyboard.json index 43150834f5..f9c3d8eaf1 100644 --- a/keyboards/switchplate/switchplate910/keyboard.json +++ b/keyboards/switchplate/switchplate910/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/synthandkeys/bento_box/keyboard.json b/keyboards/synthandkeys/bento_box/keyboard.json index 3fb784da75..90dbc71a1f 100644 --- a/keyboards/synthandkeys/bento_box/keyboard.json +++ b/keyboards/synthandkeys/bento_box/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/synthandkeys/the_debit_card/keyboard.json b/keyboards/synthandkeys/the_debit_card/keyboard.json index 1d3798291b..95a74a5138 100644 --- a/keyboards/synthandkeys/the_debit_card/keyboard.json +++ b/keyboards/synthandkeys/the_debit_card/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/synthlabs/060/keyboard.json b/keyboards/synthlabs/060/keyboard.json index 1094d430e6..70437bb4aa 100644 --- a/keyboards/synthlabs/060/keyboard.json +++ b/keyboards/synthlabs/060/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/synthlabs/065/keyboard.json b/keyboards/synthlabs/065/keyboard.json index d8d0d96c3f..575fc18b58 100644 --- a/keyboards/synthlabs/065/keyboard.json +++ b/keyboards/synthlabs/065/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/synthlabs/solo/keyboard.json b/keyboards/synthlabs/solo/keyboard.json index 1aedf98185..da17217ad3 100644 --- a/keyboards/synthlabs/solo/keyboard.json +++ b/keyboards/synthlabs/solo/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tacworks/tac_k1/keyboard.json b/keyboards/tacworks/tac_k1/keyboard.json index cf098291be..9c4463bb53 100644 --- a/keyboards/tacworks/tac_k1/keyboard.json +++ b/keyboards/tacworks/tac_k1/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/baumkuchen/keyboard.json b/keyboards/takashicompany/baumkuchen/keyboard.json index 2cb3566703..946238ab1d 100644 --- a/keyboards/takashicompany/baumkuchen/keyboard.json +++ b/keyboards/takashicompany/baumkuchen/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/center_enter/keyboard.json b/keyboards/takashicompany/center_enter/keyboard.json index 7d660eaca8..7780f014d8 100644 --- a/keyboards/takashicompany/center_enter/keyboard.json +++ b/keyboards/takashicompany/center_enter/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/ejectix/keyboard.json b/keyboards/takashicompany/ejectix/keyboard.json index 4767be03a6..e4597fc642 100644 --- a/keyboards/takashicompany/ejectix/keyboard.json +++ b/keyboards/takashicompany/ejectix/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/endzone34/keyboard.json b/keyboards/takashicompany/endzone34/keyboard.json index 3549d2c089..a54fe8a88d 100644 --- a/keyboards/takashicompany/endzone34/keyboard.json +++ b/keyboards/takashicompany/endzone34/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/takashicompany/ergomirage/keyboard.json b/keyboards/takashicompany/ergomirage/keyboard.json index 9bcff45e76..6527e24c87 100644 --- a/keyboards/takashicompany/ergomirage/keyboard.json +++ b/keyboards/takashicompany/ergomirage/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/goat51/keyboard.json b/keyboards/takashicompany/goat51/keyboard.json index 8ef4c54343..562b9d10b0 100644 --- a/keyboards/takashicompany/goat51/keyboard.json +++ b/keyboards/takashicompany/goat51/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/jourkey/keyboard.json b/keyboards/takashicompany/jourkey/keyboard.json index 4201969219..7ea3fad083 100644 --- a/keyboards/takashicompany/jourkey/keyboard.json +++ b/keyboards/takashicompany/jourkey/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/klec_01/keyboard.json b/keyboards/takashicompany/klec_01/keyboard.json index b04f43ed1f..137201d560 100644 --- a/keyboards/takashicompany/klec_01/keyboard.json +++ b/keyboards/takashicompany/klec_01/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/klec_02/keyboard.json b/keyboards/takashicompany/klec_02/keyboard.json index 22cea40ec7..751144aa3b 100644 --- a/keyboards/takashicompany/klec_02/keyboard.json +++ b/keyboards/takashicompany/klec_02/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/minidivide/keyboard.json b/keyboards/takashicompany/minidivide/keyboard.json index 5ac4dd7e9b..4ccbed98b3 100644 --- a/keyboards/takashicompany/minidivide/keyboard.json +++ b/keyboards/takashicompany/minidivide/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/minidivide_max/keyboard.json b/keyboards/takashicompany/minidivide_max/keyboard.json index 73f941c896..679000cafe 100644 --- a/keyboards/takashicompany/minidivide_max/keyboard.json +++ b/keyboards/takashicompany/minidivide_max/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/palmslave/keyboard.json b/keyboards/takashicompany/palmslave/keyboard.json index 4b452d678a..3a1ea6ed91 100644 --- a/keyboards/takashicompany/palmslave/keyboard.json +++ b/keyboards/takashicompany/palmslave/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/qoolee/keyboard.json b/keyboards/takashicompany/qoolee/keyboard.json index bce2335293..011f9e5e42 100644 --- a/keyboards/takashicompany/qoolee/keyboard.json +++ b/keyboards/takashicompany/qoolee/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/radialex/keyboard.json b/keyboards/takashicompany/radialex/keyboard.json index 34ef3d2f1f..c4f991f393 100644 --- a/keyboards/takashicompany/radialex/keyboard.json +++ b/keyboards/takashicompany/radialex/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/takashicompany/rookey/keyboard.json b/keyboards/takashicompany/rookey/keyboard.json index 9473345409..22903a5bab 100644 --- a/keyboards/takashicompany/rookey/keyboard.json +++ b/keyboards/takashicompany/rookey/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/tightwriter/keyboard.json b/keyboards/takashicompany/tightwriter/keyboard.json index c3684d9cf6..a3388c0574 100644 --- a/keyboards/takashicompany/tightwriter/keyboard.json +++ b/keyboards/takashicompany/tightwriter/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/taleguers/taleguers75/keyboard.json b/keyboards/taleguers/taleguers75/keyboard.json index 0798ea9637..853b1747eb 100644 --- a/keyboards/taleguers/taleguers75/keyboard.json +++ b/keyboards/taleguers/taleguers75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tanuki/keyboard.json b/keyboards/tanuki/keyboard.json index 2bc01addb6..dc9affe3a7 100644 --- a/keyboards/tanuki/keyboard.json +++ b/keyboards/tanuki/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/teahouse/ayleen/keyboard.json b/keyboards/teahouse/ayleen/keyboard.json index 4b64ba96d1..55a795d09c 100644 --- a/keyboards/teahouse/ayleen/keyboard.json +++ b/keyboards/teahouse/ayleen/keyboard.json @@ -10,7 +10,6 @@ "rgblight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/team0110/p1800fl/keyboard.json b/keyboards/team0110/p1800fl/keyboard.json index 681482db5b..621f5821c3 100644 --- a/keyboards/team0110/p1800fl/keyboard.json +++ b/keyboards/team0110/p1800fl/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/teleport/native/info.json b/keyboards/teleport/native/info.json index 756764ff6f..d3630a0ee3 100644 --- a/keyboards/teleport/native/info.json +++ b/keyboards/teleport/native/info.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/teleport/numpad/keyboard.json b/keyboards/teleport/numpad/keyboard.json index ace8e949e0..572f01fd26 100644 --- a/keyboards/teleport/numpad/keyboard.json +++ b/keyboards/teleport/numpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/teleport/tkl/keyboard.json b/keyboards/teleport/tkl/keyboard.json index 9fb88acb74..6d16d8a9e7 100644 --- a/keyboards/teleport/tkl/keyboard.json +++ b/keyboards/teleport/tkl/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tempo_turtle/bradpad/keyboard.json b/keyboards/tempo_turtle/bradpad/keyboard.json index 374dbeaaaf..e8a86526d6 100644 --- a/keyboards/tempo_turtle/bradpad/keyboard.json +++ b/keyboards/tempo_turtle/bradpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tender/macrowo_pad/keyboard.json b/keyboards/tender/macrowo_pad/keyboard.json index 53e22289f6..680fe6b13b 100644 --- a/keyboards/tender/macrowo_pad/keyboard.json +++ b/keyboards/tender/macrowo_pad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/tenki/keyboard.json b/keyboards/tenki/keyboard.json index 628e2068ba..b90c61470f 100644 --- a/keyboards/tenki/keyboard.json +++ b/keyboards/tenki/keyboard.json @@ -33,7 +33,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/terrazzo/keyboard.json b/keyboards/terrazzo/keyboard.json index d2ea20b51a..735ccf19ec 100644 --- a/keyboards/terrazzo/keyboard.json +++ b/keyboards/terrazzo/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "led_matrix": true, diff --git a/keyboards/tetris/keyboard.json b/keyboards/tetris/keyboard.json index 3702172518..eae9c39ec4 100644 --- a/keyboards/tetris/keyboard.json +++ b/keyboards/tetris/keyboard.json @@ -35,7 +35,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tg4x/keyboard.json b/keyboards/tg4x/keyboard.json index 31c16ee08d..93c620393e 100644 --- a/keyboards/tg4x/keyboard.json +++ b/keyboards/tg4x/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/tgr/910/keyboard.json b/keyboards/tgr/910/keyboard.json index 7277c89b38..dad6cb8bd0 100644 --- a/keyboards/tgr/910/keyboard.json +++ b/keyboards/tgr/910/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/tgr/910ce/keyboard.json b/keyboards/tgr/910ce/keyboard.json index 088eed218b..4df67dfc2d 100644 --- a/keyboards/tgr/910ce/keyboard.json +++ b/keyboards/tgr/910ce/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/tgr/alice/keyboard.json b/keyboards/tgr/alice/keyboard.json index 83902990d1..c477d52e04 100644 --- a/keyboards/tgr/alice/keyboard.json +++ b/keyboards/tgr/alice/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/tgr/jane/v2/keyboard.json b/keyboards/tgr/jane/v2/keyboard.json index efa3a88b3f..3028064cd1 100644 --- a/keyboards/tgr/jane/v2/keyboard.json +++ b/keyboards/tgr/jane/v2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/tgr/jane/v2ce/keyboard.json b/keyboards/tgr/jane/v2ce/keyboard.json index 62f6a37857..66dcb9fd25 100644 --- a/keyboards/tgr/jane/v2ce/keyboard.json +++ b/keyboards/tgr/jane/v2ce/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/tgr/tris/keyboard.json b/keyboards/tgr/tris/keyboard.json index 5ce2fbe568..13f2eef8a1 100644 --- a/keyboards/tgr/tris/keyboard.json +++ b/keyboards/tgr/tris/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/the_royal/liminal/keyboard.json b/keyboards/the_royal/liminal/keyboard.json index 66a61eceea..2023a8b6e1 100644 --- a/keyboards/the_royal/liminal/keyboard.json +++ b/keyboards/the_royal/liminal/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/the_royal/schwann/keyboard.json b/keyboards/the_royal/schwann/keyboard.json index 800d45b83a..0db2bc2075 100644 --- a/keyboards/the_royal/schwann/keyboard.json +++ b/keyboards/the_royal/schwann/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json b/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json index c67262c562..151ec83173 100644 --- a/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json +++ b/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/noodlepad/info.json b/keyboards/themadnoodle/noodlepad/info.json index 8ad698df38..dde8ae08a7 100644 --- a/keyboards/themadnoodle/noodlepad/info.json +++ b/keyboards/themadnoodle/noodlepad/info.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/noodlepad_micro/keyboard.json b/keyboards/themadnoodle/noodlepad_micro/keyboard.json index fe7ab9ea75..c20b70493c 100644 --- a/keyboards/themadnoodle/noodlepad_micro/keyboard.json +++ b/keyboards/themadnoodle/noodlepad_micro/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/udon13/keyboard.json b/keyboards/themadnoodle/udon13/keyboard.json index b0ece11612..10d4bff834 100644 --- a/keyboards/themadnoodle/udon13/keyboard.json +++ b/keyboards/themadnoodle/udon13/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "encoder": true, "mousekey": true, diff --git a/keyboards/theone/keyboard.json b/keyboards/theone/keyboard.json index 3b4fc99d05..a2eff3c015 100644 --- a/keyboards/theone/keyboard.json +++ b/keyboards/theone/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/thepanduuh/degenpad/keyboard.json b/keyboards/thepanduuh/degenpad/keyboard.json index 7a0edc2124..9fa02bae90 100644 --- a/keyboards/thepanduuh/degenpad/keyboard.json +++ b/keyboards/thepanduuh/degenpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/thevankeyboards/jetvan/keyboard.json b/keyboards/thevankeyboards/jetvan/keyboard.json index e8a8605bf6..4d73b04537 100644 --- a/keyboards/thevankeyboards/jetvan/keyboard.json +++ b/keyboards/thevankeyboards/jetvan/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/thevankeyboards/minivan/keyboard.json b/keyboards/thevankeyboards/minivan/keyboard.json index 554cbe0154..547762a7f4 100644 --- a/keyboards/thevankeyboards/minivan/keyboard.json +++ b/keyboards/thevankeyboards/minivan/keyboard.json @@ -17,7 +17,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/thevankeyboards/roadkit/keyboard.json b/keyboards/thevankeyboards/roadkit/keyboard.json index a5ad593cc2..b6933d677d 100644 --- a/keyboards/thevankeyboards/roadkit/keyboard.json +++ b/keyboards/thevankeyboards/roadkit/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tkc/california/keyboard.json b/keyboards/tkc/california/keyboard.json index 5052b48f92..304e9fcb8e 100644 --- a/keyboards/tkc/california/keyboard.json +++ b/keyboards/tkc/california/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tkc/candybar/lefty/keyboard.json b/keyboards/tkc/candybar/lefty/keyboard.json index 988338a095..46aeefcde3 100644 --- a/keyboards/tkc/candybar/lefty/keyboard.json +++ b/keyboards/tkc/candybar/lefty/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/lefty_r3/keyboard.json b/keyboards/tkc/candybar/lefty_r3/keyboard.json index 22ddc2f125..fc18aa46fe 100644 --- a/keyboards/tkc/candybar/lefty_r3/keyboard.json +++ b/keyboards/tkc/candybar/lefty_r3/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/righty/keyboard.json b/keyboards/tkc/candybar/righty/keyboard.json index 1f10532a78..e351ffd293 100644 --- a/keyboards/tkc/candybar/righty/keyboard.json +++ b/keyboards/tkc/candybar/righty/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/righty_r3/keyboard.json b/keyboards/tkc/candybar/righty_r3/keyboard.json index 81da5f1e20..15c52701bc 100644 --- a/keyboards/tkc/candybar/righty_r3/keyboard.json +++ b/keyboards/tkc/candybar/righty_r3/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/godspeed75/keyboard.json b/keyboards/tkc/godspeed75/keyboard.json index b078a09efd..9d823c0cf8 100644 --- a/keyboards/tkc/godspeed75/keyboard.json +++ b/keyboards/tkc/godspeed75/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tkc/portico68v2/keyboard.json b/keyboards/tkc/portico68v2/keyboard.json index 5b9e5e3324..087713f3a2 100644 --- a/keyboards/tkc/portico68v2/keyboard.json +++ b/keyboards/tkc/portico68v2/keyboard.json @@ -62,7 +62,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tkc/tkc1800/keyboard.json b/keyboards/tkc/tkc1800/keyboard.json index 1b98e8e090..49c56735e4 100644 --- a/keyboards/tkc/tkc1800/keyboard.json +++ b/keyboards/tkc/tkc1800/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tkc/tkl_ab87/keyboard.json b/keyboards/tkc/tkl_ab87/keyboard.json index c8f9631827..a7bbbc3664 100644 --- a/keyboards/tkc/tkl_ab87/keyboard.json +++ b/keyboards/tkc/tkl_ab87/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tmo50/keyboard.json b/keyboards/tmo50/keyboard.json index 5398595d56..c7d9170894 100644 --- a/keyboards/tmo50/keyboard.json +++ b/keyboards/tmo50/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/toad/keyboard.json b/keyboards/toad/keyboard.json index 52b7c26387..b8177692cc 100644 --- a/keyboards/toad/keyboard.json +++ b/keyboards/toad/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/toffee_studio/blueberry/keyboard.json b/keyboards/toffee_studio/blueberry/keyboard.json index 1b2308c3da..56b0bf2201 100644 --- a/keyboards/toffee_studio/blueberry/keyboard.json +++ b/keyboards/toffee_studio/blueberry/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tokyokeyboard/tokyo60/keyboard.json b/keyboards/tokyokeyboard/tokyo60/keyboard.json index b590946a3a..90734f16af 100644 --- a/keyboards/tokyokeyboard/tokyo60/keyboard.json +++ b/keyboards/tokyokeyboard/tokyo60/keyboard.json @@ -13,7 +13,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/tominabox1/adalyn/keyboard.json b/keyboards/tominabox1/adalyn/keyboard.json index 113ef690ed..ea05cffa88 100644 --- a/keyboards/tominabox1/adalyn/keyboard.json +++ b/keyboards/tominabox1/adalyn/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tominabox1/bigboy/keyboard.json b/keyboards/tominabox1/bigboy/keyboard.json index 4862e216df..4e00f6d65a 100644 --- a/keyboards/tominabox1/bigboy/keyboard.json +++ b/keyboards/tominabox1/bigboy/keyboard.json @@ -36,7 +36,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tominabox1/qaz/keyboard.json b/keyboards/tominabox1/qaz/keyboard.json index 9e3ea95ad4..d7df86716d 100644 --- a/keyboards/tominabox1/qaz/keyboard.json +++ b/keyboards/tominabox1/qaz/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tr60w/keyboard.json b/keyboards/tr60w/keyboard.json index dcfc8f48d6..aadc568626 100644 --- a/keyboards/tr60w/keyboard.json +++ b/keyboards/tr60w/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/trainpad/keyboard.json b/keyboards/trainpad/keyboard.json index 346fd54027..79b80b04ce 100644 --- a/keyboards/trainpad/keyboard.json +++ b/keyboards/trainpad/keyboard.json @@ -11,7 +11,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false }, diff --git a/keyboards/trashman/ketch/keyboard.json b/keyboards/trashman/ketch/keyboard.json index 8f0a638e63..3db7f58ad9 100644 --- a/keyboards/trashman/ketch/keyboard.json +++ b/keyboards/trashman/ketch/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/treasure/type9s2/keyboard.json b/keyboards/treasure/type9s2/keyboard.json index 94cc0dec95..dd43c38e8b 100644 --- a/keyboards/treasure/type9s2/keyboard.json +++ b/keyboards/treasure/type9s2/keyboard.json @@ -15,7 +15,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/treasure/type9s3/keyboard.json b/keyboards/treasure/type9s3/keyboard.json index 350746e00c..a285925a46 100644 --- a/keyboards/treasure/type9s3/keyboard.json +++ b/keyboards/treasure/type9s3/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/trkeyboards/trk1/keyboard.json b/keyboards/trkeyboards/trk1/keyboard.json index c3190a5eee..851ba638e9 100644 --- a/keyboards/trkeyboards/trk1/keyboard.json +++ b/keyboards/trkeyboards/trk1/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/trnthsn/e8ghty/info.json b/keyboards/trnthsn/e8ghty/info.json index bce77e0a5f..47460abb8d 100644 --- a/keyboards/trnthsn/e8ghty/info.json +++ b/keyboards/trnthsn/e8ghty/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/e8ghtyneo/info.json b/keyboards/trnthsn/e8ghtyneo/info.json index eb1244c9cb..e393624ecf 100644 --- a/keyboards/trnthsn/e8ghtyneo/info.json +++ b/keyboards/trnthsn/e8ghtyneo/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/s6xty/keyboard.json b/keyboards/trnthsn/s6xty/keyboard.json index ef1f5113bf..e6c9a1c359 100644 --- a/keyboards/trnthsn/s6xty/keyboard.json +++ b/keyboards/trnthsn/s6xty/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/s6xty5neor2/info.json b/keyboards/trnthsn/s6xty5neor2/info.json index 47f09623cc..ca2869778c 100644 --- a/keyboards/trnthsn/s6xty5neor2/info.json +++ b/keyboards/trnthsn/s6xty5neor2/info.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trojan_pinata/model_b/rev0/keyboard.json b/keyboards/trojan_pinata/model_b/rev0/keyboard.json index 82d712d6fc..20b89fb71c 100644 --- a/keyboards/trojan_pinata/model_b/rev0/keyboard.json +++ b/keyboards/trojan_pinata/model_b/rev0/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tunks/ergo33/keyboard.json b/keyboards/tunks/ergo33/keyboard.json index 2bace9cf00..85304d6153 100644 --- a/keyboards/tunks/ergo33/keyboard.json +++ b/keyboards/tunks/ergo33/keyboard.json @@ -28,7 +28,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tweetydabird/lbs4/keyboard.json b/keyboards/tweetydabird/lbs4/keyboard.json index e223289a3c..709a1a875d 100644 --- a/keyboards/tweetydabird/lbs4/keyboard.json +++ b/keyboards/tweetydabird/lbs4/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/tweetydabird/lbs6/keyboard.json b/keyboards/tweetydabird/lbs6/keyboard.json index 57be9289f8..3e5e3e5ef3 100644 --- a/keyboards/tweetydabird/lbs6/keyboard.json +++ b/keyboards/tweetydabird/lbs6/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/tweetydabird/lotus58/info.json b/keyboards/tweetydabird/lotus58/info.json index 2c3f85cdd9..dfc75fe407 100644 --- a/keyboards/tweetydabird/lotus58/info.json +++ b/keyboards/tweetydabird/lotus58/info.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ubest/vn/keyboard.json b/keyboards/ubest/vn/keyboard.json index 477c16fb96..c44824a95b 100644 --- a/keyboards/ubest/vn/keyboard.json +++ b/keyboards/ubest/vn/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/uk78/keyboard.json b/keyboards/uk78/keyboard.json index ea1e030b2c..1a9bbb689d 100644 --- a/keyboards/uk78/keyboard.json +++ b/keyboards/uk78/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ungodly/nines/keyboard.json b/keyboards/ungodly/nines/keyboard.json index 5e5418e14d..0e7ff76b99 100644 --- a/keyboards/ungodly/nines/keyboard.json +++ b/keyboards/ungodly/nines/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/unikeyboard/diverge3/keyboard.json b/keyboards/unikeyboard/diverge3/keyboard.json index e50bdfa129..53c5f55fcd 100644 --- a/keyboards/unikeyboard/diverge3/keyboard.json +++ b/keyboards/unikeyboard/diverge3/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/unikeyboard/divergetm2/keyboard.json b/keyboards/unikeyboard/divergetm2/keyboard.json index 8a7b5bb2df..3dc19772fa 100644 --- a/keyboards/unikeyboard/divergetm2/keyboard.json +++ b/keyboards/unikeyboard/divergetm2/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/unikeyboard/felix/keyboard.json b/keyboards/unikeyboard/felix/keyboard.json index 8daef4227e..5ab1e71c1a 100644 --- a/keyboards/unikeyboard/felix/keyboard.json +++ b/keyboards/unikeyboard/felix/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/unikorn/keyboard.json b/keyboards/unikorn/keyboard.json index 77eaa81cbf..7ba06098f3 100644 --- a/keyboards/unikorn/keyboard.json +++ b/keyboards/unikorn/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/utd80/keyboard.json b/keyboards/utd80/keyboard.json index 7c618e96b1..1167b84da4 100644 --- a/keyboards/utd80/keyboard.json +++ b/keyboards/utd80/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/v60_type_r/keyboard.json b/keyboards/v60_type_r/keyboard.json index c186167ff2..90c7e9bb88 100644 --- a/keyboards/v60_type_r/keyboard.json +++ b/keyboards/v60_type_r/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/vagrant_10/keyboard.json b/keyboards/vagrant_10/keyboard.json index 26b68b6923..262bfc6581 100644 --- a/keyboards/vagrant_10/keyboard.json +++ b/keyboards/vagrant_10/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vertex/angler2/keyboard.json b/keyboards/vertex/angler2/keyboard.json index 02541f6c86..e55805827b 100644 --- a/keyboards/vertex/angler2/keyboard.json +++ b/keyboards/vertex/angler2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/vertex/cycle7/keyboard.json b/keyboards/vertex/cycle7/keyboard.json index 9d55b63fec..865e8b604e 100644 --- a/keyboards/vertex/cycle7/keyboard.json +++ b/keyboards/vertex/cycle7/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/vertex/cycle8/keyboard.json b/keyboards/vertex/cycle8/keyboard.json index 6531e0f6fa..8f90597e87 100644 --- a/keyboards/vertex/cycle8/keyboard.json +++ b/keyboards/vertex/cycle8/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viendi8l/keyboard.json b/keyboards/viendi8l/keyboard.json index f6df59e08b..a96c0926e2 100644 --- a/keyboards/viendi8l/keyboard.json +++ b/keyboards/viendi8l/keyboard.json @@ -21,7 +21,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/viktus/at101_bh/keyboard.json b/keyboards/viktus/at101_bh/keyboard.json index a315288cac..02769b47e3 100644 --- a/keyboards/viktus/at101_bh/keyboard.json +++ b/keyboards/viktus/at101_bh/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/minne/keyboard.json b/keyboards/viktus/minne/keyboard.json index bfb3f8a8a6..e87e2cbbcf 100644 --- a/keyboards/viktus/minne/keyboard.json +++ b/keyboards/viktus/minne/keyboard.json @@ -14,7 +14,6 @@ "rgblight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/minne_topre/keyboard.json b/keyboards/viktus/minne_topre/keyboard.json index 6919e7f9cc..5a4186c3bc 100644 --- a/keyboards/viktus/minne_topre/keyboard.json +++ b/keyboards/viktus/minne_topre/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/omnikey_bh/keyboard.json b/keyboards/viktus/omnikey_bh/keyboard.json index af2b596bf8..780b91ace3 100644 --- a/keyboards/viktus/omnikey_bh/keyboard.json +++ b/keyboards/viktus/omnikey_bh/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2/keyboard.json b/keyboards/viktus/osav2/keyboard.json index 34c2089181..27bbc729d8 100644 --- a/keyboards/viktus/osav2/keyboard.json +++ b/keyboards/viktus/osav2/keyboard.json @@ -15,7 +15,6 @@ "rgblight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_numpad/keyboard.json b/keyboards/viktus/osav2_numpad/keyboard.json index 941d65f367..7e4e19dd68 100644 --- a/keyboards/viktus/osav2_numpad/keyboard.json +++ b/keyboards/viktus/osav2_numpad/keyboard.json @@ -14,7 +14,6 @@ "rgblight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_numpad_topre/keyboard.json b/keyboards/viktus/osav2_numpad_topre/keyboard.json index 55ca939e3f..2b4961aed2 100644 --- a/keyboards/viktus/osav2_numpad_topre/keyboard.json +++ b/keyboards/viktus/osav2_numpad_topre/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_topre/keyboard.json b/keyboards/viktus/osav2_topre/keyboard.json index 1f2120ed57..d5bbd8b92e 100644 --- a/keyboards/viktus/osav2_topre/keyboard.json +++ b/keyboards/viktus/osav2_topre/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/smolka/keyboard.json b/keyboards/viktus/smolka/keyboard.json index a5f5735e09..f07b1472ca 100644 --- a/keyboards/viktus/smolka/keyboard.json +++ b/keyboards/viktus/smolka/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/viktus/sp111_v2/keyboard.json b/keyboards/viktus/sp111_v2/keyboard.json index 63c531ee44..79f76f2c90 100644 --- a/keyboards/viktus/sp111_v2/keyboard.json +++ b/keyboards/viktus/sp111_v2/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viktus/sp_mini/keyboard.json b/keyboards/viktus/sp_mini/keyboard.json index 6b9627b462..0b8854b1b9 100644 --- a/keyboards/viktus/sp_mini/keyboard.json +++ b/keyboards/viktus/sp_mini/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/viktus/styrka/keyboard.json b/keyboards/viktus/styrka/keyboard.json index 98d46bc81a..ce40b10e1a 100644 --- a/keyboards/viktus/styrka/keyboard.json +++ b/keyboards/viktus/styrka/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/viktus/styrka_topre/keyboard.json b/keyboards/viktus/styrka_topre/keyboard.json index 7095a8f484..fc3f044660 100644 --- a/keyboards/viktus/styrka_topre/keyboard.json +++ b/keyboards/viktus/styrka_topre/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/vkr94/keyboard.json b/keyboards/viktus/vkr94/keyboard.json index a3f4ff35a2..0a41e6bda9 100644 --- a/keyboards/viktus/vkr94/keyboard.json +++ b/keyboards/viktus/vkr94/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viktus/z150_bh/keyboard.json b/keyboards/viktus/z150_bh/keyboard.json index bbd7c1c1c3..b952864f70 100644 --- a/keyboards/viktus/z150_bh/keyboard.json +++ b/keyboards/viktus/z150_bh/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vinhcatba/uncertainty/keyboard.json b/keyboards/vinhcatba/uncertainty/keyboard.json index 004e998966..d2b21a3b5d 100644 --- a/keyboards/vinhcatba/uncertainty/keyboard.json +++ b/keyboards/vinhcatba/uncertainty/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "wpm": true, "encoder": true, "extrakey": true, diff --git a/keyboards/vitamins_included/info.json b/keyboards/vitamins_included/info.json index d293e7c940..2934c2cb71 100644 --- a/keyboards/vitamins_included/info.json +++ b/keyboards/vitamins_included/info.json @@ -9,7 +9,6 @@ "audio": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/void/voidhhkb_hotswap/keyboard.json b/keyboards/void/voidhhkb_hotswap/keyboard.json index 1e29c220dc..61d2591d95 100644 --- a/keyboards/void/voidhhkb_hotswap/keyboard.json +++ b/keyboards/void/voidhhkb_hotswap/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vt40/keyboard.json b/keyboards/vt40/keyboard.json index 4a8178b8d5..9afb32f7d1 100644 --- a/keyboards/vt40/keyboard.json +++ b/keyboards/vt40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/walletburner/cajal/keyboard.json b/keyboards/walletburner/cajal/keyboard.json index e11c62ec87..3e0b4e785e 100644 --- a/keyboards/walletburner/cajal/keyboard.json +++ b/keyboards/walletburner/cajal/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/walletburner/neuron/keyboard.json b/keyboards/walletburner/neuron/keyboard.json index 1d9ce89387..e514e8d62b 100644 --- a/keyboards/walletburner/neuron/keyboard.json +++ b/keyboards/walletburner/neuron/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wavtype/foundation/keyboard.json b/keyboards/wavtype/foundation/keyboard.json index d8e9782f7e..3be6a9ee0d 100644 --- a/keyboards/wavtype/foundation/keyboard.json +++ b/keyboards/wavtype/foundation/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/wavtype/p01_ultra/keyboard.json b/keyboards/wavtype/p01_ultra/keyboard.json index 73633ee460..899fc805a4 100644 --- a/keyboards/wavtype/p01_ultra/keyboard.json +++ b/keyboards/wavtype/p01_ultra/keyboard.json @@ -30,7 +30,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/weirdo/geminate60/keyboard.json b/keyboards/weirdo/geminate60/keyboard.json index 336f25fdc8..c8471db914 100644 --- a/keyboards/weirdo/geminate60/keyboard.json +++ b/keyboards/weirdo/geminate60/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/kelowna/rgb64/keyboard.json b/keyboards/weirdo/kelowna/rgb64/keyboard.json index d4d3294f50..149c2375b9 100644 --- a/keyboards/weirdo/kelowna/rgb64/keyboard.json +++ b/keyboards/weirdo/kelowna/rgb64/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/ls_60/keyboard.json b/keyboards/weirdo/ls_60/keyboard.json index 3325dc057d..aa82bcf00c 100644 --- a/keyboards/weirdo/ls_60/keyboard.json +++ b/keyboards/weirdo/ls_60/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/np64/keyboard.json b/keyboards/weirdo/naiping/np64/keyboard.json index f7cdff55b5..7cd14a1bfa 100644 --- a/keyboards/weirdo/naiping/np64/keyboard.json +++ b/keyboards/weirdo/naiping/np64/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/nphhkb/keyboard.json b/keyboards/weirdo/naiping/nphhkb/keyboard.json index ed5485d9de..3bb4bd62ca 100644 --- a/keyboards/weirdo/naiping/nphhkb/keyboard.json +++ b/keyboards/weirdo/naiping/nphhkb/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/npminila/keyboard.json b/keyboards/weirdo/naiping/npminila/keyboard.json index e5ed93e193..9bb791a2b1 100644 --- a/keyboards/weirdo/naiping/npminila/keyboard.json +++ b/keyboards/weirdo/naiping/npminila/keyboard.json @@ -16,7 +16,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/wekey/polaris/keyboard.json b/keyboards/wekey/polaris/keyboard.json index 4fd5b5f46d..93a56385fd 100644 --- a/keyboards/wekey/polaris/keyboard.json +++ b/keyboards/wekey/polaris/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/werk_technica/one/keyboard.json b/keyboards/werk_technica/one/keyboard.json index 4933c7fd7c..b856c089df 100644 --- a/keyboards/werk_technica/one/keyboard.json +++ b/keyboards/werk_technica/one/keyboard.json @@ -15,7 +15,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/westfoxtrot/aanzee/keyboard.json b/keyboards/westfoxtrot/aanzee/keyboard.json index 303ead3367..72e1447ab1 100644 --- a/keyboards/westfoxtrot/aanzee/keyboard.json +++ b/keyboards/westfoxtrot/aanzee/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/westfoxtrot/cyclops/keyboard.json b/keyboards/westfoxtrot/cyclops/keyboard.json index bf08026551..8c665aa03b 100644 --- a/keyboards/westfoxtrot/cyclops/keyboard.json +++ b/keyboards/westfoxtrot/cyclops/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/westfoxtrot/cypher/rev1/keyboard.json b/keyboards/westfoxtrot/cypher/rev1/keyboard.json index 30dcc625de..509ecff384 100644 --- a/keyboards/westfoxtrot/cypher/rev1/keyboard.json +++ b/keyboards/westfoxtrot/cypher/rev1/keyboard.json @@ -10,7 +10,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/westfoxtrot/cypher/rev5/keyboard.json b/keyboards/westfoxtrot/cypher/rev5/keyboard.json index 278ff94b06..e9c6f0606e 100644 --- a/keyboards/westfoxtrot/cypher/rev5/keyboard.json +++ b/keyboards/westfoxtrot/cypher/rev5/keyboard.json @@ -10,7 +10,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/westfoxtrot/prophet/keyboard.json b/keyboards/westfoxtrot/prophet/keyboard.json index 50a7583736..74bd1b821b 100644 --- a/keyboards/westfoxtrot/prophet/keyboard.json +++ b/keyboards/westfoxtrot/prophet/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wilba_tech/rama_works_m10_b/keyboard.json b/keyboards/wilba_tech/rama_works_m10_b/keyboard.json index 157baa1c5a..edcf24f62e 100644 --- a/keyboards/wilba_tech/rama_works_m10_b/keyboard.json +++ b/keyboards/wilba_tech/rama_works_m10_b/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json b/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json index c44032f97c..82bfe552d5 100644 --- a/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json +++ b/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_g/keyboard.json b/keyboards/wilba_tech/wt60_g/keyboard.json index 526a6a9d72..21a84eff27 100644 --- a/keyboards/wilba_tech/wt60_g/keyboard.json +++ b/keyboards/wilba_tech/wt60_g/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_g2/keyboard.json b/keyboards/wilba_tech/wt60_g2/keyboard.json index 5f62d9d52b..6bfbe13132 100644 --- a/keyboards/wilba_tech/wt60_g2/keyboard.json +++ b/keyboards/wilba_tech/wt60_g2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h1/keyboard.json b/keyboards/wilba_tech/wt60_h1/keyboard.json index 2832cf3cd7..17a783f316 100644 --- a/keyboards/wilba_tech/wt60_h1/keyboard.json +++ b/keyboards/wilba_tech/wt60_h1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h2/keyboard.json b/keyboards/wilba_tech/wt60_h2/keyboard.json index f48e03940c..ddce1d8b44 100644 --- a/keyboards/wilba_tech/wt60_h2/keyboard.json +++ b/keyboards/wilba_tech/wt60_h2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h3/keyboard.json b/keyboards/wilba_tech/wt60_h3/keyboard.json index 9078fa9242..42cc613dea 100644 --- a/keyboards/wilba_tech/wt60_h3/keyboard.json +++ b/keyboards/wilba_tech/wt60_h3/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_xt/keyboard.json b/keyboards/wilba_tech/wt60_xt/keyboard.json index ba8e8000db..de8572180d 100644 --- a/keyboards/wilba_tech/wt60_xt/keyboard.json +++ b/keyboards/wilba_tech/wt60_xt/keyboard.json @@ -12,7 +12,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_d/keyboard.json b/keyboards/wilba_tech/wt65_d/keyboard.json index 3754b3788b..2985d5df76 100644 --- a/keyboards/wilba_tech/wt65_d/keyboard.json +++ b/keyboards/wilba_tech/wt65_d/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_f/keyboard.json b/keyboards/wilba_tech/wt65_f/keyboard.json index fb79856578..29c76d2ac2 100644 --- a/keyboards/wilba_tech/wt65_f/keyboard.json +++ b/keyboards/wilba_tech/wt65_f/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_fx/keyboard.json b/keyboards/wilba_tech/wt65_fx/keyboard.json index f53332b6af..9907439d63 100644 --- a/keyboards/wilba_tech/wt65_fx/keyboard.json +++ b/keyboards/wilba_tech/wt65_fx/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_g/keyboard.json b/keyboards/wilba_tech/wt65_g/keyboard.json index e097477074..07cd120bc2 100644 --- a/keyboards/wilba_tech/wt65_g/keyboard.json +++ b/keyboards/wilba_tech/wt65_g/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_g2/keyboard.json b/keyboards/wilba_tech/wt65_g2/keyboard.json index 8a7862dcbe..e7124f917e 100644 --- a/keyboards/wilba_tech/wt65_g2/keyboard.json +++ b/keyboards/wilba_tech/wt65_g2/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_h1/keyboard.json b/keyboards/wilba_tech/wt65_h1/keyboard.json index d56321ce5f..60a76351c4 100644 --- a/keyboards/wilba_tech/wt65_h1/keyboard.json +++ b/keyboards/wilba_tech/wt65_h1/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_xt/keyboard.json b/keyboards/wilba_tech/wt65_xt/keyboard.json index 5331856269..4ab03353c8 100644 --- a/keyboards/wilba_tech/wt65_xt/keyboard.json +++ b/keyboards/wilba_tech/wt65_xt/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_xtx/keyboard.json b/keyboards/wilba_tech/wt65_xtx/keyboard.json index 7d60043b91..6c15054d65 100644 --- a/keyboards/wilba_tech/wt65_xtx/keyboard.json +++ b/keyboards/wilba_tech/wt65_xtx/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt70_jb/keyboard.json b/keyboards/wilba_tech/wt70_jb/keyboard.json index f922810600..1e47da790b 100644 --- a/keyboards/wilba_tech/wt70_jb/keyboard.json +++ b/keyboards/wilba_tech/wt70_jb/keyboard.json @@ -34,7 +34,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/wilba_tech/wt80_g/keyboard.json b/keyboards/wilba_tech/wt80_g/keyboard.json index cc148a9fa0..38065aa087 100644 --- a/keyboards/wilba_tech/wt80_g/keyboard.json +++ b/keyboards/wilba_tech/wt80_g/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/willoucom/keypad/keyboard.json b/keyboards/willoucom/keypad/keyboard.json index dc517ccc16..ede4a18ff5 100644 --- a/keyboards/willoucom/keypad/keyboard.json +++ b/keyboards/willoucom/keypad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/winkeyless/b87/keyboard.json b/keyboards/winkeyless/b87/keyboard.json index 5977058d44..ab7a82056e 100644 --- a/keyboards/winkeyless/b87/keyboard.json +++ b/keyboards/winkeyless/b87/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/winkeyless/bface/keyboard.json b/keyboards/winkeyless/bface/keyboard.json index d6599722c9..1f9685c98f 100644 --- a/keyboards/winkeyless/bface/keyboard.json +++ b/keyboards/winkeyless/bface/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/winkeyless/bmini/keyboard.json b/keyboards/winkeyless/bmini/keyboard.json index f5bf8d40cf..644870e8bc 100644 --- a/keyboards/winkeyless/bmini/keyboard.json +++ b/keyboards/winkeyless/bmini/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/winkeyless/bminiex/keyboard.json b/keyboards/winkeyless/bminiex/keyboard.json index 9e213bd1f8..2dc9ccd60d 100644 --- a/keyboards/winkeyless/bminiex/keyboard.json +++ b/keyboards/winkeyless/bminiex/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/winkeys/mini_winni/keyboard.json b/keyboards/winkeys/mini_winni/keyboard.json index 8f80960f24..e9a3ebca80 100644 --- a/keyboards/winkeys/mini_winni/keyboard.json +++ b/keyboards/winkeys/mini_winni/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/winry/winry25tc/keyboard.json b/keyboards/winry/winry25tc/keyboard.json index 2f9f88ea4a..d2d12854dd 100644 --- a/keyboards/winry/winry25tc/keyboard.json +++ b/keyboards/winry/winry25tc/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/winry/winry315/keyboard.json b/keyboards/winry/winry315/keyboard.json index 3f57dbe802..cad810e64f 100644 --- a/keyboards/winry/winry315/keyboard.json +++ b/keyboards/winry/winry315/keyboard.json @@ -84,7 +84,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/wolf/frogpad/keyboard.json b/keyboards/wolf/frogpad/keyboard.json index 061b9221a7..040554a921 100644 --- a/keyboards/wolf/frogpad/keyboard.json +++ b/keyboards/wolf/frogpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wolf/m60_b/keyboard.json b/keyboards/wolf/m60_b/keyboard.json index ba25ebaa92..bd3233871f 100644 --- a/keyboards/wolf/m60_b/keyboard.json +++ b/keyboards/wolf/m60_b/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wolf/m6_c/keyboard.json b/keyboards/wolf/m6_c/keyboard.json index 8c1d361f8c..3d4b326684 100644 --- a/keyboards/wolf/m6_c/keyboard.json +++ b/keyboards/wolf/m6_c/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/wolf/neely65/keyboard.json b/keyboards/wolf/neely65/keyboard.json index 5e55bf7bfc..07c087b8ac 100644 --- a/keyboards/wolf/neely65/keyboard.json +++ b/keyboards/wolf/neely65/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/silhouette/keyboard.json b/keyboards/wolf/silhouette/keyboard.json index 83c2d03999..ba3a637ec8 100644 --- a/keyboards/wolf/silhouette/keyboard.json +++ b/keyboards/wolf/silhouette/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/twilight/keyboard.json b/keyboards/wolf/twilight/keyboard.json index 8a90b3656e..a296c76700 100644 --- a/keyboards/wolf/twilight/keyboard.json +++ b/keyboards/wolf/twilight/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/ziggurat/keyboard.json b/keyboards/wolf/ziggurat/keyboard.json index 32627b479f..800db68b2a 100644 --- a/keyboards/wolf/ziggurat/keyboard.json +++ b/keyboards/wolf/ziggurat/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/woodkeys/scarletbandana/keyboard.json b/keyboards/woodkeys/scarletbandana/keyboard.json index 155ca508e7..3d9e8c97ad 100644 --- a/keyboards/woodkeys/scarletbandana/keyboard.json +++ b/keyboards/woodkeys/scarletbandana/keyboard.json @@ -32,7 +32,6 @@ "audio": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/work_louder/micro/keyboard.json b/keyboards/work_louder/micro/keyboard.json index b9ba6227bd..75789388e5 100644 --- a/keyboards/work_louder/micro/keyboard.json +++ b/keyboards/work_louder/micro/keyboard.json @@ -6,7 +6,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/work_louder/numpad/keyboard.json b/keyboards/work_louder/numpad/keyboard.json index 08bf7295da..4ec9a8564c 100644 --- a/keyboards/work_louder/numpad/keyboard.json +++ b/keyboards/work_louder/numpad/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/alpha9/keyboard.json b/keyboards/wsk/alpha9/keyboard.json index 79c01c4c2a..891fc09eed 100644 --- a/keyboards/wsk/alpha9/keyboard.json +++ b/keyboards/wsk/alpha9/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/g4m3ralpha/keyboard.json b/keyboards/wsk/g4m3ralpha/keyboard.json index d2ba034be1..4415d8aee5 100644 --- a/keyboards/wsk/g4m3ralpha/keyboard.json +++ b/keyboards/wsk/g4m3ralpha/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/houndstooth/keyboard.json b/keyboards/wsk/houndstooth/keyboard.json index 2be2b36968..dc651e89b5 100644 --- a/keyboards/wsk/houndstooth/keyboard.json +++ b/keyboards/wsk/houndstooth/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wsk/jerkin/keyboard.json b/keyboards/wsk/jerkin/keyboard.json index 43fc8d107d..dca3af2378 100644 --- a/keyboards/wsk/jerkin/keyboard.json +++ b/keyboards/wsk/jerkin/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wsk/kodachi50/keyboard.json b/keyboards/wsk/kodachi50/keyboard.json index 3f5843fd1a..5888fe00fb 100644 --- a/keyboards/wsk/kodachi50/keyboard.json +++ b/keyboards/wsk/kodachi50/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/pain27/keyboard.json b/keyboards/wsk/pain27/keyboard.json index a01e887e99..02345d04db 100644 --- a/keyboards/wsk/pain27/keyboard.json +++ b/keyboards/wsk/pain27/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/sl40/keyboard.json b/keyboards/wsk/sl40/keyboard.json index aba29855dd..ab592a6967 100644 --- a/keyboards/wsk/sl40/keyboard.json +++ b/keyboards/wsk/sl40/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/tkl30/keyboard.json b/keyboards/wsk/tkl30/keyboard.json index 909f72d4cf..f69d9b5449 100644 --- a/keyboards/wsk/tkl30/keyboard.json +++ b/keyboards/wsk/tkl30/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wuque/creek70/keyboard.json b/keyboards/wuque/creek70/keyboard.json index e7227ace8e..d7b64f88ce 100644 --- a/keyboards/wuque/creek70/keyboard.json +++ b/keyboards/wuque/creek70/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/ikki68/keyboard.json b/keyboards/wuque/ikki68/keyboard.json index d666b0b5de..942e290bd5 100644 --- a/keyboards/wuque/ikki68/keyboard.json +++ b/keyboards/wuque/ikki68/keyboard.json @@ -37,7 +37,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/nemui65/keyboard.json b/keyboards/wuque/nemui65/keyboard.json index 239fe991bb..3579ec4036 100644 --- a/keyboards/wuque/nemui65/keyboard.json +++ b/keyboards/wuque/nemui65/keyboard.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/tata80/wk/keyboard.json b/keyboards/wuque/tata80/wk/keyboard.json index 957a635dcb..a078e0b2a3 100644 --- a/keyboards/wuque/tata80/wk/keyboard.json +++ b/keyboards/wuque/tata80/wk/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/wuque/tata80/wkl/keyboard.json b/keyboards/wuque/tata80/wkl/keyboard.json index 4613f97f67..b91a7a5ac4 100644 --- a/keyboards/wuque/tata80/wkl/keyboard.json +++ b/keyboards/wuque/tata80/wkl/keyboard.json @@ -12,7 +12,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/x16/keyboard.json b/keyboards/x16/keyboard.json index d8aa2468ca..17d28e8a5c 100644 --- a/keyboards/x16/keyboard.json +++ b/keyboards/x16/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xbows/knight/keyboard.json b/keyboards/xbows/knight/keyboard.json index b5adc0b946..ab888e6f23 100644 --- a/keyboards/xbows/knight/keyboard.json +++ b/keyboards/xbows/knight/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/knight_plus/keyboard.json b/keyboards/xbows/knight_plus/keyboard.json index b3c43645d9..b1da324626 100644 --- a/keyboards/xbows/knight_plus/keyboard.json +++ b/keyboards/xbows/knight_plus/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/nature/keyboard.json b/keyboards/xbows/nature/keyboard.json index 7f23e781d2..49c2b323e7 100644 --- a/keyboards/xbows/nature/keyboard.json +++ b/keyboards/xbows/nature/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/numpad/keyboard.json b/keyboards/xbows/numpad/keyboard.json index 7be91ae2a4..b0bba80ec2 100644 --- a/keyboards/xbows/numpad/keyboard.json +++ b/keyboards/xbows/numpad/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/ranger/keyboard.json b/keyboards/xbows/ranger/keyboard.json index c5a47413ec..fc1077d39a 100644 --- a/keyboards/xbows/ranger/keyboard.json +++ b/keyboards/xbows/ranger/keyboard.json @@ -35,7 +35,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xelus/dharma/keyboard.json b/keyboards/xelus/dharma/keyboard.json index 0e5fd1217b..83f6d95581 100644 --- a/keyboards/xelus/dharma/keyboard.json +++ b/keyboards/xelus/dharma/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/pachi/mini_32u4/keyboard.json b/keyboards/xelus/pachi/mini_32u4/keyboard.json index c3144bca15..78069d56b0 100644 --- a/keyboards/xelus/pachi/mini_32u4/keyboard.json +++ b/keyboards/xelus/pachi/mini_32u4/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/pachi/rev1/keyboard.json b/keyboards/xelus/pachi/rev1/keyboard.json index fff3be7646..4dc35075d5 100644 --- a/keyboards/xelus/pachi/rev1/keyboard.json +++ b/keyboards/xelus/pachi/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/snap96/keyboard.json b/keyboards/xelus/snap96/keyboard.json index e32b7db4e0..5a5f1d8c42 100644 --- a/keyboards/xelus/snap96/keyboard.json +++ b/keyboards/xelus/snap96/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/valor/rev1/keyboard.json b/keyboards/xelus/valor/rev1/keyboard.json index e85f9b2aaa..c5a7fe8113 100644 --- a/keyboards/xelus/valor/rev1/keyboard.json +++ b/keyboards/xelus/valor/rev1/keyboard.json @@ -32,7 +32,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json b/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json index 36db1d4398..7afc25deee 100644 --- a/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json +++ b/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json b/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json index 376d73a429..21ef5b6920 100644 --- a/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json +++ b/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json @@ -9,7 +9,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xiudi/xd004/v1/keyboard.json b/keyboards/xiudi/xd004/v1/keyboard.json index a6211edfec..4a134dd5ef 100644 --- a/keyboards/xiudi/xd004/v1/keyboard.json +++ b/keyboards/xiudi/xd004/v1/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/xiudi/xd60/rev2/keyboard.json b/keyboards/xiudi/xd60/rev2/keyboard.json index 8e03fdba20..9f25023bb9 100644 --- a/keyboards/xiudi/xd60/rev2/keyboard.json +++ b/keyboards/xiudi/xd60/rev2/keyboard.json @@ -7,7 +7,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xiudi/xd60/rev3/keyboard.json b/keyboards/xiudi/xd60/rev3/keyboard.json index 09af3681af..defbd93592 100644 --- a/keyboards/xiudi/xd60/rev3/keyboard.json +++ b/keyboards/xiudi/xd60/rev3/keyboard.json @@ -7,7 +7,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xiudi/xd68/keyboard.json b/keyboards/xiudi/xd68/keyboard.json index 35fc7f61dd..828aa1888d 100644 --- a/keyboards/xiudi/xd68/keyboard.json +++ b/keyboards/xiudi/xd68/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xiudi/xd75/keyboard.json b/keyboards/xiudi/xd75/keyboard.json index 95aaa6f182..4644c9f826 100644 --- a/keyboards/xiudi/xd75/keyboard.json +++ b/keyboards/xiudi/xd75/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/xiudi/xd84pro/keyboard.json b/keyboards/xiudi/xd84pro/keyboard.json index 070dd32396..e5dc56c29b 100644 --- a/keyboards/xiudi/xd84pro/keyboard.json +++ b/keyboards/xiudi/xd84pro/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/xmmx/keyboard.json b/keyboards/xmmx/keyboard.json index bb8d7e0977..12cb6ad0fc 100644 --- a/keyboards/xmmx/keyboard.json +++ b/keyboards/xmmx/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/yandrstudio/nz64/keyboard.json b/keyboards/yandrstudio/nz64/keyboard.json index 8169449a10..a017b06f58 100644 --- a/keyboards/yandrstudio/nz64/keyboard.json +++ b/keyboards/yandrstudio/nz64/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/yandrstudio/zhou65/keyboard.json b/keyboards/yandrstudio/zhou65/keyboard.json index f15cdfb0a2..1c5f368262 100644 --- a/keyboards/yandrstudio/zhou65/keyboard.json +++ b/keyboards/yandrstudio/zhou65/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/yatara/drink_me/keyboard.json b/keyboards/yatara/drink_me/keyboard.json index 970aa4f5d3..523d0d916a 100644 --- a/keyboards/yatara/drink_me/keyboard.json +++ b/keyboards/yatara/drink_me/keyboard.json @@ -13,7 +13,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/ydkb/chili/keyboard.json b/keyboards/ydkb/chili/keyboard.json index 13b46d8b12..114b022ac6 100644 --- a/keyboards/ydkb/chili/keyboard.json +++ b/keyboards/ydkb/chili/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ydkb/yd68/keyboard.json b/keyboards/ydkb/yd68/keyboard.json index 439272a927..bb906ee146 100644 --- a/keyboards/ydkb/yd68/keyboard.json +++ b/keyboards/ydkb/yd68/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ydkb/ydpm40/keyboard.json b/keyboards/ydkb/ydpm40/keyboard.json index f19139d566..5d016e389b 100644 --- a/keyboards/ydkb/ydpm40/keyboard.json +++ b/keyboards/ydkb/ydpm40/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/yeehaw/keyboard.json b/keyboards/yeehaw/keyboard.json index aa20239c9d..d2555a3201 100644 --- a/keyboards/yeehaw/keyboard.json +++ b/keyboards/yeehaw/keyboard.json @@ -39,7 +39,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ymdk/bface/keyboard.json b/keyboards/ymdk/bface/keyboard.json index 9662adaba2..42c5ef5461 100644 --- a/keyboards/ymdk/bface/keyboard.json +++ b/keyboards/ymdk/bface/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": false, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ymdk/melody96/hotswap/keyboard.json b/keyboards/ymdk/melody96/hotswap/keyboard.json index 901afc8651..1b22f1fdee 100644 --- a/keyboards/ymdk/melody96/hotswap/keyboard.json +++ b/keyboards/ymdk/melody96/hotswap/keyboard.json @@ -16,7 +16,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/np21/keyboard.json b/keyboards/ymdk/np21/keyboard.json index a1997161ee..8527fc5596 100644 --- a/keyboards/ymdk/np21/keyboard.json +++ b/keyboards/ymdk/np21/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/ymdk/np24/u4rgb6/keyboard.json b/keyboards/ymdk/np24/u4rgb6/keyboard.json index 3dcd9d63b3..cc00595cc1 100644 --- a/keyboards/ymdk/np24/u4rgb6/keyboard.json +++ b/keyboards/ymdk/np24/u4rgb6/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/ymdk/wings/keyboard.json b/keyboards/ymdk/wings/keyboard.json index 30c8439b45..9036872c66 100644 --- a/keyboards/ymdk/wings/keyboard.json +++ b/keyboards/ymdk/wings/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/wingshs/keyboard.json b/keyboards/ymdk/wingshs/keyboard.json index 487d61cc2e..252884dc75 100644 --- a/keyboards/ymdk/wingshs/keyboard.json +++ b/keyboards/ymdk/wingshs/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/yd60mq/info.json b/keyboards/ymdk/yd60mq/info.json index d5a3a20c71..11997ba50e 100644 --- a/keyboards/ymdk/yd60mq/info.json +++ b/keyboards/ymdk/yd60mq/info.json @@ -10,7 +10,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/ym68/keyboard.json b/keyboards/ymdk/ym68/keyboard.json index 032774b282..a6185e5891 100644 --- a/keyboards/ymdk/ym68/keyboard.json +++ b/keyboards/ymdk/ym68/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ymdk/ymd09/keyboard.json b/keyboards/ymdk/ymd09/keyboard.json index 571aa8c45f..226502b093 100644 --- a/keyboards/ymdk/ymd09/keyboard.json +++ b/keyboards/ymdk/ymd09/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/ymdk/ymd21/v2/keyboard.json b/keyboards/ymdk/ymd21/v2/keyboard.json index d7c4b75855..7e09f04fdf 100644 --- a/keyboards/ymdk/ymd21/v2/keyboard.json +++ b/keyboards/ymdk/ymd21/v2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ymdk/ymd67/keyboard.json b/keyboards/ymdk/ymd67/keyboard.json index 5f9ba275f9..4818a79b50 100644 --- a/keyboards/ymdk/ymd67/keyboard.json +++ b/keyboards/ymdk/ymd67/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/ymdk/ymd75/rev1/keyboard.json b/keyboards/ymdk/ymd75/rev1/keyboard.json index fd46bf0d99..3c9022ccdb 100644 --- a/keyboards/ymdk/ymd75/rev1/keyboard.json +++ b/keyboards/ymdk/ymd75/rev1/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/ymdk/ymd75/rev2/keyboard.json b/keyboards/ymdk/ymd75/rev2/keyboard.json index 3bee673ceb..8bfebf0207 100644 --- a/keyboards/ymdk/ymd75/rev2/keyboard.json +++ b/keyboards/ymdk/ymd75/rev2/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/ymdk/ymd75/rev3/keyboard.json b/keyboards/ymdk/ymd75/rev3/keyboard.json index 4377fbd742..eb5979c566 100644 --- a/keyboards/ymdk/ymd75/rev3/keyboard.json +++ b/keyboards/ymdk/ymd75/rev3/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": true, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json index 21c688bc82..44c43e8d85 100644 --- a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json +++ b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json @@ -18,7 +18,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/ymd96/keyboard.json b/keyboards/ymdk/ymd96/keyboard.json index 7ff17de0c2..cd5b6509f4 100644 --- a/keyboards/ymdk/ymd96/keyboard.json +++ b/keyboards/ymdk/ymd96/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": false, "command": false, - "console": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/yncognito/batpad/keyboard.json b/keyboards/yncognito/batpad/keyboard.json index 6e962aefce..4d42442b6f 100644 --- a/keyboards/yncognito/batpad/keyboard.json +++ b/keyboards/yncognito/batpad/keyboard.json @@ -65,7 +65,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/yoichiro/lunakey_macro/keyboard.json b/keyboards/yoichiro/lunakey_macro/keyboard.json index 3742a4d467..e5c693e9cd 100644 --- a/keyboards/yoichiro/lunakey_macro/keyboard.json +++ b/keyboards/yoichiro/lunakey_macro/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/yoichiro/lunakey_pico/keyboard.json b/keyboards/yoichiro/lunakey_pico/keyboard.json index a6db26fde0..5f04d1b3f9 100644 --- a/keyboards/yoichiro/lunakey_pico/keyboard.json +++ b/keyboards/yoichiro/lunakey_pico/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": false, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/yynmt/dozen0/keyboard.json b/keyboards/yynmt/dozen0/keyboard.json index 1ad2b13be0..6cdbe0a28d 100644 --- a/keyboards/yynmt/dozen0/keyboard.json +++ b/keyboards/yynmt/dozen0/keyboard.json @@ -31,7 +31,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/zeix/eden/keyboard.json b/keyboards/zeix/eden/keyboard.json index 3d44a663b9..76bfdaee2a 100644 --- a/keyboards/zeix/eden/keyboard.json +++ b/keyboards/zeix/eden/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/zeix/qwertyqop60hs/keyboard.json b/keyboards/zeix/qwertyqop60hs/keyboard.json index 6397551ff7..d477dcc44e 100644 --- a/keyboards/zeix/qwertyqop60hs/keyboard.json +++ b/keyboards/zeix/qwertyqop60hs/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, diff --git a/keyboards/zicodia/tklfrlnrlmlao/keyboard.json b/keyboards/zicodia/tklfrlnrlmlao/keyboard.json index e7c7322f7e..e29f3ca8cb 100644 --- a/keyboards/zicodia/tklfrlnrlmlao/keyboard.json +++ b/keyboards/zicodia/tklfrlnrlmlao/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ziggurat/keyboard.json b/keyboards/ziggurat/keyboard.json index ef86511b36..21ba5772c4 100644 --- a/keyboards/ziggurat/keyboard.json +++ b/keyboards/ziggurat/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/zigotica/z12/keyboard.json b/keyboards/zigotica/z12/keyboard.json index 2d3e92d6e2..d7b2090c57 100644 --- a/keyboards/zigotica/z12/keyboard.json +++ b/keyboards/zigotica/z12/keyboard.json @@ -22,7 +22,6 @@ "features": { "bootmagic": false, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ziptyze/lets_split_v3/keyboard.json b/keyboards/ziptyze/lets_split_v3/keyboard.json index ca53b42240..7d110bd7ff 100644 --- a/keyboards/ziptyze/lets_split_v3/keyboard.json +++ b/keyboards/ziptyze/lets_split_v3/keyboard.json @@ -8,7 +8,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "rgb_matrix": true diff --git a/keyboards/zj68/keyboard.json b/keyboards/zj68/keyboard.json index 9273b81cd5..f59c5b7fbb 100644 --- a/keyboards/zj68/keyboard.json +++ b/keyboards/zj68/keyboard.json @@ -11,7 +11,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/zoo/wampus/keyboard.json b/keyboards/zoo/wampus/keyboard.json index 3e65c50231..9260795690 100644 --- a/keyboards/zoo/wampus/keyboard.json +++ b/keyboards/zoo/wampus/keyboard.json @@ -12,7 +12,6 @@ "backlight": true, "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/zos/65s/keyboard.json b/keyboards/zos/65s/keyboard.json index eaf8a97f86..3a47833235 100644 --- a/keyboards/zos/65s/keyboard.json +++ b/keyboards/zos/65s/keyboard.json @@ -7,7 +7,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ztboards/after/keyboard.json b/keyboards/ztboards/after/keyboard.json index 1b02390837..3cccec283a 100644 --- a/keyboards/ztboards/after/keyboard.json +++ b/keyboards/ztboards/after/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ztboards/noon/keyboard.json b/keyboards/ztboards/noon/keyboard.json index a3f9912acc..5caf694aaa 100644 --- a/keyboards/ztboards/noon/keyboard.json +++ b/keyboards/ztboards/noon/keyboard.json @@ -11,7 +11,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/zwag/zwag75/keyboard.json b/keyboards/zwag/zwag75/keyboard.json index 899e21dfa5..08ea4b6e56 100644 --- a/keyboards/zwag/zwag75/keyboard.json +++ b/keyboards/zwag/zwag75/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": false, "rgblight": true diff --git a/keyboards/zwerg/keyboard.json b/keyboards/zwerg/keyboard.json index a039d0fa39..6ec594a472 100644 --- a/keyboards/zwerg/keyboard.json +++ b/keyboards/zwerg/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/zykrah/fuyu/keyboard.json b/keyboards/zykrah/fuyu/keyboard.json index 01053d4821..9fe6e6ed34 100644 --- a/keyboards/zykrah/fuyu/keyboard.json +++ b/keyboards/zykrah/fuyu/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": false, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true, "rgb_matrix": true diff --git a/keyboards/zykrah/slime88/keyboard.json b/keyboards/zykrah/slime88/keyboard.json index 8b15524cca..d0538facf5 100644 --- a/keyboards/zykrah/slime88/keyboard.json +++ b/keyboards/zykrah/slime88/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "console": false, "command": false, "nkro": true }, From da2e897f55a85bf6175f0d6ce9d63a7fe9b09202 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 03:10:14 +0100 Subject: [PATCH 317/592] Update 'qmk generate-api' to only publish pure DD keymaps (#24782) --- lib/python/qmk/cli/generate/api.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py index 8311818476..7f7c05f6e2 100755 --- a/lib/python/qmk/cli/generate/api.py +++ b/lib/python/qmk/cli/generate/api.py @@ -131,6 +131,11 @@ def generate_api(cli): if keymap_rel is None: cli.log.debug('Skipping keymap %s (not in qmk_firmware)', keymap) continue + + if (keymap_rel / 'keymap.c').exists(): + cli.log.debug('Skipping keymap %s (not pure dd keymap)', keymap) + continue + kb_json['keymaps'][keymap.name] = { # TODO: deprecate 'url' as consumer needs to know its potentially hjson 'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap_rel}/keymap.json', From 11cb5cf347489be1b21cee2d8173fb751edd57ac Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 03:11:28 +0100 Subject: [PATCH 318/592] Remove more duplication of defaults (#25189) --- keyboards/cipulot/ec_980c/keyboard.json | 3 +-- keyboards/custommk/evo70_r2/keyboard.json | 1 - keyboards/darmoshark/k3/keyboard.json | 3 +-- keyboards/dnworks/frltkl/keyboard.json | 3 +-- keyboards/dnworks/sbl/keyboard.json | 3 +-- keyboards/dnworks/tkl87/keyboard.json | 3 +-- keyboards/ebastler/e80_1800/keyboard.json | 3 +-- keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json | 3 +-- keyboards/kbdfans/odin75/keyboard.json | 3 +-- keyboards/kbdfans/tiger80/keyboard.json | 1 - keyboards/meetlab/kafkasplit/keyboard.json | 3 +-- keyboards/studiokestra/fairholme/keyboard.json | 3 +-- keyboards/studiokestra/line_friends_tkl/keyboard.json | 1 - keyboards/yandrstudio/transition80/keyboard.json | 3 +-- keyboards/zeix/eden/keyboard.json | 3 +-- 15 files changed, 12 insertions(+), 27 deletions(-) diff --git a/keyboards/cipulot/ec_980c/keyboard.json b/keyboards/cipulot/ec_980c/keyboard.json index 9be58d294c..823a761735 100644 --- a/keyboards/cipulot/ec_980c/keyboard.json +++ b/keyboards/cipulot/ec_980c/keyboard.json @@ -38,8 +38,7 @@ {"matrix": [0, 16], "x": 17, "y": 1, "flags": 4}, {"matrix": [0, 17], "x": 18, "y": 1, "flags": 4} ], - "led_count": 3, - "max_brightness": 255 + "led_count": 3 }, "usb": { "device_version": "0.0.1", diff --git a/keyboards/custommk/evo70_r2/keyboard.json b/keyboards/custommk/evo70_r2/keyboard.json index 7fb79f3a7e..6cd1fc12d9 100644 --- a/keyboards/custommk/evo70_r2/keyboard.json +++ b/keyboards/custommk/evo70_r2/keyboard.json @@ -60,7 +60,6 @@ "backlight": { "driver": "pwm", "breathing": true, - "breathing_period": 6, "levels": 17, "pin": "A6" }, diff --git a/keyboards/darmoshark/k3/keyboard.json b/keyboards/darmoshark/k3/keyboard.json index d3fb379427..b645a18dc6 100644 --- a/keyboards/darmoshark/k3/keyboard.json +++ b/keyboards/darmoshark/k3/keyboard.json @@ -31,8 +31,7 @@ "cols": ["B1", "C7", "C13", "B9"] }, "indicators": { - "num_lock": "C5", - "on_state": 1 + "num_lock": "C5" }, "ws2812": { "pin": "A8" diff --git a/keyboards/dnworks/frltkl/keyboard.json b/keyboards/dnworks/frltkl/keyboard.json index 88a9db338b..d30a0134eb 100644 --- a/keyboards/dnworks/frltkl/keyboard.json +++ b/keyboards/dnworks/frltkl/keyboard.json @@ -17,8 +17,7 @@ "nkro": true }, "indicators": { - "caps_lock": "GP27", - "on_state": 1 + "caps_lock": "GP27" }, "diode_direction": "COL2ROW", "matrix_pins": { diff --git a/keyboards/dnworks/sbl/keyboard.json b/keyboards/dnworks/sbl/keyboard.json index 44cb250533..8ded6856a8 100644 --- a/keyboards/dnworks/sbl/keyboard.json +++ b/keyboards/dnworks/sbl/keyboard.json @@ -17,8 +17,7 @@ "nkro": true }, "indicators": { - "caps_lock": "GP29", - "on_state": 1 + "caps_lock": "GP29" }, "diode_direction": "COL2ROW", "matrix_pins": { diff --git a/keyboards/dnworks/tkl87/keyboard.json b/keyboards/dnworks/tkl87/keyboard.json index 6b56435ae3..af912ae25d 100644 --- a/keyboards/dnworks/tkl87/keyboard.json +++ b/keyboards/dnworks/tkl87/keyboard.json @@ -17,8 +17,7 @@ }, "indicators": { "caps_lock": "GP27", - "scroll_lock": "GP1", - "on_state": 1 + "scroll_lock": "GP1" }, "diode_direction": "COL2ROW", "matrix_pins": { diff --git a/keyboards/ebastler/e80_1800/keyboard.json b/keyboards/ebastler/e80_1800/keyboard.json index 1e10fd45c4..2ae3493488 100644 --- a/keyboards/ebastler/e80_1800/keyboard.json +++ b/keyboards/ebastler/e80_1800/keyboard.json @@ -26,8 +26,7 @@ "backlight": { "breathing": true, "levels": 5, - "pin": "A9", - "on_state": 1 + "pin": "A9" }, "indicators": { "num_lock": "B6", diff --git a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json index 888ec24e37..7a8326278c 100644 --- a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json +++ b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json @@ -31,8 +31,7 @@ "indicators": { "num_lock": "C13", "caps_lock": "B14", - "scroll_lock": "B2", - "on_state": 1 + "scroll_lock": "B2" }, "encoder": { "rotary": [ diff --git a/keyboards/kbdfans/odin75/keyboard.json b/keyboards/kbdfans/odin75/keyboard.json index 0fd942f515..a5a6a51aa6 100644 --- a/keyboards/kbdfans/odin75/keyboard.json +++ b/keyboards/kbdfans/odin75/keyboard.json @@ -14,8 +14,7 @@ "wpm": true }, "indicators": { - "caps_lock": "GP29", - "on_state": 1 + "caps_lock": "GP29" }, "matrix_pins": { "cols": ["GP19", "GP18", "GP17", "GP16", "GP15", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP3", "GP4"], diff --git a/keyboards/kbdfans/tiger80/keyboard.json b/keyboards/kbdfans/tiger80/keyboard.json index ce6a83dd8f..66be74d610 100644 --- a/keyboards/kbdfans/tiger80/keyboard.json +++ b/keyboards/kbdfans/tiger80/keyboard.json @@ -18,7 +18,6 @@ "diode_direction": "COL2ROW", "indicators": { "caps_lock": "C7", - "on_state": 1, "scroll_lock": "B2" }, "processor": "atmega32u4", diff --git a/keyboards/meetlab/kafkasplit/keyboard.json b/keyboards/meetlab/kafkasplit/keyboard.json index 0ac90a56fb..77e5ec3e13 100644 --- a/keyboards/meetlab/kafkasplit/keyboard.json +++ b/keyboards/meetlab/kafkasplit/keyboard.json @@ -14,8 +14,7 @@ "wpm": true }, "indicators": { - "caps_lock": "GP25", - "on_state": 1 + "caps_lock": "GP25" }, "matrix_pins": { "cols": ["GP2", "GP3", "GP6", "GP7", "GP10", "GP11"], diff --git a/keyboards/studiokestra/fairholme/keyboard.json b/keyboards/studiokestra/fairholme/keyboard.json index 13170ce65c..d70934187c 100644 --- a/keyboards/studiokestra/fairholme/keyboard.json +++ b/keyboards/studiokestra/fairholme/keyboard.json @@ -22,8 +22,7 @@ "vid": "0x7C10" }, "indicators": { - "caps_lock": "B10", - "on_state": 1 + "caps_lock": "B10" }, "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_ansi_tsangan_split_bs_rshift", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso", "60_iso_split_bs_rshift", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"], "layouts": { diff --git a/keyboards/studiokestra/line_friends_tkl/keyboard.json b/keyboards/studiokestra/line_friends_tkl/keyboard.json index d7e050315d..40a7d0894e 100644 --- a/keyboards/studiokestra/line_friends_tkl/keyboard.json +++ b/keyboards/studiokestra/line_friends_tkl/keyboard.json @@ -19,7 +19,6 @@ }, "indicators": { "caps_lock": "B6", - "on_state": 1, "scroll_lock": "D2" }, "matrix_pins": { diff --git a/keyboards/yandrstudio/transition80/keyboard.json b/keyboards/yandrstudio/transition80/keyboard.json index 7f9364a18f..e0a9eb7588 100644 --- a/keyboards/yandrstudio/transition80/keyboard.json +++ b/keyboards/yandrstudio/transition80/keyboard.json @@ -22,8 +22,7 @@ }, "indicators": { "caps_lock": "A15", - "scroll_lock": "B14", - "on_state": 1 + "scroll_lock": "B14" }, "layout_aliases": { "LAYOUT": "LAYOUT_all" diff --git a/keyboards/zeix/eden/keyboard.json b/keyboards/zeix/eden/keyboard.json index 76bfdaee2a..182d8ceb62 100644 --- a/keyboards/zeix/eden/keyboard.json +++ b/keyboards/zeix/eden/keyboard.json @@ -17,8 +17,7 @@ "nkro": true }, "indicators": { - "caps_lock": "GP29", - "on_state": 1 + "caps_lock": "GP29" }, "diode_direction": "COL2ROW", "matrix_pins": { From ce1801aeda3e2234a0f8a6109d2a4a798899691d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Apr 2025 03:14:11 +0100 Subject: [PATCH 319/592] Align `new-keyboard` template to current standards (#25191) --- data/templates/keyboard/keyboard.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/templates/keyboard/keyboard.json b/data/templates/keyboard/keyboard.json index 94085d7f5a..87aa853cbb 100644 --- a/data/templates/keyboard/keyboard.json +++ b/data/templates/keyboard/keyboard.json @@ -14,8 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true From e5466df800044b267d881f94a1791759e654f095 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 12:25:47 +1000 Subject: [PATCH 320/592] Bump vite from 5.4.15 to 5.4.18 in /builddefs/docsgen (#25192) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index a798207d77..c2e5412a06 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.4.15", + "vite": "^5.4.18", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index eda99772c4..a096b8d5c0 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -766,10 +766,10 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.9, vite@^5.4.15: - version "5.4.15" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.15.tgz#2941547f10ebb4bf9b0fa0da863c06711eb7e5e5" - integrity sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA== +vite@^5.2.9, vite@^5.4.18: + version "5.4.18" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.18.tgz#b5af357f9d5ebb2e0c085779b7a37a77f09168a4" + integrity sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From 5ea7283159c7004cd3096534e5b7ebd8d477fc50 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 22 Apr 2025 21:06:17 -0600 Subject: [PATCH 321/592] Fix `boardsource/beiwagon` RGB Matrix coordinates (#25018) --- keyboards/boardsource/beiwagon/keyboard.json | 36 ++++++++--------- .../beiwagon/keymaps/default/keymap.c | 40 ------------------- .../beiwagon/keymaps/default/keymap.json | 19 +++++++++ 3 files changed, 37 insertions(+), 58 deletions(-) delete mode 100644 keyboards/boardsource/beiwagon/keymaps/default/keymap.c create mode 100644 keyboards/boardsource/beiwagon/keymaps/default/keymap.json diff --git a/keyboards/boardsource/beiwagon/keyboard.json b/keyboards/boardsource/beiwagon/keyboard.json index 39a9006b85..0bfa159a8a 100644 --- a/keyboards/boardsource/beiwagon/keyboard.json +++ b/keyboards/boardsource/beiwagon/keyboard.json @@ -61,24 +61,24 @@ }, "driver": "ws2812", "layout": [ - {"flags": 2, "x": 16, "y": 38}, - {"flags": 2, "x": 16, "y": 113}, - {"flags": 2, "x": 16, "y": 188}, - {"flags": 2, "x": 48, "y": 38}, - {"flags": 2, "x": 48, "y": 113}, - {"flags": 2, "x": 48, "y": 188}, - {"flags": 4, "matrix": [0, 0], "x": 0, "y": 0}, - {"flags": 4, "matrix": [0, 1], "x": 32, "y": 0}, - {"flags": 4, "matrix": [0, 2], "x": 64, "y": 0}, - {"flags": 4, "matrix": [1, 0], "x": 0, "y": 75}, - {"flags": 4, "matrix": [1, 1], "x": 32, "y": 75}, - {"flags": 4, "matrix": [1, 2], "x": 64, "y": 75}, - {"flags": 4, "matrix": [2, 0], "x": 0, "y": 150}, - {"flags": 4, "matrix": [2, 1], "x": 32, "y": 150}, - {"flags": 4, "matrix": [2, 2], "x": 64, "y": 150}, - {"flags": 4, "matrix": [3, 0], "x": 0, "y": 224}, - {"flags": 4, "matrix": [3, 1], "x": 32, "y": 224}, - {"flags": 4, "matrix": [3, 2], "x": 64, "y": 224} + {"x": 200, "y": 11, "flags": 2}, + {"x": 200, "y": 32, "flags": 2}, + {"x": 200, "y": 52, "flags": 2}, + {"x": 24, "y": 52, "flags": 2}, + {"x": 24, "y": 32, "flags": 2}, + {"x": 24, "y": 11, "flags": 2}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 224, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [1, 1], "x": 112, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 224, "y": 21, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [2, 1], "x": 112, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 224, "y": 42, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [3, 1], "x": 112, "y": 64, "flags": 4}, + {"matrix": [3, 2], "x": 224, "y": 64, "flags": 4} ] }, "layouts": { diff --git a/keyboards/boardsource/beiwagon/keymaps/default/keymap.c b/keyboards/boardsource/beiwagon/keymaps/default/keymap.c deleted file mode 100644 index 4f799550e1..0000000000 --- a/keyboards/boardsource/beiwagon/keymaps/default/keymap.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2022 Boardsource - * - * 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 - -enum layers { - _MAIN, - _RAISE -}; - -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_MAIN] = LAYOUT( - KC_7, KC_8, KC_9, - KC_4, KC_5, KC_6, - KC_1, KC_2, KC_3, - KC_0, KC_PENT,RAISE - ), - [_RAISE] = LAYOUT( - KC_7, KC_8, RM_TOGG, - KC_4, KC_5, RM_NEXT, - KC_1, KC_2, KC_3, - KC_0, KC_PENT,_______ - ) -}; diff --git a/keyboards/boardsource/beiwagon/keymaps/default/keymap.json b/keyboards/boardsource/beiwagon/keymaps/default/keymap.json new file mode 100644 index 0000000000..b6ba14a076 --- /dev/null +++ b/keyboards/boardsource/beiwagon/keymaps/default/keymap.json @@ -0,0 +1,19 @@ +{ + "keyboard": "boardsource/beiwagon", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_7", "KC_8", "KC_9", + "KC_4", "KC_5", "KC_6", + "KC_1", "KC_2", "KC_3", + "KC_0", "KC_PENT", "MO(1)" + ], + [ + "QK_BOOT", "_______", "RM_TOGG", + "_______", "_______", "RM_NEXT", + "_______", "_______", "_______", + "_______", "_______", "_______" + ] + ] +} From 0bd02952eab98f3c2327b80705f03ce7ede6e100 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 24 Apr 2025 01:28:13 +0100 Subject: [PATCH 322/592] Remove `"command":false` from keyboards (#25193) --- keyboards/0xcb/1337/keyboard.json | 1 - keyboards/0xcb/static/keyboard.json | 1 - keyboards/0xcb/tutelpad/keyboard.json | 1 - keyboards/1upkeyboards/1up60hte/keyboard.json | 1 - keyboards/1upkeyboards/1up60rgb/keyboard.json | 1 - keyboards/1upkeyboards/1upocarina/keyboard.json | 1 - keyboards/1upkeyboards/1upslider8/keyboard.json | 1 - keyboards/1upkeyboards/1upsuper16v3/keyboard.json | 1 - keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json | 1 - keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json | 1 - keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json | 1 - keyboards/1upkeyboards/pi50/info.json | 1 - keyboards/1upkeyboards/pi60/keyboard.json | 1 - keyboards/1upkeyboards/pi60_hse/keyboard.json | 1 - keyboards/1upkeyboards/pi60_rgb/keyboard.json | 1 - keyboards/1upkeyboards/super16/keyboard.json | 1 - keyboards/1upkeyboards/super16v2/keyboard.json | 1 - keyboards/1upkeyboards/sweet16/info.json | 1 - keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json | 1 - keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json | 1 - keyboards/2key2crawl/keyboard.json | 1 - keyboards/30wer/keyboard.json | 1 - keyboards/3keyecosystem/2key2/keyboard.json | 1 - keyboards/40percentclub/4pack/keyboard.json | 1 - keyboards/40percentclub/luddite/keyboard.json | 1 - keyboards/40percentclub/mf68/keyboard.json | 1 - keyboards/40percentclub/nano/keyboard.json | 1 - keyboards/40percentclub/nein/keyboard.json | 1 - keyboards/40percentclub/polyandry/info.json | 1 - keyboards/40percentclub/sixpack/keyboard.json | 1 - keyboards/40percentclub/tomato/keyboard.json | 1 - keyboards/4pplet/aekiso60/rev_a/keyboard.json | 1 - keyboards/4pplet/bootleg/rev_a/keyboard.json | 1 - keyboards/4pplet/perk60_iso/rev_a/keyboard.json | 1 - keyboards/4pplet/steezy60/rev_a/keyboard.json | 1 - keyboards/4pplet/steezy60/rev_b/keyboard.json | 1 - keyboards/4pplet/unextended_std/rev_a/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_a/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_b/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_c/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json | 1 - keyboards/4pplet/waffling60/rev_e_iso/keyboard.json | 1 - keyboards/4pplet/waffling80/rev_a/keyboard.json | 1 - keyboards/4pplet/yakiimo/rev_a/keyboard.json | 1 - keyboards/7c8/framework/keyboard.json | 1 - keyboards/9key/keyboard.json | 1 - keyboards/a_jazz/akc084/keyboard.json | 1 - keyboards/abatskeyboardclub/nayeon/keyboard.json | 1 - keyboards/abstract/ellipse/rev1/keyboard.json | 1 - keyboards/acekeyboard/titan60/keyboard.json | 1 - keyboards/acheron/apollo/87h/delta/keyboard.json | 1 - keyboards/acheron/apollo/87htsc/keyboard.json | 1 - keyboards/acheron/apollo/88htsc/keyboard.json | 1 - keyboards/acheron/athena/alpha/keyboard.json | 1 - keyboards/acheron/athena/beta/keyboard.json | 1 - keyboards/acheron/elongate/delta/keyboard.json | 1 - keyboards/ada/infinity81/keyboard.json | 1 - keyboards/adm42/rev4/keyboard.json | 1 - keyboards/adpenrose/akemipad/keyboard.json | 1 - keyboards/adpenrose/kintsugi/keyboard.json | 1 - keyboards/adpenrose/obi/keyboard.json | 1 - keyboards/adpenrose/shisaku/keyboard.json | 1 - keyboards/aeboards/aegis/keyboard.json | 1 - keyboards/afternoonlabs/gust/rev1/keyboard.json | 1 - keyboards/ai/keyboard.json | 1 - keyboards/ai03/altair/keyboard.json | 1 - keyboards/ai03/altair_x/keyboard.json | 1 - keyboards/ai03/duet/keyboard.json | 1 - keyboards/ai03/equinox_xl/keyboard.json | 1 - keyboards/ai03/jp60/keyboard.json | 1 - keyboards/ai03/voyager60_alps/keyboard.json | 1 - keyboards/aidansmithdotdev/fine40/keyboard.json | 1 - keyboards/akb/ogr/keyboard.json | 1 - keyboards/akb/ogrn/keyboard.json | 1 - keyboards/akb/vero/keyboard.json | 1 - keyboards/akko/5087/keyboard.json | 1 - keyboards/akko/5108/keyboard.json | 1 - keyboards/akko/acr87/keyboard.json | 1 - keyboards/akko/top40/keyboard.json | 1 - keyboards/alf/x11/keyboard.json | 1 - keyboards/alf/x2/keyboard.json | 1 - keyboards/alfredslab/swift65/hotswap/keyboard.json | 1 - keyboards/alfredslab/swift65/solder/keyboard.json | 1 - keyboards/alhenkb/macropad5x4/keyboard.json | 1 - keyboards/alpha/keyboard.json | 1 - keyboards/amag23/keyboard.json | 1 - keyboards/amjkeyboard/amj40/keyboard.json | 1 - keyboards/amjkeyboard/amj60/keyboard.json | 1 - keyboards/amjkeyboard/amj84/keyboard.json | 1 - keyboards/an_achronism/tetromino/keyboard.json | 1 - keyboards/anavi/arrows/keyboard.json | 1 - keyboards/anavi/knob1/keyboard.json | 1 - keyboards/anavi/knobs3/keyboard.json | 1 - keyboards/anavi/macropad10/keyboard.json | 1 - keyboards/anavi/macropad12/keyboard.json | 1 - keyboards/anavi/macropad8/keyboard.json | 1 - keyboards/andean_condor/keyboard.json | 1 - keyboards/ano/keyboard.json | 1 - keyboards/anomalykb/a65i/keyboard.json | 1 - keyboards/aos/tkl/keyboard.json | 1 - keyboards/aplyard/aplx6/rev1/keyboard.json | 1 - keyboards/aplyard/aplx6/rev2/keyboard.json | 1 - keyboards/argo_works/ishi/80/mk0_avr/keyboard.json | 1 - keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json | 1 - keyboards/arisu/keyboard.json | 1 - keyboards/arrayperipherals/1x4p1/keyboard.json | 1 - keyboards/artemis/paragon/info.json | 1 - keyboards/ash1800/keyboard.json | 1 - keyboards/ash_xiix/keyboard.json | 1 - keyboards/ask55/keyboard.json | 1 - keyboards/atlantis/ak81_ve/keyboard.json | 1 - keyboards/atlantis/ps17/keyboard.json | 1 - keyboards/atlas_65/keyboard.json | 1 - keyboards/aves60/keyboard.json | 1 - keyboards/aves65/keyboard.json | 1 - keyboards/axolstudio/foundation_gamma/keyboard.json | 1 - keyboards/axolstudio/yeti/hotswap/keyboard.json | 1 - keyboards/axolstudio/yeti/soldered/keyboard.json | 1 - keyboards/bacca70/keyboard.json | 1 - keyboards/baguette/keyboard.json | 1 - keyboards/balloondogcaps/tr90/keyboard.json | 1 - keyboards/balloondogcaps/tr90pm/keyboard.json | 1 - keyboards/barracuda/keyboard.json | 1 - keyboards/bastardkb/dilemma/3x5_3/keyboard.json | 1 - keyboards/bastardkb/dilemma/4x6_4/keyboard.json | 1 - keyboards/bear_face/info.json | 1 - keyboards/beekeeb/piantor/keyboard.json | 1 - keyboards/beekeeb/piantor_pro/keyboard.json | 1 - keyboards/binepad/bn006/keyboard.json | 1 - keyboards/binepad/bn009/info.json | 1 - keyboards/binepad/bnr1/info.json | 1 - keyboards/binepad/pixie/keyboard.json | 1 - keyboards/bioi/f60/keyboard.json | 1 - keyboards/black_hellebore/keyboard.json | 1 - keyboards/blackplum/keyboard.json | 1 - keyboards/blank/blank01/keyboard.json | 1 - keyboards/blaster75/keyboard.json | 1 - keyboards/blockboy/ac980mini/keyboard.json | 1 - keyboards/boardrun/classic/keyboard.json | 1 - keyboards/bobpad/keyboard.json | 1 - keyboards/bolsa/bolsalice/keyboard.json | 1 - keyboards/bolsa/damapad/keyboard.json | 1 - keyboards/bop/keyboard.json | 1 - keyboards/boston/keyboard.json | 1 - keyboards/bpiphany/four_banger/keyboard.json | 1 - keyboards/bpiphany/frosty_flake/20130602/keyboard.json | 1 - keyboards/bpiphany/frosty_flake/20140521/keyboard.json | 1 - keyboards/bpiphany/sixshooter/keyboard.json | 1 - keyboards/bredworks/wyvern_hs/keyboard.json | 1 - keyboards/bschwind/key_ripper/keyboard.json | 1 - keyboards/bthlabs/geekpad/keyboard.json | 1 - keyboards/budgy/keyboard.json | 1 - keyboards/buildakb/mw60/keyboard.json | 1 - keyboards/buildakb/potato65/keyboard.json | 1 - keyboards/buildakb/potato65hs/keyboard.json | 1 - keyboards/buildakb/potato65s/keyboard.json | 1 - keyboards/butterkeebs/pocketpad/keyboard.json | 1 - keyboards/cablecardesigns/cypher/rev6/keyboard.json | 1 - keyboards/cablecardesigns/phoenix/keyboard.json | 1 - keyboards/caffeinated/serpent65/keyboard.json | 1 - keyboards/canary/canary60rgb/v1/keyboard.json | 1 - keyboards/cannonkeys/adelie/keyboard.json | 1 - keyboards/cannonkeys/atlas_alps/keyboard.json | 1 - keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json | 1 - keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json | 1 - keyboards/cannonkeys/bastion60/keyboard.json | 1 - keyboards/cannonkeys/bastion65/keyboard.json | 1 - keyboards/cannonkeys/bastion75/keyboard.json | 1 - keyboards/cannonkeys/bastiontkl/keyboard.json | 1 - keyboards/cannonkeys/brutalv2_1800/keyboard.json | 1 - keyboards/cannonkeys/caerdroia/keyboard.json | 1 - keyboards/cannonkeys/chimera65_hs/keyboard.json | 1 - keyboards/cannonkeys/ellipse/keyboard.json | 1 - keyboards/cannonkeys/ellipse_hs/keyboard.json | 1 - keyboards/cannonkeys/hoodrowg/keyboard.json | 1 - keyboards/cannonkeys/leviatan/keyboard.json | 1 - keyboards/cannonkeys/meetuppad2023/keyboard.json | 1 - keyboards/cannonkeys/moment/keyboard.json | 1 - keyboards/cannonkeys/moment_hs/keyboard.json | 1 - keyboards/cannonkeys/nearfield/keyboard.json | 1 - keyboards/cannonkeys/ortho48v2/keyboard.json | 1 - keyboards/cannonkeys/ortho60v2/keyboard.json | 1 - keyboards/cannonkeys/petrichor/keyboard.json | 1 - keyboards/cannonkeys/reverie/info.json | 1 - keyboards/cannonkeys/ripple/keyboard.json | 1 - keyboards/cannonkeys/ripple_hs/keyboard.json | 1 - keyboards/cannonkeys/satisfaction75/info.json | 1 - keyboards/cannonkeys/satisfaction75_hs/keyboard.json | 1 - keyboards/cannonkeys/serenity/keyboard.json | 1 - keyboards/cannonkeys/typeb/keyboard.json | 1 - keyboards/cannonkeys/vector/keyboard.json | 1 - keyboards/cannonkeys/vida/info.json | 1 - keyboards/cantor/keyboard.json | 1 - keyboards/capsunlocked/cu24/keyboard.json | 1 - keyboards/capsunlocked/cu65/keyboard.json | 1 - keyboards/capsunlocked/cu7/keyboard.json | 1 - keyboards/capsunlocked/cu80/v1/keyboard.json | 1 - keyboards/carbo65/keyboard.json | 1 - keyboards/cest73/tkm/keyboard.json | 1 - keyboards/chalice/keyboard.json | 1 - keyboards/chaos65/keyboard.json | 1 - keyboards/charue/charon/keyboard.json | 1 - keyboards/charue/sunsetter_r2/keyboard.json | 1 - keyboards/chavdai40/rev1/keyboard.json | 1 - keyboards/chavdai40/rev2/keyboard.json | 1 - keyboards/checkerboards/axon40/keyboard.json | 1 - keyboards/checkerboards/g_idb60/keyboard.json | 1 - keyboards/checkerboards/plexus75_he/keyboard.json | 1 - keyboards/checkerboards/pursuit40/keyboard.json | 1 - keyboards/checkerboards/quark_lp/keyboard.json | 1 - keyboards/checkerboards/quark_plus/keyboard.json | 1 - keyboards/checkerboards/ud40_ortho_alt/keyboard.json | 1 - keyboards/cherrybstudio/cb1800/keyboard.json | 1 - keyboards/cherrybstudio/cb65/keyboard.json | 1 - keyboards/cherrybstudio/cb87/keyboard.json | 1 - keyboards/cherrybstudio/cb87rgb/keyboard.json | 1 - keyboards/cherrybstudio/cb87v2/keyboard.json | 1 - keyboards/cheshire/curiosity/keyboard.json | 1 - keyboards/chew/keyboard.json | 1 - keyboards/chickenman/ciel/keyboard.json | 1 - keyboards/chickenman/ciel65/keyboard.json | 1 - keyboards/chill/ghoul/keyboard.json | 1 - keyboards/chlx/lfn_merro60/keyboard.json | 1 - keyboards/chlx/merro60/keyboard.json | 1 - keyboards/chlx/piche60/keyboard.json | 1 - keyboards/chlx/ppr_merro60/keyboard.json | 1 - keyboards/chocofly/v1/keyboard.json | 1 - keyboards/chocv/keyboard.json | 1 - keyboards/chord/zero/keyboard.json | 1 - keyboards/chosfox/cf81/keyboard.json | 1 - keyboards/chouchou/keyboard.json | 1 - keyboards/cipulot/kallos/keyboard.json | 1 - keyboards/ckeys/handwire_101/keyboard.json | 1 - keyboards/ckeys/obelus/keyboard.json | 1 - keyboards/ckeys/thedora/keyboard.json | 1 - keyboards/ckeys/washington/keyboard.json | 1 - keyboards/clap_studio/flame60/keyboard.json | 1 - keyboards/clawsome/fightpad/keyboard.json | 1 - keyboards/clueboard/17/keyboard.json | 1 - keyboards/clueboard/2x1800/2018/keyboard.json | 1 - keyboards/clueboard/60/keyboard.json | 1 - keyboards/clueboard/66/rev1/keyboard.json | 1 - keyboards/clueboard/66/rev2/keyboard.json | 1 - keyboards/clueboard/66/rev3/keyboard.json | 1 - keyboards/clueboard/66/rev4/keyboard.json | 1 - keyboards/clueboard/66_hotswap/prototype/keyboard.json | 1 - keyboards/clueboard/card/keyboard.json | 1 - keyboards/cmm_studio/fuji65/keyboard.json | 1 - keyboards/cmm_studio/saka68/solder/keyboard.json | 1 - keyboards/coban/pad3a/keyboard.json | 1 - keyboards/compound/keyboard.json | 1 - keyboards/concreteflowers/cor/keyboard.json | 1 - keyboards/concreteflowers/cor_tkl/keyboard.json | 1 - keyboards/contender/keyboard.json | 1 - keyboards/controllerworks/city42/keyboard.json | 1 - keyboards/controllerworks/mini36/keyboard.json | 1 - keyboards/controllerworks/mini42/keyboard.json | 1 - keyboards/converter/a1200/miss1200/keyboard.json | 1 - keyboards/converter/a1200/mistress1200/keyboard.json | 1 - keyboards/converter/a1200/teensy2pp/keyboard.json | 1 - keyboards/cool836a/keyboard.json | 1 - keyboards/copenhagen_click/click_pad_v1/keyboard.json | 1 - keyboards/coseyfannitutti/discipad/keyboard.json | 1 - keyboards/coseyfannitutti/romeo/keyboard.json | 1 - keyboards/cozykeys/bloomer/v2/keyboard.json | 1 - keyboards/cozykeys/bloomer/v3/keyboard.json | 1 - keyboards/cozykeys/speedo/v2/keyboard.json | 1 - keyboards/cradio/keyboard.json | 1 - keyboards/crawlpad/keyboard.json | 1 - keyboards/crazy_keyboard_68/keyboard.json | 1 - keyboards/crbn/keyboard.json | 1 - keyboards/creatkeebs/thera/keyboard.json | 1 - keyboards/custommk/ergostrafer/keyboard.json | 1 - keyboards/custommk/evo70/keyboard.json | 1 - keyboards/custommk/evo70_r2/keyboard.json | 1 - keyboards/cutie_club/borsdorf/keyboard.json | 1 - keyboards/cutie_club/fidelity/keyboard.json | 1 - keyboards/cutie_club/giant_macro_pad/keyboard.json | 1 - keyboards/cutie_club/keebcats/denis/keyboard.json | 1 - keyboards/cutie_club/keebcats/dougal/keyboard.json | 1 - keyboards/cutie_club/novus/keyboard.json | 1 - keyboards/cx60/keyboard.json | 1 - keyboards/cxt_studio/12e4/keyboard.json | 1 - keyboards/cybergear/macro25/keyboard.json | 1 - keyboards/dailycraft/bat43/info.json | 1 - keyboards/dailycraft/owl8/keyboard.json | 1 - keyboards/dailycraft/stickey4/keyboard.json | 1 - keyboards/daji/seis_cinco/keyboard.json | 1 - keyboards/dark/magnum_ergo_1/keyboard.json | 1 - keyboards/darkproject/kd83a_bfg_edition/keyboard.json | 1 - keyboards/darmoshark/k3/keyboard.json | 1 - keyboards/decent/tkl/keyboard.json | 1 - keyboards/delikeeb/flatbread60/keyboard.json | 1 - keyboards/delikeeb/vaguettelite/keyboard.json | 1 - keyboards/delikeeb/vanana/rev1/keyboard.json | 1 - keyboards/delikeeb/vanana/rev2/keyboard.json | 1 - keyboards/delikeeb/vaneela/keyboard.json | 1 - keyboards/delikeeb/vaneelaex/keyboard.json | 1 - keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json | 1 - keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json | 1 - keyboards/deltapad/keyboard.json | 1 - keyboards/demiurge/keyboard.json | 1 - keyboards/deng/djam/keyboard.json | 1 - keyboards/dinofizz/fnrow/v1/keyboard.json | 1 - keyboards/dk60/keyboard.json | 1 - keyboards/dm9records/lain/keyboard.json | 1 - keyboards/dmqdesign/spin/keyboard.json | 1 - keyboards/dnworks/frltkl/keyboard.json | 1 - keyboards/dnworks/sbl/keyboard.json | 1 - keyboards/do60/keyboard.json | 1 - keyboards/doio/kb04/keyboard.json | 1 - keyboards/doio/kb09/keyboard.json | 1 - keyboards/doio/kb12/keyboard.json | 1 - keyboards/doio/kb19/keyboard.json | 1 - keyboards/doio/kb30/keyboard.json | 1 - keyboards/doio/kb38/keyboard.json | 1 - keyboards/donutcables/scrabblepad/keyboard.json | 1 - keyboards/doodboard/duckboard/keyboard.json | 1 - keyboards/doodboard/duckboard_r2/keyboard.json | 1 - keyboards/doro67/rgb/keyboard.json | 1 - keyboards/dotmod/dymium65/keyboard.json | 1 - keyboards/dp3000/rev1/keyboard.json | 1 - keyboards/dp3000/rev2/keyboard.json | 1 - keyboards/draytronics/daisy/keyboard.json | 1 - keyboards/drewkeys/iskar/keyboard.json | 1 - keyboards/drhigsby/bkf/keyboard.json | 1 - keyboards/drhigsby/dubba175/keyboard.json | 1 - keyboards/drhigsby/ogurec/info.json | 1 - keyboards/drhigsby/packrat/keyboard.json | 1 - keyboards/drop/alt/v2/keyboard.json | 1 - keyboards/drop/cstm65/keyboard.json | 1 - keyboards/drop/cstm80/keyboard.json | 1 - keyboards/drop/ctrl/v2/keyboard.json | 1 - keyboards/drop/sense75/keyboard.json | 1 - keyboards/drop/shift/v2/keyboard.json | 1 - keyboards/drop/thekey/v1/keyboard.json | 1 - keyboards/drop/thekey/v2/keyboard.json | 1 - keyboards/druah/dk_saver_redux/keyboard.json | 1 - keyboards/dtisaac/cg108/keyboard.json | 1 - keyboards/dtisaac/dosa40rgb/keyboard.json | 1 - keyboards/dtisaac/dtisaac01/keyboard.json | 1 - keyboards/durgod/k320/base/keyboard.json | 1 - keyboards/dyz/dyz40/keyboard.json | 1 - keyboards/dyz/dyz60/keyboard.json | 1 - keyboards/dyz/dyz60_hs/keyboard.json | 1 - keyboards/dyz/dyz_tkl/keyboard.json | 1 - keyboards/dyz/selka40/keyboard.json | 1 - keyboards/dyz/synthesis60/keyboard.json | 1 - keyboards/dz60/keyboard.json | 1 - keyboards/dztech/bocc/keyboard.json | 1 - keyboards/dztech/duo_s/keyboard.json | 1 - keyboards/dztech/dz60v2/keyboard.json | 1 - keyboards/dztech/dz65rgb/v1/keyboard.json | 1 - keyboards/dztech/dz65rgb/v2/keyboard.json | 1 - keyboards/dztech/dz96/keyboard.json | 1 - keyboards/dztech/endless80/keyboard.json | 1 - keyboards/dztech/mellow/keyboard.json | 1 - keyboards/dztech/pluto/keyboard.json | 1 - keyboards/dztech/tofu/ii/v1/keyboard.json | 1 - keyboards/dztech/tofu/jr/v1/keyboard.json | 1 - keyboards/dztech/tofu/jr/v2/keyboard.json | 1 - keyboards/dztech/tofu60/keyboard.json | 1 - keyboards/ealdin/quadrant/keyboard.json | 1 - keyboards/earth_rover/keyboard.json | 1 - keyboards/eason/aeroboard/keyboard.json | 1 - keyboards/eason/capsule65/keyboard.json | 1 - keyboards/eason/greatsword80/keyboard.json | 1 - keyboards/eason/meow65/keyboard.json | 1 - keyboards/eason/void65h/keyboard.json | 1 - keyboards/ebastler/e80_1800/keyboard.json | 1 - keyboards/ebastler/isometria_75/rev1/keyboard.json | 1 - keyboards/edda/keyboard.json | 1 - keyboards/emajesty/eiri/keyboard.json | 1 - keyboards/emi20/keyboard.json | 1 - keyboards/emptystring/nqg/keyboard.json | 1 - keyboards/eniigmakeyboards/ek60/keyboard.json | 1 - keyboards/eniigmakeyboards/ek65/keyboard.json | 1 - keyboards/eniigmakeyboards/ek87/keyboard.json | 1 - keyboards/enviousdesign/60f/keyboard.json | 1 - keyboards/enviousdesign/65m/keyboard.json | 1 - keyboards/enviousdesign/commissions/mini1800/keyboard.json | 1 - keyboards/enviousdesign/delirium/rev0/keyboard.json | 1 - keyboards/enviousdesign/delirium/rev1/keyboard.json | 1 - keyboards/enviousdesign/delirium/rgb/keyboard.json | 1 - keyboards/enviousdesign/mcro/rev1/keyboard.json | 1 - keyboards/era/divine/keyboard.json | 1 - keyboards/era/era65/keyboard.json | 1 - keyboards/esca/getawayvan/keyboard.json | 1 - keyboards/esca/getawayvan_f042/keyboard.json | 1 - keyboards/eternal_keypad/keyboard.json | 1 - keyboards/etiennecollin/wave/keyboard.json | 1 - keyboards/evil80/keyboard.json | 1 - keyboards/evolv/keyboard.json | 1 - keyboards/evyd13/eon87/keyboard.json | 1 - keyboards/evyd13/fin_pad/keyboard.json | 1 - keyboards/evyd13/gh80_1800/keyboard.json | 1 - keyboards/evyd13/gh80_3700/keyboard.json | 1 - keyboards/evyd13/gud70/keyboard.json | 1 - keyboards/evyd13/mx5160/keyboard.json | 1 - keyboards/evyd13/nt210/keyboard.json | 1 - keyboards/evyd13/nt650/keyboard.json | 1 - keyboards/evyd13/nt750/keyboard.json | 1 - keyboards/evyd13/nt980/keyboard.json | 1 - keyboards/evyd13/omrontkl/keyboard.json | 1 - keyboards/evyd13/plain60/keyboard.json | 1 - keyboards/evyd13/quackfire/keyboard.json | 1 - keyboards/evyd13/solheim68/keyboard.json | 1 - keyboards/evyd13/ta65/keyboard.json | 1 - keyboards/exclusive/e65/keyboard.json | 1 - keyboards/exclusive/e6_rgb/keyboard.json | 1 - keyboards/exclusive/e6v2/le/keyboard.json | 1 - keyboards/exclusive/e6v2/oe/keyboard.json | 1 - keyboards/exclusive/e7v1/keyboard.json | 1 - keyboards/exclusive/e7v1se/keyboard.json | 1 - keyboards/eyeohdesigns/babyv/keyboard.json | 1 - keyboards/eyeohdesigns/theboulevard/keyboard.json | 1 - keyboards/falsonix/fx19/keyboard.json | 1 - keyboards/fatotesa/keyboard.json | 1 - keyboards/fearherbs1/blue_team_pad/keyboard.json | 1 - keyboards/feker/ik75/keyboard.json | 1 - keyboards/ffkeebs/puca/keyboard.json | 1 - keyboards/ffkeebs/siris/keyboard.json | 1 - keyboards/flashquark/horizon_z/keyboard.json | 1 - keyboards/flehrad/numbrero/keyboard.json | 1 - keyboards/flehrad/snagpad/keyboard.json | 1 - keyboards/flehrad/tradestation/keyboard.json | 1 - keyboards/fleuron/keyboard.json | 1 - keyboards/flx/lodestone/keyboard.json | 1 - keyboards/flx/virgo/keyboard.json | 1 - keyboards/foostan/cornelius/keyboard.json | 1 - keyboards/forever65/keyboard.json | 1 - keyboards/foxlab/key65/hotswap/keyboard.json | 1 - keyboards/foxlab/key65/universal/keyboard.json | 1 - keyboards/foxlab/leaf60/hotswap/keyboard.json | 1 - keyboards/foxlab/leaf60/universal/keyboard.json | 1 - keyboards/foxlab/time80/keyboard.json | 1 - keyboards/foxlab/time_re/hotswap/keyboard.json | 1 - keyboards/foxlab/time_re/universal/keyboard.json | 1 - keyboards/fr4/southpaw75/keyboard.json | 1 - keyboards/fr4/unix60/keyboard.json | 1 - keyboards/free_willy/keyboard.json | 1 - keyboards/friedrich/keyboard.json | 1 - keyboards/frobiac/blackbowl/keyboard.json | 1 - keyboards/frobiac/blackflat/keyboard.json | 1 - keyboards/frobiac/hypernano/keyboard.json | 1 - keyboards/frobiac/redtilt/keyboard.json | 1 - keyboards/frooastboard/nano/keyboard.json | 1 - keyboards/frooastboard/walnut/keyboard.json | 1 - keyboards/fs_streampad/keyboard.json | 1 - keyboards/ft/mars65/keyboard.json | 1 - keyboards/function96/v1/keyboard.json | 1 - keyboards/function96/v2/keyboard.json | 1 - keyboards/fungo/rev1/keyboard.json | 1 - keyboards/funky40/keyboard.json | 1 - keyboards/gami_studio/lex60/keyboard.json | 1 - keyboards/gboards/butterstick/keyboard.json | 1 - keyboards/geekboards/macropad_v2/keyboard.json | 1 - keyboards/geekboards/tester/keyboard.json | 1 - keyboards/geistmaschine/geist/keyboard.json | 1 - keyboards/geistmaschine/macropod/keyboard.json | 1 - keyboards/generic_panda/panda65_01/keyboard.json | 1 - keyboards/genone/eclipse_65/keyboard.json | 1 - keyboards/genone/g1_65/keyboard.json | 1 - keyboards/geonworks/ee_at/keyboard.json | 1 - keyboards/geonworks/frogmini/fmh/keyboard.json | 1 - keyboards/geonworks/frogmini/fms/keyboard.json | 1 - keyboards/geonworks/w1_at/keyboard.json | 1 - keyboards/gh60/revc/keyboard.json | 1 - keyboards/gh60/v1p3/keyboard.json | 1 - keyboards/gh80_3000/keyboard.json | 1 - keyboards/ghs/jem/info.json | 1 - keyboards/ghs/rar/keyboard.json | 1 - keyboards/ghs/xls/keyboard.json | 1 - keyboards/giabalanai/keyboard.json | 1 - keyboards/gizmo_engineering/gk6/keyboard.json | 1 - keyboards/gkeyboard/gkb_m16/keyboard.json | 1 - keyboards/gkeyboard/gpad8_2r/keyboard.json | 1 - keyboards/gkeyboard/greatpad/keyboard.json | 1 - keyboards/gl516/xr63gl/keyboard.json | 1 - keyboards/gmmk/gmmk2/p65/ansi/keyboard.json | 1 - keyboards/gmmk/gmmk2/p65/iso/keyboard.json | 1 - keyboards/gmmk/gmmk2/p96/ansi/keyboard.json | 1 - keyboards/gmmk/gmmk2/p96/iso/keyboard.json | 1 - keyboards/gmmk/pro/rev1/ansi/keyboard.json | 1 - keyboards/gmmk/pro/rev1/iso/keyboard.json | 1 - keyboards/gmmk/pro/rev2/ansi/keyboard.json | 1 - keyboards/gmmk/pro/rev2/iso/keyboard.json | 1 - keyboards/gorthage_truck/keyboard.json | 1 - keyboards/gowla/keyboard.json | 1 - keyboards/gray_studio/aero75/keyboard.json | 1 - keyboards/gray_studio/apollo80/keyboard.json | 1 - keyboards/gray_studio/space65/keyboard.json | 1 - keyboards/gray_studio/space65r3/keyboard.json | 1 - keyboards/gray_studio/think65v3/keyboard.json | 1 - keyboards/gregandcin/teaqueen/keyboard.json | 1 - keyboards/grid600/press/keyboard.json | 1 - keyboards/gummykey/keyboard.json | 1 - keyboards/gvalchca/ga150/keyboard.json | 1 - keyboards/gvalchca/spaccboard/keyboard.json | 1 - keyboards/h0oni/deskpad/keyboard.json | 1 - keyboards/h0oni/hotduck/keyboard.json | 1 - keyboards/hackpad/keyboard.json | 1 - keyboards/halokeys/elemental75/keyboard.json | 1 - keyboards/han60/keyboard.json | 1 - keyboards/hand88/keyboard.json | 1 - keyboards/handwired/10k/keyboard.json | 1 - keyboards/handwired/2x5keypad/keyboard.json | 1 - keyboards/handwired/3dortho14u/rev1/keyboard.json | 1 - keyboards/handwired/3dortho14u/rev2/keyboard.json | 1 - keyboards/handwired/3dp660_oled/keyboard.json | 1 - keyboards/handwired/6key/keyboard.json | 1 - keyboards/handwired/6macro/keyboard.json | 1 - keyboards/handwired/acacia/keyboard.json | 1 - keyboards/handwired/aim65/keyboard.json | 1 - keyboards/handwired/alcor_dactyl/keyboard.json | 1 - keyboards/handwired/amigopunk/keyboard.json | 1 - keyboards/handwired/angel/keyboard.json | 1 - keyboards/handwired/aplx2/keyboard.json | 1 - keyboards/handwired/aranck/keyboard.json | 1 - keyboards/handwired/axon/keyboard.json | 1 - keyboards/handwired/baredev/rev1/keyboard.json | 1 - keyboards/handwired/bolek/keyboard.json | 1 - keyboards/handwired/boss566y/redragon_vara/keyboard.json | 1 - keyboards/handwired/brain/keyboard.json | 1 - keyboards/handwired/bstk100/keyboard.json | 1 - keyboards/handwired/cans12er/keyboard.json | 1 - keyboards/handwired/chiron/keyboard.json | 1 - keyboards/handwired/co60/rev1/keyboard.json | 1 - keyboards/handwired/co60/rev6/keyboard.json | 1 - keyboards/handwired/co60/rev7/keyboard.json | 1 - keyboards/handwired/colorlice/keyboard.json | 1 - keyboards/handwired/concertina/64key/keyboard.json | 1 - keyboards/handwired/croxsplit44/keyboard.json | 1 - keyboards/handwired/curiosity/keyboard.json | 1 - keyboards/handwired/dactyl_kinesis/keyboard.json | 1 - keyboards/handwired/dactyl_lightcycle/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json | 1 - keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json | 1 - keyboards/handwired/dactyl_maximus/keyboard.json | 1 - keyboards/handwired/dactyl_tracer/keyboard.json | 1 - keyboards/handwired/dactylmacropad/keyboard.json | 1 - keyboards/handwired/daishi/keyboard.json | 1 - keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json | 1 - keyboards/handwired/dc/mc/001/keyboard.json | 1 - keyboards/handwired/ddg_56/keyboard.json | 1 - keyboards/handwired/dmote/keyboard.json | 1 - keyboards/handwired/eagleii/keyboard.json | 1 - keyboards/handwired/elrgo_s/keyboard.json | 1 - keyboards/handwired/frankie_macropad/keyboard.json | 1 - keyboards/handwired/freoduo/keyboard.json | 1 - keyboards/handwired/heisenberg/keyboard.json | 1 - keyboards/handwired/hnah108/keyboard.json | 1 - keyboards/handwired/hnah40/keyboard.json | 1 - keyboards/handwired/hnah40rgb/keyboard.json | 1 - keyboards/handwired/hwpm87/keyboard.json | 1 - keyboards/handwired/iso85k/keyboard.json | 1 - keyboards/handwired/itstleo9/info.json | 1 - keyboards/handwired/jn68m/keyboard.json | 1 - keyboards/handwired/jopr/keyboard.json | 1 - keyboards/handwired/jot50/keyboard.json | 1 - keyboards/handwired/jotanck/keyboard.json | 1 - keyboards/handwired/jotlily60/keyboard.json | 1 - keyboards/handwired/jotpad16/keyboard.json | 1 - keyboards/handwired/juliet/keyboard.json | 1 - keyboards/handwired/k8split/keyboard.json | 1 - keyboards/handwired/kbod/keyboard.json | 1 - keyboards/handwired/leftynumpad/keyboard.json | 1 - keyboards/handwired/lovelive9/keyboard.json | 1 - keyboards/handwired/marauder/keyboard.json | 1 - keyboards/handwired/marek128b/ergosplit44/keyboard.json | 1 - keyboards/handwired/mechboards_micropad/keyboard.json | 1 - keyboards/handwired/misterdeck/keyboard.json | 1 - keyboards/handwired/mutepad/keyboard.json | 1 - keyboards/handwired/nicekey/keyboard.json | 1 - keyboards/handwired/not_so_minidox/keyboard.json | 1 - keyboards/handwired/nozbe_macro/keyboard.json | 1 - keyboards/handwired/oem_ansi_fullsize/keyboard.json | 1 - keyboards/handwired/onekey/info.json | 1 - keyboards/handwired/orbweaver/keyboard.json | 1 - keyboards/handwired/osborne1/keyboard.json | 1 - keyboards/handwired/p65rgb/keyboard.json | 1 - keyboards/handwired/petruziamini/keyboard.json | 1 - keyboards/handwired/phantagom/baragon/keyboard.json | 1 - keyboards/handwired/phantagom/varan/keyboard.json | 1 - keyboards/handwired/polly40/keyboard.json | 1 - keyboards/handwired/prime_exl/keyboard.json | 1 - keyboards/handwired/prime_exl_plus/keyboard.json | 1 - keyboards/handwired/pteron/keyboard.json | 1 - keyboards/handwired/pteron38/keyboard.json | 1 - keyboards/handwired/pteron44/keyboard.json | 1 - keyboards/handwired/qc60/proto/keyboard.json | 1 - keyboards/handwired/rabijl/rotary_numpad/keyboard.json | 1 - keyboards/handwired/riblee_split/keyboard.json | 1 - keyboards/handwired/rs60/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto34/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto36/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto37/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto40/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto61/keyboard.json | 1 - keyboards/handwired/scottokeebs/scotto9/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoalp/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottocmd/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottodeck/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoergo/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottofly/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottofrog/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottogame/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottohazard/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoinvader/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottokatana/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottolong/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottomouse/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottonum/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottoslant/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottosplit/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottostarter/keyboard.json | 1 - keyboards/handwired/scottokeebs/scottowing/keyboard.json | 1 - keyboards/handwired/sejin_eat1010r2/keyboard.json | 1 - keyboards/handwired/sick_pad/keyboard.json | 1 - keyboards/handwired/snatchpad/keyboard.json | 1 - keyboards/handwired/sono1/info.json | 1 - keyboards/handwired/space_oddity/keyboard.json | 1 - keyboards/handwired/split65/promicro/keyboard.json | 1 - keyboards/handwired/split89/keyboard.json | 1 - keyboards/handwired/starrykeebs/dude09/keyboard.json | 1 - keyboards/handwired/steamvan/rev1/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x3/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x4/keyboard.json | 1 - keyboards/handwired/stream_cheap/2x5/keyboard.json | 1 - keyboards/handwired/swiftrax/astro65/keyboard.json | 1 - keyboards/handwired/swiftrax/bebol/keyboard.json | 1 - keyboards/handwired/swiftrax/beegboy/keyboard.json | 1 - keyboards/handwired/swiftrax/bumblebee/keyboard.json | 1 - keyboards/handwired/swiftrax/cowfish/keyboard.json | 1 - keyboards/handwired/swiftrax/digicarp65/keyboard.json | 1 - keyboards/handwired/swiftrax/digicarpice/keyboard.json | 1 - keyboards/handwired/swiftrax/equator/keyboard.json | 1 - keyboards/handwired/swiftrax/glacier/keyboard.json | 1 - keyboards/handwired/swiftrax/joypad/keyboard.json | 1 - keyboards/handwired/swiftrax/koalafications/keyboard.json | 1 - keyboards/handwired/swiftrax/nodu/keyboard.json | 1 - keyboards/handwired/swiftrax/pandamic/keyboard.json | 1 - keyboards/handwired/swiftrax/the_galleon/keyboard.json | 1 - keyboards/handwired/swiftrax/unsplit/keyboard.json | 1 - keyboards/handwired/swiftrax/walter/keyboard.json | 1 - keyboards/handwired/symmetry60/keyboard.json | 1 - keyboards/handwired/t111/keyboard.json | 1 - keyboards/handwired/tkk/keyboard.json | 1 - keyboards/handwired/traveller/keyboard.json | 1 - keyboards/handwired/tsubasa/keyboard.json | 1 - keyboards/handwired/twig/twig50/keyboard.json | 1 - keyboards/handwired/unicomp_mini_m/keyboard.json | 1 - keyboards/handwired/uthol/rev1/keyboard.json | 1 - keyboards/handwired/uthol/rev2/keyboard.json | 1 - keyboards/handwired/videowriter/keyboard.json | 1 - keyboards/handwired/wakizashi40/keyboard.json | 1 - keyboards/handwired/wwa/helios/keyboard.json | 1 - keyboards/handwired/wwa/kepler/keyboard.json | 1 - keyboards/handwired/wwa/mercury/keyboard.json | 1 - keyboards/handwired/wwa/soyuz/keyboard.json | 1 - keyboards/handwired/wwa/soyuzxl/keyboard.json | 1 - keyboards/handwired/z150/keyboard.json | 1 - keyboards/handwired/ziyoulang_k3_mod/keyboard.json | 1 - keyboards/hardlineworks/otd_plus/keyboard.json | 1 - keyboards/hardwareabstraction/handwire/keyboard.json | 1 - keyboards/heliar/wm1_hotswap/keyboard.json | 1 - keyboards/heliotrope/keyboard.json | 1 - keyboards/hfdkb/ac001/keyboard.json | 1 - keyboards/hhkb_lite_2/keyboard.json | 1 - keyboards/hidtech/bastyl/keyboard.json | 1 - keyboards/hifumi/keyboard.json | 1 - keyboards/hineybush/h08_ocelot/keyboard.json | 1 - keyboards/hineybush/h101/keyboard.json | 1 - keyboards/hineybush/h60/keyboard.json | 1 - keyboards/hineybush/h65/keyboard.json | 1 - keyboards/hineybush/h65_hotswap/keyboard.json | 1 - keyboards/hineybush/h660s/keyboard.json | 1 - keyboards/hineybush/h75_singa/keyboard.json | 1 - keyboards/hineybush/h87_g2/keyboard.json | 1 - keyboards/hineybush/h87a/keyboard.json | 1 - keyboards/hineybush/h88/keyboard.json | 1 - keyboards/hineybush/h88_g2/keyboard.json | 1 - keyboards/hineybush/ibis/keyboard.json | 1 - keyboards/hineybush/physix/keyboard.json | 1 - keyboards/hineybush/sm68/keyboard.json | 1 - keyboards/holyswitch/lightweight65/keyboard.json | 1 - keyboards/holyswitch/southpaw75/keyboard.json | 1 - keyboards/horizon/keyboard.json | 1 - keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json | 1 - keyboards/horrortroll/caticorn/rev1/solder/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json | 1 - keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json | 1 - keyboards/horrortroll/nyx/rev1/keyboard.json | 1 - keyboards/horrortroll/paws60/keyboard.json | 1 - keyboards/hotdox76v2/keyboard.json | 1 - keyboards/hp69/keyboard.json | 1 - keyboards/hubble/keyboard.json | 1 - keyboards/huytbt/h50/keyboard.json | 1 - keyboards/ianklug/grooveboard/keyboard.json | 1 - keyboards/ibm/model_m/ashpil_usbc/keyboard.json | 1 - keyboards/ibm/model_m/modelh/keyboard.json | 1 - keyboards/ibm/model_m/teensy2/keyboard.json | 1 - keyboards/ibm/model_m/yugo_m/keyboard.json | 1 - keyboards/ibnuda/alicia_cook/keyboard.json | 1 - keyboards/ibnuda/gurindam/keyboard.json | 1 - keyboards/icebreaker/hotswap/keyboard.json | 1 - keyboards/idank/sweeq/keyboard.json | 1 - keyboards/idb/idb_60/keyboard.json | 1 - keyboards/idobao/id42/keyboard.json | 1 - keyboards/idobao/id61/keyboard.json | 1 - keyboards/idobao/id63/keyboard.json | 1 - keyboards/idobao/id67/keyboard.json | 1 - keyboards/idobao/id75/v1/keyboard.json | 1 - keyboards/idobao/id75/v2/keyboard.json | 1 - keyboards/idobao/id80/v2/info.json | 1 - keyboards/idobao/id80/v3/ansi/keyboard.json | 1 - keyboards/idobao/id87/v1/keyboard.json | 1 - keyboards/idobao/id87/v2/keyboard.json | 1 - keyboards/idobao/id96/keyboard.json | 1 - keyboards/idobao/montex/v1/keyboard.json | 1 - keyboards/idobao/montex/v1rgb/keyboard.json | 1 - keyboards/idobao/montex/v2/keyboard.json | 1 - keyboards/idyllic/tinny50_rgb/keyboard.json | 1 - keyboards/igloo/keyboard.json | 1 - keyboards/ilumkb/primus75/keyboard.json | 1 - keyboards/ilumkb/volcano660/keyboard.json | 1 - keyboards/inett_studio/sqx/hotswap/keyboard.json | 1 - keyboards/inett_studio/sqx/universal/keyboard.json | 1 - keyboards/inland/mk47/keyboard.json | 1 - keyboards/inland/v83p/keyboard.json | 1 - keyboards/input_club/k_type/keyboard.json | 1 - keyboards/io_mini1800/keyboard.json | 1 - keyboards/irene/keyboard.json | 1 - keyboards/iriskeyboards/keyboard.json | 1 - keyboards/itstleo/itstleo40/keyboard.json | 1 - keyboards/jacky_studio/s7_elephant/rev1/keyboard.json | 1 - keyboards/jacky_studio/s7_elephant/rev2/keyboard.json | 1 - keyboards/jadookb/jkb65/info.json | 1 - keyboards/janus/keyboard.json | 1 - keyboards/jaykeeb/aumz_work/info.json | 1 - keyboards/jaykeeb/jk60/keyboard.json | 1 - keyboards/jaykeeb/jk60rgb/keyboard.json | 1 - keyboards/jaykeeb/jk65/keyboard.json | 1 - keyboards/jaykeeb/joker/keyboard.json | 1 - keyboards/jaykeeb/kamigakushi/keyboard.json | 1 - keyboards/jaykeeb/orba/keyboard.json | 1 - keyboards/jaykeeb/sebelas/keyboard.json | 1 - keyboards/jaykeeb/skyline/keyboard.json | 1 - keyboards/jaykeeb/sriwedari70/keyboard.json | 1 - keyboards/jaykeeb/tokki/keyboard.json | 1 - keyboards/jc65/v32u4/keyboard.json | 1 - keyboards/jd40/keyboard.json | 1 - keyboards/jels/boaty/keyboard.json | 3 +-- keyboards/jels/jels60/v1/keyboard.json | 1 - keyboards/jels/jels60/v2/keyboard.json | 1 - keyboards/jels/jels88/keyboard.json | 1 - keyboards/jkdlab/binary_monkey/keyboard.json | 1 - keyboards/jkeys_design/gentleman65/keyboard.json | 1 - keyboards/jkeys_design/gentleman65_se_s/keyboard.json | 1 - keyboards/jolofsor/denial75/keyboard.json | 1 - keyboards/joshajohnson/hub20/keyboard.json | 1 - keyboards/jukaie/jk01/keyboard.json | 1 - keyboards/k34/keyboard.json | 1 - keyboards/kabedon/kabedon78s/keyboard.json | 1 - keyboards/kabedon/kabedon980/keyboard.json | 1 - keyboards/kabedon/kabedon98e/keyboard.json | 1 - keyboards/kagizaraya/halberd/keyboard.json | 1 - keyboards/kagizaraya/miniaxe/keyboard.json | 1 - keyboards/kakunpc/rabbit_capture_plan/keyboard.json | 1 - keyboards/kalakos/bahrnob/keyboard.json | 1 - keyboards/kaly/kaly42/keyboard.json | 1 - keyboards/kapcave/arya/keyboard.json | 1 - keyboards/kapcave/gskt00/keyboard.json | 1 - keyboards/kapcave/paladin64/keyboard.json | 1 - keyboards/kapcave/paladinpad/info.json | 1 - keyboards/karn/keyboard.json | 1 - keyboards/kb_elmo/67mk_e/keyboard.json | 1 - keyboards/kb_elmo/noah_avr/keyboard.json | 1 - keyboards/kb_elmo/qez/keyboard.json | 1 - keyboards/kb_elmo/vertex/keyboard.json | 1 - keyboards/kbdcraft/adam64/keyboard.json | 1 - keyboards/kbdfans/baguette66/rgb/keyboard.json | 1 - keyboards/kbdfans/baguette66/soldered/keyboard.json | 1 - keyboards/kbdfans/bella/soldered/keyboard.json | 1 - keyboards/kbdfans/boop65/rgb/keyboard.json | 1 - keyboards/kbdfans/bounce/75/hotswap/keyboard.json | 1 - keyboards/kbdfans/bounce/75/soldered/keyboard.json | 1 - keyboards/kbdfans/d45/v2/keyboard.json | 1 - keyboards/kbdfans/epoch80/keyboard.json | 1 - keyboards/kbdfans/kbd19x/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json | 1 - keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json | 1 - keyboards/kbdfans/kbd67/rev2/keyboard.json | 1 - keyboards/kbdfans/kbd6x/keyboard.json | 1 - keyboards/kbdfans/kbd75hs/keyboard.json | 1 - keyboards/kbdfans/kbd75rgb/keyboard.json | 1 - keyboards/kbdfans/kbdmini/keyboard.json | 1 - keyboards/kbdfans/kbdpad/mk1/keyboard.json | 1 - keyboards/kbdfans/kbdpad/mk3/keyboard.json | 1 - keyboards/kbdfans/maja/keyboard.json | 1 - keyboards/kbdfans/maja_soldered/keyboard.json | 1 - keyboards/kbdfans/odin/rgb/keyboard.json | 1 - keyboards/kbdfans/odin/soldered/keyboard.json | 1 - keyboards/kbdfans/odin/v2/keyboard.json | 1 - keyboards/kbdfans/odin75/keyboard.json | 1 - keyboards/kbdfans/odinmini/keyboard.json | 1 - keyboards/kbdfans/phaseone/keyboard.json | 1 - keyboards/kbdfans/tiger80/keyboard.json | 1 - keyboards/kbnordic/nordic60/rev_a/keyboard.json | 1 - keyboards/kbnordic/nordic65/rev_a/keyboard.json | 1 - keyboards/kc60se/keyboard.json | 1 - keyboards/keebio/bamfk4/keyboard.json | 1 - keyboards/keebio/bigswitchseat/keyboard.json | 1 - keyboards/keebio/cepstrum/info.json | 1 - keyboards/keebio/convolution/info.json | 1 - keyboards/keebio/dilly/keyboard.json | 1 - keyboards/keebio/ergodicity/keyboard.json | 1 - keyboards/keebio/iris/rev1/keyboard.json | 1 - keyboards/keebio/iris/rev1_led/keyboard.json | 1 - keyboards/keebio/iris/rev5/keyboard.json | 1 - keyboards/keebio/laplace/keyboard.json | 1 - keyboards/keebio/nyquist/rev2/keyboard.json | 1 - keyboards/keebio/nyquist/rev3/keyboard.json | 1 - keyboards/keebio/sinc/info.json | 1 - keyboards/keebio/stick/keyboard.json | 1 - keyboards/keebio/tragicforce68/keyboard.json | 1 - keyboards/keebio/wtf60/keyboard.json | 1 - keyboards/keebmonkey/kbmg68/keyboard.json | 1 - keyboards/keebsforall/freebird60/keyboard.json | 1 - keyboards/keebsforall/freebird75/keyboard.json | 1 - keyboards/keebsforall/freebirdnp/lite/keyboard.json | 1 - keyboards/keebsforall/freebirdnp/pro/keyboard.json | 1 - keyboards/keebsforall/freebirdtkl/keyboard.json | 1 - keyboards/keebzdotnet/fme/keyboard.json | 1 - keyboards/keebzdotnet/wazowski/keyboard.json | 1 - keyboards/kegen/gboy/keyboard.json | 1 - keyboards/kelwin/utopia88/keyboard.json | 1 - keyboards/kepler_33/proto/keyboard.json | 1 - keyboards/keybage/radpad/keyboard.json | 1 - keyboards/keybee/keybee65/keyboard.json | 1 - keyboards/keycapsss/3w6_2040/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev1/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev2/keyboard.json | 1 - keyboards/keycapsss/plaid_pad/rev3/keyboard.json | 1 - keyboards/keychron/c1_pro/info.json | 1 - keyboards/keychron/c1_pro_v2/info.json | 1 - keyboards/keychron/c2_pro/info.json | 1 - keyboards/keychron/c2_pro_v2/info.json | 1 - keyboards/keychron/c3_pro/info.json | 1 - keyboards/keychron/q0/info.json | 1 - keyboards/keychron/q11/info.json | 1 - keyboards/keychron/q1v1/info.json | 1 - keyboards/keychron/q1v2/info.json | 1 - keyboards/keychron/q2/info.json | 1 - keyboards/keychron/q3/info.json | 1 - keyboards/keychron/q4/info.json | 1 - keyboards/keychron/q5/info.json | 1 - keyboards/keychron/q60/ansi/keyboard.json | 1 - keyboards/keychron/q7/info.json | 1 - keyboards/keychron/q8/info.json | 1 - keyboards/keychron/q9/info.json | 1 - keyboards/keychron/q9_plus/info.json | 1 - keyboards/keychron/s1/ansi/rgb/keyboard.json | 1 - keyboards/keychron/s1/ansi/white/keyboard.json | 1 - keyboards/keychron/v2/ansi/keyboard.json | 1 - keyboards/keychron/v2/ansi_encoder/keyboard.json | 1 - keyboards/keychron/v2/iso/keyboard.json | 1 - keyboards/keychron/v2/iso_encoder/keyboard.json | 1 - keyboards/keychron/v2/jis/keyboard.json | 1 - keyboards/keychron/v2/jis_encoder/keyboard.json | 1 - keyboards/keychron/v3/ansi/keyboard.json | 1 - keyboards/keychron/v3/iso/keyboard.json | 1 - keyboards/keychron/v3/jis/keyboard.json | 1 - keyboards/keychron/v4/ansi/keyboard.json | 1 - keyboards/keychron/v4/iso/keyboard.json | 1 - keyboards/keychron/v7/ansi/keyboard.json | 1 - keyboards/keychron/v7/iso/keyboard.json | 1 - keyboards/keychron/v8/ansi/keyboard.json | 1 - keyboards/keychron/v8/ansi_encoder/keyboard.json | 1 - keyboards/keychron/v8/iso/keyboard.json | 1 - keyboards/keychron/v8/iso_encoder/keyboard.json | 1 - keyboards/keyhive/absinthe/keyboard.json | 1 - keyboards/keyhive/opus/keyboard.json | 1 - keyboards/keyhive/smallice/keyboard.json | 1 - keyboards/keyhive/southpole/keyboard.json | 1 - keyboards/keyhive/ut472/keyboard.json | 1 - keyboards/keyprez/bison/keyboard.json | 1 - keyboards/keyprez/corgi/keyboard.json | 1 - keyboards/keyprez/rhino/keyboard.json | 1 - keyboards/keyprez/unicorn/keyboard.json | 1 - keyboards/keyquest/enclave/keyboard.json | 1 - keyboards/keysofkings/twokey/keyboard.json | 1 - keyboards/keyspensory/kp60/keyboard.json | 1 - keyboards/keystonecaps/gameroyadvance/keyboard.json | 1 - keyboards/keyten/aperture/keyboard.json | 1 - keyboards/keyten/diablo/keyboard.json | 1 - keyboards/keyten/kt3700/keyboard.json | 1 - keyboards/keyten/kt60_m/keyboard.json | 1 - keyboards/keyten/lisa/keyboard.json | 1 - keyboards/kibou/fukuro/keyboard.json | 1 - keyboards/kibou/harbour/keyboard.json | 1 - keyboards/kibou/suisei/keyboard.json | 1 - keyboards/kibou/wendy/keyboard.json | 1 - keyboards/kibou/winter/keyboard.json | 1 - keyboards/kikkou/keyboard.json | 1 - keyboards/kikoslab/ellora65/keyboard.json | 1 - keyboards/kikoslab/kl90/keyboard.json | 1 - keyboards/kin80/info.json | 1 - keyboards/kindakeyboards/conone65/keyboard.json | 1 - keyboards/kinesis/alvicstep/keyboard.json | 1 - keyboards/kinesis/kint2pp/keyboard.json | 1 - keyboards/kinesis/kint36/keyboard.json | 1 - keyboards/kinesis/kint41/keyboard.json | 1 - keyboards/kinesis/kintlc/keyboard.json | 1 - keyboards/kinesis/kintwin/keyboard.json | 1 - keyboards/kinesis/stapelberg/keyboard.json | 1 - keyboards/kineticlabs/emu/hotswap/keyboard.json | 1 - keyboards/kineticlabs/emu/soldered/keyboard.json | 1 - keyboards/kingly_keys/ave/ortho/keyboard.json | 1 - keyboards/kingly_keys/ave/staggered/keyboard.json | 1 - keyboards/kingly_keys/little_foot/keyboard.json | 1 - keyboards/kingly_keys/romac/keyboard.json | 1 - keyboards/kingly_keys/romac_plus/keyboard.json | 1 - keyboards/kingly_keys/ropro/keyboard.json | 1 - keyboards/kingly_keys/soap/keyboard.json | 1 - keyboards/kiserdesigns/madeline/keyboard.json | 1 - keyboards/kiwikeebs/macro/keyboard.json | 1 - keyboards/kiwikeebs/macro_v2/keyboard.json | 1 - keyboards/kiwikey/wanderland/keyboard.json | 1 - keyboards/kj_modify/rs40/keyboard.json | 1 - keyboards/kk/65/keyboard.json | 1 - keyboards/kkatano/bakeneko60/keyboard.json | 1 - keyboards/kkatano/bakeneko65/rev2/keyboard.json | 1 - keyboards/kkatano/bakeneko65/rev3/keyboard.json | 1 - keyboards/knobgoblin/keyboard.json | 1 - keyboards/kopibeng/tgr_lena/keyboard.json | 1 - keyboards/kopibeng/xt60/keyboard.json | 1 - keyboards/kopibeng/xt60_singa/keyboard.json | 1 - keyboards/kprepublic/bm16a/v1/keyboard.json | 1 - keyboards/kprepublic/bm16a/v2/keyboard.json | 1 - keyboards/kprepublic/bm16s/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm43hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json | 1 - keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json | 1 - keyboards/kprepublic/bm80hsrgb/keyboard.json | 1 - keyboards/kprepublic/bm80v2/keyboard.json | 1 - keyboards/kprepublic/bm80v2_iso/keyboard.json | 1 - keyboards/kprepublic/bm980hsrgb/keyboard.json | 1 - keyboards/kprepublic/cospad/keyboard.json | 1 - keyboards/kprepublic/cstc40/info.json | 1 - keyboards/kprepublic/jj4x4/keyboard.json | 1 - keyboards/kradoindustries/kousa/keyboard.json | 1 - keyboards/kradoindustries/krado66/keyboard.json | 1 - keyboards/kradoindustries/promenade/keyboard.json | 1 - keyboards/kradoindustries/promenade_rp24s/keyboard.json | 1 - keyboards/kraken_jones/pteron56/keyboard.json | 1 - keyboards/ktec/daisy/keyboard.json | 1 - keyboards/ktec/staryu/keyboard.json | 1 - keyboards/kuro/kuro65/keyboard.json | 1 - keyboards/kwstudio/pisces/keyboard.json | 1 - keyboards/kwub/bloop/keyboard.json | 1 - keyboards/labbe/labbeminiv1/keyboard.json | 1 - keyboards/labyrinth75/keyboard.json | 1 - keyboards/laneware/lpad/keyboard.json | 1 - keyboards/laneware/lw67/keyboard.json | 1 - keyboards/laneware/lw75/keyboard.json | 1 - keyboards/laneware/macro1/keyboard.json | 1 - keyboards/laneware/raindrop/keyboard.json | 1 - keyboards/large_lad/keyboard.json | 1 - keyboards/laser_ninja/pumpkinpad/keyboard.json | 1 - keyboards/latincompass/latin17rgb/keyboard.json | 1 - keyboards/latincompass/latin60rgb/keyboard.json | 1 - keyboards/latincompass/latinpad/keyboard.json | 1 - keyboards/latincompass/latinpadble/keyboard.json | 1 - keyboards/lazydesigners/bolt/keyboard.json | 1 - keyboards/lazydesigners/cassette8/keyboard.json | 1 - keyboards/lazydesigners/dimpleplus/keyboard.json | 1 - keyboards/lazydesigners/the30/keyboard.json | 1 - keyboards/lazydesigners/the40/keyboard.json | 1 - keyboards/lazydesigners/the50/keyboard.json | 1 - keyboards/lazydesigners/the60/rev1/keyboard.json | 1 - keyboards/lazydesigners/the60/rev2/keyboard.json | 1 - keyboards/leafcutterlabs/bigknob/keyboard.json | 1 - keyboards/leeku/finger65/keyboard.json | 1 - keyboards/lendunistus/rpneko65/rev1/keyboard.json | 1 - keyboards/lfkeyboards/lfk87/info.json | 1 - keyboards/lfkeyboards/lfkpad/keyboard.json | 1 - keyboards/lfkeyboards/smk65/info.json | 1 - keyboards/lgbtkl/keyboard.json | 1 - keyboards/linworks/dolice/keyboard.json | 1 - keyboards/linworks/em8/keyboard.json | 1 - keyboards/linworks/fave104/keyboard.json | 1 - keyboards/linworks/fave60/keyboard.json | 1 - keyboards/linworks/fave84h/keyboard.json | 1 - keyboards/linworks/fave87/keyboard.json | 1 - keyboards/linworks/whale75/keyboard.json | 1 - keyboards/littlealby/mute/keyboard.json | 1 - keyboards/lizard_trick/tenkey_plusplus/keyboard.json | 1 - keyboards/ll3macorn/bongopad/keyboard.json | 1 - keyboards/lm_keyboard/lm60n/keyboard.json | 1 - keyboards/longnald/corin/keyboard.json | 1 - keyboards/lostdotfish/rp2040_orbweaver/keyboard.json | 1 - keyboards/lxxt/keyboard.json | 1 - keyboards/lyso1/lefishe/keyboard.json | 1 - keyboards/m10a/keyboard.json | 1 - keyboards/machine_industries/m4_a/keyboard.json | 1 - keyboards/machkeyboards/mach3/keyboard.json | 1 - keyboards/macrocat/keyboard.json | 1 - keyboards/madjax_macropad/keyboard.json | 1 - keyboards/makeymakey/keyboard.json | 1 - keyboards/makrosu/keyboard.json | 1 - keyboards/malevolti/superlyra/rev1/keyboard.json | 1 - keyboards/manyboard/macro/keyboard.json | 1 - keyboards/maple_computing/6ball/keyboard.json | 1 - keyboards/maple_computing/christmas_tree/v2017/keyboard.json | 1 - keyboards/mariorion_v25/prod/keyboard.json | 1 - keyboards/mariorion_v25/proto/keyboard.json | 1 - keyboards/marksard/leftover30/keyboard.json | 1 - keyboards/marksard/treadstone32/info.json | 1 - keyboards/matchstickworks/normiepad/keyboard.json | 1 - keyboards/matchstickworks/southpad/rev1/keyboard.json | 1 - keyboards/matchstickworks/southpad/rev2/keyboard.json | 1 - keyboards/matrix/cain_re/keyboard.json | 1 - keyboards/matrix/falcon/keyboard.json | 1 - keyboards/matrix/m12og/rev2/keyboard.json | 1 - keyboards/matrix/me/keyboard.json | 1 - keyboards/matthewdias/m3n3van/keyboard.json | 1 - keyboards/matthewdias/minim/keyboard.json | 1 - keyboards/matthewdias/model_v/keyboard.json | 1 - keyboards/matthewdias/txuu/keyboard.json | 1 - keyboards/maxipad/info.json | 1 - keyboards/maxr1998/pulse4k/keyboard.json | 1 - keyboards/mazestudio/jocker/keyboard.json | 1 - keyboards/mb44/keyboard.json | 1 - keyboards/mc_76k/keyboard.json | 1 - keyboards/mechanickeys/miniashen40/keyboard.json | 1 - keyboards/mechanickeys/undead60m/keyboard.json | 1 - keyboards/mechbrewery/mb65h/keyboard.json | 1 - keyboards/mechbrewery/mb65s/keyboard.json | 1 - keyboards/mechkeys/acr60/keyboard.json | 1 - keyboards/mechkeys/alu84/keyboard.json | 1 - keyboards/mechkeys/mk60/keyboard.json | 1 - keyboards/mechllama/g35/info.json | 1 - keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json | 1 - .../mechlovin/adelais/standard_led/avr/rev1/keyboard.json | 1 - keyboards/mechlovin/infinityce/keyboard.json | 1 - keyboards/mechlovin/kanu/keyboard.json | 1 - keyboards/mechlovin/kay60/keyboard.json | 1 - keyboards/mechlovin/kay65/keyboard.json | 1 - keyboards/mechlovin/pisces/keyboard.json | 1 - keyboards/mechstudio/dawn/keyboard.json | 1 - keyboards/mechwild/mercutio/keyboard.json | 1 - keyboards/mechwild/murphpad/keyboard.json | 1 - keyboards/mechwild/obe/info.json | 1 - keyboards/mechwild/sugarglider/f401/keyboard.json | 1 - keyboards/mechwild/sugarglider/f411/keyboard.json | 1 - keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json | 1 - keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json | 1 - keyboards/meletrix/zoom65/keyboard.json | 1 - keyboards/meletrix/zoom65_lite/keyboard.json | 1 - keyboards/meletrix/zoom75/keyboard.json | 1 - keyboards/meletrix/zoom87/keyboard.json | 1 - keyboards/meletrix/zoom98/keyboard.json | 1 - keyboards/melgeek/mach80/rev1/keyboard.json | 1 - keyboards/melgeek/mach80/rev2/keyboard.json | 1 - keyboards/melgeek/mj61/rev1/keyboard.json | 1 - keyboards/melgeek/mj61/rev2/keyboard.json | 1 - keyboards/melgeek/mj63/rev1/keyboard.json | 1 - keyboards/melgeek/mj63/rev2/keyboard.json | 1 - keyboards/melgeek/mj64/rev1/keyboard.json | 1 - keyboards/melgeek/mj64/rev2/keyboard.json | 1 - keyboards/melgeek/mj64/rev3/keyboard.json | 1 - keyboards/melgeek/mj6xy/rev3/keyboard.json | 1 - keyboards/melgeek/mojo68/rev1/keyboard.json | 1 - keyboards/melgeek/mojo75/rev1/keyboard.json | 1 - keyboards/melgeek/tegic/rev1/keyboard.json | 1 - keyboards/melgeek/z70ultra/rev1/keyboard.json | 1 - keyboards/meow48/keyboard.json | 1 - keyboards/meow65/keyboard.json | 1 - keyboards/merge/iso_macro/keyboard.json | 1 - keyboards/merge/uc1/keyboard.json | 1 - keyboards/merge/um70/keyboard.json | 1 - keyboards/merge/um80/keyboard.json | 1 - keyboards/mesa/mesa_tkl/keyboard.json | 1 - keyboards/meson/keyboard.json | 1 - keyboards/metamechs/timberwolf/keyboard.json | 1 - keyboards/miiiw/blackio83/rev_0100/keyboard.json | 1 - keyboards/mikeneko65/keyboard.json | 1 - keyboards/miller/gm862/keyboard.json | 1 - keyboards/millipad/keyboard.json | 1 - keyboards/mincedshon/ecila/keyboard.json | 1 - keyboards/mini_elixivy/keyboard.json | 1 - keyboards/mini_ten_key_plus/keyboard.json | 1 - keyboards/minimacro5/keyboard.json | 1 - keyboards/minimon/bartlesplit/keyboard.json | 1 - keyboards/minimon/index_tab/keyboard.json | 1 - keyboards/mint60/keyboard.json | 1 - keyboards/misonoworks/chocolatebar/keyboard.json | 1 - keyboards/misonoworks/karina/keyboard.json | 1 - keyboards/misterknife/knife66/keyboard.json | 1 - keyboards/misterknife/knife66_iso/keyboard.json | 1 - keyboards/mk65/keyboard.json | 1 - keyboards/ml/gas75/keyboard.json | 1 - keyboards/mlego/m48/rev1/keyboard.json | 1 - keyboards/mlego/m60/rev1/keyboard.json | 1 - keyboards/mlego/m65/rev1/keyboard.json | 1 - keyboards/mlego/m65/rev3/keyboard.json | 1 - keyboards/mlego/m65/rev4/keyboard.json | 1 - keyboards/mmkzoo65/keyboard.json | 1 - keyboards/mntre/keyboard.json | 1 - keyboards/mode/m256ws/keyboard.json | 1 - keyboards/mode/m60h/keyboard.json | 1 - keyboards/mode/m60h_f/keyboard.json | 1 - keyboards/mode/m60s/keyboard.json | 1 - keyboards/mode/m65ha_alpha/keyboard.json | 1 - keyboards/mode/m65hi_alpha/keyboard.json | 1 - keyboards/mode/m65s/keyboard.json | 1 - keyboards/mode/m75h/keyboard.json | 1 - keyboards/mode/m75s/keyboard.json | 1 - keyboards/mode/m80v1/m80h/keyboard.json | 1 - keyboards/mode/m80v1/m80s/keyboard.json | 1 - keyboards/mode/m80v2/m80v2h/keyboard.json | 1 - keyboards/mode/m80v2/m80v2s/keyboard.json | 1 - keyboards/mokey/ginkgo65/keyboard.json | 1 - keyboards/mokey/ginkgo65hot/keyboard.json | 1 - keyboards/mokey/ibis80/keyboard.json | 1 - keyboards/mokey/luckycat70/keyboard.json | 1 - keyboards/mokey/mokey63/keyboard.json | 1 - keyboards/mokey/mokey64/keyboard.json | 1 - keyboards/mokey/xox70/keyboard.json | 1 - keyboards/mokey/xox70hot/keyboard.json | 1 - keyboards/momoka_ergo/keyboard.json | 1 - keyboards/momokai/aurora/keyboard.json | 1 - keyboards/momokai/tap_duo/keyboard.json | 1 - keyboards/momokai/tap_trio/keyboard.json | 1 - keyboards/monoflex60/keyboard.json | 1 - keyboards/monsgeek/m1/keyboard.json | 1 - keyboards/monsgeek/m3/keyboard.json | 1 - keyboards/monsgeek/m5/keyboard.json | 1 - keyboards/monsgeek/m6/keyboard.json | 1 - keyboards/moondrop/dash75/info.json | 1 - keyboards/morizon/keyboard.json | 1 - keyboards/mountainmechdesigns/teton_78/keyboard.json | 1 - keyboards/ms_sculpt/keyboard.json | 1 - keyboards/mss_studio/m63_rgb/keyboard.json | 1 - keyboards/mss_studio/m64_rgb/keyboard.json | 1 - keyboards/mt/blocked65/keyboard.json | 1 - keyboards/mt/mt40/keyboard.json | 1 - keyboards/mt/mt64rgb/keyboard.json | 1 - keyboards/mt/mt84/keyboard.json | 1 - keyboards/mt/mt980/keyboard.json | 1 - keyboards/mtbkeys/mtb60/hotswap/keyboard.json | 1 - keyboards/mtbkeys/mtb60/solder/keyboard.json | 1 - keyboards/murcielago/rev1/keyboard.json | 1 - keyboards/mwstudio/alicekk/keyboard.json | 1 - keyboards/mwstudio/mw65_black/keyboard.json | 1 - keyboards/mwstudio/mw65_rgb/keyboard.json | 1 - keyboards/mwstudio/mw660/keyboard.json | 1 - keyboards/mwstudio/mw75/keyboard.json | 1 - keyboards/mwstudio/mw75r2/keyboard.json | 1 - keyboards/mwstudio/mw80/keyboard.json | 1 - keyboards/mxss/keyboard.json | 1 - keyboards/mysticworks/wyvern/keyboard.json | 1 - keyboards/navi60/keyboard.json | 1 - keyboards/ncc1701kb/keyboard.json | 1 - keyboards/neito/keyboard.json | 1 - keyboards/neokeys/g67/element_hs/keyboard.json | 1 - keyboards/neokeys/g67/hotswap/keyboard.json | 1 - keyboards/neokeys/g67/soldered/keyboard.json | 1 - keyboards/neson_design/nico/keyboard.json | 1 - keyboards/newgame40/keyboard.json | 1 - keyboards/nibiria/stream15/keyboard.json | 1 - keyboards/nightingale_studios/hailey/keyboard.json | 1 - keyboards/nightly_boards/adellein/keyboard.json | 1 - keyboards/nightly_boards/alter/rev1/keyboard.json | 1 - keyboards/nightly_boards/alter_lite/keyboard.json | 1 - keyboards/nightly_boards/conde60/keyboard.json | 1 - keyboards/nightly_boards/daily60/keyboard.json | 1 - keyboards/nightly_boards/jisoo/keyboard.json | 1 - keyboards/nightly_boards/n2/keyboard.json | 1 - keyboards/nightly_boards/n60_s/keyboard.json | 1 - keyboards/nightly_boards/n87/keyboard.json | 1 - keyboards/nightly_boards/n9/keyboard.json | 1 - keyboards/nightly_boards/octopad/keyboard.json | 1 - keyboards/nightly_boards/octopadplus/keyboard.json | 1 - keyboards/nightly_boards/paraluman/keyboard.json | 1 - keyboards/nightly_boards/ph_arisu/keyboard.json | 1 - keyboards/nimrod/keyboard.json | 1 - keyboards/ning/tiny_board/tb16_rgb/keyboard.json | 1 - keyboards/nix_studio/lilith/keyboard.json | 1 - keyboards/nix_studio/oxalys80/keyboard.json | 1 - keyboards/nixkeyboards/day_off/keyboard.json | 1 - keyboards/nopunin10did/jabberwocky/v1/keyboard.json | 1 - keyboards/nopunin10did/jabberwocky/v2/keyboard.json | 1 - keyboards/nopunin10did/kastenwagen1840/keyboard.json | 1 - keyboards/nopunin10did/kastenwagen48/keyboard.json | 1 - keyboards/nopunin10did/railroad/rev0/keyboard.json | 1 - keyboards/nopunin10did/styrkatmel/keyboard.json | 1 - keyboards/novelkeys/nk1/keyboard.json | 1 - keyboards/novelkeys/nk_classic_tkl/keyboard.json | 1 - keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json | 1 - keyboards/novelkeys/nk_plus/keyboard.json | 1 - keyboards/novelkeys/novelpad/keyboard.json | 1 - keyboards/noxary/268_2/keyboard.json | 1 - keyboards/noxary/268_2_rgb/keyboard.json | 1 - keyboards/noxary/378/keyboard.json | 1 - keyboards/noxary/valhalla/keyboard.json | 1 - keyboards/noxary/x268/keyboard.json | 1 - keyboards/np12/keyboard.json | 1 - keyboards/null/st110r2/keyboard.json | 1 - keyboards/nyhxis/nfr_70/keyboard.json | 1 - keyboards/obosob/arch_36/keyboard.json | 1 - keyboards/obosob/steal_this_keyboard/keyboard.json | 1 - keyboards/ocean/addon/keyboard.json | 1 - keyboards/ocean/gin_v2/keyboard.json | 1 - keyboards/ocean/slamz/keyboard.json | 1 - keyboards/ocean/stealth/keyboard.json | 1 - keyboards/ocean/sus/keyboard.json | 1 - keyboards/ocean/wang_ergo/keyboard.json | 1 - keyboards/ocean/wang_v2/keyboard.json | 1 - keyboards/ocean/yuri/keyboard.json | 1 - keyboards/odelia/keyboard.json | 1 - keyboards/ogre/ergo_single/keyboard.json | 1 - keyboards/ogre/ergo_split/keyboard.json | 1 - keyboards/ok60/keyboard.json | 1 - keyboards/onekeyco/dango40/keyboard.json | 1 - keyboards/orange75/keyboard.json | 1 - keyboards/org60/keyboard.json | 1 - keyboards/ortho5by12/keyboard.json | 1 - keyboards/orthograph/keyboard.json | 1 - keyboards/owlab/jelly_epoch/hotswap/keyboard.json | 1 - keyboards/owlab/jelly_epoch/soldered/keyboard.json | 1 - keyboards/owlab/spring/keyboard.json | 1 - keyboards/owlab/suit80/ansi/keyboard.json | 1 - keyboards/owlab/suit80/iso/keyboard.json | 1 - keyboards/owlab/voice65/hotswap/keyboard.json | 1 - keyboards/owlab/voice65/soldered/keyboard.json | 1 - keyboards/p3d/eu_isolation/keyboard.json | 1 - keyboards/p3d/glitch/keyboard.json | 1 - keyboards/p3d/q4z/keyboard.json | 1 - keyboards/p3d/spacey/keyboard.json | 1 - keyboards/p3d/synapse/keyboard.json | 1 - keyboards/p3d/tw40/keyboard.json | 1 - keyboards/pabile/p18/keyboard.json | 1 - keyboards/pabile/p20/ver1/keyboard.json | 1 - keyboards/pabile/p20/ver2/keyboard.json | 1 - keyboards/pabile/p40/keyboard.json | 1 - keyboards/pabile/p40_ortho/keyboard.json | 1 - keyboards/pabile/p42/keyboard.json | 1 - keyboards/panc40/keyboard.json | 1 - keyboards/panc60/keyboard.json | 1 - keyboards/pangorin/tan67/keyboard.json | 1 - keyboards/papercranekeyboards/gerald65/keyboard.json | 1 - keyboards/paprikman/albacore/keyboard.json | 1 - keyboards/parallel/parallel_65/hotswap/keyboard.json | 1 - keyboards/parallel/parallel_65/soldered/keyboard.json | 1 - keyboards/pauperboards/brick/keyboard.json | 1 - keyboards/pearlboards/pandora/keyboard.json | 1 - keyboards/pearlboards/zeuspad/keyboard.json | 1 - keyboards/peej/lumberjack/keyboard.json | 1 - keyboards/pegasus/keyboard.json | 1 - keyboards/phdesign/phac/keyboard.json | 1 - keyboards/phrygian/ph100/keyboard.json | 1 - keyboards/piantoruv44/keyboard.json | 1 - keyboards/pica40/rev1/keyboard.json | 1 - keyboards/pica40/rev2/keyboard.json | 1 - keyboards/picolab/frusta_fundamental/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev1/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/left/keyboard.json | 1 - keyboards/pimentoso/paddino02/rev2/right/keyboard.json | 1 - keyboards/pimentoso/touhoupad/keyboard.json | 1 - keyboards/pisces/keyboard.json | 1 - keyboards/pixelspace/capsule65i/keyboard.json | 1 - keyboards/pizzakeyboards/pizza65/keyboard.json | 1 - keyboards/pkb65/keyboard.json | 1 - keyboards/planck/light/keyboard.json | 1 - keyboards/planck/rev1/keyboard.json | 1 - keyboards/planck/rev2/keyboard.json | 1 - keyboards/planck/rev3/keyboard.json | 1 - keyboards/planck/rev4/keyboard.json | 1 - keyboards/planck/rev5/keyboard.json | 1 - keyboards/playkbtw/ca66/keyboard.json | 1 - keyboards/playkbtw/helen80/keyboard.json | 1 - keyboards/playkbtw/pk60/keyboard.json | 1 - keyboards/playkbtw/pk64rgb/keyboard.json | 1 - keyboards/pluckey/keyboard.json | 1 - keyboards/plum47/keyboard.json | 1 - keyboards/plume/plume65/keyboard.json | 1 - keyboards/plut0nium/0x3e/keyboard.json | 1 - keyboards/plx/keyboard.json | 1 - keyboards/plywrks/ahgase/keyboard.json | 1 - keyboards/plywrks/allaro/keyboard.json | 1 - keyboards/plywrks/ji_eun/keyboard.json | 1 - keyboards/plywrks/lune/keyboard.json | 1 - keyboards/plywrks/ply8x/solder/keyboard.json | 1 - keyboards/pmk/posey_split/v4/keyboard.json | 1 - keyboards/pmk/posey_split/v5/keyboard.json | 1 - keyboards/pohjolaworks/louhi/keyboard.json | 1 - keyboards/poker87c/keyboard.json | 1 - keyboards/poker87d/keyboard.json | 1 - keyboards/polilla/rev1/keyboard.json | 1 - keyboards/polycarbdiet/s20/keyboard.json | 1 - keyboards/pom_keyboards/tnln95/keyboard.json | 1 - keyboards/portal_66/hotswap/keyboard.json | 1 - keyboards/portal_66/soldered/keyboard.json | 1 - keyboards/pos78/keyboard.json | 1 - keyboards/preonic/rev1/keyboard.json | 1 - keyboards/preonic/rev2/keyboard.json | 1 - keyboards/primekb/meridian_rgb/keyboard.json | 1 - keyboards/primekb/prime_e/info.json | 1 - keyboards/primekb/prime_l/info.json | 1 - keyboards/primekb/prime_m/keyboard.json | 1 - keyboards/primekb/prime_o/keyboard.json | 1 - keyboards/primekb/prime_r/keyboard.json | 1 - keyboards/printedpad/keyboard.json | 1 - keyboards/projectcain/vault45/keyboard.json | 1 - keyboards/projectd/65/projectd_65_ansi/keyboard.json | 1 - keyboards/projectd/75/ansi/keyboard.json | 1 - keyboards/projectd/75/iso/keyboard.json | 1 - keyboards/projectkb/signature65/keyboard.json | 1 - keyboards/prototypist/allison/keyboard.json | 1 - keyboards/prototypist/allison_numpad/keyboard.json | 1 - keyboards/prototypist/j01/keyboard.json | 1 - keyboards/prototypist/pt60/keyboard.json | 1 - keyboards/prototypist/pt80/keyboard.json | 1 - keyboards/protozoa/event_horizon/keyboard.json | 1 - keyboards/psuieee/pluto12/keyboard.json | 1 - keyboards/pteron36/keyboard.json | 1 - keyboards/pteropus/keyboard.json | 1 - keyboards/puck/keyboard.json | 1 - keyboards/purin/keyboard.json | 1 - keyboards/qck75/v1/keyboard.json | 1 - keyboards/qpockets/eggman/keyboard.json | 1 - keyboards/qpockets/wanten/keyboard.json | 1 - keyboards/quadrum/delta/keyboard.json | 1 - keyboards/quarkeys/z40/keyboard.json | 1 - keyboards/quarkeys/z60/hotswap/keyboard.json | 1 - keyboards/quarkeys/z60/solder/keyboard.json | 1 - keyboards/quarkeys/z67/hotswap/keyboard.json | 1 - keyboards/quarkeys/z67/solder/keyboard.json | 1 - keyboards/qvex/lynepad/keyboard.json | 1 - keyboards/qwertlekeys/calice/keyboard.json | 1 - keyboards/qwertykeys/qk65/hotswap/keyboard.json | 1 - keyboards/qwertykeys/qk65/solder/keyboard.json | 1 - keyboards/rad/keyboard.json | 1 - keyboards/rainkeebs/delilah/keyboard.json | 1 - keyboards/rainkeebs/rainkeeb/keyboard.json | 1 - keyboards/rainkeebs/yasui/keyboard.json | 1 - keyboards/ramlord/witf/keyboard.json | 1 - keyboards/rart/rart45/keyboard.json | 1 - keyboards/rart/rart4x4/keyboard.json | 1 - keyboards/rart/rart67/keyboard.json | 1 - keyboards/rart/rart67m/keyboard.json | 1 - keyboards/rart/rart75/keyboard.json | 1 - keyboards/rart/rart75m/keyboard.json | 1 - keyboards/rart/rartand/keyboard.json | 1 - keyboards/rart/rartlite/keyboard.json | 1 - keyboards/rart/rartpad/keyboard.json | 1 - keyboards/rate/pistachio_mp/keyboard.json | 1 - keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json | 1 - keyboards/rationalist/ratio65_solder/rev_a/keyboard.json | 1 - keyboards/recompile_keys/cocoa40/keyboard.json | 1 - keyboards/recompile_keys/mio/keyboard.json | 1 - keyboards/rect44/keyboard.json | 1 - keyboards/redscarf_i/keyboard.json | 1 - keyboards/retro_75/keyboard.json | 1 - keyboards/reversestudio/decadepad/keyboard.json | 1 - keyboards/reviung/reviung33/keyboard.json | 1 - keyboards/reviung/reviung46/keyboard.json | 1 - keyboards/reviung/reviung5/keyboard.json | 1 - keyboards/reviung/reviung53/keyboard.json | 1 - keyboards/rico/phoenix_project_no1/keyboard.json | 1 - keyboards/rmi_kb/equator/keyboard.json | 1 - keyboards/rmi_kb/squishyfrl/keyboard.json | 1 - keyboards/rmi_kb/squishytkl/keyboard.json | 1 - keyboards/rmi_kb/tkl_ff/info.json | 1 - keyboards/rmkeebs/rm_fullsize/keyboard.json | 1 - keyboards/rmkeebs/rm_numpad/keyboard.json | 1 - keyboards/rose75/keyboard.json | 1 - keyboards/roseslite/keyboard.json | 1 - keyboards/rot13labs/h4ckb0ard/keyboard.json | 1 - keyboards/rot13labs/rotc0n/keyboard.json | 1 - keyboards/rot13labs/veilid_sao/keyboard.json | 1 - keyboards/rotr/keyboard.json | 1 - keyboards/runes/skjoldr/keyboard.json | 1 - keyboards/runes/vaengr/keyboard.json | 1 - keyboards/ryanbaekr/rb1/keyboard.json | 1 - keyboards/ryanbaekr/rb18/keyboard.json | 1 - keyboards/ryanbaekr/rb69/keyboard.json | 1 - keyboards/ryanbaekr/rb87/keyboard.json | 1 - keyboards/ryloo_studio/m0110/keyboard.json | 1 - keyboards/s_ol/0xc_pad/keyboard.json | 1 - keyboards/salane/starryfrl/keyboard.json | 1 - keyboards/salicylic_acid3/ajisai74/keyboard.json | 1 - keyboards/salicylic_acid3/ergoarrows/keyboard.json | 1 - keyboards/salicylic_acid3/guide68/keyboard.json | 1 - keyboards/salicylic_acid3/nknl7en/keyboard.json | 1 - keyboards/salicylic_acid3/nknl7jp/keyboard.json | 1 - keyboards/sam/s80/keyboard.json | 1 - keyboards/sam/sg81m/keyboard.json | 1 - keyboards/sanctified/dystopia/keyboard.json | 1 - keyboards/sandwich/keeb68/keyboard.json | 1 - keyboards/sapuseven/macropad12/keyboard.json | 1 - keyboards/sauce/mild/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json | 1 - keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json | 1 - keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json | 1 - keyboards/sawnsprojects/krush/krush65/solder/keyboard.json | 1 - keyboards/sawnsprojects/okayu/info.json | 1 - keyboards/sawnsprojects/plaque80/keyboard.json | 1 - keyboards/sawnsprojects/re65/keyboard.json | 1 - keyboards/sawnsprojects/satxri6key/keyboard.json | 1 - keyboards/sawnsprojects/vcl65/solder/keyboard.json | 1 - keyboards/scatter42/keyboard.json | 1 - keyboards/sck/gtm/keyboard.json | 1 - keyboards/sck/neiso/keyboard.json | 1 - keyboards/scottokeebs/scotto34/keyboard.json | 1 - keyboards/scottokeebs/scotto69/keyboard.json | 1 - keyboards/scottokeebs/scottowing/keyboard.json | 1 - keyboards/sendyyeah/75pixels/keyboard.json | 1 - keyboards/sendyyeah/bevi/keyboard.json | 1 - keyboards/sendyyeah/pix/keyboard.json | 1 - keyboards/senselessclay/ck60/keyboard.json | 1 - keyboards/senselessclay/ck65/keyboard.json | 1 - keyboards/senselessclay/gos65/keyboard.json | 1 - keyboards/senselessclay/had60/keyboard.json | 1 - keyboards/sentraq/s60_x/default/keyboard.json | 1 - keyboards/sentraq/s60_x/rgb/keyboard.json | 1 - keyboards/sentraq/s65_plus/keyboard.json | 1 - keyboards/sentraq/s65_x/keyboard.json | 1 - keyboards/sets3n/kk980/keyboard.json | 1 - keyboards/sha/keyboard.json | 1 - keyboards/shambles/keyboard.json | 1 - keyboards/shandoncodes/flygone60/rev3/keyboard.json | 1 - keyboards/shandoncodes/mino/hotswap/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/hotswap/keyboard.json | 1 - keyboards/shandoncodes/mino_plus/soldered/keyboard.json | 1 - keyboards/shandoncodes/riot_pad/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s2/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s3/keyboard.json | 1 - keyboards/sharkoon/skiller_sgk50_s4/keyboard.json | 1 - keyboards/shoc/keyboard.json | 1 - keyboards/sidderskb/majbritt/rev2/keyboard.json | 1 - keyboards/skeletn87/hotswap/keyboard.json | 1 - keyboards/skeletn87/soldered/keyboard.json | 1 - keyboards/skeletonkbd/frost68/keyboard.json | 1 - keyboards/skeletonkbd/skeletonnumpad/keyboard.json | 1 - keyboards/skme/zeno/keyboard.json | 1 - keyboards/skmt/15k/keyboard.json | 1 - keyboards/skyloong/dt40/keyboard.json | 1 - keyboards/skyloong/gk61/v1/keyboard.json | 1 - keyboards/skyloong/qk21/v1/keyboard.json | 1 - keyboards/slz40/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2h/keyboard.json | 1 - keyboards/smithrune/iron180v2/v2s/keyboard.json | 1 - keyboards/smithrune/magnus/m75h/keyboard.json | 1 - keyboards/smithrune/magnus/m75s/keyboard.json | 1 - keyboards/smk60/keyboard.json | 1 - keyboards/smoll/lefty/info.json | 1 - keyboards/sneakbox/aliceclone/keyboard.json | 1 - keyboards/sneakbox/aliceclonergb/keyboard.json | 1 - keyboards/sneakbox/ava/keyboard.json | 1 - keyboards/sneakbox/disarray/ortho/keyboard.json | 1 - keyboards/sneakbox/disarray/staggered/keyboard.json | 1 - keyboards/snes_macropad/keyboard.json | 1 - keyboards/soup10/keyboard.json | 1 - keyboards/sowbug/68keys/keyboard.json | 1 - keyboards/sowbug/ansi_tkl/keyboard.json | 1 - keyboards/spaceholdings/nebula12b/keyboard.json | 1 - keyboards/spaceholdings/nebula68b/info.json | 1 - keyboards/spacetime/info.json | 1 - keyboards/sparrow62/keyboard.json | 1 - keyboards/splitography/keyboard.json | 3 +-- keyboards/sporewoh/banime40/keyboard.json | 1 - keyboards/star75/keyboard.json | 1 - keyboards/stello65/beta/keyboard.json | 1 - keyboards/stello65/hs_rev1/keyboard.json | 1 - keyboards/stello65/sl_rev1/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json | 1 - keyboards/stenokeyboards/the_uni/usb_c/keyboard.json | 1 - keyboards/sthlmkb/lagom/keyboard.json | 1 - keyboards/sthlmkb/litl/keyboard.json | 1 - keyboards/stratos/keyboard.json | 1 - keyboards/strech/soulstone/keyboard.json | 1 - keyboards/studiokestra/fairholme/keyboard.json | 1 - keyboards/studiokestra/frl84/keyboard.json | 1 - keyboards/studiokestra/galatea/rev1/keyboard.json | 1 - keyboards/studiokestra/galatea/rev2/keyboard.json | 1 - keyboards/studiokestra/galatea/rev3/keyboard.json | 1 - keyboards/studiokestra/line_friends_tkl/keyboard.json | 1 - keyboards/subatomic/keyboard.json | 1 - keyboards/subrezon/lancer/keyboard.json | 1 - keyboards/suikagiken/suika15tone/keyboard.json | 1 - keyboards/suikagiken/suika27melo/keyboard.json | 1 - keyboards/suikagiken/suika83opti/keyboard.json | 1 - keyboards/suikagiken/suika85ergo/keyboard.json | 1 - keyboards/supersplit/keyboard.json | 1 - keyboards/superuser/ext/keyboard.json | 1 - keyboards/superuser/frl/keyboard.json | 1 - keyboards/superuser/tkl/keyboard.json | 1 - keyboards/swiftrax/retropad/keyboard.json | 1 - keyboards/swiss/keyboard.json | 1 - keyboards/switchplate/switchplate910/keyboard.json | 1 - keyboards/synthandkeys/bento_box/keyboard.json | 1 - keyboards/synthandkeys/the_debit_card/keyboard.json | 1 - keyboards/synthlabs/060/keyboard.json | 1 - keyboards/synthlabs/065/keyboard.json | 1 - keyboards/synthlabs/solo/keyboard.json | 1 - keyboards/tacworks/tac_k1/keyboard.json | 1 - keyboards/takashicompany/baumkuchen/keyboard.json | 1 - keyboards/takashicompany/center_enter/keyboard.json | 1 - keyboards/takashicompany/ejectix/keyboard.json | 1 - keyboards/takashicompany/endzone34/keyboard.json | 1 - keyboards/takashicompany/ergomirage/keyboard.json | 1 - keyboards/takashicompany/goat51/keyboard.json | 1 - keyboards/takashicompany/jourkey/keyboard.json | 1 - keyboards/takashicompany/klec_01/keyboard.json | 1 - keyboards/takashicompany/klec_02/keyboard.json | 1 - keyboards/takashicompany/minidivide/keyboard.json | 1 - keyboards/takashicompany/minidivide_max/keyboard.json | 1 - keyboards/takashicompany/palmslave/keyboard.json | 1 - keyboards/takashicompany/qoolee/keyboard.json | 1 - keyboards/takashicompany/radialex/keyboard.json | 1 - keyboards/takashicompany/rookey/keyboard.json | 1 - keyboards/takashicompany/tightwriter/keyboard.json | 1 - keyboards/taleguers/taleguers75/keyboard.json | 1 - keyboards/tanuki/keyboard.json | 1 - keyboards/teahouse/ayleen/keyboard.json | 1 - keyboards/team0110/p1800fl/keyboard.json | 1 - keyboards/teleport/native/info.json | 1 - keyboards/teleport/numpad/keyboard.json | 1 - keyboards/teleport/tkl/keyboard.json | 1 - keyboards/tempo_turtle/bradpad/keyboard.json | 1 - keyboards/tender/macrowo_pad/keyboard.json | 1 - keyboards/tenki/keyboard.json | 1 - keyboards/terrazzo/keyboard.json | 1 - keyboards/tetris/keyboard.json | 1 - keyboards/tg4x/keyboard.json | 1 - keyboards/tgr/910ce/keyboard.json | 1 - keyboards/the_royal/liminal/keyboard.json | 1 - keyboards/the_royal/schwann/keyboard.json | 1 - keyboards/themadnoodle/ncc1701kb/v2/keyboard.json | 1 - keyboards/themadnoodle/noodlepad/info.json | 1 - keyboards/themadnoodle/noodlepad_micro/keyboard.json | 1 - keyboards/themadnoodle/udon13/keyboard.json | 1 - keyboards/theone/keyboard.json | 1 - keyboards/thepanduuh/degenpad/keyboard.json | 1 - keyboards/thevankeyboards/caravan/keyboard.json | 1 - keyboards/tkc/california/keyboard.json | 1 - keyboards/tkc/candybar/lefty/keyboard.json | 1 - keyboards/tkc/candybar/lefty_r3/keyboard.json | 1 - keyboards/tkc/candybar/righty/keyboard.json | 1 - keyboards/tkc/candybar/righty_r3/keyboard.json | 1 - keyboards/tkc/godspeed75/keyboard.json | 1 - keyboards/tkc/tkc1800/keyboard.json | 1 - keyboards/tmo50/keyboard.json | 1 - keyboards/toad/keyboard.json | 1 - keyboards/toffee_studio/blueberry/keyboard.json | 1 - keyboards/tominabox1/adalyn/keyboard.json | 1 - keyboards/tominabox1/bigboy/keyboard.json | 1 - keyboards/tominabox1/qaz/keyboard.json | 1 - keyboards/tr60w/keyboard.json | 1 - keyboards/trainpad/keyboard.json | 1 - keyboards/trashman/ketch/keyboard.json | 1 - keyboards/treasure/type9s2/keyboard.json | 1 - keyboards/treasure/type9s3/keyboard.json | 1 - keyboards/trkeyboards/trk1/keyboard.json | 1 - keyboards/trnthsn/e8ghty/info.json | 1 - keyboards/trnthsn/e8ghtyneo/info.json | 1 - keyboards/trnthsn/s6xty/keyboard.json | 1 - keyboards/trnthsn/s6xty5neor2/info.json | 1 - keyboards/trojan_pinata/model_b/rev0/keyboard.json | 1 - keyboards/tunks/ergo33/keyboard.json | 1 - keyboards/tweetydabird/lbs4/keyboard.json | 1 - keyboards/tweetydabird/lbs6/keyboard.json | 1 - keyboards/tweetydabird/lotus58/info.json | 1 - keyboards/ubest/vn/keyboard.json | 1 - keyboards/uk78/keyboard.json | 1 - keyboards/ungodly/nines/keyboard.json | 1 - keyboards/unikeyboard/felix/keyboard.json | 1 - keyboards/utd80/keyboard.json | 1 - keyboards/v4n4g0rth0n/v1/keyboard.json | 1 - keyboards/vagrant_10/keyboard.json | 1 - keyboards/vertex/angler2/keyboard.json | 1 - keyboards/vertex/cycle7/keyboard.json | 1 - keyboards/vertex/cycle8/keyboard.json | 1 - keyboards/viendi8l/keyboard.json | 1 - keyboards/viktus/at101_bh/keyboard.json | 1 - keyboards/viktus/minne/keyboard.json | 1 - keyboards/viktus/minne_topre/keyboard.json | 1 - keyboards/viktus/omnikey_bh/keyboard.json | 1 - keyboards/viktus/osav2/keyboard.json | 1 - keyboards/viktus/osav2_numpad/keyboard.json | 1 - keyboards/viktus/osav2_numpad_topre/keyboard.json | 1 - keyboards/viktus/osav2_topre/keyboard.json | 1 - keyboards/viktus/smolka/keyboard.json | 1 - keyboards/viktus/sp111_v2/keyboard.json | 1 - keyboards/viktus/sp_mini/keyboard.json | 1 - keyboards/viktus/styrka/keyboard.json | 1 - keyboards/viktus/styrka_topre/keyboard.json | 1 - keyboards/viktus/vkr94/keyboard.json | 1 - keyboards/viktus/z150_bh/keyboard.json | 1 - keyboards/vinhcatba/uncertainty/keyboard.json | 1 - keyboards/vitamins_included/info.json | 1 - keyboards/void/voidhhkb_hotswap/keyboard.json | 1 - keyboards/vt40/keyboard.json | 1 - keyboards/waldo/keyboard.json | 1 - keyboards/walletburner/cajal/keyboard.json | 1 - keyboards/walletburner/neuron/keyboard.json | 1 - keyboards/wavtype/foundation/keyboard.json | 1 - keyboards/wavtype/p01_ultra/keyboard.json | 1 - keyboards/weirdo/geminate60/keyboard.json | 1 - keyboards/weirdo/kelowna/rgb64/keyboard.json | 1 - keyboards/weirdo/ls_60/keyboard.json | 1 - keyboards/weirdo/naiping/np64/keyboard.json | 1 - keyboards/weirdo/naiping/nphhkb/keyboard.json | 1 - keyboards/weirdo/naiping/npminila/keyboard.json | 1 - keyboards/wekey/polaris/keyboard.json | 1 - keyboards/werk_technica/one/keyboard.json | 1 - keyboards/westfoxtrot/aanzee/keyboard.json | 1 - keyboards/westfoxtrot/cyclops/keyboard.json | 1 - keyboards/westfoxtrot/cypher/rev1/keyboard.json | 1 - keyboards/westfoxtrot/cypher/rev5/keyboard.json | 1 - keyboards/westfoxtrot/prophet/keyboard.json | 1 - keyboards/wilba_tech/rama_works_m10_b/keyboard.json | 1 - keyboards/wilba_tech/rama_works_m50_ax/keyboard.json | 1 - keyboards/wilba_tech/wt60_g/keyboard.json | 1 - keyboards/wilba_tech/wt60_g2/keyboard.json | 1 - keyboards/wilba_tech/wt60_h1/keyboard.json | 1 - keyboards/wilba_tech/wt60_h2/keyboard.json | 1 - keyboards/wilba_tech/wt60_h3/keyboard.json | 1 - keyboards/wilba_tech/wt60_xt/keyboard.json | 1 - keyboards/wilba_tech/wt65_d/keyboard.json | 1 - keyboards/wilba_tech/wt65_f/keyboard.json | 1 - keyboards/wilba_tech/wt65_fx/keyboard.json | 1 - keyboards/wilba_tech/wt65_g/keyboard.json | 1 - keyboards/wilba_tech/wt65_g2/keyboard.json | 1 - keyboards/wilba_tech/wt65_h1/keyboard.json | 1 - keyboards/wilba_tech/wt65_xt/keyboard.json | 1 - keyboards/wilba_tech/wt65_xtx/keyboard.json | 1 - keyboards/wilba_tech/wt70_jb/keyboard.json | 1 - keyboards/wilba_tech/wt80_g/keyboard.json | 1 - keyboards/willoucom/keypad/keyboard.json | 1 - keyboards/winkeyless/b87/keyboard.json | 1 - keyboards/winkeyless/bminiex/keyboard.json | 1 - keyboards/winkeys/mini_winni/keyboard.json | 1 - keyboards/winry/winry25tc/keyboard.json | 1 - keyboards/winry/winry315/keyboard.json | 1 - keyboards/wolf/frogpad/keyboard.json | 1 - keyboards/wolf/m60_b/keyboard.json | 1 - keyboards/wolf/m6_c/keyboard.json | 1 - keyboards/wolf/neely65/keyboard.json | 1 - keyboards/wolf/silhouette/keyboard.json | 1 - keyboards/wolf/twilight/keyboard.json | 1 - keyboards/wolf/ziggurat/keyboard.json | 1 - keyboards/woodkeys/scarletbandana/keyboard.json | 1 - keyboards/work_louder/micro/keyboard.json | 1 - keyboards/work_louder/numpad/keyboard.json | 1 - keyboards/wsk/alpha9/keyboard.json | 1 - keyboards/wsk/g4m3ralpha/keyboard.json | 1 - keyboards/wsk/houndstooth/keyboard.json | 1 - keyboards/wsk/jerkin/keyboard.json | 1 - keyboards/wsk/kodachi50/keyboard.json | 1 - keyboards/wsk/pain27/keyboard.json | 1 - keyboards/wsk/sl40/keyboard.json | 1 - keyboards/wsk/tkl30/keyboard.json | 1 - keyboards/wuque/creek70/keyboard.json | 1 - keyboards/wuque/ikki68/keyboard.json | 1 - keyboards/wuque/mammoth20x/keyboard.json | 1 - keyboards/wuque/mammoth75x/keyboard.json | 1 - keyboards/wuque/nemui65/keyboard.json | 1 - keyboards/wuque/promise87/ansi/keyboard.json | 1 - keyboards/wuque/promise87/wkl/keyboard.json | 1 - keyboards/wuque/tata80/wk/keyboard.json | 1 - keyboards/wuque/tata80/wkl/keyboard.json | 1 - keyboards/x16/keyboard.json | 1 - keyboards/xbows/knight/keyboard.json | 1 - keyboards/xbows/knight_plus/keyboard.json | 1 - keyboards/xbows/nature/keyboard.json | 1 - keyboards/xbows/numpad/keyboard.json | 1 - keyboards/xbows/ranger/keyboard.json | 1 - keyboards/xelus/akis/keyboard.json | 1 - keyboards/xelus/dharma/keyboard.json | 1 - keyboards/xelus/pachi/mini_32u4/keyboard.json | 1 - keyboards/xelus/pachi/rev1/keyboard.json | 1 - keyboards/xelus/pachi/rgb/info.json | 1 - keyboards/xelus/rs60/rev1/keyboard.json | 1 - keyboards/xelus/rs60/rev2_0/keyboard.json | 1 - keyboards/xelus/rs60/rev2_1/keyboard.json | 1 - keyboards/xelus/snap96/keyboard.json | 1 - keyboards/xelus/valor/rev1/keyboard.json | 1 - keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json | 1 - keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json | 1 - keyboards/xiudi/xd004/v1/keyboard.json | 1 - keyboards/xiudi/xd60/rev2/keyboard.json | 1 - keyboards/xiudi/xd60/rev3/keyboard.json | 1 - keyboards/xiudi/xd84pro/keyboard.json | 1 - keyboards/xmmx/keyboard.json | 1 - keyboards/yandrstudio/nz64/keyboard.json | 1 - keyboards/yandrstudio/zhou65/keyboard.json | 1 - keyboards/yatara/drink_me/keyboard.json | 1 - keyboards/ydkb/chili/keyboard.json | 1 - keyboards/ydkb/yd68/keyboard.json | 1 - keyboards/ydkb/ydpm40/keyboard.json | 1 - keyboards/yeehaw/keyboard.json | 1 - keyboards/ymdk/melody96/hotswap/keyboard.json | 1 - keyboards/ymdk/np24/u4rgb6/keyboard.json | 1 - keyboards/ymdk/wings/keyboard.json | 1 - keyboards/ymdk/wingshs/keyboard.json | 1 - keyboards/ymdk/yd60mq/info.json | 1 - keyboards/ymdk/ym68/keyboard.json | 1 - keyboards/ymdk/ymd09/keyboard.json | 1 - keyboards/ymdk/ymd21/v2/keyboard.json | 1 - keyboards/ymdk/ymd75/rev4/iso/keyboard.json | 1 - keyboards/ymdk/ymd96/keyboard.json | 1 - keyboards/yncognito/batpad/keyboard.json | 1 - keyboards/yoichiro/lunakey_macro/keyboard.json | 1 - keyboards/yoichiro/lunakey_pico/keyboard.json | 1 - keyboards/yynmt/dozen0/keyboard.json | 1 - keyboards/zeix/eden/keyboard.json | 1 - keyboards/zeix/qwertyqop60hs/keyboard.json | 1 - keyboards/zfrontier/big_switch/keyboard.json | 1 - keyboards/zicodia/tklfrlnrlmlao/keyboard.json | 1 - keyboards/ziggurat/keyboard.json | 1 - keyboards/zigotica/z12/keyboard.json | 1 - keyboards/ziptyze/lets_split_v3/keyboard.json | 1 - keyboards/zj68/keyboard.json | 1 - keyboards/zoo/wampus/keyboard.json | 1 - keyboards/zos/65s/keyboard.json | 1 - keyboards/ztboards/after/keyboard.json | 1 - keyboards/ztboards/noon/keyboard.json | 1 - keyboards/zwag/zwag75/keyboard.json | 1 - keyboards/zwerg/keyboard.json | 1 - keyboards/zykrah/fuyu/keyboard.json | 1 - keyboards/zykrah/slime88/keyboard.json | 1 - 1750 files changed, 2 insertions(+), 1752 deletions(-) diff --git a/keyboards/0xcb/1337/keyboard.json b/keyboards/0xcb/1337/keyboard.json index f4c45adc2f..9983d068bc 100644 --- a/keyboards/0xcb/1337/keyboard.json +++ b/keyboards/0xcb/1337/keyboard.json @@ -65,7 +65,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/0xcb/static/keyboard.json b/keyboards/0xcb/static/keyboard.json index 064d437731..b0ec0b7a14 100644 --- a/keyboards/0xcb/static/keyboard.json +++ b/keyboards/0xcb/static/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/0xcb/tutelpad/keyboard.json b/keyboards/0xcb/tutelpad/keyboard.json index 15a09b0f00..2517fa7072 100644 --- a/keyboards/0xcb/tutelpad/keyboard.json +++ b/keyboards/0xcb/tutelpad/keyboard.json @@ -34,7 +34,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/1upkeyboards/1up60hte/keyboard.json b/keyboards/1upkeyboards/1up60hte/keyboard.json index c080b04cb8..4f781f91ee 100644 --- a/keyboards/1upkeyboards/1up60hte/keyboard.json +++ b/keyboards/1upkeyboards/1up60hte/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/1upkeyboards/1up60rgb/keyboard.json b/keyboards/1upkeyboards/1up60rgb/keyboard.json index 914bbcb7c7..e863edae1b 100644 --- a/keyboards/1upkeyboards/1up60rgb/keyboard.json +++ b/keyboards/1upkeyboards/1up60rgb/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/1upkeyboards/1upocarina/keyboard.json b/keyboards/1upkeyboards/1upocarina/keyboard.json index c3bee81eb8..feeafdedbd 100644 --- a/keyboards/1upkeyboards/1upocarina/keyboard.json +++ b/keyboards/1upkeyboards/1upocarina/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/1upslider8/keyboard.json b/keyboards/1upkeyboards/1upslider8/keyboard.json index 1f80ef23b8..fd969c8f06 100644 --- a/keyboards/1upkeyboards/1upslider8/keyboard.json +++ b/keyboards/1upkeyboards/1upslider8/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/1upsuper16v3/keyboard.json b/keyboards/1upkeyboards/1upsuper16v3/keyboard.json index 0d7e9eb27c..b3b7ef5535 100644 --- a/keyboards/1upkeyboards/1upsuper16v3/keyboard.json +++ b/keyboards/1upkeyboards/1upsuper16v3/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json b/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json index 022ed75338..6d9fc9fe01 100644 --- a/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json +++ b/keyboards/1upkeyboards/pi40/grid_v1_1/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json b/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json index d038a973bf..6cd624bad0 100644 --- a/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json +++ b/keyboards/1upkeyboards/pi40/mit_v1_0/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json b/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json index d133078564..402143991a 100644 --- a/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json +++ b/keyboards/1upkeyboards/pi40/mit_v1_1/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi50/info.json b/keyboards/1upkeyboards/pi50/info.json index 83add323b0..dd222b2b5d 100644 --- a/keyboards/1upkeyboards/pi50/info.json +++ b/keyboards/1upkeyboards/pi50/info.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi60/keyboard.json b/keyboards/1upkeyboards/pi60/keyboard.json index 1074313c2e..b25204bd13 100644 --- a/keyboards/1upkeyboards/pi60/keyboard.json +++ b/keyboards/1upkeyboards/pi60/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/pi60_hse/keyboard.json b/keyboards/1upkeyboards/pi60_hse/keyboard.json index 3b99d43a0a..ec60c0c3f8 100644 --- a/keyboards/1upkeyboards/pi60_hse/keyboard.json +++ b/keyboards/1upkeyboards/pi60_hse/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/pi60_rgb/keyboard.json b/keyboards/1upkeyboards/pi60_rgb/keyboard.json index bd590dc049..6e362eb8c9 100644 --- a/keyboards/1upkeyboards/pi60_rgb/keyboard.json +++ b/keyboards/1upkeyboards/pi60_rgb/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/super16/keyboard.json b/keyboards/1upkeyboards/super16/keyboard.json index fcc1ec1620..461b43764d 100644 --- a/keyboards/1upkeyboards/super16/keyboard.json +++ b/keyboards/1upkeyboards/super16/keyboard.json @@ -78,7 +78,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/1upkeyboards/super16v2/keyboard.json b/keyboards/1upkeyboards/super16v2/keyboard.json index 888bdcc20d..5c5123453c 100644 --- a/keyboards/1upkeyboards/super16v2/keyboard.json +++ b/keyboards/1upkeyboards/super16v2/keyboard.json @@ -50,7 +50,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/sweet16/info.json b/keyboards/1upkeyboards/sweet16/info.json index a1f9de54ba..78c59fb2ae 100644 --- a/keyboards/1upkeyboards/sweet16/info.json +++ b/keyboards/1upkeyboards/sweet16/info.json @@ -4,7 +4,6 @@ "maintainer": "skullydazed", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json b/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json index f5225fce85..40a0ec4039 100644 --- a/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json +++ b/keyboards/1upkeyboards/sweet16v2/kb2040/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json b/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json index ba22994765..d8ff291e69 100644 --- a/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json +++ b/keyboards/1upkeyboards/sweet16v2/pro_micro/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/2key2crawl/keyboard.json b/keyboards/2key2crawl/keyboard.json index 252f619e34..179c9d59ad 100644 --- a/keyboards/2key2crawl/keyboard.json +++ b/keyboards/2key2crawl/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": false, diff --git a/keyboards/30wer/keyboard.json b/keyboards/30wer/keyboard.json index 7c0326125c..d5d4c5fa56 100644 --- a/keyboards/30wer/keyboard.json +++ b/keyboards/30wer/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/3keyecosystem/2key2/keyboard.json b/keyboards/3keyecosystem/2key2/keyboard.json index de34f387c1..2b4659f252 100644 --- a/keyboards/3keyecosystem/2key2/keyboard.json +++ b/keyboards/3keyecosystem/2key2/keyboard.json @@ -69,7 +69,6 @@ "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/40percentclub/4pack/keyboard.json b/keyboards/40percentclub/4pack/keyboard.json index 79aedd88c3..0b26e75b92 100644 --- a/keyboards/40percentclub/4pack/keyboard.json +++ b/keyboards/40percentclub/4pack/keyboard.json @@ -16,7 +16,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/40percentclub/luddite/keyboard.json b/keyboards/40percentclub/luddite/keyboard.json index a892f041cb..812bbdc7aa 100644 --- a/keyboards/40percentclub/luddite/keyboard.json +++ b/keyboards/40percentclub/luddite/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/40percentclub/mf68/keyboard.json b/keyboards/40percentclub/mf68/keyboard.json index 55e0bc4a07..daeab7d4de 100644 --- a/keyboards/40percentclub/mf68/keyboard.json +++ b/keyboards/40percentclub/mf68/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/40percentclub/nano/keyboard.json b/keyboards/40percentclub/nano/keyboard.json index b72c6c8d73..4d797ed076 100644 --- a/keyboards/40percentclub/nano/keyboard.json +++ b/keyboards/40percentclub/nano/keyboard.json @@ -29,7 +29,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/40percentclub/nein/keyboard.json b/keyboards/40percentclub/nein/keyboard.json index 1f35c04e81..267e708038 100644 --- a/keyboards/40percentclub/nein/keyboard.json +++ b/keyboards/40percentclub/nein/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/40percentclub/polyandry/info.json b/keyboards/40percentclub/polyandry/info.json index 0413fbfb87..bddfe9e556 100644 --- a/keyboards/40percentclub/polyandry/info.json +++ b/keyboards/40percentclub/polyandry/info.json @@ -4,7 +4,6 @@ "maintainer": "QMK", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/40percentclub/sixpack/keyboard.json b/keyboards/40percentclub/sixpack/keyboard.json index 69daf6b79c..9bed19df3f 100644 --- a/keyboards/40percentclub/sixpack/keyboard.json +++ b/keyboards/40percentclub/sixpack/keyboard.json @@ -24,7 +24,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/40percentclub/tomato/keyboard.json b/keyboards/40percentclub/tomato/keyboard.json index 79e1e657f0..c11b747f24 100644 --- a/keyboards/40percentclub/tomato/keyboard.json +++ b/keyboards/40percentclub/tomato/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/4pplet/aekiso60/rev_a/keyboard.json b/keyboards/4pplet/aekiso60/rev_a/keyboard.json index 1461015ca8..4fcf8a83f0 100644 --- a/keyboards/4pplet/aekiso60/rev_a/keyboard.json +++ b/keyboards/4pplet/aekiso60/rev_a/keyboard.json @@ -26,7 +26,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/bootleg/rev_a/keyboard.json b/keyboards/4pplet/bootleg/rev_a/keyboard.json index 59ec6979be..18ded6df53 100644 --- a/keyboards/4pplet/bootleg/rev_a/keyboard.json +++ b/keyboards/4pplet/bootleg/rev_a/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json index de73016d57..8d3a519a87 100644 --- a/keyboards/4pplet/perk60_iso/rev_a/keyboard.json +++ b/keyboards/4pplet/perk60_iso/rev_a/keyboard.json @@ -41,7 +41,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/steezy60/rev_a/keyboard.json b/keyboards/4pplet/steezy60/rev_a/keyboard.json index 1ac0eaaff6..bab6a0a9a8 100644 --- a/keyboards/4pplet/steezy60/rev_a/keyboard.json +++ b/keyboards/4pplet/steezy60/rev_a/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/steezy60/rev_b/keyboard.json b/keyboards/4pplet/steezy60/rev_b/keyboard.json index b429cfd70b..5f1be975ce 100644 --- a/keyboards/4pplet/steezy60/rev_b/keyboard.json +++ b/keyboards/4pplet/steezy60/rev_b/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/4pplet/unextended_std/rev_a/keyboard.json b/keyboards/4pplet/unextended_std/rev_a/keyboard.json index a34560f91b..be89861e25 100644 --- a/keyboards/4pplet/unextended_std/rev_a/keyboard.json +++ b/keyboards/4pplet/unextended_std/rev_a/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "key_lock": true diff --git a/keyboards/4pplet/waffling60/rev_a/keyboard.json b/keyboards/4pplet/waffling60/rev_a/keyboard.json index 2df4067ecf..6a3c2ea0ae 100644 --- a/keyboards/4pplet/waffling60/rev_a/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_a/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/4pplet/waffling60/rev_b/keyboard.json b/keyboards/4pplet/waffling60/rev_b/keyboard.json index 51d21d5b5e..158f4ecee5 100644 --- a/keyboards/4pplet/waffling60/rev_b/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_b/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/4pplet/waffling60/rev_c/keyboard.json b/keyboards/4pplet/waffling60/rev_c/keyboard.json index 2995f98646..8f3fd7da9a 100644 --- a/keyboards/4pplet/waffling60/rev_c/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_c/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/4pplet/waffling60/rev_e/keyboard.json b/keyboards/4pplet/waffling60/rev_e/keyboard.json index 13d03d15c3..aed977061f 100644 --- a/keyboards/4pplet/waffling60/rev_e/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json b/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json index e32e9b17b8..0dab5e799e 100644 --- a/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e_ansi/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json b/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json index 5b026334f6..41bb967bdc 100644 --- a/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json +++ b/keyboards/4pplet/waffling60/rev_e_iso/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/4pplet/waffling80/rev_a/keyboard.json b/keyboards/4pplet/waffling80/rev_a/keyboard.json index 4dff811194..0623b7ddaa 100644 --- a/keyboards/4pplet/waffling80/rev_a/keyboard.json +++ b/keyboards/4pplet/waffling80/rev_a/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/4pplet/yakiimo/rev_a/keyboard.json b/keyboards/4pplet/yakiimo/rev_a/keyboard.json index f4c016afc1..a031a1438a 100644 --- a/keyboards/4pplet/yakiimo/rev_a/keyboard.json +++ b/keyboards/4pplet/yakiimo/rev_a/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/7c8/framework/keyboard.json b/keyboards/7c8/framework/keyboard.json index 72302b3e4a..a6d1f8e9e3 100644 --- a/keyboards/7c8/framework/keyboard.json +++ b/keyboards/7c8/framework/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "leader": true, diff --git a/keyboards/9key/keyboard.json b/keyboards/9key/keyboard.json index baa8bb4c18..609989ff5c 100644 --- a/keyboards/9key/keyboard.json +++ b/keyboards/9key/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/a_jazz/akc084/keyboard.json b/keyboards/a_jazz/akc084/keyboard.json index a8290ea75f..85a2c50bc9 100644 --- a/keyboards/a_jazz/akc084/keyboard.json +++ b/keyboards/a_jazz/akc084/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/abatskeyboardclub/nayeon/keyboard.json b/keyboards/abatskeyboardclub/nayeon/keyboard.json index 6b1a748617..9d56e3246b 100644 --- a/keyboards/abatskeyboardclub/nayeon/keyboard.json +++ b/keyboards/abatskeyboardclub/nayeon/keyboard.json @@ -10,7 +10,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgb_matrix": true }, diff --git a/keyboards/abstract/ellipse/rev1/keyboard.json b/keyboards/abstract/ellipse/rev1/keyboard.json index 95ea435ae8..eb84a27fd4 100644 --- a/keyboards/abstract/ellipse/rev1/keyboard.json +++ b/keyboards/abstract/ellipse/rev1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/acekeyboard/titan60/keyboard.json b/keyboards/acekeyboard/titan60/keyboard.json index 1718b6fa22..6995cefcce 100644 --- a/keyboards/acekeyboard/titan60/keyboard.json +++ b/keyboards/acekeyboard/titan60/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/acheron/apollo/87h/delta/keyboard.json b/keyboards/acheron/apollo/87h/delta/keyboard.json index 1676297ab7..f5bdf28d96 100644 --- a/keyboards/acheron/apollo/87h/delta/keyboard.json +++ b/keyboards/acheron/apollo/87h/delta/keyboard.json @@ -61,7 +61,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/apollo/87htsc/keyboard.json b/keyboards/acheron/apollo/87htsc/keyboard.json index 654a99c404..4b2ff1ad66 100644 --- a/keyboards/acheron/apollo/87htsc/keyboard.json +++ b/keyboards/acheron/apollo/87htsc/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/apollo/88htsc/keyboard.json b/keyboards/acheron/apollo/88htsc/keyboard.json index 539fc5bcdd..165c8d76eb 100644 --- a/keyboards/acheron/apollo/88htsc/keyboard.json +++ b/keyboards/acheron/apollo/88htsc/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/acheron/athena/alpha/keyboard.json b/keyboards/acheron/athena/alpha/keyboard.json index 47f626f1cc..3a64456b51 100644 --- a/keyboards/acheron/athena/alpha/keyboard.json +++ b/keyboards/acheron/athena/alpha/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/acheron/athena/beta/keyboard.json b/keyboards/acheron/athena/beta/keyboard.json index bded4b8805..539c28aac2 100644 --- a/keyboards/acheron/athena/beta/keyboard.json +++ b/keyboards/acheron/athena/beta/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/acheron/elongate/delta/keyboard.json b/keyboards/acheron/elongate/delta/keyboard.json index 18d5b539b3..1cc2317b54 100644 --- a/keyboards/acheron/elongate/delta/keyboard.json +++ b/keyboards/acheron/elongate/delta/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ada/infinity81/keyboard.json b/keyboards/ada/infinity81/keyboard.json index df5b0fd975..d2fc2ff024 100644 --- a/keyboards/ada/infinity81/keyboard.json +++ b/keyboards/ada/infinity81/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/adm42/rev4/keyboard.json b/keyboards/adm42/rev4/keyboard.json index b22273e3d3..761364d8a7 100644 --- a/keyboards/adm42/rev4/keyboard.json +++ b/keyboards/adm42/rev4/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/adpenrose/akemipad/keyboard.json b/keyboards/adpenrose/akemipad/keyboard.json index f372b7bd04..2dcfed3b5a 100644 --- a/keyboards/adpenrose/akemipad/keyboard.json +++ b/keyboards/adpenrose/akemipad/keyboard.json @@ -23,7 +23,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/kintsugi/keyboard.json b/keyboards/adpenrose/kintsugi/keyboard.json index f86d344cdb..ee4de0e267 100644 --- a/keyboards/adpenrose/kintsugi/keyboard.json +++ b/keyboards/adpenrose/kintsugi/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/obi/keyboard.json b/keyboards/adpenrose/obi/keyboard.json index 1102878dc7..e02a331434 100644 --- a/keyboards/adpenrose/obi/keyboard.json +++ b/keyboards/adpenrose/obi/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/adpenrose/shisaku/keyboard.json b/keyboards/adpenrose/shisaku/keyboard.json index d3d6b4607e..62bdd42563 100644 --- a/keyboards/adpenrose/shisaku/keyboard.json +++ b/keyboards/adpenrose/shisaku/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/aeboards/aegis/keyboard.json b/keyboards/aeboards/aegis/keyboard.json index 4f70eaf131..fcebbf4bc5 100644 --- a/keyboards/aeboards/aegis/keyboard.json +++ b/keyboards/aeboards/aegis/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/afternoonlabs/gust/rev1/keyboard.json b/keyboards/afternoonlabs/gust/rev1/keyboard.json index 9ba40a6426..7f22279cc3 100644 --- a/keyboards/afternoonlabs/gust/rev1/keyboard.json +++ b/keyboards/afternoonlabs/gust/rev1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ai/keyboard.json b/keyboards/ai/keyboard.json index 5a41e18a53..bf594d306a 100644 --- a/keyboards/ai/keyboard.json +++ b/keyboards/ai/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/altair/keyboard.json b/keyboards/ai03/altair/keyboard.json index f4c17ce425..ac5ff28eb1 100644 --- a/keyboards/ai03/altair/keyboard.json +++ b/keyboards/ai03/altair/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/altair_x/keyboard.json b/keyboards/ai03/altair_x/keyboard.json index 7277184e9a..922496778f 100644 --- a/keyboards/ai03/altair_x/keyboard.json +++ b/keyboards/ai03/altair_x/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/duet/keyboard.json b/keyboards/ai03/duet/keyboard.json index 055e23e4d7..287097e0e1 100644 --- a/keyboards/ai03/duet/keyboard.json +++ b/keyboards/ai03/duet/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ai03/equinox_xl/keyboard.json b/keyboards/ai03/equinox_xl/keyboard.json index 051f4452c0..d3b6fd0969 100644 --- a/keyboards/ai03/equinox_xl/keyboard.json +++ b/keyboards/ai03/equinox_xl/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/jp60/keyboard.json b/keyboards/ai03/jp60/keyboard.json index c54062977a..901263c6c8 100644 --- a/keyboards/ai03/jp60/keyboard.json +++ b/keyboards/ai03/jp60/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ai03/voyager60_alps/keyboard.json b/keyboards/ai03/voyager60_alps/keyboard.json index 25546cfb74..1c1ed33f52 100644 --- a/keyboards/ai03/voyager60_alps/keyboard.json +++ b/keyboards/ai03/voyager60_alps/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/aidansmithdotdev/fine40/keyboard.json b/keyboards/aidansmithdotdev/fine40/keyboard.json index a7b4d54e92..503e7a162a 100644 --- a/keyboards/aidansmithdotdev/fine40/keyboard.json +++ b/keyboards/aidansmithdotdev/fine40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "encoder": true, diff --git a/keyboards/akb/ogr/keyboard.json b/keyboards/akb/ogr/keyboard.json index 57dbfbdd3f..0e401c8f52 100644 --- a/keyboards/akb/ogr/keyboard.json +++ b/keyboards/akb/ogr/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akb/ogrn/keyboard.json b/keyboards/akb/ogrn/keyboard.json index 66b682af23..7ccf6ebb97 100644 --- a/keyboards/akb/ogrn/keyboard.json +++ b/keyboards/akb/ogrn/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akb/vero/keyboard.json b/keyboards/akb/vero/keyboard.json index f443c1afad..dcdaf21635 100644 --- a/keyboards/akb/vero/keyboard.json +++ b/keyboards/akb/vero/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/akko/5087/keyboard.json b/keyboards/akko/5087/keyboard.json index 3a309711e3..0561817b69 100644 --- a/keyboards/akko/5087/keyboard.json +++ b/keyboards/akko/5087/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/akko/5108/keyboard.json b/keyboards/akko/5108/keyboard.json index 6429885b82..b62dbbf17c 100644 --- a/keyboards/akko/5108/keyboard.json +++ b/keyboards/akko/5108/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/akko/acr87/keyboard.json b/keyboards/akko/acr87/keyboard.json index df51b0b4b9..17981b609a 100644 --- a/keyboards/akko/acr87/keyboard.json +++ b/keyboards/akko/acr87/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/akko/top40/keyboard.json b/keyboards/akko/top40/keyboard.json index f206a2a70b..3cb7086608 100644 --- a/keyboards/akko/top40/keyboard.json +++ b/keyboards/akko/top40/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/alf/x11/keyboard.json b/keyboards/alf/x11/keyboard.json index a368123e84..5d141804ba 100644 --- a/keyboards/alf/x11/keyboard.json +++ b/keyboards/alf/x11/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/alf/x2/keyboard.json b/keyboards/alf/x2/keyboard.json index 2135a46683..103c7ad88b 100644 --- a/keyboards/alf/x2/keyboard.json +++ b/keyboards/alf/x2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/alfredslab/swift65/hotswap/keyboard.json b/keyboards/alfredslab/swift65/hotswap/keyboard.json index 8100b7bcbd..edf4a13ce1 100644 --- a/keyboards/alfredslab/swift65/hotswap/keyboard.json +++ b/keyboards/alfredslab/swift65/hotswap/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/alfredslab/swift65/solder/keyboard.json b/keyboards/alfredslab/swift65/solder/keyboard.json index 9fecc6a5f6..50cdb3fd56 100644 --- a/keyboards/alfredslab/swift65/solder/keyboard.json +++ b/keyboards/alfredslab/swift65/solder/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/alhenkb/macropad5x4/keyboard.json b/keyboards/alhenkb/macropad5x4/keyboard.json index fd2645619e..79cf98fb63 100644 --- a/keyboards/alhenkb/macropad5x4/keyboard.json +++ b/keyboards/alhenkb/macropad5x4/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/alpha/keyboard.json b/keyboards/alpha/keyboard.json index 4412177fbb..84a25eb180 100644 --- a/keyboards/alpha/keyboard.json +++ b/keyboards/alpha/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/amag23/keyboard.json b/keyboards/amag23/keyboard.json index 8b144cdef1..01b4b18e0c 100644 --- a/keyboards/amag23/keyboard.json +++ b/keyboards/amag23/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/amjkeyboard/amj40/keyboard.json b/keyboards/amjkeyboard/amj40/keyboard.json index dd27bd46ae..1c1824c25c 100644 --- a/keyboards/amjkeyboard/amj40/keyboard.json +++ b/keyboards/amjkeyboard/amj40/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/amjkeyboard/amj60/keyboard.json b/keyboards/amjkeyboard/amj60/keyboard.json index d5d7bc1804..f7d074041e 100644 --- a/keyboards/amjkeyboard/amj60/keyboard.json +++ b/keyboards/amjkeyboard/amj60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/amjkeyboard/amj84/keyboard.json b/keyboards/amjkeyboard/amj84/keyboard.json index 9293bf1581..a6108ab9a7 100644 --- a/keyboards/amjkeyboard/amj84/keyboard.json +++ b/keyboards/amjkeyboard/amj84/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/an_achronism/tetromino/keyboard.json b/keyboards/an_achronism/tetromino/keyboard.json index b9a0e2005d..b9c0acb374 100644 --- a/keyboards/an_achronism/tetromino/keyboard.json +++ b/keyboards/an_achronism/tetromino/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/arrows/keyboard.json b/keyboards/anavi/arrows/keyboard.json index 7b9aa2985c..0d09b6d551 100644 --- a/keyboards/anavi/arrows/keyboard.json +++ b/keyboards/anavi/arrows/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/knob1/keyboard.json b/keyboards/anavi/knob1/keyboard.json index 176ee6472d..83d0064b8d 100644 --- a/keyboards/anavi/knob1/keyboard.json +++ b/keyboards/anavi/knob1/keyboard.json @@ -7,7 +7,6 @@ "bootloader": "rp2040", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/knobs3/keyboard.json b/keyboards/anavi/knobs3/keyboard.json index 5e6cca99dc..13f5ab6e14 100644 --- a/keyboards/anavi/knobs3/keyboard.json +++ b/keyboards/anavi/knobs3/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/macropad10/keyboard.json b/keyboards/anavi/macropad10/keyboard.json index 36f4e0cde8..6b104b7afc 100644 --- a/keyboards/anavi/macropad10/keyboard.json +++ b/keyboards/anavi/macropad10/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/anavi/macropad12/keyboard.json b/keyboards/anavi/macropad12/keyboard.json index be7c7cc963..7ac3e27fcd 100644 --- a/keyboards/anavi/macropad12/keyboard.json +++ b/keyboards/anavi/macropad12/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/anavi/macropad8/keyboard.json b/keyboards/anavi/macropad8/keyboard.json index 9ed6601cff..8073a038a2 100644 --- a/keyboards/anavi/macropad8/keyboard.json +++ b/keyboards/anavi/macropad8/keyboard.json @@ -36,7 +36,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/andean_condor/keyboard.json b/keyboards/andean_condor/keyboard.json index 67502ed56a..02cb70986b 100644 --- a/keyboards/andean_condor/keyboard.json +++ b/keyboards/andean_condor/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ano/keyboard.json b/keyboards/ano/keyboard.json index c0522ab1cc..2954fd981e 100644 --- a/keyboards/ano/keyboard.json +++ b/keyboards/ano/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/anomalykb/a65i/keyboard.json b/keyboards/anomalykb/a65i/keyboard.json index 8fadaadadb..88de392a3b 100644 --- a/keyboards/anomalykb/a65i/keyboard.json +++ b/keyboards/anomalykb/a65i/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/aos/tkl/keyboard.json b/keyboards/aos/tkl/keyboard.json index 4d2476a518..7739ba860b 100644 --- a/keyboards/aos/tkl/keyboard.json +++ b/keyboards/aos/tkl/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/aplyard/aplx6/rev1/keyboard.json b/keyboards/aplyard/aplx6/rev1/keyboard.json index 288093b240..667ebdba02 100644 --- a/keyboards/aplyard/aplx6/rev1/keyboard.json +++ b/keyboards/aplyard/aplx6/rev1/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/aplyard/aplx6/rev2/keyboard.json b/keyboards/aplyard/aplx6/rev2/keyboard.json index 597076ef55..4c881534f4 100644 --- a/keyboards/aplyard/aplx6/rev2/keyboard.json +++ b/keyboards/aplyard/aplx6/rev2/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json b/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json index 5c8978f08a..9717ada94f 100644 --- a/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json +++ b/keyboards/argo_works/ishi/80/mk0_avr/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json b/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json index c18440971f..54a5b72d5a 100644 --- a/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json +++ b/keyboards/argo_works/ishi/80/mk0_avr_extra/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/arisu/keyboard.json b/keyboards/arisu/keyboard.json index 27bec90b09..2dd58321e3 100644 --- a/keyboards/arisu/keyboard.json +++ b/keyboards/arisu/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/arrayperipherals/1x4p1/keyboard.json b/keyboards/arrayperipherals/1x4p1/keyboard.json index fff3b1af04..4a0f1b9cfd 100644 --- a/keyboards/arrayperipherals/1x4p1/keyboard.json +++ b/keyboards/arrayperipherals/1x4p1/keyboard.json @@ -17,7 +17,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/artemis/paragon/info.json b/keyboards/artemis/paragon/info.json index fe0983e194..1ff5d4ab42 100644 --- a/keyboards/artemis/paragon/info.json +++ b/keyboards/artemis/paragon/info.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ash1800/keyboard.json b/keyboards/ash1800/keyboard.json index 7156172173..c253590937 100644 --- a/keyboards/ash1800/keyboard.json +++ b/keyboards/ash1800/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ash_xiix/keyboard.json b/keyboards/ash_xiix/keyboard.json index ce8579af04..c1ba811d32 100644 --- a/keyboards/ash_xiix/keyboard.json +++ b/keyboards/ash_xiix/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ask55/keyboard.json b/keyboards/ask55/keyboard.json index 1916cace64..1731d1a3d9 100644 --- a/keyboards/ask55/keyboard.json +++ b/keyboards/ask55/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/atlantis/ak81_ve/keyboard.json b/keyboards/atlantis/ak81_ve/keyboard.json index fd6123b02b..7c01714201 100644 --- a/keyboards/atlantis/ak81_ve/keyboard.json +++ b/keyboards/atlantis/ak81_ve/keyboard.json @@ -181,7 +181,6 @@ }, "features": { "bootmagic": true, - "command": false, "dynamic_macro": true, "encoder": true, "extrakey": true, diff --git a/keyboards/atlantis/ps17/keyboard.json b/keyboards/atlantis/ps17/keyboard.json index 2231ae1ceb..3c7f50be0b 100644 --- a/keyboards/atlantis/ps17/keyboard.json +++ b/keyboards/atlantis/ps17/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/atlas_65/keyboard.json b/keyboards/atlas_65/keyboard.json index 354ff6f4e8..3d72ec602e 100644 --- a/keyboards/atlas_65/keyboard.json +++ b/keyboards/atlas_65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/aves60/keyboard.json b/keyboards/aves60/keyboard.json index e26bc47fae..09298df289 100644 --- a/keyboards/aves60/keyboard.json +++ b/keyboards/aves60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/aves65/keyboard.json b/keyboards/aves65/keyboard.json index 9a0895efaf..6d61bd211a 100644 --- a/keyboards/aves65/keyboard.json +++ b/keyboards/aves65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/axolstudio/foundation_gamma/keyboard.json b/keyboards/axolstudio/foundation_gamma/keyboard.json index 62db475c2f..3d79739719 100644 --- a/keyboards/axolstudio/foundation_gamma/keyboard.json +++ b/keyboards/axolstudio/foundation_gamma/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/axolstudio/yeti/hotswap/keyboard.json b/keyboards/axolstudio/yeti/hotswap/keyboard.json index 0bba4d9d81..5607001287 100644 --- a/keyboards/axolstudio/yeti/hotswap/keyboard.json +++ b/keyboards/axolstudio/yeti/hotswap/keyboard.json @@ -51,7 +51,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/axolstudio/yeti/soldered/keyboard.json b/keyboards/axolstudio/yeti/soldered/keyboard.json index 9e017af945..6dac1e5b16 100644 --- a/keyboards/axolstudio/yeti/soldered/keyboard.json +++ b/keyboards/axolstudio/yeti/soldered/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/bacca70/keyboard.json b/keyboards/bacca70/keyboard.json index 8f3b2d840d..6fe4718c49 100644 --- a/keyboards/bacca70/keyboard.json +++ b/keyboards/bacca70/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/baguette/keyboard.json b/keyboards/baguette/keyboard.json index 37b0be164a..857c28b0bd 100644 --- a/keyboards/baguette/keyboard.json +++ b/keyboards/baguette/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/balloondogcaps/tr90/keyboard.json b/keyboards/balloondogcaps/tr90/keyboard.json index c4176f4ff3..6defe95987 100644 --- a/keyboards/balloondogcaps/tr90/keyboard.json +++ b/keyboards/balloondogcaps/tr90/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/balloondogcaps/tr90pm/keyboard.json b/keyboards/balloondogcaps/tr90pm/keyboard.json index 66ef389a7f..da8f29e977 100644 --- a/keyboards/balloondogcaps/tr90pm/keyboard.json +++ b/keyboards/balloondogcaps/tr90pm/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/barracuda/keyboard.json b/keyboards/barracuda/keyboard.json index be92c5c6de..fd05e9ca7c 100644 --- a/keyboards/barracuda/keyboard.json +++ b/keyboards/barracuda/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json index e283b2409b..b09f32cf5f 100644 --- a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json index 9e85e7af1e..4613509dba 100644 --- a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json +++ b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bear_face/info.json b/keyboards/bear_face/info.json index f81f4c4536..1a35a26a27 100644 --- a/keyboards/bear_face/info.json +++ b/keyboards/bear_face/info.json @@ -9,7 +9,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false }, diff --git a/keyboards/beekeeb/piantor/keyboard.json b/keyboards/beekeeb/piantor/keyboard.json index 8d58efb90e..94463f6c6d 100644 --- a/keyboards/beekeeb/piantor/keyboard.json +++ b/keyboards/beekeeb/piantor/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "rp2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/beekeeb/piantor_pro/keyboard.json b/keyboards/beekeeb/piantor_pro/keyboard.json index 558114b67e..bca723d5ba 100644 --- a/keyboards/beekeeb/piantor_pro/keyboard.json +++ b/keyboards/beekeeb/piantor_pro/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/binepad/bn006/keyboard.json b/keyboards/binepad/bn006/keyboard.json index b535aabfcc..52f0086d1a 100755 --- a/keyboards/binepad/bn006/keyboard.json +++ b/keyboards/binepad/bn006/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/binepad/bn009/info.json b/keyboards/binepad/bn009/info.json index d5ad51eb8c..eba9ab4e4b 100644 --- a/keyboards/binepad/bn009/info.json +++ b/keyboards/binepad/bn009/info.json @@ -4,7 +4,6 @@ "maintainer": "binepad", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/binepad/bnr1/info.json b/keyboards/binepad/bnr1/info.json index 3c844d8512..b2591901fc 100755 --- a/keyboards/binepad/bnr1/info.json +++ b/keyboards/binepad/bnr1/info.json @@ -4,7 +4,6 @@ "maintainer": "Binpad", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/binepad/pixie/keyboard.json b/keyboards/binepad/pixie/keyboard.json index 0c906aef03..8017121006 100644 --- a/keyboards/binepad/pixie/keyboard.json +++ b/keyboards/binepad/pixie/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/bioi/f60/keyboard.json b/keyboards/bioi/f60/keyboard.json index a27533713b..1ad2f89cf8 100644 --- a/keyboards/bioi/f60/keyboard.json +++ b/keyboards/bioi/f60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/black_hellebore/keyboard.json b/keyboards/black_hellebore/keyboard.json index 7d7d6ea52f..e93b6c05f5 100644 --- a/keyboards/black_hellebore/keyboard.json +++ b/keyboards/black_hellebore/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/blackplum/keyboard.json b/keyboards/blackplum/keyboard.json index cf6ed8fd3e..4fabde8535 100644 --- a/keyboards/blackplum/keyboard.json +++ b/keyboards/blackplum/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/blank/blank01/keyboard.json b/keyboards/blank/blank01/keyboard.json index bc55401c4f..0e7e7d1de5 100644 --- a/keyboards/blank/blank01/keyboard.json +++ b/keyboards/blank/blank01/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/blaster75/keyboard.json b/keyboards/blaster75/keyboard.json index 93288150ba..f0b3a5fccf 100644 --- a/keyboards/blaster75/keyboard.json +++ b/keyboards/blaster75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/blockboy/ac980mini/keyboard.json b/keyboards/blockboy/ac980mini/keyboard.json index 568cfa17b5..ce261639e2 100644 --- a/keyboards/blockboy/ac980mini/keyboard.json +++ b/keyboards/blockboy/ac980mini/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/boardrun/classic/keyboard.json b/keyboards/boardrun/classic/keyboard.json index 320eaa4103..bdddee8067 100644 --- a/keyboards/boardrun/classic/keyboard.json +++ b/keyboards/boardrun/classic/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/bobpad/keyboard.json b/keyboards/bobpad/keyboard.json index cc14263d0d..2581097a67 100644 --- a/keyboards/bobpad/keyboard.json +++ b/keyboards/bobpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bolsa/bolsalice/keyboard.json b/keyboards/bolsa/bolsalice/keyboard.json index a6a37514f9..74607ed464 100644 --- a/keyboards/bolsa/bolsalice/keyboard.json +++ b/keyboards/bolsa/bolsalice/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bolsa/damapad/keyboard.json b/keyboards/bolsa/damapad/keyboard.json index 7417f4f7d7..b48e8c3586 100644 --- a/keyboards/bolsa/damapad/keyboard.json +++ b/keyboards/bolsa/damapad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bop/keyboard.json b/keyboards/bop/keyboard.json index dbd97ad2ff..f94264a670 100644 --- a/keyboards/bop/keyboard.json +++ b/keyboards/bop/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/boston/keyboard.json b/keyboards/boston/keyboard.json index fc91b72873..f32101ca2e 100644 --- a/keyboards/boston/keyboard.json +++ b/keyboards/boston/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/bpiphany/four_banger/keyboard.json b/keyboards/bpiphany/four_banger/keyboard.json index fe7cd2f32a..b94bdf2e90 100644 --- a/keyboards/bpiphany/four_banger/keyboard.json +++ b/keyboards/bpiphany/four_banger/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/bpiphany/frosty_flake/20130602/keyboard.json b/keyboards/bpiphany/frosty_flake/20130602/keyboard.json index 4aba74d038..a5efb2e322 100644 --- a/keyboards/bpiphany/frosty_flake/20130602/keyboard.json +++ b/keyboards/bpiphany/frosty_flake/20130602/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bpiphany/frosty_flake/20140521/keyboard.json b/keyboards/bpiphany/frosty_flake/20140521/keyboard.json index e1aae95566..33f9ee5f3d 100644 --- a/keyboards/bpiphany/frosty_flake/20140521/keyboard.json +++ b/keyboards/bpiphany/frosty_flake/20140521/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bpiphany/sixshooter/keyboard.json b/keyboards/bpiphany/sixshooter/keyboard.json index f3d0aeeca6..b84e8f5c5d 100644 --- a/keyboards/bpiphany/sixshooter/keyboard.json +++ b/keyboards/bpiphany/sixshooter/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "halfkay", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/bredworks/wyvern_hs/keyboard.json b/keyboards/bredworks/wyvern_hs/keyboard.json index 87f2ef02c0..c5233c304a 100644 --- a/keyboards/bredworks/wyvern_hs/keyboard.json +++ b/keyboards/bredworks/wyvern_hs/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bschwind/key_ripper/keyboard.json b/keyboards/bschwind/key_ripper/keyboard.json index b4b01b30ec..f9dbf9d6cb 100644 --- a/keyboards/bschwind/key_ripper/keyboard.json +++ b/keyboards/bschwind/key_ripper/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/bthlabs/geekpad/keyboard.json b/keyboards/bthlabs/geekpad/keyboard.json index 9bd1a92c5b..1ea302612a 100644 --- a/keyboards/bthlabs/geekpad/keyboard.json +++ b/keyboards/bthlabs/geekpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/budgy/keyboard.json b/keyboards/budgy/keyboard.json index 5397def52c..d43e02fdc0 100644 --- a/keyboards/budgy/keyboard.json +++ b/keyboards/budgy/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "rp2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/buildakb/mw60/keyboard.json b/keyboards/buildakb/mw60/keyboard.json index 08b917c77a..00e21a0335 100644 --- a/keyboards/buildakb/mw60/keyboard.json +++ b/keyboards/buildakb/mw60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/buildakb/potato65/keyboard.json b/keyboards/buildakb/potato65/keyboard.json index 12b175600d..c78ee1948e 100644 --- a/keyboards/buildakb/potato65/keyboard.json +++ b/keyboards/buildakb/potato65/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/buildakb/potato65hs/keyboard.json b/keyboards/buildakb/potato65hs/keyboard.json index c6daaf7b6b..3a91ac1ccc 100644 --- a/keyboards/buildakb/potato65hs/keyboard.json +++ b/keyboards/buildakb/potato65hs/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/buildakb/potato65s/keyboard.json b/keyboards/buildakb/potato65s/keyboard.json index a85bbd1000..3ff7187962 100644 --- a/keyboards/buildakb/potato65s/keyboard.json +++ b/keyboards/buildakb/potato65s/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/butterkeebs/pocketpad/keyboard.json b/keyboards/butterkeebs/pocketpad/keyboard.json index a36cab3cbe..0829f91438 100644 --- a/keyboards/butterkeebs/pocketpad/keyboard.json +++ b/keyboards/butterkeebs/pocketpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cablecardesigns/cypher/rev6/keyboard.json b/keyboards/cablecardesigns/cypher/rev6/keyboard.json index 71891cdb53..f6e481c1df 100644 --- a/keyboards/cablecardesigns/cypher/rev6/keyboard.json +++ b/keyboards/cablecardesigns/cypher/rev6/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cablecardesigns/phoenix/keyboard.json b/keyboards/cablecardesigns/phoenix/keyboard.json index 753b706746..a165758ad0 100755 --- a/keyboards/cablecardesigns/phoenix/keyboard.json +++ b/keyboards/cablecardesigns/phoenix/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/caffeinated/serpent65/keyboard.json b/keyboards/caffeinated/serpent65/keyboard.json index 55a9f27dcc..7ea4957921 100644 --- a/keyboards/caffeinated/serpent65/keyboard.json +++ b/keyboards/caffeinated/serpent65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/canary/canary60rgb/v1/keyboard.json b/keyboards/canary/canary60rgb/v1/keyboard.json index 474460d5b5..a1247769e6 100644 --- a/keyboards/canary/canary60rgb/v1/keyboard.json +++ b/keyboards/canary/canary60rgb/v1/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/cannonkeys/adelie/keyboard.json b/keyboards/cannonkeys/adelie/keyboard.json index 1f30a3c41c..136c0d362f 100644 --- a/keyboards/cannonkeys/adelie/keyboard.json +++ b/keyboards/cannonkeys/adelie/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/cannonkeys/atlas_alps/keyboard.json b/keyboards/cannonkeys/atlas_alps/keyboard.json index 7179ea2fcc..f70ce60acc 100644 --- a/keyboards/cannonkeys/atlas_alps/keyboard.json +++ b/keyboards/cannonkeys/atlas_alps/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json b/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json index 858db3c20f..4865ca02b6 100644 --- a/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json +++ b/keyboards/cannonkeys/bakeneko60_iso_hs/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json b/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json index f0ab41a0b9..f9cc28f864 100644 --- a/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json +++ b/keyboards/cannonkeys/bakeneko65_iso_hs/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion60/keyboard.json b/keyboards/cannonkeys/bastion60/keyboard.json index ddc3513434..518d332ce0 100644 --- a/keyboards/cannonkeys/bastion60/keyboard.json +++ b/keyboards/cannonkeys/bastion60/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion65/keyboard.json b/keyboards/cannonkeys/bastion65/keyboard.json index 936b23c396..4d13309331 100644 --- a/keyboards/cannonkeys/bastion65/keyboard.json +++ b/keyboards/cannonkeys/bastion65/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastion75/keyboard.json b/keyboards/cannonkeys/bastion75/keyboard.json index fcaecbdb60..3c96e4f943 100644 --- a/keyboards/cannonkeys/bastion75/keyboard.json +++ b/keyboards/cannonkeys/bastion75/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/bastiontkl/keyboard.json b/keyboards/cannonkeys/bastiontkl/keyboard.json index 71c12d4e88..9617bce56c 100644 --- a/keyboards/cannonkeys/bastiontkl/keyboard.json +++ b/keyboards/cannonkeys/bastiontkl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/brutalv2_1800/keyboard.json b/keyboards/cannonkeys/brutalv2_1800/keyboard.json index 2a0c5deb52..0fd9204be9 100644 --- a/keyboards/cannonkeys/brutalv2_1800/keyboard.json +++ b/keyboards/cannonkeys/brutalv2_1800/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/caerdroia/keyboard.json b/keyboards/cannonkeys/caerdroia/keyboard.json index dcea5e06be..0fec202dea 100644 --- a/keyboards/cannonkeys/caerdroia/keyboard.json +++ b/keyboards/cannonkeys/caerdroia/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/chimera65_hs/keyboard.json b/keyboards/cannonkeys/chimera65_hs/keyboard.json index 5792251916..fd5c7dd84a 100644 --- a/keyboards/cannonkeys/chimera65_hs/keyboard.json +++ b/keyboards/cannonkeys/chimera65_hs/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ellipse/keyboard.json b/keyboards/cannonkeys/ellipse/keyboard.json index 4bc159617e..dc99210b88 100644 --- a/keyboards/cannonkeys/ellipse/keyboard.json +++ b/keyboards/cannonkeys/ellipse/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ellipse_hs/keyboard.json b/keyboards/cannonkeys/ellipse_hs/keyboard.json index 52b7a4a918..fba7abf9ea 100644 --- a/keyboards/cannonkeys/ellipse_hs/keyboard.json +++ b/keyboards/cannonkeys/ellipse_hs/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/hoodrowg/keyboard.json b/keyboards/cannonkeys/hoodrowg/keyboard.json index 971779411d..73d4370c4a 100644 --- a/keyboards/cannonkeys/hoodrowg/keyboard.json +++ b/keyboards/cannonkeys/hoodrowg/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cannonkeys/leviatan/keyboard.json b/keyboards/cannonkeys/leviatan/keyboard.json index 880d30c1e3..f68ca0ef2c 100644 --- a/keyboards/cannonkeys/leviatan/keyboard.json +++ b/keyboards/cannonkeys/leviatan/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/meetuppad2023/keyboard.json b/keyboards/cannonkeys/meetuppad2023/keyboard.json index f43892a949..ae393ecb2c 100644 --- a/keyboards/cannonkeys/meetuppad2023/keyboard.json +++ b/keyboards/cannonkeys/meetuppad2023/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/moment/keyboard.json b/keyboards/cannonkeys/moment/keyboard.json index aa718a6c72..1585403293 100644 --- a/keyboards/cannonkeys/moment/keyboard.json +++ b/keyboards/cannonkeys/moment/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/moment_hs/keyboard.json b/keyboards/cannonkeys/moment_hs/keyboard.json index 4729376080..4a55026974 100644 --- a/keyboards/cannonkeys/moment_hs/keyboard.json +++ b/keyboards/cannonkeys/moment_hs/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/nearfield/keyboard.json b/keyboards/cannonkeys/nearfield/keyboard.json index 0afc36ced0..0d49846394 100644 --- a/keyboards/cannonkeys/nearfield/keyboard.json +++ b/keyboards/cannonkeys/nearfield/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ortho48v2/keyboard.json b/keyboards/cannonkeys/ortho48v2/keyboard.json index 607b687e05..7861f33425 100644 --- a/keyboards/cannonkeys/ortho48v2/keyboard.json +++ b/keyboards/cannonkeys/ortho48v2/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ortho60v2/keyboard.json b/keyboards/cannonkeys/ortho60v2/keyboard.json index be60c49d37..99c15f1058 100644 --- a/keyboards/cannonkeys/ortho60v2/keyboard.json +++ b/keyboards/cannonkeys/ortho60v2/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/petrichor/keyboard.json b/keyboards/cannonkeys/petrichor/keyboard.json index 16e03eacb6..90f9886cdc 100644 --- a/keyboards/cannonkeys/petrichor/keyboard.json +++ b/keyboards/cannonkeys/petrichor/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/reverie/info.json b/keyboards/cannonkeys/reverie/info.json index 793365bb60..418d0a6176 100644 --- a/keyboards/cannonkeys/reverie/info.json +++ b/keyboards/cannonkeys/reverie/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/ripple/keyboard.json b/keyboards/cannonkeys/ripple/keyboard.json index 605b180847..e2f6c77645 100644 --- a/keyboards/cannonkeys/ripple/keyboard.json +++ b/keyboards/cannonkeys/ripple/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/ripple_hs/keyboard.json b/keyboards/cannonkeys/ripple_hs/keyboard.json index 55a47524a3..34ba5c8210 100644 --- a/keyboards/cannonkeys/ripple_hs/keyboard.json +++ b/keyboards/cannonkeys/ripple_hs/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/satisfaction75/info.json b/keyboards/cannonkeys/satisfaction75/info.json index a5d21c9384..69efb36a8c 100644 --- a/keyboards/cannonkeys/satisfaction75/info.json +++ b/keyboards/cannonkeys/satisfaction75/info.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cannonkeys/satisfaction75_hs/keyboard.json b/keyboards/cannonkeys/satisfaction75_hs/keyboard.json index 48faa60362..55a03da463 100644 --- a/keyboards/cannonkeys/satisfaction75_hs/keyboard.json +++ b/keyboards/cannonkeys/satisfaction75_hs/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/cannonkeys/serenity/keyboard.json b/keyboards/cannonkeys/serenity/keyboard.json index ad972da149..83eed98abb 100644 --- a/keyboards/cannonkeys/serenity/keyboard.json +++ b/keyboards/cannonkeys/serenity/keyboard.json @@ -13,7 +13,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cannonkeys/typeb/keyboard.json b/keyboards/cannonkeys/typeb/keyboard.json index ef89d38caf..fb3bf0964d 100644 --- a/keyboards/cannonkeys/typeb/keyboard.json +++ b/keyboards/cannonkeys/typeb/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/vector/keyboard.json b/keyboards/cannonkeys/vector/keyboard.json index b0481ea474..117a83208f 100644 --- a/keyboards/cannonkeys/vector/keyboard.json +++ b/keyboards/cannonkeys/vector/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cannonkeys/vida/info.json b/keyboards/cannonkeys/vida/info.json index d3a4f01aa4..c8462b2ea9 100644 --- a/keyboards/cannonkeys/vida/info.json +++ b/keyboards/cannonkeys/vida/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cantor/keyboard.json b/keyboards/cantor/keyboard.json index 5df6f972ee..9065e11ae5 100644 --- a/keyboards/cantor/keyboard.json +++ b/keyboards/cantor/keyboard.json @@ -4,7 +4,6 @@ "maintainer": "diepala", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/capsunlocked/cu24/keyboard.json b/keyboards/capsunlocked/cu24/keyboard.json index 0d393d1d8d..2a8ccf19c0 100644 --- a/keyboards/capsunlocked/cu24/keyboard.json +++ b/keyboards/capsunlocked/cu24/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/capsunlocked/cu65/keyboard.json b/keyboards/capsunlocked/cu65/keyboard.json index dbb4f35fb2..444a5ae178 100644 --- a/keyboards/capsunlocked/cu65/keyboard.json +++ b/keyboards/capsunlocked/cu65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/capsunlocked/cu7/keyboard.json b/keyboards/capsunlocked/cu7/keyboard.json index 1eb8a56944..e19dc5acb3 100644 --- a/keyboards/capsunlocked/cu7/keyboard.json +++ b/keyboards/capsunlocked/cu7/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/capsunlocked/cu80/v1/keyboard.json b/keyboards/capsunlocked/cu80/v1/keyboard.json index 0cc05a554b..18fb97037b 100644 --- a/keyboards/capsunlocked/cu80/v1/keyboard.json +++ b/keyboards/capsunlocked/cu80/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/carbo65/keyboard.json b/keyboards/carbo65/keyboard.json index 61a11d3c49..918cbf465e 100644 --- a/keyboards/carbo65/keyboard.json +++ b/keyboards/carbo65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/cest73/tkm/keyboard.json b/keyboards/cest73/tkm/keyboard.json index 05d857c329..5fc85d0e75 100644 --- a/keyboards/cest73/tkm/keyboard.json +++ b/keyboards/cest73/tkm/keyboard.json @@ -12,7 +12,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/chalice/keyboard.json b/keyboards/chalice/keyboard.json index 455ee6ba43..3b9f1fa0b7 100644 --- a/keyboards/chalice/keyboard.json +++ b/keyboards/chalice/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/chaos65/keyboard.json b/keyboards/chaos65/keyboard.json index 5cd34b1bb0..c2a3d4b1a5 100644 --- a/keyboards/chaos65/keyboard.json +++ b/keyboards/chaos65/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/charue/charon/keyboard.json b/keyboards/charue/charon/keyboard.json index 3dede57ba4..206474171b 100644 --- a/keyboards/charue/charon/keyboard.json +++ b/keyboards/charue/charon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/charue/sunsetter_r2/keyboard.json b/keyboards/charue/sunsetter_r2/keyboard.json index 6763a55865..6e2c1a92e1 100644 --- a/keyboards/charue/sunsetter_r2/keyboard.json +++ b/keyboards/charue/sunsetter_r2/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/chavdai40/rev1/keyboard.json b/keyboards/chavdai40/rev1/keyboard.json index 1e4590b648..350aa9de5f 100644 --- a/keyboards/chavdai40/rev1/keyboard.json +++ b/keyboards/chavdai40/rev1/keyboard.json @@ -6,7 +6,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/chavdai40/rev2/keyboard.json b/keyboards/chavdai40/rev2/keyboard.json index 2930c599a2..9cf0e3693c 100644 --- a/keyboards/chavdai40/rev2/keyboard.json +++ b/keyboards/chavdai40/rev2/keyboard.json @@ -6,7 +6,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/checkerboards/axon40/keyboard.json b/keyboards/checkerboards/axon40/keyboard.json index b83093709c..a6647e9f3d 100644 --- a/keyboards/checkerboards/axon40/keyboard.json +++ b/keyboards/checkerboards/axon40/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/checkerboards/g_idb60/keyboard.json b/keyboards/checkerboards/g_idb60/keyboard.json index 8d61bfc691..1273341e19 100644 --- a/keyboards/checkerboards/g_idb60/keyboard.json +++ b/keyboards/checkerboards/g_idb60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/checkerboards/plexus75_he/keyboard.json b/keyboards/checkerboards/plexus75_he/keyboard.json index aa9a62c85b..55a7a49235 100644 --- a/keyboards/checkerboards/plexus75_he/keyboard.json +++ b/keyboards/checkerboards/plexus75_he/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/checkerboards/pursuit40/keyboard.json b/keyboards/checkerboards/pursuit40/keyboard.json index 61fabc55fe..3ef3e2f3ab 100644 --- a/keyboards/checkerboards/pursuit40/keyboard.json +++ b/keyboards/checkerboards/pursuit40/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/checkerboards/quark_lp/keyboard.json b/keyboards/checkerboards/quark_lp/keyboard.json index 8e53b1e846..7634a71d3e 100644 --- a/keyboards/checkerboards/quark_lp/keyboard.json +++ b/keyboards/checkerboards/quark_lp/keyboard.json @@ -40,7 +40,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/checkerboards/quark_plus/keyboard.json b/keyboards/checkerboards/quark_plus/keyboard.json index 12b92e2518..6f38cbb752 100644 --- a/keyboards/checkerboards/quark_plus/keyboard.json +++ b/keyboards/checkerboards/quark_plus/keyboard.json @@ -32,7 +32,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json index acd55fe0f7..7e18bd3708 100644 --- a/keyboards/checkerboards/ud40_ortho_alt/keyboard.json +++ b/keyboards/checkerboards/ud40_ortho_alt/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb1800/keyboard.json b/keyboards/cherrybstudio/cb1800/keyboard.json index e083ebb447..384109b83d 100644 --- a/keyboards/cherrybstudio/cb1800/keyboard.json +++ b/keyboards/cherrybstudio/cb1800/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb65/keyboard.json b/keyboards/cherrybstudio/cb65/keyboard.json index 18d550debf..f9facaa1aa 100644 --- a/keyboards/cherrybstudio/cb65/keyboard.json +++ b/keyboards/cherrybstudio/cb65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87/keyboard.json b/keyboards/cherrybstudio/cb87/keyboard.json index ecac5771c0..2b7fba491e 100644 --- a/keyboards/cherrybstudio/cb87/keyboard.json +++ b/keyboards/cherrybstudio/cb87/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87rgb/keyboard.json b/keyboards/cherrybstudio/cb87rgb/keyboard.json index 9388e8e4da..1ce2fab78f 100644 --- a/keyboards/cherrybstudio/cb87rgb/keyboard.json +++ b/keyboards/cherrybstudio/cb87rgb/keyboard.json @@ -58,7 +58,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cherrybstudio/cb87v2/keyboard.json b/keyboards/cherrybstudio/cb87v2/keyboard.json index 0de77d8f76..7337ed186b 100644 --- a/keyboards/cherrybstudio/cb87v2/keyboard.json +++ b/keyboards/cherrybstudio/cb87v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cheshire/curiosity/keyboard.json b/keyboards/cheshire/curiosity/keyboard.json index 33daaa5781..d630072123 100644 --- a/keyboards/cheshire/curiosity/keyboard.json +++ b/keyboards/cheshire/curiosity/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/chew/keyboard.json b/keyboards/chew/keyboard.json index 767ffb7d84..304f788af3 100644 --- a/keyboards/chew/keyboard.json +++ b/keyboards/chew/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "rp2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chickenman/ciel/keyboard.json b/keyboards/chickenman/ciel/keyboard.json index 239acefe2a..128e0d4b6d 100644 --- a/keyboards/chickenman/ciel/keyboard.json +++ b/keyboards/chickenman/ciel/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/chickenman/ciel65/keyboard.json b/keyboards/chickenman/ciel65/keyboard.json index db147c8e00..fb89fb936e 100644 --- a/keyboards/chickenman/ciel65/keyboard.json +++ b/keyboards/chickenman/ciel65/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true }, diff --git a/keyboards/chill/ghoul/keyboard.json b/keyboards/chill/ghoul/keyboard.json index c32380715f..321b7d19bd 100644 --- a/keyboards/chill/ghoul/keyboard.json +++ b/keyboards/chill/ghoul/keyboard.json @@ -12,7 +12,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/lfn_merro60/keyboard.json b/keyboards/chlx/lfn_merro60/keyboard.json index f4cbc35fb4..6533e3d37f 100644 --- a/keyboards/chlx/lfn_merro60/keyboard.json +++ b/keyboards/chlx/lfn_merro60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/merro60/keyboard.json b/keyboards/chlx/merro60/keyboard.json index 671197041f..1a547a5230 100644 --- a/keyboards/chlx/merro60/keyboard.json +++ b/keyboards/chlx/merro60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/piche60/keyboard.json b/keyboards/chlx/piche60/keyboard.json index 194e8c0353..462338e41c 100644 --- a/keyboards/chlx/piche60/keyboard.json +++ b/keyboards/chlx/piche60/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chlx/ppr_merro60/keyboard.json b/keyboards/chlx/ppr_merro60/keyboard.json index ea819dcc93..6ffd1614b6 100644 --- a/keyboards/chlx/ppr_merro60/keyboard.json +++ b/keyboards/chlx/ppr_merro60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chocofly/v1/keyboard.json b/keyboards/chocofly/v1/keyboard.json index 1670cc1475..ae2a710070 100644 --- a/keyboards/chocofly/v1/keyboard.json +++ b/keyboards/chocofly/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/chocv/keyboard.json b/keyboards/chocv/keyboard.json index fe828da592..596b80973b 100644 --- a/keyboards/chocv/keyboard.json +++ b/keyboards/chocv/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/chord/zero/keyboard.json b/keyboards/chord/zero/keyboard.json index 20db51cf8c..5b957a8e53 100644 --- a/keyboards/chord/zero/keyboard.json +++ b/keyboards/chord/zero/keyboard.json @@ -10,7 +10,6 @@ "maintainer": "sol", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/chosfox/cf81/keyboard.json b/keyboards/chosfox/cf81/keyboard.json index 4776d1f0a4..9ff5e35fbd 100644 --- a/keyboards/chosfox/cf81/keyboard.json +++ b/keyboards/chosfox/cf81/keyboard.json @@ -22,7 +22,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "encoder": true, "rgb_matrix": true diff --git a/keyboards/chouchou/keyboard.json b/keyboards/chouchou/keyboard.json index 3494f2e3b0..1d6236c2ea 100644 --- a/keyboards/chouchou/keyboard.json +++ b/keyboards/chouchou/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "rp2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/cipulot/kallos/keyboard.json b/keyboards/cipulot/kallos/keyboard.json index beb9849f83..ef10f34266 100644 --- a/keyboards/cipulot/kallos/keyboard.json +++ b/keyboards/cipulot/kallos/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/ckeys/handwire_101/keyboard.json b/keyboards/ckeys/handwire_101/keyboard.json index 42391dc48d..781cd25c83 100644 --- a/keyboards/ckeys/handwire_101/keyboard.json +++ b/keyboards/ckeys/handwire_101/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ckeys/obelus/keyboard.json b/keyboards/ckeys/obelus/keyboard.json index da2af2d7f2..d0929647dc 100644 --- a/keyboards/ckeys/obelus/keyboard.json +++ b/keyboards/ckeys/obelus/keyboard.json @@ -10,7 +10,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/ckeys/thedora/keyboard.json b/keyboards/ckeys/thedora/keyboard.json index c3b44a37c3..d1e3ffd4da 100644 --- a/keyboards/ckeys/thedora/keyboard.json +++ b/keyboards/ckeys/thedora/keyboard.json @@ -11,7 +11,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "midi": true, diff --git a/keyboards/ckeys/washington/keyboard.json b/keyboards/ckeys/washington/keyboard.json index e0dda049b8..76e6322ccb 100644 --- a/keyboards/ckeys/washington/keyboard.json +++ b/keyboards/ckeys/washington/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clap_studio/flame60/keyboard.json b/keyboards/clap_studio/flame60/keyboard.json index 0f768d4fae..8ceaa45990 100644 --- a/keyboards/clap_studio/flame60/keyboard.json +++ b/keyboards/clap_studio/flame60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/clawsome/fightpad/keyboard.json b/keyboards/clawsome/fightpad/keyboard.json index fa3ac4a655..ac5f83af23 100644 --- a/keyboards/clawsome/fightpad/keyboard.json +++ b/keyboards/clawsome/fightpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/clueboard/17/keyboard.json b/keyboards/clueboard/17/keyboard.json index 0da234142d..7b900cafd0 100644 --- a/keyboards/clueboard/17/keyboard.json +++ b/keyboards/clueboard/17/keyboard.json @@ -8,7 +8,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/2x1800/2018/keyboard.json b/keyboards/clueboard/2x1800/2018/keyboard.json index e7b4c95ce3..cf827de11e 100644 --- a/keyboards/clueboard/2x1800/2018/keyboard.json +++ b/keyboards/clueboard/2x1800/2018/keyboard.json @@ -8,7 +8,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/60/keyboard.json b/keyboards/clueboard/60/keyboard.json index d0b4d34999..4187f5ede4 100644 --- a/keyboards/clueboard/60/keyboard.json +++ b/keyboards/clueboard/60/keyboard.json @@ -10,7 +10,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/66/rev1/keyboard.json b/keyboards/clueboard/66/rev1/keyboard.json index 4743a125b9..3675f7170f 100644 --- a/keyboards/clueboard/66/rev1/keyboard.json +++ b/keyboards/clueboard/66/rev1/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/66/rev2/keyboard.json b/keyboards/clueboard/66/rev2/keyboard.json index 39ca7c4841..4681056ece 100644 --- a/keyboards/clueboard/66/rev2/keyboard.json +++ b/keyboards/clueboard/66/rev2/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/66/rev3/keyboard.json b/keyboards/clueboard/66/rev3/keyboard.json index dac09573f2..03a7608876 100644 --- a/keyboards/clueboard/66/rev3/keyboard.json +++ b/keyboards/clueboard/66/rev3/keyboard.json @@ -8,7 +8,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/clueboard/66/rev4/keyboard.json b/keyboards/clueboard/66/rev4/keyboard.json index d834b688f9..c854cfff99 100644 --- a/keyboards/clueboard/66/rev4/keyboard.json +++ b/keyboards/clueboard/66/rev4/keyboard.json @@ -9,7 +9,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/clueboard/66_hotswap/prototype/keyboard.json b/keyboards/clueboard/66_hotswap/prototype/keyboard.json index 1325612ed3..17dd296d4f 100644 --- a/keyboards/clueboard/66_hotswap/prototype/keyboard.json +++ b/keyboards/clueboard/66_hotswap/prototype/keyboard.json @@ -9,7 +9,6 @@ "audio": true, "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/clueboard/card/keyboard.json b/keyboards/clueboard/card/keyboard.json index 3929c073d7..b5d5122c3d 100644 --- a/keyboards/clueboard/card/keyboard.json +++ b/keyboards/clueboard/card/keyboard.json @@ -10,7 +10,6 @@ "audio": true, "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cmm_studio/fuji65/keyboard.json b/keyboards/cmm_studio/fuji65/keyboard.json index 84e539a636..55ff233335 100644 --- a/keyboards/cmm_studio/fuji65/keyboard.json +++ b/keyboards/cmm_studio/fuji65/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cmm_studio/saka68/solder/keyboard.json b/keyboards/cmm_studio/saka68/solder/keyboard.json index c5b2e0b677..977162e6a4 100644 --- a/keyboards/cmm_studio/saka68/solder/keyboard.json +++ b/keyboards/cmm_studio/saka68/solder/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/coban/pad3a/keyboard.json b/keyboards/coban/pad3a/keyboard.json index fe8bd12571..b2a9c32b77 100644 --- a/keyboards/coban/pad3a/keyboard.json +++ b/keyboards/coban/pad3a/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/compound/keyboard.json b/keyboards/compound/keyboard.json index cbb5eb711f..d30389da84 100644 --- a/keyboards/compound/keyboard.json +++ b/keyboards/compound/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/concreteflowers/cor/keyboard.json b/keyboards/concreteflowers/cor/keyboard.json index c105338b5e..ff7f9d1777 100644 --- a/keyboards/concreteflowers/cor/keyboard.json +++ b/keyboards/concreteflowers/cor/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/concreteflowers/cor_tkl/keyboard.json b/keyboards/concreteflowers/cor_tkl/keyboard.json index d162bb386c..d5a293eaa3 100644 --- a/keyboards/concreteflowers/cor_tkl/keyboard.json +++ b/keyboards/concreteflowers/cor_tkl/keyboard.json @@ -16,7 +16,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgb_matrix": true }, diff --git a/keyboards/contender/keyboard.json b/keyboards/contender/keyboard.json index cc4139d167..ef0812ae19 100644 --- a/keyboards/contender/keyboard.json +++ b/keyboards/contender/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/controllerworks/city42/keyboard.json b/keyboards/controllerworks/city42/keyboard.json index bb3b060c42..1343229f77 100644 --- a/keyboards/controllerworks/city42/keyboard.json +++ b/keyboards/controllerworks/city42/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/controllerworks/mini36/keyboard.json b/keyboards/controllerworks/mini36/keyboard.json index ad880660c0..64327709a3 100644 --- a/keyboards/controllerworks/mini36/keyboard.json +++ b/keyboards/controllerworks/mini36/keyboard.json @@ -54,7 +54,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/controllerworks/mini42/keyboard.json b/keyboards/controllerworks/mini42/keyboard.json index cbd90c890f..f917cdd990 100644 --- a/keyboards/controllerworks/mini42/keyboard.json +++ b/keyboards/controllerworks/mini42/keyboard.json @@ -54,7 +54,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/converter/a1200/miss1200/keyboard.json b/keyboards/converter/a1200/miss1200/keyboard.json index 1ce08f9b3e..5f090449a9 100644 --- a/keyboards/converter/a1200/miss1200/keyboard.json +++ b/keyboards/converter/a1200/miss1200/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/converter/a1200/mistress1200/keyboard.json b/keyboards/converter/a1200/mistress1200/keyboard.json index 15cc0e24f3..73c0846ea8 100644 --- a/keyboards/converter/a1200/mistress1200/keyboard.json +++ b/keyboards/converter/a1200/mistress1200/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "grave_esc": false, "magic": false, diff --git a/keyboards/converter/a1200/teensy2pp/keyboard.json b/keyboards/converter/a1200/teensy2pp/keyboard.json index 6c04e55d77..f5922cf3e2 100644 --- a/keyboards/converter/a1200/teensy2pp/keyboard.json +++ b/keyboards/converter/a1200/teensy2pp/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/cool836a/keyboard.json b/keyboards/cool836a/keyboard.json index 660ab72612..0095f8c73f 100644 --- a/keyboards/cool836a/keyboard.json +++ b/keyboards/cool836a/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/copenhagen_click/click_pad_v1/keyboard.json b/keyboards/copenhagen_click/click_pad_v1/keyboard.json index 0b133d8963..5897b1e114 100755 --- a/keyboards/copenhagen_click/click_pad_v1/keyboard.json +++ b/keyboards/copenhagen_click/click_pad_v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/coseyfannitutti/discipad/keyboard.json b/keyboards/coseyfannitutti/discipad/keyboard.json index 177129b6f9..0c9cf4498f 100644 --- a/keyboards/coseyfannitutti/discipad/keyboard.json +++ b/keyboards/coseyfannitutti/discipad/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/coseyfannitutti/romeo/keyboard.json b/keyboards/coseyfannitutti/romeo/keyboard.json index d4edb56150..97a3610a48 100644 --- a/keyboards/coseyfannitutti/romeo/keyboard.json +++ b/keyboards/coseyfannitutti/romeo/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cozykeys/bloomer/v2/keyboard.json b/keyboards/cozykeys/bloomer/v2/keyboard.json index e6611921e7..d1714b7ef1 100644 --- a/keyboards/cozykeys/bloomer/v2/keyboard.json +++ b/keyboards/cozykeys/bloomer/v2/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/cozykeys/bloomer/v3/keyboard.json b/keyboards/cozykeys/bloomer/v3/keyboard.json index 1b58004d2e..d598b84f0d 100644 --- a/keyboards/cozykeys/bloomer/v3/keyboard.json +++ b/keyboards/cozykeys/bloomer/v3/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/cozykeys/speedo/v2/keyboard.json b/keyboards/cozykeys/speedo/v2/keyboard.json index de5215bcce..b361006005 100644 --- a/keyboards/cozykeys/speedo/v2/keyboard.json +++ b/keyboards/cozykeys/speedo/v2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cradio/keyboard.json b/keyboards/cradio/keyboard.json index 1600a1fd24..2074295b36 100644 --- a/keyboards/cradio/keyboard.json +++ b/keyboards/cradio/keyboard.json @@ -13,7 +13,6 @@ "pin_compatible": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/crawlpad/keyboard.json b/keyboards/crawlpad/keyboard.json index 0fbda2e6e7..02791ab583 100644 --- a/keyboards/crawlpad/keyboard.json +++ b/keyboards/crawlpad/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/crazy_keyboard_68/keyboard.json b/keyboards/crazy_keyboard_68/keyboard.json index 62d08a4849..b58d7eb342 100644 --- a/keyboards/crazy_keyboard_68/keyboard.json +++ b/keyboards/crazy_keyboard_68/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/crbn/keyboard.json b/keyboards/crbn/keyboard.json index 8ea9c9de2f..a2666c6c52 100644 --- a/keyboards/crbn/keyboard.json +++ b/keyboards/crbn/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/creatkeebs/thera/keyboard.json b/keyboards/creatkeebs/thera/keyboard.json index 956987da87..f9d40e5f1f 100644 --- a/keyboards/creatkeebs/thera/keyboard.json +++ b/keyboards/creatkeebs/thera/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/custommk/ergostrafer/keyboard.json b/keyboards/custommk/ergostrafer/keyboard.json index 7c4f90d00a..926190d952 100644 --- a/keyboards/custommk/ergostrafer/keyboard.json +++ b/keyboards/custommk/ergostrafer/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/custommk/evo70/keyboard.json b/keyboards/custommk/evo70/keyboard.json index 4dd8f8c01b..14a328e442 100644 --- a/keyboards/custommk/evo70/keyboard.json +++ b/keyboards/custommk/evo70/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "backlight": true, "rgblight": true, diff --git a/keyboards/custommk/evo70_r2/keyboard.json b/keyboards/custommk/evo70_r2/keyboard.json index 6cd1fc12d9..8f986c92ac 100644 --- a/keyboards/custommk/evo70_r2/keyboard.json +++ b/keyboards/custommk/evo70_r2/keyboard.json @@ -6,7 +6,6 @@ "tags": ["70%", "encoder", "underglow", "backlight"], "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cutie_club/borsdorf/keyboard.json b/keyboards/cutie_club/borsdorf/keyboard.json index b428915801..02c3c12dff 100644 --- a/keyboards/cutie_club/borsdorf/keyboard.json +++ b/keyboards/cutie_club/borsdorf/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/fidelity/keyboard.json b/keyboards/cutie_club/fidelity/keyboard.json index 565cf90729..142f303f46 100644 --- a/keyboards/cutie_club/fidelity/keyboard.json +++ b/keyboards/cutie_club/fidelity/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true }, diff --git a/keyboards/cutie_club/giant_macro_pad/keyboard.json b/keyboards/cutie_club/giant_macro_pad/keyboard.json index ab447987ec..ee9a42bf7c 100644 --- a/keyboards/cutie_club/giant_macro_pad/keyboard.json +++ b/keyboards/cutie_club/giant_macro_pad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/keebcats/denis/keyboard.json b/keyboards/cutie_club/keebcats/denis/keyboard.json index 9744aefb3e..e5ec7faa7f 100644 --- a/keyboards/cutie_club/keebcats/denis/keyboard.json +++ b/keyboards/cutie_club/keebcats/denis/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/keebcats/dougal/keyboard.json b/keyboards/cutie_club/keebcats/dougal/keyboard.json index a357f4a8ac..6d96936d4a 100644 --- a/keyboards/cutie_club/keebcats/dougal/keyboard.json +++ b/keyboards/cutie_club/keebcats/dougal/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cutie_club/novus/keyboard.json b/keyboards/cutie_club/novus/keyboard.json index b1de3503a6..73ecac31f0 100644 --- a/keyboards/cutie_club/novus/keyboard.json +++ b/keyboards/cutie_club/novus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/cx60/keyboard.json b/keyboards/cx60/keyboard.json index c988151e04..846b870d95 100644 --- a/keyboards/cx60/keyboard.json +++ b/keyboards/cx60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/cxt_studio/12e4/keyboard.json b/keyboards/cxt_studio/12e4/keyboard.json index 45d2835af4..9b54d6fd26 100644 --- a/keyboards/cxt_studio/12e4/keyboard.json +++ b/keyboards/cxt_studio/12e4/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/cybergear/macro25/keyboard.json b/keyboards/cybergear/macro25/keyboard.json index 0f5971fc08..14ea5cc77d 100644 --- a/keyboards/cybergear/macro25/keyboard.json +++ b/keyboards/cybergear/macro25/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dailycraft/bat43/info.json b/keyboards/dailycraft/bat43/info.json index a84438d6f2..90e14e3434 100644 --- a/keyboards/dailycraft/bat43/info.json +++ b/keyboards/dailycraft/bat43/info.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": true, "nkro": false diff --git a/keyboards/dailycraft/owl8/keyboard.json b/keyboards/dailycraft/owl8/keyboard.json index bc4e19edf5..fb3f2042f4 100644 --- a/keyboards/dailycraft/owl8/keyboard.json +++ b/keyboards/dailycraft/owl8/keyboard.json @@ -17,7 +17,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/dailycraft/stickey4/keyboard.json b/keyboards/dailycraft/stickey4/keyboard.json index 0075f53aa6..d4cf997877 100644 --- a/keyboards/dailycraft/stickey4/keyboard.json +++ b/keyboards/dailycraft/stickey4/keyboard.json @@ -17,7 +17,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/daji/seis_cinco/keyboard.json b/keyboards/daji/seis_cinco/keyboard.json index fd95b96224..837f01380d 100644 --- a/keyboards/daji/seis_cinco/keyboard.json +++ b/keyboards/daji/seis_cinco/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dark/magnum_ergo_1/keyboard.json b/keyboards/dark/magnum_ergo_1/keyboard.json index 4e0548f061..d4a74d592b 100644 --- a/keyboards/dark/magnum_ergo_1/keyboard.json +++ b/keyboards/dark/magnum_ergo_1/keyboard.json @@ -18,7 +18,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json index 270a5c57e5..f8964bf461 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/keyboard.json +++ b/keyboards/darkproject/kd83a_bfg_edition/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/darmoshark/k3/keyboard.json b/keyboards/darmoshark/k3/keyboard.json index b645a18dc6..c58b295404 100644 --- a/keyboards/darmoshark/k3/keyboard.json +++ b/keyboards/darmoshark/k3/keyboard.json @@ -13,7 +13,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/decent/tkl/keyboard.json b/keyboards/decent/tkl/keyboard.json index ff51650197..d5b0c972c6 100644 --- a/keyboards/decent/tkl/keyboard.json +++ b/keyboards/decent/tkl/keyboard.json @@ -11,7 +11,6 @@ "bootmagic": true, "rgb_matrix": true, "oled": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/delikeeb/flatbread60/keyboard.json b/keyboards/delikeeb/flatbread60/keyboard.json index 2e55e673a4..eabb301dc0 100644 --- a/keyboards/delikeeb/flatbread60/keyboard.json +++ b/keyboards/delikeeb/flatbread60/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/delikeeb/vaguettelite/keyboard.json b/keyboards/delikeeb/vaguettelite/keyboard.json index e78cc9592f..61e65105fb 100644 --- a/keyboards/delikeeb/vaguettelite/keyboard.json +++ b/keyboards/delikeeb/vaguettelite/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vanana/rev1/keyboard.json b/keyboards/delikeeb/vanana/rev1/keyboard.json index d2e2573193..66aeeaa877 100644 --- a/keyboards/delikeeb/vanana/rev1/keyboard.json +++ b/keyboards/delikeeb/vanana/rev1/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vanana/rev2/keyboard.json b/keyboards/delikeeb/vanana/rev2/keyboard.json index bffa44ab8e..9a7052f65f 100644 --- a/keyboards/delikeeb/vanana/rev2/keyboard.json +++ b/keyboards/delikeeb/vanana/rev2/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/delikeeb/vaneela/keyboard.json b/keyboards/delikeeb/vaneela/keyboard.json index be59169e3c..8e30581e70 100644 --- a/keyboards/delikeeb/vaneela/keyboard.json +++ b/keyboards/delikeeb/vaneela/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/delikeeb/vaneelaex/keyboard.json b/keyboards/delikeeb/vaneelaex/keyboard.json index 716ec96b73..1890c860e6 100644 --- a/keyboards/delikeeb/vaneelaex/keyboard.json +++ b/keyboards/delikeeb/vaneelaex/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json b/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json index fc723363e8..86c1572713 100644 --- a/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json +++ b/keyboards/delikeeb/waaffle/rev3/elite_c/keyboard.json @@ -3,7 +3,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json b/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json index d92c0fd0ec..b1d721e038 100644 --- a/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json +++ b/keyboards/delikeeb/waaffle/rev3/pro_micro/keyboard.json @@ -3,7 +3,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/deltapad/keyboard.json b/keyboards/deltapad/keyboard.json index 64c17bf562..5fc2edff63 100644 --- a/keyboards/deltapad/keyboard.json +++ b/keyboards/deltapad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/demiurge/keyboard.json b/keyboards/demiurge/keyboard.json index bf42c58cb6..56ac687cd5 100644 --- a/keyboards/demiurge/keyboard.json +++ b/keyboards/demiurge/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/deng/djam/keyboard.json b/keyboards/deng/djam/keyboard.json index 6e40eef155..a39c234bfa 100644 --- a/keyboards/deng/djam/keyboard.json +++ b/keyboards/deng/djam/keyboard.json @@ -20,7 +20,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dinofizz/fnrow/v1/keyboard.json b/keyboards/dinofizz/fnrow/v1/keyboard.json index be4284e4b5..befcc05c0a 100644 --- a/keyboards/dinofizz/fnrow/v1/keyboard.json +++ b/keyboards/dinofizz/fnrow/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/dk60/keyboard.json b/keyboards/dk60/keyboard.json index 63b81384f7..1eb1dbe90a 100644 --- a/keyboards/dk60/keyboard.json +++ b/keyboards/dk60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dm9records/lain/keyboard.json b/keyboards/dm9records/lain/keyboard.json index 79a4bbfb4b..1f02a98fc4 100644 --- a/keyboards/dm9records/lain/keyboard.json +++ b/keyboards/dm9records/lain/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dmqdesign/spin/keyboard.json b/keyboards/dmqdesign/spin/keyboard.json index 1e3c51f395..dd3cbaa838 100644 --- a/keyboards/dmqdesign/spin/keyboard.json +++ b/keyboards/dmqdesign/spin/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "midi": true, diff --git a/keyboards/dnworks/frltkl/keyboard.json b/keyboards/dnworks/frltkl/keyboard.json index d30a0134eb..1561a648a0 100644 --- a/keyboards/dnworks/frltkl/keyboard.json +++ b/keyboards/dnworks/frltkl/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "indicators": { diff --git a/keyboards/dnworks/sbl/keyboard.json b/keyboards/dnworks/sbl/keyboard.json index 8ded6856a8..d9c6fa1bb3 100644 --- a/keyboards/dnworks/sbl/keyboard.json +++ b/keyboards/dnworks/sbl/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "indicators": { diff --git a/keyboards/do60/keyboard.json b/keyboards/do60/keyboard.json index 2a16cf0adf..0c6cd8db83 100644 --- a/keyboards/do60/keyboard.json +++ b/keyboards/do60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/doio/kb04/keyboard.json b/keyboards/doio/kb04/keyboard.json index 8936c7ff36..ea5c58c71c 100644 --- a/keyboards/doio/kb04/keyboard.json +++ b/keyboards/doio/kb04/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb09/keyboard.json b/keyboards/doio/kb09/keyboard.json index 9cf880f39d..a9c0e2a579 100644 --- a/keyboards/doio/kb09/keyboard.json +++ b/keyboards/doio/kb09/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb12/keyboard.json b/keyboards/doio/kb12/keyboard.json index 708e4a97d7..134c4aff76 100644 --- a/keyboards/doio/kb12/keyboard.json +++ b/keyboards/doio/kb12/keyboard.json @@ -93,7 +93,6 @@ "bootloader": "stm32duino", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/doio/kb19/keyboard.json b/keyboards/doio/kb19/keyboard.json index 4fe6758a62..170794cef7 100644 --- a/keyboards/doio/kb19/keyboard.json +++ b/keyboards/doio/kb19/keyboard.json @@ -12,7 +12,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "encoder": true, "nkro": false, "rgblight": true diff --git a/keyboards/doio/kb30/keyboard.json b/keyboards/doio/kb30/keyboard.json index 6b815eb929..86c1535a5d 100644 --- a/keyboards/doio/kb30/keyboard.json +++ b/keyboards/doio/kb30/keyboard.json @@ -92,7 +92,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/doio/kb38/keyboard.json b/keyboards/doio/kb38/keyboard.json index 55c5b7df89..5214c60d08 100644 --- a/keyboards/doio/kb38/keyboard.json +++ b/keyboards/doio/kb38/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/donutcables/scrabblepad/keyboard.json b/keyboards/donutcables/scrabblepad/keyboard.json index a6d668c2ad..f614dffa4f 100644 --- a/keyboards/donutcables/scrabblepad/keyboard.json +++ b/keyboards/donutcables/scrabblepad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/doodboard/duckboard/keyboard.json b/keyboards/doodboard/duckboard/keyboard.json index bb0b5c0f00..7e88a22e10 100644 --- a/keyboards/doodboard/duckboard/keyboard.json +++ b/keyboards/doodboard/duckboard/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/doodboard/duckboard_r2/keyboard.json b/keyboards/doodboard/duckboard_r2/keyboard.json index 94c79d382c..6cbf51bcb4 100644 --- a/keyboards/doodboard/duckboard_r2/keyboard.json +++ b/keyboards/doodboard/duckboard_r2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/doro67/rgb/keyboard.json b/keyboards/doro67/rgb/keyboard.json index d0fb842bf5..de95db63d6 100644 --- a/keyboards/doro67/rgb/keyboard.json +++ b/keyboards/doro67/rgb/keyboard.json @@ -55,7 +55,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/dotmod/dymium65/keyboard.json b/keyboards/dotmod/dymium65/keyboard.json index d4406f979a..301b69edc5 100644 --- a/keyboards/dotmod/dymium65/keyboard.json +++ b/keyboards/dotmod/dymium65/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, "extrakey": true, - "command": false, "nkro": true, "mousekey": true, "rgb_matrix": true diff --git a/keyboards/dp3000/rev1/keyboard.json b/keyboards/dp3000/rev1/keyboard.json index 2723edb778..00ee2bb59e 100644 --- a/keyboards/dp3000/rev1/keyboard.json +++ b/keyboards/dp3000/rev1/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "dp3000", "features": { "bootmagic": true, - "command": false, "extrakey": true, "encoder": true, "oled": true, diff --git a/keyboards/dp3000/rev2/keyboard.json b/keyboards/dp3000/rev2/keyboard.json index 241915a66f..202d3b7bf6 100644 --- a/keyboards/dp3000/rev2/keyboard.json +++ b/keyboards/dp3000/rev2/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "dp3000 rev2", "features": { "bootmagic": true, - "command": false, "extrakey": true, "encoder": true, "oled": true, diff --git a/keyboards/draytronics/daisy/keyboard.json b/keyboards/draytronics/daisy/keyboard.json index 069570c930..30a32fd457 100644 --- a/keyboards/draytronics/daisy/keyboard.json +++ b/keyboards/draytronics/daisy/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/drewkeys/iskar/keyboard.json b/keyboards/drewkeys/iskar/keyboard.json index 8a3b081b6a..ccbbbc16f4 100644 --- a/keyboards/drewkeys/iskar/keyboard.json +++ b/keyboards/drewkeys/iskar/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drhigsby/bkf/keyboard.json b/keyboards/drhigsby/bkf/keyboard.json index c087c29389..76808f93de 100644 --- a/keyboards/drhigsby/bkf/keyboard.json +++ b/keyboards/drhigsby/bkf/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/drhigsby/dubba175/keyboard.json b/keyboards/drhigsby/dubba175/keyboard.json index 3d11c2772c..0f395d10ff 100644 --- a/keyboards/drhigsby/dubba175/keyboard.json +++ b/keyboards/drhigsby/dubba175/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drhigsby/ogurec/info.json b/keyboards/drhigsby/ogurec/info.json index 08158faeb3..7e65e924e2 100644 --- a/keyboards/drhigsby/ogurec/info.json +++ b/keyboards/drhigsby/ogurec/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/drhigsby/packrat/keyboard.json b/keyboards/drhigsby/packrat/keyboard.json index feda74b7a9..b41b383aee 100644 --- a/keyboards/drhigsby/packrat/keyboard.json +++ b/keyboards/drhigsby/packrat/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/drop/alt/v2/keyboard.json b/keyboards/drop/alt/v2/keyboard.json index 9ef109bb8a..18bbe5f76d 100644 --- a/keyboards/drop/alt/v2/keyboard.json +++ b/keyboards/drop/alt/v2/keyboard.json @@ -20,7 +20,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/cstm65/keyboard.json b/keyboards/drop/cstm65/keyboard.json index 736f57399e..4ee594f127 100644 --- a/keyboards/drop/cstm65/keyboard.json +++ b/keyboards/drop/cstm65/keyboard.json @@ -20,7 +20,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/cstm80/keyboard.json b/keyboards/drop/cstm80/keyboard.json index c599815bc0..4489eebd4a 100644 --- a/keyboards/drop/cstm80/keyboard.json +++ b/keyboards/drop/cstm80/keyboard.json @@ -20,7 +20,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/ctrl/v2/keyboard.json b/keyboards/drop/ctrl/v2/keyboard.json index 917ed3556f..402327ed31 100644 --- a/keyboards/drop/ctrl/v2/keyboard.json +++ b/keyboards/drop/ctrl/v2/keyboard.json @@ -20,7 +20,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/sense75/keyboard.json b/keyboards/drop/sense75/keyboard.json index 4e28b647ab..eb9cb121c2 100644 --- a/keyboards/drop/sense75/keyboard.json +++ b/keyboards/drop/sense75/keyboard.json @@ -21,7 +21,6 @@ "rgb_matrix": true, "encoder": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/shift/v2/keyboard.json b/keyboards/drop/shift/v2/keyboard.json index 8c3f97970f..85556998f2 100644 --- a/keyboards/drop/shift/v2/keyboard.json +++ b/keyboards/drop/shift/v2/keyboard.json @@ -20,7 +20,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/drop/thekey/v1/keyboard.json b/keyboards/drop/thekey/v1/keyboard.json index b975610372..3038171fb3 100644 --- a/keyboards/drop/thekey/v1/keyboard.json +++ b/keyboards/drop/thekey/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "backlight": true, diff --git a/keyboards/drop/thekey/v2/keyboard.json b/keyboards/drop/thekey/v2/keyboard.json index 8a29df34bb..7497907187 100644 --- a/keyboards/drop/thekey/v2/keyboard.json +++ b/keyboards/drop/thekey/v2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "rgblight": true diff --git a/keyboards/druah/dk_saver_redux/keyboard.json b/keyboards/druah/dk_saver_redux/keyboard.json index 8f2b8023e2..76f6131358 100644 --- a/keyboards/druah/dk_saver_redux/keyboard.json +++ b/keyboards/druah/dk_saver_redux/keyboard.json @@ -15,7 +15,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dtisaac/cg108/keyboard.json b/keyboards/dtisaac/cg108/keyboard.json index 9d8df8dad2..3328fcd96a 100644 --- a/keyboards/dtisaac/cg108/keyboard.json +++ b/keyboards/dtisaac/cg108/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/dtisaac/dosa40rgb/keyboard.json b/keyboards/dtisaac/dosa40rgb/keyboard.json index 09db50aee1..4f5522947a 100644 --- a/keyboards/dtisaac/dosa40rgb/keyboard.json +++ b/keyboards/dtisaac/dosa40rgb/keyboard.json @@ -71,7 +71,6 @@ "features": { "bluetooth": true, "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/dtisaac/dtisaac01/keyboard.json b/keyboards/dtisaac/dtisaac01/keyboard.json index 0d72c3f9e1..33885b73f7 100644 --- a/keyboards/dtisaac/dtisaac01/keyboard.json +++ b/keyboards/dtisaac/dtisaac01/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/durgod/k320/base/keyboard.json b/keyboards/durgod/k320/base/keyboard.json index 7c794cf8ec..243f00e834 100644 --- a/keyboards/durgod/k320/base/keyboard.json +++ b/keyboards/durgod/k320/base/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/dyz/dyz40/keyboard.json b/keyboards/dyz/dyz40/keyboard.json index e5618468a0..ec8e4e8111 100644 --- a/keyboards/dyz/dyz40/keyboard.json +++ b/keyboards/dyz/dyz40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/dyz60/keyboard.json b/keyboards/dyz/dyz60/keyboard.json index af5c50184e..6caeecd28c 100644 --- a/keyboards/dyz/dyz60/keyboard.json +++ b/keyboards/dyz/dyz60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/dyz60_hs/keyboard.json b/keyboards/dyz/dyz60_hs/keyboard.json index 94d60f3b6c..3afa3fea23 100644 --- a/keyboards/dyz/dyz60_hs/keyboard.json +++ b/keyboards/dyz/dyz60_hs/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dyz/dyz_tkl/keyboard.json b/keyboards/dyz/dyz_tkl/keyboard.json index 62e0073bd4..584e22fdd4 100644 --- a/keyboards/dyz/dyz_tkl/keyboard.json +++ b/keyboards/dyz/dyz_tkl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dyz/selka40/keyboard.json b/keyboards/dyz/selka40/keyboard.json index abf627584a..dc117b3b72 100644 --- a/keyboards/dyz/selka40/keyboard.json +++ b/keyboards/dyz/selka40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/dyz/synthesis60/keyboard.json b/keyboards/dyz/synthesis60/keyboard.json index 1ec2c9d1cd..704b87f007 100644 --- a/keyboards/dyz/synthesis60/keyboard.json +++ b/keyboards/dyz/synthesis60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/dz60/keyboard.json b/keyboards/dz60/keyboard.json index c28508105f..52ad5484ae 100644 --- a/keyboards/dz60/keyboard.json +++ b/keyboards/dz60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/bocc/keyboard.json b/keyboards/dztech/bocc/keyboard.json index 2f133433b8..7c2be5645f 100644 --- a/keyboards/dztech/bocc/keyboard.json +++ b/keyboards/dztech/bocc/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/duo_s/keyboard.json b/keyboards/dztech/duo_s/keyboard.json index f05f4d41c5..512d4c3256 100644 --- a/keyboards/dztech/duo_s/keyboard.json +++ b/keyboards/dztech/duo_s/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz60v2/keyboard.json b/keyboards/dztech/dz60v2/keyboard.json index 292bbcfcea..4e0de8ae5c 100644 --- a/keyboards/dztech/dz60v2/keyboard.json +++ b/keyboards/dztech/dz60v2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz65rgb/v1/keyboard.json b/keyboards/dztech/dz65rgb/v1/keyboard.json index 3066105727..32b830052d 100644 --- a/keyboards/dztech/dz65rgb/v1/keyboard.json +++ b/keyboards/dztech/dz65rgb/v1/keyboard.json @@ -46,7 +46,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz65rgb/v2/keyboard.json b/keyboards/dztech/dz65rgb/v2/keyboard.json index 523fdfb23e..bf7331e101 100644 --- a/keyboards/dztech/dz65rgb/v2/keyboard.json +++ b/keyboards/dztech/dz65rgb/v2/keyboard.json @@ -46,7 +46,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/dz96/keyboard.json b/keyboards/dztech/dz96/keyboard.json index 95c78b80f5..0d37f09ff0 100644 --- a/keyboards/dztech/dz96/keyboard.json +++ b/keyboards/dztech/dz96/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/dztech/endless80/keyboard.json b/keyboards/dztech/endless80/keyboard.json index cf12595046..54ca7c12a7 100644 --- a/keyboards/dztech/endless80/keyboard.json +++ b/keyboards/dztech/endless80/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/mellow/keyboard.json b/keyboards/dztech/mellow/keyboard.json index cb08e086d5..565c2b0995 100644 --- a/keyboards/dztech/mellow/keyboard.json +++ b/keyboards/dztech/mellow/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dztech/pluto/keyboard.json b/keyboards/dztech/pluto/keyboard.json index 790282d254..1e1b577293 100644 --- a/keyboards/dztech/pluto/keyboard.json +++ b/keyboards/dztech/pluto/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/dztech/tofu/ii/v1/keyboard.json b/keyboards/dztech/tofu/ii/v1/keyboard.json index 8cab6f2f1b..ca1d5608c1 100644 --- a/keyboards/dztech/tofu/ii/v1/keyboard.json +++ b/keyboards/dztech/tofu/ii/v1/keyboard.json @@ -3,7 +3,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu/jr/v1/keyboard.json b/keyboards/dztech/tofu/jr/v1/keyboard.json index ede74c7368..5eb20be00d 100644 --- a/keyboards/dztech/tofu/jr/v1/keyboard.json +++ b/keyboards/dztech/tofu/jr/v1/keyboard.json @@ -4,7 +4,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu/jr/v2/keyboard.json b/keyboards/dztech/tofu/jr/v2/keyboard.json index 9a027e6ca8..d8de9b956f 100644 --- a/keyboards/dztech/tofu/jr/v2/keyboard.json +++ b/keyboards/dztech/tofu/jr/v2/keyboard.json @@ -4,7 +4,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/dztech/tofu60/keyboard.json b/keyboards/dztech/tofu60/keyboard.json index bc9f0f9bba..6e6a047733 100644 --- a/keyboards/dztech/tofu60/keyboard.json +++ b/keyboards/dztech/tofu60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ealdin/quadrant/keyboard.json b/keyboards/ealdin/quadrant/keyboard.json index 7a8bcf0db2..eafd9c57fe 100644 --- a/keyboards/ealdin/quadrant/keyboard.json +++ b/keyboards/ealdin/quadrant/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/earth_rover/keyboard.json b/keyboards/earth_rover/keyboard.json index e236043b84..516585ca24 100644 --- a/keyboards/earth_rover/keyboard.json +++ b/keyboards/earth_rover/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eason/aeroboard/keyboard.json b/keyboards/eason/aeroboard/keyboard.json index 918f447dff..1c15e600c4 100644 --- a/keyboards/eason/aeroboard/keyboard.json +++ b/keyboards/eason/aeroboard/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/eason/capsule65/keyboard.json b/keyboards/eason/capsule65/keyboard.json index 4e04e45831..cc33904c55 100644 --- a/keyboards/eason/capsule65/keyboard.json +++ b/keyboards/eason/capsule65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/eason/greatsword80/keyboard.json b/keyboards/eason/greatsword80/keyboard.json index 88102d569b..5f0daebd45 100644 --- a/keyboards/eason/greatsword80/keyboard.json +++ b/keyboards/eason/greatsword80/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/eason/meow65/keyboard.json b/keyboards/eason/meow65/keyboard.json index c001dde318..013e7daf4b 100644 --- a/keyboards/eason/meow65/keyboard.json +++ b/keyboards/eason/meow65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/eason/void65h/keyboard.json b/keyboards/eason/void65h/keyboard.json index 8387993a75..006cdb28b8 100644 --- a/keyboards/eason/void65h/keyboard.json +++ b/keyboards/eason/void65h/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ebastler/e80_1800/keyboard.json b/keyboards/ebastler/e80_1800/keyboard.json index 2ae3493488..5b409c7074 100644 --- a/keyboards/ebastler/e80_1800/keyboard.json +++ b/keyboards/ebastler/e80_1800/keyboard.json @@ -16,7 +16,6 @@ "extrakey": true, "backlight": true, "nkro": true, - "command": false, "mousekey": false }, "matrix_pins": { diff --git a/keyboards/ebastler/isometria_75/rev1/keyboard.json b/keyboards/ebastler/isometria_75/rev1/keyboard.json index 148f8b6b3f..e7a6e01f3d 100644 --- a/keyboards/ebastler/isometria_75/rev1/keyboard.json +++ b/keyboards/ebastler/isometria_75/rev1/keyboard.json @@ -24,7 +24,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/edda/keyboard.json b/keyboards/edda/keyboard.json index 4482b6f70d..a0f91429af 100644 --- a/keyboards/edda/keyboard.json +++ b/keyboards/edda/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/emajesty/eiri/keyboard.json b/keyboards/emajesty/eiri/keyboard.json index 94bcb60f6c..2ad711bf9e 100644 --- a/keyboards/emajesty/eiri/keyboard.json +++ b/keyboards/emajesty/eiri/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/emi20/keyboard.json b/keyboards/emi20/keyboard.json index ce623505b3..7a2b820549 100644 --- a/keyboards/emi20/keyboard.json +++ b/keyboards/emi20/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/emptystring/nqg/keyboard.json b/keyboards/emptystring/nqg/keyboard.json index a425812c4f..17116704c7 100644 --- a/keyboards/emptystring/nqg/keyboard.json +++ b/keyboards/emptystring/nqg/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/eniigmakeyboards/ek60/keyboard.json b/keyboards/eniigmakeyboards/ek60/keyboard.json index 203a1f11b0..97f3469cd8 100644 --- a/keyboards/eniigmakeyboards/ek60/keyboard.json +++ b/keyboards/eniigmakeyboards/ek60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eniigmakeyboards/ek65/keyboard.json b/keyboards/eniigmakeyboards/ek65/keyboard.json index ad64fcca0e..60fdc4db81 100644 --- a/keyboards/eniigmakeyboards/ek65/keyboard.json +++ b/keyboards/eniigmakeyboards/ek65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/eniigmakeyboards/ek87/keyboard.json b/keyboards/eniigmakeyboards/ek87/keyboard.json index 27bcc9a844..c1ac8623b1 100644 --- a/keyboards/eniigmakeyboards/ek87/keyboard.json +++ b/keyboards/eniigmakeyboards/ek87/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/enviousdesign/60f/keyboard.json b/keyboards/enviousdesign/60f/keyboard.json index 84047b8d41..738211674e 100644 --- a/keyboards/enviousdesign/60f/keyboard.json +++ b/keyboards/enviousdesign/60f/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/65m/keyboard.json b/keyboards/enviousdesign/65m/keyboard.json index d5196872f5..e0661dc9fa 100644 --- a/keyboards/enviousdesign/65m/keyboard.json +++ b/keyboards/enviousdesign/65m/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/commissions/mini1800/keyboard.json b/keyboards/enviousdesign/commissions/mini1800/keyboard.json index 5f3b1ee8f5..5eb78225a0 100644 --- a/keyboards/enviousdesign/commissions/mini1800/keyboard.json +++ b/keyboards/enviousdesign/commissions/mini1800/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rev0/keyboard.json b/keyboards/enviousdesign/delirium/rev0/keyboard.json index 2895a0f2c8..75ff24a9ef 100644 --- a/keyboards/enviousdesign/delirium/rev0/keyboard.json +++ b/keyboards/enviousdesign/delirium/rev0/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rev1/keyboard.json b/keyboards/enviousdesign/delirium/rev1/keyboard.json index bb4cb70ba5..83001140bb 100644 --- a/keyboards/enviousdesign/delirium/rev1/keyboard.json +++ b/keyboards/enviousdesign/delirium/rev1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/enviousdesign/delirium/rgb/keyboard.json b/keyboards/enviousdesign/delirium/rgb/keyboard.json index 7e77be2a35..4ef1251e11 100644 --- a/keyboards/enviousdesign/delirium/rgb/keyboard.json +++ b/keyboards/enviousdesign/delirium/rgb/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/enviousdesign/mcro/rev1/keyboard.json b/keyboards/enviousdesign/mcro/rev1/keyboard.json index 1428c87abe..6e846f9621 100644 --- a/keyboards/enviousdesign/mcro/rev1/keyboard.json +++ b/keyboards/enviousdesign/mcro/rev1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/era/divine/keyboard.json b/keyboards/era/divine/keyboard.json index cc8670de12..83da9f0854 100644 --- a/keyboards/era/divine/keyboard.json +++ b/keyboards/era/divine/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/era/era65/keyboard.json b/keyboards/era/era65/keyboard.json index 47f0046fe8..2939418d72 100644 --- a/keyboards/era/era65/keyboard.json +++ b/keyboards/era/era65/keyboard.json @@ -18,7 +18,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/esca/getawayvan/keyboard.json b/keyboards/esca/getawayvan/keyboard.json index 8f9bc53776..404ccd19d2 100644 --- a/keyboards/esca/getawayvan/keyboard.json +++ b/keyboards/esca/getawayvan/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/esca/getawayvan_f042/keyboard.json b/keyboards/esca/getawayvan_f042/keyboard.json index c3bce35121..97fe0022dc 100644 --- a/keyboards/esca/getawayvan_f042/keyboard.json +++ b/keyboards/esca/getawayvan_f042/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/eternal_keypad/keyboard.json b/keyboards/eternal_keypad/keyboard.json index 607c738cb1..1951c7fa09 100644 --- a/keyboards/eternal_keypad/keyboard.json +++ b/keyboards/eternal_keypad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/etiennecollin/wave/keyboard.json b/keyboards/etiennecollin/wave/keyboard.json index 70c9cb8519..0174312280 100644 --- a/keyboards/etiennecollin/wave/keyboard.json +++ b/keyboards/etiennecollin/wave/keyboard.json @@ -19,7 +19,6 @@ "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/evil80/keyboard.json b/keyboards/evil80/keyboard.json index 629065db23..1c64076611 100644 --- a/keyboards/evil80/keyboard.json +++ b/keyboards/evil80/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/evolv/keyboard.json b/keyboards/evolv/keyboard.json index 2f27fe2c10..8a3b581ead 100644 --- a/keyboards/evolv/keyboard.json +++ b/keyboards/evolv/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/evyd13/eon87/keyboard.json b/keyboards/evyd13/eon87/keyboard.json index a53c2c130e..1e5bbbda88 100644 --- a/keyboards/evyd13/eon87/keyboard.json +++ b/keyboards/evyd13/eon87/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/evyd13/fin_pad/keyboard.json b/keyboards/evyd13/fin_pad/keyboard.json index 32afce7fb1..1720eed7db 100644 --- a/keyboards/evyd13/fin_pad/keyboard.json +++ b/keyboards/evyd13/fin_pad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/evyd13/gh80_1800/keyboard.json b/keyboards/evyd13/gh80_1800/keyboard.json index 4fb513cc3c..ed214fbb24 100644 --- a/keyboards/evyd13/gh80_1800/keyboard.json +++ b/keyboards/evyd13/gh80_1800/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/evyd13/gh80_3700/keyboard.json b/keyboards/evyd13/gh80_3700/keyboard.json index 8bc1a40222..7b5ce62909 100644 --- a/keyboards/evyd13/gh80_3700/keyboard.json +++ b/keyboards/evyd13/gh80_3700/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/evyd13/gud70/keyboard.json b/keyboards/evyd13/gud70/keyboard.json index df0b1c4e5d..6f2a787e69 100644 --- a/keyboards/evyd13/gud70/keyboard.json +++ b/keyboards/evyd13/gud70/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/mx5160/keyboard.json b/keyboards/evyd13/mx5160/keyboard.json index 3d077ef4ba..452d3427d1 100644 --- a/keyboards/evyd13/mx5160/keyboard.json +++ b/keyboards/evyd13/mx5160/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/nt210/keyboard.json b/keyboards/evyd13/nt210/keyboard.json index c6c54ccf56..cbca2c6758 100644 --- a/keyboards/evyd13/nt210/keyboard.json +++ b/keyboards/evyd13/nt210/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/evyd13/nt650/keyboard.json b/keyboards/evyd13/nt650/keyboard.json index dc6fc74aca..fe0380fa79 100644 --- a/keyboards/evyd13/nt650/keyboard.json +++ b/keyboards/evyd13/nt650/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/evyd13/nt750/keyboard.json b/keyboards/evyd13/nt750/keyboard.json index ad6a540179..8be6bc827e 100644 --- a/keyboards/evyd13/nt750/keyboard.json +++ b/keyboards/evyd13/nt750/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/nt980/keyboard.json b/keyboards/evyd13/nt980/keyboard.json index 44395ae6e6..42c05e25c6 100644 --- a/keyboards/evyd13/nt980/keyboard.json +++ b/keyboards/evyd13/nt980/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/evyd13/omrontkl/keyboard.json b/keyboards/evyd13/omrontkl/keyboard.json index 2f41f3f14c..ee79748e6a 100644 --- a/keyboards/evyd13/omrontkl/keyboard.json +++ b/keyboards/evyd13/omrontkl/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/evyd13/plain60/keyboard.json b/keyboards/evyd13/plain60/keyboard.json index 1fbcfd9beb..15c4c5b7f8 100644 --- a/keyboards/evyd13/plain60/keyboard.json +++ b/keyboards/evyd13/plain60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/quackfire/keyboard.json b/keyboards/evyd13/quackfire/keyboard.json index 154f9cfd0e..42a11ea776 100644 --- a/keyboards/evyd13/quackfire/keyboard.json +++ b/keyboards/evyd13/quackfire/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/evyd13/solheim68/keyboard.json b/keyboards/evyd13/solheim68/keyboard.json index de150e3984..98c617f959 100644 --- a/keyboards/evyd13/solheim68/keyboard.json +++ b/keyboards/evyd13/solheim68/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/evyd13/ta65/keyboard.json b/keyboards/evyd13/ta65/keyboard.json index 87f7bbfbc8..3f51a25299 100644 --- a/keyboards/evyd13/ta65/keyboard.json +++ b/keyboards/evyd13/ta65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/exclusive/e65/keyboard.json b/keyboards/exclusive/e65/keyboard.json index d235ad028f..2be0dc57d8 100644 --- a/keyboards/exclusive/e65/keyboard.json +++ b/keyboards/exclusive/e65/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e6_rgb/keyboard.json b/keyboards/exclusive/e6_rgb/keyboard.json index 780fd1c1ab..52d77dfcaa 100644 --- a/keyboards/exclusive/e6_rgb/keyboard.json +++ b/keyboards/exclusive/e6_rgb/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/exclusive/e6v2/le/keyboard.json b/keyboards/exclusive/e6v2/le/keyboard.json index 25ca2ca4f8..a2a460d7de 100644 --- a/keyboards/exclusive/e6v2/le/keyboard.json +++ b/keyboards/exclusive/e6v2/le/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e6v2/oe/keyboard.json b/keyboards/exclusive/e6v2/oe/keyboard.json index 120fb76635..29730487c9 100644 --- a/keyboards/exclusive/e6v2/oe/keyboard.json +++ b/keyboards/exclusive/e6v2/oe/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e7v1/keyboard.json b/keyboards/exclusive/e7v1/keyboard.json index 0cafc27d2d..04cd7ff0ae 100644 --- a/keyboards/exclusive/e7v1/keyboard.json +++ b/keyboards/exclusive/e7v1/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/exclusive/e7v1se/keyboard.json b/keyboards/exclusive/e7v1se/keyboard.json index 7f24f0102b..8154725075 100644 --- a/keyboards/exclusive/e7v1se/keyboard.json +++ b/keyboards/exclusive/e7v1se/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/eyeohdesigns/babyv/keyboard.json b/keyboards/eyeohdesigns/babyv/keyboard.json index 72373d9c46..d9bf06190f 100644 --- a/keyboards/eyeohdesigns/babyv/keyboard.json +++ b/keyboards/eyeohdesigns/babyv/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/eyeohdesigns/theboulevard/keyboard.json b/keyboards/eyeohdesigns/theboulevard/keyboard.json index 816ad06917..78a2e94128 100644 --- a/keyboards/eyeohdesigns/theboulevard/keyboard.json +++ b/keyboards/eyeohdesigns/theboulevard/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/falsonix/fx19/keyboard.json b/keyboards/falsonix/fx19/keyboard.json index 95e1e9cd78..64b34d0caf 100644 --- a/keyboards/falsonix/fx19/keyboard.json +++ b/keyboards/falsonix/fx19/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/fatotesa/keyboard.json b/keyboards/fatotesa/keyboard.json index 6ea6b7199b..3013e8b812 100644 --- a/keyboards/fatotesa/keyboard.json +++ b/keyboards/fatotesa/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/fearherbs1/blue_team_pad/keyboard.json b/keyboards/fearherbs1/blue_team_pad/keyboard.json index b47b049b45..5091fc0c31 100644 --- a/keyboards/fearherbs1/blue_team_pad/keyboard.json +++ b/keyboards/fearherbs1/blue_team_pad/keyboard.json @@ -16,7 +16,6 @@ "mousekey": true, "extrakey": true, "console": true, - "command": false, "nkro": true, "oled": true }, diff --git a/keyboards/feker/ik75/keyboard.json b/keyboards/feker/ik75/keyboard.json index 0f86148ebe..03b86e5d8b 100644 --- a/keyboards/feker/ik75/keyboard.json +++ b/keyboards/feker/ik75/keyboard.json @@ -62,7 +62,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ffkeebs/puca/keyboard.json b/keyboards/ffkeebs/puca/keyboard.json index 2c0780f4be..e79032593a 100644 --- a/keyboards/ffkeebs/puca/keyboard.json +++ b/keyboards/ffkeebs/puca/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ffkeebs/siris/keyboard.json b/keyboards/ffkeebs/siris/keyboard.json index 5886f98874..d8bcb4df36 100644 --- a/keyboards/ffkeebs/siris/keyboard.json +++ b/keyboards/ffkeebs/siris/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/flashquark/horizon_z/keyboard.json b/keyboards/flashquark/horizon_z/keyboard.json index b2354889cc..8e3ba47e4d 100755 --- a/keyboards/flashquark/horizon_z/keyboard.json +++ b/keyboards/flashquark/horizon_z/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/flehrad/numbrero/keyboard.json b/keyboards/flehrad/numbrero/keyboard.json index 28a6ab23de..ac21bb0fbb 100644 --- a/keyboards/flehrad/numbrero/keyboard.json +++ b/keyboards/flehrad/numbrero/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flehrad/snagpad/keyboard.json b/keyboards/flehrad/snagpad/keyboard.json index 821117f245..d1a2f3ddee 100644 --- a/keyboards/flehrad/snagpad/keyboard.json +++ b/keyboards/flehrad/snagpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flehrad/tradestation/keyboard.json b/keyboards/flehrad/tradestation/keyboard.json index 4122d6e5e6..b753ce2f8e 100644 --- a/keyboards/flehrad/tradestation/keyboard.json +++ b/keyboards/flehrad/tradestation/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/fleuron/keyboard.json b/keyboards/fleuron/keyboard.json index 041ed9061c..c3f3c35fe1 100644 --- a/keyboards/fleuron/keyboard.json +++ b/keyboards/fleuron/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/flx/lodestone/keyboard.json b/keyboards/flx/lodestone/keyboard.json index 138ea8216e..8ed4e39956 100644 --- a/keyboards/flx/lodestone/keyboard.json +++ b/keyboards/flx/lodestone/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/flx/virgo/keyboard.json b/keyboards/flx/virgo/keyboard.json index 11935c38f2..7641e3f2ea 100644 --- a/keyboards/flx/virgo/keyboard.json +++ b/keyboards/flx/virgo/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/foostan/cornelius/keyboard.json b/keyboards/foostan/cornelius/keyboard.json index 024247b894..5f80d597e7 100644 --- a/keyboards/foostan/cornelius/keyboard.json +++ b/keyboards/foostan/cornelius/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/forever65/keyboard.json b/keyboards/forever65/keyboard.json index f1f7262929..17866fa6e7 100644 --- a/keyboards/forever65/keyboard.json +++ b/keyboards/forever65/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/foxlab/key65/hotswap/keyboard.json b/keyboards/foxlab/key65/hotswap/keyboard.json index 892903f4ad..e6c74011d3 100644 --- a/keyboards/foxlab/key65/hotswap/keyboard.json +++ b/keyboards/foxlab/key65/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/key65/universal/keyboard.json b/keyboards/foxlab/key65/universal/keyboard.json index 3133a89b5c..6a70f6e679 100644 --- a/keyboards/foxlab/key65/universal/keyboard.json +++ b/keyboards/foxlab/key65/universal/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/leaf60/hotswap/keyboard.json b/keyboards/foxlab/leaf60/hotswap/keyboard.json index 76b22849c8..dedd885ef7 100644 --- a/keyboards/foxlab/leaf60/hotswap/keyboard.json +++ b/keyboards/foxlab/leaf60/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/foxlab/leaf60/universal/keyboard.json b/keyboards/foxlab/leaf60/universal/keyboard.json index ee1f59bd0d..8a756aa070 100644 --- a/keyboards/foxlab/leaf60/universal/keyboard.json +++ b/keyboards/foxlab/leaf60/universal/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/foxlab/time80/keyboard.json b/keyboards/foxlab/time80/keyboard.json index c922c821ca..5bdda54ffd 100644 --- a/keyboards/foxlab/time80/keyboard.json +++ b/keyboards/foxlab/time80/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/foxlab/time_re/hotswap/keyboard.json b/keyboards/foxlab/time_re/hotswap/keyboard.json index 262bcbf8e1..aeef957547 100644 --- a/keyboards/foxlab/time_re/hotswap/keyboard.json +++ b/keyboards/foxlab/time_re/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/foxlab/time_re/universal/keyboard.json b/keyboards/foxlab/time_re/universal/keyboard.json index a7849bdba3..e04ab3978e 100644 --- a/keyboards/foxlab/time_re/universal/keyboard.json +++ b/keyboards/foxlab/time_re/universal/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/fr4/southpaw75/keyboard.json b/keyboards/fr4/southpaw75/keyboard.json index 9152b2758a..dc919b2ee4 100644 --- a/keyboards/fr4/southpaw75/keyboard.json +++ b/keyboards/fr4/southpaw75/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/fr4/unix60/keyboard.json b/keyboards/fr4/unix60/keyboard.json index 4a34065ece..97da97dd0e 100644 --- a/keyboards/fr4/unix60/keyboard.json +++ b/keyboards/fr4/unix60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/free_willy/keyboard.json b/keyboards/free_willy/keyboard.json index 74177bdc5e..815f5808f5 100644 --- a/keyboards/free_willy/keyboard.json +++ b/keyboards/free_willy/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/friedrich/keyboard.json b/keyboards/friedrich/keyboard.json index 49da41a947..0489b57cea 100644 --- a/keyboards/friedrich/keyboard.json +++ b/keyboards/friedrich/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/frobiac/blackbowl/keyboard.json b/keyboards/frobiac/blackbowl/keyboard.json index 27cbd78209..704a8b0d62 100644 --- a/keyboards/frobiac/blackbowl/keyboard.json +++ b/keyboards/frobiac/blackbowl/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": false, - "command": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/blackflat/keyboard.json b/keyboards/frobiac/blackflat/keyboard.json index 0d9229f96a..b8c8622ac8 100644 --- a/keyboards/frobiac/blackflat/keyboard.json +++ b/keyboards/frobiac/blackflat/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/hypernano/keyboard.json b/keyboards/frobiac/hypernano/keyboard.json index 28a8e9b766..ec7d850fd3 100644 --- a/keyboards/frobiac/hypernano/keyboard.json +++ b/keyboards/frobiac/hypernano/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frobiac/redtilt/keyboard.json b/keyboards/frobiac/redtilt/keyboard.json index 764bc9be7b..5a6d746f35 100644 --- a/keyboards/frobiac/redtilt/keyboard.json +++ b/keyboards/frobiac/redtilt/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/frooastboard/nano/keyboard.json b/keyboards/frooastboard/nano/keyboard.json index 78764d2536..45e3dc75d6 100644 --- a/keyboards/frooastboard/nano/keyboard.json +++ b/keyboards/frooastboard/nano/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/frooastboard/walnut/keyboard.json b/keyboards/frooastboard/walnut/keyboard.json index 4807a28801..f1958c04a2 100644 --- a/keyboards/frooastboard/walnut/keyboard.json +++ b/keyboards/frooastboard/walnut/keyboard.json @@ -8,7 +8,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/fs_streampad/keyboard.json b/keyboards/fs_streampad/keyboard.json index d932315419..33604f70aa 100644 --- a/keyboards/fs_streampad/keyboard.json +++ b/keyboards/fs_streampad/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ft/mars65/keyboard.json b/keyboards/ft/mars65/keyboard.json index 3b9c5fe0e6..b8206d29be 100644 --- a/keyboards/ft/mars65/keyboard.json +++ b/keyboards/ft/mars65/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/function96/v1/keyboard.json b/keyboards/function96/v1/keyboard.json index a3f6db9a1e..7a1367a30c 100644 --- a/keyboards/function96/v1/keyboard.json +++ b/keyboards/function96/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/function96/v2/keyboard.json b/keyboards/function96/v2/keyboard.json index 2d2b7bafcf..bbb508ec91 100644 --- a/keyboards/function96/v2/keyboard.json +++ b/keyboards/function96/v2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/fungo/rev1/keyboard.json b/keyboards/fungo/rev1/keyboard.json index eacf9cf21c..0b0abec8e7 100644 --- a/keyboards/fungo/rev1/keyboard.json +++ b/keyboards/fungo/rev1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "key_lock": true, "mousekey": true, diff --git a/keyboards/funky40/keyboard.json b/keyboards/funky40/keyboard.json index 9d05de1562..0658fc4974 100644 --- a/keyboards/funky40/keyboard.json +++ b/keyboards/funky40/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gami_studio/lex60/keyboard.json b/keyboards/gami_studio/lex60/keyboard.json index 7fd735d6ff..9ddc1513f3 100644 --- a/keyboards/gami_studio/lex60/keyboard.json +++ b/keyboards/gami_studio/lex60/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/gboards/butterstick/keyboard.json b/keyboards/gboards/butterstick/keyboard.json index 80204f6ba9..b1401eb87c 100644 --- a/keyboards/gboards/butterstick/keyboard.json +++ b/keyboards/gboards/butterstick/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/geekboards/macropad_v2/keyboard.json b/keyboards/geekboards/macropad_v2/keyboard.json index 4e0eff3a5e..a34912aee3 100644 --- a/keyboards/geekboards/macropad_v2/keyboard.json +++ b/keyboards/geekboards/macropad_v2/keyboard.json @@ -57,7 +57,6 @@ "bootloader": "stm32-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/geekboards/tester/keyboard.json b/keyboards/geekboards/tester/keyboard.json index ef6e6ee352..2b85961df8 100644 --- a/keyboards/geekboards/tester/keyboard.json +++ b/keyboards/geekboards/tester/keyboard.json @@ -54,7 +54,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/geistmaschine/geist/keyboard.json b/keyboards/geistmaschine/geist/keyboard.json index 723f3d4e7f..4d1b29c67f 100644 --- a/keyboards/geistmaschine/geist/keyboard.json +++ b/keyboards/geistmaschine/geist/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/geistmaschine/macropod/keyboard.json b/keyboards/geistmaschine/macropod/keyboard.json index 32094981c7..f5803778dd 100644 --- a/keyboards/geistmaschine/macropod/keyboard.json +++ b/keyboards/geistmaschine/macropod/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/generic_panda/panda65_01/keyboard.json b/keyboards/generic_panda/panda65_01/keyboard.json index 59ed646543..1ba0ec134b 100644 --- a/keyboards/generic_panda/panda65_01/keyboard.json +++ b/keyboards/generic_panda/panda65_01/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/genone/eclipse_65/keyboard.json b/keyboards/genone/eclipse_65/keyboard.json index f416e538d5..0b7a27e910 100644 --- a/keyboards/genone/eclipse_65/keyboard.json +++ b/keyboards/genone/eclipse_65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/genone/g1_65/keyboard.json b/keyboards/genone/g1_65/keyboard.json index bb85dd82bc..3ee452f9d1 100644 --- a/keyboards/genone/g1_65/keyboard.json +++ b/keyboards/genone/g1_65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/ee_at/keyboard.json b/keyboards/geonworks/ee_at/keyboard.json index a619ca43e3..c901901ab0 100644 --- a/keyboards/geonworks/ee_at/keyboard.json +++ b/keyboards/geonworks/ee_at/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/geonworks/frogmini/fmh/keyboard.json b/keyboards/geonworks/frogmini/fmh/keyboard.json index d8f1db093a..fd42773042 100644 --- a/keyboards/geonworks/frogmini/fmh/keyboard.json +++ b/keyboards/geonworks/frogmini/fmh/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/frogmini/fms/keyboard.json b/keyboards/geonworks/frogmini/fms/keyboard.json index 63945434eb..4c582c2bd8 100644 --- a/keyboards/geonworks/frogmini/fms/keyboard.json +++ b/keyboards/geonworks/frogmini/fms/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/geonworks/w1_at/keyboard.json b/keyboards/geonworks/w1_at/keyboard.json index 49834c3730..240463b9c4 100644 --- a/keyboards/geonworks/w1_at/keyboard.json +++ b/keyboards/geonworks/w1_at/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gh60/revc/keyboard.json b/keyboards/gh60/revc/keyboard.json index cc73e0649e..bfb81ad093 100644 --- a/keyboards/gh60/revc/keyboard.json +++ b/keyboards/gh60/revc/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gh60/v1p3/keyboard.json b/keyboards/gh60/v1p3/keyboard.json index 978b1e0b57..38496bb9de 100644 --- a/keyboards/gh60/v1p3/keyboard.json +++ b/keyboards/gh60/v1p3/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gh80_3000/keyboard.json b/keyboards/gh80_3000/keyboard.json index c747264be4..cf3c346486 100644 --- a/keyboards/gh80_3000/keyboard.json +++ b/keyboards/gh80_3000/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ghs/jem/info.json b/keyboards/ghs/jem/info.json index 92d09c9c83..543dc041a7 100644 --- a/keyboards/ghs/jem/info.json +++ b/keyboards/ghs/jem/info.json @@ -10,7 +10,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "rgblight": true, diff --git a/keyboards/ghs/rar/keyboard.json b/keyboards/ghs/rar/keyboard.json index 2e3a205ad9..75b835a3e2 100644 --- a/keyboards/ghs/rar/keyboard.json +++ b/keyboards/ghs/rar/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ghs/xls/keyboard.json b/keyboards/ghs/xls/keyboard.json index 2115fe456e..64ce7cbb91 100644 --- a/keyboards/ghs/xls/keyboard.json +++ b/keyboards/ghs/xls/keyboard.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "encoder": true, diff --git a/keyboards/giabalanai/keyboard.json b/keyboards/giabalanai/keyboard.json index 817bed0f57..2e2357fe4c 100644 --- a/keyboards/giabalanai/keyboard.json +++ b/keyboards/giabalanai/keyboard.json @@ -36,7 +36,6 @@ "bootmagic": false, "mousekey": false, "nkro": false, - "command": false, "backlight": false }, "build": { diff --git a/keyboards/gizmo_engineering/gk6/keyboard.json b/keyboards/gizmo_engineering/gk6/keyboard.json index bd9588f251..45e5bf0706 100644 --- a/keyboards/gizmo_engineering/gk6/keyboard.json +++ b/keyboards/gizmo_engineering/gk6/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/gkeyboard/gkb_m16/keyboard.json b/keyboards/gkeyboard/gkb_m16/keyboard.json index 408d391cb3..968e154598 100644 --- a/keyboards/gkeyboard/gkb_m16/keyboard.json +++ b/keyboards/gkeyboard/gkb_m16/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gkeyboard/gpad8_2r/keyboard.json b/keyboards/gkeyboard/gpad8_2r/keyboard.json index a2e3144bb4..95645a53fc 100644 --- a/keyboards/gkeyboard/gpad8_2r/keyboard.json +++ b/keyboards/gkeyboard/gpad8_2r/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gkeyboard/greatpad/keyboard.json b/keyboards/gkeyboard/greatpad/keyboard.json index 6f11479357..d578111703 100644 --- a/keyboards/gkeyboard/greatpad/keyboard.json +++ b/keyboards/gkeyboard/greatpad/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gl516/xr63gl/keyboard.json b/keyboards/gl516/xr63gl/keyboard.json index 19716eb60c..e36b0622d6 100644 --- a/keyboards/gl516/xr63gl/keyboard.json +++ b/keyboards/gl516/xr63gl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json b/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json index 197b08e419..70c308da5f 100644 --- a/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json +++ b/keyboards/gmmk/gmmk2/p65/ansi/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p65/iso/keyboard.json b/keyboards/gmmk/gmmk2/p65/iso/keyboard.json index 2ba4bf0616..9240268b4f 100644 --- a/keyboards/gmmk/gmmk2/p65/iso/keyboard.json +++ b/keyboards/gmmk/gmmk2/p65/iso/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json b/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json index 43ebfbf620..0646be8c88 100644 --- a/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json +++ b/keyboards/gmmk/gmmk2/p96/ansi/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/gmmk2/p96/iso/keyboard.json b/keyboards/gmmk/gmmk2/p96/iso/keyboard.json index 7f1989324f..679881a94b 100644 --- a/keyboards/gmmk/gmmk2/p96/iso/keyboard.json +++ b/keyboards/gmmk/gmmk2/p96/iso/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gmmk/pro/rev1/ansi/keyboard.json b/keyboards/gmmk/pro/rev1/ansi/keyboard.json index 074949efaa..fbb9107d16 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keyboard.json +++ b/keyboards/gmmk/pro/rev1/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev1/iso/keyboard.json b/keyboards/gmmk/pro/rev1/iso/keyboard.json index 9b26290fbc..7506f8952d 100644 --- a/keyboards/gmmk/pro/rev1/iso/keyboard.json +++ b/keyboards/gmmk/pro/rev1/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev2/ansi/keyboard.json b/keyboards/gmmk/pro/rev2/ansi/keyboard.json index e113374dc7..4e0fdfccd9 100644 --- a/keyboards/gmmk/pro/rev2/ansi/keyboard.json +++ b/keyboards/gmmk/pro/rev2/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gmmk/pro/rev2/iso/keyboard.json b/keyboards/gmmk/pro/rev2/iso/keyboard.json index b4aad81323..01db9dc22f 100644 --- a/keyboards/gmmk/pro/rev2/iso/keyboard.json +++ b/keyboards/gmmk/pro/rev2/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gorthage_truck/keyboard.json b/keyboards/gorthage_truck/keyboard.json index 40c901e21c..4af39afca3 100644 --- a/keyboards/gorthage_truck/keyboard.json +++ b/keyboards/gorthage_truck/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/gowla/keyboard.json b/keyboards/gowla/keyboard.json index 0272611013..f4f0b96838 100644 --- a/keyboards/gowla/keyboard.json +++ b/keyboards/gowla/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/gray_studio/aero75/keyboard.json b/keyboards/gray_studio/aero75/keyboard.json index 9357ca3903..e510c160e8 100644 --- a/keyboards/gray_studio/aero75/keyboard.json +++ b/keyboards/gray_studio/aero75/keyboard.json @@ -39,7 +39,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/apollo80/keyboard.json b/keyboards/gray_studio/apollo80/keyboard.json index 0bbb3bf804..6211f78447 100644 --- a/keyboards/gray_studio/apollo80/keyboard.json +++ b/keyboards/gray_studio/apollo80/keyboard.json @@ -35,7 +35,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gray_studio/space65/keyboard.json b/keyboards/gray_studio/space65/keyboard.json index 630f9d4e26..3ca6a306cd 100644 --- a/keyboards/gray_studio/space65/keyboard.json +++ b/keyboards/gray_studio/space65/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/space65r3/keyboard.json b/keyboards/gray_studio/space65r3/keyboard.json index 3a5880caf5..ab2bac62f9 100644 --- a/keyboards/gray_studio/space65r3/keyboard.json +++ b/keyboards/gray_studio/space65r3/keyboard.json @@ -39,7 +39,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/gray_studio/think65v3/keyboard.json b/keyboards/gray_studio/think65v3/keyboard.json index c561c3e8a2..201e271b33 100644 --- a/keyboards/gray_studio/think65v3/keyboard.json +++ b/keyboards/gray_studio/think65v3/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gregandcin/teaqueen/keyboard.json b/keyboards/gregandcin/teaqueen/keyboard.json index dfb7e64146..bfdd395a7e 100644 --- a/keyboards/gregandcin/teaqueen/keyboard.json +++ b/keyboards/gregandcin/teaqueen/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/grid600/press/keyboard.json b/keyboards/grid600/press/keyboard.json index 8e8ae09f1c..e5006d99f0 100644 --- a/keyboards/grid600/press/keyboard.json +++ b/keyboards/grid600/press/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/gummykey/keyboard.json b/keyboards/gummykey/keyboard.json index 36fa06455f..a16e2e4a1f 100644 --- a/keyboards/gummykey/keyboard.json +++ b/keyboards/gummykey/keyboard.json @@ -5,7 +5,6 @@ "maintainer": "Gumorr", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/gvalchca/ga150/keyboard.json b/keyboards/gvalchca/ga150/keyboard.json index ff0c0502c0..fbaa777499 100644 --- a/keyboards/gvalchca/ga150/keyboard.json +++ b/keyboards/gvalchca/ga150/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/gvalchca/spaccboard/keyboard.json b/keyboards/gvalchca/spaccboard/keyboard.json index 33af104d42..783584aa85 100644 --- a/keyboards/gvalchca/spaccboard/keyboard.json +++ b/keyboards/gvalchca/spaccboard/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/h0oni/deskpad/keyboard.json b/keyboards/h0oni/deskpad/keyboard.json index e7de03edb8..ac7cb8ca67 100644 --- a/keyboards/h0oni/deskpad/keyboard.json +++ b/keyboards/h0oni/deskpad/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/h0oni/hotduck/keyboard.json b/keyboards/h0oni/hotduck/keyboard.json index bda7a295b2..55cd18762f 100644 --- a/keyboards/h0oni/hotduck/keyboard.json +++ b/keyboards/h0oni/hotduck/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hackpad/keyboard.json b/keyboards/hackpad/keyboard.json index 5813874e59..60a750691a 100644 --- a/keyboards/hackpad/keyboard.json +++ b/keyboards/hackpad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/halokeys/elemental75/keyboard.json b/keyboards/halokeys/elemental75/keyboard.json index b9319d2f21..a5ff54fccb 100644 --- a/keyboards/halokeys/elemental75/keyboard.json +++ b/keyboards/halokeys/elemental75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/han60/keyboard.json b/keyboards/han60/keyboard.json index d2b1c24159..243dd9bff2 100644 --- a/keyboards/han60/keyboard.json +++ b/keyboards/han60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/hand88/keyboard.json b/keyboards/hand88/keyboard.json index 1ee33b8415..f32eef4d62 100755 --- a/keyboards/hand88/keyboard.json +++ b/keyboards/hand88/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/10k/keyboard.json b/keyboards/handwired/10k/keyboard.json index c49d046fde..b1373f1fb3 100644 --- a/keyboards/handwired/10k/keyboard.json +++ b/keyboards/handwired/10k/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/2x5keypad/keyboard.json b/keyboards/handwired/2x5keypad/keyboard.json index 88932b689b..fbf1f478ba 100644 --- a/keyboards/handwired/2x5keypad/keyboard.json +++ b/keyboards/handwired/2x5keypad/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/3dortho14u/rev1/keyboard.json b/keyboards/handwired/3dortho14u/rev1/keyboard.json index 3a3c872d3a..5941c1792f 100644 --- a/keyboards/handwired/3dortho14u/rev1/keyboard.json +++ b/keyboards/handwired/3dortho14u/rev1/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/3dortho14u/rev2/keyboard.json b/keyboards/handwired/3dortho14u/rev2/keyboard.json index 831e24e118..3c1cdde353 100644 --- a/keyboards/handwired/3dortho14u/rev2/keyboard.json +++ b/keyboards/handwired/3dortho14u/rev2/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/3dp660_oled/keyboard.json b/keyboards/handwired/3dp660_oled/keyboard.json index c687a8bbb4..cb19d2ab80 100644 --- a/keyboards/handwired/3dp660_oled/keyboard.json +++ b/keyboards/handwired/3dp660_oled/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/6key/keyboard.json b/keyboards/handwired/6key/keyboard.json index 8b4a41b0bf..53a8e50193 100644 --- a/keyboards/handwired/6key/keyboard.json +++ b/keyboards/handwired/6key/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/6macro/keyboard.json b/keyboards/handwired/6macro/keyboard.json index 19e2191c22..7aa7311806 100644 --- a/keyboards/handwired/6macro/keyboard.json +++ b/keyboards/handwired/6macro/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/acacia/keyboard.json b/keyboards/handwired/acacia/keyboard.json index bdb63430af..16f614d795 100644 --- a/keyboards/handwired/acacia/keyboard.json +++ b/keyboards/handwired/acacia/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/aim65/keyboard.json b/keyboards/handwired/aim65/keyboard.json index e5f48d7ef6..393a2b9803 100644 --- a/keyboards/handwired/aim65/keyboard.json +++ b/keyboards/handwired/aim65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/alcor_dactyl/keyboard.json b/keyboards/handwired/alcor_dactyl/keyboard.json index 36b0cc849b..46f23c944b 100644 --- a/keyboards/handwired/alcor_dactyl/keyboard.json +++ b/keyboards/handwired/alcor_dactyl/keyboard.json @@ -10,7 +10,6 @@ "vid": "0xFEED" }, "features": { - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/amigopunk/keyboard.json b/keyboards/handwired/amigopunk/keyboard.json index 11df6261ac..816dbb344d 100644 --- a/keyboards/handwired/amigopunk/keyboard.json +++ b/keyboards/handwired/amigopunk/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/angel/keyboard.json b/keyboards/handwired/angel/keyboard.json index 89635b7bab..6f2fe16589 100644 --- a/keyboards/handwired/angel/keyboard.json +++ b/keyboards/handwired/angel/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/aplx2/keyboard.json b/keyboards/handwired/aplx2/keyboard.json index f47646d5bf..36e00fa1bf 100644 --- a/keyboards/handwired/aplx2/keyboard.json +++ b/keyboards/handwired/aplx2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/aranck/keyboard.json b/keyboards/handwired/aranck/keyboard.json index e64a4b5263..ebc2203675 100644 --- a/keyboards/handwired/aranck/keyboard.json +++ b/keyboards/handwired/aranck/keyboard.json @@ -11,7 +11,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/axon/keyboard.json b/keyboards/handwired/axon/keyboard.json index 6332e0c95b..82b97bca84 100644 --- a/keyboards/handwired/axon/keyboard.json +++ b/keyboards/handwired/axon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/baredev/rev1/keyboard.json b/keyboards/handwired/baredev/rev1/keyboard.json index 66d37c1f6e..3a753bd740 100644 --- a/keyboards/handwired/baredev/rev1/keyboard.json +++ b/keyboards/handwired/baredev/rev1/keyboard.json @@ -24,7 +24,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/bolek/keyboard.json b/keyboards/handwired/bolek/keyboard.json index 00d47a2b06..7ce99e73b7 100644 --- a/keyboards/handwired/bolek/keyboard.json +++ b/keyboards/handwired/bolek/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/boss566y/redragon_vara/keyboard.json b/keyboards/handwired/boss566y/redragon_vara/keyboard.json index 1b35bf4c49..bdcfb5b008 100644 --- a/keyboards/handwired/boss566y/redragon_vara/keyboard.json +++ b/keyboards/handwired/boss566y/redragon_vara/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/brain/keyboard.json b/keyboards/handwired/brain/keyboard.json index 6b5e76b323..2efa27d712 100644 --- a/keyboards/handwired/brain/keyboard.json +++ b/keyboards/handwired/brain/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/bstk100/keyboard.json b/keyboards/handwired/bstk100/keyboard.json index 3eb02037a5..f505b75831 100644 --- a/keyboards/handwired/bstk100/keyboard.json +++ b/keyboards/handwired/bstk100/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/cans12er/keyboard.json b/keyboards/handwired/cans12er/keyboard.json index a1bfe51902..a1ecaa9f6e 100644 --- a/keyboards/handwired/cans12er/keyboard.json +++ b/keyboards/handwired/cans12er/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/chiron/keyboard.json b/keyboards/handwired/chiron/keyboard.json index 5be09e0a3d..024132396a 100644 --- a/keyboards/handwired/chiron/keyboard.json +++ b/keyboards/handwired/chiron/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/co60/rev1/keyboard.json b/keyboards/handwired/co60/rev1/keyboard.json index 7d5ba93fac..250c157b90 100644 --- a/keyboards/handwired/co60/rev1/keyboard.json +++ b/keyboards/handwired/co60/rev1/keyboard.json @@ -6,7 +6,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/co60/rev6/keyboard.json b/keyboards/handwired/co60/rev6/keyboard.json index 2688ab2739..f38ae149b4 100644 --- a/keyboards/handwired/co60/rev6/keyboard.json +++ b/keyboards/handwired/co60/rev6/keyboard.json @@ -6,7 +6,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/co60/rev7/keyboard.json b/keyboards/handwired/co60/rev7/keyboard.json index d1967ce147..493f546372 100644 --- a/keyboards/handwired/co60/rev7/keyboard.json +++ b/keyboards/handwired/co60/rev7/keyboard.json @@ -6,7 +6,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/colorlice/keyboard.json b/keyboards/handwired/colorlice/keyboard.json index 2159dbe54c..b2606afb89 100644 --- a/keyboards/handwired/colorlice/keyboard.json +++ b/keyboards/handwired/colorlice/keyboard.json @@ -72,7 +72,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/concertina/64key/keyboard.json b/keyboards/handwired/concertina/64key/keyboard.json index 435c846342..c8790fa2de 100644 --- a/keyboards/handwired/concertina/64key/keyboard.json +++ b/keyboards/handwired/concertina/64key/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/croxsplit44/keyboard.json b/keyboards/handwired/croxsplit44/keyboard.json index f5e36d22b9..dbb285e115 100644 --- a/keyboards/handwired/croxsplit44/keyboard.json +++ b/keyboards/handwired/croxsplit44/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/curiosity/keyboard.json b/keyboards/handwired/curiosity/keyboard.json index 273033b0bf..f49a542bf9 100644 --- a/keyboards/handwired/curiosity/keyboard.json +++ b/keyboards/handwired/curiosity/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_kinesis/keyboard.json b/keyboards/handwired/dactyl_kinesis/keyboard.json index a1a108f8fa..78abe5191d 100644 --- a/keyboards/handwired/dactyl_kinesis/keyboard.json +++ b/keyboards/handwired/dactyl_kinesis/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_lightcycle/keyboard.json b/keyboards/handwired/dactyl_lightcycle/keyboard.json index cf8fa3d84c..d0ec13f09c 100644 --- a/keyboards/handwired/dactyl_lightcycle/keyboard.json +++ b/keyboards/handwired/dactyl_lightcycle/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json index 8f5f08a81c..14d49e2c93 100644 --- a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json index 0ee888d40c..8f53dd7521 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json index cfbe5bf21a..4d8684bce8 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json +++ b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json index d87c333aa5..6d5949e0bf 100644 --- a/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json +++ b/keyboards/handwired/dactyl_manuform_pi_pico/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_maximus/keyboard.json b/keyboards/handwired/dactyl_maximus/keyboard.json index 3638ae329d..f53c6ed59d 100644 --- a/keyboards/handwired/dactyl_maximus/keyboard.json +++ b/keyboards/handwired/dactyl_maximus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/dactyl_tracer/keyboard.json b/keyboards/handwired/dactyl_tracer/keyboard.json index f6ec68108d..43e2bef722 100644 --- a/keyboards/handwired/dactyl_tracer/keyboard.json +++ b/keyboards/handwired/dactyl_tracer/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/handwired/dactylmacropad/keyboard.json b/keyboards/handwired/dactylmacropad/keyboard.json index 9cfa0bf642..fa89b9e117 100644 --- a/keyboards/handwired/dactylmacropad/keyboard.json +++ b/keyboards/handwired/dactylmacropad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/daishi/keyboard.json b/keyboards/handwired/daishi/keyboard.json index d774f13a5b..f7dabc5992 100644 --- a/keyboards/handwired/daishi/keyboard.json +++ b/keyboards/handwired/daishi/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "dynamic_macro": true, "encoder": true, diff --git a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json index 7a8326278c..7d9b60722f 100644 --- a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json +++ b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/dc/mc/001/keyboard.json b/keyboards/handwired/dc/mc/001/keyboard.json index 924829ad7d..b9e0a7a09f 100644 --- a/keyboards/handwired/dc/mc/001/keyboard.json +++ b/keyboards/handwired/dc/mc/001/keyboard.json @@ -21,7 +21,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/ddg_56/keyboard.json b/keyboards/handwired/ddg_56/keyboard.json index d415494159..5259a2683e 100644 --- a/keyboards/handwired/ddg_56/keyboard.json +++ b/keyboards/handwired/ddg_56/keyboard.json @@ -10,7 +10,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/dmote/keyboard.json b/keyboards/handwired/dmote/keyboard.json index 2928f21152..2e205e153c 100644 --- a/keyboards/handwired/dmote/keyboard.json +++ b/keyboards/handwired/dmote/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/eagleii/keyboard.json b/keyboards/handwired/eagleii/keyboard.json index 7f3f2662d8..9b5d026530 100644 --- a/keyboards/handwired/eagleii/keyboard.json +++ b/keyboards/handwired/eagleii/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/elrgo_s/keyboard.json b/keyboards/handwired/elrgo_s/keyboard.json index cc7258ba5e..ae0054b65c 100644 --- a/keyboards/handwired/elrgo_s/keyboard.json +++ b/keyboards/handwired/elrgo_s/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/frankie_macropad/keyboard.json b/keyboards/handwired/frankie_macropad/keyboard.json index e00291fc52..278a76c7c8 100644 --- a/keyboards/handwired/frankie_macropad/keyboard.json +++ b/keyboards/handwired/frankie_macropad/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "grave_esc": false, diff --git a/keyboards/handwired/freoduo/keyboard.json b/keyboards/handwired/freoduo/keyboard.json index 84939fa1ff..afbd763a96 100644 --- a/keyboards/handwired/freoduo/keyboard.json +++ b/keyboards/handwired/freoduo/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/heisenberg/keyboard.json b/keyboards/handwired/heisenberg/keyboard.json index 38e98982c7..d85477fe24 100644 --- a/keyboards/handwired/heisenberg/keyboard.json +++ b/keyboards/handwired/heisenberg/keyboard.json @@ -29,7 +29,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/hnah108/keyboard.json b/keyboards/handwired/hnah108/keyboard.json index f1e89a268d..a02a70173c 100644 --- a/keyboards/handwired/hnah108/keyboard.json +++ b/keyboards/handwired/hnah108/keyboard.json @@ -56,7 +56,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/hnah40/keyboard.json b/keyboards/handwired/hnah40/keyboard.json index ba63a984cc..a7613c401e 100644 --- a/keyboards/handwired/hnah40/keyboard.json +++ b/keyboards/handwired/hnah40/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/hnah40rgb/keyboard.json b/keyboards/handwired/hnah40rgb/keyboard.json index 233613c590..6f13b70095 100644 --- a/keyboards/handwired/hnah40rgb/keyboard.json +++ b/keyboards/handwired/hnah40rgb/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/hwpm87/keyboard.json b/keyboards/handwired/hwpm87/keyboard.json index 3eb64e28b1..f239ea9ecc 100644 --- a/keyboards/handwired/hwpm87/keyboard.json +++ b/keyboards/handwired/hwpm87/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/iso85k/keyboard.json b/keyboards/handwired/iso85k/keyboard.json index 51e5a347c4..e88c4c3688 100644 --- a/keyboards/handwired/iso85k/keyboard.json +++ b/keyboards/handwired/iso85k/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/itstleo9/info.json b/keyboards/handwired/itstleo9/info.json index f80b516028..340b8a9e33 100644 --- a/keyboards/handwired/itstleo9/info.json +++ b/keyboards/handwired/itstleo9/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/jn68m/keyboard.json b/keyboards/handwired/jn68m/keyboard.json index 267a190fdc..818dce9805 100644 --- a/keyboards/handwired/jn68m/keyboard.json +++ b/keyboards/handwired/jn68m/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/jopr/keyboard.json b/keyboards/handwired/jopr/keyboard.json index f47f31e6b2..f6320f7905 100644 --- a/keyboards/handwired/jopr/keyboard.json +++ b/keyboards/handwired/jopr/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/jot50/keyboard.json b/keyboards/handwired/jot50/keyboard.json index a3c1c1fbe1..d0108b4aa9 100644 --- a/keyboards/handwired/jot50/keyboard.json +++ b/keyboards/handwired/jot50/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/jotanck/keyboard.json b/keyboards/handwired/jotanck/keyboard.json index c8327f6b6c..bddcce9fa5 100644 --- a/keyboards/handwired/jotanck/keyboard.json +++ b/keyboards/handwired/jotanck/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/jotlily60/keyboard.json b/keyboards/handwired/jotlily60/keyboard.json index 802584ae3a..fd072d83db 100644 --- a/keyboards/handwired/jotlily60/keyboard.json +++ b/keyboards/handwired/jotlily60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/jotpad16/keyboard.json b/keyboards/handwired/jotpad16/keyboard.json index c5f8511da8..5a2503aaae 100644 --- a/keyboards/handwired/jotpad16/keyboard.json +++ b/keyboards/handwired/jotpad16/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/juliet/keyboard.json b/keyboards/handwired/juliet/keyboard.json index 0063017054..bf0193432d 100644 --- a/keyboards/handwired/juliet/keyboard.json +++ b/keyboards/handwired/juliet/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/k8split/keyboard.json b/keyboards/handwired/k8split/keyboard.json index 9d47ebd7ba..2312d43689 100644 --- a/keyboards/handwired/k8split/keyboard.json +++ b/keyboards/handwired/k8split/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/kbod/keyboard.json b/keyboards/handwired/kbod/keyboard.json index ae6481efe6..abd8c5dad4 100644 --- a/keyboards/handwired/kbod/keyboard.json +++ b/keyboards/handwired/kbod/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/leftynumpad/keyboard.json b/keyboards/handwired/leftynumpad/keyboard.json index a9d7804364..b14191c744 100644 --- a/keyboards/handwired/leftynumpad/keyboard.json +++ b/keyboards/handwired/leftynumpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/lovelive9/keyboard.json b/keyboards/handwired/lovelive9/keyboard.json index cf20b13b20..2b05d0cb5b 100644 --- a/keyboards/handwired/lovelive9/keyboard.json +++ b/keyboards/handwired/lovelive9/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/marauder/keyboard.json b/keyboards/handwired/marauder/keyboard.json index 6fbdcdc66f..29b8fba30b 100644 --- a/keyboards/handwired/marauder/keyboard.json +++ b/keyboards/handwired/marauder/keyboard.json @@ -22,7 +22,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/marek128b/ergosplit44/keyboard.json b/keyboards/handwired/marek128b/ergosplit44/keyboard.json index aa9574472a..b14ca53bee 100644 --- a/keyboards/handwired/marek128b/ergosplit44/keyboard.json +++ b/keyboards/handwired/marek128b/ergosplit44/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/mechboards_micropad/keyboard.json b/keyboards/handwired/mechboards_micropad/keyboard.json index 87cffe005a..c9a150229d 100644 --- a/keyboards/handwired/mechboards_micropad/keyboard.json +++ b/keyboards/handwired/mechboards_micropad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/misterdeck/keyboard.json b/keyboards/handwired/misterdeck/keyboard.json index 02c4348781..55032ddd80 100644 --- a/keyboards/handwired/misterdeck/keyboard.json +++ b/keyboards/handwired/misterdeck/keyboard.json @@ -13,7 +13,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/mutepad/keyboard.json b/keyboards/handwired/mutepad/keyboard.json index 072db498ed..fd16cd7447 100644 --- a/keyboards/handwired/mutepad/keyboard.json +++ b/keyboards/handwired/mutepad/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/nicekey/keyboard.json b/keyboards/handwired/nicekey/keyboard.json index f166d68774..5679c54432 100644 --- a/keyboards/handwired/nicekey/keyboard.json +++ b/keyboards/handwired/nicekey/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/not_so_minidox/keyboard.json b/keyboards/handwired/not_so_minidox/keyboard.json index 6e5b5932ce..0c10858d67 100644 --- a/keyboards/handwired/not_so_minidox/keyboard.json +++ b/keyboards/handwired/not_so_minidox/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/nozbe_macro/keyboard.json b/keyboards/handwired/nozbe_macro/keyboard.json index 1f219c9d09..a1515df7e3 100644 --- a/keyboards/handwired/nozbe_macro/keyboard.json +++ b/keyboards/handwired/nozbe_macro/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/oem_ansi_fullsize/keyboard.json b/keyboards/handwired/oem_ansi_fullsize/keyboard.json index eb63c481b1..3c3ebb2646 100644 --- a/keyboards/handwired/oem_ansi_fullsize/keyboard.json +++ b/keyboards/handwired/oem_ansi_fullsize/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json index f09810129f..7b6b7ddab8 100644 --- a/keyboards/handwired/onekey/info.json +++ b/keyboards/handwired/onekey/info.json @@ -11,7 +11,6 @@ "bootmagic": false, "mousekey": false, "extrakey": true, - "command": false, "nkro": false }, "qmk": { diff --git a/keyboards/handwired/orbweaver/keyboard.json b/keyboards/handwired/orbweaver/keyboard.json index d6d599a704..73baa9a21d 100644 --- a/keyboards/handwired/orbweaver/keyboard.json +++ b/keyboards/handwired/orbweaver/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/osborne1/keyboard.json b/keyboards/handwired/osborne1/keyboard.json index eacc77ff59..567d4638b5 100644 --- a/keyboards/handwired/osborne1/keyboard.json +++ b/keyboards/handwired/osborne1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/handwired/p65rgb/keyboard.json b/keyboards/handwired/p65rgb/keyboard.json index 36a4d8671b..d2ee16e2c1 100644 --- a/keyboards/handwired/p65rgb/keyboard.json +++ b/keyboards/handwired/p65rgb/keyboard.json @@ -163,7 +163,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/petruziamini/keyboard.json b/keyboards/handwired/petruziamini/keyboard.json index d76643c6be..1d0686aaa1 100644 --- a/keyboards/handwired/petruziamini/keyboard.json +++ b/keyboards/handwired/petruziamini/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/phantagom/baragon/keyboard.json b/keyboards/handwired/phantagom/baragon/keyboard.json index 529ed949e3..3cda89fa2a 100644 --- a/keyboards/handwired/phantagom/baragon/keyboard.json +++ b/keyboards/handwired/phantagom/baragon/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/phantagom/varan/keyboard.json b/keyboards/handwired/phantagom/varan/keyboard.json index fcc39918d6..b852098769 100644 --- a/keyboards/handwired/phantagom/varan/keyboard.json +++ b/keyboards/handwired/phantagom/varan/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/polly40/keyboard.json b/keyboards/handwired/polly40/keyboard.json index 5b2438f999..8eacb238c1 100644 --- a/keyboards/handwired/polly40/keyboard.json +++ b/keyboards/handwired/polly40/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "qmk": { diff --git a/keyboards/handwired/prime_exl/keyboard.json b/keyboards/handwired/prime_exl/keyboard.json index 1462b37b96..656abe14ec 100644 --- a/keyboards/handwired/prime_exl/keyboard.json +++ b/keyboards/handwired/prime_exl/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/prime_exl_plus/keyboard.json b/keyboards/handwired/prime_exl_plus/keyboard.json index 47222e0eb2..7e59b917a7 100644 --- a/keyboards/handwired/prime_exl_plus/keyboard.json +++ b/keyboards/handwired/prime_exl_plus/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/pteron/keyboard.json b/keyboards/handwired/pteron/keyboard.json index ee8d85ec7d..c79bd9a655 100644 --- a/keyboards/handwired/pteron/keyboard.json +++ b/keyboards/handwired/pteron/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/pteron38/keyboard.json b/keyboards/handwired/pteron38/keyboard.json index ef9f31f50d..2328977ae3 100644 --- a/keyboards/handwired/pteron38/keyboard.json +++ b/keyboards/handwired/pteron38/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/pteron44/keyboard.json b/keyboards/handwired/pteron44/keyboard.json index 4ad3b22318..0a4f8605c8 100644 --- a/keyboards/handwired/pteron44/keyboard.json +++ b/keyboards/handwired/pteron44/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/qc60/proto/keyboard.json b/keyboards/handwired/qc60/proto/keyboard.json index d9ee9858ec..92603c33dd 100644 --- a/keyboards/handwired/qc60/proto/keyboard.json +++ b/keyboards/handwired/qc60/proto/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/rabijl/rotary_numpad/keyboard.json b/keyboards/handwired/rabijl/rotary_numpad/keyboard.json index a5476735c9..75f178690b 100644 --- a/keyboards/handwired/rabijl/rotary_numpad/keyboard.json +++ b/keyboards/handwired/rabijl/rotary_numpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/riblee_split/keyboard.json b/keyboards/handwired/riblee_split/keyboard.json index b38219d645..6006f0e4c3 100644 --- a/keyboards/handwired/riblee_split/keyboard.json +++ b/keyboards/handwired/riblee_split/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/rs60/keyboard.json b/keyboards/handwired/rs60/keyboard.json index 5bbabd8bbd..e2b59dc15f 100644 --- a/keyboards/handwired/rs60/keyboard.json +++ b/keyboards/handwired/rs60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/handwired/scottokeebs/scotto34/keyboard.json b/keyboards/handwired/scottokeebs/scotto34/keyboard.json index 323c1132a7..255c33f2cd 100644 --- a/keyboards/handwired/scottokeebs/scotto34/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto34/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto36/keyboard.json b/keyboards/handwired/scottokeebs/scotto36/keyboard.json index c1c748456d..79361b4fe8 100644 --- a/keyboards/handwired/scottokeebs/scotto36/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto36/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto37/keyboard.json b/keyboards/handwired/scottokeebs/scotto37/keyboard.json index 7e45ce3ad5..4e7cb06af9 100644 --- a/keyboards/handwired/scottokeebs/scotto37/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto37/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto40/keyboard.json b/keyboards/handwired/scottokeebs/scotto40/keyboard.json index ce47a5f1bf..722ff7f6b0 100644 --- a/keyboards/handwired/scottokeebs/scotto40/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto40/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto61/keyboard.json b/keyboards/handwired/scottokeebs/scotto61/keyboard.json index f0adfd4081..31510f5b86 100644 --- a/keyboards/handwired/scottokeebs/scotto61/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto61/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scotto9/keyboard.json b/keyboards/handwired/scottokeebs/scotto9/keyboard.json index e48fd54686..148c26af2c 100644 --- a/keyboards/handwired/scottokeebs/scotto9/keyboard.json +++ b/keyboards/handwired/scottokeebs/scotto9/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoalp/keyboard.json b/keyboards/handwired/scottokeebs/scottoalp/keyboard.json index fad006c488..d3473c7b22 100644 --- a/keyboards/handwired/scottokeebs/scottoalp/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoalp/keyboard.json @@ -12,7 +12,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottocmd/keyboard.json b/keyboards/handwired/scottokeebs/scottocmd/keyboard.json index cd7372855a..3dac375a3c 100644 --- a/keyboards/handwired/scottokeebs/scottocmd/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottocmd/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/scottokeebs/scottodeck/keyboard.json b/keyboards/handwired/scottokeebs/scottodeck/keyboard.json index 50bdf99321..e8f4f60c21 100644 --- a/keyboards/handwired/scottokeebs/scottodeck/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottodeck/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/scottokeebs/scottoergo/keyboard.json b/keyboards/handwired/scottokeebs/scottoergo/keyboard.json index 12c1495dc0..137aea987d 100644 --- a/keyboards/handwired/scottokeebs/scottoergo/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoergo/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottofly/keyboard.json b/keyboards/handwired/scottokeebs/scottofly/keyboard.json index eda0385497..2f185fdd5c 100644 --- a/keyboards/handwired/scottokeebs/scottofly/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottofly/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottofrog/keyboard.json b/keyboards/handwired/scottokeebs/scottofrog/keyboard.json index 5d50e893a7..50842232d7 100644 --- a/keyboards/handwired/scottokeebs/scottofrog/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottofrog/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottogame/keyboard.json b/keyboards/handwired/scottokeebs/scottogame/keyboard.json index 694f25fbd5..9464eee51d 100644 --- a/keyboards/handwired/scottokeebs/scottogame/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottogame/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/scottokeebs/scottohazard/keyboard.json b/keyboards/handwired/scottokeebs/scottohazard/keyboard.json index 34915ca7bc..01178e2f24 100644 --- a/keyboards/handwired/scottokeebs/scottohazard/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottohazard/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json b/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json index 23ab2e7310..af8334e0fa 100644 --- a/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoinvader/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottokatana/keyboard.json b/keyboards/handwired/scottokeebs/scottokatana/keyboard.json index 1b0369968c..6cf65818b6 100644 --- a/keyboards/handwired/scottokeebs/scottokatana/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottokatana/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottolong/keyboard.json b/keyboards/handwired/scottokeebs/scottolong/keyboard.json index 664d0d47c9..8df234640c 100644 --- a/keyboards/handwired/scottokeebs/scottolong/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottolong/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json b/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json index beb47c013b..c623547f67 100644 --- a/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottomacrodeck/keyboard.json @@ -5,7 +5,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottomouse/keyboard.json b/keyboards/handwired/scottokeebs/scottomouse/keyboard.json index 9c19e86472..96e4c7707c 100644 --- a/keyboards/handwired/scottokeebs/scottomouse/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottomouse/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottonum/keyboard.json b/keyboards/handwired/scottokeebs/scottonum/keyboard.json index 256768fc60..3a8d87f5a4 100644 --- a/keyboards/handwired/scottokeebs/scottonum/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottonum/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottoslant/keyboard.json b/keyboards/handwired/scottokeebs/scottoslant/keyboard.json index a6b1566c98..bb1282fe12 100644 --- a/keyboards/handwired/scottokeebs/scottoslant/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottoslant/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottosplit/keyboard.json b/keyboards/handwired/scottokeebs/scottosplit/keyboard.json index 9761aec4d4..246c563f1e 100644 --- a/keyboards/handwired/scottokeebs/scottosplit/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottosplit/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottostarter/keyboard.json b/keyboards/handwired/scottokeebs/scottostarter/keyboard.json index 03b50b5fdb..c113efd897 100644 --- a/keyboards/handwired/scottokeebs/scottostarter/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottostarter/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/scottokeebs/scottowing/keyboard.json b/keyboards/handwired/scottokeebs/scottowing/keyboard.json index f4f0e32e94..6163e4ad1d 100644 --- a/keyboards/handwired/scottokeebs/scottowing/keyboard.json +++ b/keyboards/handwired/scottokeebs/scottowing/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/handwired/sejin_eat1010r2/keyboard.json b/keyboards/handwired/sejin_eat1010r2/keyboard.json index 26abf44dfd..5cf17d548a 100644 --- a/keyboards/handwired/sejin_eat1010r2/keyboard.json +++ b/keyboards/handwired/sejin_eat1010r2/keyboard.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/sick_pad/keyboard.json b/keyboards/handwired/sick_pad/keyboard.json index 883f26bafb..68773fea2d 100644 --- a/keyboards/handwired/sick_pad/keyboard.json +++ b/keyboards/handwired/sick_pad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/snatchpad/keyboard.json b/keyboards/handwired/snatchpad/keyboard.json index 09cce2b36c..6f6d9aafec 100644 --- a/keyboards/handwired/snatchpad/keyboard.json +++ b/keyboards/handwired/snatchpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "key_lock": true, diff --git a/keyboards/handwired/sono1/info.json b/keyboards/handwired/sono1/info.json index 6eed0e45d5..bf274924f6 100644 --- a/keyboards/handwired/sono1/info.json +++ b/keyboards/handwired/sono1/info.json @@ -4,7 +4,6 @@ "maintainer": "DmNosachev", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/space_oddity/keyboard.json b/keyboards/handwired/space_oddity/keyboard.json index c6186b3b20..98600b4770 100644 --- a/keyboards/handwired/space_oddity/keyboard.json +++ b/keyboards/handwired/space_oddity/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "dynamic_macro": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/split65/promicro/keyboard.json b/keyboards/handwired/split65/promicro/keyboard.json index fa17a7ea1b..40d0e8f43e 100644 --- a/keyboards/handwired/split65/promicro/keyboard.json +++ b/keyboards/handwired/split65/promicro/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/handwired/split89/keyboard.json b/keyboards/handwired/split89/keyboard.json index aa87be8e31..8635f01d35 100644 --- a/keyboards/handwired/split89/keyboard.json +++ b/keyboards/handwired/split89/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/starrykeebs/dude09/keyboard.json b/keyboards/handwired/starrykeebs/dude09/keyboard.json index a28c319804..3a13e66baa 100644 --- a/keyboards/handwired/starrykeebs/dude09/keyboard.json +++ b/keyboards/handwired/starrykeebs/dude09/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true }, diff --git a/keyboards/handwired/steamvan/rev1/keyboard.json b/keyboards/handwired/steamvan/rev1/keyboard.json index 6949652c3e..06cfd2cef6 100644 --- a/keyboards/handwired/steamvan/rev1/keyboard.json +++ b/keyboards/handwired/steamvan/rev1/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "leader": true, "mousekey": true, diff --git a/keyboards/handwired/stream_cheap/2x3/keyboard.json b/keyboards/handwired/stream_cheap/2x3/keyboard.json index 8329fefd88..ff9d23b215 100644 --- a/keyboards/handwired/stream_cheap/2x3/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x3/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/stream_cheap/2x4/keyboard.json b/keyboards/handwired/stream_cheap/2x4/keyboard.json index aa87b4a765..5fa54354a9 100644 --- a/keyboards/handwired/stream_cheap/2x4/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x4/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/stream_cheap/2x5/keyboard.json b/keyboards/handwired/stream_cheap/2x5/keyboard.json index 744a3c92a4..b9abe2c01f 100644 --- a/keyboards/handwired/stream_cheap/2x5/keyboard.json +++ b/keyboards/handwired/stream_cheap/2x5/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/swiftrax/astro65/keyboard.json b/keyboards/handwired/swiftrax/astro65/keyboard.json index 786e25d4ec..bc33d12159 100644 --- a/keyboards/handwired/swiftrax/astro65/keyboard.json +++ b/keyboards/handwired/swiftrax/astro65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/bebol/keyboard.json b/keyboards/handwired/swiftrax/bebol/keyboard.json index 63d1356fcc..0a665a0ae7 100644 --- a/keyboards/handwired/swiftrax/bebol/keyboard.json +++ b/keyboards/handwired/swiftrax/bebol/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/beegboy/keyboard.json b/keyboards/handwired/swiftrax/beegboy/keyboard.json index 74c82b22e8..c81c897c96 100644 --- a/keyboards/handwired/swiftrax/beegboy/keyboard.json +++ b/keyboards/handwired/swiftrax/beegboy/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/swiftrax/bumblebee/keyboard.json b/keyboards/handwired/swiftrax/bumblebee/keyboard.json index e280d9155a..3a0ba874c7 100644 --- a/keyboards/handwired/swiftrax/bumblebee/keyboard.json +++ b/keyboards/handwired/swiftrax/bumblebee/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/swiftrax/cowfish/keyboard.json b/keyboards/handwired/swiftrax/cowfish/keyboard.json index 675670d6b7..99bb061568 100644 --- a/keyboards/handwired/swiftrax/cowfish/keyboard.json +++ b/keyboards/handwired/swiftrax/cowfish/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/handwired/swiftrax/digicarp65/keyboard.json b/keyboards/handwired/swiftrax/digicarp65/keyboard.json index 41636da219..6a401c0a52 100644 --- a/keyboards/handwired/swiftrax/digicarp65/keyboard.json +++ b/keyboards/handwired/swiftrax/digicarp65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/swiftrax/digicarpice/keyboard.json b/keyboards/handwired/swiftrax/digicarpice/keyboard.json index cf77a0d6a1..32cd6615be 100644 --- a/keyboards/handwired/swiftrax/digicarpice/keyboard.json +++ b/keyboards/handwired/swiftrax/digicarpice/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/equator/keyboard.json b/keyboards/handwired/swiftrax/equator/keyboard.json index f5881aad0a..12434002e4 100644 --- a/keyboards/handwired/swiftrax/equator/keyboard.json +++ b/keyboards/handwired/swiftrax/equator/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/glacier/keyboard.json b/keyboards/handwired/swiftrax/glacier/keyboard.json index c126ec6feb..f3d201a095 100644 --- a/keyboards/handwired/swiftrax/glacier/keyboard.json +++ b/keyboards/handwired/swiftrax/glacier/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/joypad/keyboard.json b/keyboards/handwired/swiftrax/joypad/keyboard.json index dc167bb863..63f8a7a92b 100644 --- a/keyboards/handwired/swiftrax/joypad/keyboard.json +++ b/keyboards/handwired/swiftrax/joypad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/swiftrax/koalafications/keyboard.json b/keyboards/handwired/swiftrax/koalafications/keyboard.json index 6215e4f06a..c01c1da39a 100644 --- a/keyboards/handwired/swiftrax/koalafications/keyboard.json +++ b/keyboards/handwired/swiftrax/koalafications/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/nodu/keyboard.json b/keyboards/handwired/swiftrax/nodu/keyboard.json index 93a7b9b6b8..ce9aad54e0 100644 --- a/keyboards/handwired/swiftrax/nodu/keyboard.json +++ b/keyboards/handwired/swiftrax/nodu/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/pandamic/keyboard.json b/keyboards/handwired/swiftrax/pandamic/keyboard.json index 9cf92812cb..b6b4fa4d66 100644 --- a/keyboards/handwired/swiftrax/pandamic/keyboard.json +++ b/keyboards/handwired/swiftrax/pandamic/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/handwired/swiftrax/the_galleon/keyboard.json b/keyboards/handwired/swiftrax/the_galleon/keyboard.json index 2efd3eb382..63acbf0a20 100644 --- a/keyboards/handwired/swiftrax/the_galleon/keyboard.json +++ b/keyboards/handwired/swiftrax/the_galleon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/swiftrax/unsplit/keyboard.json b/keyboards/handwired/swiftrax/unsplit/keyboard.json index 3155282317..9c5b7d1a63 100644 --- a/keyboards/handwired/swiftrax/unsplit/keyboard.json +++ b/keyboards/handwired/swiftrax/unsplit/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/swiftrax/walter/keyboard.json b/keyboards/handwired/swiftrax/walter/keyboard.json index e5c42b2aff..b766cf87d1 100644 --- a/keyboards/handwired/swiftrax/walter/keyboard.json +++ b/keyboards/handwired/swiftrax/walter/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/symmetry60/keyboard.json b/keyboards/handwired/symmetry60/keyboard.json index 461e412457..86b7fe1d8a 100644 --- a/keyboards/handwired/symmetry60/keyboard.json +++ b/keyboards/handwired/symmetry60/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/t111/keyboard.json b/keyboards/handwired/t111/keyboard.json index a43968e062..d90244c94c 100644 --- a/keyboards/handwired/t111/keyboard.json +++ b/keyboards/handwired/t111/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/tkk/keyboard.json b/keyboards/handwired/tkk/keyboard.json index 7f95b49a04..5dd21ef800 100644 --- a/keyboards/handwired/tkk/keyboard.json +++ b/keyboards/handwired/tkk/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "halfkay", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/traveller/keyboard.json b/keyboards/handwired/traveller/keyboard.json index 65214cd618..01919de563 100644 --- a/keyboards/handwired/traveller/keyboard.json +++ b/keyboards/handwired/traveller/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/handwired/tsubasa/keyboard.json b/keyboards/handwired/tsubasa/keyboard.json index 74ae9348f4..b9ba281d06 100644 --- a/keyboards/handwired/tsubasa/keyboard.json +++ b/keyboards/handwired/tsubasa/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/twig/twig50/keyboard.json b/keyboards/handwired/twig/twig50/keyboard.json index 8403e62f0b..836caf3ebc 100644 --- a/keyboards/handwired/twig/twig50/keyboard.json +++ b/keyboards/handwired/twig/twig50/keyboard.json @@ -14,7 +14,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/unicomp_mini_m/keyboard.json b/keyboards/handwired/unicomp_mini_m/keyboard.json index b66b50ab46..5fe592b79d 100644 --- a/keyboards/handwired/unicomp_mini_m/keyboard.json +++ b/keyboards/handwired/unicomp_mini_m/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/handwired/uthol/rev1/keyboard.json b/keyboards/handwired/uthol/rev1/keyboard.json index c03503bb4d..4c1be1de1e 100644 --- a/keyboards/handwired/uthol/rev1/keyboard.json +++ b/keyboards/handwired/uthol/rev1/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/handwired/uthol/rev2/keyboard.json b/keyboards/handwired/uthol/rev2/keyboard.json index f1ee97ece3..81ec109b27 100644 --- a/keyboards/handwired/uthol/rev2/keyboard.json +++ b/keyboards/handwired/uthol/rev2/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/handwired/videowriter/keyboard.json b/keyboards/handwired/videowriter/keyboard.json index 8ffd4a608c..bfac3b97ef 100644 --- a/keyboards/handwired/videowriter/keyboard.json +++ b/keyboards/handwired/videowriter/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/wakizashi40/keyboard.json b/keyboards/handwired/wakizashi40/keyboard.json index 495d9a0376..e1dc0d7648 100644 --- a/keyboards/handwired/wakizashi40/keyboard.json +++ b/keyboards/handwired/wakizashi40/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/handwired/wwa/helios/keyboard.json b/keyboards/handwired/wwa/helios/keyboard.json index 4da75c0389..8a77808e67 100644 --- a/keyboards/handwired/wwa/helios/keyboard.json +++ b/keyboards/handwired/wwa/helios/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/kepler/keyboard.json b/keyboards/handwired/wwa/kepler/keyboard.json index 67acae2c7d..843403bf89 100644 --- a/keyboards/handwired/wwa/kepler/keyboard.json +++ b/keyboards/handwired/wwa/kepler/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/mercury/keyboard.json b/keyboards/handwired/wwa/mercury/keyboard.json index a621286b27..8ed067f84d 100644 --- a/keyboards/handwired/wwa/mercury/keyboard.json +++ b/keyboards/handwired/wwa/mercury/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/soyuz/keyboard.json b/keyboards/handwired/wwa/soyuz/keyboard.json index 072ed1628b..4b3a015a35 100644 --- a/keyboards/handwired/wwa/soyuz/keyboard.json +++ b/keyboards/handwired/wwa/soyuz/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/wwa/soyuzxl/keyboard.json b/keyboards/handwired/wwa/soyuzxl/keyboard.json index fa67e37ad9..d666e798f4 100644 --- a/keyboards/handwired/wwa/soyuzxl/keyboard.json +++ b/keyboards/handwired/wwa/soyuzxl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/z150/keyboard.json b/keyboards/handwired/z150/keyboard.json index f8b9e6451d..57d460da89 100644 --- a/keyboards/handwired/z150/keyboard.json +++ b/keyboards/handwired/z150/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json index 855fabeb8f..b21bd9af91 100644 --- a/keyboards/handwired/ziyoulang_k3_mod/keyboard.json +++ b/keyboards/handwired/ziyoulang_k3_mod/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/hardlineworks/otd_plus/keyboard.json b/keyboards/hardlineworks/otd_plus/keyboard.json index f084fabead..c7bb0b0223 100644 --- a/keyboards/hardlineworks/otd_plus/keyboard.json +++ b/keyboards/hardlineworks/otd_plus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hardwareabstraction/handwire/keyboard.json b/keyboards/hardwareabstraction/handwire/keyboard.json index e875305508..2bc112f97a 100644 --- a/keyboards/hardwareabstraction/handwire/keyboard.json +++ b/keyboards/hardwareabstraction/handwire/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/heliar/wm1_hotswap/keyboard.json b/keyboards/heliar/wm1_hotswap/keyboard.json index 748c2c5353..d87ce22229 100644 --- a/keyboards/heliar/wm1_hotswap/keyboard.json +++ b/keyboards/heliar/wm1_hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/heliotrope/keyboard.json b/keyboards/heliotrope/keyboard.json index c1701b07b2..26416832c5 100644 --- a/keyboards/heliotrope/keyboard.json +++ b/keyboards/heliotrope/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hfdkb/ac001/keyboard.json b/keyboards/hfdkb/ac001/keyboard.json index 4317f7071d..8d96cad375 100644 --- a/keyboards/hfdkb/ac001/keyboard.json +++ b/keyboards/hfdkb/ac001/keyboard.json @@ -22,7 +22,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/hhkb_lite_2/keyboard.json b/keyboards/hhkb_lite_2/keyboard.json index f9315e8c83..f4d94f0ffa 100644 --- a/keyboards/hhkb_lite_2/keyboard.json +++ b/keyboards/hhkb_lite_2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hidtech/bastyl/keyboard.json b/keyboards/hidtech/bastyl/keyboard.json index 77f27cf8e6..3bad155695 100644 --- a/keyboards/hidtech/bastyl/keyboard.json +++ b/keyboards/hidtech/bastyl/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hifumi/keyboard.json b/keyboards/hifumi/keyboard.json index 1da0a7a3e0..320c14a2be 100644 --- a/keyboards/hifumi/keyboard.json +++ b/keyboards/hifumi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/hineybush/h08_ocelot/keyboard.json b/keyboards/hineybush/h08_ocelot/keyboard.json index 69ef5d2280..78fcfae311 100644 --- a/keyboards/hineybush/h08_ocelot/keyboard.json +++ b/keyboards/hineybush/h08_ocelot/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hineybush/h101/keyboard.json b/keyboards/hineybush/h101/keyboard.json index 9264897399..de36c40962 100644 --- a/keyboards/hineybush/h101/keyboard.json +++ b/keyboards/hineybush/h101/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/h60/keyboard.json b/keyboards/hineybush/h60/keyboard.json index 53fd5175a1..d3db3d4c25 100644 --- a/keyboards/hineybush/h60/keyboard.json +++ b/keyboards/hineybush/h60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/hineybush/h65/keyboard.json b/keyboards/hineybush/h65/keyboard.json index 838c005bea..b0beed6aeb 100644 --- a/keyboards/hineybush/h65/keyboard.json +++ b/keyboards/hineybush/h65/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h65_hotswap/keyboard.json b/keyboards/hineybush/h65_hotswap/keyboard.json index 9293702975..b2a3876741 100644 --- a/keyboards/hineybush/h65_hotswap/keyboard.json +++ b/keyboards/hineybush/h65_hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h660s/keyboard.json b/keyboards/hineybush/h660s/keyboard.json index c5e28561aa..26693ec1ea 100644 --- a/keyboards/hineybush/h660s/keyboard.json +++ b/keyboards/hineybush/h660s/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h75_singa/keyboard.json b/keyboards/hineybush/h75_singa/keyboard.json index c819d51492..f9545d9ea1 100644 --- a/keyboards/hineybush/h75_singa/keyboard.json +++ b/keyboards/hineybush/h75_singa/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h87_g2/keyboard.json b/keyboards/hineybush/h87_g2/keyboard.json index 8d70fd2e3d..2749b5ad4e 100644 --- a/keyboards/hineybush/h87_g2/keyboard.json +++ b/keyboards/hineybush/h87_g2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/h87a/keyboard.json b/keyboards/hineybush/h87a/keyboard.json index 67734ea87d..2048ae6b28 100644 --- a/keyboards/hineybush/h87a/keyboard.json +++ b/keyboards/hineybush/h87a/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h88/keyboard.json b/keyboards/hineybush/h88/keyboard.json index d8cceb2e48..87a47bc35b 100644 --- a/keyboards/hineybush/h88/keyboard.json +++ b/keyboards/hineybush/h88/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/h88_g2/keyboard.json b/keyboards/hineybush/h88_g2/keyboard.json index f4e19247b4..a436bb1bed 100644 --- a/keyboards/hineybush/h88_g2/keyboard.json +++ b/keyboards/hineybush/h88_g2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hineybush/ibis/keyboard.json b/keyboards/hineybush/ibis/keyboard.json index bc8069d74d..1dd57647c2 100644 --- a/keyboards/hineybush/ibis/keyboard.json +++ b/keyboards/hineybush/ibis/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/hineybush/physix/keyboard.json b/keyboards/hineybush/physix/keyboard.json index cbe073d2d3..695a25bb6a 100644 --- a/keyboards/hineybush/physix/keyboard.json +++ b/keyboards/hineybush/physix/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/hineybush/sm68/keyboard.json b/keyboards/hineybush/sm68/keyboard.json index 3224a7906f..05d3505cc7 100644 --- a/keyboards/hineybush/sm68/keyboard.json +++ b/keyboards/hineybush/sm68/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/holyswitch/lightweight65/keyboard.json b/keyboards/holyswitch/lightweight65/keyboard.json index 237b40d447..9acefba190 100644 --- a/keyboards/holyswitch/lightweight65/keyboard.json +++ b/keyboards/holyswitch/lightweight65/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "layout_aliases": { diff --git a/keyboards/holyswitch/southpaw75/keyboard.json b/keyboards/holyswitch/southpaw75/keyboard.json index 3215c525a0..86f1e14c21 100644 --- a/keyboards/holyswitch/southpaw75/keyboard.json +++ b/keyboards/holyswitch/southpaw75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/horizon/keyboard.json b/keyboards/horizon/keyboard.json index 0fea8cb74c..8dabea33a3 100644 --- a/keyboards/horizon/keyboard.json +++ b/keyboards/horizon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json b/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json index 2ec09c45c8..84e78251ee 100644 --- a/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json +++ b/keyboards/horrortroll/caticorn/rev1/hotswap/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "community_layouts": ["tkl_f13_ansi"], diff --git a/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json b/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json index 673c13b382..542c458c82 100644 --- a/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json +++ b/keyboards/horrortroll/caticorn/rev1/solder/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "community_layouts": ["tkl_ansi", "tkl_ansi_split_bs_rshift", "tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift", "tkl_f13_ansi", "tkl_f13_ansi_split_bs_rshift", "tkl_f13_ansi_tsangan", "tkl_f13_ansi_tsangan_split_bs_rshift", "tkl_iso", "tkl_iso_split_bs_rshift", "tkl_iso_tsangan", "tkl_iso_tsangan_split_bs_rshift", "tkl_f13_iso", "tkl_f13_iso_split_bs_rshift", "tkl_f13_iso_tsangan", "tkl_f13_iso_tsangan_split_bs_rshift"], diff --git a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json index 18405f251f..c0946cf3a6 100644 --- a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json index d157fca7be..f10703ab5a 100644 --- a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json @@ -59,7 +59,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/horrortroll/nyx/rev1/keyboard.json b/keyboards/horrortroll/nyx/rev1/keyboard.json index 2e2d3a0243..c8a297176b 100644 --- a/keyboards/horrortroll/nyx/rev1/keyboard.json +++ b/keyboards/horrortroll/nyx/rev1/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/horrortroll/paws60/keyboard.json b/keyboards/horrortroll/paws60/keyboard.json index edf59c6ef9..da03d362f9 100644 --- a/keyboards/horrortroll/paws60/keyboard.json +++ b/keyboards/horrortroll/paws60/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/hotdox76v2/keyboard.json b/keyboards/hotdox76v2/keyboard.json index a2957b2177..8881670b56 100644 --- a/keyboards/hotdox76v2/keyboard.json +++ b/keyboards/hotdox76v2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hp69/keyboard.json b/keyboards/hp69/keyboard.json index f0f079a0ac..1ffad8894d 100644 --- a/keyboards/hp69/keyboard.json +++ b/keyboards/hp69/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/hubble/keyboard.json b/keyboards/hubble/keyboard.json index 15f729e5c2..6f586f2edb 100644 --- a/keyboards/hubble/keyboard.json +++ b/keyboards/hubble/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/huytbt/h50/keyboard.json b/keyboards/huytbt/h50/keyboard.json index d36d18d4b8..05dd812205 100644 --- a/keyboards/huytbt/h50/keyboard.json +++ b/keyboards/huytbt/h50/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ianklug/grooveboard/keyboard.json b/keyboards/ianklug/grooveboard/keyboard.json index a974d172e0..508ed1894f 100644 --- a/keyboards/ianklug/grooveboard/keyboard.json +++ b/keyboards/ianklug/grooveboard/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ibm/model_m/ashpil_usbc/keyboard.json b/keyboards/ibm/model_m/ashpil_usbc/keyboard.json index c410216610..3bf1069fd1 100644 --- a/keyboards/ibm/model_m/ashpil_usbc/keyboard.json +++ b/keyboards/ibm/model_m/ashpil_usbc/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/modelh/keyboard.json b/keyboards/ibm/model_m/modelh/keyboard.json index 0f2f858076..7d39b5de45 100644 --- a/keyboards/ibm/model_m/modelh/keyboard.json +++ b/keyboards/ibm/model_m/modelh/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/teensy2/keyboard.json b/keyboards/ibm/model_m/teensy2/keyboard.json index 297e422fd1..fac1d42ebe 100644 --- a/keyboards/ibm/model_m/teensy2/keyboard.json +++ b/keyboards/ibm/model_m/teensy2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/ibm/model_m/yugo_m/keyboard.json b/keyboards/ibm/model_m/yugo_m/keyboard.json index a05ae6feff..aee2f9720a 100644 --- a/keyboards/ibm/model_m/yugo_m/keyboard.json +++ b/keyboards/ibm/model_m/yugo_m/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ibnuda/alicia_cook/keyboard.json b/keyboards/ibnuda/alicia_cook/keyboard.json index c83a5b43d3..ba9e22f63b 100644 --- a/keyboards/ibnuda/alicia_cook/keyboard.json +++ b/keyboards/ibnuda/alicia_cook/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/ibnuda/gurindam/keyboard.json b/keyboards/ibnuda/gurindam/keyboard.json index e2693b7f21..f136c8ecb2 100644 --- a/keyboards/ibnuda/gurindam/keyboard.json +++ b/keyboards/ibnuda/gurindam/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/icebreaker/hotswap/keyboard.json b/keyboards/icebreaker/hotswap/keyboard.json index 29daba253c..b6e5c1d1ac 100644 --- a/keyboards/icebreaker/hotswap/keyboard.json +++ b/keyboards/icebreaker/hotswap/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/idank/sweeq/keyboard.json b/keyboards/idank/sweeq/keyboard.json index 36a9ceeb12..3bed772467 100644 --- a/keyboards/idank/sweeq/keyboard.json +++ b/keyboards/idank/sweeq/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/idb/idb_60/keyboard.json b/keyboards/idb/idb_60/keyboard.json index e739a2dbf4..1c4b486fb8 100644 --- a/keyboards/idb/idb_60/keyboard.json +++ b/keyboards/idb/idb_60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/idobao/id42/keyboard.json b/keyboards/idobao/id42/keyboard.json index 9689356400..2b075a7ba1 100644 --- a/keyboards/idobao/id42/keyboard.json +++ b/keyboards/idobao/id42/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/idobao/id61/keyboard.json b/keyboards/idobao/id61/keyboard.json index b712d276f2..d3bf62c726 100644 --- a/keyboards/idobao/id61/keyboard.json +++ b/keyboards/idobao/id61/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id63/keyboard.json b/keyboards/idobao/id63/keyboard.json index f7e5a7743a..141c1263d1 100644 --- a/keyboards/idobao/id63/keyboard.json +++ b/keyboards/idobao/id63/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id67/keyboard.json b/keyboards/idobao/id67/keyboard.json index f4cc52495c..786ed39be0 100644 --- a/keyboards/idobao/id67/keyboard.json +++ b/keyboards/idobao/id67/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/idobao/id75/v1/keyboard.json b/keyboards/idobao/id75/v1/keyboard.json index ed3cae1305..d49724e1b4 100644 --- a/keyboards/idobao/id75/v1/keyboard.json +++ b/keyboards/idobao/id75/v1/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/idobao/id75/v2/keyboard.json b/keyboards/idobao/id75/v2/keyboard.json index 053ea68f60..743c7cf404 100644 --- a/keyboards/idobao/id75/v2/keyboard.json +++ b/keyboards/idobao/id75/v2/keyboard.json @@ -51,7 +51,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/idobao/id80/v2/info.json b/keyboards/idobao/id80/v2/info.json index 6f063fe32b..81f895e929 100644 --- a/keyboards/idobao/id80/v2/info.json +++ b/keyboards/idobao/id80/v2/info.json @@ -49,7 +49,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "backlight": true, "rgblight": true diff --git a/keyboards/idobao/id80/v3/ansi/keyboard.json b/keyboards/idobao/id80/v3/ansi/keyboard.json index 03d54f5e30..0ab369fb5d 100644 --- a/keyboards/idobao/id80/v3/ansi/keyboard.json +++ b/keyboards/idobao/id80/v3/ansi/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/idobao/id87/v1/keyboard.json b/keyboards/idobao/id87/v1/keyboard.json index 854f345616..e7ce655161 100644 --- a/keyboards/idobao/id87/v1/keyboard.json +++ b/keyboards/idobao/id87/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/id87/v2/keyboard.json b/keyboards/idobao/id87/v2/keyboard.json index f21fd70b7b..ad6641f954 100644 --- a/keyboards/idobao/id87/v2/keyboard.json +++ b/keyboards/idobao/id87/v2/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/idobao/id96/keyboard.json b/keyboards/idobao/id96/keyboard.json index abd9b61958..d8c446dd5d 100644 --- a/keyboards/idobao/id96/keyboard.json +++ b/keyboards/idobao/id96/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/montex/v1/keyboard.json b/keyboards/idobao/montex/v1/keyboard.json index cbece8a392..52a53021ba 100644 --- a/keyboards/idobao/montex/v1/keyboard.json +++ b/keyboards/idobao/montex/v1/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idobao/montex/v1rgb/keyboard.json b/keyboards/idobao/montex/v1rgb/keyboard.json index 58369f7169..1c5252bbea 100755 --- a/keyboards/idobao/montex/v1rgb/keyboard.json +++ b/keyboards/idobao/montex/v1rgb/keyboard.json @@ -37,7 +37,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/idobao/montex/v2/keyboard.json b/keyboards/idobao/montex/v2/keyboard.json index 27f6c02d76..319f46a459 100755 --- a/keyboards/idobao/montex/v2/keyboard.json +++ b/keyboards/idobao/montex/v2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/idyllic/tinny50_rgb/keyboard.json b/keyboards/idyllic/tinny50_rgb/keyboard.json index f7bd204567..4d3cd320dd 100644 --- a/keyboards/idyllic/tinny50_rgb/keyboard.json +++ b/keyboards/idyllic/tinny50_rgb/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/igloo/keyboard.json b/keyboards/igloo/keyboard.json index ceb7a03a75..546b26131d 100644 --- a/keyboards/igloo/keyboard.json +++ b/keyboards/igloo/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ilumkb/primus75/keyboard.json b/keyboards/ilumkb/primus75/keyboard.json index 4441187254..6a6a166fc4 100644 --- a/keyboards/ilumkb/primus75/keyboard.json +++ b/keyboards/ilumkb/primus75/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ilumkb/volcano660/keyboard.json b/keyboards/ilumkb/volcano660/keyboard.json index 616098da01..0a42910c86 100644 --- a/keyboards/ilumkb/volcano660/keyboard.json +++ b/keyboards/ilumkb/volcano660/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/inett_studio/sqx/hotswap/keyboard.json b/keyboards/inett_studio/sqx/hotswap/keyboard.json index f4b1bcc4ce..0c28be4582 100644 --- a/keyboards/inett_studio/sqx/hotswap/keyboard.json +++ b/keyboards/inett_studio/sqx/hotswap/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/inett_studio/sqx/universal/keyboard.json b/keyboards/inett_studio/sqx/universal/keyboard.json index 7f27ca0cc9..2c2b03bd0d 100644 --- a/keyboards/inett_studio/sqx/universal/keyboard.json +++ b/keyboards/inett_studio/sqx/universal/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/inland/mk47/keyboard.json b/keyboards/inland/mk47/keyboard.json index a15701db26..a69ec2ac4a 100644 --- a/keyboards/inland/mk47/keyboard.json +++ b/keyboards/inland/mk47/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/inland/v83p/keyboard.json b/keyboards/inland/v83p/keyboard.json index 96b6cd9551..5fad1a96d4 100644 --- a/keyboards/inland/v83p/keyboard.json +++ b/keyboards/inland/v83p/keyboard.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/input_club/k_type/keyboard.json b/keyboards/input_club/k_type/keyboard.json index cc93783dc9..ed004335c0 100644 --- a/keyboards/input_club/k_type/keyboard.json +++ b/keyboards/input_club/k_type/keyboard.json @@ -57,7 +57,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": true diff --git a/keyboards/io_mini1800/keyboard.json b/keyboards/io_mini1800/keyboard.json index d0333c75cf..be8bd11d6c 100644 --- a/keyboards/io_mini1800/keyboard.json +++ b/keyboards/io_mini1800/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/irene/keyboard.json b/keyboards/irene/keyboard.json index 7844a66377..a2fcc39090 100644 --- a/keyboards/irene/keyboard.json +++ b/keyboards/irene/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/iriskeyboards/keyboard.json b/keyboards/iriskeyboards/keyboard.json index b8c5195ae9..f37f2064c5 100644 --- a/keyboards/iriskeyboards/keyboard.json +++ b/keyboards/iriskeyboards/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/itstleo/itstleo40/keyboard.json b/keyboards/itstleo/itstleo40/keyboard.json index 10ffa78e07..ff55e3b0ce 100644 --- a/keyboards/itstleo/itstleo40/keyboard.json +++ b/keyboards/itstleo/itstleo40/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "leader": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json b/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json index d96d52514e..3e10d732c5 100644 --- a/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json +++ b/keyboards/jacky_studio/s7_elephant/rev1/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json b/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json index c6c5ef06c5..b236301e38 100644 --- a/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json +++ b/keyboards/jacky_studio/s7_elephant/rev2/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/jadookb/jkb65/info.json b/keyboards/jadookb/jkb65/info.json index 527016499c..ef62e8e2ea 100644 --- a/keyboards/jadookb/jkb65/info.json +++ b/keyboards/jadookb/jkb65/info.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/janus/keyboard.json b/keyboards/janus/keyboard.json index c50b5ef19a..4a82149712 100644 --- a/keyboards/janus/keyboard.json +++ b/keyboards/janus/keyboard.json @@ -18,7 +18,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/aumz_work/info.json b/keyboards/jaykeeb/aumz_work/info.json index 2b85958486..e6922255fc 100644 --- a/keyboards/jaykeeb/aumz_work/info.json +++ b/keyboards/jaykeeb/aumz_work/info.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/jk60/keyboard.json b/keyboards/jaykeeb/jk60/keyboard.json index 7d0aff2dfd..9f94100b5f 100644 --- a/keyboards/jaykeeb/jk60/keyboard.json +++ b/keyboards/jaykeeb/jk60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/jk60rgb/keyboard.json b/keyboards/jaykeeb/jk60rgb/keyboard.json index 1bcbbf0561..019fa5c88c 100644 --- a/keyboards/jaykeeb/jk60rgb/keyboard.json +++ b/keyboards/jaykeeb/jk60rgb/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/jk65/keyboard.json b/keyboards/jaykeeb/jk65/keyboard.json index 484e449b26..02b45e1ba7 100644 --- a/keyboards/jaykeeb/jk65/keyboard.json +++ b/keyboards/jaykeeb/jk65/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/joker/keyboard.json b/keyboards/jaykeeb/joker/keyboard.json index 82df51cbbf..b35c8c5830 100644 --- a/keyboards/jaykeeb/joker/keyboard.json +++ b/keyboards/jaykeeb/joker/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/kamigakushi/keyboard.json b/keyboards/jaykeeb/kamigakushi/keyboard.json index b901171310..b66c5e670d 100644 --- a/keyboards/jaykeeb/kamigakushi/keyboard.json +++ b/keyboards/jaykeeb/kamigakushi/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/orba/keyboard.json b/keyboards/jaykeeb/orba/keyboard.json index 4af3d6a9c2..f803ebb7c4 100644 --- a/keyboards/jaykeeb/orba/keyboard.json +++ b/keyboards/jaykeeb/orba/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/sebelas/keyboard.json b/keyboards/jaykeeb/sebelas/keyboard.json index d07889fc4f..c31b93aeeb 100644 --- a/keyboards/jaykeeb/sebelas/keyboard.json +++ b/keyboards/jaykeeb/sebelas/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/skyline/keyboard.json b/keyboards/jaykeeb/skyline/keyboard.json index c81c37acab..9aa8d78594 100644 --- a/keyboards/jaykeeb/skyline/keyboard.json +++ b/keyboards/jaykeeb/skyline/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/jaykeeb/sriwedari70/keyboard.json b/keyboards/jaykeeb/sriwedari70/keyboard.json index a1a548901e..efb13554dc 100644 --- a/keyboards/jaykeeb/sriwedari70/keyboard.json +++ b/keyboards/jaykeeb/sriwedari70/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jaykeeb/tokki/keyboard.json b/keyboards/jaykeeb/tokki/keyboard.json index 48a046e784..8ff2828d9e 100644 --- a/keyboards/jaykeeb/tokki/keyboard.json +++ b/keyboards/jaykeeb/tokki/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jc65/v32u4/keyboard.json b/keyboards/jc65/v32u4/keyboard.json index 4f681f2d1b..c38bc4e1ff 100644 --- a/keyboards/jc65/v32u4/keyboard.json +++ b/keyboards/jc65/v32u4/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jd40/keyboard.json b/keyboards/jd40/keyboard.json index 22badb3508..b8a363f298 100644 --- a/keyboards/jd40/keyboard.json +++ b/keyboards/jd40/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jels/boaty/keyboard.json b/keyboards/jels/boaty/keyboard.json index 3e02a2d9ce..4fd622d5b0 100644 --- a/keyboards/jels/boaty/keyboard.json +++ b/keyboards/jels/boaty/keyboard.json @@ -13,8 +13,7 @@ "bootmagic": true, "nkro": false, "mousekey": false, - "extrakey": true, - "command": false + "extrakey": true }, "qmk": { "locking": { diff --git a/keyboards/jels/jels60/v1/keyboard.json b/keyboards/jels/jels60/v1/keyboard.json index 87a7667b3d..aabebb36f2 100644 --- a/keyboards/jels/jels60/v1/keyboard.json +++ b/keyboards/jels/jels60/v1/keyboard.json @@ -10,7 +10,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false }, "qmk": { diff --git a/keyboards/jels/jels60/v2/keyboard.json b/keyboards/jels/jels60/v2/keyboard.json index 9d8de45cb9..749f9db1d8 100644 --- a/keyboards/jels/jels60/v2/keyboard.json +++ b/keyboards/jels/jels60/v2/keyboard.json @@ -5,7 +5,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false }, "qmk": { diff --git a/keyboards/jels/jels88/keyboard.json b/keyboards/jels/jels88/keyboard.json index aa71b5692d..d9d6d10c24 100644 --- a/keyboards/jels/jels88/keyboard.json +++ b/keyboards/jels/jels88/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/jkdlab/binary_monkey/keyboard.json b/keyboards/jkdlab/binary_monkey/keyboard.json index 43ba02e3d5..a9c9fabe93 100644 --- a/keyboards/jkdlab/binary_monkey/keyboard.json +++ b/keyboards/jkdlab/binary_monkey/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/jkeys_design/gentleman65/keyboard.json b/keyboards/jkeys_design/gentleman65/keyboard.json index 5f4019a5aa..6ccabe45ef 100644 --- a/keyboards/jkeys_design/gentleman65/keyboard.json +++ b/keyboards/jkeys_design/gentleman65/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jkeys_design/gentleman65_se_s/keyboard.json b/keyboards/jkeys_design/gentleman65_se_s/keyboard.json index 7b1d10ce43..582ce4aad9 100644 --- a/keyboards/jkeys_design/gentleman65_se_s/keyboard.json +++ b/keyboards/jkeys_design/gentleman65_se_s/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jolofsor/denial75/keyboard.json b/keyboards/jolofsor/denial75/keyboard.json index f2e8216c21..69782a93d8 100644 --- a/keyboards/jolofsor/denial75/keyboard.json +++ b/keyboards/jolofsor/denial75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/joshajohnson/hub20/keyboard.json b/keyboards/joshajohnson/hub20/keyboard.json index d374e2f404..0d557c58b5 100644 --- a/keyboards/joshajohnson/hub20/keyboard.json +++ b/keyboards/joshajohnson/hub20/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/jukaie/jk01/keyboard.json b/keyboards/jukaie/jk01/keyboard.json index 452d9bf5fa..6e103a46c9 100644 --- a/keyboards/jukaie/jk01/keyboard.json +++ b/keyboards/jukaie/jk01/keyboard.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/k34/keyboard.json b/keyboards/k34/keyboard.json index 205382cff6..84e65978b3 100644 --- a/keyboards/k34/keyboard.json +++ b/keyboards/k34/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kabedon/kabedon78s/keyboard.json b/keyboards/kabedon/kabedon78s/keyboard.json index dc3ea77791..49bb57fd38 100644 --- a/keyboards/kabedon/kabedon78s/keyboard.json +++ b/keyboards/kabedon/kabedon78s/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kabedon/kabedon980/keyboard.json b/keyboards/kabedon/kabedon980/keyboard.json index 4209a04fd0..af8c2bcea2 100644 --- a/keyboards/kabedon/kabedon980/keyboard.json +++ b/keyboards/kabedon/kabedon980/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kabedon/kabedon98e/keyboard.json b/keyboards/kabedon/kabedon98e/keyboard.json index 3684248ddd..731c03dd74 100644 --- a/keyboards/kabedon/kabedon98e/keyboard.json +++ b/keyboards/kabedon/kabedon98e/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kagizaraya/halberd/keyboard.json b/keyboards/kagizaraya/halberd/keyboard.json index bf30654d08..3e39ab8aa1 100644 --- a/keyboards/kagizaraya/halberd/keyboard.json +++ b/keyboards/kagizaraya/halberd/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kagizaraya/miniaxe/keyboard.json b/keyboards/kagizaraya/miniaxe/keyboard.json index e568cf6eff..4e2658fd37 100644 --- a/keyboards/kagizaraya/miniaxe/keyboard.json +++ b/keyboards/kagizaraya/miniaxe/keyboard.json @@ -37,7 +37,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json index de6adc8529..dce62c64d8 100644 --- a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json +++ b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kalakos/bahrnob/keyboard.json b/keyboards/kalakos/bahrnob/keyboard.json index a3a559b8ce..988fae4ba4 100644 --- a/keyboards/kalakos/bahrnob/keyboard.json +++ b/keyboards/kalakos/bahrnob/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "encoder": true }, diff --git a/keyboards/kaly/kaly42/keyboard.json b/keyboards/kaly/kaly42/keyboard.json index 15a4fc6b5b..c19835b90d 100644 --- a/keyboards/kaly/kaly42/keyboard.json +++ b/keyboards/kaly/kaly42/keyboard.json @@ -5,7 +5,6 @@ "development_board": "blackpill_f401", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kapcave/arya/keyboard.json b/keyboards/kapcave/arya/keyboard.json index a3893b44b2..c1549dd93b 100644 --- a/keyboards/kapcave/arya/keyboard.json +++ b/keyboards/kapcave/arya/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/kapcave/gskt00/keyboard.json b/keyboards/kapcave/gskt00/keyboard.json index 0d2fd292c6..e48480d9c4 100644 --- a/keyboards/kapcave/gskt00/keyboard.json +++ b/keyboards/kapcave/gskt00/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kapcave/paladin64/keyboard.json b/keyboards/kapcave/paladin64/keyboard.json index 6fdd64a500..afd226fb9c 100644 --- a/keyboards/kapcave/paladin64/keyboard.json +++ b/keyboards/kapcave/paladin64/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kapcave/paladinpad/info.json b/keyboards/kapcave/paladinpad/info.json index 678f094524..346f6ad730 100644 --- a/keyboards/kapcave/paladinpad/info.json +++ b/keyboards/kapcave/paladinpad/info.json @@ -5,7 +5,6 @@ "maintainer": "nachie", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/karn/keyboard.json b/keyboards/karn/keyboard.json index 1c2c3a4301..cd680af65b 100644 --- a/keyboards/karn/keyboard.json +++ b/keyboards/karn/keyboard.json @@ -4,7 +4,6 @@ "maintainer": "robcmills", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kb_elmo/67mk_e/keyboard.json b/keyboards/kb_elmo/67mk_e/keyboard.json index a2c747d61f..48e3e894f6 100644 --- a/keyboards/kb_elmo/67mk_e/keyboard.json +++ b/keyboards/kb_elmo/67mk_e/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kb_elmo/noah_avr/keyboard.json b/keyboards/kb_elmo/noah_avr/keyboard.json index 918adbdd37..0955a73edc 100644 --- a/keyboards/kb_elmo/noah_avr/keyboard.json +++ b/keyboards/kb_elmo/noah_avr/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kb_elmo/qez/keyboard.json b/keyboards/kb_elmo/qez/keyboard.json index cefc2e1b51..0b291f95a5 100644 --- a/keyboards/kb_elmo/qez/keyboard.json +++ b/keyboards/kb_elmo/qez/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kb_elmo/vertex/keyboard.json b/keyboards/kb_elmo/vertex/keyboard.json index b3562e9315..5032670e3f 100644 --- a/keyboards/kb_elmo/vertex/keyboard.json +++ b/keyboards/kb_elmo/vertex/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kbdcraft/adam64/keyboard.json b/keyboards/kbdcraft/adam64/keyboard.json index 19e22c37cc..489dc8f6b5 100644 --- a/keyboards/kbdcraft/adam64/keyboard.json +++ b/keyboards/kbdcraft/adam64/keyboard.json @@ -20,7 +20,6 @@ "mousekey": true, "extrakey": true, "nkro": true, - "command": false, "rgb_matrix": true }, "rgb_matrix": { diff --git a/keyboards/kbdfans/baguette66/rgb/keyboard.json b/keyboards/kbdfans/baguette66/rgb/keyboard.json index 1ca4fefb4b..5955add028 100644 --- a/keyboards/kbdfans/baguette66/rgb/keyboard.json +++ b/keyboards/kbdfans/baguette66/rgb/keyboard.json @@ -66,7 +66,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/baguette66/soldered/keyboard.json b/keyboards/kbdfans/baguette66/soldered/keyboard.json index 45b744cd66..fb05dde2ac 100644 --- a/keyboards/kbdfans/baguette66/soldered/keyboard.json +++ b/keyboards/kbdfans/baguette66/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/kbdfans/bella/soldered/keyboard.json b/keyboards/kbdfans/bella/soldered/keyboard.json index cbecfa6056..d6bb586f9b 100644 --- a/keyboards/kbdfans/bella/soldered/keyboard.json +++ b/keyboards/kbdfans/bella/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/boop65/rgb/keyboard.json b/keyboards/kbdfans/boop65/rgb/keyboard.json index 5fd5585844..4a051c9112 100644 --- a/keyboards/kbdfans/boop65/rgb/keyboard.json +++ b/keyboards/kbdfans/boop65/rgb/keyboard.json @@ -63,7 +63,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/bounce/75/hotswap/keyboard.json b/keyboards/kbdfans/bounce/75/hotswap/keyboard.json index 592ba0de52..b67719cbd3 100644 --- a/keyboards/kbdfans/bounce/75/hotswap/keyboard.json +++ b/keyboards/kbdfans/bounce/75/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/bounce/75/soldered/keyboard.json b/keyboards/kbdfans/bounce/75/soldered/keyboard.json index c82833d700..b6ef0a29a8 100644 --- a/keyboards/kbdfans/bounce/75/soldered/keyboard.json +++ b/keyboards/kbdfans/bounce/75/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/d45/v2/keyboard.json b/keyboards/kbdfans/d45/v2/keyboard.json index 95211e097b..a463e19c13 100644 --- a/keyboards/kbdfans/d45/v2/keyboard.json +++ b/keyboards/kbdfans/d45/v2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/epoch80/keyboard.json b/keyboards/kbdfans/epoch80/keyboard.json index 6e7ce41653..0f0bcdb544 100644 --- a/keyboards/kbdfans/epoch80/keyboard.json +++ b/keyboards/kbdfans/epoch80/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kbdfans/kbd19x/keyboard.json b/keyboards/kbdfans/kbd19x/keyboard.json index cd57436a11..b5f4673060 100644 --- a/keyboards/kbdfans/kbd19x/keyboard.json +++ b/keyboards/kbdfans/kbd19x/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json index e2efb6287b..f55a649f43 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v1/keyboard.json @@ -44,7 +44,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json index b43d634404..916ee0f33a 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v2/keyboard.json @@ -41,7 +41,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json b/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json index 719d5d3d83..ed47182ae5 100644 --- a/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json +++ b/keyboards/kbdfans/kbd67/mkiirgb/v4/keyboard.json @@ -60,7 +60,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/kbd67/rev2/keyboard.json b/keyboards/kbdfans/kbd67/rev2/keyboard.json index 118da461b6..bbfbdd6257 100644 --- a/keyboards/kbdfans/kbd67/rev2/keyboard.json +++ b/keyboards/kbdfans/kbd67/rev2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd6x/keyboard.json b/keyboards/kbdfans/kbd6x/keyboard.json index e603cb64ff..ed63da9886 100644 --- a/keyboards/kbdfans/kbd6x/keyboard.json +++ b/keyboards/kbdfans/kbd6x/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/kbdfans/kbd75hs/keyboard.json b/keyboards/kbdfans/kbd75hs/keyboard.json index dca52de53d..cba3e17e9a 100644 --- a/keyboards/kbdfans/kbd75hs/keyboard.json +++ b/keyboards/kbdfans/kbd75hs/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbd75rgb/keyboard.json b/keyboards/kbdfans/kbd75rgb/keyboard.json index 1076626ec7..6a69d78c03 100644 --- a/keyboards/kbdfans/kbd75rgb/keyboard.json +++ b/keyboards/kbdfans/kbd75rgb/keyboard.json @@ -69,7 +69,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/kbdmini/keyboard.json b/keyboards/kbdfans/kbdmini/keyboard.json index 3cc5a73d17..97edf073e6 100644 --- a/keyboards/kbdfans/kbdmini/keyboard.json +++ b/keyboards/kbdfans/kbdmini/keyboard.json @@ -41,7 +41,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/kbdpad/mk1/keyboard.json b/keyboards/kbdfans/kbdpad/mk1/keyboard.json index 0fa231c303..ce9bf7cde5 100644 --- a/keyboards/kbdfans/kbdpad/mk1/keyboard.json +++ b/keyboards/kbdfans/kbdpad/mk1/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kbdfans/kbdpad/mk3/keyboard.json b/keyboards/kbdfans/kbdpad/mk3/keyboard.json index 726a8c7a08..2fad479bad 100644 --- a/keyboards/kbdfans/kbdpad/mk3/keyboard.json +++ b/keyboards/kbdfans/kbdpad/mk3/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/maja/keyboard.json b/keyboards/kbdfans/maja/keyboard.json index 91c8aec845..949dd09fe2 100644 --- a/keyboards/kbdfans/maja/keyboard.json +++ b/keyboards/kbdfans/maja/keyboard.json @@ -46,7 +46,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/maja_soldered/keyboard.json b/keyboards/kbdfans/maja_soldered/keyboard.json index 5864cc445d..5c6e13efef 100644 --- a/keyboards/kbdfans/maja_soldered/keyboard.json +++ b/keyboards/kbdfans/maja_soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/odin/rgb/keyboard.json b/keyboards/kbdfans/odin/rgb/keyboard.json index aadd2cb29f..1fb5a833ec 100644 --- a/keyboards/kbdfans/odin/rgb/keyboard.json +++ b/keyboards/kbdfans/odin/rgb/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/odin/soldered/keyboard.json b/keyboards/kbdfans/odin/soldered/keyboard.json index 60a5c0d3a3..1f2fbff5d0 100644 --- a/keyboards/kbdfans/odin/soldered/keyboard.json +++ b/keyboards/kbdfans/odin/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kbdfans/odin/v2/keyboard.json b/keyboards/kbdfans/odin/v2/keyboard.json index 9136aae1e3..88a133ce70 100644 --- a/keyboards/kbdfans/odin/v2/keyboard.json +++ b/keyboards/kbdfans/odin/v2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/odin75/keyboard.json b/keyboards/kbdfans/odin75/keyboard.json index a5a6a51aa6..2bc63d7561 100644 --- a/keyboards/kbdfans/odin75/keyboard.json +++ b/keyboards/kbdfans/odin75/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/odinmini/keyboard.json b/keyboards/kbdfans/odinmini/keyboard.json index 34002e83d8..e5d43d278a 100644 --- a/keyboards/kbdfans/odinmini/keyboard.json +++ b/keyboards/kbdfans/odinmini/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbdfans/phaseone/keyboard.json b/keyboards/kbdfans/phaseone/keyboard.json index 35ce8ab42a..1c6894cc8e 100644 --- a/keyboards/kbdfans/phaseone/keyboard.json +++ b/keyboards/kbdfans/phaseone/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kbdfans/tiger80/keyboard.json b/keyboards/kbdfans/tiger80/keyboard.json index 66be74d610..a507c5c682 100644 --- a/keyboards/kbdfans/tiger80/keyboard.json +++ b/keyboards/kbdfans/tiger80/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kbnordic/nordic60/rev_a/keyboard.json b/keyboards/kbnordic/nordic60/rev_a/keyboard.json index 711b0d5312..f9b0fcafba 100644 --- a/keyboards/kbnordic/nordic60/rev_a/keyboard.json +++ b/keyboards/kbnordic/nordic60/rev_a/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kbnordic/nordic65/rev_a/keyboard.json b/keyboards/kbnordic/nordic65/rev_a/keyboard.json index f636b0ca4e..a8bee1f378 100644 --- a/keyboards/kbnordic/nordic65/rev_a/keyboard.json +++ b/keyboards/kbnordic/nordic65/rev_a/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "stm32-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/kc60se/keyboard.json b/keyboards/kc60se/keyboard.json index e265667f07..76a715f589 100644 --- a/keyboards/kc60se/keyboard.json +++ b/keyboards/kc60se/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/keebio/bamfk4/keyboard.json b/keyboards/keebio/bamfk4/keyboard.json index 829395d671..08b3900766 100644 --- a/keyboards/keebio/bamfk4/keyboard.json +++ b/keyboards/keebio/bamfk4/keyboard.json @@ -80,7 +80,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/bigswitchseat/keyboard.json b/keyboards/keebio/bigswitchseat/keyboard.json index 3d6ce65bde..d6cf6b3799 100644 --- a/keyboards/keebio/bigswitchseat/keyboard.json +++ b/keyboards/keebio/bigswitchseat/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/cepstrum/info.json b/keyboards/keebio/cepstrum/info.json index 250b886d8b..cb41e89ff6 100644 --- a/keyboards/keebio/cepstrum/info.json +++ b/keyboards/keebio/cepstrum/info.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebio/convolution/info.json b/keyboards/keebio/convolution/info.json index 9ea761c1a9..5ab3a0226c 100644 --- a/keyboards/keebio/convolution/info.json +++ b/keyboards/keebio/convolution/info.json @@ -6,7 +6,6 @@ "vid": "0xCB10" }, "features": { - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/dilly/keyboard.json b/keyboards/keebio/dilly/keyboard.json index cbd3be1b1c..82a565ae62 100644 --- a/keyboards/keebio/dilly/keyboard.json +++ b/keyboards/keebio/dilly/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keebio/ergodicity/keyboard.json b/keyboards/keebio/ergodicity/keyboard.json index f1b1649f8a..6f755ba45c 100644 --- a/keyboards/keebio/ergodicity/keyboard.json +++ b/keyboards/keebio/ergodicity/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebio/iris/rev1/keyboard.json b/keyboards/keebio/iris/rev1/keyboard.json index f9c1573a15..fbccf0de84 100644 --- a/keyboards/keebio/iris/rev1/keyboard.json +++ b/keyboards/keebio/iris/rev1/keyboard.json @@ -7,7 +7,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/iris/rev1_led/keyboard.json b/keyboards/keebio/iris/rev1_led/keyboard.json index 69f14d8494..cb171fcec3 100644 --- a/keyboards/keebio/iris/rev1_led/keyboard.json +++ b/keyboards/keebio/iris/rev1_led/keyboard.json @@ -7,7 +7,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/iris/rev5/keyboard.json b/keyboards/keebio/iris/rev5/keyboard.json index cfaeecfeb2..9c7f04c786 100644 --- a/keyboards/keebio/iris/rev5/keyboard.json +++ b/keyboards/keebio/iris/rev5/keyboard.json @@ -7,7 +7,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keebio/laplace/keyboard.json b/keyboards/keebio/laplace/keyboard.json index 00609eaa12..3a2ed70905 100644 --- a/keyboards/keebio/laplace/keyboard.json +++ b/keyboards/keebio/laplace/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keebio/nyquist/rev2/keyboard.json b/keyboards/keebio/nyquist/rev2/keyboard.json index 627f0cd003..dede204981 100644 --- a/keyboards/keebio/nyquist/rev2/keyboard.json +++ b/keyboards/keebio/nyquist/rev2/keyboard.json @@ -7,7 +7,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keebio/nyquist/rev3/keyboard.json b/keyboards/keebio/nyquist/rev3/keyboard.json index b67ad820b9..bdc7be0e4e 100644 --- a/keyboards/keebio/nyquist/rev3/keyboard.json +++ b/keyboards/keebio/nyquist/rev3/keyboard.json @@ -7,7 +7,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keebio/sinc/info.json b/keyboards/keebio/sinc/info.json index 794eac6a24..87be01da9a 100644 --- a/keyboards/keebio/sinc/info.json +++ b/keyboards/keebio/sinc/info.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/keebio/stick/keyboard.json b/keyboards/keebio/stick/keyboard.json index dbd5062f74..93d78837eb 100644 --- a/keyboards/keebio/stick/keyboard.json +++ b/keyboards/keebio/stick/keyboard.json @@ -87,7 +87,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebio/tragicforce68/keyboard.json b/keyboards/keebio/tragicforce68/keyboard.json index f82e1808fb..3173ed3f50 100644 --- a/keyboards/keebio/tragicforce68/keyboard.json +++ b/keyboards/keebio/tragicforce68/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebio/wtf60/keyboard.json b/keyboards/keebio/wtf60/keyboard.json index 8947dac904..7f9dfd0dcd 100644 --- a/keyboards/keebio/wtf60/keyboard.json +++ b/keyboards/keebio/wtf60/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/keebmonkey/kbmg68/keyboard.json b/keyboards/keebmonkey/kbmg68/keyboard.json index 4de7098b2d..647f0ecf95 100644 --- a/keyboards/keebmonkey/kbmg68/keyboard.json +++ b/keyboards/keebmonkey/kbmg68/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/keebsforall/freebird60/keyboard.json b/keyboards/keebsforall/freebird60/keyboard.json index d97752753a..a57600e884 100644 --- a/keyboards/keebsforall/freebird60/keyboard.json +++ b/keyboards/keebsforall/freebird60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebsforall/freebird75/keyboard.json b/keyboards/keebsforall/freebird75/keyboard.json index 5a4d3deee9..5560d09e62 100644 --- a/keyboards/keebsforall/freebird75/keyboard.json +++ b/keyboards/keebsforall/freebird75/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keebsforall/freebirdnp/lite/keyboard.json b/keyboards/keebsforall/freebirdnp/lite/keyboard.json index 21b1aafe42..1114df98b1 100644 --- a/keyboards/keebsforall/freebirdnp/lite/keyboard.json +++ b/keyboards/keebsforall/freebirdnp/lite/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebsforall/freebirdnp/pro/keyboard.json b/keyboards/keebsforall/freebirdnp/pro/keyboard.json index 7afbcc4ca2..c6716b315a 100644 --- a/keyboards/keebsforall/freebirdnp/pro/keyboard.json +++ b/keyboards/keebsforall/freebirdnp/pro/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keebsforall/freebirdtkl/keyboard.json b/keyboards/keebsforall/freebirdtkl/keyboard.json index e58ce7ac0f..a5a2f2d3c1 100644 --- a/keyboards/keebsforall/freebirdtkl/keyboard.json +++ b/keyboards/keebsforall/freebirdtkl/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keebzdotnet/fme/keyboard.json b/keyboards/keebzdotnet/fme/keyboard.json index e850843cb1..49118c32e6 100644 --- a/keyboards/keebzdotnet/fme/keyboard.json +++ b/keyboards/keebzdotnet/fme/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keebzdotnet/wazowski/keyboard.json b/keyboards/keebzdotnet/wazowski/keyboard.json index 5e64c99180..dcf14c27f3 100644 --- a/keyboards/keebzdotnet/wazowski/keyboard.json +++ b/keyboards/keebzdotnet/wazowski/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kegen/gboy/keyboard.json b/keyboards/kegen/gboy/keyboard.json index eeba8f1d0c..a39316328f 100644 --- a/keyboards/kegen/gboy/keyboard.json +++ b/keyboards/kegen/gboy/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kelwin/utopia88/keyboard.json b/keyboards/kelwin/utopia88/keyboard.json index 86ff707be9..d73be1dd27 100644 --- a/keyboards/kelwin/utopia88/keyboard.json +++ b/keyboards/kelwin/utopia88/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/kepler_33/proto/keyboard.json b/keyboards/kepler_33/proto/keyboard.json index e4a0e85576..725700b787 100644 --- a/keyboards/kepler_33/proto/keyboard.json +++ b/keyboards/kepler_33/proto/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "stm32-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keybage/radpad/keyboard.json b/keyboards/keybage/radpad/keyboard.json index 798a3c49c3..24f84477a8 100644 --- a/keyboards/keybage/radpad/keyboard.json +++ b/keyboards/keybage/radpad/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keybee/keybee65/keyboard.json b/keyboards/keybee/keybee65/keyboard.json index 8583523f81..a2a4862836 100644 --- a/keyboards/keybee/keybee65/keyboard.json +++ b/keyboards/keybee/keybee65/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/keycapsss/3w6_2040/keyboard.json b/keyboards/keycapsss/3w6_2040/keyboard.json index e481b98894..03305c67b6 100644 --- a/keyboards/keycapsss/3w6_2040/keyboard.json +++ b/keyboards/keycapsss/3w6_2040/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keycapsss/plaid_pad/rev1/keyboard.json b/keyboards/keycapsss/plaid_pad/rev1/keyboard.json index 83fefde3e7..fd85b0cff7 100644 --- a/keyboards/keycapsss/plaid_pad/rev1/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev1/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keycapsss/plaid_pad/rev2/keyboard.json b/keyboards/keycapsss/plaid_pad/rev2/keyboard.json index 9805679c53..2e00961d9b 100644 --- a/keyboards/keycapsss/plaid_pad/rev2/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev2/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keycapsss/plaid_pad/rev3/keyboard.json b/keyboards/keycapsss/plaid_pad/rev3/keyboard.json index e00cd3a43b..49aadb2030 100644 --- a/keyboards/keycapsss/plaid_pad/rev3/keyboard.json +++ b/keyboards/keycapsss/plaid_pad/rev3/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keychron/c1_pro/info.json b/keyboards/keychron/c1_pro/info.json index 2c5f1af58f..d38a273d45 100644 --- a/keyboards/keychron/c1_pro/info.json +++ b/keyboards/keychron/c1_pro/info.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c1_pro_v2/info.json b/keyboards/keychron/c1_pro_v2/info.json index b25b5d6f88..1e6305eb33 100644 --- a/keyboards/keychron/c1_pro_v2/info.json +++ b/keyboards/keychron/c1_pro_v2/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c2_pro/info.json b/keyboards/keychron/c2_pro/info.json index 21ee1d6b2e..9c0e1ac72e 100644 --- a/keyboards/keychron/c2_pro/info.json +++ b/keyboards/keychron/c2_pro/info.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c2_pro_v2/info.json b/keyboards/keychron/c2_pro_v2/info.json index c981d9ab4b..9572c9812a 100644 --- a/keyboards/keychron/c2_pro_v2/info.json +++ b/keyboards/keychron/c2_pro_v2/info.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/c3_pro/info.json b/keyboards/keychron/c3_pro/info.json index 1e24b32ceb..24a77aae07 100644 --- a/keyboards/keychron/c3_pro/info.json +++ b/keyboards/keychron/c3_pro/info.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keychron/q0/info.json b/keyboards/keychron/q0/info.json index d5e0ba22e0..666a797411 100644 --- a/keyboards/keychron/q0/info.json +++ b/keyboards/keychron/q0/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q11/info.json b/keyboards/keychron/q11/info.json index 75274318f3..bb9a8f7d0d 100755 --- a/keyboards/keychron/q11/info.json +++ b/keyboards/keychron/q11/info.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q1v1/info.json b/keyboards/keychron/q1v1/info.json index c8db178952..b8ab503b07 100644 --- a/keyboards/keychron/q1v1/info.json +++ b/keyboards/keychron/q1v1/info.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q1v2/info.json b/keyboards/keychron/q1v2/info.json index b7b612b613..f0342254fa 100644 --- a/keyboards/keychron/q1v2/info.json +++ b/keyboards/keychron/q1v2/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q2/info.json b/keyboards/keychron/q2/info.json index 87f405cb17..c322a9902f 100644 --- a/keyboards/keychron/q2/info.json +++ b/keyboards/keychron/q2/info.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q3/info.json b/keyboards/keychron/q3/info.json index 2b8b89dc87..a08a115bb6 100644 --- a/keyboards/keychron/q3/info.json +++ b/keyboards/keychron/q3/info.json @@ -14,7 +14,6 @@ "features": { "bootmagic": true, "dip_switch": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q4/info.json b/keyboards/keychron/q4/info.json index b09d4cb790..bcbfd74217 100644 --- a/keyboards/keychron/q4/info.json +++ b/keyboards/keychron/q4/info.json @@ -18,7 +18,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keychron/q5/info.json b/keyboards/keychron/q5/info.json index 2140b8226d..1e7a5de703 100644 --- a/keyboards/keychron/q5/info.json +++ b/keyboards/keychron/q5/info.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q60/ansi/keyboard.json b/keyboards/keychron/q60/ansi/keyboard.json index a98781c9d0..83ee57d011 100644 --- a/keyboards/keychron/q60/ansi/keyboard.json +++ b/keyboards/keychron/q60/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q7/info.json b/keyboards/keychron/q7/info.json index 90dd59f3f4..663ad4b275 100644 --- a/keyboards/keychron/q7/info.json +++ b/keyboards/keychron/q7/info.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q8/info.json b/keyboards/keychron/q8/info.json index 626942c108..b0478e019b 100644 --- a/keyboards/keychron/q8/info.json +++ b/keyboards/keychron/q8/info.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q9/info.json b/keyboards/keychron/q9/info.json index e92a91cb31..ff80a256d3 100644 --- a/keyboards/keychron/q9/info.json +++ b/keyboards/keychron/q9/info.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/q9_plus/info.json b/keyboards/keychron/q9_plus/info.json index 7f73c690c8..8d5034971f 100755 --- a/keyboards/keychron/q9_plus/info.json +++ b/keyboards/keychron/q9_plus/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "dip_switch": true, diff --git a/keyboards/keychron/s1/ansi/rgb/keyboard.json b/keyboards/keychron/s1/ansi/rgb/keyboard.json index e226473b43..fb52ee6423 100644 --- a/keyboards/keychron/s1/ansi/rgb/keyboard.json +++ b/keyboards/keychron/s1/ansi/rgb/keyboard.json @@ -37,7 +37,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/s1/ansi/white/keyboard.json b/keyboards/keychron/s1/ansi/white/keyboard.json index 8915afafdf..7118ebfc44 100644 --- a/keyboards/keychron/s1/ansi/white/keyboard.json +++ b/keyboards/keychron/s1/ansi/white/keyboard.json @@ -123,7 +123,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "led_matrix": true, diff --git a/keyboards/keychron/v2/ansi/keyboard.json b/keyboards/keychron/v2/ansi/keyboard.json index b1377cd60b..bc09cb8a27 100644 --- a/keyboards/keychron/v2/ansi/keyboard.json +++ b/keyboards/keychron/v2/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/ansi_encoder/keyboard.json b/keyboards/keychron/v2/ansi_encoder/keyboard.json index e23268e60d..6752d14b15 100644 --- a/keyboards/keychron/v2/ansi_encoder/keyboard.json +++ b/keyboards/keychron/v2/ansi_encoder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v2/iso/keyboard.json b/keyboards/keychron/v2/iso/keyboard.json index 118840b2df..89bdb51a65 100644 --- a/keyboards/keychron/v2/iso/keyboard.json +++ b/keyboards/keychron/v2/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/iso_encoder/keyboard.json b/keyboards/keychron/v2/iso_encoder/keyboard.json index 0af482cd83..89ce2714f1 100644 --- a/keyboards/keychron/v2/iso_encoder/keyboard.json +++ b/keyboards/keychron/v2/iso_encoder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v2/jis/keyboard.json b/keyboards/keychron/v2/jis/keyboard.json index c62a60075d..01beaf31ac 100644 --- a/keyboards/keychron/v2/jis/keyboard.json +++ b/keyboards/keychron/v2/jis/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v2/jis_encoder/keyboard.json b/keyboards/keychron/v2/jis_encoder/keyboard.json index cf81648ed5..d8a540953c 100644 --- a/keyboards/keychron/v2/jis_encoder/keyboard.json +++ b/keyboards/keychron/v2/jis_encoder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v3/ansi/keyboard.json b/keyboards/keychron/v3/ansi/keyboard.json index e339ef6fc6..d388456227 100644 --- a/keyboards/keychron/v3/ansi/keyboard.json +++ b/keyboards/keychron/v3/ansi/keyboard.json @@ -5,7 +5,6 @@ "maintainer": "lalalademaxiya1", "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v3/iso/keyboard.json b/keyboards/keychron/v3/iso/keyboard.json index b257deb1c0..40a8139ccc 100644 --- a/keyboards/keychron/v3/iso/keyboard.json +++ b/keyboards/keychron/v3/iso/keyboard.json @@ -5,7 +5,6 @@ "maintainer": "lalalademaxiya1", "features": { "bootmagic": true, - "command": false, "console": true, "dip_switch": true, "extrakey": true, diff --git a/keyboards/keychron/v3/jis/keyboard.json b/keyboards/keychron/v3/jis/keyboard.json index b7179af273..0bc3a43d0e 100644 --- a/keyboards/keychron/v3/jis/keyboard.json +++ b/keyboards/keychron/v3/jis/keyboard.json @@ -5,7 +5,6 @@ "maintainer": "lalalademaxiya1", "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v4/ansi/keyboard.json b/keyboards/keychron/v4/ansi/keyboard.json index 201517128c..7184e32f27 100644 --- a/keyboards/keychron/v4/ansi/keyboard.json +++ b/keyboards/keychron/v4/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v4/iso/keyboard.json b/keyboards/keychron/v4/iso/keyboard.json index 8e906694d2..8077844652 100644 --- a/keyboards/keychron/v4/iso/keyboard.json +++ b/keyboards/keychron/v4/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v7/ansi/keyboard.json b/keyboards/keychron/v7/ansi/keyboard.json index 7ce47faa04..503aea5ab6 100644 --- a/keyboards/keychron/v7/ansi/keyboard.json +++ b/keyboards/keychron/v7/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v7/iso/keyboard.json b/keyboards/keychron/v7/iso/keyboard.json index ee9bd794b3..ec4cd06e6b 100644 --- a/keyboards/keychron/v7/iso/keyboard.json +++ b/keyboards/keychron/v7/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/ansi/keyboard.json b/keyboards/keychron/v8/ansi/keyboard.json index 2abc2e8c1a..392783e024 100644 --- a/keyboards/keychron/v8/ansi/keyboard.json +++ b/keyboards/keychron/v8/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/ansi_encoder/keyboard.json b/keyboards/keychron/v8/ansi_encoder/keyboard.json index 7f88d39a83..6d3257feec 100644 --- a/keyboards/keychron/v8/ansi_encoder/keyboard.json +++ b/keyboards/keychron/v8/ansi_encoder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keychron/v8/iso/keyboard.json b/keyboards/keychron/v8/iso/keyboard.json index 81d5c41fe3..0d10662a00 100644 --- a/keyboards/keychron/v8/iso/keyboard.json +++ b/keyboards/keychron/v8/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keychron/v8/iso_encoder/keyboard.json b/keyboards/keychron/v8/iso_encoder/keyboard.json index a440192b1b..d446d213d4 100644 --- a/keyboards/keychron/v8/iso_encoder/keyboard.json +++ b/keyboards/keychron/v8/iso_encoder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/keyhive/absinthe/keyboard.json b/keyboards/keyhive/absinthe/keyboard.json index e426f63a56..26939e4dcc 100644 --- a/keyboards/keyhive/absinthe/keyboard.json +++ b/keyboards/keyhive/absinthe/keyboard.json @@ -25,7 +25,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keyhive/opus/keyboard.json b/keyboards/keyhive/opus/keyboard.json index 76ec93d260..6072a59f5d 100644 --- a/keyboards/keyhive/opus/keyboard.json +++ b/keyboards/keyhive/opus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/keyhive/smallice/keyboard.json b/keyboards/keyhive/smallice/keyboard.json index 41d2bba12b..2b3a6994e7 100644 --- a/keyboards/keyhive/smallice/keyboard.json +++ b/keyboards/keyhive/smallice/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/keyhive/southpole/keyboard.json b/keyboards/keyhive/southpole/keyboard.json index 5cbd091760..8c1895b45d 100644 --- a/keyboards/keyhive/southpole/keyboard.json +++ b/keyboards/keyhive/southpole/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyhive/ut472/keyboard.json b/keyboards/keyhive/ut472/keyboard.json index f419940813..6050751da9 100644 --- a/keyboards/keyhive/ut472/keyboard.json +++ b/keyboards/keyhive/ut472/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keyprez/bison/keyboard.json b/keyboards/keyprez/bison/keyboard.json index e4ff719dd6..94d2049965 100644 --- a/keyboards/keyprez/bison/keyboard.json +++ b/keyboards/keyprez/bison/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/corgi/keyboard.json b/keyboards/keyprez/corgi/keyboard.json index da046f8d7b..6883970af4 100644 --- a/keyboards/keyprez/corgi/keyboard.json +++ b/keyboards/keyprez/corgi/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/rhino/keyboard.json b/keyboards/keyprez/rhino/keyboard.json index 0cdd027da5..f7993c9020 100644 --- a/keyboards/keyprez/rhino/keyboard.json +++ b/keyboards/keyprez/rhino/keyboard.json @@ -10,7 +10,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyprez/unicorn/keyboard.json b/keyboards/keyprez/unicorn/keyboard.json index a07466f151..20aa2e3e73 100644 --- a/keyboards/keyprez/unicorn/keyboard.json +++ b/keyboards/keyprez/unicorn/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyquest/enclave/keyboard.json b/keyboards/keyquest/enclave/keyboard.json index cc1a9f6a42..57fe8eaa61 100644 --- a/keyboards/keyquest/enclave/keyboard.json +++ b/keyboards/keyquest/enclave/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keysofkings/twokey/keyboard.json b/keyboards/keysofkings/twokey/keyboard.json index 765183426b..2ec17f2b93 100644 --- a/keyboards/keysofkings/twokey/keyboard.json +++ b/keyboards/keysofkings/twokey/keyboard.json @@ -31,7 +31,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/keyspensory/kp60/keyboard.json b/keyboards/keyspensory/kp60/keyboard.json index 5caa3f178a..2072186e9d 100644 --- a/keyboards/keyspensory/kp60/keyboard.json +++ b/keyboards/keyspensory/kp60/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/keystonecaps/gameroyadvance/keyboard.json b/keyboards/keystonecaps/gameroyadvance/keyboard.json index dc590082e5..1a7960ac25 100644 --- a/keyboards/keystonecaps/gameroyadvance/keyboard.json +++ b/keyboards/keystonecaps/gameroyadvance/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/keyten/aperture/keyboard.json b/keyboards/keyten/aperture/keyboard.json index 306c73f6fd..614a1e4ab7 100644 --- a/keyboards/keyten/aperture/keyboard.json +++ b/keyboards/keyten/aperture/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/diablo/keyboard.json b/keyboards/keyten/diablo/keyboard.json index c63a91295a..c65ba97fae 100644 --- a/keyboards/keyten/diablo/keyboard.json +++ b/keyboards/keyten/diablo/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/kt3700/keyboard.json b/keyboards/keyten/kt3700/keyboard.json index b7daf709c1..6b14c733bd 100644 --- a/keyboards/keyten/kt3700/keyboard.json +++ b/keyboards/keyten/kt3700/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/kt60_m/keyboard.json b/keyboards/keyten/kt60_m/keyboard.json index 3894b5d915..11605a10d0 100644 --- a/keyboards/keyten/kt60_m/keyboard.json +++ b/keyboards/keyten/kt60_m/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/keyten/lisa/keyboard.json b/keyboards/keyten/lisa/keyboard.json index 44e71db705..a370a7add1 100644 --- a/keyboards/keyten/lisa/keyboard.json +++ b/keyboards/keyten/lisa/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/fukuro/keyboard.json b/keyboards/kibou/fukuro/keyboard.json index c8ad6cc808..9588cb9ff7 100644 --- a/keyboards/kibou/fukuro/keyboard.json +++ b/keyboards/kibou/fukuro/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/harbour/keyboard.json b/keyboards/kibou/harbour/keyboard.json index b6ee841d8b..15249a9c97 100644 --- a/keyboards/kibou/harbour/keyboard.json +++ b/keyboards/kibou/harbour/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/suisei/keyboard.json b/keyboards/kibou/suisei/keyboard.json index 7b74912e76..283e6f6895 100644 --- a/keyboards/kibou/suisei/keyboard.json +++ b/keyboards/kibou/suisei/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/wendy/keyboard.json b/keyboards/kibou/wendy/keyboard.json index 2f78f8f634..99e0ddb84d 100644 --- a/keyboards/kibou/wendy/keyboard.json +++ b/keyboards/kibou/wendy/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kibou/winter/keyboard.json b/keyboards/kibou/winter/keyboard.json index 5602ae39e6..14f912ceb4 100644 --- a/keyboards/kibou/winter/keyboard.json +++ b/keyboards/kibou/winter/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kikkou/keyboard.json b/keyboards/kikkou/keyboard.json index 21c83ef3ea..4285d3a515 100644 --- a/keyboards/kikkou/keyboard.json +++ b/keyboards/kikkou/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kikoslab/ellora65/keyboard.json b/keyboards/kikoslab/ellora65/keyboard.json index 5f0c4f8d25..3a8ace7879 100644 --- a/keyboards/kikoslab/ellora65/keyboard.json +++ b/keyboards/kikoslab/ellora65/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kikoslab/kl90/keyboard.json b/keyboards/kikoslab/kl90/keyboard.json index ededcf280f..af030fb86b 100644 --- a/keyboards/kikoslab/kl90/keyboard.json +++ b/keyboards/kikoslab/kl90/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kin80/info.json b/keyboards/kin80/info.json index c531c329a4..df58894b92 100644 --- a/keyboards/kin80/info.json +++ b/keyboards/kin80/info.json @@ -4,7 +4,6 @@ "maintainer": "DmNosachev", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kindakeyboards/conone65/keyboard.json b/keyboards/kindakeyboards/conone65/keyboard.json index 9f5f7af4b7..46df385527 100644 --- a/keyboards/kindakeyboards/conone65/keyboard.json +++ b/keyboards/kindakeyboards/conone65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kinesis/alvicstep/keyboard.json b/keyboards/kinesis/alvicstep/keyboard.json index 78ea71c0b4..dea99f66ef 100644 --- a/keyboards/kinesis/alvicstep/keyboard.json +++ b/keyboards/kinesis/alvicstep/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/kint2pp/keyboard.json b/keyboards/kinesis/kint2pp/keyboard.json index 590ad0fb42..3b00cfff46 100644 --- a/keyboards/kinesis/kint2pp/keyboard.json +++ b/keyboards/kinesis/kint2pp/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/kint36/keyboard.json b/keyboards/kinesis/kint36/keyboard.json index a2273a65ba..02df04a7c9 100644 --- a/keyboards/kinesis/kint36/keyboard.json +++ b/keyboards/kinesis/kint36/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/kint41/keyboard.json b/keyboards/kinesis/kint41/keyboard.json index e08d75e211..25ebd64fb9 100644 --- a/keyboards/kinesis/kint41/keyboard.json +++ b/keyboards/kinesis/kint41/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/kintlc/keyboard.json b/keyboards/kinesis/kintlc/keyboard.json index 9a40c912f2..8d12eb2fe4 100644 --- a/keyboards/kinesis/kintlc/keyboard.json +++ b/keyboards/kinesis/kintlc/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/kintwin/keyboard.json b/keyboards/kinesis/kintwin/keyboard.json index 528a2ca7a2..e4a42f3696 100644 --- a/keyboards/kinesis/kintwin/keyboard.json +++ b/keyboards/kinesis/kintwin/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kinesis/stapelberg/keyboard.json b/keyboards/kinesis/stapelberg/keyboard.json index a17fdbf8fe..fbc955ebe2 100644 --- a/keyboards/kinesis/stapelberg/keyboard.json +++ b/keyboards/kinesis/stapelberg/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "nkro": true diff --git a/keyboards/kineticlabs/emu/hotswap/keyboard.json b/keyboards/kineticlabs/emu/hotswap/keyboard.json index e685ffb5d9..6a974fd410 100644 --- a/keyboards/kineticlabs/emu/hotswap/keyboard.json +++ b/keyboards/kineticlabs/emu/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kineticlabs/emu/soldered/keyboard.json b/keyboards/kineticlabs/emu/soldered/keyboard.json index a48048ef2f..5cbb524fdf 100644 --- a/keyboards/kineticlabs/emu/soldered/keyboard.json +++ b/keyboards/kineticlabs/emu/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/kingly_keys/ave/ortho/keyboard.json b/keyboards/kingly_keys/ave/ortho/keyboard.json index ffb4bf723c..3720ac7f5a 100644 --- a/keyboards/kingly_keys/ave/ortho/keyboard.json +++ b/keyboards/kingly_keys/ave/ortho/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/ave/staggered/keyboard.json b/keyboards/kingly_keys/ave/staggered/keyboard.json index 72719811d1..1d05272459 100644 --- a/keyboards/kingly_keys/ave/staggered/keyboard.json +++ b/keyboards/kingly_keys/ave/staggered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/little_foot/keyboard.json b/keyboards/kingly_keys/little_foot/keyboard.json index cea54a0171..2af4432d47 100644 --- a/keyboards/kingly_keys/little_foot/keyboard.json +++ b/keyboards/kingly_keys/little_foot/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kingly_keys/romac/keyboard.json b/keyboards/kingly_keys/romac/keyboard.json index cd3c61bb20..40c8dea64f 100644 --- a/keyboards/kingly_keys/romac/keyboard.json +++ b/keyboards/kingly_keys/romac/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kingly_keys/romac_plus/keyboard.json b/keyboards/kingly_keys/romac_plus/keyboard.json index 847a0f8983..b0b2f487cb 100644 --- a/keyboards/kingly_keys/romac_plus/keyboard.json +++ b/keyboards/kingly_keys/romac_plus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/ropro/keyboard.json b/keyboards/kingly_keys/ropro/keyboard.json index 9fcd31fce9..6a70aca089 100644 --- a/keyboards/kingly_keys/ropro/keyboard.json +++ b/keyboards/kingly_keys/ropro/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kingly_keys/soap/keyboard.json b/keyboards/kingly_keys/soap/keyboard.json index a8c558bbba..78660c4f6d 100644 --- a/keyboards/kingly_keys/soap/keyboard.json +++ b/keyboards/kingly_keys/soap/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kiserdesigns/madeline/keyboard.json b/keyboards/kiserdesigns/madeline/keyboard.json index a953f869ef..5fdcd981f1 100644 --- a/keyboards/kiserdesigns/madeline/keyboard.json +++ b/keyboards/kiserdesigns/madeline/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kiwikeebs/macro/keyboard.json b/keyboards/kiwikeebs/macro/keyboard.json index 9e8e9cbf7b..98d8171944 100644 --- a/keyboards/kiwikeebs/macro/keyboard.json +++ b/keyboards/kiwikeebs/macro/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kiwikeebs/macro_v2/keyboard.json b/keyboards/kiwikeebs/macro_v2/keyboard.json index 51fd39a67a..9947f48f63 100644 --- a/keyboards/kiwikeebs/macro_v2/keyboard.json +++ b/keyboards/kiwikeebs/macro_v2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kiwikey/wanderland/keyboard.json b/keyboards/kiwikey/wanderland/keyboard.json index 3675f8a86e..1c2067942f 100644 --- a/keyboards/kiwikey/wanderland/keyboard.json +++ b/keyboards/kiwikey/wanderland/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kj_modify/rs40/keyboard.json b/keyboards/kj_modify/rs40/keyboard.json index b2ebe8b08c..44ce821d57 100644 --- a/keyboards/kj_modify/rs40/keyboard.json +++ b/keyboards/kj_modify/rs40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kk/65/keyboard.json b/keyboards/kk/65/keyboard.json index fe5296fd5b..27ff4073ee 100644 --- a/keyboards/kk/65/keyboard.json +++ b/keyboards/kk/65/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kkatano/bakeneko60/keyboard.json b/keyboards/kkatano/bakeneko60/keyboard.json index 6eff62e1dc..d4188b7c0f 100644 --- a/keyboards/kkatano/bakeneko60/keyboard.json +++ b/keyboards/kkatano/bakeneko60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kkatano/bakeneko65/rev2/keyboard.json b/keyboards/kkatano/bakeneko65/rev2/keyboard.json index 173863f565..ae13085586 100644 --- a/keyboards/kkatano/bakeneko65/rev2/keyboard.json +++ b/keyboards/kkatano/bakeneko65/rev2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/kkatano/bakeneko65/rev3/keyboard.json b/keyboards/kkatano/bakeneko65/rev3/keyboard.json index f1d99dac55..efc1697166 100644 --- a/keyboards/kkatano/bakeneko65/rev3/keyboard.json +++ b/keyboards/kkatano/bakeneko65/rev3/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/knobgoblin/keyboard.json b/keyboards/knobgoblin/keyboard.json index 4886a47da3..4cc00e26cd 100644 --- a/keyboards/knobgoblin/keyboard.json +++ b/keyboards/knobgoblin/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/kopibeng/tgr_lena/keyboard.json b/keyboards/kopibeng/tgr_lena/keyboard.json index af9568fb8e..a526c26e52 100644 --- a/keyboards/kopibeng/tgr_lena/keyboard.json +++ b/keyboards/kopibeng/tgr_lena/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/xt60/keyboard.json b/keyboards/kopibeng/xt60/keyboard.json index 8fbd8793a3..1cb770f8df 100644 --- a/keyboards/kopibeng/xt60/keyboard.json +++ b/keyboards/kopibeng/xt60/keyboard.json @@ -24,7 +24,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kopibeng/xt60_singa/keyboard.json b/keyboards/kopibeng/xt60_singa/keyboard.json index a6a27191d4..3a7726310a 100644 --- a/keyboards/kopibeng/xt60_singa/keyboard.json +++ b/keyboards/kopibeng/xt60_singa/keyboard.json @@ -24,7 +24,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm16a/v1/keyboard.json b/keyboards/kprepublic/bm16a/v1/keyboard.json index 5c37f26354..ee31afbcf5 100644 --- a/keyboards/kprepublic/bm16a/v1/keyboard.json +++ b/keyboards/kprepublic/bm16a/v1/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "backlight": true, "rgblight": true diff --git a/keyboards/kprepublic/bm16a/v2/keyboard.json b/keyboards/kprepublic/bm16a/v2/keyboard.json index 92973e875e..b4ef622f4a 100644 --- a/keyboards/kprepublic/bm16a/v2/keyboard.json +++ b/keyboards/kprepublic/bm16a/v2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm16s/keyboard.json b/keyboards/kprepublic/bm16s/keyboard.json index 0c339b7d0b..fe259c2fc9 100644 --- a/keyboards/kprepublic/bm16s/keyboard.json +++ b/keyboards/kprepublic/bm16s/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json index f2c80e1781..5cad0a013a 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev1/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json index eff8d8eb66..c38be9612f 100644 --- a/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm40hsrgb/rev2/keyboard.json @@ -9,7 +9,6 @@ "rgblight": true, "rgb_matrix": true, "tri_layer": true, - "command": false, "nkro": false }, "build": { diff --git a/keyboards/kprepublic/bm43hsrgb/keyboard.json b/keyboards/kprepublic/bm43hsrgb/keyboard.json index b69ba814c3..3aeba0ef91 100755 --- a/keyboards/kprepublic/bm43hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm43hsrgb/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json index 82c23ed3ef..55ec5589d1 100644 --- a/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb/rev1/keyboard.json @@ -67,7 +67,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json index 42d04a4781..75e8333f7a 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev1/keyboard.json @@ -58,7 +58,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json index ac83b152af..dd43d36d71 100644 --- a/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_ec/rev2/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json index b1daf2e718..b3bf6e44b2 100644 --- a/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_iso/rev1/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json index 9e5e1ea3e7..9619665e6d 100644 --- a/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json +++ b/keyboards/kprepublic/bm60hsrgb_poker/rev1/keyboard.json @@ -79,7 +79,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json index 060fa19e7e..d761606a5a 100644 --- a/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb/rev1/keyboard.json @@ -18,7 +18,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json index e596453e7e..e9e330b160 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json @@ -85,7 +85,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json index 047f74d32a..b5ca4d696d 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev1/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json index e549820452..28ad31304e 100644 --- a/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json +++ b/keyboards/kprepublic/bm68hsrgb/rev2/keyboard.json @@ -71,7 +71,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm80hsrgb/keyboard.json b/keyboards/kprepublic/bm80hsrgb/keyboard.json index 3bfb9e2d29..1a1b1a6ed3 100644 --- a/keyboards/kprepublic/bm80hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm80hsrgb/keyboard.json @@ -62,7 +62,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/bm80v2/keyboard.json b/keyboards/kprepublic/bm80v2/keyboard.json index 6982c69f12..43de1e4933 100644 --- a/keyboards/kprepublic/bm80v2/keyboard.json +++ b/keyboards/kprepublic/bm80v2/keyboard.json @@ -53,7 +53,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm80v2_iso/keyboard.json b/keyboards/kprepublic/bm80v2_iso/keyboard.json index c7210e05ad..beb90a3738 100644 --- a/keyboards/kprepublic/bm80v2_iso/keyboard.json +++ b/keyboards/kprepublic/bm80v2_iso/keyboard.json @@ -53,7 +53,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/bm980hsrgb/keyboard.json b/keyboards/kprepublic/bm980hsrgb/keyboard.json index 9d9578b948..85f8b006ae 100644 --- a/keyboards/kprepublic/bm980hsrgb/keyboard.json +++ b/keyboards/kprepublic/bm980hsrgb/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/cospad/keyboard.json b/keyboards/kprepublic/cospad/keyboard.json index b7b3682be5..ac5b98c83a 100644 --- a/keyboards/kprepublic/cospad/keyboard.json +++ b/keyboards/kprepublic/cospad/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/kprepublic/cstc40/info.json b/keyboards/kprepublic/cstc40/info.json index 79b9a0ae63..8e4e640b7e 100644 --- a/keyboards/kprepublic/cstc40/info.json +++ b/keyboards/kprepublic/cstc40/info.json @@ -7,7 +7,6 @@ "debounce": 2, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/kprepublic/jj4x4/keyboard.json b/keyboards/kprepublic/jj4x4/keyboard.json index ac28cba94e..872ee1ac55 100644 --- a/keyboards/kprepublic/jj4x4/keyboard.json +++ b/keyboards/kprepublic/jj4x4/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kradoindustries/kousa/keyboard.json b/keyboards/kradoindustries/kousa/keyboard.json index f387d69eef..2730bf5d50 100644 --- a/keyboards/kradoindustries/kousa/keyboard.json +++ b/keyboards/kradoindustries/kousa/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "encoder": true, "rgblight": true diff --git a/keyboards/kradoindustries/krado66/keyboard.json b/keyboards/kradoindustries/krado66/keyboard.json index 188ac66c60..6964f3f80f 100644 --- a/keyboards/kradoindustries/krado66/keyboard.json +++ b/keyboards/kradoindustries/krado66/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "encoder": true, "rgblight": true diff --git a/keyboards/kradoindustries/promenade/keyboard.json b/keyboards/kradoindustries/promenade/keyboard.json index fb0d380993..f8b1197ff1 100644 --- a/keyboards/kradoindustries/promenade/keyboard.json +++ b/keyboards/kradoindustries/promenade/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true }, diff --git a/keyboards/kradoindustries/promenade_rp24s/keyboard.json b/keyboards/kradoindustries/promenade_rp24s/keyboard.json index bb68b6ece5..5fb3dbfec8 100644 --- a/keyboards/kradoindustries/promenade_rp24s/keyboard.json +++ b/keyboards/kradoindustries/promenade_rp24s/keyboard.json @@ -14,7 +14,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "encoder": true, "rgblight": true diff --git a/keyboards/kraken_jones/pteron56/keyboard.json b/keyboards/kraken_jones/pteron56/keyboard.json index 79357e3609..d298a1220f 100644 --- a/keyboards/kraken_jones/pteron56/keyboard.json +++ b/keyboards/kraken_jones/pteron56/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "layouts": { diff --git a/keyboards/ktec/daisy/keyboard.json b/keyboards/ktec/daisy/keyboard.json index 44c3a789a6..9d8a7f2de5 100644 --- a/keyboards/ktec/daisy/keyboard.json +++ b/keyboards/ktec/daisy/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/ktec/staryu/keyboard.json b/keyboards/ktec/staryu/keyboard.json index 42adb61df5..2fa35a7913 100644 --- a/keyboards/ktec/staryu/keyboard.json +++ b/keyboards/ktec/staryu/keyboard.json @@ -39,7 +39,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/kuro/kuro65/keyboard.json b/keyboards/kuro/kuro65/keyboard.json index 09c80d4882..631120ae79 100644 --- a/keyboards/kuro/kuro65/keyboard.json +++ b/keyboards/kuro/kuro65/keyboard.json @@ -21,7 +21,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/kwstudio/pisces/keyboard.json b/keyboards/kwstudio/pisces/keyboard.json index 1dc3b780c3..25936beb85 100644 --- a/keyboards/kwstudio/pisces/keyboard.json +++ b/keyboards/kwstudio/pisces/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/kwub/bloop/keyboard.json b/keyboards/kwub/bloop/keyboard.json index b20fb706fe..a5486926b3 100644 --- a/keyboards/kwub/bloop/keyboard.json +++ b/keyboards/kwub/bloop/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/labbe/labbeminiv1/keyboard.json b/keyboards/labbe/labbeminiv1/keyboard.json index 38865f8215..e1b94dfa4e 100644 --- a/keyboards/labbe/labbeminiv1/keyboard.json +++ b/keyboards/labbe/labbeminiv1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/labyrinth75/keyboard.json b/keyboards/labyrinth75/keyboard.json index 700d3821cb..8e7326fa35 100644 --- a/keyboards/labyrinth75/keyboard.json +++ b/keyboards/labyrinth75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/laneware/lpad/keyboard.json b/keyboards/laneware/lpad/keyboard.json index b26552ac55..cf1b297fd8 100644 --- a/keyboards/laneware/lpad/keyboard.json +++ b/keyboards/laneware/lpad/keyboard.json @@ -11,7 +11,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/lw67/keyboard.json b/keyboards/laneware/lw67/keyboard.json index 280373679b..6e3f09e500 100644 --- a/keyboards/laneware/lw67/keyboard.json +++ b/keyboards/laneware/lw67/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/lw75/keyboard.json b/keyboards/laneware/lw75/keyboard.json index e2c475cb77..a61e4396cd 100644 --- a/keyboards/laneware/lw75/keyboard.json +++ b/keyboards/laneware/lw75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/macro1/keyboard.json b/keyboards/laneware/macro1/keyboard.json index 45b6c41a90..ded25130a0 100644 --- a/keyboards/laneware/macro1/keyboard.json +++ b/keyboards/laneware/macro1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/laneware/raindrop/keyboard.json b/keyboards/laneware/raindrop/keyboard.json index fd15c21965..115bf2fc56 100644 --- a/keyboards/laneware/raindrop/keyboard.json +++ b/keyboards/laneware/raindrop/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "qmk": { diff --git a/keyboards/large_lad/keyboard.json b/keyboards/large_lad/keyboard.json index e8f750fcd1..e983d53939 100644 --- a/keyboards/large_lad/keyboard.json +++ b/keyboards/large_lad/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/laser_ninja/pumpkinpad/keyboard.json b/keyboards/laser_ninja/pumpkinpad/keyboard.json index e254cb76b5..9004a411a2 100644 --- a/keyboards/laser_ninja/pumpkinpad/keyboard.json +++ b/keyboards/laser_ninja/pumpkinpad/keyboard.json @@ -6,7 +6,6 @@ "bootloader": "stm32-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/latincompass/latin17rgb/keyboard.json b/keyboards/latincompass/latin17rgb/keyboard.json index 20d7086d4c..6dab2faf68 100644 --- a/keyboards/latincompass/latin17rgb/keyboard.json +++ b/keyboards/latincompass/latin17rgb/keyboard.json @@ -65,7 +65,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/latincompass/latin60rgb/keyboard.json b/keyboards/latincompass/latin60rgb/keyboard.json index 30e64a4f14..bc28bdf08e 100644 --- a/keyboards/latincompass/latin60rgb/keyboard.json +++ b/keyboards/latincompass/latin60rgb/keyboard.json @@ -109,7 +109,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/latincompass/latinpad/keyboard.json b/keyboards/latincompass/latinpad/keyboard.json index a1dd38e097..2efc370ad3 100644 --- a/keyboards/latincompass/latinpad/keyboard.json +++ b/keyboards/latincompass/latinpad/keyboard.json @@ -44,7 +44,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/latincompass/latinpadble/keyboard.json b/keyboards/latincompass/latinpadble/keyboard.json index cfdf271402..f99fee5bad 100644 --- a/keyboards/latincompass/latinpadble/keyboard.json +++ b/keyboards/latincompass/latinpadble/keyboard.json @@ -11,7 +11,6 @@ "features": { "bluetooth": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/lazydesigners/bolt/keyboard.json b/keyboards/lazydesigners/bolt/keyboard.json index e6d4482283..e1254e0de5 100644 --- a/keyboards/lazydesigners/bolt/keyboard.json +++ b/keyboards/lazydesigners/bolt/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/cassette8/keyboard.json b/keyboards/lazydesigners/cassette8/keyboard.json index 8cb1428122..55044bd108 100755 --- a/keyboards/lazydesigners/cassette8/keyboard.json +++ b/keyboards/lazydesigners/cassette8/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lazydesigners/dimpleplus/keyboard.json b/keyboards/lazydesigners/dimpleplus/keyboard.json index 7fb7260894..474be8352c 100644 --- a/keyboards/lazydesigners/dimpleplus/keyboard.json +++ b/keyboards/lazydesigners/dimpleplus/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/the30/keyboard.json b/keyboards/lazydesigners/the30/keyboard.json index bf24fa0e08..494105db18 100644 --- a/keyboards/lazydesigners/the30/keyboard.json +++ b/keyboards/lazydesigners/the30/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the40/keyboard.json b/keyboards/lazydesigners/the40/keyboard.json index 103d2fa78e..dfefd92593 100644 --- a/keyboards/lazydesigners/the40/keyboard.json +++ b/keyboards/lazydesigners/the40/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/lazydesigners/the50/keyboard.json b/keyboards/lazydesigners/the50/keyboard.json index 55caf81d3a..de4ad88219 100644 --- a/keyboards/lazydesigners/the50/keyboard.json +++ b/keyboards/lazydesigners/the50/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the60/rev1/keyboard.json b/keyboards/lazydesigners/the60/rev1/keyboard.json index 7dd1cde022..8fd9df1559 100755 --- a/keyboards/lazydesigners/the60/rev1/keyboard.json +++ b/keyboards/lazydesigners/the60/rev1/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/lazydesigners/the60/rev2/keyboard.json b/keyboards/lazydesigners/the60/rev2/keyboard.json index 2d6eb276d8..1b2c32b737 100755 --- a/keyboards/lazydesigners/the60/rev2/keyboard.json +++ b/keyboards/lazydesigners/the60/rev2/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/leafcutterlabs/bigknob/keyboard.json b/keyboards/leafcutterlabs/bigknob/keyboard.json index ca3b7a0e2a..c1f3e12f03 100644 --- a/keyboards/leafcutterlabs/bigknob/keyboard.json +++ b/keyboards/leafcutterlabs/bigknob/keyboard.json @@ -34,7 +34,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/leeku/finger65/keyboard.json b/keyboards/leeku/finger65/keyboard.json index 8cfb94c20b..cba7adea66 100644 --- a/keyboards/leeku/finger65/keyboard.json +++ b/keyboards/leeku/finger65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/lendunistus/rpneko65/rev1/keyboard.json b/keyboards/lendunistus/rpneko65/rev1/keyboard.json index b28ca4b5fa..d0bb593996 100644 --- a/keyboards/lendunistus/rpneko65/rev1/keyboard.json +++ b/keyboards/lendunistus/rpneko65/rev1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lfkeyboards/lfk87/info.json b/keyboards/lfkeyboards/lfk87/info.json index a9c3d56f7b..a0c0b2bcc0 100644 --- a/keyboards/lfkeyboards/lfk87/info.json +++ b/keyboards/lfkeyboards/lfk87/info.json @@ -5,7 +5,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/lfkeyboards/lfkpad/keyboard.json b/keyboards/lfkeyboards/lfkpad/keyboard.json index c78d6e2635..dc638cbfa9 100644 --- a/keyboards/lfkeyboards/lfkpad/keyboard.json +++ b/keyboards/lfkeyboards/lfkpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/lfkeyboards/smk65/info.json b/keyboards/lfkeyboards/smk65/info.json index e80ef7b7eb..d1ce471242 100644 --- a/keyboards/lfkeyboards/smk65/info.json +++ b/keyboards/lfkeyboards/smk65/info.json @@ -4,7 +4,6 @@ "maintainer": "qmk", "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/lgbtkl/keyboard.json b/keyboards/lgbtkl/keyboard.json index 11e02f7cf0..51411f2b2a 100644 --- a/keyboards/lgbtkl/keyboard.json +++ b/keyboards/lgbtkl/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/linworks/dolice/keyboard.json b/keyboards/linworks/dolice/keyboard.json index 5f47c8af0a..bcdfda561f 100644 --- a/keyboards/linworks/dolice/keyboard.json +++ b/keyboards/linworks/dolice/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/em8/keyboard.json b/keyboards/linworks/em8/keyboard.json index de096b7b62..12b8e8e0a9 100644 --- a/keyboards/linworks/em8/keyboard.json +++ b/keyboards/linworks/em8/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/fave104/keyboard.json b/keyboards/linworks/fave104/keyboard.json index 34279ec0ba..561293c329 100644 --- a/keyboards/linworks/fave104/keyboard.json +++ b/keyboards/linworks/fave104/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/linworks/fave60/keyboard.json b/keyboards/linworks/fave60/keyboard.json index ef50543ab7..ab0f72c3ef 100644 --- a/keyboards/linworks/fave60/keyboard.json +++ b/keyboards/linworks/fave60/keyboard.json @@ -26,7 +26,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/linworks/fave84h/keyboard.json b/keyboards/linworks/fave84h/keyboard.json index ee2473c77b..1b6d5516bf 100644 --- a/keyboards/linworks/fave84h/keyboard.json +++ b/keyboards/linworks/fave84h/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/linworks/fave87/keyboard.json b/keyboards/linworks/fave87/keyboard.json index ec039718a7..6dce6f39fe 100644 --- a/keyboards/linworks/fave87/keyboard.json +++ b/keyboards/linworks/fave87/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/linworks/whale75/keyboard.json b/keyboards/linworks/whale75/keyboard.json index e0dc3e1712..4298382471 100644 --- a/keyboards/linworks/whale75/keyboard.json +++ b/keyboards/linworks/whale75/keyboard.json @@ -24,7 +24,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/littlealby/mute/keyboard.json b/keyboards/littlealby/mute/keyboard.json index 7686ec174c..3ca52491bb 100644 --- a/keyboards/littlealby/mute/keyboard.json +++ b/keyboards/littlealby/mute/keyboard.json @@ -18,7 +18,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/lizard_trick/tenkey_plusplus/keyboard.json b/keyboards/lizard_trick/tenkey_plusplus/keyboard.json index e501cbfdc0..e3828e0674 100644 --- a/keyboards/lizard_trick/tenkey_plusplus/keyboard.json +++ b/keyboards/lizard_trick/tenkey_plusplus/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ll3macorn/bongopad/keyboard.json b/keyboards/ll3macorn/bongopad/keyboard.json index 188cc2527f..a47529ed28 100644 --- a/keyboards/ll3macorn/bongopad/keyboard.json +++ b/keyboards/ll3macorn/bongopad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/lm_keyboard/lm60n/keyboard.json b/keyboards/lm_keyboard/lm60n/keyboard.json index 0301e35ae0..0b901ee2ea 100644 --- a/keyboards/lm_keyboard/lm60n/keyboard.json +++ b/keyboards/lm_keyboard/lm60n/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/longnald/corin/keyboard.json b/keyboards/longnald/corin/keyboard.json index 1c32741762..0eb2726507 100644 --- a/keyboards/longnald/corin/keyboard.json +++ b/keyboards/longnald/corin/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json index 8d6723c9f6..b1f867760a 100644 --- a/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json +++ b/keyboards/lostdotfish/rp2040_orbweaver/keyboard.json @@ -14,7 +14,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/lxxt/keyboard.json b/keyboards/lxxt/keyboard.json index 725b6ee2c2..a4bc328a71 100644 --- a/keyboards/lxxt/keyboard.json +++ b/keyboards/lxxt/keyboard.json @@ -46,7 +46,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true diff --git a/keyboards/lyso1/lefishe/keyboard.json b/keyboards/lyso1/lefishe/keyboard.json index 4d0cc7842f..be92e9930f 100644 --- a/keyboards/lyso1/lefishe/keyboard.json +++ b/keyboards/lyso1/lefishe/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/m10a/keyboard.json b/keyboards/m10a/keyboard.json index d1799bae55..d6f1be0bbb 100644 --- a/keyboards/m10a/keyboard.json +++ b/keyboards/m10a/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/machine_industries/m4_a/keyboard.json b/keyboards/machine_industries/m4_a/keyboard.json index e96e2a6b1a..147b85018a 100644 --- a/keyboards/machine_industries/m4_a/keyboard.json +++ b/keyboards/machine_industries/m4_a/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/machkeyboards/mach3/keyboard.json b/keyboards/machkeyboards/mach3/keyboard.json index 0679ad7f3c..126845a37d 100644 --- a/keyboards/machkeyboards/mach3/keyboard.json +++ b/keyboards/machkeyboards/mach3/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/macrocat/keyboard.json b/keyboards/macrocat/keyboard.json index ed0a2d17a5..d9d3be105a 100644 --- a/keyboards/macrocat/keyboard.json +++ b/keyboards/macrocat/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/madjax_macropad/keyboard.json b/keyboards/madjax_macropad/keyboard.json index 031e396866..63c1383ac1 100644 --- a/keyboards/madjax_macropad/keyboard.json +++ b/keyboards/madjax_macropad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/makeymakey/keyboard.json b/keyboards/makeymakey/keyboard.json index 81b23f0125..4bd463fa3d 100644 --- a/keyboards/makeymakey/keyboard.json +++ b/keyboards/makeymakey/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": true, "nkro": true diff --git a/keyboards/makrosu/keyboard.json b/keyboards/makrosu/keyboard.json index 54dcea4cb9..e79a03f475 100644 --- a/keyboards/makrosu/keyboard.json +++ b/keyboards/makrosu/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/malevolti/superlyra/rev1/keyboard.json b/keyboards/malevolti/superlyra/rev1/keyboard.json index 56a0edc90e..52745a94f7 100644 --- a/keyboards/malevolti/superlyra/rev1/keyboard.json +++ b/keyboards/malevolti/superlyra/rev1/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/manyboard/macro/keyboard.json b/keyboards/manyboard/macro/keyboard.json index 187e1976fe..d0c278b781 100644 --- a/keyboards/manyboard/macro/keyboard.json +++ b/keyboards/manyboard/macro/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/maple_computing/6ball/keyboard.json b/keyboards/maple_computing/6ball/keyboard.json index 61ec5f1131..335294e51e 100644 --- a/keyboards/maple_computing/6ball/keyboard.json +++ b/keyboards/maple_computing/6ball/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/maple_computing/christmas_tree/v2017/keyboard.json b/keyboards/maple_computing/christmas_tree/v2017/keyboard.json index 604b1b382a..d2ebc781d6 100644 --- a/keyboards/maple_computing/christmas_tree/v2017/keyboard.json +++ b/keyboards/maple_computing/christmas_tree/v2017/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mariorion_v25/prod/keyboard.json b/keyboards/mariorion_v25/prod/keyboard.json index b950162618..4ffccca63e 100644 --- a/keyboards/mariorion_v25/prod/keyboard.json +++ b/keyboards/mariorion_v25/prod/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mariorion_v25/proto/keyboard.json b/keyboards/mariorion_v25/proto/keyboard.json index 2e42fedccf..404b845c00 100644 --- a/keyboards/mariorion_v25/proto/keyboard.json +++ b/keyboards/mariorion_v25/proto/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/marksard/leftover30/keyboard.json b/keyboards/marksard/leftover30/keyboard.json index aac594097a..1b1131d6fc 100644 --- a/keyboards/marksard/leftover30/keyboard.json +++ b/keyboards/marksard/leftover30/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/marksard/treadstone32/info.json b/keyboards/marksard/treadstone32/info.json index 35f72490f0..2de31ac08d 100644 --- a/keyboards/marksard/treadstone32/info.json +++ b/keyboards/marksard/treadstone32/info.json @@ -4,7 +4,6 @@ "maintainer": "marksard", "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": true, "nkro": false diff --git a/keyboards/matchstickworks/normiepad/keyboard.json b/keyboards/matchstickworks/normiepad/keyboard.json index de2362f99e..4e6a8cdb13 100644 --- a/keyboards/matchstickworks/normiepad/keyboard.json +++ b/keyboards/matchstickworks/normiepad/keyboard.json @@ -4,7 +4,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matchstickworks/southpad/rev1/keyboard.json b/keyboards/matchstickworks/southpad/rev1/keyboard.json index c893882b4f..e7c3237a55 100644 --- a/keyboards/matchstickworks/southpad/rev1/keyboard.json +++ b/keyboards/matchstickworks/southpad/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/matchstickworks/southpad/rev2/keyboard.json b/keyboards/matchstickworks/southpad/rev2/keyboard.json index 1364885d55..e546b66bb9 100644 --- a/keyboards/matchstickworks/southpad/rev2/keyboard.json +++ b/keyboards/matchstickworks/southpad/rev2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matrix/cain_re/keyboard.json b/keyboards/matrix/cain_re/keyboard.json index 82f8c98525..2217a001a3 100644 --- a/keyboards/matrix/cain_re/keyboard.json +++ b/keyboards/matrix/cain_re/keyboard.json @@ -36,7 +36,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/matrix/falcon/keyboard.json b/keyboards/matrix/falcon/keyboard.json index 2dc0e17e26..1a65d86974 100644 --- a/keyboards/matrix/falcon/keyboard.json +++ b/keyboards/matrix/falcon/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/matrix/m12og/rev2/keyboard.json b/keyboards/matrix/m12og/rev2/keyboard.json index f7fdb5ce63..038aea0984 100644 --- a/keyboards/matrix/m12og/rev2/keyboard.json +++ b/keyboards/matrix/m12og/rev2/keyboard.json @@ -36,7 +36,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/matrix/me/keyboard.json b/keyboards/matrix/me/keyboard.json index 6d4cebb82b..bd2ecde4a4 100644 --- a/keyboards/matrix/me/keyboard.json +++ b/keyboards/matrix/me/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/matthewdias/m3n3van/keyboard.json b/keyboards/matthewdias/m3n3van/keyboard.json index d46949cff5..c5b26b3e9d 100644 --- a/keyboards/matthewdias/m3n3van/keyboard.json +++ b/keyboards/matthewdias/m3n3van/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/matthewdias/minim/keyboard.json b/keyboards/matthewdias/minim/keyboard.json index 47d85abdb6..8735545ba7 100644 --- a/keyboards/matthewdias/minim/keyboard.json +++ b/keyboards/matthewdias/minim/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matthewdias/model_v/keyboard.json b/keyboards/matthewdias/model_v/keyboard.json index 24c88c8caa..5bcda4e887 100644 --- a/keyboards/matthewdias/model_v/keyboard.json +++ b/keyboards/matthewdias/model_v/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/matthewdias/txuu/keyboard.json b/keyboards/matthewdias/txuu/keyboard.json index 4bc078f7e5..035eca2490 100644 --- a/keyboards/matthewdias/txuu/keyboard.json +++ b/keyboards/matthewdias/txuu/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/maxipad/info.json b/keyboards/maxipad/info.json index 29d8e3598a..b058bf15d0 100644 --- a/keyboards/maxipad/info.json +++ b/keyboards/maxipad/info.json @@ -4,7 +4,6 @@ "maintainer": "qmk", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/maxr1998/pulse4k/keyboard.json b/keyboards/maxr1998/pulse4k/keyboard.json index 22d1d67a51..a2bdcb5068 100644 --- a/keyboards/maxr1998/pulse4k/keyboard.json +++ b/keyboards/maxr1998/pulse4k/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/mazestudio/jocker/keyboard.json b/keyboards/mazestudio/jocker/keyboard.json index 3b49629aa3..55e0a7de66 100644 --- a/keyboards/mazestudio/jocker/keyboard.json +++ b/keyboards/mazestudio/jocker/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mb44/keyboard.json b/keyboards/mb44/keyboard.json index d8c1216233..5c2eeb6666 100644 --- a/keyboards/mb44/keyboard.json +++ b/keyboards/mb44/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mc_76k/keyboard.json b/keyboards/mc_76k/keyboard.json index 7be3c8f1ec..d277ec95d5 100644 --- a/keyboards/mc_76k/keyboard.json +++ b/keyboards/mc_76k/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mechanickeys/miniashen40/keyboard.json b/keyboards/mechanickeys/miniashen40/keyboard.json index 6ce6d4a2dc..36eb0a4300 100644 --- a/keyboards/mechanickeys/miniashen40/keyboard.json +++ b/keyboards/mechanickeys/miniashen40/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mechanickeys/undead60m/keyboard.json b/keyboards/mechanickeys/undead60m/keyboard.json index f54284387c..5b5f5ca167 100644 --- a/keyboards/mechanickeys/undead60m/keyboard.json +++ b/keyboards/mechanickeys/undead60m/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechbrewery/mb65h/keyboard.json b/keyboards/mechbrewery/mb65h/keyboard.json index 897dfc2b12..c49abe946a 100644 --- a/keyboards/mechbrewery/mb65h/keyboard.json +++ b/keyboards/mechbrewery/mb65h/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mechbrewery/mb65s/keyboard.json b/keyboards/mechbrewery/mb65s/keyboard.json index aac50f2219..17472eeecf 100644 --- a/keyboards/mechbrewery/mb65s/keyboard.json +++ b/keyboards/mechbrewery/mb65s/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mechkeys/acr60/keyboard.json b/keyboards/mechkeys/acr60/keyboard.json index 5a34ca17c7..a3eed2d74e 100644 --- a/keyboards/mechkeys/acr60/keyboard.json +++ b/keyboards/mechkeys/acr60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechkeys/alu84/keyboard.json b/keyboards/mechkeys/alu84/keyboard.json index 21a227e71b..3d3355a3ee 100644 --- a/keyboards/mechkeys/alu84/keyboard.json +++ b/keyboards/mechkeys/alu84/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mechkeys/mk60/keyboard.json b/keyboards/mechkeys/mk60/keyboard.json index 2ef534f2f4..70c8bec2c6 100644 --- a/keyboards/mechkeys/mk60/keyboard.json +++ b/keyboards/mechkeys/mk60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechllama/g35/info.json b/keyboards/mechllama/g35/info.json index b223cd6441..fab11db131 100644 --- a/keyboards/mechllama/g35/info.json +++ b/keyboards/mechllama/g35/info.json @@ -5,7 +5,6 @@ "maintainer": "kaylynb", "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json b/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json index 2ae6877f08..a7cd8faa78 100644 --- a/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json +++ b/keyboards/mechlovin/adelais/rgb_led/rev3/keyboard.json @@ -7,7 +7,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "rgb_matrix": true, diff --git a/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json b/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json index e2b3346763..99a31763b9 100644 --- a/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json +++ b/keyboards/mechlovin/adelais/standard_led/avr/rev1/keyboard.json @@ -7,7 +7,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "backlight": true, "rgblight": true diff --git a/keyboards/mechlovin/infinityce/keyboard.json b/keyboards/mechlovin/infinityce/keyboard.json index 08981c7cb5..ea62853ef4 100644 --- a/keyboards/mechlovin/infinityce/keyboard.json +++ b/keyboards/mechlovin/infinityce/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kanu/keyboard.json b/keyboards/mechlovin/kanu/keyboard.json index 2ade6f1962..a6b6588cc8 100644 --- a/keyboards/mechlovin/kanu/keyboard.json +++ b/keyboards/mechlovin/kanu/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kay60/keyboard.json b/keyboards/mechlovin/kay60/keyboard.json index b666450bd8..e7b26f4560 100644 --- a/keyboards/mechlovin/kay60/keyboard.json +++ b/keyboards/mechlovin/kay60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mechlovin/kay65/keyboard.json b/keyboards/mechlovin/kay65/keyboard.json index fa2fdf0095..5ec1d34591 100644 --- a/keyboards/mechlovin/kay65/keyboard.json +++ b/keyboards/mechlovin/kay65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechlovin/pisces/keyboard.json b/keyboards/mechlovin/pisces/keyboard.json index 9dc1e34e0c..4186a1c750 100644 --- a/keyboards/mechlovin/pisces/keyboard.json +++ b/keyboards/mechlovin/pisces/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mechstudio/dawn/keyboard.json b/keyboards/mechstudio/dawn/keyboard.json index 76d990a677..4c96a37c52 100644 --- a/keyboards/mechstudio/dawn/keyboard.json +++ b/keyboards/mechstudio/dawn/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mechwild/mercutio/keyboard.json b/keyboards/mechwild/mercutio/keyboard.json index aff9485140..d0b7d51029 100644 --- a/keyboards/mechwild/mercutio/keyboard.json +++ b/keyboards/mechwild/mercutio/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/murphpad/keyboard.json b/keyboards/mechwild/murphpad/keyboard.json index 303f3a9c96..8ab90bd937 100644 --- a/keyboards/mechwild/murphpad/keyboard.json +++ b/keyboards/mechwild/murphpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/obe/info.json b/keyboards/mechwild/obe/info.json index ca2709675d..5244062e9a 100644 --- a/keyboards/mechwild/obe/info.json +++ b/keyboards/mechwild/obe/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mechwild/sugarglider/f401/keyboard.json b/keyboards/mechwild/sugarglider/f401/keyboard.json index bac52694ac..658f174275 100644 --- a/keyboards/mechwild/sugarglider/f401/keyboard.json +++ b/keyboards/mechwild/sugarglider/f401/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true, diff --git a/keyboards/mechwild/sugarglider/f411/keyboard.json b/keyboards/mechwild/sugarglider/f411/keyboard.json index 91c830f371..e990db524b 100644 --- a/keyboards/mechwild/sugarglider/f411/keyboard.json +++ b/keyboards/mechwild/sugarglider/f411/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true, diff --git a/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json b/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json index bac52694ac..658f174275 100644 --- a/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json +++ b/keyboards/mechwild/sugarglider/wide_oled/f401/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true, diff --git a/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json b/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json index 91c830f371..e990db524b 100644 --- a/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json +++ b/keyboards/mechwild/sugarglider/wide_oled/f411/keyboard.json @@ -4,7 +4,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true, diff --git a/keyboards/meletrix/zoom65/keyboard.json b/keyboards/meletrix/zoom65/keyboard.json index 997b6d55e3..ce83a60be4 100644 --- a/keyboards/meletrix/zoom65/keyboard.json +++ b/keyboards/meletrix/zoom65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/meletrix/zoom65_lite/keyboard.json b/keyboards/meletrix/zoom65_lite/keyboard.json index 990c34206d..3977ea668a 100644 --- a/keyboards/meletrix/zoom65_lite/keyboard.json +++ b/keyboards/meletrix/zoom65_lite/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/meletrix/zoom75/keyboard.json b/keyboards/meletrix/zoom75/keyboard.json index 0cf5fd7ee9..04e11e19ba 100644 --- a/keyboards/meletrix/zoom75/keyboard.json +++ b/keyboards/meletrix/zoom75/keyboard.json @@ -20,7 +20,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/meletrix/zoom87/keyboard.json b/keyboards/meletrix/zoom87/keyboard.json index b2cec7968f..4f9c6812a6 100644 --- a/keyboards/meletrix/zoom87/keyboard.json +++ b/keyboards/meletrix/zoom87/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/meletrix/zoom98/keyboard.json b/keyboards/meletrix/zoom98/keyboard.json index d8f870af85..9665327972 100644 --- a/keyboards/meletrix/zoom98/keyboard.json +++ b/keyboards/meletrix/zoom98/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "rgb_matrix": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/melgeek/mach80/rev1/keyboard.json b/keyboards/melgeek/mach80/rev1/keyboard.json index 5c504c4d23..78a8dbf0f6 100644 --- a/keyboards/melgeek/mach80/rev1/keyboard.json +++ b/keyboards/melgeek/mach80/rev1/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mach80/rev2/keyboard.json b/keyboards/melgeek/mach80/rev2/keyboard.json index 5c504c4d23..78a8dbf0f6 100644 --- a/keyboards/melgeek/mach80/rev2/keyboard.json +++ b/keyboards/melgeek/mach80/rev2/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj61/rev1/keyboard.json b/keyboards/melgeek/mj61/rev1/keyboard.json index 24ca981a32..b388908579 100644 --- a/keyboards/melgeek/mj61/rev1/keyboard.json +++ b/keyboards/melgeek/mj61/rev1/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj61/rev2/keyboard.json b/keyboards/melgeek/mj61/rev2/keyboard.json index c731085751..fcff9e10a5 100644 --- a/keyboards/melgeek/mj61/rev2/keyboard.json +++ b/keyboards/melgeek/mj61/rev2/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj63/rev1/keyboard.json b/keyboards/melgeek/mj63/rev1/keyboard.json index 24ca981a32..b388908579 100644 --- a/keyboards/melgeek/mj63/rev1/keyboard.json +++ b/keyboards/melgeek/mj63/rev1/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj63/rev2/keyboard.json b/keyboards/melgeek/mj63/rev2/keyboard.json index c731085751..fcff9e10a5 100644 --- a/keyboards/melgeek/mj63/rev2/keyboard.json +++ b/keyboards/melgeek/mj63/rev2/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev1/keyboard.json b/keyboards/melgeek/mj64/rev1/keyboard.json index 24ca981a32..b388908579 100644 --- a/keyboards/melgeek/mj64/rev1/keyboard.json +++ b/keyboards/melgeek/mj64/rev1/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev2/keyboard.json b/keyboards/melgeek/mj64/rev2/keyboard.json index 24ca981a32..b388908579 100644 --- a/keyboards/melgeek/mj64/rev2/keyboard.json +++ b/keyboards/melgeek/mj64/rev2/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj64/rev3/keyboard.json b/keyboards/melgeek/mj64/rev3/keyboard.json index c731085751..fcff9e10a5 100644 --- a/keyboards/melgeek/mj64/rev3/keyboard.json +++ b/keyboards/melgeek/mj64/rev3/keyboard.json @@ -1,7 +1,6 @@ { "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mj6xy/rev3/keyboard.json b/keyboards/melgeek/mj6xy/rev3/keyboard.json index 7207652c47..993887a092 100644 --- a/keyboards/melgeek/mj6xy/rev3/keyboard.json +++ b/keyboards/melgeek/mj6xy/rev3/keyboard.json @@ -2,7 +2,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mojo68/rev1/keyboard.json b/keyboards/melgeek/mojo68/rev1/keyboard.json index 5ea109520a..88f17665b4 100755 --- a/keyboards/melgeek/mojo68/rev1/keyboard.json +++ b/keyboards/melgeek/mojo68/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/mojo75/rev1/keyboard.json b/keyboards/melgeek/mojo75/rev1/keyboard.json index 5b2ab380a7..0b0a722c90 100644 --- a/keyboards/melgeek/mojo75/rev1/keyboard.json +++ b/keyboards/melgeek/mojo75/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/tegic/rev1/keyboard.json b/keyboards/melgeek/tegic/rev1/keyboard.json index b39f2345fa..5a1ca4f350 100644 --- a/keyboards/melgeek/tegic/rev1/keyboard.json +++ b/keyboards/melgeek/tegic/rev1/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/melgeek/z70ultra/rev1/keyboard.json b/keyboards/melgeek/z70ultra/rev1/keyboard.json index ef59825d70..5a8868265b 100644 --- a/keyboards/melgeek/z70ultra/rev1/keyboard.json +++ b/keyboards/melgeek/z70ultra/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/meow48/keyboard.json b/keyboards/meow48/keyboard.json index 456d2fb58e..7861555648 100644 --- a/keyboards/meow48/keyboard.json +++ b/keyboards/meow48/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/meow65/keyboard.json b/keyboards/meow65/keyboard.json index f72098cb4c..40afbb0c8b 100644 --- a/keyboards/meow65/keyboard.json +++ b/keyboards/meow65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/merge/iso_macro/keyboard.json b/keyboards/merge/iso_macro/keyboard.json index 087fda9616..5fcfc6fcb1 100644 --- a/keyboards/merge/iso_macro/keyboard.json +++ b/keyboards/merge/iso_macro/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/uc1/keyboard.json b/keyboards/merge/uc1/keyboard.json index 84059afdab..496b9a6b5f 100644 --- a/keyboards/merge/uc1/keyboard.json +++ b/keyboards/merge/uc1/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/um70/keyboard.json b/keyboards/merge/um70/keyboard.json index cd15bc90ac..7ebb61f7fe 100644 --- a/keyboards/merge/um70/keyboard.json +++ b/keyboards/merge/um70/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/merge/um80/keyboard.json b/keyboards/merge/um80/keyboard.json index 5ef7c427cd..6024f6e485 100644 --- a/keyboards/merge/um80/keyboard.json +++ b/keyboards/merge/um80/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mesa/mesa_tkl/keyboard.json b/keyboards/mesa/mesa_tkl/keyboard.json index 8c9c3425fc..ac84dbf94f 100644 --- a/keyboards/mesa/mesa_tkl/keyboard.json +++ b/keyboards/mesa/mesa_tkl/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/meson/keyboard.json b/keyboards/meson/keyboard.json index 81a6140c23..b931403769 100644 --- a/keyboards/meson/keyboard.json +++ b/keyboards/meson/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/metamechs/timberwolf/keyboard.json b/keyboards/metamechs/timberwolf/keyboard.json index a78af54062..6ccfdab449 100644 --- a/keyboards/metamechs/timberwolf/keyboard.json +++ b/keyboards/metamechs/timberwolf/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/miiiw/blackio83/rev_0100/keyboard.json b/keyboards/miiiw/blackio83/rev_0100/keyboard.json index 00f6402ec2..e5cf747537 100644 --- a/keyboards/miiiw/blackio83/rev_0100/keyboard.json +++ b/keyboards/miiiw/blackio83/rev_0100/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "deferred_exec": true, "dip_switch": true, "extrakey": true, diff --git a/keyboards/mikeneko65/keyboard.json b/keyboards/mikeneko65/keyboard.json index 4b3c5142de..1d1d50a796 100644 --- a/keyboards/mikeneko65/keyboard.json +++ b/keyboards/mikeneko65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/miller/gm862/keyboard.json b/keyboards/miller/gm862/keyboard.json index 20aeffe1e6..db08a580a9 100644 --- a/keyboards/miller/gm862/keyboard.json +++ b/keyboards/miller/gm862/keyboard.json @@ -43,7 +43,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/millipad/keyboard.json b/keyboards/millipad/keyboard.json index b3970fceb2..d2761b8b1b 100644 --- a/keyboards/millipad/keyboard.json +++ b/keyboards/millipad/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mincedshon/ecila/keyboard.json b/keyboards/mincedshon/ecila/keyboard.json index a5ec2f5a0b..ca0a20568a 100644 --- a/keyboards/mincedshon/ecila/keyboard.json +++ b/keyboards/mincedshon/ecila/keyboard.json @@ -32,7 +32,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mini_elixivy/keyboard.json b/keyboards/mini_elixivy/keyboard.json index b2b26f99c4..9f6bfb91c0 100644 --- a/keyboards/mini_elixivy/keyboard.json +++ b/keyboards/mini_elixivy/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mini_ten_key_plus/keyboard.json b/keyboards/mini_ten_key_plus/keyboard.json index da3d467068..e3b017a253 100644 --- a/keyboards/mini_ten_key_plus/keyboard.json +++ b/keyboards/mini_ten_key_plus/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/minimacro5/keyboard.json b/keyboards/minimacro5/keyboard.json index 18d21acc7a..033bc1e85a 100644 --- a/keyboards/minimacro5/keyboard.json +++ b/keyboards/minimacro5/keyboard.json @@ -38,7 +38,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/minimon/bartlesplit/keyboard.json b/keyboards/minimon/bartlesplit/keyboard.json index ceae2bb88e..6047d17645 100644 --- a/keyboards/minimon/bartlesplit/keyboard.json +++ b/keyboards/minimon/bartlesplit/keyboard.json @@ -4,7 +4,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/minimon/index_tab/keyboard.json b/keyboards/minimon/index_tab/keyboard.json index 5fe07014bb..0c594b42ac 100644 --- a/keyboards/minimon/index_tab/keyboard.json +++ b/keyboards/minimon/index_tab/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mint60/keyboard.json b/keyboards/mint60/keyboard.json index 85eef9889c..1bb54aebd9 100644 --- a/keyboards/mint60/keyboard.json +++ b/keyboards/mint60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/misonoworks/chocolatebar/keyboard.json b/keyboards/misonoworks/chocolatebar/keyboard.json index 0ecfa3b660..75b10ae561 100644 --- a/keyboards/misonoworks/chocolatebar/keyboard.json +++ b/keyboards/misonoworks/chocolatebar/keyboard.json @@ -26,7 +26,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/misonoworks/karina/keyboard.json b/keyboards/misonoworks/karina/keyboard.json index 5c095c8957..1266c07cea 100644 --- a/keyboards/misonoworks/karina/keyboard.json +++ b/keyboards/misonoworks/karina/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/misterknife/knife66/keyboard.json b/keyboards/misterknife/knife66/keyboard.json index 43e65e66ac..bfb25bb422 100644 --- a/keyboards/misterknife/knife66/keyboard.json +++ b/keyboards/misterknife/knife66/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/misterknife/knife66_iso/keyboard.json b/keyboards/misterknife/knife66_iso/keyboard.json index 9f02cc4fd5..f35609b3af 100644 --- a/keyboards/misterknife/knife66_iso/keyboard.json +++ b/keyboards/misterknife/knife66_iso/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mk65/keyboard.json b/keyboards/mk65/keyboard.json index c8cac57e39..55bfdc0a34 100644 --- a/keyboards/mk65/keyboard.json +++ b/keyboards/mk65/keyboard.json @@ -26,7 +26,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true }, diff --git a/keyboards/ml/gas75/keyboard.json b/keyboards/ml/gas75/keyboard.json index 9fe14a6d99..b7736884fc 100644 --- a/keyboards/ml/gas75/keyboard.json +++ b/keyboards/ml/gas75/keyboard.json @@ -58,7 +58,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/mlego/m48/rev1/keyboard.json b/keyboards/mlego/m48/rev1/keyboard.json index 951d8713a1..72e0ca383f 100644 --- a/keyboards/mlego/m48/rev1/keyboard.json +++ b/keyboards/mlego/m48/rev1/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m60/rev1/keyboard.json b/keyboards/mlego/m60/rev1/keyboard.json index c2bb7df614..36bfcb15b6 100644 --- a/keyboards/mlego/m60/rev1/keyboard.json +++ b/keyboards/mlego/m60/rev1/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev1/keyboard.json b/keyboards/mlego/m65/rev1/keyboard.json index 656128fdfa..0e69b96a19 100644 --- a/keyboards/mlego/m65/rev1/keyboard.json +++ b/keyboards/mlego/m65/rev1/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev3/keyboard.json b/keyboards/mlego/m65/rev3/keyboard.json index 386f929a11..21efcc027b 100644 --- a/keyboards/mlego/m65/rev3/keyboard.json +++ b/keyboards/mlego/m65/rev3/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mlego/m65/rev4/keyboard.json b/keyboards/mlego/m65/rev4/keyboard.json index a83f363bb1..58c2bad7bf 100644 --- a/keyboards/mlego/m65/rev4/keyboard.json +++ b/keyboards/mlego/m65/rev4/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/mmkzoo65/keyboard.json b/keyboards/mmkzoo65/keyboard.json index d94cf6cf18..fdd5f50b60 100644 --- a/keyboards/mmkzoo65/keyboard.json +++ b/keyboards/mmkzoo65/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/mntre/keyboard.json b/keyboards/mntre/keyboard.json index 258ffca9c4..41e6e618a6 100644 --- a/keyboards/mntre/keyboard.json +++ b/keyboards/mntre/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/mode/m256ws/keyboard.json b/keyboards/mode/m256ws/keyboard.json index 01190c2de5..0574be8406 100644 --- a/keyboards/mode/m256ws/keyboard.json +++ b/keyboards/mode/m256ws/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mode/m60h/keyboard.json b/keyboards/mode/m60h/keyboard.json index c4c1297c19..39cbdb473f 100644 --- a/keyboards/mode/m60h/keyboard.json +++ b/keyboards/mode/m60h/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mode/m60h_f/keyboard.json b/keyboards/mode/m60h_f/keyboard.json index b3a5aa5b3d..f04b599d84 100644 --- a/keyboards/mode/m60h_f/keyboard.json +++ b/keyboards/mode/m60h_f/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mode/m60s/keyboard.json b/keyboards/mode/m60s/keyboard.json index 18de64284b..993af9b798 100644 --- a/keyboards/mode/m60s/keyboard.json +++ b/keyboards/mode/m60s/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mode/m65ha_alpha/keyboard.json b/keyboards/mode/m65ha_alpha/keyboard.json index 2623a6643a..7794d16396 100644 --- a/keyboards/mode/m65ha_alpha/keyboard.json +++ b/keyboards/mode/m65ha_alpha/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m65hi_alpha/keyboard.json b/keyboards/mode/m65hi_alpha/keyboard.json index db301ccb19..4d3bf4bf0a 100644 --- a/keyboards/mode/m65hi_alpha/keyboard.json +++ b/keyboards/mode/m65hi_alpha/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m65s/keyboard.json b/keyboards/mode/m65s/keyboard.json index 91e39293cb..29221f27d5 100644 --- a/keyboards/mode/m65s/keyboard.json +++ b/keyboards/mode/m65s/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m75h/keyboard.json b/keyboards/mode/m75h/keyboard.json index 39fae0eb3a..6e6c7b4b96 100644 --- a/keyboards/mode/m75h/keyboard.json +++ b/keyboards/mode/m75h/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m75s/keyboard.json b/keyboards/mode/m75s/keyboard.json index 18090c8c28..822d31aebc 100644 --- a/keyboards/mode/m75s/keyboard.json +++ b/keyboards/mode/m75s/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mode/m80v1/m80h/keyboard.json b/keyboards/mode/m80v1/m80h/keyboard.json index 5acb6a3fdd..1e681e7f5c 100644 --- a/keyboards/mode/m80v1/m80h/keyboard.json +++ b/keyboards/mode/m80v1/m80h/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v1/m80s/keyboard.json b/keyboards/mode/m80v1/m80s/keyboard.json index 166d071640..5e88ff67bb 100644 --- a/keyboards/mode/m80v1/m80s/keyboard.json +++ b/keyboards/mode/m80v1/m80s/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v2/m80v2h/keyboard.json b/keyboards/mode/m80v2/m80v2h/keyboard.json index 86e4f563cc..b4bd8e124e 100644 --- a/keyboards/mode/m80v2/m80v2h/keyboard.json +++ b/keyboards/mode/m80v2/m80v2h/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mode/m80v2/m80v2s/keyboard.json b/keyboards/mode/m80v2/m80v2s/keyboard.json index 46fde3c1ca..9460ab7308 100644 --- a/keyboards/mode/m80v2/m80v2s/keyboard.json +++ b/keyboards/mode/m80v2/m80v2s/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/mokey/ginkgo65/keyboard.json b/keyboards/mokey/ginkgo65/keyboard.json index fe3e5ad6ef..7279f82cc4 100644 --- a/keyboards/mokey/ginkgo65/keyboard.json +++ b/keyboards/mokey/ginkgo65/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/ginkgo65hot/keyboard.json b/keyboards/mokey/ginkgo65hot/keyboard.json index d11c81be58..f39c490b2f 100644 --- a/keyboards/mokey/ginkgo65hot/keyboard.json +++ b/keyboards/mokey/ginkgo65hot/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/ibis80/keyboard.json b/keyboards/mokey/ibis80/keyboard.json index 2dc9ec4e05..a9971d2392 100644 --- a/keyboards/mokey/ibis80/keyboard.json +++ b/keyboards/mokey/ibis80/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/mokey/luckycat70/keyboard.json b/keyboards/mokey/luckycat70/keyboard.json index e0f0ee9029..e714454972 100644 --- a/keyboards/mokey/luckycat70/keyboard.json +++ b/keyboards/mokey/luckycat70/keyboard.json @@ -12,7 +12,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/mokey/mokey63/keyboard.json b/keyboards/mokey/mokey63/keyboard.json index 6374ec508f..88b7ce3f7f 100644 --- a/keyboards/mokey/mokey63/keyboard.json +++ b/keyboards/mokey/mokey63/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/mokey64/keyboard.json b/keyboards/mokey/mokey64/keyboard.json index f5b34d69a2..62b6fc2ac1 100644 --- a/keyboards/mokey/mokey64/keyboard.json +++ b/keyboards/mokey/mokey64/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/xox70/keyboard.json b/keyboards/mokey/xox70/keyboard.json index 74c0dcbc86..d746a23471 100644 --- a/keyboards/mokey/xox70/keyboard.json +++ b/keyboards/mokey/xox70/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/mokey/xox70hot/keyboard.json b/keyboards/mokey/xox70hot/keyboard.json index 152839a674..b2bf671020 100644 --- a/keyboards/mokey/xox70hot/keyboard.json +++ b/keyboards/mokey/xox70hot/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/momoka_ergo/keyboard.json b/keyboards/momoka_ergo/keyboard.json index 9886dd4d4e..3b2ba6664f 100644 --- a/keyboards/momoka_ergo/keyboard.json +++ b/keyboards/momoka_ergo/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/momokai/aurora/keyboard.json b/keyboards/momokai/aurora/keyboard.json index e095daa8b1..1c4bc8e12f 100644 --- a/keyboards/momokai/aurora/keyboard.json +++ b/keyboards/momokai/aurora/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/momokai/tap_duo/keyboard.json b/keyboards/momokai/tap_duo/keyboard.json index 636ed0209c..1d5302985c 100644 --- a/keyboards/momokai/tap_duo/keyboard.json +++ b/keyboards/momokai/tap_duo/keyboard.json @@ -50,7 +50,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/momokai/tap_trio/keyboard.json b/keyboards/momokai/tap_trio/keyboard.json index c0e297a782..41da5585f6 100644 --- a/keyboards/momokai/tap_trio/keyboard.json +++ b/keyboards/momokai/tap_trio/keyboard.json @@ -50,7 +50,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/monoflex60/keyboard.json b/keyboards/monoflex60/keyboard.json index c7ea113099..0becab2b63 100644 --- a/keyboards/monoflex60/keyboard.json +++ b/keyboards/monoflex60/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/monsgeek/m1/keyboard.json b/keyboards/monsgeek/m1/keyboard.json index 937961a866..4cca5c8686 100644 --- a/keyboards/monsgeek/m1/keyboard.json +++ b/keyboards/monsgeek/m1/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "encoder": true, "rgb_matrix": true diff --git a/keyboards/monsgeek/m3/keyboard.json b/keyboards/monsgeek/m3/keyboard.json index 8373271fb3..9d2ea18c9d 100644 --- a/keyboards/monsgeek/m3/keyboard.json +++ b/keyboards/monsgeek/m3/keyboard.json @@ -21,7 +21,6 @@ "features": { "bootmagic": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/monsgeek/m5/keyboard.json b/keyboards/monsgeek/m5/keyboard.json index db19740b1a..92d6add3fe 100644 --- a/keyboards/monsgeek/m5/keyboard.json +++ b/keyboards/monsgeek/m5/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/monsgeek/m6/keyboard.json b/keyboards/monsgeek/m6/keyboard.json index e770b8d4af..afe38eb0da 100644 --- a/keyboards/monsgeek/m6/keyboard.json +++ b/keyboards/monsgeek/m6/keyboard.json @@ -15,7 +15,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/moondrop/dash75/info.json b/keyboards/moondrop/dash75/info.json index 7d04d7916e..39772dc689 100644 --- a/keyboards/moondrop/dash75/info.json +++ b/keyboards/moondrop/dash75/info.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/morizon/keyboard.json b/keyboards/morizon/keyboard.json index 73097dd113..13999e5753 100644 --- a/keyboards/morizon/keyboard.json +++ b/keyboards/morizon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mountainmechdesigns/teton_78/keyboard.json b/keyboards/mountainmechdesigns/teton_78/keyboard.json index 9385edb8a4..ba7cfdd2c3 100644 --- a/keyboards/mountainmechdesigns/teton_78/keyboard.json +++ b/keyboards/mountainmechdesigns/teton_78/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ms_sculpt/keyboard.json b/keyboards/ms_sculpt/keyboard.json index 153668baaf..2193c6a870 100644 --- a/keyboards/ms_sculpt/keyboard.json +++ b/keyboards/ms_sculpt/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/mss_studio/m63_rgb/keyboard.json b/keyboards/mss_studio/m63_rgb/keyboard.json index 7ca20ede1b..16a4c5295f 100644 --- a/keyboards/mss_studio/m63_rgb/keyboard.json +++ b/keyboards/mss_studio/m63_rgb/keyboard.json @@ -61,7 +61,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mss_studio/m64_rgb/keyboard.json b/keyboards/mss_studio/m64_rgb/keyboard.json index 52f0ccc8fc..5b53cd58c7 100644 --- a/keyboards/mss_studio/m64_rgb/keyboard.json +++ b/keyboards/mss_studio/m64_rgb/keyboard.json @@ -61,7 +61,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mt/blocked65/keyboard.json b/keyboards/mt/blocked65/keyboard.json index da7e4fc6ee..0f66b9f9cc 100644 --- a/keyboards/mt/blocked65/keyboard.json +++ b/keyboards/mt/blocked65/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mt/mt40/keyboard.json b/keyboards/mt/mt40/keyboard.json index 6afa3f12a7..924c33a4fb 100644 --- a/keyboards/mt/mt40/keyboard.json +++ b/keyboards/mt/mt40/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/mt/mt64rgb/keyboard.json b/keyboards/mt/mt64rgb/keyboard.json index a901136e6e..57e827f1e3 100644 --- a/keyboards/mt/mt64rgb/keyboard.json +++ b/keyboards/mt/mt64rgb/keyboard.json @@ -138,7 +138,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/mt/mt84/keyboard.json b/keyboards/mt/mt84/keyboard.json index 1e17e5681f..03926e8a05 100644 --- a/keyboards/mt/mt84/keyboard.json +++ b/keyboards/mt/mt84/keyboard.json @@ -155,7 +155,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mt/mt980/keyboard.json b/keyboards/mt/mt980/keyboard.json index bdf8e9db80..199231f7d8 100644 --- a/keyboards/mt/mt980/keyboard.json +++ b/keyboards/mt/mt980/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/mtbkeys/mtb60/hotswap/keyboard.json b/keyboards/mtbkeys/mtb60/hotswap/keyboard.json index c8ef4316be..87326a7145 100644 --- a/keyboards/mtbkeys/mtb60/hotswap/keyboard.json +++ b/keyboards/mtbkeys/mtb60/hotswap/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mtbkeys/mtb60/solder/keyboard.json b/keyboards/mtbkeys/mtb60/solder/keyboard.json index b8e3287de7..59ab34b420 100644 --- a/keyboards/mtbkeys/mtb60/solder/keyboard.json +++ b/keyboards/mtbkeys/mtb60/solder/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/murcielago/rev1/keyboard.json b/keyboards/murcielago/rev1/keyboard.json index 2b2aa862e3..88203e67fb 100644 --- a/keyboards/murcielago/rev1/keyboard.json +++ b/keyboards/murcielago/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/alicekk/keyboard.json b/keyboards/mwstudio/alicekk/keyboard.json index 61f03115d0..355437f953 100644 --- a/keyboards/mwstudio/alicekk/keyboard.json +++ b/keyboards/mwstudio/alicekk/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw65_black/keyboard.json b/keyboards/mwstudio/mw65_black/keyboard.json index c6667671d8..8c542ec042 100644 --- a/keyboards/mwstudio/mw65_black/keyboard.json +++ b/keyboards/mwstudio/mw65_black/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw65_rgb/keyboard.json b/keyboards/mwstudio/mw65_rgb/keyboard.json index e68ed85111..ce8e3f978c 100644 --- a/keyboards/mwstudio/mw65_rgb/keyboard.json +++ b/keyboards/mwstudio/mw65_rgb/keyboard.json @@ -58,7 +58,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw660/keyboard.json b/keyboards/mwstudio/mw660/keyboard.json index 3e8fc91eef..bf0cd6781c 100644 --- a/keyboards/mwstudio/mw660/keyboard.json +++ b/keyboards/mwstudio/mw660/keyboard.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mwstudio/mw75/keyboard.json b/keyboards/mwstudio/mw75/keyboard.json index e7169d37a6..489e711c5b 100644 --- a/keyboards/mwstudio/mw75/keyboard.json +++ b/keyboards/mwstudio/mw75/keyboard.json @@ -55,7 +55,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw75r2/keyboard.json b/keyboards/mwstudio/mw75r2/keyboard.json index 2ec31300e9..10c6a226ca 100644 --- a/keyboards/mwstudio/mw75r2/keyboard.json +++ b/keyboards/mwstudio/mw75r2/keyboard.json @@ -43,7 +43,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/mwstudio/mw80/keyboard.json b/keyboards/mwstudio/mw80/keyboard.json index c5d7c8d037..327afd3155 100644 --- a/keyboards/mwstudio/mw80/keyboard.json +++ b/keyboards/mwstudio/mw80/keyboard.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/mxss/keyboard.json b/keyboards/mxss/keyboard.json index d6dc4b2a79..1c8080fdbe 100644 --- a/keyboards/mxss/keyboard.json +++ b/keyboards/mxss/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/mysticworks/wyvern/keyboard.json b/keyboards/mysticworks/wyvern/keyboard.json index bccf089120..ad2657813b 100644 --- a/keyboards/mysticworks/wyvern/keyboard.json +++ b/keyboards/mysticworks/wyvern/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/navi60/keyboard.json b/keyboards/navi60/keyboard.json index 8266e9b2b1..47983e3d19 100644 --- a/keyboards/navi60/keyboard.json +++ b/keyboards/navi60/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "layouts": { diff --git a/keyboards/ncc1701kb/keyboard.json b/keyboards/ncc1701kb/keyboard.json index 13e244f7ce..f939b1ac35 100644 --- a/keyboards/ncc1701kb/keyboard.json +++ b/keyboards/ncc1701kb/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/neito/keyboard.json b/keyboards/neito/keyboard.json index 7c9934fa65..2a5f3cecd2 100644 --- a/keyboards/neito/keyboard.json +++ b/keyboards/neito/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/element_hs/keyboard.json b/keyboards/neokeys/g67/element_hs/keyboard.json index 5245fb3fa0..0fadcc283a 100644 --- a/keyboards/neokeys/g67/element_hs/keyboard.json +++ b/keyboards/neokeys/g67/element_hs/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/hotswap/keyboard.json b/keyboards/neokeys/g67/hotswap/keyboard.json index 47a1786a5b..dc9a6748ce 100644 --- a/keyboards/neokeys/g67/hotswap/keyboard.json +++ b/keyboards/neokeys/g67/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/neokeys/g67/soldered/keyboard.json b/keyboards/neokeys/g67/soldered/keyboard.json index 896673f23e..e3242caa57 100644 --- a/keyboards/neokeys/g67/soldered/keyboard.json +++ b/keyboards/neokeys/g67/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/neson_design/nico/keyboard.json b/keyboards/neson_design/nico/keyboard.json index 96cfff16ef..a16e5e7d62 100644 --- a/keyboards/neson_design/nico/keyboard.json +++ b/keyboards/neson_design/nico/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/newgame40/keyboard.json b/keyboards/newgame40/keyboard.json index 0886f55623..ad59f2bcd0 100644 --- a/keyboards/newgame40/keyboard.json +++ b/keyboards/newgame40/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nibiria/stream15/keyboard.json b/keyboards/nibiria/stream15/keyboard.json index 12f24d41bb..704ddda490 100644 --- a/keyboards/nibiria/stream15/keyboard.json +++ b/keyboards/nibiria/stream15/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightingale_studios/hailey/keyboard.json b/keyboards/nightingale_studios/hailey/keyboard.json index 564be592a5..fbd2cf2a2f 100644 --- a/keyboards/nightingale_studios/hailey/keyboard.json +++ b/keyboards/nightingale_studios/hailey/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/adellein/keyboard.json b/keyboards/nightly_boards/adellein/keyboard.json index 889270637d..7e75e0474a 100644 --- a/keyboards/nightly_boards/adellein/keyboard.json +++ b/keyboards/nightly_boards/adellein/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/alter/rev1/keyboard.json b/keyboards/nightly_boards/alter/rev1/keyboard.json index df3d755ce8..ed6b2224a2 100644 --- a/keyboards/nightly_boards/alter/rev1/keyboard.json +++ b/keyboards/nightly_boards/alter/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/nightly_boards/alter_lite/keyboard.json b/keyboards/nightly_boards/alter_lite/keyboard.json index 01ec32939c..df8dfca7f7 100644 --- a/keyboards/nightly_boards/alter_lite/keyboard.json +++ b/keyboards/nightly_boards/alter_lite/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/conde60/keyboard.json b/keyboards/nightly_boards/conde60/keyboard.json index 65de34d6d7..e74dff445c 100644 --- a/keyboards/nightly_boards/conde60/keyboard.json +++ b/keyboards/nightly_boards/conde60/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nightly_boards/daily60/keyboard.json b/keyboards/nightly_boards/daily60/keyboard.json index 8c9f2616ec..dc8382a6f0 100644 --- a/keyboards/nightly_boards/daily60/keyboard.json +++ b/keyboards/nightly_boards/daily60/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/jisoo/keyboard.json b/keyboards/nightly_boards/jisoo/keyboard.json index c48c006d29..3ac607ec62 100644 --- a/keyboards/nightly_boards/jisoo/keyboard.json +++ b/keyboards/nightly_boards/jisoo/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/n2/keyboard.json b/keyboards/nightly_boards/n2/keyboard.json index 44b113c574..7f8d0e5e48 100644 --- a/keyboards/nightly_boards/n2/keyboard.json +++ b/keyboards/nightly_boards/n2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/nightly_boards/n60_s/keyboard.json b/keyboards/nightly_boards/n60_s/keyboard.json index 4689a631ac..4d6a53dd48 100644 --- a/keyboards/nightly_boards/n60_s/keyboard.json +++ b/keyboards/nightly_boards/n60_s/keyboard.json @@ -13,7 +13,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/n87/keyboard.json b/keyboards/nightly_boards/n87/keyboard.json index 327389384a..f8c75b893d 100644 --- a/keyboards/nightly_boards/n87/keyboard.json +++ b/keyboards/nightly_boards/n87/keyboard.json @@ -10,7 +10,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nightly_boards/n9/keyboard.json b/keyboards/nightly_boards/n9/keyboard.json index 2bf12b196f..e3d8a3be84 100644 --- a/keyboards/nightly_boards/n9/keyboard.json +++ b/keyboards/nightly_boards/n9/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/nightly_boards/octopad/keyboard.json b/keyboards/nightly_boards/octopad/keyboard.json index e2263a0ac1..af1015ea95 100644 --- a/keyboards/nightly_boards/octopad/keyboard.json +++ b/keyboards/nightly_boards/octopad/keyboard.json @@ -13,7 +13,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/octopadplus/keyboard.json b/keyboards/nightly_boards/octopadplus/keyboard.json index 78d89ab14c..8c802ab646 100644 --- a/keyboards/nightly_boards/octopadplus/keyboard.json +++ b/keyboards/nightly_boards/octopadplus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nightly_boards/paraluman/keyboard.json b/keyboards/nightly_boards/paraluman/keyboard.json index 9478617b3b..6ce7d0f111 100644 --- a/keyboards/nightly_boards/paraluman/keyboard.json +++ b/keyboards/nightly_boards/paraluman/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nightly_boards/ph_arisu/keyboard.json b/keyboards/nightly_boards/ph_arisu/keyboard.json index 1c307f0527..afcbdd905a 100644 --- a/keyboards/nightly_boards/ph_arisu/keyboard.json +++ b/keyboards/nightly_boards/ph_arisu/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nimrod/keyboard.json b/keyboards/nimrod/keyboard.json index 162b13341e..4b82ba3617 100644 --- a/keyboards/nimrod/keyboard.json +++ b/keyboards/nimrod/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json index 260153a622..4501c4daeb 100644 --- a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json +++ b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/nix_studio/lilith/keyboard.json b/keyboards/nix_studio/lilith/keyboard.json index d41a656d9d..569740d7e5 100644 --- a/keyboards/nix_studio/lilith/keyboard.json +++ b/keyboards/nix_studio/lilith/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nix_studio/oxalys80/keyboard.json b/keyboards/nix_studio/oxalys80/keyboard.json index 97d23456af..07e7419c56 100644 --- a/keyboards/nix_studio/oxalys80/keyboard.json +++ b/keyboards/nix_studio/oxalys80/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/nixkeyboards/day_off/keyboard.json b/keyboards/nixkeyboards/day_off/keyboard.json index 82719eb1ae..a1108ec098 100644 --- a/keyboards/nixkeyboards/day_off/keyboard.json +++ b/keyboards/nixkeyboards/day_off/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/jabberwocky/v1/keyboard.json b/keyboards/nopunin10did/jabberwocky/v1/keyboard.json index 277d5bf775..25f7f7a533 100644 --- a/keyboards/nopunin10did/jabberwocky/v1/keyboard.json +++ b/keyboards/nopunin10did/jabberwocky/v1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/jabberwocky/v2/keyboard.json b/keyboards/nopunin10did/jabberwocky/v2/keyboard.json index 53c035bc03..784732a54a 100644 --- a/keyboards/nopunin10did/jabberwocky/v2/keyboard.json +++ b/keyboards/nopunin10did/jabberwocky/v2/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/kastenwagen1840/keyboard.json b/keyboards/nopunin10did/kastenwagen1840/keyboard.json index 0118c3a4a8..7dea20455c 100644 --- a/keyboards/nopunin10did/kastenwagen1840/keyboard.json +++ b/keyboards/nopunin10did/kastenwagen1840/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/kastenwagen48/keyboard.json b/keyboards/nopunin10did/kastenwagen48/keyboard.json index f7b1264f00..0132d0fa61 100644 --- a/keyboards/nopunin10did/kastenwagen48/keyboard.json +++ b/keyboards/nopunin10did/kastenwagen48/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/nopunin10did/railroad/rev0/keyboard.json b/keyboards/nopunin10did/railroad/rev0/keyboard.json index 6e70455d4a..92c878c571 100644 --- a/keyboards/nopunin10did/railroad/rev0/keyboard.json +++ b/keyboards/nopunin10did/railroad/rev0/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nopunin10did/styrkatmel/keyboard.json b/keyboards/nopunin10did/styrkatmel/keyboard.json index cc38a59f75..033357d8f2 100644 --- a/keyboards/nopunin10did/styrkatmel/keyboard.json +++ b/keyboards/nopunin10did/styrkatmel/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": false, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/novelkeys/nk1/keyboard.json b/keyboards/novelkeys/nk1/keyboard.json index 8df47acb66..cb055b71ca 100755 --- a/keyboards/novelkeys/nk1/keyboard.json +++ b/keyboards/novelkeys/nk1/keyboard.json @@ -33,7 +33,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_classic_tkl/keyboard.json b/keyboards/novelkeys/nk_classic_tkl/keyboard.json index 00f2c763d2..2df8322ed8 100755 --- a/keyboards/novelkeys/nk_classic_tkl/keyboard.json +++ b/keyboards/novelkeys/nk_classic_tkl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json b/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json index 54173de266..9944708955 100755 --- a/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json +++ b/keyboards/novelkeys/nk_classic_tkl_iso/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/nk_plus/keyboard.json b/keyboards/novelkeys/nk_plus/keyboard.json index a7e065e4f5..c4d1dc4df7 100755 --- a/keyboards/novelkeys/nk_plus/keyboard.json +++ b/keyboards/novelkeys/nk_plus/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/novelkeys/novelpad/keyboard.json b/keyboards/novelkeys/novelpad/keyboard.json index 9cdaa81e5f..340c30c0d9 100644 --- a/keyboards/novelkeys/novelpad/keyboard.json +++ b/keyboards/novelkeys/novelpad/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/noxary/268_2/keyboard.json b/keyboards/noxary/268_2/keyboard.json index ee37cb2800..256a6fd458 100644 --- a/keyboards/noxary/268_2/keyboard.json +++ b/keyboards/noxary/268_2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/noxary/268_2_rgb/keyboard.json b/keyboards/noxary/268_2_rgb/keyboard.json index 7db5f23050..f4e1894078 100644 --- a/keyboards/noxary/268_2_rgb/keyboard.json +++ b/keyboards/noxary/268_2_rgb/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/noxary/378/keyboard.json b/keyboards/noxary/378/keyboard.json index 2927dc1f3d..39e6ceeb8e 100644 --- a/keyboards/noxary/378/keyboard.json +++ b/keyboards/noxary/378/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/noxary/valhalla/keyboard.json b/keyboards/noxary/valhalla/keyboard.json index 9d5a521fb5..087e762752 100644 --- a/keyboards/noxary/valhalla/keyboard.json +++ b/keyboards/noxary/valhalla/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/noxary/x268/keyboard.json b/keyboards/noxary/x268/keyboard.json index 2de3163fcc..024201c886 100644 --- a/keyboards/noxary/x268/keyboard.json +++ b/keyboards/noxary/x268/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/np12/keyboard.json b/keyboards/np12/keyboard.json index f21ef00d08..435f2db3b7 100644 --- a/keyboards/np12/keyboard.json +++ b/keyboards/np12/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/null/st110r2/keyboard.json b/keyboards/null/st110r2/keyboard.json index 7a3589cdcb..09d5cefd8d 100644 --- a/keyboards/null/st110r2/keyboard.json +++ b/keyboards/null/st110r2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/nyhxis/nfr_70/keyboard.json b/keyboards/nyhxis/nfr_70/keyboard.json index 993beb0332..b614d9b745 100644 --- a/keyboards/nyhxis/nfr_70/keyboard.json +++ b/keyboards/nyhxis/nfr_70/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/obosob/arch_36/keyboard.json b/keyboards/obosob/arch_36/keyboard.json index 625eec4a45..791c08d3f1 100644 --- a/keyboards/obosob/arch_36/keyboard.json +++ b/keyboards/obosob/arch_36/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/obosob/steal_this_keyboard/keyboard.json b/keyboards/obosob/steal_this_keyboard/keyboard.json index 38d7936536..4865f54283 100644 --- a/keyboards/obosob/steal_this_keyboard/keyboard.json +++ b/keyboards/obosob/steal_this_keyboard/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ocean/addon/keyboard.json b/keyboards/ocean/addon/keyboard.json index 9a7ad77272..0793a7082a 100644 --- a/keyboards/ocean/addon/keyboard.json +++ b/keyboards/ocean/addon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/gin_v2/keyboard.json b/keyboards/ocean/gin_v2/keyboard.json index 9c5ae278b2..d20aa5916f 100644 --- a/keyboards/ocean/gin_v2/keyboard.json +++ b/keyboards/ocean/gin_v2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/slamz/keyboard.json b/keyboards/ocean/slamz/keyboard.json index 53fc0f609e..cf3ed54426 100644 --- a/keyboards/ocean/slamz/keyboard.json +++ b/keyboards/ocean/slamz/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/stealth/keyboard.json b/keyboards/ocean/stealth/keyboard.json index 6232c641fb..a15d2fffac 100644 --- a/keyboards/ocean/stealth/keyboard.json +++ b/keyboards/ocean/stealth/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/sus/keyboard.json b/keyboards/ocean/sus/keyboard.json index 0bfdaa7b45..3ac426f6aa 100644 --- a/keyboards/ocean/sus/keyboard.json +++ b/keyboards/ocean/sus/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/wang_ergo/keyboard.json b/keyboards/ocean/wang_ergo/keyboard.json index ef32964937..d552028bc6 100644 --- a/keyboards/ocean/wang_ergo/keyboard.json +++ b/keyboards/ocean/wang_ergo/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/wang_v2/keyboard.json b/keyboards/ocean/wang_v2/keyboard.json index c5913f25b2..79ef6b3697 100644 --- a/keyboards/ocean/wang_v2/keyboard.json +++ b/keyboards/ocean/wang_v2/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ocean/yuri/keyboard.json b/keyboards/ocean/yuri/keyboard.json index ec0a7f60e2..aeb4cd895d 100644 --- a/keyboards/ocean/yuri/keyboard.json +++ b/keyboards/ocean/yuri/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/odelia/keyboard.json b/keyboards/odelia/keyboard.json index 373fea5f06..425240d507 100644 --- a/keyboards/odelia/keyboard.json +++ b/keyboards/odelia/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ogre/ergo_single/keyboard.json b/keyboards/ogre/ergo_single/keyboard.json index a79046cdae..1abaf26400 100644 --- a/keyboards/ogre/ergo_single/keyboard.json +++ b/keyboards/ogre/ergo_single/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/ogre/ergo_split/keyboard.json b/keyboards/ogre/ergo_split/keyboard.json index fbe2204bcc..ea8a28ba4a 100644 --- a/keyboards/ogre/ergo_split/keyboard.json +++ b/keyboards/ogre/ergo_split/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/ok60/keyboard.json b/keyboards/ok60/keyboard.json index 7aea8463d8..52ddebc011 100644 --- a/keyboards/ok60/keyboard.json +++ b/keyboards/ok60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/onekeyco/dango40/keyboard.json b/keyboards/onekeyco/dango40/keyboard.json index 5ff823a981..25baf9e2bc 100644 --- a/keyboards/onekeyco/dango40/keyboard.json +++ b/keyboards/onekeyco/dango40/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/orange75/keyboard.json b/keyboards/orange75/keyboard.json index 7da52e2795..cd6108581c 100644 --- a/keyboards/orange75/keyboard.json +++ b/keyboards/orange75/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/org60/keyboard.json b/keyboards/org60/keyboard.json index e0a735d2d9..e59dc27e63 100644 --- a/keyboards/org60/keyboard.json +++ b/keyboards/org60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ortho5by12/keyboard.json b/keyboards/ortho5by12/keyboard.json index cb0fec114c..a360e9d3d7 100644 --- a/keyboards/ortho5by12/keyboard.json +++ b/keyboards/ortho5by12/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/orthograph/keyboard.json b/keyboards/orthograph/keyboard.json index 7215a133d5..d9ec03a7ad 100644 --- a/keyboards/orthograph/keyboard.json +++ b/keyboards/orthograph/keyboard.json @@ -16,7 +16,6 @@ "features": { "rgb_matrix": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json index a92fa1212b..8fcea8034d 100644 --- a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json +++ b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/owlab/jelly_epoch/soldered/keyboard.json b/keyboards/owlab/jelly_epoch/soldered/keyboard.json index 29a963b1b9..2d807c58a9 100644 --- a/keyboards/owlab/jelly_epoch/soldered/keyboard.json +++ b/keyboards/owlab/jelly_epoch/soldered/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/owlab/spring/keyboard.json b/keyboards/owlab/spring/keyboard.json index 8716d2f80f..1789f4ebb1 100644 --- a/keyboards/owlab/spring/keyboard.json +++ b/keyboards/owlab/spring/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/owlab/suit80/ansi/keyboard.json b/keyboards/owlab/suit80/ansi/keyboard.json index 00f54e6656..fe0f1b6e4b 100644 --- a/keyboards/owlab/suit80/ansi/keyboard.json +++ b/keyboards/owlab/suit80/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/suit80/iso/keyboard.json b/keyboards/owlab/suit80/iso/keyboard.json index f3c6afb79c..2d9fcde472 100644 --- a/keyboards/owlab/suit80/iso/keyboard.json +++ b/keyboards/owlab/suit80/iso/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/owlab/voice65/hotswap/keyboard.json b/keyboards/owlab/voice65/hotswap/keyboard.json index e85d4b69ec..f153efbde2 100644 --- a/keyboards/owlab/voice65/hotswap/keyboard.json +++ b/keyboards/owlab/voice65/hotswap/keyboard.json @@ -66,7 +66,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/owlab/voice65/soldered/keyboard.json b/keyboards/owlab/voice65/soldered/keyboard.json index a1de099f43..932c32d2fd 100644 --- a/keyboards/owlab/voice65/soldered/keyboard.json +++ b/keyboards/owlab/voice65/soldered/keyboard.json @@ -66,7 +66,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/eu_isolation/keyboard.json b/keyboards/p3d/eu_isolation/keyboard.json index c8f305a131..99a3548bb8 100644 --- a/keyboards/p3d/eu_isolation/keyboard.json +++ b/keyboards/p3d/eu_isolation/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/glitch/keyboard.json b/keyboards/p3d/glitch/keyboard.json index 7dd6eff6f0..d860877b75 100644 --- a/keyboards/p3d/glitch/keyboard.json +++ b/keyboards/p3d/glitch/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/q4z/keyboard.json b/keyboards/p3d/q4z/keyboard.json index 6e5ef8bd80..0c293b92bd 100644 --- a/keyboards/p3d/q4z/keyboard.json +++ b/keyboards/p3d/q4z/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/p3d/spacey/keyboard.json b/keyboards/p3d/spacey/keyboard.json index e3f1350a83..fdf19d0a72 100644 --- a/keyboards/p3d/spacey/keyboard.json +++ b/keyboards/p3d/spacey/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/synapse/keyboard.json b/keyboards/p3d/synapse/keyboard.json index 4cb0f84382..0c28e5b495 100644 --- a/keyboards/p3d/synapse/keyboard.json +++ b/keyboards/p3d/synapse/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/p3d/tw40/keyboard.json b/keyboards/p3d/tw40/keyboard.json index d5a6ac3292..488474f21e 100644 --- a/keyboards/p3d/tw40/keyboard.json +++ b/keyboards/p3d/tw40/keyboard.json @@ -28,7 +28,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pabile/p18/keyboard.json b/keyboards/pabile/p18/keyboard.json index 5c3bc11fd6..bf3380038a 100644 --- a/keyboards/pabile/p18/keyboard.json +++ b/keyboards/pabile/p18/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pabile/p20/ver1/keyboard.json b/keyboards/pabile/p20/ver1/keyboard.json index 1a97045691..3e3a16a6d9 100644 --- a/keyboards/pabile/p20/ver1/keyboard.json +++ b/keyboards/pabile/p20/ver1/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pabile/p20/ver2/keyboard.json b/keyboards/pabile/p20/ver2/keyboard.json index a69c7b14a1..cdacbf3aec 100644 --- a/keyboards/pabile/p20/ver2/keyboard.json +++ b/keyboards/pabile/p20/ver2/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pabile/p40/keyboard.json b/keyboards/pabile/p40/keyboard.json index 4eedf0e7a8..fbe4896687 100644 --- a/keyboards/pabile/p40/keyboard.json +++ b/keyboards/pabile/p40/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pabile/p40_ortho/keyboard.json b/keyboards/pabile/p40_ortho/keyboard.json index cea0e6fb36..3e5d9ea504 100644 --- a/keyboards/pabile/p40_ortho/keyboard.json +++ b/keyboards/pabile/p40_ortho/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pabile/p42/keyboard.json b/keyboards/pabile/p42/keyboard.json index 4c16123bd6..42c8964332 100644 --- a/keyboards/pabile/p42/keyboard.json +++ b/keyboards/pabile/p42/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/panc40/keyboard.json b/keyboards/panc40/keyboard.json index 4c89f6132f..7bc19fab06 100644 --- a/keyboards/panc40/keyboard.json +++ b/keyboards/panc40/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/panc60/keyboard.json b/keyboards/panc60/keyboard.json index 5dbfe257e9..98410497d5 100644 --- a/keyboards/panc60/keyboard.json +++ b/keyboards/panc60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pangorin/tan67/keyboard.json b/keyboards/pangorin/tan67/keyboard.json index aef7b60765..3c593d846b 100644 --- a/keyboards/pangorin/tan67/keyboard.json +++ b/keyboards/pangorin/tan67/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": false, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/papercranekeyboards/gerald65/keyboard.json b/keyboards/papercranekeyboards/gerald65/keyboard.json index dd57037b02..48ccbf1b5a 100644 --- a/keyboards/papercranekeyboards/gerald65/keyboard.json +++ b/keyboards/papercranekeyboards/gerald65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/paprikman/albacore/keyboard.json b/keyboards/paprikman/albacore/keyboard.json index 579b4b37e3..8706c67bcd 100644 --- a/keyboards/paprikman/albacore/keyboard.json +++ b/keyboards/paprikman/albacore/keyboard.json @@ -18,7 +18,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/parallel/parallel_65/hotswap/keyboard.json b/keyboards/parallel/parallel_65/hotswap/keyboard.json index f9ce4752bc..228d9dcb7e 100644 --- a/keyboards/parallel/parallel_65/hotswap/keyboard.json +++ b/keyboards/parallel/parallel_65/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/parallel/parallel_65/soldered/keyboard.json b/keyboards/parallel/parallel_65/soldered/keyboard.json index d854960f68..6acf08d808 100644 --- a/keyboards/parallel/parallel_65/soldered/keyboard.json +++ b/keyboards/parallel/parallel_65/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pauperboards/brick/keyboard.json b/keyboards/pauperboards/brick/keyboard.json index 53678f0f40..f1775b4be5 100644 --- a/keyboards/pauperboards/brick/keyboard.json +++ b/keyboards/pauperboards/brick/keyboard.json @@ -17,7 +17,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pearlboards/pandora/keyboard.json b/keyboards/pearlboards/pandora/keyboard.json index 5cedcaa630..c17de8de35 100644 --- a/keyboards/pearlboards/pandora/keyboard.json +++ b/keyboards/pearlboards/pandora/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "dip_switch": true, "encoder": true, "extrakey": true, diff --git a/keyboards/pearlboards/zeuspad/keyboard.json b/keyboards/pearlboards/zeuspad/keyboard.json index 686636f427..865e9c4e79 100644 --- a/keyboards/pearlboards/zeuspad/keyboard.json +++ b/keyboards/pearlboards/zeuspad/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/peej/lumberjack/keyboard.json b/keyboards/peej/lumberjack/keyboard.json index 79dc4e4b22..9893ba7227 100644 --- a/keyboards/peej/lumberjack/keyboard.json +++ b/keyboards/peej/lumberjack/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pegasus/keyboard.json b/keyboards/pegasus/keyboard.json index 50579bf86a..865833d189 100644 --- a/keyboards/pegasus/keyboard.json +++ b/keyboards/pegasus/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/phdesign/phac/keyboard.json b/keyboards/phdesign/phac/keyboard.json index 615232791f..3034aaa3a0 100644 --- a/keyboards/phdesign/phac/keyboard.json +++ b/keyboards/phdesign/phac/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/phrygian/ph100/keyboard.json b/keyboards/phrygian/ph100/keyboard.json index 927b31e797..28ad88c98e 100644 --- a/keyboards/phrygian/ph100/keyboard.json +++ b/keyboards/phrygian/ph100/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/piantoruv44/keyboard.json b/keyboards/piantoruv44/keyboard.json index 96267e18e8..771644cb5d 100644 --- a/keyboards/piantoruv44/keyboard.json +++ b/keyboards/piantoruv44/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pica40/rev1/keyboard.json b/keyboards/pica40/rev1/keyboard.json index 2f4e15aaa1..85c2221a13 100644 --- a/keyboards/pica40/rev1/keyboard.json +++ b/keyboards/pica40/rev1/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "encoder": true, diff --git a/keyboards/pica40/rev2/keyboard.json b/keyboards/pica40/rev2/keyboard.json index 52cc64f39e..7fd2094706 100644 --- a/keyboards/pica40/rev2/keyboard.json +++ b/keyboards/pica40/rev2/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "mousekey": true, "extrakey": true, "encoder": true, diff --git a/keyboards/picolab/frusta_fundamental/keyboard.json b/keyboards/picolab/frusta_fundamental/keyboard.json index b171e59318..55a049060d 100644 --- a/keyboards/picolab/frusta_fundamental/keyboard.json +++ b/keyboards/picolab/frusta_fundamental/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pimentoso/paddino02/rev1/keyboard.json b/keyboards/pimentoso/paddino02/rev1/keyboard.json index 37cbd3cd73..b0fddff9d3 100644 --- a/keyboards/pimentoso/paddino02/rev1/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json index 86aa9c91ac..f89552220d 100644 --- a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json index f43ced53e8..1148564a05 100644 --- a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pimentoso/touhoupad/keyboard.json b/keyboards/pimentoso/touhoupad/keyboard.json index 2deeb6d763..fed01eb5a6 100644 --- a/keyboards/pimentoso/touhoupad/keyboard.json +++ b/keyboards/pimentoso/touhoupad/keyboard.json @@ -25,7 +25,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pisces/keyboard.json b/keyboards/pisces/keyboard.json index 792ec0b48a..bf98cefd16 100644 --- a/keyboards/pisces/keyboard.json +++ b/keyboards/pisces/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pixelspace/capsule65i/keyboard.json b/keyboards/pixelspace/capsule65i/keyboard.json index 01210de441..c12e889135 100644 --- a/keyboards/pixelspace/capsule65i/keyboard.json +++ b/keyboards/pixelspace/capsule65i/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/pizzakeyboards/pizza65/keyboard.json b/keyboards/pizzakeyboards/pizza65/keyboard.json index cf5efa6281..cddeb687a2 100644 --- a/keyboards/pizzakeyboards/pizza65/keyboard.json +++ b/keyboards/pizzakeyboards/pizza65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pkb65/keyboard.json b/keyboards/pkb65/keyboard.json index 4a1e02fcc1..3e590bcba6 100644 --- a/keyboards/pkb65/keyboard.json +++ b/keyboards/pkb65/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/planck/light/keyboard.json b/keyboards/planck/light/keyboard.json index dd1d69bf3c..413c753f92 100644 --- a/keyboards/planck/light/keyboard.json +++ b/keyboards/planck/light/keyboard.json @@ -60,7 +60,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "midi": true, diff --git a/keyboards/planck/rev1/keyboard.json b/keyboards/planck/rev1/keyboard.json index f737781a1c..1be09d866e 100644 --- a/keyboards/planck/rev1/keyboard.json +++ b/keyboards/planck/rev1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/planck/rev2/keyboard.json b/keyboards/planck/rev2/keyboard.json index d10982f357..d87b05a974 100644 --- a/keyboards/planck/rev2/keyboard.json +++ b/keyboards/planck/rev2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/planck/rev3/keyboard.json b/keyboards/planck/rev3/keyboard.json index 16d2b59a2e..b7e95c765f 100644 --- a/keyboards/planck/rev3/keyboard.json +++ b/keyboards/planck/rev3/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/planck/rev4/keyboard.json b/keyboards/planck/rev4/keyboard.json index 655c48e7dd..492112fa68 100644 --- a/keyboards/planck/rev4/keyboard.json +++ b/keyboards/planck/rev4/keyboard.json @@ -14,7 +14,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/planck/rev5/keyboard.json b/keyboards/planck/rev5/keyboard.json index debf8dcdfc..a251080156 100644 --- a/keyboards/planck/rev5/keyboard.json +++ b/keyboards/planck/rev5/keyboard.json @@ -14,7 +14,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/playkbtw/ca66/keyboard.json b/keyboards/playkbtw/ca66/keyboard.json index edce25cb10..781c39ea4b 100644 --- a/keyboards/playkbtw/ca66/keyboard.json +++ b/keyboards/playkbtw/ca66/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/helen80/keyboard.json b/keyboards/playkbtw/helen80/keyboard.json index ba6c2f60df..038a3ee562 100644 --- a/keyboards/playkbtw/helen80/keyboard.json +++ b/keyboards/playkbtw/helen80/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/pk60/keyboard.json b/keyboards/playkbtw/pk60/keyboard.json index 68c956239b..363a835d54 100644 --- a/keyboards/playkbtw/pk60/keyboard.json +++ b/keyboards/playkbtw/pk60/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/playkbtw/pk64rgb/keyboard.json b/keyboards/playkbtw/pk64rgb/keyboard.json index 4bcf40315c..2fa3e3cb92 100644 --- a/keyboards/playkbtw/pk64rgb/keyboard.json +++ b/keyboards/playkbtw/pk64rgb/keyboard.json @@ -88,7 +88,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/pluckey/keyboard.json b/keyboards/pluckey/keyboard.json index a6cad0a56c..36705f795d 100644 --- a/keyboards/pluckey/keyboard.json +++ b/keyboards/pluckey/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/plum47/keyboard.json b/keyboards/plum47/keyboard.json index 426a062db2..2c6e009300 100644 --- a/keyboards/plum47/keyboard.json +++ b/keyboards/plum47/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/plume/plume65/keyboard.json b/keyboards/plume/plume65/keyboard.json index f4aea13765..21deb5a76f 100644 --- a/keyboards/plume/plume65/keyboard.json +++ b/keyboards/plume/plume65/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/plut0nium/0x3e/keyboard.json b/keyboards/plut0nium/0x3e/keyboard.json index d331921d80..9c8fa386fb 100644 --- a/keyboards/plut0nium/0x3e/keyboard.json +++ b/keyboards/plut0nium/0x3e/keyboard.json @@ -13,7 +13,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/plx/keyboard.json b/keyboards/plx/keyboard.json index c7a82961ec..b22ee87b2a 100644 --- a/keyboards/plx/keyboard.json +++ b/keyboards/plx/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/plywrks/ahgase/keyboard.json b/keyboards/plywrks/ahgase/keyboard.json index 9e5d8baed6..7d50de8d77 100644 --- a/keyboards/plywrks/ahgase/keyboard.json +++ b/keyboards/plywrks/ahgase/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/plywrks/allaro/keyboard.json b/keyboards/plywrks/allaro/keyboard.json index abf1b8773d..f3f5ae892b 100644 --- a/keyboards/plywrks/allaro/keyboard.json +++ b/keyboards/plywrks/allaro/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/plywrks/ji_eun/keyboard.json b/keyboards/plywrks/ji_eun/keyboard.json index e94b3ad6b0..8bfd610f9b 100644 --- a/keyboards/plywrks/ji_eun/keyboard.json +++ b/keyboards/plywrks/ji_eun/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/plywrks/lune/keyboard.json b/keyboards/plywrks/lune/keyboard.json index 7ec645b1b1..af78e2cfa2 100644 --- a/keyboards/plywrks/lune/keyboard.json +++ b/keyboards/plywrks/lune/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/plywrks/ply8x/solder/keyboard.json b/keyboards/plywrks/ply8x/solder/keyboard.json index f05b34e13b..18cf17808a 100644 --- a/keyboards/plywrks/ply8x/solder/keyboard.json +++ b/keyboards/plywrks/ply8x/solder/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pmk/posey_split/v4/keyboard.json b/keyboards/pmk/posey_split/v4/keyboard.json index 533ba81867..d9f165286a 100644 --- a/keyboards/pmk/posey_split/v4/keyboard.json +++ b/keyboards/pmk/posey_split/v4/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "rgblight": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pmk/posey_split/v5/keyboard.json b/keyboards/pmk/posey_split/v5/keyboard.json index 341a8cd9be..cc2c8f2461 100644 --- a/keyboards/pmk/posey_split/v5/keyboard.json +++ b/keyboards/pmk/posey_split/v5/keyboard.json @@ -10,7 +10,6 @@ "features": { "bootmagic": true, "rgblight": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/pohjolaworks/louhi/keyboard.json b/keyboards/pohjolaworks/louhi/keyboard.json index b0bca3e0ed..be00368632 100644 --- a/keyboards/pohjolaworks/louhi/keyboard.json +++ b/keyboards/pohjolaworks/louhi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/poker87c/keyboard.json b/keyboards/poker87c/keyboard.json index 02e0906562..ac682d926c 100644 --- a/keyboards/poker87c/keyboard.json +++ b/keyboards/poker87c/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/poker87d/keyboard.json b/keyboards/poker87d/keyboard.json index e52b5a4149..42c89ef1fd 100644 --- a/keyboards/poker87d/keyboard.json +++ b/keyboards/poker87d/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/polilla/rev1/keyboard.json b/keyboards/polilla/rev1/keyboard.json index 52c1b7fab8..049b21a178 100644 --- a/keyboards/polilla/rev1/keyboard.json +++ b/keyboards/polilla/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/polycarbdiet/s20/keyboard.json b/keyboards/polycarbdiet/s20/keyboard.json index 678327f167..e8b180b860 100644 --- a/keyboards/polycarbdiet/s20/keyboard.json +++ b/keyboards/polycarbdiet/s20/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/pom_keyboards/tnln95/keyboard.json b/keyboards/pom_keyboards/tnln95/keyboard.json index 9f2983b541..61ec5f956e 100644 --- a/keyboards/pom_keyboards/tnln95/keyboard.json +++ b/keyboards/pom_keyboards/tnln95/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/portal_66/hotswap/keyboard.json b/keyboards/portal_66/hotswap/keyboard.json index 67179ad185..8bbee2d56a 100644 --- a/keyboards/portal_66/hotswap/keyboard.json +++ b/keyboards/portal_66/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/portal_66/soldered/keyboard.json b/keyboards/portal_66/soldered/keyboard.json index 349184cbab..063176c735 100644 --- a/keyboards/portal_66/soldered/keyboard.json +++ b/keyboards/portal_66/soldered/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/pos78/keyboard.json b/keyboards/pos78/keyboard.json index 6519f1ba5c..a4cad0124e 100644 --- a/keyboards/pos78/keyboard.json +++ b/keyboards/pos78/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/preonic/rev1/keyboard.json b/keyboards/preonic/rev1/keyboard.json index ddd1d68426..705ccbfc22 100644 --- a/keyboards/preonic/rev1/keyboard.json +++ b/keyboards/preonic/rev1/keyboard.json @@ -13,7 +13,6 @@ "audio": true, "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/preonic/rev2/keyboard.json b/keyboards/preonic/rev2/keyboard.json index d24c3db42f..112785f360 100644 --- a/keyboards/preonic/rev2/keyboard.json +++ b/keyboards/preonic/rev2/keyboard.json @@ -13,7 +13,6 @@ "audio": true, "backlight": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/primekb/meridian_rgb/keyboard.json b/keyboards/primekb/meridian_rgb/keyboard.json index 145d4eeb8b..f1ca86dfea 100644 --- a/keyboards/primekb/meridian_rgb/keyboard.json +++ b/keyboards/primekb/meridian_rgb/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/primekb/prime_e/info.json b/keyboards/primekb/prime_e/info.json index 01208f70b8..4aaef804af 100644 --- a/keyboards/primekb/prime_e/info.json +++ b/keyboards/primekb/prime_e/info.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/primekb/prime_l/info.json b/keyboards/primekb/prime_l/info.json index 2403dec963..1f526e9587 100644 --- a/keyboards/primekb/prime_l/info.json +++ b/keyboards/primekb/prime_l/info.json @@ -4,7 +4,6 @@ "maintainer": "MxBlu", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_m/keyboard.json b/keyboards/primekb/prime_m/keyboard.json index f9d72061c5..1f43a8b1dc 100644 --- a/keyboards/primekb/prime_m/keyboard.json +++ b/keyboards/primekb/prime_m/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_o/keyboard.json b/keyboards/primekb/prime_o/keyboard.json index 159ed92d7a..e440075537 100644 --- a/keyboards/primekb/prime_o/keyboard.json +++ b/keyboards/primekb/prime_o/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/primekb/prime_r/keyboard.json b/keyboards/primekb/prime_r/keyboard.json index cc2fe7a0c7..e6738a6dde 100644 --- a/keyboards/primekb/prime_r/keyboard.json +++ b/keyboards/primekb/prime_r/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/printedpad/keyboard.json b/keyboards/printedpad/keyboard.json index 5441df5e7c..0dca5da74d 100644 --- a/keyboards/printedpad/keyboard.json +++ b/keyboards/printedpad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectcain/vault45/keyboard.json b/keyboards/projectcain/vault45/keyboard.json index a66aea94e2..6131ae0305 100644 --- a/keyboards/projectcain/vault45/keyboard.json +++ b/keyboards/projectcain/vault45/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/projectd/65/projectd_65_ansi/keyboard.json b/keyboards/projectd/65/projectd_65_ansi/keyboard.json index a0113302b1..d3deca8c29 100644 --- a/keyboards/projectd/65/projectd_65_ansi/keyboard.json +++ b/keyboards/projectd/65/projectd_65_ansi/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectd/75/ansi/keyboard.json b/keyboards/projectd/75/ansi/keyboard.json index 16995c697c..9ebc5f3868 100644 --- a/keyboards/projectd/75/ansi/keyboard.json +++ b/keyboards/projectd/75/ansi/keyboard.json @@ -19,7 +19,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectd/75/iso/keyboard.json b/keyboards/projectd/75/iso/keyboard.json index 871efba1da..15ff587adb 100644 --- a/keyboards/projectd/75/iso/keyboard.json +++ b/keyboards/projectd/75/iso/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/projectkb/signature65/keyboard.json b/keyboards/projectkb/signature65/keyboard.json index 7393fc280d..e771c63e81 100644 --- a/keyboards/projectkb/signature65/keyboard.json +++ b/keyboards/projectkb/signature65/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/allison/keyboard.json b/keyboards/prototypist/allison/keyboard.json index 5fc003a93c..33bd904195 100644 --- a/keyboards/prototypist/allison/keyboard.json +++ b/keyboards/prototypist/allison/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/allison_numpad/keyboard.json b/keyboards/prototypist/allison_numpad/keyboard.json index 56c08df27d..e2360c99d4 100644 --- a/keyboards/prototypist/allison_numpad/keyboard.json +++ b/keyboards/prototypist/allison_numpad/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/j01/keyboard.json b/keyboards/prototypist/j01/keyboard.json index 2cf6753cc5..bafbba0bc8 100644 --- a/keyboards/prototypist/j01/keyboard.json +++ b/keyboards/prototypist/j01/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/pt60/keyboard.json b/keyboards/prototypist/pt60/keyboard.json index 688559e093..4768a28d90 100644 --- a/keyboards/prototypist/pt60/keyboard.json +++ b/keyboards/prototypist/pt60/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/prototypist/pt80/keyboard.json b/keyboards/prototypist/pt80/keyboard.json index aacb53bdb6..311bfd2670 100644 --- a/keyboards/prototypist/pt80/keyboard.json +++ b/keyboards/prototypist/pt80/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/protozoa/event_horizon/keyboard.json b/keyboards/protozoa/event_horizon/keyboard.json index 1b622e3a4e..29c7c94fb9 100644 --- a/keyboards/protozoa/event_horizon/keyboard.json +++ b/keyboards/protozoa/event_horizon/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/psuieee/pluto12/keyboard.json b/keyboards/psuieee/pluto12/keyboard.json index 22c91841c4..02db5bc0a1 100644 --- a/keyboards/psuieee/pluto12/keyboard.json +++ b/keyboards/psuieee/pluto12/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pteron36/keyboard.json b/keyboards/pteron36/keyboard.json index 711dabf986..783e1e8db0 100644 --- a/keyboards/pteron36/keyboard.json +++ b/keyboards/pteron36/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/pteropus/keyboard.json b/keyboards/pteropus/keyboard.json index c4660a537f..12bb0e9667 100644 --- a/keyboards/pteropus/keyboard.json +++ b/keyboards/pteropus/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/puck/keyboard.json b/keyboards/puck/keyboard.json index 5c843e3249..35493d4a64 100644 --- a/keyboards/puck/keyboard.json +++ b/keyboards/puck/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/purin/keyboard.json b/keyboards/purin/keyboard.json index 820e285ccc..7e06f2ede9 100644 --- a/keyboards/purin/keyboard.json +++ b/keyboards/purin/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/qck75/v1/keyboard.json b/keyboards/qck75/v1/keyboard.json index 56ffa17dd3..d97a719a52 100644 --- a/keyboards/qck75/v1/keyboard.json +++ b/keyboards/qck75/v1/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qpockets/eggman/keyboard.json b/keyboards/qpockets/eggman/keyboard.json index 53fd05758e..14f8a79b0a 100644 --- a/keyboards/qpockets/eggman/keyboard.json +++ b/keyboards/qpockets/eggman/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qpockets/wanten/keyboard.json b/keyboards/qpockets/wanten/keyboard.json index 3404308b52..d1b6d8b6a6 100644 --- a/keyboards/qpockets/wanten/keyboard.json +++ b/keyboards/qpockets/wanten/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/quadrum/delta/keyboard.json b/keyboards/quadrum/delta/keyboard.json index 6766bd2875..0c218b2d8a 100644 --- a/keyboards/quadrum/delta/keyboard.json +++ b/keyboards/quadrum/delta/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/quarkeys/z40/keyboard.json b/keyboards/quarkeys/z40/keyboard.json index cb5e1f9764..05d81e5b6f 100644 --- a/keyboards/quarkeys/z40/keyboard.json +++ b/keyboards/quarkeys/z40/keyboard.json @@ -54,7 +54,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z60/hotswap/keyboard.json b/keyboards/quarkeys/z60/hotswap/keyboard.json index 5e08fa1c1d..6034f3b909 100644 --- a/keyboards/quarkeys/z60/hotswap/keyboard.json +++ b/keyboards/quarkeys/z60/hotswap/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z60/solder/keyboard.json b/keyboards/quarkeys/z60/solder/keyboard.json index 8e2c0392ba..d0801e40ca 100644 --- a/keyboards/quarkeys/z60/solder/keyboard.json +++ b/keyboards/quarkeys/z60/solder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z67/hotswap/keyboard.json b/keyboards/quarkeys/z67/hotswap/keyboard.json index 03c83fea90..7bee5ee3de 100644 --- a/keyboards/quarkeys/z67/hotswap/keyboard.json +++ b/keyboards/quarkeys/z67/hotswap/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/quarkeys/z67/solder/keyboard.json b/keyboards/quarkeys/z67/solder/keyboard.json index 380aa187d4..10d216e54c 100644 --- a/keyboards/quarkeys/z67/solder/keyboard.json +++ b/keyboards/quarkeys/z67/solder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/qvex/lynepad/keyboard.json b/keyboards/qvex/lynepad/keyboard.json index 6b6e765869..a408e81f86 100644 --- a/keyboards/qvex/lynepad/keyboard.json +++ b/keyboards/qvex/lynepad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/qwertlekeys/calice/keyboard.json b/keyboards/qwertlekeys/calice/keyboard.json index 21ad107e46..c2c22b8317 100644 --- a/keyboards/qwertlekeys/calice/keyboard.json +++ b/keyboards/qwertlekeys/calice/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/qwertykeys/qk65/hotswap/keyboard.json b/keyboards/qwertykeys/qk65/hotswap/keyboard.json index 78d7e0753f..3aa8597626 100644 --- a/keyboards/qwertykeys/qk65/hotswap/keyboard.json +++ b/keyboards/qwertykeys/qk65/hotswap/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/qwertykeys/qk65/solder/keyboard.json b/keyboards/qwertykeys/qk65/solder/keyboard.json index 2797309c95..0d02ba7a91 100644 --- a/keyboards/qwertykeys/qk65/solder/keyboard.json +++ b/keyboards/qwertykeys/qk65/solder/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rad/keyboard.json b/keyboards/rad/keyboard.json index a6636951ac..848035b785 100644 --- a/keyboards/rad/keyboard.json +++ b/keyboards/rad/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rainkeebs/delilah/keyboard.json b/keyboards/rainkeebs/delilah/keyboard.json index b14d7b871d..a0f4bb9124 100644 --- a/keyboards/rainkeebs/delilah/keyboard.json +++ b/keyboards/rainkeebs/delilah/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rainkeebs/rainkeeb/keyboard.json b/keyboards/rainkeebs/rainkeeb/keyboard.json index 55224de473..2d4a2ac5b9 100644 --- a/keyboards/rainkeebs/rainkeeb/keyboard.json +++ b/keyboards/rainkeebs/rainkeeb/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rainkeebs/yasui/keyboard.json b/keyboards/rainkeebs/yasui/keyboard.json index 75d8297090..1f5caa636f 100644 --- a/keyboards/rainkeebs/yasui/keyboard.json +++ b/keyboards/rainkeebs/yasui/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ramlord/witf/keyboard.json b/keyboards/ramlord/witf/keyboard.json index 983941c316..5e9f3e8a13 100644 --- a/keyboards/ramlord/witf/keyboard.json +++ b/keyboards/ramlord/witf/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rart/rart45/keyboard.json b/keyboards/rart/rart45/keyboard.json index 52af4d77ef..eed7a15dcf 100644 --- a/keyboards/rart/rart45/keyboard.json +++ b/keyboards/rart/rart45/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/rart/rart4x4/keyboard.json b/keyboards/rart/rart4x4/keyboard.json index c693ea977d..a18e4a4606 100644 --- a/keyboards/rart/rart4x4/keyboard.json +++ b/keyboards/rart/rart4x4/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rart/rart67/keyboard.json b/keyboards/rart/rart67/keyboard.json index e911a783be..a58955a778 100644 --- a/keyboards/rart/rart67/keyboard.json +++ b/keyboards/rart/rart67/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rart/rart67m/keyboard.json b/keyboards/rart/rart67m/keyboard.json index 338f63b808..bade7834fd 100644 --- a/keyboards/rart/rart67m/keyboard.json +++ b/keyboards/rart/rart67m/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rart/rart75/keyboard.json b/keyboards/rart/rart75/keyboard.json index a087298e0a..61ffa222ef 100644 --- a/keyboards/rart/rart75/keyboard.json +++ b/keyboards/rart/rart75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/rart/rart75m/keyboard.json b/keyboards/rart/rart75m/keyboard.json index f87f24aada..d380adf10a 100644 --- a/keyboards/rart/rart75m/keyboard.json +++ b/keyboards/rart/rart75m/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rart/rartand/keyboard.json b/keyboards/rart/rartand/keyboard.json index f97820bb06..f6728274ed 100644 --- a/keyboards/rart/rartand/keyboard.json +++ b/keyboards/rart/rartand/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rart/rartlite/keyboard.json b/keyboards/rart/rartlite/keyboard.json index f1d3af3c72..df9180d622 100644 --- a/keyboards/rart/rartlite/keyboard.json +++ b/keyboards/rart/rartlite/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rart/rartpad/keyboard.json b/keyboards/rart/rartpad/keyboard.json index 18b5081dac..cc3f7120d2 100644 --- a/keyboards/rart/rartpad/keyboard.json +++ b/keyboards/rart/rartpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rate/pistachio_mp/keyboard.json b/keyboards/rate/pistachio_mp/keyboard.json index 0252db6f5d..71e3244523 100644 --- a/keyboards/rate/pistachio_mp/keyboard.json +++ b/keyboards/rate/pistachio_mp/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json index 7b5f27e07a..608a7e8705 100644 --- a/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_hotswap/rev_a/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json index ee9687192a..59efe9c38f 100644 --- a/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json +++ b/keyboards/rationalist/ratio65_solder/rev_a/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/recompile_keys/cocoa40/keyboard.json b/keyboards/recompile_keys/cocoa40/keyboard.json index 5386bbe9e0..9fad026ea7 100644 --- a/keyboards/recompile_keys/cocoa40/keyboard.json +++ b/keyboards/recompile_keys/cocoa40/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/recompile_keys/mio/keyboard.json b/keyboards/recompile_keys/mio/keyboard.json index 1a2467f6ee..a2c34be5bc 100644 --- a/keyboards/recompile_keys/mio/keyboard.json +++ b/keyboards/recompile_keys/mio/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rect44/keyboard.json b/keyboards/rect44/keyboard.json index b90b6a7e69..c863bec9a3 100644 --- a/keyboards/rect44/keyboard.json +++ b/keyboards/rect44/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/redscarf_i/keyboard.json b/keyboards/redscarf_i/keyboard.json index 531ee382c7..20ee5ce3bd 100644 --- a/keyboards/redscarf_i/keyboard.json +++ b/keyboards/redscarf_i/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/retro_75/keyboard.json b/keyboards/retro_75/keyboard.json index efd13cfcc5..29b26ab5c1 100644 --- a/keyboards/retro_75/keyboard.json +++ b/keyboards/retro_75/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/reversestudio/decadepad/keyboard.json b/keyboards/reversestudio/decadepad/keyboard.json index e3f587d5dd..9958c63250 100644 --- a/keyboards/reversestudio/decadepad/keyboard.json +++ b/keyboards/reversestudio/decadepad/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/reviung/reviung33/keyboard.json b/keyboards/reviung/reviung33/keyboard.json index 509debb9cb..b258f26cab 100644 --- a/keyboards/reviung/reviung33/keyboard.json +++ b/keyboards/reviung/reviung33/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/reviung/reviung46/keyboard.json b/keyboards/reviung/reviung46/keyboard.json index 3c0dc096a1..b44aa0dce4 100644 --- a/keyboards/reviung/reviung46/keyboard.json +++ b/keyboards/reviung/reviung46/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/reviung/reviung5/keyboard.json b/keyboards/reviung/reviung5/keyboard.json index 4eee855091..7e7101c0ab 100644 --- a/keyboards/reviung/reviung5/keyboard.json +++ b/keyboards/reviung/reviung5/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/reviung/reviung53/keyboard.json b/keyboards/reviung/reviung53/keyboard.json index 010743c2b8..15f896e7d4 100644 --- a/keyboards/reviung/reviung53/keyboard.json +++ b/keyboards/reviung/reviung53/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/rico/phoenix_project_no1/keyboard.json b/keyboards/rico/phoenix_project_no1/keyboard.json index 692b7c9828..ab2b207212 100644 --- a/keyboards/rico/phoenix_project_no1/keyboard.json +++ b/keyboards/rico/phoenix_project_no1/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rmi_kb/equator/keyboard.json b/keyboards/rmi_kb/equator/keyboard.json index 051ab84e4b..18054abc35 100644 --- a/keyboards/rmi_kb/equator/keyboard.json +++ b/keyboards/rmi_kb/equator/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rmi_kb/squishyfrl/keyboard.json b/keyboards/rmi_kb/squishyfrl/keyboard.json index 65a56e61f0..1341a9e264 100644 --- a/keyboards/rmi_kb/squishyfrl/keyboard.json +++ b/keyboards/rmi_kb/squishyfrl/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/rmi_kb/squishytkl/keyboard.json b/keyboards/rmi_kb/squishytkl/keyboard.json index 30c32edd27..1c8b75750e 100644 --- a/keyboards/rmi_kb/squishytkl/keyboard.json +++ b/keyboards/rmi_kb/squishytkl/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rmi_kb/tkl_ff/info.json b/keyboards/rmi_kb/tkl_ff/info.json index 239d664ff3..88fe409928 100644 --- a/keyboards/rmi_kb/tkl_ff/info.json +++ b/keyboards/rmi_kb/tkl_ff/info.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/rmkeebs/rm_fullsize/keyboard.json b/keyboards/rmkeebs/rm_fullsize/keyboard.json index 60b73110c7..40ee2b4c9d 100644 --- a/keyboards/rmkeebs/rm_fullsize/keyboard.json +++ b/keyboards/rmkeebs/rm_fullsize/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rmkeebs/rm_numpad/keyboard.json b/keyboards/rmkeebs/rm_numpad/keyboard.json index 4885d56f37..434c10923d 100644 --- a/keyboards/rmkeebs/rm_numpad/keyboard.json +++ b/keyboards/rmkeebs/rm_numpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/rose75/keyboard.json b/keyboards/rose75/keyboard.json index 4b45a3d845..1c756d3fdd 100644 --- a/keyboards/rose75/keyboard.json +++ b/keyboards/rose75/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/roseslite/keyboard.json b/keyboards/roseslite/keyboard.json index 4c1849dc7d..267a57a5c2 100644 --- a/keyboards/roseslite/keyboard.json +++ b/keyboards/roseslite/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rot13labs/h4ckb0ard/keyboard.json b/keyboards/rot13labs/h4ckb0ard/keyboard.json index cd028f08c8..8d1ce7ab43 100644 --- a/keyboards/rot13labs/h4ckb0ard/keyboard.json +++ b/keyboards/rot13labs/h4ckb0ard/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/rot13labs/rotc0n/keyboard.json b/keyboards/rot13labs/rotc0n/keyboard.json index 2ee71daa18..fa5ac19edb 100644 --- a/keyboards/rot13labs/rotc0n/keyboard.json +++ b/keyboards/rot13labs/rotc0n/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/rot13labs/veilid_sao/keyboard.json b/keyboards/rot13labs/veilid_sao/keyboard.json index 38271afbe9..c7567a839a 100644 --- a/keyboards/rot13labs/veilid_sao/keyboard.json +++ b/keyboards/rot13labs/veilid_sao/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/rotr/keyboard.json b/keyboards/rotr/keyboard.json index 6d3599a506..e484e26ddc 100644 --- a/keyboards/rotr/keyboard.json +++ b/keyboards/rotr/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/runes/skjoldr/keyboard.json b/keyboards/runes/skjoldr/keyboard.json index a6040dedd6..ff3476697e 100644 --- a/keyboards/runes/skjoldr/keyboard.json +++ b/keyboards/runes/skjoldr/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/runes/vaengr/keyboard.json b/keyboards/runes/vaengr/keyboard.json index c962d19892..dce2c7a228 100644 --- a/keyboards/runes/vaengr/keyboard.json +++ b/keyboards/runes/vaengr/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ryanbaekr/rb1/keyboard.json b/keyboards/ryanbaekr/rb1/keyboard.json index 19ddbb9402..a7222869e0 100644 --- a/keyboards/ryanbaekr/rb1/keyboard.json +++ b/keyboards/ryanbaekr/rb1/keyboard.json @@ -11,7 +11,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/ryanbaekr/rb18/keyboard.json b/keyboards/ryanbaekr/rb18/keyboard.json index 4485bdff00..0febe5a1d5 100644 --- a/keyboards/ryanbaekr/rb18/keyboard.json +++ b/keyboards/ryanbaekr/rb18/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryanbaekr/rb69/keyboard.json b/keyboards/ryanbaekr/rb69/keyboard.json index ffe4ba1674..3becf7f588 100644 --- a/keyboards/ryanbaekr/rb69/keyboard.json +++ b/keyboards/ryanbaekr/rb69/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryanbaekr/rb87/keyboard.json b/keyboards/ryanbaekr/rb87/keyboard.json index 8c3bffdbfe..5b9500f973 100644 --- a/keyboards/ryanbaekr/rb87/keyboard.json +++ b/keyboards/ryanbaekr/rb87/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ryloo_studio/m0110/keyboard.json b/keyboards/ryloo_studio/m0110/keyboard.json index ae9535173a..3377eee155 100644 --- a/keyboards/ryloo_studio/m0110/keyboard.json +++ b/keyboards/ryloo_studio/m0110/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/s_ol/0xc_pad/keyboard.json b/keyboards/s_ol/0xc_pad/keyboard.json index 6623effb7a..1df5a5131e 100644 --- a/keyboards/s_ol/0xc_pad/keyboard.json +++ b/keyboards/s_ol/0xc_pad/keyboard.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/salane/starryfrl/keyboard.json b/keyboards/salane/starryfrl/keyboard.json index 9ca8cf81bc..a63bdc83d1 100644 --- a/keyboards/salane/starryfrl/keyboard.json +++ b/keyboards/salane/starryfrl/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true, "encoder": true diff --git a/keyboards/salicylic_acid3/ajisai74/keyboard.json b/keyboards/salicylic_acid3/ajisai74/keyboard.json index c104c5a854..a74cb07902 100644 --- a/keyboards/salicylic_acid3/ajisai74/keyboard.json +++ b/keyboards/salicylic_acid3/ajisai74/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/salicylic_acid3/ergoarrows/keyboard.json b/keyboards/salicylic_acid3/ergoarrows/keyboard.json index a5ad1de718..08911ca103 100644 --- a/keyboards/salicylic_acid3/ergoarrows/keyboard.json +++ b/keyboards/salicylic_acid3/ergoarrows/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/salicylic_acid3/guide68/keyboard.json b/keyboards/salicylic_acid3/guide68/keyboard.json index b7e6a81d5c..327794adf9 100644 --- a/keyboards/salicylic_acid3/guide68/keyboard.json +++ b/keyboards/salicylic_acid3/guide68/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "rgblight": true, diff --git a/keyboards/salicylic_acid3/nknl7en/keyboard.json b/keyboards/salicylic_acid3/nknl7en/keyboard.json index c047a34b77..3b6f71c58d 100644 --- a/keyboards/salicylic_acid3/nknl7en/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7en/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/salicylic_acid3/nknl7jp/keyboard.json b/keyboards/salicylic_acid3/nknl7jp/keyboard.json index 496ac96a86..66daa50da7 100644 --- a/keyboards/salicylic_acid3/nknl7jp/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7jp/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/sam/s80/keyboard.json b/keyboards/sam/s80/keyboard.json index ee2e7c2a5d..8e76198ebb 100644 --- a/keyboards/sam/s80/keyboard.json +++ b/keyboards/sam/s80/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sam/sg81m/keyboard.json b/keyboards/sam/sg81m/keyboard.json index f509504d0a..a0133b2b86 100644 --- a/keyboards/sam/sg81m/keyboard.json +++ b/keyboards/sam/sg81m/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sanctified/dystopia/keyboard.json b/keyboards/sanctified/dystopia/keyboard.json index cebf255416..fed0ff75df 100644 --- a/keyboards/sanctified/dystopia/keyboard.json +++ b/keyboards/sanctified/dystopia/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/sandwich/keeb68/keyboard.json b/keyboards/sandwich/keeb68/keyboard.json index 4d509d4a8b..b452665f54 100644 --- a/keyboards/sandwich/keeb68/keyboard.json +++ b/keyboards/sandwich/keeb68/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sapuseven/macropad12/keyboard.json b/keyboards/sapuseven/macropad12/keyboard.json index 93f535215c..34f9b6a950 100644 --- a/keyboards/sapuseven/macropad12/keyboard.json +++ b/keyboards/sapuseven/macropad12/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sauce/mild/keyboard.json b/keyboards/sauce/mild/keyboard.json index d2ecd024a1..4546d40884 100644 --- a/keyboards/sauce/mild/keyboard.json +++ b/keyboards/sauce/mild/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json index 6035920a2f..acb0a914cc 100644 --- a/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json index 25d7e4ac52..cf65aca3b4 100644 --- a/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json +++ b/keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json b/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json index 3f1b8f622f..9e63cefc2c 100644 --- a/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json +++ b/keyboards/sawnsprojects/krush/krush65/hotswap/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json b/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json index bb4964f22c..7ea0dd63d2 100644 --- a/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json +++ b/keyboards/sawnsprojects/krush/krush65/solder/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/sawnsprojects/okayu/info.json b/keyboards/sawnsprojects/okayu/info.json index 74c5874b61..14c8f20c35 100644 --- a/keyboards/sawnsprojects/okayu/info.json +++ b/keyboards/sawnsprojects/okayu/info.json @@ -13,7 +13,6 @@ "mousekey": true, "extrakey": true, "console": true, - "command": false, "nkro": true, "rgblight": true }, diff --git a/keyboards/sawnsprojects/plaque80/keyboard.json b/keyboards/sawnsprojects/plaque80/keyboard.json index 623f1459f9..d72186a249 100644 --- a/keyboards/sawnsprojects/plaque80/keyboard.json +++ b/keyboards/sawnsprojects/plaque80/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/sawnsprojects/re65/keyboard.json b/keyboards/sawnsprojects/re65/keyboard.json index a2d29894c3..98f8e4ba25 100644 --- a/keyboards/sawnsprojects/re65/keyboard.json +++ b/keyboards/sawnsprojects/re65/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgblight": true, "encoder": true diff --git a/keyboards/sawnsprojects/satxri6key/keyboard.json b/keyboards/sawnsprojects/satxri6key/keyboard.json index 3fc2f96eb0..92a798e4b2 100644 --- a/keyboards/sawnsprojects/satxri6key/keyboard.json +++ b/keyboards/sawnsprojects/satxri6key/keyboard.json @@ -82,7 +82,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/sawnsprojects/vcl65/solder/keyboard.json b/keyboards/sawnsprojects/vcl65/solder/keyboard.json index 10c10da8f2..3e2e2a8750 100644 --- a/keyboards/sawnsprojects/vcl65/solder/keyboard.json +++ b/keyboards/sawnsprojects/vcl65/solder/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/scatter42/keyboard.json b/keyboards/scatter42/keyboard.json index 16471f9e2b..5907a4d754 100644 --- a/keyboards/scatter42/keyboard.json +++ b/keyboards/scatter42/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/sck/gtm/keyboard.json b/keyboards/sck/gtm/keyboard.json index 88744edc84..de82d93a16 100644 --- a/keyboards/sck/gtm/keyboard.json +++ b/keyboards/sck/gtm/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": false, diff --git a/keyboards/sck/neiso/keyboard.json b/keyboards/sck/neiso/keyboard.json index 28ea132e2f..51c1fb0092 100644 --- a/keyboards/sck/neiso/keyboard.json +++ b/keyboards/sck/neiso/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/scottokeebs/scotto34/keyboard.json b/keyboards/scottokeebs/scotto34/keyboard.json index 8b0dee8694..573768914b 100644 --- a/keyboards/scottokeebs/scotto34/keyboard.json +++ b/keyboards/scottokeebs/scotto34/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/scottokeebs/scotto69/keyboard.json b/keyboards/scottokeebs/scotto69/keyboard.json index 48c145abc3..f229004a61 100644 --- a/keyboards/scottokeebs/scotto69/keyboard.json +++ b/keyboards/scottokeebs/scotto69/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/scottokeebs/scottowing/keyboard.json b/keyboards/scottokeebs/scottowing/keyboard.json index 41693bd7cc..9fc5571646 100644 --- a/keyboards/scottokeebs/scottowing/keyboard.json +++ b/keyboards/scottokeebs/scottowing/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/75pixels/keyboard.json b/keyboards/sendyyeah/75pixels/keyboard.json index e72f6793a3..8200574dd9 100644 --- a/keyboards/sendyyeah/75pixels/keyboard.json +++ b/keyboards/sendyyeah/75pixels/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/bevi/keyboard.json b/keyboards/sendyyeah/bevi/keyboard.json index 2e59d930b3..2c45339d26 100644 --- a/keyboards/sendyyeah/bevi/keyboard.json +++ b/keyboards/sendyyeah/bevi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/sendyyeah/pix/keyboard.json b/keyboards/sendyyeah/pix/keyboard.json index d71fdff7c6..bb74798d00 100644 --- a/keyboards/sendyyeah/pix/keyboard.json +++ b/keyboards/sendyyeah/pix/keyboard.json @@ -38,7 +38,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/senselessclay/ck60/keyboard.json b/keyboards/senselessclay/ck60/keyboard.json index 66f0dafba7..d4fa5336e6 100644 --- a/keyboards/senselessclay/ck60/keyboard.json +++ b/keyboards/senselessclay/ck60/keyboard.json @@ -41,7 +41,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/ck65/keyboard.json b/keyboards/senselessclay/ck65/keyboard.json index b492cfa558..294d002c5b 100644 --- a/keyboards/senselessclay/ck65/keyboard.json +++ b/keyboards/senselessclay/ck65/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/gos65/keyboard.json b/keyboards/senselessclay/gos65/keyboard.json index f7f5ffa766..783f3a5c82 100644 --- a/keyboards/senselessclay/gos65/keyboard.json +++ b/keyboards/senselessclay/gos65/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/senselessclay/had60/keyboard.json b/keyboards/senselessclay/had60/keyboard.json index 0dba4faf3c..6857ea4ab2 100644 --- a/keyboards/senselessclay/had60/keyboard.json +++ b/keyboards/senselessclay/had60/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/sentraq/s60_x/default/keyboard.json b/keyboards/sentraq/s60_x/default/keyboard.json index 799c5c16c0..f55df16eb4 100644 --- a/keyboards/sentraq/s60_x/default/keyboard.json +++ b/keyboards/sentraq/s60_x/default/keyboard.json @@ -2,7 +2,6 @@ "keyboard_name": "S60-X", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/sentraq/s60_x/rgb/keyboard.json b/keyboards/sentraq/s60_x/rgb/keyboard.json index 226f5eecb4..08bd224d8e 100644 --- a/keyboards/sentraq/s60_x/rgb/keyboard.json +++ b/keyboards/sentraq/s60_x/rgb/keyboard.json @@ -3,7 +3,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sentraq/s65_plus/keyboard.json b/keyboards/sentraq/s65_plus/keyboard.json index afd14f8455..70c75928d7 100644 --- a/keyboards/sentraq/s65_plus/keyboard.json +++ b/keyboards/sentraq/s65_plus/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/sentraq/s65_x/keyboard.json b/keyboards/sentraq/s65_x/keyboard.json index 74f0aaffbd..a248e491e8 100644 --- a/keyboards/sentraq/s65_x/keyboard.json +++ b/keyboards/sentraq/s65_x/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/sets3n/kk980/keyboard.json b/keyboards/sets3n/kk980/keyboard.json index 1211f84f52..7fd2d56403 100644 --- a/keyboards/sets3n/kk980/keyboard.json +++ b/keyboards/sets3n/kk980/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sha/keyboard.json b/keyboards/sha/keyboard.json index 5e7b2e3960..e361334e00 100644 --- a/keyboards/sha/keyboard.json +++ b/keyboards/sha/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shambles/keyboard.json b/keyboards/shambles/keyboard.json index 157360237c..ee134b721b 100644 --- a/keyboards/shambles/keyboard.json +++ b/keyboards/shambles/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/shandoncodes/flygone60/rev3/keyboard.json b/keyboards/shandoncodes/flygone60/rev3/keyboard.json index 04015cc488..4b83963648 100644 --- a/keyboards/shandoncodes/flygone60/rev3/keyboard.json +++ b/keyboards/shandoncodes/flygone60/rev3/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/shandoncodes/mino/hotswap/keyboard.json b/keyboards/shandoncodes/mino/hotswap/keyboard.json index 52ed12f39b..b7f55f6535 100644 --- a/keyboards/shandoncodes/mino/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino/hotswap/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json index b15a8e6316..9103f08175 100644 --- a/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/hotswap/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json index b4c78ad28b..f89fffa4c5 100644 --- a/keyboards/shandoncodes/mino_plus/soldered/keyboard.json +++ b/keyboards/shandoncodes/mino_plus/soldered/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shandoncodes/riot_pad/keyboard.json b/keyboards/shandoncodes/riot_pad/keyboard.json index d68a0da390..2c52ee5439 100644 --- a/keyboards/shandoncodes/riot_pad/keyboard.json +++ b/keyboards/shandoncodes/riot_pad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "nkro": true, "rgblight": true, "extrakey": true diff --git a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json index 70b08ee880..ff4ad9a4f7 100644 --- a/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s2/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json index e739b3775a..9d02cc1326 100644 --- a/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s3/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json index 9686cb15c3..4161e19d7c 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json +++ b/keyboards/sharkoon/skiller_sgk50_s4/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/shoc/keyboard.json b/keyboards/shoc/keyboard.json index 5b98bb6dad..b0da52f9f6 100644 --- a/keyboards/shoc/keyboard.json +++ b/keyboards/shoc/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false, diff --git a/keyboards/sidderskb/majbritt/rev2/keyboard.json b/keyboards/sidderskb/majbritt/rev2/keyboard.json index 0fcde53bc4..900b3c3061 100644 --- a/keyboards/sidderskb/majbritt/rev2/keyboard.json +++ b/keyboards/sidderskb/majbritt/rev2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/skeletn87/hotswap/keyboard.json b/keyboards/skeletn87/hotswap/keyboard.json index 663236018c..70747ce801 100644 --- a/keyboards/skeletn87/hotswap/keyboard.json +++ b/keyboards/skeletn87/hotswap/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/skeletn87/soldered/keyboard.json b/keyboards/skeletn87/soldered/keyboard.json index 22486837f7..81d93c42a7 100644 --- a/keyboards/skeletn87/soldered/keyboard.json +++ b/keyboards/skeletn87/soldered/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/skeletonkbd/frost68/keyboard.json b/keyboards/skeletonkbd/frost68/keyboard.json index 127c695aed..9d1173c860 100644 --- a/keyboards/skeletonkbd/frost68/keyboard.json +++ b/keyboards/skeletonkbd/frost68/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skeletonkbd/skeletonnumpad/keyboard.json b/keyboards/skeletonkbd/skeletonnumpad/keyboard.json index 4d6a7edea9..d34d10de03 100644 --- a/keyboards/skeletonkbd/skeletonnumpad/keyboard.json +++ b/keyboards/skeletonkbd/skeletonnumpad/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/skme/zeno/keyboard.json b/keyboards/skme/zeno/keyboard.json index e5c7142cc9..d659227334 100644 --- a/keyboards/skme/zeno/keyboard.json +++ b/keyboards/skme/zeno/keyboard.json @@ -20,7 +20,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "qmk": { diff --git a/keyboards/skmt/15k/keyboard.json b/keyboards/skmt/15k/keyboard.json index c16a970d1e..d09f3fb989 100644 --- a/keyboards/skmt/15k/keyboard.json +++ b/keyboards/skmt/15k/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skyloong/dt40/keyboard.json b/keyboards/skyloong/dt40/keyboard.json index 1f15227a19..be0ccb2912 100644 --- a/keyboards/skyloong/dt40/keyboard.json +++ b/keyboards/skyloong/dt40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/skyloong/gk61/v1/keyboard.json b/keyboards/skyloong/gk61/v1/keyboard.json index 3d93d6355e..68fda1220f 100644 --- a/keyboards/skyloong/gk61/v1/keyboard.json +++ b/keyboards/skyloong/gk61/v1/keyboard.json @@ -9,7 +9,6 @@ "extrakey": true, "mousekey": true, "nkro": true, - "command": false, "rgb_matrix": true }, "processor": "STM32F103", diff --git a/keyboards/skyloong/qk21/v1/keyboard.json b/keyboards/skyloong/qk21/v1/keyboard.json index 31f90acb52..d3d4ce0a49 100644 --- a/keyboards/skyloong/qk21/v1/keyboard.json +++ b/keyboards/skyloong/qk21/v1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/slz40/keyboard.json b/keyboards/slz40/keyboard.json index ba67dc7fc1..3ca4c1d3fc 100644 --- a/keyboards/slz40/keyboard.json +++ b/keyboards/slz40/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/smithrune/iron180v2/v2h/keyboard.json b/keyboards/smithrune/iron180v2/v2h/keyboard.json index fae25b8c65..f37454e33b 100644 --- a/keyboards/smithrune/iron180v2/v2h/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2h/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/smithrune/iron180v2/v2s/keyboard.json b/keyboards/smithrune/iron180v2/v2s/keyboard.json index 3489d8f177..455f4b3956 100644 --- a/keyboards/smithrune/iron180v2/v2s/keyboard.json +++ b/keyboards/smithrune/iron180v2/v2s/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/smithrune/magnus/m75h/keyboard.json b/keyboards/smithrune/magnus/m75h/keyboard.json index 4b5c0974c1..b3cc371387 100644 --- a/keyboards/smithrune/magnus/m75h/keyboard.json +++ b/keyboards/smithrune/magnus/m75h/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/smithrune/magnus/m75s/keyboard.json b/keyboards/smithrune/magnus/m75s/keyboard.json index 911f3ff7d8..7c772a9d6f 100644 --- a/keyboards/smithrune/magnus/m75s/keyboard.json +++ b/keyboards/smithrune/magnus/m75s/keyboard.json @@ -18,7 +18,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/smk60/keyboard.json b/keyboards/smk60/keyboard.json index 484b76ad05..01fb309962 100644 --- a/keyboards/smk60/keyboard.json +++ b/keyboards/smk60/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/smoll/lefty/info.json b/keyboards/smoll/lefty/info.json index 0cfe860ded..c721095cee 100644 --- a/keyboards/smoll/lefty/info.json +++ b/keyboards/smoll/lefty/info.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/sneakbox/aliceclone/keyboard.json b/keyboards/sneakbox/aliceclone/keyboard.json index 0cde1275c4..ecf6aad57c 100644 --- a/keyboards/sneakbox/aliceclone/keyboard.json +++ b/keyboards/sneakbox/aliceclone/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/aliceclonergb/keyboard.json b/keyboards/sneakbox/aliceclonergb/keyboard.json index 539404b338..b80ba95f91 100644 --- a/keyboards/sneakbox/aliceclonergb/keyboard.json +++ b/keyboards/sneakbox/aliceclonergb/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/ava/keyboard.json b/keyboards/sneakbox/ava/keyboard.json index 94369ad467..b871f6b14e 100644 --- a/keyboards/sneakbox/ava/keyboard.json +++ b/keyboards/sneakbox/ava/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/disarray/ortho/keyboard.json b/keyboards/sneakbox/disarray/ortho/keyboard.json index 994b0cd115..c9fc1e5012 100644 --- a/keyboards/sneakbox/disarray/ortho/keyboard.json +++ b/keyboards/sneakbox/disarray/ortho/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sneakbox/disarray/staggered/keyboard.json b/keyboards/sneakbox/disarray/staggered/keyboard.json index a03c80948c..df5b0983ce 100644 --- a/keyboards/sneakbox/disarray/staggered/keyboard.json +++ b/keyboards/sneakbox/disarray/staggered/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/snes_macropad/keyboard.json b/keyboards/snes_macropad/keyboard.json index c9d5e2aa59..a7f00f3fd8 100644 --- a/keyboards/snes_macropad/keyboard.json +++ b/keyboards/snes_macropad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/soup10/keyboard.json b/keyboards/soup10/keyboard.json index df8cfcc2c4..54b9fa9cf6 100644 --- a/keyboards/soup10/keyboard.json +++ b/keyboards/soup10/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/sowbug/68keys/keyboard.json b/keyboards/sowbug/68keys/keyboard.json index e031da1bb9..be4ffbf9a9 100644 --- a/keyboards/sowbug/68keys/keyboard.json +++ b/keyboards/sowbug/68keys/keyboard.json @@ -63,7 +63,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/sowbug/ansi_tkl/keyboard.json b/keyboards/sowbug/ansi_tkl/keyboard.json index 9cbc13dce0..50b9d8095a 100644 --- a/keyboards/sowbug/ansi_tkl/keyboard.json +++ b/keyboards/sowbug/ansi_tkl/keyboard.json @@ -63,7 +63,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/spaceholdings/nebula12b/keyboard.json b/keyboards/spaceholdings/nebula12b/keyboard.json index f9e9b960d7..6990da485b 100755 --- a/keyboards/spaceholdings/nebula12b/keyboard.json +++ b/keyboards/spaceholdings/nebula12b/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/spaceholdings/nebula68b/info.json b/keyboards/spaceholdings/nebula68b/info.json index 9c8274a8ed..1c279ee715 100644 --- a/keyboards/spaceholdings/nebula68b/info.json +++ b/keyboards/spaceholdings/nebula68b/info.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/spacetime/info.json b/keyboards/spacetime/info.json index 4e3682a8c2..e103f58ebb 100644 --- a/keyboards/spacetime/info.json +++ b/keyboards/spacetime/info.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/sparrow62/keyboard.json b/keyboards/sparrow62/keyboard.json index e9c83a0356..66efa2288b 100644 --- a/keyboards/sparrow62/keyboard.json +++ b/keyboards/sparrow62/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/splitography/keyboard.json b/keyboards/splitography/keyboard.json index 698ded2e95..3fd26500cd 100644 --- a/keyboards/splitography/keyboard.json +++ b/keyboards/splitography/keyboard.json @@ -9,8 +9,7 @@ "nkro": true, "bootmagic": true, "mousekey": false, - "extrakey": true, - "command": false + "extrakey": true }, "qmk": { "locking": { diff --git a/keyboards/sporewoh/banime40/keyboard.json b/keyboards/sporewoh/banime40/keyboard.json index 62a814e1c2..39a60e9b56 100644 --- a/keyboards/sporewoh/banime40/keyboard.json +++ b/keyboards/sporewoh/banime40/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/star75/keyboard.json b/keyboards/star75/keyboard.json index 155481d753..90f478ff60 100644 --- a/keyboards/star75/keyboard.json +++ b/keyboards/star75/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/stello65/beta/keyboard.json b/keyboards/stello65/beta/keyboard.json index e8c23a1d4d..81a4b6924f 100644 --- a/keyboards/stello65/beta/keyboard.json +++ b/keyboards/stello65/beta/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/stello65/hs_rev1/keyboard.json b/keyboards/stello65/hs_rev1/keyboard.json index ec5db7023e..072ccb97ca 100644 --- a/keyboards/stello65/hs_rev1/keyboard.json +++ b/keyboards/stello65/hs_rev1/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/stello65/sl_rev1/keyboard.json b/keyboards/stello65/sl_rev1/keyboard.json index 453fe742c4..0ed80b018a 100644 --- a/keyboards/stello65/sl_rev1/keyboard.json +++ b/keyboards/stello65/sl_rev1/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json index eeadba9390..90d6187434 100644 --- a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json index e54f31703f..e1753f2b84 100644 --- a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json index 2ed5532bda..81639fe32b 100644 --- a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": true, diff --git a/keyboards/sthlmkb/lagom/keyboard.json b/keyboards/sthlmkb/lagom/keyboard.json index 423605b17f..a3bacac77e 100644 --- a/keyboards/sthlmkb/lagom/keyboard.json +++ b/keyboards/sthlmkb/lagom/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": false, - "command": false, "extrakey": true, "debug": false, "mousekey": false, diff --git a/keyboards/sthlmkb/litl/keyboard.json b/keyboards/sthlmkb/litl/keyboard.json index d9208b53f1..32f7c1852d 100644 --- a/keyboards/sthlmkb/litl/keyboard.json +++ b/keyboards/sthlmkb/litl/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": false, - "command": false, "extrakey": true, "debug": false, "mousekey": false, diff --git a/keyboards/stratos/keyboard.json b/keyboards/stratos/keyboard.json index 984f488ebd..b1a1a15da0 100644 --- a/keyboards/stratos/keyboard.json +++ b/keyboards/stratos/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/strech/soulstone/keyboard.json b/keyboards/strech/soulstone/keyboard.json index 27773b88f2..67a65fbd69 100644 --- a/keyboards/strech/soulstone/keyboard.json +++ b/keyboards/strech/soulstone/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "qmk": { diff --git a/keyboards/studiokestra/fairholme/keyboard.json b/keyboards/studiokestra/fairholme/keyboard.json index d70934187c..413218e8bd 100644 --- a/keyboards/studiokestra/fairholme/keyboard.json +++ b/keyboards/studiokestra/fairholme/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/studiokestra/frl84/keyboard.json b/keyboards/studiokestra/frl84/keyboard.json index c4dda59ddd..c5f5f16bdb 100644 --- a/keyboards/studiokestra/frl84/keyboard.json +++ b/keyboards/studiokestra/frl84/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/galatea/rev1/keyboard.json b/keyboards/studiokestra/galatea/rev1/keyboard.json index 63a073fc56..ea69d22669 100644 --- a/keyboards/studiokestra/galatea/rev1/keyboard.json +++ b/keyboards/studiokestra/galatea/rev1/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/studiokestra/galatea/rev2/keyboard.json b/keyboards/studiokestra/galatea/rev2/keyboard.json index fa2911a7eb..d324f66215 100644 --- a/keyboards/studiokestra/galatea/rev2/keyboard.json +++ b/keyboards/studiokestra/galatea/rev2/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/galatea/rev3/keyboard.json b/keyboards/studiokestra/galatea/rev3/keyboard.json index d5dd8e3e87..b5a5d58762 100644 --- a/keyboards/studiokestra/galatea/rev3/keyboard.json +++ b/keyboards/studiokestra/galatea/rev3/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/studiokestra/line_friends_tkl/keyboard.json b/keyboards/studiokestra/line_friends_tkl/keyboard.json index 40a7d0894e..5aa286b92e 100644 --- a/keyboards/studiokestra/line_friends_tkl/keyboard.json +++ b/keyboards/studiokestra/line_friends_tkl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/subatomic/keyboard.json b/keyboards/subatomic/keyboard.json index a69e18efa2..150bebf1cb 100644 --- a/keyboards/subatomic/keyboard.json +++ b/keyboards/subatomic/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "midi": true, "mousekey": false, diff --git a/keyboards/subrezon/lancer/keyboard.json b/keyboards/subrezon/lancer/keyboard.json index 43e80edff1..571cf4c8ad 100644 --- a/keyboards/subrezon/lancer/keyboard.json +++ b/keyboards/subrezon/lancer/keyboard.json @@ -14,7 +14,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/suikagiken/suika15tone/keyboard.json b/keyboards/suikagiken/suika15tone/keyboard.json index 985c3f9845..7cfa5a4fb0 100644 --- a/keyboards/suikagiken/suika15tone/keyboard.json +++ b/keyboards/suikagiken/suika15tone/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "midi": true, "mousekey": true, diff --git a/keyboards/suikagiken/suika27melo/keyboard.json b/keyboards/suikagiken/suika27melo/keyboard.json index 8b58362db1..26b57f7001 100644 --- a/keyboards/suikagiken/suika27melo/keyboard.json +++ b/keyboards/suikagiken/suika27melo/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "midi": true, "mousekey": true, diff --git a/keyboards/suikagiken/suika83opti/keyboard.json b/keyboards/suikagiken/suika83opti/keyboard.json index b3b8a975bc..18128b05f8 100644 --- a/keyboards/suikagiken/suika83opti/keyboard.json +++ b/keyboards/suikagiken/suika83opti/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/suikagiken/suika85ergo/keyboard.json b/keyboards/suikagiken/suika85ergo/keyboard.json index 0bca9ab578..6274f56f7c 100644 --- a/keyboards/suikagiken/suika85ergo/keyboard.json +++ b/keyboards/suikagiken/suika85ergo/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/supersplit/keyboard.json b/keyboards/supersplit/keyboard.json index efce5060d9..fb4babd0dd 100644 --- a/keyboards/supersplit/keyboard.json +++ b/keyboards/supersplit/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/superuser/ext/keyboard.json b/keyboards/superuser/ext/keyboard.json index f0aebb6514..d3252e47e2 100644 --- a/keyboards/superuser/ext/keyboard.json +++ b/keyboards/superuser/ext/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/superuser/frl/keyboard.json b/keyboards/superuser/frl/keyboard.json index e02d785a7c..8e5775a7d1 100644 --- a/keyboards/superuser/frl/keyboard.json +++ b/keyboards/superuser/frl/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/superuser/tkl/keyboard.json b/keyboards/superuser/tkl/keyboard.json index 8c947d33d0..a8828b115c 100644 --- a/keyboards/superuser/tkl/keyboard.json +++ b/keyboards/superuser/tkl/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/swiftrax/retropad/keyboard.json b/keyboards/swiftrax/retropad/keyboard.json index 97ffc5b6fe..92032ad6e3 100644 --- a/keyboards/swiftrax/retropad/keyboard.json +++ b/keyboards/swiftrax/retropad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/swiss/keyboard.json b/keyboards/swiss/keyboard.json index 5d40df4225..bc592ba02e 100644 --- a/keyboards/swiss/keyboard.json +++ b/keyboards/swiss/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/switchplate/switchplate910/keyboard.json b/keyboards/switchplate/switchplate910/keyboard.json index f9c3d8eaf1..6a9715b92d 100644 --- a/keyboards/switchplate/switchplate910/keyboard.json +++ b/keyboards/switchplate/switchplate910/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/synthandkeys/bento_box/keyboard.json b/keyboards/synthandkeys/bento_box/keyboard.json index 90dbc71a1f..ad662f1669 100644 --- a/keyboards/synthandkeys/bento_box/keyboard.json +++ b/keyboards/synthandkeys/bento_box/keyboard.json @@ -16,7 +16,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/synthandkeys/the_debit_card/keyboard.json b/keyboards/synthandkeys/the_debit_card/keyboard.json index 95a74a5138..1de96089bc 100644 --- a/keyboards/synthandkeys/the_debit_card/keyboard.json +++ b/keyboards/synthandkeys/the_debit_card/keyboard.json @@ -5,7 +5,6 @@ "bootloader": "rp2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/synthlabs/060/keyboard.json b/keyboards/synthlabs/060/keyboard.json index 70437bb4aa..e251201a51 100644 --- a/keyboards/synthlabs/060/keyboard.json +++ b/keyboards/synthlabs/060/keyboard.json @@ -8,7 +8,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/synthlabs/065/keyboard.json b/keyboards/synthlabs/065/keyboard.json index 575fc18b58..ea862c6f01 100644 --- a/keyboards/synthlabs/065/keyboard.json +++ b/keyboards/synthlabs/065/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/synthlabs/solo/keyboard.json b/keyboards/synthlabs/solo/keyboard.json index da17217ad3..6640202474 100644 --- a/keyboards/synthlabs/solo/keyboard.json +++ b/keyboards/synthlabs/solo/keyboard.json @@ -7,7 +7,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tacworks/tac_k1/keyboard.json b/keyboards/tacworks/tac_k1/keyboard.json index 9c4463bb53..f1875ec180 100644 --- a/keyboards/tacworks/tac_k1/keyboard.json +++ b/keyboards/tacworks/tac_k1/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/baumkuchen/keyboard.json b/keyboards/takashicompany/baumkuchen/keyboard.json index 946238ab1d..d5aa1f81e1 100644 --- a/keyboards/takashicompany/baumkuchen/keyboard.json +++ b/keyboards/takashicompany/baumkuchen/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/center_enter/keyboard.json b/keyboards/takashicompany/center_enter/keyboard.json index 7780f014d8..992ca29efd 100644 --- a/keyboards/takashicompany/center_enter/keyboard.json +++ b/keyboards/takashicompany/center_enter/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/ejectix/keyboard.json b/keyboards/takashicompany/ejectix/keyboard.json index e4597fc642..3f29e5c86d 100644 --- a/keyboards/takashicompany/ejectix/keyboard.json +++ b/keyboards/takashicompany/ejectix/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/endzone34/keyboard.json b/keyboards/takashicompany/endzone34/keyboard.json index a54fe8a88d..c0b696e845 100644 --- a/keyboards/takashicompany/endzone34/keyboard.json +++ b/keyboards/takashicompany/endzone34/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/takashicompany/ergomirage/keyboard.json b/keyboards/takashicompany/ergomirage/keyboard.json index 6527e24c87..4a2e3ab5ec 100644 --- a/keyboards/takashicompany/ergomirage/keyboard.json +++ b/keyboards/takashicompany/ergomirage/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/goat51/keyboard.json b/keyboards/takashicompany/goat51/keyboard.json index 562b9d10b0..f91c5bda49 100644 --- a/keyboards/takashicompany/goat51/keyboard.json +++ b/keyboards/takashicompany/goat51/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/jourkey/keyboard.json b/keyboards/takashicompany/jourkey/keyboard.json index 7ea3fad083..e99eb87c47 100644 --- a/keyboards/takashicompany/jourkey/keyboard.json +++ b/keyboards/takashicompany/jourkey/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/klec_01/keyboard.json b/keyboards/takashicompany/klec_01/keyboard.json index 137201d560..88eda74f12 100644 --- a/keyboards/takashicompany/klec_01/keyboard.json +++ b/keyboards/takashicompany/klec_01/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/klec_02/keyboard.json b/keyboards/takashicompany/klec_02/keyboard.json index 751144aa3b..b659d18bc0 100644 --- a/keyboards/takashicompany/klec_02/keyboard.json +++ b/keyboards/takashicompany/klec_02/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/minidivide/keyboard.json b/keyboards/takashicompany/minidivide/keyboard.json index 4ccbed98b3..a2dea1ee65 100644 --- a/keyboards/takashicompany/minidivide/keyboard.json +++ b/keyboards/takashicompany/minidivide/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/minidivide_max/keyboard.json b/keyboards/takashicompany/minidivide_max/keyboard.json index 679000cafe..9cfd33373c 100644 --- a/keyboards/takashicompany/minidivide_max/keyboard.json +++ b/keyboards/takashicompany/minidivide_max/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/takashicompany/palmslave/keyboard.json b/keyboards/takashicompany/palmslave/keyboard.json index 3a1ea6ed91..a9825767ea 100644 --- a/keyboards/takashicompany/palmslave/keyboard.json +++ b/keyboards/takashicompany/palmslave/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/takashicompany/qoolee/keyboard.json b/keyboards/takashicompany/qoolee/keyboard.json index 011f9e5e42..26389b03a3 100644 --- a/keyboards/takashicompany/qoolee/keyboard.json +++ b/keyboards/takashicompany/qoolee/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/radialex/keyboard.json b/keyboards/takashicompany/radialex/keyboard.json index c4f991f393..3b71cc6a5b 100644 --- a/keyboards/takashicompany/radialex/keyboard.json +++ b/keyboards/takashicompany/radialex/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/takashicompany/rookey/keyboard.json b/keyboards/takashicompany/rookey/keyboard.json index 22903a5bab..5e530a5a3c 100644 --- a/keyboards/takashicompany/rookey/keyboard.json +++ b/keyboards/takashicompany/rookey/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/takashicompany/tightwriter/keyboard.json b/keyboards/takashicompany/tightwriter/keyboard.json index a3388c0574..6fb86b874b 100644 --- a/keyboards/takashicompany/tightwriter/keyboard.json +++ b/keyboards/takashicompany/tightwriter/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/taleguers/taleguers75/keyboard.json b/keyboards/taleguers/taleguers75/keyboard.json index 853b1747eb..0af1b2634b 100644 --- a/keyboards/taleguers/taleguers75/keyboard.json +++ b/keyboards/taleguers/taleguers75/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tanuki/keyboard.json b/keyboards/tanuki/keyboard.json index dc9affe3a7..90c5cd7cf7 100644 --- a/keyboards/tanuki/keyboard.json +++ b/keyboards/tanuki/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/teahouse/ayleen/keyboard.json b/keyboards/teahouse/ayleen/keyboard.json index 55a795d09c..adb1695086 100644 --- a/keyboards/teahouse/ayleen/keyboard.json +++ b/keyboards/teahouse/ayleen/keyboard.json @@ -9,7 +9,6 @@ "features": { "rgblight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/team0110/p1800fl/keyboard.json b/keyboards/team0110/p1800fl/keyboard.json index 621f5821c3..2e99ddeb87 100644 --- a/keyboards/team0110/p1800fl/keyboard.json +++ b/keyboards/team0110/p1800fl/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/teleport/native/info.json b/keyboards/teleport/native/info.json index d3630a0ee3..08432fbf14 100644 --- a/keyboards/teleport/native/info.json +++ b/keyboards/teleport/native/info.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/teleport/numpad/keyboard.json b/keyboards/teleport/numpad/keyboard.json index 572f01fd26..00862e4f9f 100644 --- a/keyboards/teleport/numpad/keyboard.json +++ b/keyboards/teleport/numpad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/teleport/tkl/keyboard.json b/keyboards/teleport/tkl/keyboard.json index 6d16d8a9e7..b6b93667f4 100644 --- a/keyboards/teleport/tkl/keyboard.json +++ b/keyboards/teleport/tkl/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tempo_turtle/bradpad/keyboard.json b/keyboards/tempo_turtle/bradpad/keyboard.json index e8a86526d6..eafadc10e0 100644 --- a/keyboards/tempo_turtle/bradpad/keyboard.json +++ b/keyboards/tempo_turtle/bradpad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tender/macrowo_pad/keyboard.json b/keyboards/tender/macrowo_pad/keyboard.json index 680fe6b13b..2380daf8b1 100644 --- a/keyboards/tender/macrowo_pad/keyboard.json +++ b/keyboards/tender/macrowo_pad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/tenki/keyboard.json b/keyboards/tenki/keyboard.json index b90c61470f..913017866b 100644 --- a/keyboards/tenki/keyboard.json +++ b/keyboards/tenki/keyboard.json @@ -32,7 +32,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/terrazzo/keyboard.json b/keyboards/terrazzo/keyboard.json index 735ccf19ec..71aa43f7e9 100644 --- a/keyboards/terrazzo/keyboard.json +++ b/keyboards/terrazzo/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "led_matrix": true, diff --git a/keyboards/tetris/keyboard.json b/keyboards/tetris/keyboard.json index eae9c39ec4..3500a9ffac 100644 --- a/keyboards/tetris/keyboard.json +++ b/keyboards/tetris/keyboard.json @@ -34,7 +34,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tg4x/keyboard.json b/keyboards/tg4x/keyboard.json index 93c620393e..a2e4a84ff5 100644 --- a/keyboards/tg4x/keyboard.json +++ b/keyboards/tg4x/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/tgr/910ce/keyboard.json b/keyboards/tgr/910ce/keyboard.json index 4df67dfc2d..39dc5c3746 100644 --- a/keyboards/tgr/910ce/keyboard.json +++ b/keyboards/tgr/910ce/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/the_royal/liminal/keyboard.json b/keyboards/the_royal/liminal/keyboard.json index 2023a8b6e1..e23c468702 100644 --- a/keyboards/the_royal/liminal/keyboard.json +++ b/keyboards/the_royal/liminal/keyboard.json @@ -18,7 +18,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/the_royal/schwann/keyboard.json b/keyboards/the_royal/schwann/keyboard.json index 0db2bc2075..d1db1f3e41 100644 --- a/keyboards/the_royal/schwann/keyboard.json +++ b/keyboards/the_royal/schwann/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json b/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json index 151ec83173..069a4b79fa 100644 --- a/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json +++ b/keyboards/themadnoodle/ncc1701kb/v2/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/noodlepad/info.json b/keyboards/themadnoodle/noodlepad/info.json index dde8ae08a7..48f984339c 100644 --- a/keyboards/themadnoodle/noodlepad/info.json +++ b/keyboards/themadnoodle/noodlepad/info.json @@ -8,7 +8,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/noodlepad_micro/keyboard.json b/keyboards/themadnoodle/noodlepad_micro/keyboard.json index c20b70493c..868cce3177 100644 --- a/keyboards/themadnoodle/noodlepad_micro/keyboard.json +++ b/keyboards/themadnoodle/noodlepad_micro/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/themadnoodle/udon13/keyboard.json b/keyboards/themadnoodle/udon13/keyboard.json index 10d4bff834..31ad17a367 100644 --- a/keyboards/themadnoodle/udon13/keyboard.json +++ b/keyboards/themadnoodle/udon13/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "encoder": true, "mousekey": true, diff --git a/keyboards/theone/keyboard.json b/keyboards/theone/keyboard.json index a2eff3c015..be141628f0 100644 --- a/keyboards/theone/keyboard.json +++ b/keyboards/theone/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": true, diff --git a/keyboards/thepanduuh/degenpad/keyboard.json b/keyboards/thepanduuh/degenpad/keyboard.json index 9fa02bae90..d74fd0dd2c 100644 --- a/keyboards/thepanduuh/degenpad/keyboard.json +++ b/keyboards/thepanduuh/degenpad/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/thevankeyboards/caravan/keyboard.json b/keyboards/thevankeyboards/caravan/keyboard.json index 5dce31e1ea..578a2b3021 100644 --- a/keyboards/thevankeyboards/caravan/keyboard.json +++ b/keyboards/thevankeyboards/caravan/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/tkc/california/keyboard.json b/keyboards/tkc/california/keyboard.json index 304e9fcb8e..7a7edecfef 100644 --- a/keyboards/tkc/california/keyboard.json +++ b/keyboards/tkc/california/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tkc/candybar/lefty/keyboard.json b/keyboards/tkc/candybar/lefty/keyboard.json index 46aeefcde3..333a4a30e9 100644 --- a/keyboards/tkc/candybar/lefty/keyboard.json +++ b/keyboards/tkc/candybar/lefty/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/lefty_r3/keyboard.json b/keyboards/tkc/candybar/lefty_r3/keyboard.json index fc18aa46fe..4e695a2156 100644 --- a/keyboards/tkc/candybar/lefty_r3/keyboard.json +++ b/keyboards/tkc/candybar/lefty_r3/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/righty/keyboard.json b/keyboards/tkc/candybar/righty/keyboard.json index e351ffd293..19f50d9df7 100644 --- a/keyboards/tkc/candybar/righty/keyboard.json +++ b/keyboards/tkc/candybar/righty/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/candybar/righty_r3/keyboard.json b/keyboards/tkc/candybar/righty_r3/keyboard.json index 15c52701bc..80f90c30ac 100644 --- a/keyboards/tkc/candybar/righty_r3/keyboard.json +++ b/keyboards/tkc/candybar/righty_r3/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/tkc/godspeed75/keyboard.json b/keyboards/tkc/godspeed75/keyboard.json index 9d823c0cf8..3379975ee4 100644 --- a/keyboards/tkc/godspeed75/keyboard.json +++ b/keyboards/tkc/godspeed75/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tkc/tkc1800/keyboard.json b/keyboards/tkc/tkc1800/keyboard.json index 49c56735e4..ffd88d8b43 100644 --- a/keyboards/tkc/tkc1800/keyboard.json +++ b/keyboards/tkc/tkc1800/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tmo50/keyboard.json b/keyboards/tmo50/keyboard.json index c7d9170894..f8f48f6895 100644 --- a/keyboards/tmo50/keyboard.json +++ b/keyboards/tmo50/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/toad/keyboard.json b/keyboards/toad/keyboard.json index b8177692cc..6db4e402e1 100644 --- a/keyboards/toad/keyboard.json +++ b/keyboards/toad/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/toffee_studio/blueberry/keyboard.json b/keyboards/toffee_studio/blueberry/keyboard.json index 56b0bf2201..e5fa35a228 100644 --- a/keyboards/toffee_studio/blueberry/keyboard.json +++ b/keyboards/toffee_studio/blueberry/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tominabox1/adalyn/keyboard.json b/keyboards/tominabox1/adalyn/keyboard.json index ea05cffa88..0986067227 100644 --- a/keyboards/tominabox1/adalyn/keyboard.json +++ b/keyboards/tominabox1/adalyn/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/tominabox1/bigboy/keyboard.json b/keyboards/tominabox1/bigboy/keyboard.json index 4e00f6d65a..6ecd61da3b 100644 --- a/keyboards/tominabox1/bigboy/keyboard.json +++ b/keyboards/tominabox1/bigboy/keyboard.json @@ -35,7 +35,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tominabox1/qaz/keyboard.json b/keyboards/tominabox1/qaz/keyboard.json index d7df86716d..4595b5f42f 100644 --- a/keyboards/tominabox1/qaz/keyboard.json +++ b/keyboards/tominabox1/qaz/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tr60w/keyboard.json b/keyboards/tr60w/keyboard.json index aadc568626..4f188ae0a5 100644 --- a/keyboards/tr60w/keyboard.json +++ b/keyboards/tr60w/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/trainpad/keyboard.json b/keyboards/trainpad/keyboard.json index 79b80b04ce..e03d2d59f8 100644 --- a/keyboards/trainpad/keyboard.json +++ b/keyboards/trainpad/keyboard.json @@ -11,7 +11,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false }, "processor": "atmega32u2", diff --git a/keyboards/trashman/ketch/keyboard.json b/keyboards/trashman/ketch/keyboard.json index 3db7f58ad9..227ae1fb9f 100644 --- a/keyboards/trashman/ketch/keyboard.json +++ b/keyboards/trashman/ketch/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/treasure/type9s2/keyboard.json b/keyboards/treasure/type9s2/keyboard.json index dd43c38e8b..66905bdf8e 100644 --- a/keyboards/treasure/type9s2/keyboard.json +++ b/keyboards/treasure/type9s2/keyboard.json @@ -14,7 +14,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/treasure/type9s3/keyboard.json b/keyboards/treasure/type9s3/keyboard.json index a285925a46..380ad72683 100644 --- a/keyboards/treasure/type9s3/keyboard.json +++ b/keyboards/treasure/type9s3/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/trkeyboards/trk1/keyboard.json b/keyboards/trkeyboards/trk1/keyboard.json index 851ba638e9..83af00de3a 100644 --- a/keyboards/trkeyboards/trk1/keyboard.json +++ b/keyboards/trkeyboards/trk1/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/trnthsn/e8ghty/info.json b/keyboards/trnthsn/e8ghty/info.json index 47460abb8d..d52419d760 100644 --- a/keyboards/trnthsn/e8ghty/info.json +++ b/keyboards/trnthsn/e8ghty/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/e8ghtyneo/info.json b/keyboards/trnthsn/e8ghtyneo/info.json index e393624ecf..e81c5fbb22 100644 --- a/keyboards/trnthsn/e8ghtyneo/info.json +++ b/keyboards/trnthsn/e8ghtyneo/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/s6xty/keyboard.json b/keyboards/trnthsn/s6xty/keyboard.json index e6c9a1c359..2397fa0788 100644 --- a/keyboards/trnthsn/s6xty/keyboard.json +++ b/keyboards/trnthsn/s6xty/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/s6xty5neor2/info.json b/keyboards/trnthsn/s6xty5neor2/info.json index ca2869778c..ea6544cbd3 100644 --- a/keyboards/trnthsn/s6xty5neor2/info.json +++ b/keyboards/trnthsn/s6xty5neor2/info.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trojan_pinata/model_b/rev0/keyboard.json b/keyboards/trojan_pinata/model_b/rev0/keyboard.json index 20b89fb71c..fc1ba7f863 100644 --- a/keyboards/trojan_pinata/model_b/rev0/keyboard.json +++ b/keyboards/trojan_pinata/model_b/rev0/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/tunks/ergo33/keyboard.json b/keyboards/tunks/ergo33/keyboard.json index 85304d6153..b279af5c1a 100644 --- a/keyboards/tunks/ergo33/keyboard.json +++ b/keyboards/tunks/ergo33/keyboard.json @@ -27,7 +27,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/tweetydabird/lbs4/keyboard.json b/keyboards/tweetydabird/lbs4/keyboard.json index 709a1a875d..c7d1e7ab1b 100644 --- a/keyboards/tweetydabird/lbs4/keyboard.json +++ b/keyboards/tweetydabird/lbs4/keyboard.json @@ -7,7 +7,6 @@ "bootloader_instructions": "Short marked pads on PCB, or hold top left key when plugging in.", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/tweetydabird/lbs6/keyboard.json b/keyboards/tweetydabird/lbs6/keyboard.json index 3e5e3e5ef3..105dcf9013 100644 --- a/keyboards/tweetydabird/lbs6/keyboard.json +++ b/keyboards/tweetydabird/lbs6/keyboard.json @@ -6,7 +6,6 @@ "development_board": "promicro", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/tweetydabird/lotus58/info.json b/keyboards/tweetydabird/lotus58/info.json index dfc75fe407..7becd3ae26 100644 --- a/keyboards/tweetydabird/lotus58/info.json +++ b/keyboards/tweetydabird/lotus58/info.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ubest/vn/keyboard.json b/keyboards/ubest/vn/keyboard.json index c44824a95b..74da6f1ad9 100644 --- a/keyboards/ubest/vn/keyboard.json +++ b/keyboards/ubest/vn/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/uk78/keyboard.json b/keyboards/uk78/keyboard.json index 1a9bbb689d..c30725f553 100644 --- a/keyboards/uk78/keyboard.json +++ b/keyboards/uk78/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ungodly/nines/keyboard.json b/keyboards/ungodly/nines/keyboard.json index 0e7ff76b99..ee4c65f9bb 100644 --- a/keyboards/ungodly/nines/keyboard.json +++ b/keyboards/ungodly/nines/keyboard.json @@ -18,7 +18,6 @@ "bootloader": "caterina", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/unikeyboard/felix/keyboard.json b/keyboards/unikeyboard/felix/keyboard.json index 5ab1e71c1a..232c5f80f1 100644 --- a/keyboards/unikeyboard/felix/keyboard.json +++ b/keyboards/unikeyboard/felix/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/utd80/keyboard.json b/keyboards/utd80/keyboard.json index 1167b84da4..5ae20b4c02 100644 --- a/keyboards/utd80/keyboard.json +++ b/keyboards/utd80/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/v4n4g0rth0n/v1/keyboard.json b/keyboards/v4n4g0rth0n/v1/keyboard.json index 7dec889208..add06ed5db 100644 --- a/keyboards/v4n4g0rth0n/v1/keyboard.json +++ b/keyboards/v4n4g0rth0n/v1/keyboard.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/vagrant_10/keyboard.json b/keyboards/vagrant_10/keyboard.json index 262bfc6581..4bf29fba11 100644 --- a/keyboards/vagrant_10/keyboard.json +++ b/keyboards/vagrant_10/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vertex/angler2/keyboard.json b/keyboards/vertex/angler2/keyboard.json index e55805827b..2d6e65b304 100644 --- a/keyboards/vertex/angler2/keyboard.json +++ b/keyboards/vertex/angler2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/vertex/cycle7/keyboard.json b/keyboards/vertex/cycle7/keyboard.json index 865e8b604e..ef06889309 100644 --- a/keyboards/vertex/cycle7/keyboard.json +++ b/keyboards/vertex/cycle7/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/vertex/cycle8/keyboard.json b/keyboards/vertex/cycle8/keyboard.json index 8f90597e87..d00ef3eb49 100644 --- a/keyboards/vertex/cycle8/keyboard.json +++ b/keyboards/vertex/cycle8/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viendi8l/keyboard.json b/keyboards/viendi8l/keyboard.json index a96c0926e2..d87b95a1a0 100644 --- a/keyboards/viendi8l/keyboard.json +++ b/keyboards/viendi8l/keyboard.json @@ -20,7 +20,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/viktus/at101_bh/keyboard.json b/keyboards/viktus/at101_bh/keyboard.json index 02769b47e3..de7498964e 100644 --- a/keyboards/viktus/at101_bh/keyboard.json +++ b/keyboards/viktus/at101_bh/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/minne/keyboard.json b/keyboards/viktus/minne/keyboard.json index e87e2cbbcf..66700c47b2 100644 --- a/keyboards/viktus/minne/keyboard.json +++ b/keyboards/viktus/minne/keyboard.json @@ -13,7 +13,6 @@ "features": { "rgblight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/minne_topre/keyboard.json b/keyboards/viktus/minne_topre/keyboard.json index 5a4186c3bc..a0e142cd57 100644 --- a/keyboards/viktus/minne_topre/keyboard.json +++ b/keyboards/viktus/minne_topre/keyboard.json @@ -12,7 +12,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/omnikey_bh/keyboard.json b/keyboards/viktus/omnikey_bh/keyboard.json index 780b91ace3..8128a30b25 100644 --- a/keyboards/viktus/omnikey_bh/keyboard.json +++ b/keyboards/viktus/omnikey_bh/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2/keyboard.json b/keyboards/viktus/osav2/keyboard.json index 27bbc729d8..07ee36e849 100644 --- a/keyboards/viktus/osav2/keyboard.json +++ b/keyboards/viktus/osav2/keyboard.json @@ -14,7 +14,6 @@ "backlight": true, "rgblight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_numpad/keyboard.json b/keyboards/viktus/osav2_numpad/keyboard.json index 7e4e19dd68..c6975faee4 100644 --- a/keyboards/viktus/osav2_numpad/keyboard.json +++ b/keyboards/viktus/osav2_numpad/keyboard.json @@ -13,7 +13,6 @@ "features": { "rgblight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_numpad_topre/keyboard.json b/keyboards/viktus/osav2_numpad_topre/keyboard.json index 2b4961aed2..a1ccbfc251 100644 --- a/keyboards/viktus/osav2_numpad_topre/keyboard.json +++ b/keyboards/viktus/osav2_numpad_topre/keyboard.json @@ -12,7 +12,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/osav2_topre/keyboard.json b/keyboards/viktus/osav2_topre/keyboard.json index d5bbd8b92e..38a2a46335 100644 --- a/keyboards/viktus/osav2_topre/keyboard.json +++ b/keyboards/viktus/osav2_topre/keyboard.json @@ -12,7 +12,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/smolka/keyboard.json b/keyboards/viktus/smolka/keyboard.json index f07b1472ca..652d44fa8c 100644 --- a/keyboards/viktus/smolka/keyboard.json +++ b/keyboards/viktus/smolka/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/viktus/sp111_v2/keyboard.json b/keyboards/viktus/sp111_v2/keyboard.json index 79f76f2c90..e5e58be23e 100644 --- a/keyboards/viktus/sp111_v2/keyboard.json +++ b/keyboards/viktus/sp111_v2/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viktus/sp_mini/keyboard.json b/keyboards/viktus/sp_mini/keyboard.json index 0b8854b1b9..f6a54f131d 100644 --- a/keyboards/viktus/sp_mini/keyboard.json +++ b/keyboards/viktus/sp_mini/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/viktus/styrka/keyboard.json b/keyboards/viktus/styrka/keyboard.json index ce40b10e1a..e5f36bad58 100644 --- a/keyboards/viktus/styrka/keyboard.json +++ b/keyboards/viktus/styrka/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/viktus/styrka_topre/keyboard.json b/keyboards/viktus/styrka_topre/keyboard.json index fc3f044660..496bc39ca2 100644 --- a/keyboards/viktus/styrka_topre/keyboard.json +++ b/keyboards/viktus/styrka_topre/keyboard.json @@ -12,7 +12,6 @@ "processor": "atmega32u4", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/viktus/vkr94/keyboard.json b/keyboards/viktus/vkr94/keyboard.json index 0a41e6bda9..e31fc62feb 100644 --- a/keyboards/viktus/vkr94/keyboard.json +++ b/keyboards/viktus/vkr94/keyboard.json @@ -12,7 +12,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/viktus/z150_bh/keyboard.json b/keyboards/viktus/z150_bh/keyboard.json index b952864f70..29bba7b8ab 100644 --- a/keyboards/viktus/z150_bh/keyboard.json +++ b/keyboards/viktus/z150_bh/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vinhcatba/uncertainty/keyboard.json b/keyboards/vinhcatba/uncertainty/keyboard.json index d2b21a3b5d..d8a1b81f92 100644 --- a/keyboards/vinhcatba/uncertainty/keyboard.json +++ b/keyboards/vinhcatba/uncertainty/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "wpm": true, "encoder": true, "extrakey": true, diff --git a/keyboards/vitamins_included/info.json b/keyboards/vitamins_included/info.json index 2934c2cb71..305c740475 100644 --- a/keyboards/vitamins_included/info.json +++ b/keyboards/vitamins_included/info.json @@ -8,7 +8,6 @@ "features": { "audio": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/void/voidhhkb_hotswap/keyboard.json b/keyboards/void/voidhhkb_hotswap/keyboard.json index 61d2591d95..f2bdcd246e 100644 --- a/keyboards/void/voidhhkb_hotswap/keyboard.json +++ b/keyboards/void/voidhhkb_hotswap/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/vt40/keyboard.json b/keyboards/vt40/keyboard.json index 9afb32f7d1..4d4455d35c 100644 --- a/keyboards/vt40/keyboard.json +++ b/keyboards/vt40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/waldo/keyboard.json b/keyboards/waldo/keyboard.json index b3076d79cc..f2107fea31 100644 --- a/keyboards/waldo/keyboard.json +++ b/keyboards/waldo/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/walletburner/cajal/keyboard.json b/keyboards/walletburner/cajal/keyboard.json index 3e0b4e785e..03fb89b23e 100644 --- a/keyboards/walletburner/cajal/keyboard.json +++ b/keyboards/walletburner/cajal/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/walletburner/neuron/keyboard.json b/keyboards/walletburner/neuron/keyboard.json index e514e8d62b..d353b0b623 100644 --- a/keyboards/walletburner/neuron/keyboard.json +++ b/keyboards/walletburner/neuron/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wavtype/foundation/keyboard.json b/keyboards/wavtype/foundation/keyboard.json index 3be6a9ee0d..49c097d27a 100644 --- a/keyboards/wavtype/foundation/keyboard.json +++ b/keyboards/wavtype/foundation/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/wavtype/p01_ultra/keyboard.json b/keyboards/wavtype/p01_ultra/keyboard.json index 899fc805a4..ac56e454a8 100644 --- a/keyboards/wavtype/p01_ultra/keyboard.json +++ b/keyboards/wavtype/p01_ultra/keyboard.json @@ -29,7 +29,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/weirdo/geminate60/keyboard.json b/keyboards/weirdo/geminate60/keyboard.json index c8471db914..3008e2e7c6 100644 --- a/keyboards/weirdo/geminate60/keyboard.json +++ b/keyboards/weirdo/geminate60/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/kelowna/rgb64/keyboard.json b/keyboards/weirdo/kelowna/rgb64/keyboard.json index 149c2375b9..3b56deb894 100644 --- a/keyboards/weirdo/kelowna/rgb64/keyboard.json +++ b/keyboards/weirdo/kelowna/rgb64/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/ls_60/keyboard.json b/keyboards/weirdo/ls_60/keyboard.json index aa82bcf00c..871d1a4929 100644 --- a/keyboards/weirdo/ls_60/keyboard.json +++ b/keyboards/weirdo/ls_60/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/np64/keyboard.json b/keyboards/weirdo/naiping/np64/keyboard.json index 7cd14a1bfa..dc7ad18572 100644 --- a/keyboards/weirdo/naiping/np64/keyboard.json +++ b/keyboards/weirdo/naiping/np64/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/nphhkb/keyboard.json b/keyboards/weirdo/naiping/nphhkb/keyboard.json index 3bb4bd62ca..870ad3950e 100644 --- a/keyboards/weirdo/naiping/nphhkb/keyboard.json +++ b/keyboards/weirdo/naiping/nphhkb/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/weirdo/naiping/npminila/keyboard.json b/keyboards/weirdo/naiping/npminila/keyboard.json index 9bb791a2b1..5e8c8d8947 100644 --- a/keyboards/weirdo/naiping/npminila/keyboard.json +++ b/keyboards/weirdo/naiping/npminila/keyboard.json @@ -15,7 +15,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/wekey/polaris/keyboard.json b/keyboards/wekey/polaris/keyboard.json index 93a56385fd..b24a3076f9 100644 --- a/keyboards/wekey/polaris/keyboard.json +++ b/keyboards/wekey/polaris/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/werk_technica/one/keyboard.json b/keyboards/werk_technica/one/keyboard.json index b856c089df..ba5df0b136 100644 --- a/keyboards/werk_technica/one/keyboard.json +++ b/keyboards/werk_technica/one/keyboard.json @@ -14,7 +14,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/westfoxtrot/aanzee/keyboard.json b/keyboards/westfoxtrot/aanzee/keyboard.json index 72e1447ab1..03990a3929 100644 --- a/keyboards/westfoxtrot/aanzee/keyboard.json +++ b/keyboards/westfoxtrot/aanzee/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/westfoxtrot/cyclops/keyboard.json b/keyboards/westfoxtrot/cyclops/keyboard.json index 8c665aa03b..952b81d0e5 100644 --- a/keyboards/westfoxtrot/cyclops/keyboard.json +++ b/keyboards/westfoxtrot/cyclops/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/westfoxtrot/cypher/rev1/keyboard.json b/keyboards/westfoxtrot/cypher/rev1/keyboard.json index 509ecff384..a02c612154 100644 --- a/keyboards/westfoxtrot/cypher/rev1/keyboard.json +++ b/keyboards/westfoxtrot/cypher/rev1/keyboard.json @@ -9,7 +9,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/westfoxtrot/cypher/rev5/keyboard.json b/keyboards/westfoxtrot/cypher/rev5/keyboard.json index e9c6f0606e..b33222df97 100644 --- a/keyboards/westfoxtrot/cypher/rev5/keyboard.json +++ b/keyboards/westfoxtrot/cypher/rev5/keyboard.json @@ -9,7 +9,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/westfoxtrot/prophet/keyboard.json b/keyboards/westfoxtrot/prophet/keyboard.json index 74bd1b821b..64a952e286 100644 --- a/keyboards/westfoxtrot/prophet/keyboard.json +++ b/keyboards/westfoxtrot/prophet/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wilba_tech/rama_works_m10_b/keyboard.json b/keyboards/wilba_tech/rama_works_m10_b/keyboard.json index edcf24f62e..43df7942cb 100644 --- a/keyboards/wilba_tech/rama_works_m10_b/keyboard.json +++ b/keyboards/wilba_tech/rama_works_m10_b/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json b/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json index 82bfe552d5..9018086906 100644 --- a/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json +++ b/keyboards/wilba_tech/rama_works_m50_ax/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_g/keyboard.json b/keyboards/wilba_tech/wt60_g/keyboard.json index 21a84eff27..1838cb4809 100644 --- a/keyboards/wilba_tech/wt60_g/keyboard.json +++ b/keyboards/wilba_tech/wt60_g/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_g2/keyboard.json b/keyboards/wilba_tech/wt60_g2/keyboard.json index 6bfbe13132..a8a8b186a8 100644 --- a/keyboards/wilba_tech/wt60_g2/keyboard.json +++ b/keyboards/wilba_tech/wt60_g2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h1/keyboard.json b/keyboards/wilba_tech/wt60_h1/keyboard.json index 17a783f316..bd8d687a57 100644 --- a/keyboards/wilba_tech/wt60_h1/keyboard.json +++ b/keyboards/wilba_tech/wt60_h1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h2/keyboard.json b/keyboards/wilba_tech/wt60_h2/keyboard.json index ddce1d8b44..76c1385fcd 100644 --- a/keyboards/wilba_tech/wt60_h2/keyboard.json +++ b/keyboards/wilba_tech/wt60_h2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_h3/keyboard.json b/keyboards/wilba_tech/wt60_h3/keyboard.json index 42cc613dea..cf75517fb1 100644 --- a/keyboards/wilba_tech/wt60_h3/keyboard.json +++ b/keyboards/wilba_tech/wt60_h3/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt60_xt/keyboard.json b/keyboards/wilba_tech/wt60_xt/keyboard.json index de8572180d..55229a2400 100644 --- a/keyboards/wilba_tech/wt60_xt/keyboard.json +++ b/keyboards/wilba_tech/wt60_xt/keyboard.json @@ -11,7 +11,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_d/keyboard.json b/keyboards/wilba_tech/wt65_d/keyboard.json index 2985d5df76..e4e22b1eea 100644 --- a/keyboards/wilba_tech/wt65_d/keyboard.json +++ b/keyboards/wilba_tech/wt65_d/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_f/keyboard.json b/keyboards/wilba_tech/wt65_f/keyboard.json index 29c76d2ac2..b97e180fde 100644 --- a/keyboards/wilba_tech/wt65_f/keyboard.json +++ b/keyboards/wilba_tech/wt65_f/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_fx/keyboard.json b/keyboards/wilba_tech/wt65_fx/keyboard.json index 9907439d63..a914a804e1 100644 --- a/keyboards/wilba_tech/wt65_fx/keyboard.json +++ b/keyboards/wilba_tech/wt65_fx/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_g/keyboard.json b/keyboards/wilba_tech/wt65_g/keyboard.json index 07cd120bc2..fee51985f2 100644 --- a/keyboards/wilba_tech/wt65_g/keyboard.json +++ b/keyboards/wilba_tech/wt65_g/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_g2/keyboard.json b/keyboards/wilba_tech/wt65_g2/keyboard.json index e7124f917e..7c5610a3b4 100644 --- a/keyboards/wilba_tech/wt65_g2/keyboard.json +++ b/keyboards/wilba_tech/wt65_g2/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_h1/keyboard.json b/keyboards/wilba_tech/wt65_h1/keyboard.json index 60a76351c4..f43f4bb8d6 100644 --- a/keyboards/wilba_tech/wt65_h1/keyboard.json +++ b/keyboards/wilba_tech/wt65_h1/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_xt/keyboard.json b/keyboards/wilba_tech/wt65_xt/keyboard.json index 4ab03353c8..bc5785c3f1 100644 --- a/keyboards/wilba_tech/wt65_xt/keyboard.json +++ b/keyboards/wilba_tech/wt65_xt/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt65_xtx/keyboard.json b/keyboards/wilba_tech/wt65_xtx/keyboard.json index 6c15054d65..63660aa750 100644 --- a/keyboards/wilba_tech/wt65_xtx/keyboard.json +++ b/keyboards/wilba_tech/wt65_xtx/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wilba_tech/wt70_jb/keyboard.json b/keyboards/wilba_tech/wt70_jb/keyboard.json index 1e47da790b..8204b1850b 100644 --- a/keyboards/wilba_tech/wt70_jb/keyboard.json +++ b/keyboards/wilba_tech/wt70_jb/keyboard.json @@ -33,7 +33,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/wilba_tech/wt80_g/keyboard.json b/keyboards/wilba_tech/wt80_g/keyboard.json index 38065aa087..27526e4e1f 100644 --- a/keyboards/wilba_tech/wt80_g/keyboard.json +++ b/keyboards/wilba_tech/wt80_g/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/willoucom/keypad/keyboard.json b/keyboards/willoucom/keypad/keyboard.json index ede4a18ff5..1d070ea4e2 100644 --- a/keyboards/willoucom/keypad/keyboard.json +++ b/keyboards/willoucom/keypad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/winkeyless/b87/keyboard.json b/keyboards/winkeyless/b87/keyboard.json index ab7a82056e..82ef8555ac 100644 --- a/keyboards/winkeyless/b87/keyboard.json +++ b/keyboards/winkeyless/b87/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/winkeyless/bminiex/keyboard.json b/keyboards/winkeyless/bminiex/keyboard.json index 2dc9ccd60d..2794622fc6 100644 --- a/keyboards/winkeyless/bminiex/keyboard.json +++ b/keyboards/winkeyless/bminiex/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/winkeys/mini_winni/keyboard.json b/keyboards/winkeys/mini_winni/keyboard.json index e9a3ebca80..5bc83c5459 100644 --- a/keyboards/winkeys/mini_winni/keyboard.json +++ b/keyboards/winkeys/mini_winni/keyboard.json @@ -11,7 +11,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/winry/winry25tc/keyboard.json b/keyboards/winry/winry25tc/keyboard.json index d2d12854dd..c2682daa9a 100644 --- a/keyboards/winry/winry25tc/keyboard.json +++ b/keyboards/winry/winry25tc/keyboard.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/winry/winry315/keyboard.json b/keyboards/winry/winry315/keyboard.json index cad810e64f..44b51791e1 100644 --- a/keyboards/winry/winry315/keyboard.json +++ b/keyboards/winry/winry315/keyboard.json @@ -83,7 +83,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/wolf/frogpad/keyboard.json b/keyboards/wolf/frogpad/keyboard.json index 040554a921..b6ed0503a2 100644 --- a/keyboards/wolf/frogpad/keyboard.json +++ b/keyboards/wolf/frogpad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wolf/m60_b/keyboard.json b/keyboards/wolf/m60_b/keyboard.json index bd3233871f..df2d0e2a2f 100644 --- a/keyboards/wolf/m60_b/keyboard.json +++ b/keyboards/wolf/m60_b/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wolf/m6_c/keyboard.json b/keyboards/wolf/m6_c/keyboard.json index 3d4b326684..c1d3d1302a 100644 --- a/keyboards/wolf/m6_c/keyboard.json +++ b/keyboards/wolf/m6_c/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/wolf/neely65/keyboard.json b/keyboards/wolf/neely65/keyboard.json index 07c087b8ac..b7e0d3b13a 100644 --- a/keyboards/wolf/neely65/keyboard.json +++ b/keyboards/wolf/neely65/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/silhouette/keyboard.json b/keyboards/wolf/silhouette/keyboard.json index ba3a637ec8..e71d0fa38c 100644 --- a/keyboards/wolf/silhouette/keyboard.json +++ b/keyboards/wolf/silhouette/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/twilight/keyboard.json b/keyboards/wolf/twilight/keyboard.json index a296c76700..c0bd31bbbe 100644 --- a/keyboards/wolf/twilight/keyboard.json +++ b/keyboards/wolf/twilight/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wolf/ziggurat/keyboard.json b/keyboards/wolf/ziggurat/keyboard.json index 800db68b2a..3f4eb94e8e 100644 --- a/keyboards/wolf/ziggurat/keyboard.json +++ b/keyboards/wolf/ziggurat/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/woodkeys/scarletbandana/keyboard.json b/keyboards/woodkeys/scarletbandana/keyboard.json index 3d9e8c97ad..439c59e38d 100644 --- a/keyboards/woodkeys/scarletbandana/keyboard.json +++ b/keyboards/woodkeys/scarletbandana/keyboard.json @@ -31,7 +31,6 @@ "features": { "audio": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/work_louder/micro/keyboard.json b/keyboards/work_louder/micro/keyboard.json index 75789388e5..b8da74dd92 100644 --- a/keyboards/work_louder/micro/keyboard.json +++ b/keyboards/work_louder/micro/keyboard.json @@ -5,7 +5,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/work_louder/numpad/keyboard.json b/keyboards/work_louder/numpad/keyboard.json index 4ec9a8564c..fa4f3be9fe 100644 --- a/keyboards/work_louder/numpad/keyboard.json +++ b/keyboards/work_louder/numpad/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/alpha9/keyboard.json b/keyboards/wsk/alpha9/keyboard.json index 891fc09eed..acdc1be307 100644 --- a/keyboards/wsk/alpha9/keyboard.json +++ b/keyboards/wsk/alpha9/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/g4m3ralpha/keyboard.json b/keyboards/wsk/g4m3ralpha/keyboard.json index 4415d8aee5..4f88fd0ce1 100644 --- a/keyboards/wsk/g4m3ralpha/keyboard.json +++ b/keyboards/wsk/g4m3ralpha/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/houndstooth/keyboard.json b/keyboards/wsk/houndstooth/keyboard.json index dc651e89b5..d7596b151a 100644 --- a/keyboards/wsk/houndstooth/keyboard.json +++ b/keyboards/wsk/houndstooth/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wsk/jerkin/keyboard.json b/keyboards/wsk/jerkin/keyboard.json index dca3af2378..3fc05080b0 100644 --- a/keyboards/wsk/jerkin/keyboard.json +++ b/keyboards/wsk/jerkin/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/wsk/kodachi50/keyboard.json b/keyboards/wsk/kodachi50/keyboard.json index 5888fe00fb..c93952d808 100644 --- a/keyboards/wsk/kodachi50/keyboard.json +++ b/keyboards/wsk/kodachi50/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/pain27/keyboard.json b/keyboards/wsk/pain27/keyboard.json index 02345d04db..af882a112e 100644 --- a/keyboards/wsk/pain27/keyboard.json +++ b/keyboards/wsk/pain27/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/sl40/keyboard.json b/keyboards/wsk/sl40/keyboard.json index ab592a6967..9c6752b98c 100644 --- a/keyboards/wsk/sl40/keyboard.json +++ b/keyboards/wsk/sl40/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wsk/tkl30/keyboard.json b/keyboards/wsk/tkl30/keyboard.json index f69d9b5449..4a767c1da8 100644 --- a/keyboards/wsk/tkl30/keyboard.json +++ b/keyboards/wsk/tkl30/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/wuque/creek70/keyboard.json b/keyboards/wuque/creek70/keyboard.json index d7b64f88ce..23207bf2e9 100644 --- a/keyboards/wuque/creek70/keyboard.json +++ b/keyboards/wuque/creek70/keyboard.json @@ -7,7 +7,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/ikki68/keyboard.json b/keyboards/wuque/ikki68/keyboard.json index 942e290bd5..a8ec08fd61 100644 --- a/keyboards/wuque/ikki68/keyboard.json +++ b/keyboards/wuque/ikki68/keyboard.json @@ -36,7 +36,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/mammoth20x/keyboard.json b/keyboards/wuque/mammoth20x/keyboard.json index 6c8e252541..0626a4d4a9 100644 --- a/keyboards/wuque/mammoth20x/keyboard.json +++ b/keyboards/wuque/mammoth20x/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/wuque/mammoth75x/keyboard.json b/keyboards/wuque/mammoth75x/keyboard.json index 1e0028dfe9..f276715960 100644 --- a/keyboards/wuque/mammoth75x/keyboard.json +++ b/keyboards/wuque/mammoth75x/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "encoder": true, "extrakey": true, diff --git a/keyboards/wuque/nemui65/keyboard.json b/keyboards/wuque/nemui65/keyboard.json index 3579ec4036..49c58aea06 100644 --- a/keyboards/wuque/nemui65/keyboard.json +++ b/keyboards/wuque/nemui65/keyboard.json @@ -13,7 +13,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/wuque/promise87/ansi/keyboard.json b/keyboards/wuque/promise87/ansi/keyboard.json index 2c7008b646..e4a212a3d8 100644 --- a/keyboards/wuque/promise87/ansi/keyboard.json +++ b/keyboards/wuque/promise87/ansi/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/wuque/promise87/wkl/keyboard.json b/keyboards/wuque/promise87/wkl/keyboard.json index 4849b238e1..b9e4396f2d 100644 --- a/keyboards/wuque/promise87/wkl/keyboard.json +++ b/keyboards/wuque/promise87/wkl/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/wuque/tata80/wk/keyboard.json b/keyboards/wuque/tata80/wk/keyboard.json index a078e0b2a3..5b5b1fe50e 100644 --- a/keyboards/wuque/tata80/wk/keyboard.json +++ b/keyboards/wuque/tata80/wk/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/wuque/tata80/wkl/keyboard.json b/keyboards/wuque/tata80/wkl/keyboard.json index b91a7a5ac4..d8633e99f9 100644 --- a/keyboards/wuque/tata80/wkl/keyboard.json +++ b/keyboards/wuque/tata80/wkl/keyboard.json @@ -11,7 +11,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false diff --git a/keyboards/x16/keyboard.json b/keyboards/x16/keyboard.json index 17d28e8a5c..32c6581237 100644 --- a/keyboards/x16/keyboard.json +++ b/keyboards/x16/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xbows/knight/keyboard.json b/keyboards/xbows/knight/keyboard.json index ab888e6f23..d7f0559370 100644 --- a/keyboards/xbows/knight/keyboard.json +++ b/keyboards/xbows/knight/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/knight_plus/keyboard.json b/keyboards/xbows/knight_plus/keyboard.json index b1da324626..674cead21f 100644 --- a/keyboards/xbows/knight_plus/keyboard.json +++ b/keyboards/xbows/knight_plus/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/nature/keyboard.json b/keyboards/xbows/nature/keyboard.json index 49c2b323e7..46080476ea 100644 --- a/keyboards/xbows/nature/keyboard.json +++ b/keyboards/xbows/nature/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/numpad/keyboard.json b/keyboards/xbows/numpad/keyboard.json index b0bba80ec2..e2e76185ab 100644 --- a/keyboards/xbows/numpad/keyboard.json +++ b/keyboards/xbows/numpad/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xbows/ranger/keyboard.json b/keyboards/xbows/ranger/keyboard.json index fc1077d39a..60b7f5b892 100644 --- a/keyboards/xbows/ranger/keyboard.json +++ b/keyboards/xbows/ranger/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xelus/akis/keyboard.json b/keyboards/xelus/akis/keyboard.json index da072b6379..25b4f958d7 100644 --- a/keyboards/xelus/akis/keyboard.json +++ b/keyboards/xelus/akis/keyboard.json @@ -34,7 +34,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/xelus/dharma/keyboard.json b/keyboards/xelus/dharma/keyboard.json index 83f6d95581..adedaedba4 100644 --- a/keyboards/xelus/dharma/keyboard.json +++ b/keyboards/xelus/dharma/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/pachi/mini_32u4/keyboard.json b/keyboards/xelus/pachi/mini_32u4/keyboard.json index 78069d56b0..2156e10101 100644 --- a/keyboards/xelus/pachi/mini_32u4/keyboard.json +++ b/keyboards/xelus/pachi/mini_32u4/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/pachi/rev1/keyboard.json b/keyboards/xelus/pachi/rev1/keyboard.json index 4dc35075d5..84e0fee39a 100644 --- a/keyboards/xelus/pachi/rev1/keyboard.json +++ b/keyboards/xelus/pachi/rev1/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/pachi/rgb/info.json b/keyboards/xelus/pachi/rgb/info.json index 9bf3ca04ef..20c895f4bc 100644 --- a/keyboards/xelus/pachi/rgb/info.json +++ b/keyboards/xelus/pachi/rgb/info.json @@ -4,7 +4,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/xelus/rs60/rev1/keyboard.json b/keyboards/xelus/rs60/rev1/keyboard.json index f8b3673431..4f894056f6 100644 --- a/keyboards/xelus/rs60/rev1/keyboard.json +++ b/keyboards/xelus/rs60/rev1/keyboard.json @@ -5,7 +5,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/xelus/rs60/rev2_0/keyboard.json b/keyboards/xelus/rs60/rev2_0/keyboard.json index 754225b17c..e5506e0040 100644 --- a/keyboards/xelus/rs60/rev2_0/keyboard.json +++ b/keyboards/xelus/rs60/rev2_0/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/xelus/rs60/rev2_1/keyboard.json b/keyboards/xelus/rs60/rev2_1/keyboard.json index 12f6e42823..c116abc30b 100644 --- a/keyboards/xelus/rs60/rev2_1/keyboard.json +++ b/keyboards/xelus/rs60/rev2_1/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "console": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/xelus/snap96/keyboard.json b/keyboards/xelus/snap96/keyboard.json index 5a5f1d8c42..eb0538eff4 100644 --- a/keyboards/xelus/snap96/keyboard.json +++ b/keyboards/xelus/snap96/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/valor/rev1/keyboard.json b/keyboards/xelus/valor/rev1/keyboard.json index c5a7fe8113..cb69b0eef2 100644 --- a/keyboards/xelus/valor/rev1/keyboard.json +++ b/keyboards/xelus/valor/rev1/keyboard.json @@ -31,7 +31,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json b/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json index 7afc25deee..17e3191da0 100644 --- a/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json +++ b/keyboards/xelus/valor_frl_tkl/rev2_0/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json b/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json index 21ef5b6920..378511474d 100644 --- a/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json +++ b/keyboards/xelus/valor_frl_tkl/rev2_1/keyboard.json @@ -8,7 +8,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/xiudi/xd004/v1/keyboard.json b/keyboards/xiudi/xd004/v1/keyboard.json index 4a134dd5ef..7dc5c9fffc 100644 --- a/keyboards/xiudi/xd004/v1/keyboard.json +++ b/keyboards/xiudi/xd004/v1/keyboard.json @@ -12,7 +12,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/xiudi/xd60/rev2/keyboard.json b/keyboards/xiudi/xd60/rev2/keyboard.json index 9f25023bb9..f4c550c806 100644 --- a/keyboards/xiudi/xd60/rev2/keyboard.json +++ b/keyboards/xiudi/xd60/rev2/keyboard.json @@ -6,7 +6,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xiudi/xd60/rev3/keyboard.json b/keyboards/xiudi/xd60/rev3/keyboard.json index defbd93592..1320ef80f4 100644 --- a/keyboards/xiudi/xd60/rev3/keyboard.json +++ b/keyboards/xiudi/xd60/rev3/keyboard.json @@ -6,7 +6,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/xiudi/xd84pro/keyboard.json b/keyboards/xiudi/xd84pro/keyboard.json index e5dc56c29b..54c45774dd 100644 --- a/keyboards/xiudi/xd84pro/keyboard.json +++ b/keyboards/xiudi/xd84pro/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true, diff --git a/keyboards/xmmx/keyboard.json b/keyboards/xmmx/keyboard.json index 12cb6ad0fc..d75b6f21a1 100644 --- a/keyboards/xmmx/keyboard.json +++ b/keyboards/xmmx/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/yandrstudio/nz64/keyboard.json b/keyboards/yandrstudio/nz64/keyboard.json index a017b06f58..8c36b73c1e 100644 --- a/keyboards/yandrstudio/nz64/keyboard.json +++ b/keyboards/yandrstudio/nz64/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/yandrstudio/zhou65/keyboard.json b/keyboards/yandrstudio/zhou65/keyboard.json index 1c5f368262..6e65bacea2 100644 --- a/keyboards/yandrstudio/zhou65/keyboard.json +++ b/keyboards/yandrstudio/zhou65/keyboard.json @@ -7,7 +7,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/yatara/drink_me/keyboard.json b/keyboards/yatara/drink_me/keyboard.json index 523d0d916a..c297867709 100644 --- a/keyboards/yatara/drink_me/keyboard.json +++ b/keyboards/yatara/drink_me/keyboard.json @@ -12,7 +12,6 @@ "bootloader": "atmel-dfu", "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/ydkb/chili/keyboard.json b/keyboards/ydkb/chili/keyboard.json index 114b022ac6..c9d4540f64 100644 --- a/keyboards/ydkb/chili/keyboard.json +++ b/keyboards/ydkb/chili/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ydkb/yd68/keyboard.json b/keyboards/ydkb/yd68/keyboard.json index bb906ee146..6b28f1b0bf 100644 --- a/keyboards/ydkb/yd68/keyboard.json +++ b/keyboards/ydkb/yd68/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ydkb/ydpm40/keyboard.json b/keyboards/ydkb/ydpm40/keyboard.json index 5d016e389b..1f750060ac 100644 --- a/keyboards/ydkb/ydpm40/keyboard.json +++ b/keyboards/ydkb/ydpm40/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": false, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/yeehaw/keyboard.json b/keyboards/yeehaw/keyboard.json index d2555a3201..0f10738685 100644 --- a/keyboards/yeehaw/keyboard.json +++ b/keyboards/yeehaw/keyboard.json @@ -38,7 +38,6 @@ "bootloader": "caterina", "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ymdk/melody96/hotswap/keyboard.json b/keyboards/ymdk/melody96/hotswap/keyboard.json index 1b22f1fdee..f9b0c723e9 100644 --- a/keyboards/ymdk/melody96/hotswap/keyboard.json +++ b/keyboards/ymdk/melody96/hotswap/keyboard.json @@ -15,7 +15,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/np24/u4rgb6/keyboard.json b/keyboards/ymdk/np24/u4rgb6/keyboard.json index cc00595cc1..41ae2fd27b 100644 --- a/keyboards/ymdk/np24/u4rgb6/keyboard.json +++ b/keyboards/ymdk/np24/u4rgb6/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": false, diff --git a/keyboards/ymdk/wings/keyboard.json b/keyboards/ymdk/wings/keyboard.json index 9036872c66..304f2a1e95 100644 --- a/keyboards/ymdk/wings/keyboard.json +++ b/keyboards/ymdk/wings/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/wingshs/keyboard.json b/keyboards/ymdk/wingshs/keyboard.json index 252884dc75..a2b8be2c4e 100644 --- a/keyboards/ymdk/wingshs/keyboard.json +++ b/keyboards/ymdk/wingshs/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/yd60mq/info.json b/keyboards/ymdk/yd60mq/info.json index 11997ba50e..7fa7b6b4f3 100644 --- a/keyboards/ymdk/yd60mq/info.json +++ b/keyboards/ymdk/yd60mq/info.json @@ -9,7 +9,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/ym68/keyboard.json b/keyboards/ymdk/ym68/keyboard.json index a6185e5891..4deb5e0cfa 100644 --- a/keyboards/ymdk/ym68/keyboard.json +++ b/keyboards/ymdk/ym68/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ymdk/ymd09/keyboard.json b/keyboards/ymdk/ymd09/keyboard.json index 226502b093..644b4fb8f4 100644 --- a/keyboards/ymdk/ymd09/keyboard.json +++ b/keyboards/ymdk/ymd09/keyboard.json @@ -19,7 +19,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/ymdk/ymd21/v2/keyboard.json b/keyboards/ymdk/ymd21/v2/keyboard.json index 7e09f04fdf..e292fca3de 100644 --- a/keyboards/ymdk/ymd21/v2/keyboard.json +++ b/keyboards/ymdk/ymd21/v2/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json index 44c43e8d85..1ff9130019 100644 --- a/keyboards/ymdk/ymd75/rev4/iso/keyboard.json +++ b/keyboards/ymdk/ymd75/rev4/iso/keyboard.json @@ -17,7 +17,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/ymdk/ymd96/keyboard.json b/keyboards/ymdk/ymd96/keyboard.json index cd5b6509f4..437609f8c8 100644 --- a/keyboards/ymdk/ymd96/keyboard.json +++ b/keyboards/ymdk/ymd96/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": false, - "command": false, "extrakey": true, "key_lock": true, "mousekey": false, diff --git a/keyboards/yncognito/batpad/keyboard.json b/keyboards/yncognito/batpad/keyboard.json index 4d42442b6f..3e62042a4e 100644 --- a/keyboards/yncognito/batpad/keyboard.json +++ b/keyboards/yncognito/batpad/keyboard.json @@ -64,7 +64,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/yoichiro/lunakey_macro/keyboard.json b/keyboards/yoichiro/lunakey_macro/keyboard.json index e5c693e9cd..c41f7e9d3c 100644 --- a/keyboards/yoichiro/lunakey_macro/keyboard.json +++ b/keyboards/yoichiro/lunakey_macro/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": false, "mousekey": false, "nkro": false diff --git a/keyboards/yoichiro/lunakey_pico/keyboard.json b/keyboards/yoichiro/lunakey_pico/keyboard.json index 5f04d1b3f9..e8326706dc 100644 --- a/keyboards/yoichiro/lunakey_pico/keyboard.json +++ b/keyboards/yoichiro/lunakey_pico/keyboard.json @@ -8,7 +8,6 @@ "bootmagic": false, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/yynmt/dozen0/keyboard.json b/keyboards/yynmt/dozen0/keyboard.json index 6cdbe0a28d..f627152d0e 100644 --- a/keyboards/yynmt/dozen0/keyboard.json +++ b/keyboards/yynmt/dozen0/keyboard.json @@ -30,7 +30,6 @@ }, "features": { "bootmagic": false, - "command": false, "extrakey": true, "mousekey": true, "nkro": false, diff --git a/keyboards/zeix/eden/keyboard.json b/keyboards/zeix/eden/keyboard.json index 182d8ceb62..ba0faeac27 100644 --- a/keyboards/zeix/eden/keyboard.json +++ b/keyboards/zeix/eden/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "indicators": { diff --git a/keyboards/zeix/qwertyqop60hs/keyboard.json b/keyboards/zeix/qwertyqop60hs/keyboard.json index d477dcc44e..f28fe49ca1 100644 --- a/keyboards/zeix/qwertyqop60hs/keyboard.json +++ b/keyboards/zeix/qwertyqop60hs/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "diode_direction": "COL2ROW", diff --git a/keyboards/zfrontier/big_switch/keyboard.json b/keyboards/zfrontier/big_switch/keyboard.json index 2b2ceec094..48b6336887 100644 --- a/keyboards/zfrontier/big_switch/keyboard.json +++ b/keyboards/zfrontier/big_switch/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": false, - "command": false, "console": true, "extrakey": false, "mousekey": false, diff --git a/keyboards/zicodia/tklfrlnrlmlao/keyboard.json b/keyboards/zicodia/tklfrlnrlmlao/keyboard.json index e29f3ca8cb..6c592295e0 100644 --- a/keyboards/zicodia/tklfrlnrlmlao/keyboard.json +++ b/keyboards/zicodia/tklfrlnrlmlao/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ziggurat/keyboard.json b/keyboards/ziggurat/keyboard.json index 21ba5772c4..873760bade 100644 --- a/keyboards/ziggurat/keyboard.json +++ b/keyboards/ziggurat/keyboard.json @@ -9,7 +9,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/zigotica/z12/keyboard.json b/keyboards/zigotica/z12/keyboard.json index d7b2090c57..8d797907de 100644 --- a/keyboards/zigotica/z12/keyboard.json +++ b/keyboards/zigotica/z12/keyboard.json @@ -21,7 +21,6 @@ }, "features": { "bootmagic": false, - "command": false, "encoder": true, "extrakey": true, "mousekey": false, diff --git a/keyboards/ziptyze/lets_split_v3/keyboard.json b/keyboards/ziptyze/lets_split_v3/keyboard.json index 7d110bd7ff..b3a22c8b2f 100644 --- a/keyboards/ziptyze/lets_split_v3/keyboard.json +++ b/keyboards/ziptyze/lets_split_v3/keyboard.json @@ -7,7 +7,6 @@ "processor": "RP2040", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "rgb_matrix": true diff --git a/keyboards/zj68/keyboard.json b/keyboards/zj68/keyboard.json index f59c5b7fbb..cc53f87cf6 100644 --- a/keyboards/zj68/keyboard.json +++ b/keyboards/zj68/keyboard.json @@ -10,7 +10,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": false, "nkro": true diff --git a/keyboards/zoo/wampus/keyboard.json b/keyboards/zoo/wampus/keyboard.json index 9260795690..966adbf592 100644 --- a/keyboards/zoo/wampus/keyboard.json +++ b/keyboards/zoo/wampus/keyboard.json @@ -11,7 +11,6 @@ "features": { "backlight": true, "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true, diff --git a/keyboards/zos/65s/keyboard.json b/keyboards/zos/65s/keyboard.json index 3a47833235..dbaa2ac418 100644 --- a/keyboards/zos/65s/keyboard.json +++ b/keyboards/zos/65s/keyboard.json @@ -6,7 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/ztboards/after/keyboard.json b/keyboards/ztboards/after/keyboard.json index 3cccec283a..fe80cd848e 100644 --- a/keyboards/ztboards/after/keyboard.json +++ b/keyboards/ztboards/after/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "encoder": true, "extrakey": true, "mousekey": true, diff --git a/keyboards/ztboards/noon/keyboard.json b/keyboards/ztboards/noon/keyboard.json index 5caf694aaa..e0f8253394 100644 --- a/keyboards/ztboards/noon/keyboard.json +++ b/keyboards/ztboards/noon/keyboard.json @@ -10,7 +10,6 @@ }, "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/zwag/zwag75/keyboard.json b/keyboards/zwag/zwag75/keyboard.json index 08ea4b6e56..646431dcfe 100644 --- a/keyboards/zwag/zwag75/keyboard.json +++ b/keyboards/zwag/zwag75/keyboard.json @@ -18,7 +18,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": false, "rgblight": true }, diff --git a/keyboards/zwerg/keyboard.json b/keyboards/zwerg/keyboard.json index 6ec594a472..8239269b79 100644 --- a/keyboards/zwerg/keyboard.json +++ b/keyboards/zwerg/keyboard.json @@ -9,7 +9,6 @@ "diode_direction": "ROW2COL", "features": { "bootmagic": true, - "command": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/zykrah/fuyu/keyboard.json b/keyboards/zykrah/fuyu/keyboard.json index 9fe6e6ed34..db4236b698 100644 --- a/keyboards/zykrah/fuyu/keyboard.json +++ b/keyboards/zykrah/fuyu/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": false, "mousekey": true, "extrakey": true, - "command": false, "nkro": true, "rgb_matrix": true }, diff --git a/keyboards/zykrah/slime88/keyboard.json b/keyboards/zykrah/slime88/keyboard.json index d0538facf5..e3c946b776 100644 --- a/keyboards/zykrah/slime88/keyboard.json +++ b/keyboards/zykrah/slime88/keyboard.json @@ -13,7 +13,6 @@ "bootmagic": true, "mousekey": true, "extrakey": true, - "command": false, "nkro": true }, "diode_direction": "COL2ROW", From 8244659b44ac5ecdeef42d62839a24aa60516ff3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 24 Apr 2025 05:39:56 +0100 Subject: [PATCH 323/592] Extend lint checks to reject duplication of defaults (#25149) --- data/mappings/info_defaults.hjson | 73 +++++++++++++++++++++++++++++++ lib/python/qmk/cli/lint.py | 31 +++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 data/mappings/info_defaults.hjson diff --git a/data/mappings/info_defaults.hjson b/data/mappings/info_defaults.hjson new file mode 100644 index 0000000000..00f50437a2 --- /dev/null +++ b/data/mappings/info_defaults.hjson @@ -0,0 +1,73 @@ +{ + "bootmagic": { + "matrix": [0, 0] + }, + "backlight": { + "default": { + "on": true + }, + "breathing_period": 6, + "levels": 3, + "on_state": 1 + }, + "features": { + "command": false, + "console": false + }, + "indicators": { + "on_state": 1 + }, + "led_matrix": { + "default": { + "animation": "solid", + "on": true, + "val": 255, + "speed": 128 + }, + "led_flush_limit": 16, + "max_brightness": 255, + "sleep": false, + "speed_steps": 16, + "val_steps": 16 + }, + "rgblight": { + "default": { + "animation": "static_light", + "on": true, + "hue": 0, + "sat": 255, + "val": 255, + "speed": 0 + }, + "brightness_steps": 17, + "hue_steps": 8, + "max_brightness": 255, + "saturation_steps": 17, + "sleep": false + }, + "rgb_matrix": { + "default": { + "animation": "cycle_left_right", + "on": true, + "hue": 0, + "sat": 255, + "val": 255, + "speed": 128 + }, + "hue_steps": 8, + "led_flush_limit": 16, + "max_brightness": 255, + "sat_steps": 16, + "sleep": false, + "speed_steps": 16, + "val_steps": 16 + }, + "split": { + "serial": { + "driver": "bitbang" + } + }, + "ws2812": { + "driver": "bitbang" + } +} diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index e2c76e4465..484ddb5bd9 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py @@ -1,5 +1,6 @@ """Command to look over a keyboard/keymap and check for common mistakes. """ +from dotty_dict import dotty from pathlib import Path from milc import cli @@ -11,6 +12,7 @@ from qmk.keymap import locate_keymap, list_keymaps from qmk.path import keyboard from qmk.git import git_get_ignored_files from qmk.c_parse import c_source_files, preprocess_c_file +from qmk.json_schema import json_load CHIBIOS_CONF_CHECKS = ['chconf.h', 'halconf.h', 'mcuconf.h', 'board.h'] INVALID_KB_FEATURES = set(['encoder_map', 'dip_switch_map', 'combo', 'tap_dance', 'via']) @@ -214,6 +216,32 @@ def _rules_mk_assignment_only(rules_mk): return errors +def _handle_duplicating_code_defaults(kb, info): + def _collect_dotted_output(kb_info_json, prefix=''): + """Print the info.json in a plain text format with dot-joined keys. + """ + for key in sorted(kb_info_json): + new_prefix = f'{prefix}.{key}' if prefix else key + + if isinstance(kb_info_json[key], dict): + yield from _collect_dotted_output(kb_info_json[key], new_prefix) + elif isinstance(kb_info_json[key], list): + # TODO: handle non primitives? + yield (new_prefix, kb_info_json[key]) + else: + yield (new_prefix, kb_info_json[key]) + + defaults_map = json_load(Path('data/mappings/info_defaults.hjson')) + dotty_info = dotty(info) + + for key, v_default in _collect_dotted_output(defaults_map): + v_info = dotty_info.get(key) + if v_default == v_info: + cli.log.warning(f'{kb}: Option "{key}" duplicates default value of "{v_default}"') + + return True + + def keymap_check(kb, km): """Perform the keymap level checks. """ @@ -266,6 +294,9 @@ def keyboard_check(kb): # noqa C901 if not _handle_invalid_config(kb, kb_info): ok = False + if not _handle_duplicating_code_defaults(kb, kb_info): + ok = False + invalid_files = git_get_ignored_files(f'keyboards/{kb}/') for file in invalid_files: if 'keymap' in file: From 4ae24004b7ef911fbdf134485bd00c10909414c1 Mon Sep 17 00:00:00 2001 From: Joel Beckmeyer Date: Thu, 24 Apr 2025 16:04:30 -0400 Subject: [PATCH 324/592] modelh: add prerequisites for via support (#24932) --- keyboards/ibm/model_m/modelh/keyboard.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/ibm/model_m/modelh/keyboard.json b/keyboards/ibm/model_m/modelh/keyboard.json index 7d39b5de45..7fee15cd2c 100644 --- a/keyboards/ibm/model_m/modelh/keyboard.json +++ b/keyboards/ibm/model_m/modelh/keyboard.json @@ -4,6 +4,9 @@ "maintainer": "jhawthorn", "bootloader": "stm32duino", "diode_direction": "COL2ROW", + "dynamic_keymap": { + "layer_count": 3 + }, "features": { "bootmagic": false, "extrakey": true, @@ -33,7 +36,7 @@ "device_version": "1.0.0", "max_power": 100, "pid": "0xB155", - "vid": "0xFEED" + "vid": "0xBDE0" }, "layouts": { "LAYOUT_fullsize_ansi_wkl": { From 12d70ab1a449781613b04e3b3c117f058281994b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20A=2E=20Volpato?= Date: Sat, 26 Apr 2025 02:28:49 +0200 Subject: [PATCH 325/592] First TypeK support (#22876) --- keyboards/typek/config.h | 33 ++++ keyboards/typek/halconf.h | 21 +++ keyboards/typek/keyboard.json | 197 +++++++++++++++++++++++ keyboards/typek/keymaps/default/keymap.c | 34 ++++ keyboards/typek/mcuconf.h | 21 +++ keyboards/typek/readme.md | 30 ++++ keyboards/typek/typek.c | 44 +++++ 7 files changed, 380 insertions(+) create mode 100644 keyboards/typek/config.h create mode 100644 keyboards/typek/halconf.h create mode 100644 keyboards/typek/keyboard.json create mode 100644 keyboards/typek/keymaps/default/keymap.c create mode 100644 keyboards/typek/mcuconf.h create mode 100644 keyboards/typek/readme.md create mode 100644 keyboards/typek/typek.c diff --git a/keyboards/typek/config.h b/keyboards/typek/config.h new file mode 100644 index 0000000000..873d74500d --- /dev/null +++ b/keyboards/typek/config.h @@ -0,0 +1,33 @@ +/* +Copyright 2022 Gondolindrim + +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_PWM_COMPLEMENTARY_OUTPUT +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 1 +#define WS2812_DMA_STREAM STM32_DMA2_STREAM5 +#define WS2812_DMA_CHANNEL 6 + +/* LED MAP + 0 , 1 , 2 Three indicators + 3 , 4 , 5 Three RGBs on left side + 66, 67, 68 Three RGBs on right side + 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6 Left RGB wing (30 LEDs) + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65 Right RGB wing (30 LEDs) + */ diff --git a/keyboards/typek/halconf.h b/keyboards/typek/halconf.h new file mode 100644 index 0000000000..612ce4fc4a --- /dev/null +++ b/keyboards/typek/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2020 QMK + * + * 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_PWM TRUE + +#include_next diff --git a/keyboards/typek/keyboard.json b/keyboards/typek/keyboard.json new file mode 100644 index 0000000000..f579f24502 --- /dev/null +++ b/keyboards/typek/keyboard.json @@ -0,0 +1,197 @@ +{ + "manufacturer": "gok", + "keyboard_name": "TypeK-S Rev. Zeta-RC2", + "maintainer": "Gondolindrim", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A3", "B12", "A0", "A10", "B0", "B1", "B10", "B3", "C15", "C14", "C13", "B9", "B8", "B5"], + "rows": ["A7", "A8", "A15", "A1", "A2"] + }, + "processor": "STM32F411", + "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 + }, + "default": { + "animation": "rainbow_swirl", + "val": 200 + }, + "led_count": 69, + "led_map": [0, 1, 2, 3, 4, 5, 66, 67, 68, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65] + }, + "url": "https://www.gok.design/type-k", + "usb": { + "device_version": "6.2.0", + "pid": "0x8475", + "vid": "0x7179" + }, + "ws2812": { + "driver": "pwm", + "pin": "B15" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0.75, "y": 0}, + {"label": "`~", "matrix": [0, 1], "x": 2.5, "y": 0}, + {"label": "1!", "matrix": [0, 2], "x": 3.5, "y": 0}, + {"label": "2@", "matrix": [0, 3], "x": 5, "y": 0}, + {"label": "3#", "matrix": [0, 4], "x": 6, "y": 0}, + {"label": "4$", "matrix": [0, 5], "x": 7, "y": 0}, + {"label": "5%", "matrix": [0, 6], "x": 8, "y": 0}, + {"label": "7&", "matrix": [0, 7], "x": 12.75, "y": 0}, + {"label": "8*", "matrix": [0, 8], "x": 13.75, "y": 0}, + {"label": "9(", "matrix": [0, 9], "x": 14.75, "y": 0}, + {"label": "0)", "matrix": [0, 10], "x": 15.75, "y": 0}, + {"label": "-_", "matrix": [0, 11], "x": 17, "y": 0}, + {"label": "=+", "matrix": [0, 12], "x": 18, "y": 0}, + {"label": "\\|", "matrix": [0, 13], "x": 19, "y": 0}, + {"label": "Page Up", "matrix": [1, 0], "x": 0.5, "y": 1}, + {"label": "Tab", "matrix": [1, 1], "x": 2.25, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 2], "x": 3.75, "y": 1}, + {"label": "W", "matrix": [1, 3], "x": 5.5, "y": 1}, + {"label": "E", "matrix": [1, 4], "x": 6.5, "y": 1}, + {"label": "R", "matrix": [1, 5], "x": 7.5, "y": 1}, + {"label": "T", "matrix": [1, 6], "x": 8.5, "y": 1}, + {"label": "Y", "matrix": [1, 7], "x": 12, "y": 1}, + {"label": "U", "matrix": [1, 8], "x": 13, "y": 1}, + {"label": "I", "matrix": [1, 9], "x": 14, "y": 1}, + {"label": "O", "matrix": [1, 10], "x": 15, "y": 1}, + {"label": "P", "matrix": [1, 11], "x": 16.75, "y": 1}, + {"label": "[{", "matrix": [1, 12], "x": 17.75, "y": 1}, + {"label": "]}", "matrix": [1, 13], "x": 18.75, "y": 1}, + {"label": "Page Down", "matrix": [2, 0], "x": 0.25, "y": 2}, + {"label": "Caps Lock", "matrix": [2, 1], "x": 2.25, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 2], "x": 4, "y": 2}, + {"label": "S", "matrix": [2, 3], "x": 5.75, "y": 2}, + {"label": "D", "matrix": [2, 4], "x": 6.75, "y": 2}, + {"label": "F", "matrix": [2, 5], "x": 7.75, "y": 2}, + {"label": "G", "matrix": [2, 6], "x": 8.75, "y": 2}, + {"label": "H", "matrix": [2, 7], "x": 12.25, "y": 2}, + {"label": "J", "matrix": [2, 8], "x": 13.25, "y": 2}, + {"label": "K", "matrix": [2, 9], "x": 14.25, "y": 2}, + {"label": "L", "matrix": [2, 10], "x": 15.25, "y": 2}, + {"label": ";:", "matrix": [2, 11], "x": 17.25, "y": 2}, + {"label": "\"", "matrix": [2, 12], "x": 18.25, "y": 2}, + {"label": "Del", "matrix": [2, 13], "x": 20, "y": 0}, + {"label": "End", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Shift", "matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 3.75, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 6, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 7, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 8, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 9, "y": 3}, + {"label": "B", "matrix": [3, 7], "x": 11.75, "y": 3}, + {"label": "N", "matrix": [3, 8], "x": 12.75, "y": 3}, + {"label": "M", "matrix": [3, 9], "x": 13.75, "y": 3}, + {"label": ",<", "matrix": [3, 10], "x": 14.75, "y": 3}, + {"label": ".>", "matrix": [3, 11], "x": 17, "y": 3}, + {"label": "/?", "matrix": [3, 12], "x": 18, "y": 3}, + {"label": "Shift", "matrix": [3, 13], "x": 19, "y": 3, "w": 1.25}, + {"label": "Control", "matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 2], "x": 6, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 4], "x": 7.5, "y": 4, "w": 2}, + {"label": "Left GUI", "matrix": [4, 5], "x": 9.5, "y": 4}, + {"label": "^6", "matrix": [4, 6], "x": 9, "y": 0}, + {"label": "Space", "matrix": [4, 7], "x": 11.25, "y": 4}, + {"label": "Space", "matrix": [4, 8], "x": 12.25, "y": 4, "w": 2}, + {"label": "Alt", "matrix": [4, 9], "x": 14.25, "y": 4, "w": 1.5}, + {"label": "Backspace", "matrix": [4, 10], "x": 19.75, "y": 1, "w": 1.5}, + {"label": "Enter", "matrix": [4, 11], "x": 19.25, "y": 2, "w": 2.25}, + {"label": "MO(1)", "matrix": [4, 12], "x": 20.25, "y": 3}, + {"label": "Control", "matrix": [4, 13], "x": 19.25, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_nosplits": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0.75, "y": 0}, + {"label": "`~", "matrix": [0, 1], "x": 2.5, "y": 0}, + {"label": "1!", "matrix": [0, 2], "x": 3.5, "y": 0}, + {"label": "2@", "matrix": [0, 3], "x": 5, "y": 0}, + {"label": "3#", "matrix": [0, 4], "x": 6, "y": 0}, + {"label": "4$", "matrix": [0, 5], "x": 7, "y": 0}, + {"label": "5%", "matrix": [0, 6], "x": 8, "y": 0}, + {"label": "7&", "matrix": [0, 7], "x": 12.75, "y": 0}, + {"label": "8*", "matrix": [0, 8], "x": 13.75, "y": 0}, + {"label": "9(", "matrix": [0, 9], "x": 14.75, "y": 0}, + {"label": "0)", "matrix": [0, 10], "x": 15.75, "y": 0}, + {"label": "-_", "matrix": [0, 11], "x": 17, "y": 0}, + {"label": "=+", "matrix": [0, 12], "x": 18, "y": 0}, + {"label": "Backspace", "matrix": [0, 13], "x": 19, "y": 0, "w": 2}, + {"label": "Page Up", "matrix": [1, 0], "x": 0.5, "y": 1}, + {"label": "Tab", "matrix": [1, 1], "x": 2.25, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 2], "x": 3.75, "y": 1}, + {"label": "W", "matrix": [1, 3], "x": 5.5, "y": 1}, + {"label": "E", "matrix": [1, 4], "x": 6.5, "y": 1}, + {"label": "R", "matrix": [1, 5], "x": 7.5, "y": 1}, + {"label": "T", "matrix": [1, 6], "x": 8.5, "y": 1}, + {"label": "Y", "matrix": [1, 7], "x": 12, "y": 1}, + {"label": "U", "matrix": [1, 8], "x": 13, "y": 1}, + {"label": "I", "matrix": [1, 9], "x": 14, "y": 1}, + {"label": "O", "matrix": [1, 10], "x": 15, "y": 1}, + {"label": "P", "matrix": [1, 11], "x": 16.75, "y": 1}, + {"label": "[{", "matrix": [1, 12], "x": 17.75, "y": 1}, + {"label": "]}", "matrix": [1, 13], "x": 18.75, "y": 1}, + {"label": "Page Down", "matrix": [2, 0], "x": 0.25, "y": 2}, + {"label": "Caps Lock", "matrix": [2, 1], "x": 2.25, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 2], "x": 4, "y": 2}, + {"label": "S", "matrix": [2, 3], "x": 5.75, "y": 2}, + {"label": "D", "matrix": [2, 4], "x": 6.75, "y": 2}, + {"label": "F", "matrix": [2, 5], "x": 7.75, "y": 2}, + {"label": "G", "matrix": [2, 6], "x": 8.75, "y": 2}, + {"label": "H", "matrix": [2, 7], "x": 12.25, "y": 2}, + {"label": "J", "matrix": [2, 8], "x": 13.25, "y": 2}, + {"label": "K", "matrix": [2, 9], "x": 14.25, "y": 2}, + {"label": "L", "matrix": [2, 10], "x": 15.25, "y": 2}, + {"label": ";:", "matrix": [2, 11], "x": 17.25, "y": 2}, + {"label": "\"", "matrix": [2, 12], "x": 18.25, "y": 2}, + {"label": "End", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Shift", "matrix": [3, 1], "x": 1.5, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 3.75, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 6, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 7, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 8, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 9, "y": 3}, + {"label": "B", "matrix": [3, 7], "x": 11.75, "y": 3}, + {"label": "N", "matrix": [3, 8], "x": 12.75, "y": 3}, + {"label": "M", "matrix": [3, 9], "x": 13.75, "y": 3}, + {"label": ",<", "matrix": [3, 10], "x": 14.75, "y": 3}, + {"label": ".>", "matrix": [3, 11], "x": 17, "y": 3}, + {"label": "/?", "matrix": [3, 12], "x": 18, "y": 3}, + {"label": "Shift", "matrix": [3, 13], "x": 19, "y": 3, "w": 2.25}, + {"label": "Control", "matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 2], "x": 6, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 4], "x": 7.5, "y": 4, "w": 3}, + {"label": "^6", "matrix": [4, 6], "x": 9, "y": 0}, + {"label": "Space", "matrix": [4, 8], "x": 11.25, "y": 4, "w": 3}, + {"label": "Alt", "matrix": [4, 9], "x": 14.25, "y": 4, "w": 1.5}, + {"label": "Backspace", "matrix": [4, 10], "x": 19.75, "y": 1, "w": 1.5}, + {"label": "Enter", "matrix": [4, 11], "x": 19.25, "y": 2, "w": 2.25}, + {"label": "Control", "matrix": [4, 13], "x": 19.25, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/typek/keymaps/default/keymap.c b/keyboards/typek/keymaps/default/keymap.c new file mode 100644 index 0000000000..34d9522f93 --- /dev/null +++ b/keyboards/typek/keymaps/default/keymap.c @@ -0,0 +1,34 @@ +/* Copyright 2023 Gondolindrim + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = LAYOUT_all( /* Base */ + KC_ESC , KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_7 , KC_8 , KC_9 , KC_0 , KC_MINS, KC_EQL, KC_BSLS, + KC_PGUP, 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_PGDN, 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_DEL , + MO(1) , KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, + KC_LCTL, KC_LALT, KC_SPC , KC_LGUI, KC_6 , KC_SPC , KC_SPC , KC_RALT, KC_BSPC, KC_ENT , MO(1) , KC_RCTL +), +[1] = LAYOUT_all( + QK_BOOT, 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_TRNS, + KC_HOME, KC_TRNS, KC_TRNS, KC_UP , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_END , KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +) +}; diff --git a/keyboards/typek/mcuconf.h b/keyboards/typek/mcuconf.h new file mode 100644 index 0000000000..bc27263930 --- /dev/null +++ b/keyboards/typek/mcuconf.h @@ -0,0 +1,21 @@ +/* Copyright 2020 QMK + * + * 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_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/typek/readme.md b/keyboards/typek/readme.md new file mode 100644 index 0000000000..e7521e2e71 --- /dev/null +++ b/keyboards/typek/readme.md @@ -0,0 +1,30 @@ +# gok TypeK QMK Firmware Folder + +![TK](https://i.imgur.com/0ZEbEZt.jpg) + +## Introduction + +This is the QMK Firmware repository for the Type K, the tented ergo by Gok. The TypeK went through GB on August, 2023. It is supported by a proprietary PCB ecosystem. + +## How to flash + +### Enter bootloader + +The DFU state in the bootloader can be accessed in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key, escape in the default keymap) and plug in the keyboard; +* **Physical reset button**: press the button on the front of the PCB, next to caps lock, for at least five seconds; +* **Keycode in layout**: Press the key mapped to `RESET`; in the default layout, that is top left key ('escape') in layer 1. + +### How to compile and flash + + +After setting up your build environment, you can compile the Iron 165R2 default keymap by using one of the options below. + + make typek:default + +And use dfu-util in the command line or through a GUI like QMK toolbox to upload the firmware to the PCB. To directly flash the PCB after it is put into a DFU state, use: + + make typek: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). diff --git a/keyboards/typek/typek.c b/keyboards/typek/typek.c new file mode 100644 index 0000000000..78c0c556ed --- /dev/null +++ b/keyboards/typek/typek.c @@ -0,0 +1,44 @@ +/* Copyright 2023 Gondolindrim + * + * 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" + +// This function gets called when caps, num, scroll change +bool led_update_kb(led_t led_state) { + bool res = led_update_user(led_state); + if (res) { + led_state.caps_lock? rgblight_setrgb_at(RGB_RED, 0) : rgblight_setrgb_at(RGB_OFF, 0); + } + return res; +} + +// This function is called when layers change +layer_state_t layer_state_set_kb(layer_state_t state) { + state = layer_state_set_user(state); + switch(get_highest_layer(state)) { + case 1: + rgblight_setrgb_at(RGB_GREEN, 1); + break; + case 2: + rgblight_setrgb_at(RGB_BLUE, 2); + break; + default: + rgblight_setrgb_at(RGB_OFF, 1); + rgblight_setrgb_at(RGB_OFF, 2); + break; + } + return state; +} From 3319474c5c24af1e9c9a4e23e4ea2330c963ac17 Mon Sep 17 00:00:00 2001 From: Aidan Gauland Date: Sat, 26 Apr 2025 12:31:25 +1200 Subject: [PATCH 326/592] Add Lemokey X0 keyboard (#24994) --- keyboards/keychron/x0/board.h | 8 ++ keyboards/keychron/x0/config.h | 23 ++++++ keyboards/keychron/x0/halconf.h | 21 ++++++ keyboards/keychron/x0/info.json | 73 +++++++++++++++++++ keyboards/keychron/x0/mcuconf.h | 25 +++++++ keyboards/keychron/x0/readme.md | 23 ++++++ keyboards/keychron/x0/red/config.h | 25 +++++++ keyboards/keychron/x0/red/keyboard.json | 60 +++++++++++++++ .../keychron/x0/red/keymaps/default/keymap.c | 41 +++++++++++ keyboards/keychron/x0/red/red.c | 61 ++++++++++++++++ 10 files changed, 360 insertions(+) create mode 100644 keyboards/keychron/x0/board.h create mode 100644 keyboards/keychron/x0/config.h create mode 100644 keyboards/keychron/x0/halconf.h create mode 100644 keyboards/keychron/x0/info.json create mode 100644 keyboards/keychron/x0/mcuconf.h create mode 100644 keyboards/keychron/x0/readme.md create mode 100644 keyboards/keychron/x0/red/config.h create mode 100644 keyboards/keychron/x0/red/keyboard.json create mode 100644 keyboards/keychron/x0/red/keymaps/default/keymap.c create mode 100644 keyboards/keychron/x0/red/red.c diff --git a/keyboards/keychron/x0/board.h b/keyboards/keychron/x0/board.h new file mode 100644 index 0000000000..55dd9bf2d2 --- /dev/null +++ b/keyboards/keychron/x0/board.h @@ -0,0 +1,8 @@ +// Copyright 2023 @ Keychron(https://www.keychron.com) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 16000000U diff --git a/keyboards/keychron/x0/config.h b/keyboards/keychron/x0/config.h new file mode 100644 index 0000000000..1a2a4e42a3 --- /dev/null +++ b/keyboards/keychron/x0/config.h @@ -0,0 +1,23 @@ +/* Copyright 2023 @ Keychron(https://www.keychron.com) + * + * 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 + +/* I2C Driver Configuration */ +#define I2C1_SCL_PIN B8 +#define I2C1_SDA_PIN B9 +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2 diff --git a/keyboards/keychron/x0/halconf.h b/keyboards/keychron/x0/halconf.h new file mode 100644 index 0000000000..41bddcb279 --- /dev/null +++ b/keyboards/keychron/x0/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2020 QMK + * + * 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 + +#include_next diff --git a/keyboards/keychron/x0/info.json b/keyboards/keychron/x0/info.json new file mode 100644 index 0000000000..7e2e512ef4 --- /dev/null +++ b/keyboards/keychron/x0/info.json @@ -0,0 +1,73 @@ +{ + "manufacturer": "Keychron", + "keyboard_name": "Lemokey X0", + "maintainer": "lalalademaxiya1", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 4096 + } + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "A3" + }, + "matrix_pins": { + "cols": ["C6", "C7", "C8", "A14", "A15", "C10", "C11"], + "rows": ["C12", "D2", "B3", "B4", "B5", "B6"] + }, + "processor": "STM32F401", + "url": "https://www.lemokey.com/products/lemokey-x0-qmk-wired-mechanical-gaming-keypad", + "usb": { + "device_version": "1.1.0", + "pid": "0x0200", + "vid": "0x362D" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25, "w": 1.5}, + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25, "w": 1.25}, + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25, "w": 1.75}, + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.5}, + {"matrix": [5, 2], "x": 2.75, "y": 5.25}, + {"matrix": [5, 3], "x": 3.75, "y": 5.25}, + {"matrix": [5, 4], "x": 4.75, "y": 5.25}, + {"matrix": [5, 5], "x": 6, "y": 5.25} + ] + } + } +} diff --git a/keyboards/keychron/x0/mcuconf.h b/keyboards/keychron/x0/mcuconf.h new file mode 100644 index 0000000000..bb608cec27 --- /dev/null +++ b/keyboards/keychron/x0/mcuconf.h @@ -0,0 +1,25 @@ +/* Copyright 2020 QMK + * + * 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_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/keychron/x0/readme.md b/keyboards/keychron/x0/readme.md new file mode 100644 index 0000000000..d08c3abe7e --- /dev/null +++ b/keyboards/keychron/x0/readme.md @@ -0,0 +1,23 @@ +# Lemokey X0 + +![Lemokey X0](https://i.imgur.com/ntROq41.jpeg) + +A one-handed gaming keypad. + +* Keyboard Maintainer: [Keychron](https://github.com/keychron) +* Hardware Supported: Lemokey X0 +* Hardware Availability: [Keychron](https://www.lemokey.com/products/lemokey-x0-qmk-wired-mechanical-gaming-keypad) + +Make example for this keyboard (after setting up your build environment): + + make keychron/x0/red:default + +Flashing example for this keyboard: + + make keychron/x0/red: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 + +To enter the bootloader, hold down the key located at **K00**, labelled and commonly programmed as **Esc**, while plugging in the keyboard. diff --git a/keyboards/keychron/x0/red/config.h b/keyboards/keychron/x0/red/config.h new file mode 100644 index 0000000000..067266830f --- /dev/null +++ b/keyboards/keychron/x0/red/config.h @@ -0,0 +1,25 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * 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 + +#ifdef LED_MATRIX_ENABLE +# define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND + +# define SNLED27351_PHASE_CHANNEL SNLED27351_SCAN_PHASE_6_CHANNEL +# define SNLED27351_CURRENT_TUNE \ + { 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60 } +#endif diff --git a/keyboards/keychron/x0/red/keyboard.json b/keyboards/keychron/x0/red/keyboard.json new file mode 100644 index 0000000000..f591a607eb --- /dev/null +++ b/keyboards/keychron/x0/red/keyboard.json @@ -0,0 +1,60 @@ +{ + "features": { + "led_matrix": true + }, + "led_matrix": { + "animations": { + "band_pinwheel": true, + "band_spiral": true, + "breathing": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_up_down": true, + "dual_beacon": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_simple": true, + "solid_splash": true, + "wave_left_right": true, + "wave_up_down": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 37, "y": 0, "flags": 1}, + {"matrix": [0, 2], "x": 75, "y": 0, "flags": 1}, + {"matrix": [0, 3], "x": 112, "y": 0, "flags": 1}, + {"matrix": [0, 4], "x": 149, "y": 0, "flags": 1}, + {"matrix": [0, 5], "x": 187, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 13, "flags": 1}, + {"matrix": [1, 1], "x": 37, "y": 13, "flags": 4}, + {"matrix": [1, 2], "x": 75, "y": 13, "flags": 4}, + {"matrix": [1, 3], "x": 112, "y": 13, "flags": 4}, + {"matrix": [1, 4], "x": 149, "y": 13, "flags": 4}, + {"matrix": [1, 5], "x": 187, "y": 13, "flags": 4}, + {"matrix": [1, 6], "x": 224, "y": 13, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 26, "flags": 1}, + {"matrix": [2, 1], "x": 37, "y": 26, "flags": 4}, + {"matrix": [2, 2], "x": 75, "y": 26, "flags": 4}, + {"matrix": [2, 3], "x": 112, "y": 26, "flags": 4}, + {"matrix": [2, 4], "x": 149, "y": 26, "flags": 4}, + {"matrix": [2, 5], "x": 187, "y": 26, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 38, "flags": 1}, + {"matrix": [3, 1], "x": 37, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 75, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 112, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 149, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 187, "y": 38, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 51, "flags": 1}, + {"matrix": [4, 2], "x": 75, "y": 51, "flags": 4}, + {"matrix": [4, 3], "x": 112, "y": 51, "flags": 4}, + {"matrix": [4, 4], "x": 149, "y": 51, "flags": 4}, + {"matrix": [4, 5], "x": 187, "y": 51, "flags": 4}, + {"matrix": [5, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 75, "y": 64, "flags": 1}, + {"matrix": [5, 3], "x": 112, "y": 64, "flags": 1}, + {"matrix": [5, 4], "x": 149, "y": 64, "flags": 1} + ], + "sleep": true + } +} diff --git a/keyboards/keychron/x0/red/keymaps/default/keymap.c b/keyboards/keychron/x0/red/keymaps/default/keymap.c new file mode 100644 index 0000000000..4d04c09d9b --- /dev/null +++ b/keyboards/keychron/x0/red/keymaps/default/keymap.c @@ -0,0 +1,41 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * 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 + +enum layers { + WIN_BASE, + WIN_FN, +}; + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [WIN_BASE] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, + KC_LCTL, KC_LALT, MO(WIN_FN), MO(WIN_FN), KC_SPC), + + [WIN_FN] = LAYOUT( + _______, KC_BRID, KC_BRIU, LGUI(KC_TAB), LGUI(KC_E), _______, + _______, _______, _______, _______, _______, _______, _______, + LM_TOGG, LM_PREV, LM_BRIU, LM_NEXT, _______, _______, + _______, LM_SPDD, LM_BRID, LM_SPDU, _______, _______, + _______, _______, _______, _______, NK_TOGG, + _______, _______, _______, _______, _______), +}; diff --git a/keyboards/keychron/x0/red/red.c b/keyboards/keychron/x0/red/red.c new file mode 100644 index 0000000000..9499a09d8b --- /dev/null +++ b/keyboards/keychron/x0/red/red.c @@ -0,0 +1,61 @@ +/* Copyright 2023 @ Keychron (https://www.keychron.com) + * + * 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 LED_MATRIX_ENABLE +// clang-format off +const snled27351_led_t PROGMEM g_snled27351_leds[LED_MATRIX_LED_COUNT] = { +/* Refer to SNLED27351 manual for these locations + * driver + * | LED address + * | | */ + {0, CB6_CA1 }, + {0, CB6_CA2 }, + {0, CB6_CA3 }, + {0, CB6_CA4 }, + {0, CB6_CA5 }, + {0, CB6_CA6 }, + {0, CB5_CA1 }, + {0, CB5_CA2 }, + {0, CB5_CA3 }, + {0, CB5_CA4 }, + {0, CB5_CA5 }, + {0, CB5_CA6 }, + {0, CB5_CA7 }, + {0, CB4_CA1 }, + {0, CB4_CA2 }, + {0, CB4_CA3 }, + {0, CB4_CA4 }, + {0, CB4_CA5 }, + {0, CB4_CA6 }, + {0, CB3_CA1 }, + {0, CB3_CA2 }, + {0, CB3_CA3 }, + {0, CB3_CA4 }, + {0, CB3_CA5 }, + {0, CB3_CA6 }, + {0, CB2_CA1 }, + {0, CB2_CA3 }, + {0, CB2_CA4 }, + {0, CB2_CA5 }, + {0, CB2_CA6 }, + {0, CB1_CA1 }, + {0, CB1_CA3 }, + {0, CB1_CA4 }, + {0, CB1_CA5 }, +}; +#endif From ca425971d5fe5713a98fdbaf711db948ad4e9826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Sat, 26 Apr 2025 02:40:17 +0200 Subject: [PATCH 327/592] keyboards/annepro2/ld: Add per-variant linker scripts (#24999) C18 has an MCU with 16K SRAM, up from C15's 8K. Split the linker script into C15 and C18 variants to make use of the larger RAM capacity of C18. --- keyboards/annepro2/c15/rules.mk | 2 +- keyboards/annepro2/c18/rules.mk | 2 +- ...ANNEPRO2.ld => HT32F52342_ANNEPRO2_C15.ld} | 0 .../annepro2/ld/HT32F52352_ANNEPRO2_C18.ld | 92 +++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) rename keyboards/annepro2/ld/{HT32F52342_ANNEPRO2.ld => HT32F52342_ANNEPRO2_C15.ld} (100%) create mode 100644 keyboards/annepro2/ld/HT32F52352_ANNEPRO2_C18.ld diff --git a/keyboards/annepro2/c15/rules.mk b/keyboards/annepro2/c15/rules.mk index f35d9002ef..cd056527b7 100644 --- a/keyboards/annepro2/c15/rules.mk +++ b/keyboards/annepro2/c15/rules.mk @@ -4,7 +4,7 @@ ARMV = 6 USE_FPU = no MCU_FAMILY = HT32 MCU_SERIES = HT32F523xx -MCU_LDSCRIPT = HT32F52342_ANNEPRO2 +MCU_LDSCRIPT = HT32F52342_ANNEPRO2_C15 MCU_STARTUP = ht32f523xx BOARD = ANNEPRO2_C15 diff --git a/keyboards/annepro2/c18/rules.mk b/keyboards/annepro2/c18/rules.mk index b310454c5d..414e3f855d 100644 --- a/keyboards/annepro2/c18/rules.mk +++ b/keyboards/annepro2/c18/rules.mk @@ -4,7 +4,7 @@ ARMV = 6 USE_FPU = no MCU_FAMILY = HT32 MCU_SERIES = HT32F523xx -MCU_LDSCRIPT = HT32F52342_ANNEPRO2 +MCU_LDSCRIPT = HT32F52352_ANNEPRO2_C18 MCU_STARTUP = ht32f523xx BOARD = ANNEPRO2_C18 diff --git a/keyboards/annepro2/ld/HT32F52342_ANNEPRO2.ld b/keyboards/annepro2/ld/HT32F52342_ANNEPRO2_C15.ld similarity index 100% rename from keyboards/annepro2/ld/HT32F52342_ANNEPRO2.ld rename to keyboards/annepro2/ld/HT32F52342_ANNEPRO2_C15.ld diff --git a/keyboards/annepro2/ld/HT32F52352_ANNEPRO2_C18.ld b/keyboards/annepro2/ld/HT32F52352_ANNEPRO2_C18.ld new file mode 100644 index 0000000000..0ac02d6c89 --- /dev/null +++ b/keyboards/annepro2/ld/HT32F52352_ANNEPRO2_C18.ld @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2013-2016 Fabio UJonathan A. Kollaschtzig, http://fabioutzig.com + * (c) 2020 Yaotian Feng (Codetector) + * (c) 2025 Michał Kopeć + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * HT32F52342 w/ Anne Pro 2 bootloader memory setup. + */ +MEMORY { + flash0 : org = 0x00004000, len = 64k - 16k /* firmware */ + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 16k /* RAM */ + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld From a07360e0f1b4579a95a10ab072fa0191f895b9b9 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Mon, 28 Apr 2025 03:19:19 +0900 Subject: [PATCH 328/592] Add new keyboard MirageiX (#25054) Co-authored-by: Drashna Jaelre Co-authored-by: jack <0x6a73@protonmail.com> --- .../takashicompany/mirageix/keyboard.json | 73 +++++++++++++++++++ .../mirageix/keymaps/default/keymap.c | 70 ++++++++++++++++++ keyboards/takashicompany/mirageix/readme.md | 39 ++++++++++ 3 files changed, 182 insertions(+) create mode 100644 keyboards/takashicompany/mirageix/keyboard.json create mode 100644 keyboards/takashicompany/mirageix/keymaps/default/keymap.c create mode 100644 keyboards/takashicompany/mirageix/readme.md diff --git a/keyboards/takashicompany/mirageix/keyboard.json b/keyboards/takashicompany/mirageix/keyboard.json new file mode 100644 index 0000000000..d151eeb655 --- /dev/null +++ b/keyboards/takashicompany/mirageix/keyboard.json @@ -0,0 +1,73 @@ +{ + "manufacturer": "takashicompany", + "keyboard_name": "MirageiX", + "maintainer": "takashicompany", + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["D4", "C6", "D7", "E6", "B4", "B5"], + "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"] + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x0065", + "vid": "0x7463" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 0], "x": 1, "y": 1.25}, + {"matrix": [2, 0], "x": 2, "y": 0.25}, + {"matrix": [3, 0], "x": 3, "y": 0}, + {"matrix": [4, 0], "x": 4, "y": 0.25}, + {"matrix": [5, 0], "x": 5, "y": 0.5}, + {"matrix": [0, 3], "x": 8, "y": 0.5}, + {"matrix": [1, 3], "x": 9, "y": 0.25}, + {"matrix": [2, 3], "x": 10, "y": 0}, + {"matrix": [3, 3], "x": 11, "y": 0.25}, + {"matrix": [4, 3], "x": 12, "y": 1.25}, + {"matrix": [5, 3], "x": 13, "y": 1.25}, + {"matrix": [0, 1], "x": 0, "y": 2.25}, + {"matrix": [1, 1], "x": 1, "y": 2.25}, + {"matrix": [2, 1], "x": 2, "y": 1.25}, + {"matrix": [3, 1], "x": 3, "y": 1}, + {"matrix": [4, 1], "x": 4, "y": 1.25}, + {"matrix": [5, 1], "x": 5, "y": 1.5}, + {"matrix": [0, 4], "x": 8, "y": 1.5}, + {"matrix": [1, 4], "x": 9, "y": 1.25}, + {"matrix": [2, 4], "x": 10, "y": 1}, + {"matrix": [3, 4], "x": 11, "y": 1.25}, + {"matrix": [4, 4], "x": 12, "y": 2.25}, + {"matrix": [5, 4], "x": 13, "y": 2.25}, + {"matrix": [0, 2], "x": 0, "y": 3.25}, + {"matrix": [1, 2], "x": 1, "y": 3.25}, + {"matrix": [2, 2], "x": 2, "y": 2.25}, + {"matrix": [3, 2], "x": 3, "y": 2}, + {"matrix": [4, 2], "x": 4, "y": 2.25}, + {"matrix": [5, 2], "x": 5, "y": 2.5}, + {"matrix": [0, 5], "x": 8, "y": 2.5}, + {"matrix": [1, 5], "x": 9, "y": 2.25}, + {"matrix": [2, 5], "x": 10, "y": 2}, + {"matrix": [3, 5], "x": 11, "y": 2.25}, + {"matrix": [4, 5], "x": 12, "y": 3.25}, + {"matrix": [5, 5], "x": 13, "y": 3.25}, + {"matrix": [6, 0], "x": 2.5, "y": 4}, + {"matrix": [6, 1], "x": 3.5, "y": 4}, + {"matrix": [6, 2], "x": 4.5, "y": 4}, + {"matrix": [6, 3], "x": 5.5, "y": 4}, + {"matrix": [7, 2], "x": 7.5, "y": 4}, + {"matrix": [7, 3], "x": 8.5, "y": 4}, + {"matrix": [7, 4], "x": 9.5, "y": 4}, + {"matrix": [7, 5], "x": 10.5, "y": 4} + ] + } + } +} diff --git a/keyboards/takashicompany/mirageix/keymaps/default/keymap.c b/keyboards/takashicompany/mirageix/keymaps/default/keymap.c new file mode 100644 index 0000000000..9708951df4 --- /dev/null +++ b/keyboards/takashicompany/mirageix/keymaps/default/keymap.c @@ -0,0 +1,70 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + KC_ESC, LT(7, KC_Q), KC_W, KC_E, LT(6, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LCTL, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_ENT, + KC_LSFT, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_DEL, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RALT, KC_RGUI + ), + + [1] = LAYOUT( + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3, KC_TRNS, + KC_TRNS, LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT( + KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3), KC_TRNS, + KC_TRNS, KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [3] = LAYOUT( + KC_TRNS, LT(7, KC_Q), KC_W, KC_E, LT(6, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS, + KC_TRNS, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_TRNS, + KC_TRNS, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_TRNS, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RALT, KC_RGUI + ), + + [4] = LAYOUT( + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3, KC_TRNS, + KC_TRNS, LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT( + KC_TRNS, KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS, KC_TRNS, + KC_TRNS, KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, + KC_TRNS, KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [6] = LAYOUT( + KC_TRNS, KC_ESC, KC_TAB, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, + KC_TRNS, KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [7] = LAYOUT( + KC_TRNS, KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, DF(0), DF(3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/takashicompany/mirageix/readme.md b/keyboards/takashicompany/mirageix/readme.md new file mode 100644 index 0000000000..dcf55c55d9 --- /dev/null +++ b/keyboards/takashicompany/mirageix/readme.md @@ -0,0 +1,39 @@ +# MirageiX + +![takashicompany/mirageix](https://i.imgur.com/93krKWQ.jpeg) + +MirageiX is a 44-key integrated keyboard. +The PCB has been trimmed to the limit to create a visual appearance in which only the keycaps seem to float. +By using a transparent acrylic case, you can enjoy a mirage-like keyboard expression. +The key layout is based on the TRON keyboard layout, making typing smoother than it looks. + +Keyswitches are fixed with sockets, allowing easy replacement of keyswitches. + +MirageiXは44キーの一体型キーボードです。 +PCBを極限まで切り詰めたことでキーキャップのみが浮き出るようなビジュアルを実現しました。 +透明なアクリルケースを用いることで蜃気楼のようなキーボード表現が楽しめます。 +キー配列もTRONというキーボードの配置を参考にしているため、見た目以上にスムーズなタイピングを実現します。 + +キースイッチはソケットで固定されるため、キースイッチの交換を容易に行えます。 + +* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany) +* Hardware Supported: MirageiX PCB, Pro Micro +* Hardware Availability: https://github.com/takashicompany/mirageix + +Make example for this keyboard (after setting up your build environment): + + make takashicompany/mirageix:default + +Flashing example for this keyboard: + + make takashicompany/mirageix: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 de598ac8f08a70c7e6f9f28b4b29453284e562ac Mon Sep 17 00:00:00 2001 From: Matheus Marques Date: Sun, 27 Apr 2025 15:42:11 -0300 Subject: [PATCH 329/592] [Keymap] Sofle RGB - fixed stuck on numpad layer and layout comments (#24942) --- keyboards/sofle/keymaps/rgb_default/keymap.c | 257 ++++--------------- 1 file changed, 44 insertions(+), 213 deletions(-) diff --git a/keyboards/sofle/keymaps/rgb_default/keymap.c b/keyboards/sofle/keymaps/rgb_default/keymap.c index e992cf9adb..e805c20702 100644 --- a/keyboards/sofle/keymaps/rgb_default/keymap.c +++ b/keyboards/sofle/keymaps/rgb_default/keymap.c @@ -67,7 +67,7 @@ enum sofle_layers { _DEFAULTS = 0, _QWERTY = 0, _COLEMAK, - _COLEMAKDH, + _COLEMAKDH, _LOWER, _RAISE, _ADJUST, @@ -87,231 +87,62 @@ enum custom_keycodes { #define KC_COLEMAKDH PDF(_COLEMAKDH) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* - * QWERTY - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | E | R | T | | Y | U | I | O | P | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | V | B |-------| |-------| N | M | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - [_QWERTY] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_GRV, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - LT(_NUMPAD,KC_TAB),KC_Q,KC_W,KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_D_MUTE,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_BSPC, KC_LGUI, KC_LOWER, KC_SPC, KC_ENT , KC_SPC, KC_ENT , KC_RAISE, KC_RCTL, KC_RALT - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ +[_QWERTY] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_GRV, + LT(_NUMPAD,KC_TAB),KC_Q,KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_D_MUTE, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, + KC_BSPC, KC_LGUI, KC_LOWER, KC_SPC, KC_ENT, KC_SPC, KC_ENT, KC_RAISE,KC_RCTL, KC_RALT ), - -/* - * COLEMAK - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | F | P | G | | J | L | U | Y | ; | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | V | B |-------| |-------| K | M | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ [_COLEMAK] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRNS, KC_TRNS,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, _______, + _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, _______, + _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______, + _______, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - -/* - * COLEMAK-DH - * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | TAB | Q | W | F | P | B | | J | L | U | Y | ; | Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |LShift| A | R | S | T | G |-------. ,-------| M | N | E | I | O | ' | - * |------+------+------+------+------+------| MUTE | |DISCORD|------+------+------+------+------+------| - * | LCTR | Z | X | C | D | V |-------| |-------| K | H | , | . | / |LShift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ [_COLEMAKDH] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_TRNS, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_TRNS, KC_TRNS,KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, LT(_SWITCH,KC_6), KC_7, KC_8, KC_9, KC_0, _______, + _______, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, _______, + _______, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, _______, + _______, KC_Z, KC_X, KC_C, KC_D, KC_V, _______, _______, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - -/* LOWER - * ,-----------------------------------------. ,-----------------------------------------. - * | trans| F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | trans| ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | trans| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE |RAISE | RCTR | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ [_LOWER] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_PGUP, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_DEL, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_PGDN,_______, _______,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U, KC_PGUP, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, KC_DEL, + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_D, KC_PGDN, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* RAISE - * ,----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ [_RAISE] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_CIRC, KC_AMPR,KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_MINS, KC_EQL, KC_LCBR, KC_RCBR, KC_PIPE, KC_GRV, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX,_______, _______,KC_UNDS, KC_PLUS,KC_LBRC, KC_RBRC, KC_BSLS, KC_TILD, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_MINS, KC_EQL, KC_LCBR, KC_RCBR, KC_PIPE, KC_GRV, + _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, KC_UNDS, KC_PLUS, KC_LBRC, KC_RBRC, KC_BSLS, KC_TILD, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* ADJUST - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | QK_BOOT| | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * |UG_TOGG|hue^ |sat ^ | bri ^| |COLEMAK|-------. ,-------|desk <| | |desk >| | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | mode | hue dn|sat d|bri dn| |QWERTY|-------| |-------| | PREV | PLAY | NEXT | | | - * `-----------------------------------------/ / \ \-----------------------------------------' - * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - [_ADJUST] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - QK_BOOT, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - UG_TOGG, UG_HUEU,UG_SATU, UG_VALU, KC_COLEMAKDH,KC_COLEMAK, C(G(KC_LEFT)),KC_NO,KC_NO,C(G(KC_RGHT)),XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - UG_NEXT, UG_HUED,UG_SATD, UG_VALD, XXXXXXX,KC_QWERTY,XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ +[_ADJUST] = LAYOUT( + EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU,KC_COLEMAKDH,KC_COLEMAK, C(G(KC_LEFT)), XXXXXXX, XXXXXXX,C(G(KC_RGHT)),XXXXXXX,XXXXXXX, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX,KC_QWERTY,XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* NUMPAD - * ,-----------------------------------------. ,-----------------------------------------. - * | trans| | | | | | | |NumLck| | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | | | | | | | ^ | 7 | 8 | 9 | * | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | trans| | | | | |-------. ,-------| - | 4 | 5 | 6 | | | | - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | trans| | | | | |-------| |-------| + | 1 | 2 | 3 | \ | Shift| - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE | 0 | . | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ [_NUMPAD] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_NUM, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CIRC, KC_P7, KC_P8, KC_P9, KC_ASTR, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_P4, KC_P5, KC_P6, KC_EQL, KC_PIPE, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,_______, _______,KC_PLUS, KC_P1, KC_P2, KC_P3, KC_SLSH, _______, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - _______, OSM(MOD_MEH), _______, _______, _______, _______, _______, KC_P0, KC_PDOT, _______ - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_NUM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CIRC, KC_P7, KC_P8, KC_P9, KC_ASTR, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_P4, KC_P5, KC_P6, KC_EQL, KC_PIPE, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_PLUS, KC_P1, KC_P2, KC_P3, KC_SLSH, _______, + _______, OSM(MOD_MEH), _______, _______, _______, _______, _______, KC_P0, KC_PDOT, _______ ), - -/* SWITCH - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | qwer | cole |col_dh| low | raise| adj | |numpad| | | | |QK_BOOT | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | | | | |EE_CLR| - * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------| - * | SLEEP| | | | | |-------| |-------| | | | | | | - * `-----------------------------------------/ / \ \-----------------------------------------' - * | Bspc | WIN |LOWER | Enter| /Space / \Enter \ |SPACE | 0 | . | RAlt | - * | | | | |/ / \ \ | | | | | - * `----------------------------------' '------''---------------------------' - */ - // layer switcher [_SWITCH] = LAYOUT( - //,------------------------------------------------. ,---------------------------------------------------. - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - TO(0), TO(1), TO(2), TO(3), TO(4), TO(5), TO(6), KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT, - //|------+-------+--------+--------+--------+------| |--------+-------+--------+--------+--------+---------| - KC_NO, KC_NO, KC_BRIU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, EE_CLR, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_SYSTEM_SLEEP,KC_NO,KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - //|------+-------+--------+--------+--------+------| === | | === |--------+-------+--------+--------+--------+---------| - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO - // \--------+--------+--------+---------+-------| |--------+---------+--------+---------+-------/ - - ), + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + TO(0), TO(1), TO(2), TO(3), TO(4), TO(5), TO(6), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, + XXXXXXX, XXXXXXX, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, +KC_SYSTEM_SLEEP,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX +), }; #ifdef RGBLIGHT_ENABLE From ac8b914a11e84b73332e191a675c85355432aa77 Mon Sep 17 00:00:00 2001 From: LucasMateijsen Date: Mon, 28 Apr 2025 05:58:47 +0200 Subject: [PATCH 330/592] Add handwired 4x14 LuMaWing keyboard (#24885) --- keyboards/handwired/lumawing/keyboard.json | 94 +++++++++++++++++++ .../lumawing/keymaps/default/keymap.c | 70 ++++++++++++++ keyboards/handwired/lumawing/readme.md | 15 +++ 3 files changed, 179 insertions(+) create mode 100644 keyboards/handwired/lumawing/keyboard.json create mode 100644 keyboards/handwired/lumawing/keymaps/default/keymap.c create mode 100644 keyboards/handwired/lumawing/readme.md diff --git a/keyboards/handwired/lumawing/keyboard.json b/keyboards/handwired/lumawing/keyboard.json new file mode 100644 index 0000000000..a99d6d2a2e --- /dev/null +++ b/keyboards/handwired/lumawing/keyboard.json @@ -0,0 +1,94 @@ +{ + "keyboard_name": "LuMaWing", + "manufacturer": "Lucas Mateijsen", + "url": "", + "maintainer": "qmk", + "usb": { + "vid": "0xBB80", + "pid": "0x050D", + "device_version": "0.0.1" + }, + "features": { + "bootmagic": true, + "command": true, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "matrix_pins": { + "cols": ["B1", "B3", "B2", "B6", "B5", "B4", "E6", "D7", "C6", "D4", "D0", "D1", "D2", "D3"], + "rows": ["F4", "F5", "F6", "F7"] + }, + "diode_direction": "COL2ROW", + "development_board": "promicro", + "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}, + {"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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2}, + {"matrix": [2, 11], "x": 11, "y": 2}, + {"matrix": [2, 12], "x": 12, "y": 2}, + {"matrix": [2, 13], "x": 13, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 6], "x": 5, "y": 3, "w": 2}, + {"matrix": [3, 7], "x": 7, "y": 3, "w": 2}, + {"matrix": [3, 9], "x": 9, "y": 3}, + {"matrix": [3, 10], "x": 10, "y": 3}, + {"matrix": [3, 11], "x": 11, "y": 3}, + {"matrix": [3, 12], "x": 12, "y": 3}, + {"matrix": [3, 13], "x": 13, "y": 3} + ] + } + } +} diff --git a/keyboards/handwired/lumawing/keymaps/default/keymap.c b/keyboards/handwired/lumawing/keymaps/default/keymap.c new file mode 100644 index 0000000000..c9d1367c8c --- /dev/null +++ b/keyboards/handwired/lumawing/keymaps/default/keymap.c @@ -0,0 +1,70 @@ +/* Copyright 2021 Richard Nunez + * + * 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 + +#define KC_COPY LCTL(KC_C) +#define KC_CUT LCTL(KC_X) +#define KC_PSTE LCTL(KC_V) + +#define KC_UNDO LCTL(KC_Z) +#define KC_AGIN LCTL(KC_Y) + +enum layer_names { + _COLEMAKDH, + _QWERTY, + _NUMBERS, + _FUNCTIONAL, + _ADMIN +}; + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_COLEMAKDH] = LAYOUT( + KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_B, XXXXXXX, XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, + KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_G, XXXXXXX, XXXXXXX, KC_M, KC_N, KC_E, KC_I, KC_O, KC_BSPC, + KC_LSFT, KC_Z, KC_X, KC_C, KC_D, KC_V, XXXXXXX, XXXXXXX, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, MO(3), KC_SPC, KC_ENT, MO(2), KC_RALT, KC_RGUI, XXXXXXX, KC_ENT + ), + + [_QWERTY] = LAYOUT( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_DEL, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, MO(3), KC_SPC, KC_ENT, MO(2), KC_RALT, KC_RGUI, XXXXXXX, KC_ENT + ), + + [_NUMBERS] = LAYOUT( + KC_ESC, 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, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_QUOT, KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, XXXXXXX, XXXXXXX, _______, MO(4), _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX + ), + + [_FUNCTIONAL] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, KC_AGIN, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX + ), + + [_ADMIN] = LAYOUT( + QK_BOOT, DF(0), DF(1), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX + ) +}; diff --git a/keyboards/handwired/lumawing/readme.md b/keyboards/handwired/lumawing/readme.md new file mode 100644 index 0000000000..aea5dab4ac --- /dev/null +++ b/keyboards/handwired/lumawing/readme.md @@ -0,0 +1,15 @@ +# LuMaWing handwired + +Custom handwired LuMaWing keyboard. + +* Keyboard Maintainer: [Lucas Mateijsen](https://github.com/LucasMateijsen/) +* Hardware Supported: Handwired LuMaWing 14x4 ortho keyboard Pro-Micro +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + + make handwired/ortho4x14:default + +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). + +To get into the Bootloader, simply hold down the top-left key (pos 0, 0) and power the board. From 92c4f0095dcef88c0a983f5fd661f7de2966bcc0 Mon Sep 17 00:00:00 2001 From: Jeremy Cook Date: Mon, 28 Apr 2025 00:03:50 -0400 Subject: [PATCH 331/592] Add jcpm2 (JC Pro Macro 2) (#24816) Co-authored-by: jack Co-authored-by: Drashna Jaelre Co-authored-by: Joel Challis --- keyboards/jcpm2/config.h | 20 ++++ keyboards/jcpm2/jcpm2.c | 46 ++++++++ keyboards/jcpm2/keyboard.json | 79 ++++++++++++++ keyboards/jcpm2/keymaps/default/keymap.c | 132 +++++++++++++++++++++++ keyboards/jcpm2/keymaps/default/rules.mk | 1 + keyboards/jcpm2/readme.md | 27 +++++ 6 files changed, 305 insertions(+) create mode 100644 keyboards/jcpm2/config.h create mode 100644 keyboards/jcpm2/jcpm2.c create mode 100644 keyboards/jcpm2/keyboard.json create mode 100644 keyboards/jcpm2/keymaps/default/keymap.c create mode 100644 keyboards/jcpm2/keymaps/default/rules.mk create mode 100644 keyboards/jcpm2/readme.md diff --git a/keyboards/jcpm2/config.h b/keyboards/jcpm2/config.h new file mode 100644 index 0000000000..0f06cd1466 --- /dev/null +++ b/keyboards/jcpm2/config.h @@ -0,0 +1,20 @@ +/* Copyright 2025 Jeremy Cook Consulting LLC + * + * 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. + * + * If you did not receive a copy of the GNU General Public License + * along with this program, see . + */ + +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_TIMEOUT 2000000 diff --git a/keyboards/jcpm2/jcpm2.c b/keyboards/jcpm2/jcpm2.c new file mode 100644 index 0000000000..1439ffcdcd --- /dev/null +++ b/keyboards/jcpm2/jcpm2.c @@ -0,0 +1,46 @@ +/* Copyright 2025 Jeremy Cook Consulting LLC + * + * 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 OLED_ENABLE +static uint32_t logo_timer = 0; + +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + logo_timer = timer_read(); + return OLED_ROTATION_180; +} + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 + }; + oled_write_P(qmk_logo, false); +} + +bool oled_task_kb(void) { + if (timer_elapsed32(logo_timer) < 1000) { + render_logo(); + return false; + } + if (!oled_task_user()) { + return false; + } + return true; +} + +#endif diff --git a/keyboards/jcpm2/keyboard.json b/keyboards/jcpm2/keyboard.json new file mode 100644 index 0000000000..17734a0ed0 --- /dev/null +++ b/keyboards/jcpm2/keyboard.json @@ -0,0 +1,79 @@ +{ + "manufacturer": "jeremyscook", + "keyboard_name": "jcpm2", + "maintainer": "jeremyscook", + "development_board": "promicro", + "encoder": { + "rotary": [ + {"pin_a": "D2", "pin_b": "D3"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true, + "rgb_matrix": true + }, + "matrix_pins": { + "direct": [ + ["D4", null, "F4", "B3"], + ["B4", null, "F5", "B2"], + ["B1", "F7", "F6", "B6"] + ] + }, + "rgb_matrix": { + "animations": { + "digital_rain": true, + "hue_breathing": true, + "typing_heatmap": true + }, + "default": { + "animation": "typing_heatmap", + "val": 180 + }, + "driver": "ws2812", + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [2, 1], "x": 75, "y": 64, "flags": 4}, + {"matrix": [2, 2], "x": 150, "y": 64, "flags": 4}, + {"matrix": [1, 2], "x": 150, "y": 32, "flags": 4}, + {"matrix": [0, 2], "x": 150, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 224, "y": 0, "flags": 4}, + {"matrix": [1, 3], "x": 224, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 224, "y": 64, "flags": 4}, + {"x": 224, "y": 0, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 112, "y": 64, "flags": 2}, + {"x": 0, "y": 64, "flags": 2} + ], + "sleep": true + }, + "url": "https://github.com/JeremySCook/JC-Pro-Macro-2", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "ws2812": { + "pin": "C6" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + } +} diff --git a/keyboards/jcpm2/keymaps/default/keymap.c b/keyboards/jcpm2/keymaps/default/keymap.c new file mode 100644 index 0000000000..6ea8906cec --- /dev/null +++ b/keyboards/jcpm2/keymaps/default/keymap.c @@ -0,0 +1,132 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Define the layers +enum layer_names { + _LAYER0, + _LAYER0_MOD, + _LAYER1, + _LAYER2 +}; + +#define UNDERGLOW 60 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┐ + * │ E │ n │ 6 │ 7 │ + * ├───┼───┼───┼───┤ + * │ B │ n │ 5 │ 8 │ + * ├───┼───┼───┼───┤ + * │ 2 │ 3 │ 4 │ 9 │ + * └───┴───┴───┴───┘ + */ + [_LAYER0] = LAYOUT( // default + KC_MUTE, LSFT(KC_COMM), LSFT(KC_DOT), + DF(_LAYER1), KC_J, KC_L, + KC_MPRV, KC_MPLY, KC_MNXT, TG(_LAYER0_MOD) // btm-right one shot mod layer + ), + [_LAYER0_MOD] = LAYOUT( // default MOD + _______, RM_VALU, RM_NEXT, // _______ transparent, goes to above layer + _______, RM_VALD, RM_TOGG, + LCTL(LGUI(KC_SPC)), _______, _______, TG(_LAYER0_MOD) + ), + [_LAYER1] = LAYOUT( // FCPX + LSFT(LGUI(KC_B)), LGUI(KC_B), LGUI(KC_EQL), + DF(_LAYER2), LALT(KC_K), LGUI(KC_MINS), + KC_J, KC_K, KC_L, KC_BSPC + ), + [_LAYER2] = LAYOUT( // KICAD + KC_E, KC_ESC, KC_M, + DF(_LAYER0), LGUI(KC_Z), KC_X, + KC_V, KC_D, KC_U, KC_BSPC + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_LAYER0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, // default + [_LAYER0_MOD] = { ENCODER_CCW_CW(_______, _______) }, // default MOD + [_LAYER1] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, // FCPX + [_LAYER2] = { ENCODER_CCW_CW(KC_R, S(KC_R)) } // KICAD +}; +#endif + +#ifdef OLED_ENABLE +// Function to display the current layer and information on the OLED +bool oled_task_user(void) { + switch (get_highest_layer(layer_state | default_layer_state)) { + case _LAYER0: + oled_write_ln_P(PSTR("(VOL- VOL+) LAYER0"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("MUTE SLOW FAST"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("LAYR RSET 10BK 10FW"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("MREV MPLA MFWD +OPT"), false); + break; + case _LAYER0_MOD: + oled_write_ln_P(PSTR("____ ____ 0-MOD"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("____ BRI+ ANIM"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("____ ____ BRI- TOGG"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("EMOJ ____ ____ -OPT"), false); + break; + case _LAYER1: + oled_write_ln_P(PSTR("(FRA- FRA+) FCPX"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("XXXX BRAK ZOM+"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("LAYR RSET KFRA ZOM-"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("BACK STOP FORW DELT"), false); + break; + case _LAYER2: + oled_write_ln_P(PSTR("(RO L RO R) KICAD"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("EDIT ESCP MOVE"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("LAYR RSET UNDO TRAK"), false); + oled_write_ln_P(PSTR(""), false); + oled_write_ln_P(PSTR("VIA DRAG SALL DELT"), false); + break; + } + return false; +} +#endif + +bool rgb_matrix_indicators_user(void) { + switch(get_highest_layer(layer_state|default_layer_state)) { + case _LAYER2: + rgb_matrix_set_color(11, 0, 0, UNDERGLOW); + rgb_matrix_set_color(10, 0, 0, UNDERGLOW); + rgb_matrix_set_color(9, 0, 0, UNDERGLOW); + rgb_matrix_set_color(8, 0, 0, UNDERGLOW); + break; + case _LAYER1: + rgb_matrix_set_color(11, 0, UNDERGLOW, 0); + rgb_matrix_set_color(10, 0, UNDERGLOW, 0); + rgb_matrix_set_color(9, 0, UNDERGLOW, 0); + rgb_matrix_set_color(8, 0, UNDERGLOW, 0); + break; + case _LAYER0_MOD: + rgb_matrix_set_color(11, UNDERGLOW/2, 0, UNDERGLOW/2); + rgb_matrix_set_color(10, UNDERGLOW/2, 0, UNDERGLOW/2); + rgb_matrix_set_color(9, UNDERGLOW/2, 0, UNDERGLOW/2); + rgb_matrix_set_color(8, UNDERGLOW/2, 0, UNDERGLOW/2); + break; + case _LAYER0: + rgb_matrix_set_color(11, UNDERGLOW, 0, 0); + rgb_matrix_set_color(10, UNDERGLOW, 0, 0); + rgb_matrix_set_color(9, UNDERGLOW, 0, 0); + rgb_matrix_set_color(8, UNDERGLOW, 0, 0); + break; + default: + break; + } + return false; +} diff --git a/keyboards/jcpm2/keymaps/default/rules.mk b/keyboards/jcpm2/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/jcpm2/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/jcpm2/readme.md b/keyboards/jcpm2/readme.md new file mode 100644 index 0000000000..9a5560dfd0 --- /dev/null +++ b/keyboards/jcpm2/readme.md @@ -0,0 +1,27 @@ +# jcpm2 + +![jcpm2](https://i.imgur.com/EM5JoGC.jpeg) + +An 8-key macro pad with rotary encoder, RGB backlighting and underlighting. Made and sold by JCC LLC. + +* Keyboard Maintainer: [jeremyscook](https://github.com/jeremyscook) +* Hardware Supported: JCPM2 PCB, Pro Micro +* Hardware Availability: [Tindie.com](https://www.tindie.com/products/25414) + +Make example for this keyboard (after setting up your build environment): + + make jcpm2:default + +Flashing example for this keyboard: + + make jcpm2: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 rotary encoder and plug in the keyboard +* **Physical reset button**: Double-click the small inside button on top of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 01354fffb4b11bdaec0e5ec10c34a1d974bc7070 Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Mon, 28 Apr 2025 07:25:09 +0200 Subject: [PATCH 332/592] [Keyboard] Add splitkb.com's Halcyon Elora rev2 (#24790) Co-authored-by: Drashna Jaelre --- keyboards/splitkb/halcyon/elora/info.json | 80 ++++++ .../halcyon/elora/keymaps/default/keymap.c | 241 ++++++++++++++++ .../halcyon/elora/keymaps/default/readme.md | 262 ++++++++++++++++++ .../halcyon/elora/keymaps/default/rules.mk | 1 + keyboards/splitkb/halcyon/elora/readme.md | 31 +++ keyboards/splitkb/halcyon/elora/rev2/config.h | 32 +++ .../splitkb/halcyon/elora/rev2/halconf.h | 14 + .../splitkb/halcyon/elora/rev2/keyboard.json | 177 ++++++++++++ .../splitkb/halcyon/elora/rev2/mcuconf.h | 14 + keyboards/splitkb/halcyon/elora/rev2/rev2.c | 28 ++ 10 files changed, 880 insertions(+) create mode 100644 keyboards/splitkb/halcyon/elora/info.json create mode 100644 keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c create mode 100644 keyboards/splitkb/halcyon/elora/keymaps/default/readme.md create mode 100644 keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk create mode 100644 keyboards/splitkb/halcyon/elora/readme.md create mode 100644 keyboards/splitkb/halcyon/elora/rev2/config.h create mode 100644 keyboards/splitkb/halcyon/elora/rev2/halconf.h create mode 100644 keyboards/splitkb/halcyon/elora/rev2/keyboard.json create mode 100644 keyboards/splitkb/halcyon/elora/rev2/mcuconf.h create mode 100644 keyboards/splitkb/halcyon/elora/rev2/rev2.c diff --git a/keyboards/splitkb/halcyon/elora/info.json b/keyboards/splitkb/halcyon/elora/info.json new file mode 100644 index 0000000000..ea97888673 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/info.json @@ -0,0 +1,80 @@ +{ + "manufacturer": "splitkb.com", + "maintainer": "splitkb", + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layout_aliases": { + "LAYOUT": "LAYOUT_split_4x6_5" + }, + "layouts": { + "LAYOUT_split_4x6_5": { + "layout": [ + {"label": "L06", "matrix": [0, 6], "x": 0, "y": 0.75}, + {"label": "L05", "matrix": [0, 5], "x": 1, "y": 0.75}, + {"label": "L04", "matrix": [0, 4], "x": 2, "y": 0.25}, + {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "L02", "matrix": [0, 2], "x": 4, "y": 0.25}, + {"label": "L01", "matrix": [0, 1], "x": 5, "y": 0.5}, + {"label": "R01", "matrix": [5, 1], "x": 10.5, "y": 0.5}, + {"label": "R02", "matrix": [5, 2], "x": 11.5, "y": 0.25}, + {"label": "R03", "matrix": [5, 3], "x": 12.5, "y": 0}, + {"label": "R04", "matrix": [5, 4], "x": 13.5, "y": 0.25}, + {"label": "R05", "matrix": [5, 5], "x": 14.5, "y": 0.75}, + {"label": "R06", "matrix": [5, 6], "x": 15.5, "y": 0.75}, + {"label": "L12", "matrix": [1, 6], "x": 0, "y": 1.75}, + {"label": "L11", "matrix": [1, 5], "x": 1, "y": 1.75}, + {"label": "L10", "matrix": [1, 4], "x": 2, "y": 1.25}, + {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "L08", "matrix": [1, 2], "x": 4, "y": 1.25}, + {"label": "L07", "matrix": [1, 1], "x": 5, "y": 1.5}, + {"label": "R07", "matrix": [6, 1], "x": 10.5, "y": 1.5}, + {"label": "R08", "matrix": [6, 2], "x": 11.5, "y": 1.25}, + {"label": "R09", "matrix": [6, 3], "x": 12.5, "y": 1}, + {"label": "R10", "matrix": [6, 4], "x": 13.5, "y": 1.25}, + {"label": "R11", "matrix": [6, 5], "x": 14.5, "y": 1.75}, + {"label": "R12", "matrix": [6, 6], "x": 15.5, "y": 1.75}, + {"label": "L18", "matrix": [2, 6], "x": 0, "y": 2.75}, + {"label": "L17", "matrix": [2, 5], "x": 1, "y": 2.75}, + {"label": "L16", "matrix": [2, 4], "x": 2, "y": 2.25}, + {"label": "L15", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "L14", "matrix": [2, 2], "x": 4, "y": 2.25}, + {"label": "L13", "matrix": [2, 1], "x": 5, "y": 2.5}, + {"label": "R13", "matrix": [7, 1], "x": 10.5, "y": 2.5}, + {"label": "R14", "matrix": [7, 2], "x": 11.5, "y": 2.25}, + {"label": "R15", "matrix": [7, 3], "x": 12.5, "y": 2}, + {"label": "R16", "matrix": [7, 4], "x": 13.5, "y": 2.25}, + {"label": "R17", "matrix": [7, 5], "x": 14.5, "y": 2.75}, + {"label": "R18", "matrix": [7, 6], "x": 15.5, "y": 2.75}, + {"label": "L26", "matrix": [3, 6], "x": 0, "y": 3.75}, + {"label": "L25", "matrix": [3, 5], "x": 1, "y": 3.75}, + {"label": "L24", "matrix": [3, 4], "x": 2, "y": 3.25}, + {"label": "L23", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "L22", "matrix": [3, 2], "x": 4, "y": 3.25}, + {"label": "L21", "matrix": [3, 1], "x": 5, "y": 3.5}, + {"label": "L20", "matrix": [4, 3], "x": 6, "y": 4}, + {"label": "L19", "matrix": [3, 0], "x": 7, "y": 4.25}, + {"label": "R19", "matrix": [8, 0], "x": 8.5, "y": 4.25}, + {"label": "R20", "matrix": [9, 3], "x": 9.5, "y": 4}, + {"label": "R21", "matrix": [8, 1], "x": 10.5, "y": 3.5}, + {"label": "R22", "matrix": [8, 2], "x": 11.5, "y": 3.25}, + {"label": "R23", "matrix": [8, 3], "x": 12.5, "y": 3}, + {"label": "R24", "matrix": [8, 4], "x": 13.5, "y": 3.25}, + {"label": "R26", "matrix": [8, 5], "x": 14.5, "y": 3.75}, + {"label": "R27", "matrix": [8, 6], "x": 15.5, "y": 3.75}, + {"label": "L31", "matrix": [4, 4], "x": 2.5, "y": 4.25}, + {"label": "L30", "matrix": [4, 2], "x": 3.5, "y": 4.25}, + {"label": "L29", "matrix": [4, 1], "x": 4.5, "y": 4.5}, + {"label": "L28", "matrix": [4, 5], "x": 5.5, "y": 5}, + {"label": "L27", "matrix": [4, 0], "x": 6.5, "y": 5.25}, + {"label": "R27", "matrix": [9, 0], "x": 9, "y": 5.25}, + {"label": "R28", "matrix": [9, 5], "x": 10, "y": 5}, + {"label": "R29", "matrix": [9, 1], "x": 11, "y": 4.5}, + {"label": "R30", "matrix": [9, 2], "x": 12, "y": 4.25}, + {"label": "R31", "matrix": [9, 4], "x": 13, "y": 4.25} + ] + } + } +} diff --git a/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c b/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c new file mode 100644 index 0000000000..542314bf21 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/keymaps/default/keymap.c @@ -0,0 +1,241 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layers { + _QWERTY = 0, + _DVORAK, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST, +}; + +// Aliases for readability +#define QWERTY DF(_QWERTY) +#define COLEMAK DF(_COLEMAK_DH) +#define DVORAK DF(_DVORAK) + +#define SYM MO(_SYM) +#define NAV MO(_NAV) +#define FKEYS MO(_FUNCTION) +#define ADJUST MO(_ADJUST) + +#define CTL_ESC MT(MOD_LCTL, KC_ESC) +#define CTL_QUOT MT(MOD_RCTL, KC_QUOTE) +#define CTL_MINS MT(MOD_RCTL, KC_MINUS) +#define ALT_ENT MT(MOD_LALT, KC_ENT) + +// Note: LAlt/Enter (ALT_ENT) is not the same thing as the keyboard shortcut Alt+Enter. +// The notation `mod/tap` denotes a key that activates the modifier `mod` when held down, and +// produces the key `tap` when tapped (i.e. pressed and released). + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * Base Layer: QWERTY + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_QWERTY] = LAYOUT( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC , + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC, + CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN,CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST , KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Base Layer: Dvorak + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | Tab | ' " | , < | . > | P | Y | | F | G | C | R | L | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | O | E | U | I | | D | H | T | N | S |Ctrl/- _| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | ; : | Q | J | K | X | [ { |CapsLk| |F-keys| ] } | B | M | W | V | Z | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_DVORAK] = LAYOUT( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC , + KC_TAB ,KC_QUOTE,KC_COMM, KC_DOT, KC_P , KC_Y , KC_F, KC_G , KC_C , KC_R , KC_L , KC_BSPC, + CTL_ESC , KC_A , KC_O , KC_E , KC_U , KC_I , KC_D, KC_H , KC_T , KC_N , KC_S , CTL_MINS, + KC_LSFT ,KC_SCLN, KC_Q , KC_J , KC_K , KC_X , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_B, KC_M , KC_W , KC_V , KC_Z , KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Base Layer: Colemak DH + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | Tab | Q | W | F | P | B | | J | L | U | Y | ; : | Bksp | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Ctrl/Esc| A | R | S | T | G | | M | N | E | I | O |Ctrl/' "| + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | [ { |CapsLk| |F-keys| ] } | K | H | , < | . > | / ? | RShift | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + * | | | Enter| | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_COLEMAK_DH] = LAYOUT( + KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_ESC , + KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC, + CTL_ESC , KC_A , KC_R , KC_S , KC_T , KC_G , KC_M, KC_N , KC_E , KC_I , KC_O , CTL_QUOT, + KC_LSFT , KC_Z , KC_X , KC_C , KC_D , KC_V , KC_LBRC,KC_CAPS, FKEYS , KC_RBRC, KC_K, KC_H ,KC_COMM, KC_DOT ,KC_SLSH, KC_RSFT, + ADJUST, KC_LGUI, ALT_ENT, KC_SPC , NAV , SYM , KC_SPC ,KC_RALT, KC_RGUI, KC_APP + ), + +/* + * Nav Layer: Media, navigation + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_NAV] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU, KC_DEL, + _______, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_INS, + _______, _______, _______, _______, _______, _______, _______, KC_SCRL, _______, _______,KC_PAUSE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PSCR, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Sym Layer: Numbers and symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SYM] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL , + KC_TILD , KC_EXLM, KC_AT , KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, + KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, KC_LCBR, _______, _______, KC_RCBR, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Function Layer: Function keys + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F9 | F10 | F11 | F12 | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | F1 | F2 | F3 | F4 | | | | | | | | | | | | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_FUNCTION] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F9 , KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, + _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI, _______, + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* + * Adjust Layer: Default layer settings, RGB + * + * ,-------------------------------------------. ,-------------------------------------------. + * | Reset | | | | | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | |QWERTY| | | | | | | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | + * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_ADJUST] = LAYOUT( + QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, DVORAK , _______, _______, RM_TOGG, RM_SATU, RM_HUEU, RM_VALU, RM_NEXT, _______, + _______, _______, _______, COLEMAK, _______, _______,_______, _______, _______, _______, _______, RM_SATD, RM_HUED, RM_VALD, RM_PREV, _______, + _______, _______, _______,_______, _______, _______, _______, _______, _______, _______ + ), + +// /* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +// +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD), ENCODER_CCW_CW(KC_PGDN, KC_PGUP) }, + [1] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [4] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [5] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, + [6] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }, +}; +#endif diff --git a/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md b/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md new file mode 100644 index 0000000000..bd386bfa39 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/keymaps/default/readme.md @@ -0,0 +1,262 @@ +# Halcyon Elora's Default Keymap + +The default keymap contains 5 layers which allows it to include all keys found on an ANSI layout TKL keyboard plus media keys. +Hardware features of the Elora such as rotary encoders and underglow are also supported. + +The Elora keymap is in essence identical to the Kyria keymap, just with an additional number row. A deep dive into the keymap is provided there. + +The five different layers are the following: +1. Base layer (QWERTY, Colemak-DH or Dvorak) +2. Navigation layer +3. Symbols/Numbers layer +4. Function layer +5. Adjust layer + +## Base layer(s) +``` +Base Layer: - + +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | - | - | - | - | - | | - | - | - | - | - | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| - | - | - | - | - | | - | - | - | - | - |Ctrl/ - | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | - | - | - | - | - | [ { |CapsLk| |F-Keys| ] } | - | - | - | - | - | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` +Three different well-known keyboard layouts are provided to fill in the placeholder `-` keys: QWERTY, Colemak-DH, and Dvorak. The default layer can be changed at runtime, more info on that in the section on the [adjust layer](#adjust-layer). + +For the rest of this write-up, the base layer will be assumed to be QWERTY and will be used as a reference to describe physical keys, e.g. “B key” vs, the much more verbose, “lower inner index key”. + +``` +Base Layer: QWERTY + +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Aside from variations in the alpha cluster, the rest of the base keys remain the same and are designed to feel familiar. + +![Step-by-step animation of the transformation of an ortholinear TKL to a Kyria](https://i.imgur.com/uVDCOek.gif) + +
+After making transformations to the classic ANSI US QWERTY TKL 60% to arrive to the layout of the Elora, as illustrated in the animation above, the result looks like this: + +``` +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Cap Lk | A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | | | | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | LCtrl| LGUI | LAlt | Space| | | | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +First thing to notice is the presence of blank keys. To fill in the blank keys above the Space keys, we can take inspiration from other split keyboards featuring an extra inner index column on each half. A common mapping for those kind of keys are the bracket keys that got removed in the fourth step of the animated transformation. The thumb keys besides Spaces is prime real estate for dedicated layer-switching keys. It doesn't matter on which side is assigned the sym-layer-switch key but it helps to keep the nav-layer-switch on the left in order to keep the arrow keys on the right side like on a classic keyboard, so we'll put nav on the left and sym on the right. We'll address the remaining blank thumb keys later. + +The base layer is starting to form but there remains some flaws. One glaring issue is the position of Control. Control is a very commonly used function but the key on which it sits right now is way too tucked in under the hand to be able to press it comfortably with either the thumb or the pinky from resting position. In fact, installing a rotary encoder there is a common move among Elora users and I guarantee you that activating Control by holding down a rotary encoder does not spark joy. Instead, let's employ a popular trick that involves remapping the current Caps Lock key, which is positioned at a comfortable position on the keyboard, to Control. + +We can go further though; a variant of this trick makes the Control key produce Escape when tapped. This is called a “modtap”. There is no use to tapping Control by itself without chording it with another key and there is no use to holding down the Esc key so why not combine the two into a single key? + +All of this leaves us with three blank keys. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { | | | | ] } | N | M | , < | . > | / ? | RShift | +`--------+-------------+--------------------+------+------| |------+------+--------------------+------+---------------' + | | LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' '----------------------------------' +``` + +These keys are not easily reachable while touch typing (that is, not reachable without picking up your hand) and should thus be associated with functions that you are not likely to be typed within a stream of text. The idea is that if you have to pick up your hand to hit a key, you want it to be at a time when you are likely to be pausing your interaction with the machine, rather than in the midst of a flurry of typing. They're thus well suited for accessing the adjust layer and the function layer. We can also toss in Caps Lock even though it is an editing-type function that gets used within a stream of text because shouting in ALL-CAPS should be a deliberate action. + +``` +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : | ' " | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt | Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +The next glaring issue is the absence of an Enter key on the current base layer this far. Enter is a very frequently used key so it deserves to be placed at a good spot in the keymap. The best way to insert it in the keymap with minimal changes to the current layout is to use modtaps. A tempting solution is to turn the RShift key into a RShift/Enter modtap but that can result in chat messages sent too frustratingly early when you're not used to it. Using GUI is also sub-optimal because tapping the GUI modifier actually has a use as opposed to taps of the Control or the Shift key. Pressing and releasing the GUI key by itself opens the App menu in many desktop environments. The natural choice is thus LAlt/Enter. That way, Enter is 1u away from resting thumb position and is unlikely to get accidentally activated because Alt is very rarely used in the midst of prose. + +Finally, we're one Quality-Of-Life update away from the actual base layer. Ctrl/' " not only preserves symmetry in the keymap with Ctrl/Esc but also helps balance the load between your pinkies and invites you to use both hands instead of contortions. Perhaps more importantly, it also frees you from the necessity of picking up your hand, breaking touch typing position and pressing a pinky key with your ring finger in order to execute Ctrl+A or Ctrl+Z. That becomes even more important on a board with such an aggressive pinky columnar stagger like the Elora. + + +``` +,-------------------------------------------. ,-------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Esc | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +|Ctrl/Esc| A | S | D | F | G | | H | J | K | L | ; : |Ctrl/' "| +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | [ { |CapsLk| |F-keys| ] } | N | M | , < | . > | / ? | RShift | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + |Adjust| LGUI | LAlt/| Space| Nav | | Sym | Space| AltGr| RGUI | Menu | + | | | Enter| | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +
+ +## Navigation layer + +``` +Nav Layer: Media, navigation + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | | | | | | | PgUp | Home | ↑ | End | VolUp| Delete | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | VolDn| Insert | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | | | | | |ScLck | | | | Pause|M Prev|M Play|M Next|VolMut| PrtSc | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +This is where you'll find all the keys that are generally between the main block of a classic keyboard and the numpad in addition to media controls and modifiers on easy access on the home row for fast and comfortable chording with navigation keys. + +Useful mnemonics: +- “GACS” to remember the order of the modifiers on the left-hand home row +- Scroll Lock is on the same key as Caps Lock because they're both locks +- Delete is on the same key as Backspace because they both erase characters +- Home is the leftmost position on the current line so it is above ←. Same logic applies for End. +- Media Previous = ⏮, Media Next = ⏭ +- Page Up, Page Down and Volume Up, Volume Down are positioned like the main Up and Down keys. + +## Sym layer +``` +Sym Layer: Numbers, symbols + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | \ | : | ; | - | [ | { | | | | } | ] | _ | , | . | / | ? | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +The top row is the unshifted num row, the home row of the layer is the shifted num row and the bottom row contains the hyphen `-` and the underscore `_` on the best lower row spot because of how frequent they are as well as redundant symbols that are already present on the base layer but are reproduced here to avoid juggling back and forth between base, shift, and sym when typing a string of symbols. + +The layout of the first two rows needs no introduction, you're already used to them but it's worth looking into the structure of the bottom row. + +The two halves are mirrored in a sense. On the right, you can find , . / at their usual spots with the addition of Shift+/=? to the right of the / key to remove the need to press simultaneously Sym and a Shift key to access `?`. + +Now, if you look at the left side, you'll notice that the mirror of , is ;, the mirror of . is : and the mirror of / is \\. The same logic used for Shift+/=? also applies to Shift+\\=|. + +In case you wish to combine Shift with a symbol key anyways, you can hold down Shift on the base layer with your pinky, activate Sym with your right thumb and while still holding down the Shift key, tap your desired symbol key. Same thing if you need Ctrl+Digit. + +## Function layer +``` +Function Layer: Function keys + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | F9 | F10 | F11 | F12 | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | F5 | F6 | F7 | F8 | | | | Shift| Ctrl | Alt | GUI | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | F1 | F2 | F3 | F4 | | | | | | | | | | | | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` +In a similar fashion to the nav layer, pressing down `FKEYS` with the right thumb enables a numpad of function keys on the opposite hand and modifiers on the right-hand home row. Once again, mirror symmetry is leveraged in this keymap for the order of the right-hand modifiers. + +The Alt modifier, despite being situated on the right half of the keyboard is *not* `KC_RALT`, it is `KC_LALT`. `KC_RALT` is actually the AltGr key which generally acts very differently to the left Alt key. Keyboard shortcuts involving AltGr+F# are rare and infrequent as opposed to the much more common Alt+F# shortcuts. Consequently, `KC_LALT` was chosen for the function layer. + +Since there are more than 10 function keys, the cluster of F-keys does not follow the usual 3×3+1 numpad arrangement. + + +## Adjust layer +``` +Adjust Layer: Default layer settings, RGB + +,-------------------------------------------. ,-------------------------------------------. +| | | | | | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | | |QWERTY| | | | | | | | | | +|--------+------+------+------+------+------| |------+------+------+------+------+--------| +| | | |Dvorak| | | | TOG | SAI | HUI | VAI | MOD | | +|--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +| | | |Colmak| | | | | | | | | SAD | HUD | VAD | RMOD | | +`----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------' + | | | | | | | | | | | | + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' +``` + +Default layer settings on the left and various RGB underglow controls on the right. + +The default layer settings are lined up on the middle finger column because the home middle finger key is D on QWERTY (like the “D” in “Dvorak”) and the lower middle finger key is C on QWERTY (like the “C” in “Colemak”). I can hear you say that “QWERTY” doesn't start with “E” but Dvorak and Colemak were already aligned in a column so the QWERTY may as well join the formation. + +NOTE: The default layer settings set by those keys are *NOT* stored in EEPROM and thus do not persist through boots. If you wish to change the default layer in a non-volatile manner, either change the order of the layers in the firmware, for example like so if you want to set Dvorak as the new default: +```c +enum layers { + _DVORAK = 0, + _QWERTY, + _COLEMAK_DH, + _NAV, + _SYM, + _FUNCTION, + _ADJUST +}; +``` +or re-define the `QWERTY`, `COLEMAK` and `DVORAK` keys to point to custom keycodes starting on `SAFE_RANGE` and calling the `set_single_persistent_default_layer` function inside of `process_record_user`. + +## Hardware Features + +### Rotary Encoder +The left rotary encoder is programmed to control the volume whereas the right encoder sends PgUp or PgDn on every turn. + +## Going further… + +This default keymap can be used as is, unchanged, as a daily driver for your Elora but you're invited to treat your keymap like a bonsai. At the beginning, it's just like the default keymap but from time to time, you can tweak it a little. Cut a little key here, let another combo grow there. Slowly but surely it will be a unique keymap that will fit you like a glove. + +Check out the #keymap-ideas channel on the official SplitKB Discord server for inspiration. diff --git a/keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk b/keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/splitkb/halcyon/elora/readme.md b/keyboards/splitkb/halcyon/elora/readme.md new file mode 100644 index 0000000000..9970d31f43 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/readme.md @@ -0,0 +1,31 @@ +# Halcyon Elora + +![splitkb/halcyon/elora](https://i.imgur.com/TbFWzsh.png) + +The Halcyon Elora rev2 is the second Elora revision and the second keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights: + +- Halcyon keyboards come preassembled! You won't need a soldering iron. +- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules. +- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases. +- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C. +- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO! +- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing. + +* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com) +* Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/halcyon/elora/rev2:default + +The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive. + +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: + +* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port. +* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. \ No newline at end of file diff --git a/keyboards/splitkb/halcyon/elora/rev2/config.h b/keyboards/splitkb/halcyon/elora/rev2/config.h new file mode 100644 index 0000000000..b5cd6f95f2 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/rev2/config.h @@ -0,0 +1,32 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP28 // USART TX pin +#define SERIAL_USART_RX_PIN GP29 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + +// VBUS detection +#define USB_VBUS_PIN GP1 + +//// VIK + +// GPIO1 = GP27 +// GPIO2 = GP26 +// CS = GP13 + +#define I2C_DRIVER I2C0 +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP14 +#define SPI_MOSI_PIN GP15 +#define SPI_MISO_PIN GP12 diff --git a/keyboards/splitkb/halcyon/elora/rev2/halconf.h b/keyboards/splitkb/halcyon/elora/rev2/halconf.h new file mode 100644 index 0000000000..fd95e15f83 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/rev2/halconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//// VIK + +#define HAL_USE_I2C TRUE + +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + +#include_next diff --git a/keyboards/splitkb/halcyon/elora/rev2/keyboard.json b/keyboards/splitkb/halcyon/elora/rev2/keyboard.json new file mode 100644 index 0000000000..c2dc711f07 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/rev2/keyboard.json @@ -0,0 +1,177 @@ +{ + "keyboard_name": "Halcyon Elora rev2", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP22", "pin_b": "GP18", "resolution": 2} + ] + }, + "features": { + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP24", "GP19", "GP20", "GP25", "GP4", "GP9", "GP10"], + "rows": ["GP8", "GP11", "GP7", "GP6", "GP5"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "solid_color": 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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"x": 75, "y": 2, "flags": 2}, + {"x": 50, "y": 1, "flags": 2}, + {"x": 14, "y": 4, "flags": 2}, + {"x": 25, "y": 45, "flags": 2}, + {"x": 58, "y": 49, "flags": 2}, + {"x": 94, "y": 53, "flags": 2}, + {"matrix": [4, 0], "x": 94, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 79, "y": 61, "flags": 4}, + {"matrix": [4, 1], "x": 65, "y": 55, "flags": 4}, + {"matrix": [4, 2], "x": 51, "y": 52, "flags": 4}, + {"matrix": [4, 4], "x": 36, "y": 52, "flags": 4}, + {"matrix": [3, 0], "x": 101, "y": 52, "flags": 4}, + {"matrix": [4, 3], "x": 87, "y": 49, "flags": 4}, + {"matrix": [3, 1], "x": 72, "y": 43, "flags": 4}, + {"matrix": [3, 2], "x": 58, "y": 40, "flags": 4}, + {"matrix": [3, 3], "x": 43, "y": 37, "flags": 4}, + {"matrix": [3, 4], "x": 29, "y": 40, "flags": 4}, + {"matrix": [3, 5], "x": 14, "y": 46, "flags": 4}, + {"matrix": [3, 6], "x": 0, "y": 46, "flags": 4}, + {"matrix": [2, 1], "x": 72, "y": 30, "flags": 4}, + {"matrix": [2, 2], "x": 58, "y": 27, "flags": 4}, + {"matrix": [2, 3], "x": 43, "y": 24, "flags": 4}, + {"matrix": [2, 4], "x": 29, "y": 27, "flags": 4}, + {"matrix": [2, 5], "x": 14, "y": 34, "flags": 4}, + {"matrix": [2, 6], "x": 0, "y": 34, "flags": 4}, + {"matrix": [1, 1], "x": 72, "y": 18, "flags": 4}, + {"matrix": [1, 2], "x": 58, "y": 15, "flags": 4}, + {"matrix": [1, 3], "x": 43, "y": 12, "flags": 4}, + {"matrix": [1, 4], "x": 29, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 14, "y": 21, "flags": 4}, + {"matrix": [1, 6], "x": 0, "y": 21, "flags": 4}, + {"matrix": [0, 1], "x": 72, "y": 6, "flags": 4}, + {"matrix": [0, 2], "x": 48, "y": 3, "flags": 4}, + {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 29, "y": 3, "flags": 4}, + {"matrix": [0, 5], "x": 14, "y": 9, "flags": 4}, + {"matrix": [0, 6], "x": 0, "y": 9, "flags": 4}, + {"x": 149, "y": 2, "flags": 2}, + {"x": 174, "y": 1, "flags": 2}, + {"x": 210, "y": 4, "flags": 2}, + {"x": 199, "y": 45, "flags": 2}, + {"x": 166, "y": 49, "flags": 2}, + {"x": 130, "y": 53, "flags": 2}, + {"matrix": [9, 0], "x": 130, "y": 64, "flags": 4}, + {"matrix": [9, 5], "x": 145, "y": 61, "flags": 4}, + {"matrix": [9, 1], "x": 159, "y": 55, "flags": 4}, + {"matrix": [9, 2], "x": 173, "y": 52, "flags": 4}, + {"matrix": [9, 4], "x": 188, "y": 52, "flags": 4}, + {"matrix": [8, 0], "x": 123, "y": 52, "flags": 4}, + {"matrix": [9, 3], "x": 137, "y": 49, "flags": 4}, + {"matrix": [8, 1], "x": 152, "y": 43, "flags": 4}, + {"matrix": [8, 2], "x": 166, "y": 40, "flags": 4}, + {"matrix": [8, 3], "x": 181, "y": 37, "flags": 4}, + {"matrix": [8, 4], "x": 195, "y": 40, "flags": 4}, + {"matrix": [8, 5], "x": 210, "y": 46, "flags": 4}, + {"matrix": [8, 6], "x": 224, "y": 46, "flags": 4}, + {"matrix": [7, 1], "x": 152, "y": 30, "flags": 4}, + {"matrix": [7, 2], "x": 166, "y": 27, "flags": 4}, + {"matrix": [7, 3], "x": 181, "y": 24, "flags": 4}, + {"matrix": [7, 4], "x": 195, "y": 27, "flags": 4}, + {"matrix": [7, 5], "x": 210, "y": 34, "flags": 4}, + {"matrix": [7, 6], "x": 224, "y": 34, "flags": 4}, + {"matrix": [6, 1], "x": 152, "y": 18, "flags": 4}, + {"matrix": [6, 2], "x": 166, "y": 15, "flags": 4}, + {"matrix": [6, 3], "x": 181, "y": 12, "flags": 4}, + {"matrix": [6, 4], "x": 195, "y": 15, "flags": 4}, + {"matrix": [6, 5], "x": 210, "y": 21, "flags": 4}, + {"matrix": [6, 6], "x": 224, "y": 21, "flags": 4}, + {"matrix": [5, 1], "x": 152, "y": 6, "flags": 4}, + {"matrix": [5, 2], "x": 166, "y": 3, "flags": 4}, + {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 195, "y": 3, "flags": 4}, + {"matrix": [5, 5], "x": 210, "y": 9, "flags": 4}, + {"matrix": [5, 6], "x": 224, "y": 9, "flags": 4} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [37, 37] + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP23" + }, + "matrix_pins": { + "right": { + "cols": ["GP10", "GP9", "GP4", "GP25", "GP20", "GP19", "GP24"], + "rows": ["GP8", "GP11", "GP7", "GP6", "GP5"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "pid": "0xA392" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP3" + } +} diff --git a/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h b/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h new file mode 100644 index 0000000000..126697a4a0 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/rev2/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +//// VIK + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE diff --git a/keyboards/splitkb/halcyon/elora/rev2/rev2.c b/keyboards/splitkb/halcyon/elora/rev2/rev2.c new file mode 100644 index 0000000000..e0a64ae9a4 --- /dev/null +++ b/keyboards/splitkb/halcyon/elora/rev2/rev2.c @@ -0,0 +1,28 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + if (index == 0) { + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} +#endif From 3478ae5795ef24b5b88859a9ae45413df701aa93 Mon Sep 17 00:00:00 2001 From: mizma Date: Mon, 28 Apr 2025 14:26:47 +0900 Subject: [PATCH 333/592] [Keyboard] mzmkb/slimdash/rev1 (#24804) Co-authored-by: Drashna Jaelre Co-authored-by: jack Co-authored-by: Duncan Sutherland Co-authored-by: Ryan --- keyboards/mzmkb/slimdash/info.json | 10 + keyboards/mzmkb/slimdash/readme.md | 41 +++ keyboards/mzmkb/slimdash/rev1/config.h | 28 ++ keyboards/mzmkb/slimdash/rev1/keyboard.json | 239 ++++++++++++++++++ .../slimdash/rev1/keymaps/default/keymap.c | 126 +++++++++ 5 files changed, 444 insertions(+) create mode 100644 keyboards/mzmkb/slimdash/info.json create mode 100644 keyboards/mzmkb/slimdash/readme.md create mode 100644 keyboards/mzmkb/slimdash/rev1/config.h create mode 100644 keyboards/mzmkb/slimdash/rev1/keyboard.json create mode 100644 keyboards/mzmkb/slimdash/rev1/keymaps/default/keymap.c diff --git a/keyboards/mzmkb/slimdash/info.json b/keyboards/mzmkb/slimdash/info.json new file mode 100644 index 0000000000..ed8def5958 --- /dev/null +++ b/keyboards/mzmkb/slimdash/info.json @@ -0,0 +1,10 @@ +{ + "manufacturer": "mzmkb", + "maintainer": "mizma", + "bootloader": "rp2040", + "processor": "RP2040", + "split": { + "enabled": true + }, + "url": "https://github.com/mizma/slimdash" +} diff --git a/keyboards/mzmkb/slimdash/readme.md b/keyboards/mzmkb/slimdash/readme.md new file mode 100644 index 0000000000..8590472aae --- /dev/null +++ b/keyboards/mzmkb/slimdash/readme.md @@ -0,0 +1,41 @@ +# Slimdash + +![mzmkb/slimdash/rev1](https://i.imgur.com/ymf8ROw.jpeg) + +__SlimDash__ is a slim low profile split ortho-staggered keyboard inspired by omkbd/ErgoDash +with following key highlights: + +* Ortho-Staggered Split keyboard layout +* Slim body (20-22mm depending on key caps and rubber feet used) +* Rigid body structure +* Per-Key RGB LED Matrix lighting +* USB-C connector +* Easy build utilizing PCBA service for the harder SMT components +* Keyboard Maintainer: [mizma](https://github.com/mizma) +* Hardware Supported: [SlimDash](https://github.com/mizma/SlimDash/) +* Hardware Availability: Build your own using design data at [SlimDash](https://github.com/mizma/SlimDash/) + +Make example for this keyboard (after setting up your build environment): + + make mzmkb/slimdash/rev1:default + +Flashing example for this keyboard: + + make mzmkb/slimdash/rev1:default:flash + +You may also enter Bootloader on your keyboard, and copy the `mzmkb_slimdash_*_*.uf2` +file into the `RPI-RP2` drive shown in your PC. + +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: + +* __Reset button__: Double-tap the RESET button on the side of the keyboard near + TRRS jack. +* __Physical reset button__: Hold BOOT_SW and press RESET on the side of the keyboard + near TRRS jack. +* __Keycode in layout__: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/mzmkb/slimdash/rev1/config.h b/keyboards/mzmkb/slimdash/rev1/config.h new file mode 100644 index 0000000000..4c77e71b78 --- /dev/null +++ b/keyboards/mzmkb/slimdash/rev1/config.h @@ -0,0 +1,28 @@ +/* Copyright 2025 mizma (@mizma) + * + * 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 + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode +#define SERIAL_USART_TX_PIN GP17 // USART TX pin +#define SERIAL_USART_RX_PIN GP18 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + diff --git a/keyboards/mzmkb/slimdash/rev1/keyboard.json b/keyboards/mzmkb/slimdash/rev1/keyboard.json new file mode 100644 index 0000000000..c9549c903b --- /dev/null +++ b/keyboards/mzmkb/slimdash/rev1/keyboard.json @@ -0,0 +1,239 @@ +{ + "keyboard_name": "slimdash rev1.0", + "diode_direction": "COL2ROW", + "features": { + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true, + }, + "matrix_pins": { + "cols": ["GP0", "GP1", "GP3", "GP5", "GP8", "GP7", "GP9"], + "rows": ["GP2", "GP4", "GP6", "GP11", "GP10"] + }, + "rgb_matrix": { + "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, + "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, + "solid_color": 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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [3, 6], "x": 105, "y": 51, "flags": 4}, + {"matrix": [4, 6], "x": 105, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 90, "y": 51, "flags": 4}, + {"matrix": [4, 4], "x": 75, "y": 51, "flags": 4}, + {"matrix": [4, 3], "x": 45, "y": 51, "flags": 4}, + {"matrix": [4, 2], "x": 30, "y": 51, "flags": 4}, + {"matrix": [4, 1], "x": 15, "y": 51, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 51, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 38, "flags": 4}, + {"matrix": [3, 1], "x": 15, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 30, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 45, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 60, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 75, "y": 38, "flags": 4}, + {"matrix": [2, 6], "x": 90, "y": 26, "flags": 4}, + {"matrix": [1, 6], "x": 90, "y": 13, "flags": 4}, + {"matrix": [2, 5], "x": 75, "y": 26, "flags": 4}, + {"matrix": [2, 4], "x": 60, "y": 26, "flags": 4}, + {"matrix": [2, 3], "x": 45, "y": 26, "flags": 4}, + {"matrix": [2, 2], "x": 30, "y": 26, "flags": 4}, + {"matrix": [2, 1], "x": 15, "y": 26, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 26, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 13, "flags": 4}, + {"matrix": [1, 1], "x": 15, "y": 13, "flags": 4}, + {"matrix": [1, 2], "x": 30, "y": 13, "flags": 4}, + {"matrix": [1, 3], "x": 45, "y": 13, "flags": 4}, + {"matrix": [1, 4], "x": 60, "y": 13, "flags": 4}, + {"matrix": [1, 5], "x": 75, "y": 13, "flags": 4}, + {"matrix": [0, 6], "x": 90, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 75, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 60, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 45, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 30, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 15, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [8, 6], "x": 119, "y": 51, "flags": 4}, + {"matrix": [9, 6], "x": 119, "y": 64, "flags": 4}, + {"matrix": [9, 5], "x": 134, "y": 51, "flags": 4}, + {"matrix": [9, 4], "x": 149, "y": 51, "flags": 4}, + {"matrix": [9, 3], "x": 179, "y": 51, "flags": 4}, + {"matrix": [9, 2], "x": 194, "y": 51, "flags": 4}, + {"matrix": [9, 1], "x": 209, "y": 51, "flags": 4}, + {"matrix": [9, 0], "x": 224, "y": 51, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 38, "flags": 4}, + {"matrix": [8, 1], "x": 209, "y": 38, "flags": 4}, + {"matrix": [8, 2], "x": 194, "y": 38, "flags": 4}, + {"matrix": [8, 3], "x": 179, "y": 38, "flags": 4}, + {"matrix": [8, 4], "x": 164, "y": 38, "flags": 4}, + {"matrix": [8, 5], "x": 149, "y": 38, "flags": 4}, + {"matrix": [7, 6], "x": 134, "y": 26, "flags": 4}, + {"matrix": [6, 6], "x": 134, "y": 13, "flags": 4}, + {"matrix": [7, 5], "x": 149, "y": 26, "flags": 4}, + {"matrix": [7, 4], "x": 164, "y": 26, "flags": 4}, + {"matrix": [7, 3], "x": 179, "y": 26, "flags": 4}, + {"matrix": [7, 2], "x": 194, "y": 26, "flags": 4}, + {"matrix": [7, 1], "x": 209, "y": 26, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 26, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 13, "flags": 4}, + {"matrix": [6, 1], "x": 209, "y": 13, "flags": 4}, + {"matrix": [6, 2], "x": 194, "y": 13, "flags": 4}, + {"matrix": [6, 3], "x": 179, "y": 13, "flags": 4}, + {"matrix": [6, 4], "x": 164, "y": 13, "flags": 4}, + {"matrix": [6, 5], "x": 149, "y": 13, "flags": 4}, + {"matrix": [5, 6], "x": 134, "y": 0, "flags": 4}, + {"matrix": [5, 5], "x": 149, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 164, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 179, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 194, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 209, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 0, "flags": 4} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [35, 35] + }, + "split": { + "matrix_pins": { + "right": { + "cols": ["GP0", "GP1", "GP3", "GP5", "GP8", "GP7", "GP9"], + "rows": ["GP2", "GP4", "GP6", "GP11", "GP10"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x7344", + "vid": "0x4D5A" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP20" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.375}, + {"matrix": [0, 1], "x": 1, "y": 0.375}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [0, 6], "x": 6, "y": 0.75}, + {"matrix": [5, 6], "x": 11.5, "y": 0.75}, + {"matrix": [5, 5], "x": 12.5, "y": 0.25}, + {"matrix": [5, 4], "x": 13.5, "y": 0.125}, + {"matrix": [5, 3], "x": 14.5, "y": 0}, + {"matrix": [5, 2], "x": 15.5, "y": 0.125}, + {"matrix": [5, 1], "x": 16.5, "y": 0.375}, + {"matrix": [5, 0], "x": 17.5, "y": 0.375}, + {"matrix": [1, 0], "x": 0, "y": 1.375}, + {"matrix": [1, 1], "x": 1, "y": 1.375}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.75}, + {"matrix": [6, 6], "x": 11.5, "y": 1.75}, + {"matrix": [6, 5], "x": 12.5, "y": 1.25}, + {"matrix": [6, 4], "x": 13.5, "y": 1.125}, + {"matrix": [6, 3], "x": 14.5, "y": 1}, + {"matrix": [6, 2], "x": 15.5, "y": 1.125}, + {"matrix": [6, 1], "x": 16.5, "y": 1.375}, + {"matrix": [6, 0], "x": 17.5, "y": 1.375}, + {"matrix": [2, 0], "x": 0, "y": 2.375}, + {"matrix": [2, 1], "x": 1, "y": 2.375}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.25}, + {"matrix": [2, 6], "x": 6, "y": 2.75}, + {"matrix": [7, 6], "x": 11.5, "y": 2.75}, + {"matrix": [7, 5], "x": 12.5, "y": 2.25}, + {"matrix": [7, 4], "x": 13.5, "y": 2.125}, + {"matrix": [7, 3], "x": 14.5, "y": 2}, + {"matrix": [7, 2], "x": 15.5, "y": 2.125}, + {"matrix": [7, 1], "x": 16.5, "y": 2.375}, + {"matrix": [7, 0], "x": 17.5, "y": 2.375}, + {"matrix": [3, 0], "x": 0, "y": 3.375}, + {"matrix": [3, 1], "x": 1, "y": 3.375}, + {"matrix": [3, 2], "x": 2, "y": 3.125}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3.125}, + {"matrix": [3, 5], "x": 5, "y": 3.25}, + {"matrix": [3, 6], "x": 7.25, "y": 4}, + {"matrix": [8, 6], "x": 10.25, "y": 4}, + {"matrix": [8, 5], "x": 12.5, "y": 3.25}, + {"matrix": [8, 4], "x": 13.5, "y": 3.125}, + {"matrix": [8, 3], "x": 14.5, "y": 3}, + {"matrix": [8, 2], "x": 15.5, "y": 3.125}, + {"matrix": [8, 1], "x": 16.5, "y": 3.375}, + {"matrix": [8, 0], "x": 17.5, "y": 3.375}, + {"matrix": [4, 0], "x": 0, "y": 4.375}, + {"matrix": [4, 1], "x": 1, "y": 4.375}, + {"matrix": [4, 2], "x": 2, "y": 4.125}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 5.25, "y": 5}, + {"matrix": [4, 5], "x": 6.25, "y": 4, "h": 2}, + {"matrix": [4, 6], "x": 7.25, "y": 5}, + {"matrix": [9, 6], "x": 10.25, "y": 5}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "h": 2}, + {"matrix": [9, 4], "x": 12.25, "y": 5}, + {"matrix": [9, 3], "x": 14.5, "y": 4}, + {"matrix": [9, 2], "x": 15.5, "y": 4.125}, + {"matrix": [9, 1], "x": 16.5, "y": 4.375}, + {"matrix": [9, 0], "x": 17.5, "y": 4.375} + ] + } + } +} diff --git a/keyboards/mzmkb/slimdash/rev1/keymaps/default/keymap.c b/keyboards/mzmkb/slimdash/rev1/keymaps/default/keymap.c new file mode 100644 index 0000000000..f43ac674a8 --- /dev/null +++ b/keyboards/mzmkb/slimdash/rev1/keymaps/default/keymap.c @@ -0,0 +1,126 @@ +/* Copyright 2025 mizma (@mizma) + * + * 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 + +enum layer_names { + _QWERTY, + _GAMEMODE, + _LOWER, + _RAISE +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define GAMEM TG(_GAMEMODE) + +#define EISU LALT(KC_GRV) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,------------------------------------------------. .------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | LCTL | A | S | D | F | G | Del | | Ins | H | J | K | L | ; | ' | + * |------+------+------+------+------+------+------. .------+------+------+------+------+------+------| + * | LSFT | Z | X | C | V | B | | N | M | , | . | / | RSFT | + * |------+------+------+------+------+--+---+--+------. .------+--+---+--+------+------+------+------+------| + * | RM_DN| RM_UP| GAMEM| GUI | | | LALT | | RALT | | | HOME | END |PageUp|PageDn| + * .---------------------------. .------| Space|------| |------| Enter|------. .---------------------------. + * | Lower| | LSFT | | RCTL | | Raise| + * .--------------------. .--------------------. + */ + [_QWERTY] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, 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_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_DEL , KC_INS, 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_LALT, KC_RALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + RM_VALD, RM_VALU, GAMEM, KC_LGUI, LOWER, KC_SPC, KC_LSFT, KC_RCTL, KC_ENT, RAISE, KC_HOME, KC_END, KC_PGUP, KC_PGDN + ), + + /* Game Mode Toggle: sample toggle layer. turn off GUI key and add arrows + * ,------------------------------------------------. .------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * |------+------+------+------+------+------+------. .------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+--+---+--+------. .------+--+---+--+------+------+------+------+------| + * | | | | NOOP | | | | | | | | ← | ↓ | ↑ | → | + * .---------------------------. .------| |------| |------| |------. .---------------------------. + * | | | | | | | | + * .--------------------. .--------------------. + */ + [_GAMEMODE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, KC_NO, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + /* Lower: NUMPAD, App/Media keys and RGM Matrix + * ,------------------------------------------------. .------------------------------------------------. + * | ` | | | | | Mute | Vol- | | Vol+ | | NumL | / | * | - | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | |RGBTGL| | BrDn | | BrUp | | 7 | 8 | 9 | + | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | CAPS | | |RM_HUD|RM_HUU| |RM_PRV| |RM_NXT| | 4 | 5 | 6 | , | | + * |------+------+------+------+------+------+------. .------+------+------+------+------+------+------| + * | | | |RM_SPD|RM_SPU| | | | 1 | 2 | 3 | = | | + * |------+------+------+------+------+--+---+--+------. .------+--+---+--+------+------+------+------+------| + * | | | | | | | | | | | | 0 | . | | | + * .---------------------------. .------| |------| |------| PENT |------. .---------------------------. + * | | | | | | | | + * .--------------------. .--------------------. + */ + [_LOWER] = LAYOUT( + KC_GRV, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, _______, + _______, _______, _______, _______, RM_TOGG, _______, KC_BRID, KC_BRIU, _______, KC_P7, KC_P8, KC_P9, KC_PPLS, _______, + KC_CAPS, _______, _______, RM_HUED, RM_HUEU, _______, RM_PREV, RM_NEXT, _______, KC_P4, KC_P5, KC_P6, KC_PCMM, _______, + _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PEQL, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PENT, _______, KC_P0, KC_PDOT, _______, _______ + ), + + /* Raise: Functions and Mouse + * ,------------------------------------------------. .------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | |WheelL|WheelR| | | | | | | Pause|ScrolL| PrnSc| F12 | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | CAPS | |Mouse3|Mouse2|Mouse1|WheelU| | | | ← | ↓ | ↑ | → | | | + * |------+------+------+------+------+------+------. .------+------+------+------+------+------+------| + * | |Accel0|Accel1|Accel2| |WheelD| |MouseL|MouseD|MouseU|MouseR| | | + * |------+------+------+------+------+--+---+--+------. .------+--+---+--+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * .---------------------------. .------| |------| |------| |------. .---------------------------. + * | | | | | | | | + * .--------------------. .--------------------. + */ + [_RAISE] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, _______, _______, MS_WHLL, MS_WHLR, _______, _______, _______, _______, _______, KC_PAUS, KC_SCRL, KC_PSCR, KC_F12, + KC_CAPS, _______, MS_BTN3, MS_BTN2, MS_BTN1, MS_WHLU, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, MS_WHLD, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + From 1fd0139b91cdc52f62947de0785f27e1b6351e9d Mon Sep 17 00:00:00 2001 From: hen-des <141591967+hen-des@users.noreply.github.com> Date: Mon, 28 Apr 2025 07:28:22 +0200 Subject: [PATCH 334/592] Added new keyboard epssp75 (#24756) Co-authored-by: Drashna Jaelre --- .../handwired/hen_des/epssp75/keyboard.json | 107 ++++++++++++++++++ .../hen_des/epssp75/keymaps/default/keymap.c | 21 ++++ keyboards/handwired/hen_des/epssp75/readme.md | 18 +++ 3 files changed, 146 insertions(+) create mode 100644 keyboards/handwired/hen_des/epssp75/keyboard.json create mode 100644 keyboards/handwired/hen_des/epssp75/keymaps/default/keymap.c create mode 100644 keyboards/handwired/hen_des/epssp75/readme.md diff --git a/keyboards/handwired/hen_des/epssp75/keyboard.json b/keyboards/handwired/hen_des/epssp75/keyboard.json new file mode 100644 index 0000000000..4d0739b800 --- /dev/null +++ b/keyboards/handwired/hen_des/epssp75/keyboard.json @@ -0,0 +1,107 @@ +{ + "manufacturer": "Henning Cordes", + "keyboard_name": "epssp75", + "maintainer": "hen-des", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP16", "GP17", "GP18", "GP19", "GP20", "GP21", "GP22"], + "rows": ["GP1", "GP2", "GP3", "GP4", "GP5"] + }, + "processor": "RP2040", + "url": "https://hen-des.github.io/epssp75/", + "usb": { + "device_version": "1.0.0", + "pid": "0x0075", + "vid": "0x6863" + }, + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 9], "x": 8.5, "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": [0, 15], "x": 15, "y": 0}, + {"matrix": [0, 16], "x": 16, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 8], "x": 7.25, "y": 1, "w": 2.5}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1}, + {"matrix": [1, 14], "x": 14, "y": 1}, + {"matrix": [1, 15], "x": 15, "y": 1}, + {"matrix": [1, 16], "x": 16, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2, "h": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2, "h": 2}, + {"matrix": [2, 11], "x": 11, "y": 2}, + {"matrix": [2, 12], "x": 12, "y": 2}, + {"matrix": [2, 13], "x": 13, "y": 2}, + {"matrix": [2, 14], "x": 14, "y": 2}, + {"matrix": [2, 15], "x": 15, "y": 2}, + {"matrix": [2, 16], "x": 16, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3}, + {"matrix": [3, 9], "x": 9, "y": 3}, + {"matrix": [3, 11], "x": 11, "y": 3}, + {"matrix": [3, 12], "x": 12, "y": 3}, + {"matrix": [3, 13], "x": 13, "y": 3}, + {"matrix": [3, 14], "x": 14, "y": 3}, + {"matrix": [3, 15], "x": 15, "y": 3}, + {"matrix": [3, 16], "x": 16, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 5], "x": 4, "y": 4, "w": 2}, + {"matrix": [4, 6], "x": 6, "y": 4, "h": 2}, + {"matrix": [4, 10], "x": 10, "y": 4, "h": 2}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 2}, + {"matrix": [4, 13], "x": 13, "y": 4}, + {"matrix": [4, 14], "x": 14, "y": 4}, + {"matrix": [4, 15], "x": 15, "y": 4}, + {"matrix": [4, 16], "x": 16, "y": 4} + ] + } + } +} diff --git a/keyboards/handwired/hen_des/epssp75/keymaps/default/keymap.c b/keyboards/handwired/hen_des/epssp75/keymaps/default/keymap.c new file mode 100644 index 0000000000..65c6508e0a --- /dev/null +++ b/keyboards/handwired/hen_des/epssp75/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F22, KC_RBRC, KC_PSCR, KC_F23, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_F20, KC_ENT, KC_F21, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_DEL, KC_HOME, KC_UP, KC_END, KC_BSPC, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LEFT, KC_DOWN, KC_RGHT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_NUBS, KC_SPC, KC_LSFT, KC_ENT, KC_SPC, KC_RALT, MO(1), RGUI_T(KC_APP), KC_RCTL + ), + [1] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F22, KC_PAUS, KC_PSCR, KC_F23, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TAB, KC_PGUP, LCTL(KC_LEFT), KC_UP, LCTL(KC_RGHT), KC_PGDN, KC_F20, KC_ENT, KC_F21, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F12, + KC_CAPS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_DEL, KC_HOME, KC_VOLU, KC_END, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_RSFT, LCA(KC_F2), KC_TAB, KC_F2, KC_F5, KC_F23, KC_MUTE, KC_VOLD, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_NUBS, KC_SPC, KC_LSFT, KC_ENT, KC_SPC, KC_RALT, _______, KC_APP, KC_RCTL + ) +}; diff --git a/keyboards/handwired/hen_des/epssp75/readme.md b/keyboards/handwired/hen_des/epssp75/readme.md new file mode 100644 index 0000000000..5c353d215b --- /dev/null +++ b/keyboards/handwired/hen_des/epssp75/readme.md @@ -0,0 +1,18 @@ +# epssp75 + +Ergonomic PSeudo SPlit 75-key Keyboard. Desinged after two years of working with a [Truly Ergonomic CLEAVE Keyboard](https://trulyergonomic.com) and also inspired by the [Redox Keyboard](https://github.com/mattdibi/redox-keyboard). +I am using and the [NOTED](https://neo-layout.org/Layouts/noted/) layout and the [ReNeo](https://neo-layout.org/Einrichtung/reneo/) software which offers additional possible key functions and layers. + +* Keyboard Maintainer: [Henning Cordes](https://github.com/hen-des) +* Files: [https://github.com/hen-des/epssp75](https://github.com/hen-des/epssp75) + +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). + +Detailed [description](https://hen-des.github.io/epssp75/index.html) and expiriences of the conception and manufacturing. + +## Bootloader + +Enter the bootloader in 2 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 \ No newline at end of file From 2e648d7e488b1ff060f803e569e68b6cc0b5d780 Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Mon, 28 Apr 2025 14:55:51 +0900 Subject: [PATCH 335/592] Addition of OK-1 (#24646) Co-authored-by: Joel Challis Co-authored-by: Drashna Jaelre --- keyboards/cipulot/ok_1/config.h | 25 ++ keyboards/cipulot/ok_1/halconf.h | 22 ++ keyboards/cipulot/ok_1/keyboard.json | 255 ++++++++++++++++++ .../cipulot/ok_1/keymaps/default/keymap.c | 90 +++++++ keyboards/cipulot/ok_1/mcuconf.h | 22 ++ keyboards/cipulot/ok_1/readme.md | 25 ++ keyboards/cipulot/ok_1/rules.mk | 2 + 7 files changed, 441 insertions(+) create mode 100644 keyboards/cipulot/ok_1/config.h create mode 100644 keyboards/cipulot/ok_1/halconf.h create mode 100644 keyboards/cipulot/ok_1/keyboard.json create mode 100644 keyboards/cipulot/ok_1/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/ok_1/mcuconf.h create mode 100644 keyboards/cipulot/ok_1/readme.md create mode 100644 keyboards/cipulot/ok_1/rules.mk diff --git a/keyboards/cipulot/ok_1/config.h b/keyboards/cipulot/ok_1/config.h new file mode 100644 index 0000000000..64700a1aff --- /dev/null +++ b/keyboards/cipulot/ok_1/config.h @@ -0,0 +1,25 @@ +/* Copyright 2024 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_COMPLEMENTARY_OUTPUT +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 1 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM5 +#define WS2812_DMA_CHANNEL 6 diff --git a/keyboards/cipulot/ok_1/halconf.h b/keyboards/cipulot/ok_1/halconf.h new file mode 100644 index 0000000000..33477f45bd --- /dev/null +++ b/keyboards/cipulot/ok_1/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 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_PAL TRUE +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cipulot/ok_1/keyboard.json b/keyboards/cipulot/ok_1/keyboard.json new file mode 100644 index 0000000000..2457f22fd8 --- /dev/null +++ b/keyboards/cipulot/ok_1/keyboard.json @@ -0,0 +1,255 @@ +{ + "manufacturer": "Cipulot", + "keyboard_name": "OK-1", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["B10", "B2", "B1", "B0", "A7", "A6", "A5", "A1", "A0", "F1", "F0", "C15", "A4", "A3"], + "rows": ["B11", "A2", "B9", "B8", "B7", "B6"] + }, + "processor": "STM32F072", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "rgb_matrix": { + "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, + "fractal": 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_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": 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, + "typing_heatmap": true + }, + "default": { + "animation": "rainbow_moving_chevron" + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 13], "x": 205, "y": 0, "flags": 1}, + {"matrix": [0, 12], "x": 187, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 172, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 157, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 142, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 127, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 97, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 82, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 67, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 52, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 37, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 22, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 4, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 13, "flags": 4}, + {"matrix": [1, 1], "x": 15, "y": 13, "flags": 4}, + {"matrix": [1, 2], "x": 30, "y": 13, "flags": 4}, + {"matrix": [1, 3], "x": 45, "y": 13, "flags": 4}, + {"matrix": [1, 4], "x": 60, "y": 13, "flags": 4}, + {"matrix": [1, 5], "x": 75, "y": 13, "flags": 4}, + {"matrix": [1, 6], "x": 90, "y": 13, "flags": 4}, + {"matrix": [1, 7], "x": 105, "y": 13, "flags": 4}, + {"matrix": [1, 8], "x": 119, "y": 13, "flags": 4}, + {"matrix": [1, 9], "x": 134, "y": 13, "flags": 4}, + {"matrix": [1, 10], "x": 149, "y": 13, "flags": 4}, + {"matrix": [1, 11], "x": 164, "y": 13, "flags": 4}, + {"matrix": [1, 12], "x": 179, "y": 13, "flags": 4}, + {"matrix": [1, 13], "x": 202, "y": 13, "flags": 1}, + {"matrix": [2, 13], "x": 205, "y": 26, "flags": 4}, + {"matrix": [2, 12], "x": 187, "y": 26, "flags": 4}, + {"matrix": [2, 11], "x": 172, "y": 26, "flags": 4}, + {"matrix": [2, 10], "x": 157, "y": 26, "flags": 4}, + {"matrix": [2, 9], "x": 142, "y": 26, "flags": 4}, + {"matrix": [2, 8], "x": 127, "y": 26, "flags": 4}, + {"matrix": [2, 7], "x": 112, "y": 26, "flags": 4}, + {"matrix": [2, 6], "x": 97, "y": 26, "flags": 4}, + {"matrix": [2, 5], "x": 82, "y": 26, "flags": 4}, + {"matrix": [2, 4], "x": 67, "y": 26, "flags": 4}, + {"matrix": [2, 3], "x": 52, "y": 26, "flags": 4}, + {"matrix": [2, 2], "x": 37, "y": 26, "flags": 4}, + {"matrix": [2, 1], "x": 22, "y": 26, "flags": 4}, + {"matrix": [2, 0], "x": 4, "y": 26, "flags": 1}, + {"matrix": [3, 0], "x": 6, "y": 38, "flags": 8}, + {"matrix": [3, 1], "x": 26, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 41, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 56, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 71, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 86, "y": 38, "flags": 4}, + {"matrix": [3, 6], "x": 101, "y": 38, "flags": 4}, + {"matrix": [3, 7], "x": 116, "y": 38, "flags": 4}, + {"matrix": [3, 8], "x": 131, "y": 38, "flags": 4}, + {"matrix": [3, 9], "x": 146, "y": 38, "flags": 4}, + {"matrix": [3, 10], "x": 161, "y": 38, "flags": 4}, + {"matrix": [3, 11], "x": 175, "y": 38, "flags": 4}, + {"matrix": [3, 12], "x": 200, "y": 38, "flags": 1}, + {"matrix": [4, 12], "x": 209, "y": 51, "flags": 1}, + {"matrix": [4, 11], "x": 189, "y": 51, "flags": 1}, + {"matrix": [4, 10], "x": 168, "y": 51, "flags": 4}, + {"matrix": [4, 9], "x": 153, "y": 51, "flags": 4}, + {"matrix": [4, 8], "x": 138, "y": 51, "flags": 4}, + {"matrix": [4, 7], "x": 123, "y": 51, "flags": 4}, + {"matrix": [4, 6], "x": 108, "y": 51, "flags": 4}, + {"matrix": [4, 5], "x": 93, "y": 51, "flags": 4}, + {"matrix": [4, 4], "x": 78, "y": 51, "flags": 4}, + {"matrix": [4, 3], "x": 63, "y": 51, "flags": 4}, + {"matrix": [4, 2], "x": 49, "y": 51, "flags": 4}, + {"matrix": [4, 1], "x": 34, "y": 51, "flags": 4}, + {"matrix": [4, 0], "x": 9, "y": 51, "flags": 4}, + {"matrix": [5, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 15, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 30, "y": 64, "flags": 1}, + {"matrix": [5, 3], "x": 47, "y": 64, "flags": 1}, + {"matrix": [5, 6], "x": 103, "y": 64, "flags": 4}, + {"matrix": [5, 9], "x": 159, "y": 64, "flags": 1}, + {"matrix": [5, 10], "x": 177, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 194, "y": 64, "flags": 1}, + {"matrix": [5, 12], "x": 209, "y": 64, "flags": 1}, + {"matrix": [5, 13], "x": 224, "y": 64, "flags": 1} + ], + "sleep": true + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x6BCA", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "ws2812": { + "driver": "pwm", + "pin": "B13" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [0, 2], "x": 2.5, "y": 0}, + {"matrix": [0, 3], "x": 3.5, "y": 0}, + {"matrix": [0, 4], "x": 4.5, "y": 0}, + {"matrix": [0, 5], "x": 5.5, "y": 0}, + {"matrix": [0, 6], "x": 6.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 10.5, "y": 0}, + {"matrix": [0, 11], "x": 11.5, "y": 0}, + {"matrix": [0, 12], "x": 12.5, "y": 0}, + {"matrix": [0, 13], "x": 13.5, "y": 0, "w": 1.5}, + {"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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [1, 12], "x": 12, "y": 1}, + {"matrix": [1, 13], "x": 13, "y": 1, "w": 2}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 6.5, "y": 2}, + {"matrix": [2, 7], "x": 7.5, "y": 2}, + {"matrix": [2, 8], "x": 8.5, "y": 2}, + {"matrix": [2, 9], "x": 9.5, "y": 2}, + {"matrix": [2, 10], "x": 10.5, "y": 2}, + {"matrix": [2, 11], "x": 11.5, "y": 2}, + {"matrix": [2, 12], "x": 12.5, "y": 2}, + {"matrix": [2, 13], "x": 13.5, "y": 2, "w": 1.5}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3}, + {"matrix": [3, 2], "x": 2.75, "y": 3}, + {"matrix": [3, 3], "x": 3.75, "y": 3}, + {"matrix": [3, 4], "x": 4.75, "y": 3}, + {"matrix": [3, 5], "x": 5.75, "y": 3}, + {"matrix": [3, 6], "x": 6.75, "y": 3}, + {"matrix": [3, 7], "x": 7.75, "y": 3}, + {"matrix": [3, 8], "x": 8.75, "y": 3}, + {"matrix": [3, 9], "x": 9.75, "y": 3}, + {"matrix": [3, 10], "x": 10.75, "y": 3}, + {"matrix": [3, 11], "x": 11.75, "y": 3}, + {"matrix": [3, 12], "x": 12.75, "y": 3, "w": 2.25}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25}, + {"matrix": [4, 1], "x": 2.25, "y": 4}, + {"matrix": [4, 2], "x": 3.25, "y": 4}, + {"matrix": [4, 3], "x": 4.25, "y": 4}, + {"matrix": [4, 4], "x": 5.25, "y": 4}, + {"matrix": [4, 5], "x": 6.25, "y": 4}, + {"matrix": [4, 6], "x": 7.25, "y": 4}, + {"matrix": [4, 7], "x": 8.25, "y": 4}, + {"matrix": [4, 8], "x": 9.25, "y": 4}, + {"matrix": [4, 9], "x": 10.25, "y": 4}, + {"matrix": [4, 10], "x": 11.25, "y": 4}, + {"matrix": [4, 11], "x": 12.25, "y": 4, "w": 1.75}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [5, 0], "x": 0, "y": 5}, + {"matrix": [5, 1], "x": 1, "y": 5}, + {"matrix": [5, 2], "x": 2, "y": 5}, + {"matrix": [5, 3], "x": 3, "y": 5, "w": 1.25}, + {"matrix": [5, 6], "x": 4.25, "y": 5, "w": 6.25}, + {"matrix": [5, 9], "x": 10.5, "y": 5, "w": 1.25}, + {"matrix": [5, 10], "x": 11.75, "y": 5, "w": 1.25}, + {"matrix": [5, 11], "x": 13, "y": 5}, + {"matrix": [5, 12], "x": 14, "y": 5}, + {"matrix": [5, 13], "x": 15, "y": 5} + ] + } + } +} diff --git a/keyboards/cipulot/ok_1/keymaps/default/keymap.c b/keyboards/cipulot/ok_1/keymaps/default/keymap.c new file mode 100644 index 0000000000..ceadc4c064 --- /dev/null +++ b/keyboards/cipulot/ok_1/keymaps/default/keymap.c @@ -0,0 +1,90 @@ +/* Copyright 2024 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 +enum layers{ + _MAC_BASE, + _MAC_FN, + _WIN_BASE, + _WIN_FN +}; + +enum custom_keycodes { + SNIP = SAFE_RANGE, +}; +// clang-format on + +#define MAC PDF(_MAC_BASE) +#define WIN PDF(_WIN_BASE) + +#define MACFN MO(_MAC_FN) +#define WINFN MO(_WIN_FN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [_MAC_BASE] = LAYOUT( + 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_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_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, KC_UP, + MACFN, KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, KC_RCMD, KC_ROPT, KC_LEFT, KC_DOWN, KC_RIGHT + ), + [_MAC_FN] = LAYOUT( + _______, KC_BRID, KC_BRIU, KC_MCTL, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, SNIP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, WIN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_PREV + ), + [_WIN_BASE] = LAYOUT( + 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_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_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, KC_UP, + WINFN, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RIGHT + ), + [_WIN_FN] = LAYOUT( + _______, KC_BRID, KC_BRIU, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, SNIP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, NK_TOGG, MAC, _______, _______, _______, _______, RM_VALU, + _______, _______, _______, _______, _______, _______, _______, RM_PREV, RM_VALD, RM_PREV + ), + // clang-format on +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case SNIP: + if (record->event.pressed) { + if (IS_LAYER_ON(_WIN_FN)) { + tap_code(KC_PSCR); + } else if (IS_LAYER_ON(_MAC_FN)) { + tap_code16(LSFT(LGUI(KC_3))); + } + } + return false; + + default: + return true; + } +} diff --git a/keyboards/cipulot/ok_1/mcuconf.h b/keyboards/cipulot/ok_1/mcuconf.h new file mode 100644 index 0000000000..e65368bf26 --- /dev/null +++ b/keyboards/cipulot/ok_1/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 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/ok_1/readme.md b/keyboards/cipulot/ok_1/readme.md new file mode 100644 index 0000000000..aa003326d9 --- /dev/null +++ b/keyboards/cipulot/ok_1/readme.md @@ -0,0 +1,25 @@ +# OK-1 + +OK-1 is a low profile keyboard. + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: OK-1 +* Hardware Availability: TBD + +Make example for this keyboard (after setting up your build environment): + + make cipulot/ok_1:default + +Flashing example for this keyboard: + + make cipulot/ok_1: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/ok_1/rules.mk b/keyboards/cipulot/ok_1/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/cipulot/ok_1/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From 3de04e0386a1a632374d5703c43029a41013c005 Mon Sep 17 00:00:00 2001 From: josephawilliamsiv <31166673+josephawilliamsiv@users.noreply.github.com> Date: Mon, 28 Apr 2025 02:02:30 -0400 Subject: [PATCH 336/592] Add Umbra keyboard (#24569) Co-authored-by: Duncan Sutherland Co-authored-by: Ryan Co-authored-by: Drashna Jaelre --- keyboards/umbra/hotswap/config.h | 20 + keyboards/umbra/hotswap/keyboard.json | 250 ++++ .../umbra/hotswap/keymaps/default/keymap.c | 40 + .../umbra/hotswap/keymaps/default/rules.mk | 1 + keyboards/umbra/hotswap/matrix_diagram.md | 24 + keyboards/umbra/hotswap/readme.md | 26 + keyboards/umbra/hotswap/rules.mk | 2 + keyboards/umbra/solder/config.h | 20 + keyboards/umbra/solder/keyboard.json | 1235 +++++++++++++++++ .../umbra/solder/keymaps/default/keymap.c | 40 + .../umbra/solder/keymaps/default/rules.mk | 1 + keyboards/umbra/solder/matrix_diagram.md | 37 + keyboards/umbra/solder/readme.md | 26 + keyboards/umbra/solder/rules.mk | 2 + keyboards/umbra/solder/solder.c | 35 + keyboards/umbra/solder/solder.h | 22 + 16 files changed, 1781 insertions(+) create mode 100644 keyboards/umbra/hotswap/config.h create mode 100644 keyboards/umbra/hotswap/keyboard.json create mode 100644 keyboards/umbra/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/umbra/hotswap/keymaps/default/rules.mk create mode 100644 keyboards/umbra/hotswap/matrix_diagram.md create mode 100644 keyboards/umbra/hotswap/readme.md create mode 100644 keyboards/umbra/hotswap/rules.mk create mode 100644 keyboards/umbra/solder/config.h create mode 100644 keyboards/umbra/solder/keyboard.json create mode 100644 keyboards/umbra/solder/keymaps/default/keymap.c create mode 100644 keyboards/umbra/solder/keymaps/default/rules.mk create mode 100644 keyboards/umbra/solder/matrix_diagram.md create mode 100644 keyboards/umbra/solder/readme.md create mode 100644 keyboards/umbra/solder/rules.mk create mode 100644 keyboards/umbra/solder/solder.c create mode 100644 keyboards/umbra/solder/solder.h diff --git a/keyboards/umbra/hotswap/config.h b/keyboards/umbra/hotswap/config.h new file mode 100644 index 0000000000..56ca17df40 --- /dev/null +++ b/keyboards/umbra/hotswap/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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_EXTERNAL_PULLUP + diff --git a/keyboards/umbra/hotswap/keyboard.json b/keyboards/umbra/hotswap/keyboard.json new file mode 100644 index 0000000000..4b53432caa --- /dev/null +++ b/keyboards/umbra/hotswap/keyboard.json @@ -0,0 +1,250 @@ +{ + "manufacturer": "IV Works", + "keyboard_name": "Umbra", + "maintainer": "IV Works", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A2", "pin_b": "A1", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "extrakey": true, + "key_lock": true, + "mousekey": true, + "encoder": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["B2", "A4", "A3", "A0", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"], + "rows": ["B14", "A9", "B6", "B5", "B4"] + }, + "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 + }, + "led_count": 17 + }, + "url": "https://iv-works.com/i", + "usb": { + "device_version": "0.0.5", + "pid": "0x0102", + "vid": "0x7786" + }, + "ws2812": { + "pin": "A8" + }, + "community_layouts": ["60_ansi_tsangan_split_bs_rshift", "60_hhkb"], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [1, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 4], "x":4, "y":4, "w":3}, + {"label": "Space", "matrix": [4, 6], "x":7, "y":4}, + {"label": "Space", "matrix": [4, 8], "x":8, "y":4, "w":3}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [1, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w": 7}, + {"label": "Alt", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 12], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_hhkb": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [1, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Bsp", "matrix": [2, 12], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Ctrl", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [3, 13], "x": 14, "y": 3}, + {"label": "Alt", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Win", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w": 7}, + {"label": "Win", "matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 12], "x": 12.5, "y": 4} + ] + } + } +} diff --git a/keyboards/umbra/hotswap/keymaps/default/keymap.c b/keyboards/umbra/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..9562681cb2 --- /dev/null +++ b/keyboards/umbra/hotswap/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// main layer +[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_BSLS, 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_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_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL), +// basic function layer +[1] = LAYOUT_all( + QK_BOOT, 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_TRNS, KC_DEL, + KC_TRNS, UG_TOGG, KC_UP, UG_NEXT, UG_PREV, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, KC_HOME, KC_PGUP, KC_VOLU, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_VOLD, + KC_TRNS, KC_SLEP, KC_MYCM, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_MPLY, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; +#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(KC_PGDN, KC_PGUP) } +}; +#endif diff --git a/keyboards/umbra/hotswap/keymaps/default/rules.mk b/keyboards/umbra/hotswap/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/umbra/hotswap/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/umbra/hotswap/matrix_diagram.md b/keyboards/umbra/hotswap/matrix_diagram.md new file mode 100644 index 0000000000..a3ff87cd21 --- /dev/null +++ b/keyboards/umbra/hotswap/matrix_diagram.md @@ -0,0 +1,24 @@ +# Matrix Diagram for IV Works Umbra Hotswap + +``` + ┌───────┐ + 2u Backspace │1D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │1D │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │2C │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │ +├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ +│30 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │ +├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┼───┴┬────┬┴───┤ +│40 │41 │42 │46 │4B │4C │4D │ Tsangan/WKL/HHKB +└────┴────┴────┴─────────────────────────────┴────┴────┴────┘ +┌─────┬───┬─────┬───────────┬───┬───────────┬─────┬───┬─────┐ +│40 │41 │42 │44 │46 │48 │4B │4C │4D │ 7u split spacebar +└─────┴───┴─────┴───────────┴───┴───────────┴─────┴───┴─────┘ +┌─────┬───┬───────────────────────────────────────┬───┬─────┐ +│40 │41 │46 │4C │4D │ 10u Spacebar +└─────┴───┴───────────────────────────────────────┴───┴─────┘ +``` diff --git a/keyboards/umbra/hotswap/readme.md b/keyboards/umbra/hotswap/readme.md new file mode 100644 index 0000000000..bf86db069b --- /dev/null +++ b/keyboards/umbra/hotswap/readme.md @@ -0,0 +1,26 @@ +# UMBRA + +![UMBRA](https://i.imgur.com/2d94i6H.jpg) + +A multi-mount 60% keyboard with PCB choice featuring popular layouts, underglow, and rotary option. + +* Keyboard Maintainer: [IV Works](https://www.iv-works.com/) +* Hardware Supported: [UMBRA](https://www.iv-works.com/i) +* Hardware Availability: [Shop](https://iv-works.com/product-category/umbra/) + +Make example for this keyboard (after setting up your build environment): + + make umbra/hotswap:default + +Flashing example for this keyboard: + + make umbra/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 + +How to enter bootloader (DFU): +* PCB will arrive flashed. With USB plugged in press Fn+Esc to enter DFU. Flash the firmware and replug the USB cable to fresh boot the PCB. + +* If that method fails please locate the RESET header on the back of the PCB just right of the MCU. Short the 2 plated holes for 2 seconds to enter DFU. Flash the firmware and replug the USB cable to fresh boot the PCB. \ No newline at end of file diff --git a/keyboards/umbra/hotswap/rules.mk b/keyboards/umbra/hotswap/rules.mk new file mode 100644 index 0000000000..04fe1eba2a --- /dev/null +++ b/keyboards/umbra/hotswap/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -p FFFF -v FFFF diff --git a/keyboards/umbra/solder/config.h b/keyboards/umbra/solder/config.h new file mode 100644 index 0000000000..56ca17df40 --- /dev/null +++ b/keyboards/umbra/solder/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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_EXTERNAL_PULLUP + diff --git a/keyboards/umbra/solder/keyboard.json b/keyboards/umbra/solder/keyboard.json new file mode 100644 index 0000000000..4f014b2e94 --- /dev/null +++ b/keyboards/umbra/solder/keyboard.json @@ -0,0 +1,1235 @@ +{ + "manufacturer": "IV Works", + "keyboard_name": "Umbra", + "maintainer": "IV Works", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A2", "pin_b": "A1", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "extrakey": true, + "key_lock": true, + "mousekey": true, + "encoder": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["B2", "A5", "A4", "A3", "F1", "F0", "C15", "C14", "C13", "B9", "B8", "B7", "A15", "B3"], + "rows": ["B14", "A9", "B6", "B5", "B4"] + }, + "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 + }, + "led_count": 17 + }, + "url": "https://iv-works.com/", + "usb": { + "device_version": "0.0.5", + "pid": "0x0101", + "vid": "0x7786" + }, + "ws2812": { + "pin": "A8" + }, + "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_ansi_tsangan", "60_ansi_tsangan_split_bs_rshift", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso", "60_iso_split_bs_rshift", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"], + "layouts": { + "LAYOUT_60_ansi": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_hhkb": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4} + ] + }, + "LAYOUT_60_ansi_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_tsangan": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 1], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_wkl": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_wkl_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 1], "x": 0, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 2], "x": 1.5, "y": 4}, + {"label": "Alt", "matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Win", "matrix": [4, 11], "x": 12.5, "y": 4}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_wkl_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 1], "x": 0, "y": 4, "w": 1.5}, + {"label": "Alt", "matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5}, + {"label": "Space", "matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"label": "Alt", "matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_6u_ansi": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4}, + {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6}, + {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4}, + {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4}, + {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5} + ] + }, + "LAYOUT_6u_ansi_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4}, + {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6}, + {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4}, + {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4}, + {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5} + ] + }, + "LAYOUT_6u_iso": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 13, "y": 0, "w": 2}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4}, + {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6}, + {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4}, + {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4}, + {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5} + ] + }, + "LAYOUT_6u_iso_split_bs_rshift": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "~", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x":0, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 1], "x":1.5, "y":4}, + {"label": "Alt", "matrix": [4, 2], "x":2.5, "y":4, "w":1.5}, + {"label": "Space", "matrix": [4, 6], "x":4, "y":4, "w":6}, + {"label": "Alt", "matrix": [4, 9], "x":10, "y":4, "w":1.5}, + {"label": "Win", "matrix": [4, 10], "x":11.5, "y":4}, + {"label": "Menu", "matrix": [4, 11], "x":12.5, "y":4}, + {"label": "Fn", "matrix": [4, 12], "x":13.5, "y":4, "w":1.5} + ] + }, + "LAYOUT_all": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "!", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "@", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "#", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "$", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "%", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "^", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "&", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "*", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "(", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": ")", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "_", "matrix": [0, 11], "x": 11, "y": 0}, + {"label": "+", "matrix": [0, 12], "x": 12, "y": 0}, + {"label": "|", "matrix": [0, 13], "x": 13, "y": 0}, + {"label": "Backspace", "matrix": [2, 13], "x": 14, "y": 0}, + {"label": "Tab", "matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [1, 9], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [1, 10], "x": 10.5, "y": 1}, + {"label": "{", "matrix": [1, 11], "x": 11.5, "y": 1}, + {"label": "}", "matrix": [1, 12], "x": 12.5, "y": 1}, + {"label": "|", "matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [2, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [2, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [2, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [2, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [2, 7], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [2, 8], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [2, 9], "x": 9.75, "y": 2}, + {"label": ":", "matrix": [2, 10], "x": 10.75, "y": 2}, + {"label": "\"", "matrix": [2, 11], "x": 11.75, "y": 2}, + {"label": "NUHS", "matrix": [2, 12], "x": 12.75, "y": 2}, + {"label": "Enter", "matrix": [3, 13], "x": 13.75, "y": 2, "w": 1.25}, + {"label": "Shift", "matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "NUBS", "matrix": [3, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [3, 2], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [3, 8], "x": 8.25, "y": 3}, + {"label": "<", "matrix": [3, 9], "x": 9.25, "y": 3}, + {"label": ">", "matrix": [3, 10], "x": 10.25, "y": 3}, + {"label": "?", "matrix": [3, 11], "x": 11.25, "y": 3}, + {"label": "Shift", "matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"label": "Fn", "matrix": [4, 13], "x": 14, "y": 3}, + {"label": "Ctrl", "matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 4], "x": 3.75, "y": 4, "w": 2.25}, + {"label": "Space", "matrix": [4, 6], "x": 6, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 8], "x": 7.25, "y": 4, "w": 2.75}, + {"label": "Alt", "matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"label": "Menu", "matrix": [4, 11], "x": 12.5, "y": 4, "w": 1.25}, + {"label": "Ctrl", "matrix": [4, 12], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/umbra/solder/keymaps/default/keymap.c b/keyboards/umbra/solder/keymaps/default/keymap.c new file mode 100644 index 0000000000..d987b42da9 --- /dev/null +++ b/keyboards/umbra/solder/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// main layer +[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_BSLS, 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_NUHS, KC_ENT, + 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, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL), +// basic function layer +[1] = LAYOUT_all( + QK_BOOT, 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_TRNS, KC_DEL, + KC_TRNS, UG_TOGG, KC_UP, UG_NEXT, UG_PREV, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, KC_HOME, KC_PGUP, KC_VOLU, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_VOLD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_SLEP, KC_MYCM, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_MPLY, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; +#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(KC_PGDN, KC_PGUP) } +}; +#endif diff --git a/keyboards/umbra/solder/keymaps/default/rules.mk b/keyboards/umbra/solder/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/umbra/solder/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/umbra/solder/matrix_diagram.md b/keyboards/umbra/solder/matrix_diagram.md new file mode 100644 index 0000000000..4135960202 --- /dev/null +++ b/keyboards/umbra/solder/matrix_diagram.md @@ -0,0 +1,37 @@ +# Matrix Diagram for IV Works Umbra Solder + +``` + ┌───────┐ + 2u Backspace │2D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │2D │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ┌─────┐ +│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ┌──┴┐3D │ +│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │3D │ │2C │ │ +├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ └───┴────┘ +│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │4D │ ISO Enter +├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴───┼───┴┬────┬┴───┤ +│40 │41 │42 │44 │46 │48 │49 │4A │4B │4C │ +└────┴────┴────┴────────┴────┴──────────┴────┴────┴────┴────┘ +┌────────┐ ┌──────────┐ +│30 │ 2.25u LShift 2.75u RShift │3C │ +└────────┘ └──────────┘ +┌────┬────┬────┬────────────────────────┬────┬────┬────┬────┐ +│40 │41 │42 │46 │49 │4A │4B │4C │ Standard +└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐ +│40 │41 │42 │46 │4A │4B │4C │ Tsangan/WKL/HHKB +└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +┌─────┬───┬─────┬───────────────────────┬─────┬───┬───┬─────┐ +│40 │41 │42 │46 │49 │4A │4B │4C │ 6U bottom row +└─────┴───┴─────┴───────────────────────┴─────┴───┴───┴─────┘ +┌─────┬───┬─────┬──────────┬──────┬─────────┬─────┬───┬─────┐ +│40 │41 │42 │44 │46 │48 │4A │4B │4C │ 3U split space +└─────┴───┴─────┴──────────┴──────┴─────────┴─────┴───┴─────┘ +┌─────┬───┬───────────────────────────────────────┬───┬─────┐ +│40 │41 │46 │4B │4C │ 10U space +└─────┴───┴───────────────────────────────────────┴───┴─────┘ + +``` diff --git a/keyboards/umbra/solder/readme.md b/keyboards/umbra/solder/readme.md new file mode 100644 index 0000000000..61a564578b --- /dev/null +++ b/keyboards/umbra/solder/readme.md @@ -0,0 +1,26 @@ +# UMBRA + +![UMBRA](https://i.imgur.com/2d94i6H.jpg) + +A multi-mount 60% keyboard with PCB choice featuring popular layouts, underglow, and rotary option. + +* Keyboard Maintainer: [IV Works](https://www.iv-works.com/) +* Hardware Supported: [UMBRA](https://www.iv-works.com/i) +* Hardware Availability: [Shop](https://iv-works.com/product-category/umbra/) + +Make example for this keyboard (after setting up your build environment): + + make umbra/solder:default + +Flashing example for this keyboard: + + make umbra/solder: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 + +How to enter bootloader (DFU): +* PCB will arrive flashed. With USB plugged in press Fn+Esc to enter DFU. Flash the firmware and replug the USB cable to fresh boot the PCB. + +* If that method fails please locate the RESET header on the back of the PCB just right of the MCU. Short the 2 plated holes for 2 seconds to enter DFU. Flash the firmware and replug the USB cable to fresh boot the PCB. \ No newline at end of file diff --git a/keyboards/umbra/solder/rules.mk b/keyboards/umbra/solder/rules.mk new file mode 100644 index 0000000000..04fe1eba2a --- /dev/null +++ b/keyboards/umbra/solder/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -p FFFF -v FFFF diff --git a/keyboards/umbra/solder/solder.c b/keyboards/umbra/solder/solder.c new file mode 100644 index 0000000000..ef7581deab --- /dev/null +++ b/keyboards/umbra/solder/solder.c @@ -0,0 +1,35 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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 "solder.h" + +void keyboard_pre_init_kb(void) { + rgblight_set_effect_range(0, 16); + keyboard_pre_init_user(); +} + +bool led_update_kb(led_t led_state) { + bool res = led_update_user(led_state); + if (CAPS_LOCK_ENABLE && res) { + if(led_state.caps_lock) { + rgblight_sethsv_at(CAPS_LOCK_COLOR, 16); + } + else{ + rgblight_sethsv_at(HSV_OFF, 16); + } + } + return res; +} diff --git a/keyboards/umbra/solder/solder.h b/keyboards/umbra/solder/solder.h new file mode 100644 index 0000000000..4a82a87a09 --- /dev/null +++ b/keyboards/umbra/solder/solder.h @@ -0,0 +1,22 @@ +/* +Copyright 2024 Joseph Williams IV "IV Works" + +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 "quantum.h" + +#define CAPS_LOCK_ENABLE true +#define CAPS_LOCK_COLOR HSV_GREEN From 4e2191ce20564e520b27248513cdfc5aac897ab6 Mon Sep 17 00:00:00 2001 From: vchowl Date: Mon, 28 Apr 2025 11:38:13 +0530 Subject: [PATCH 337/592] Amptrics 0420 keyboard addition (#24744) Co-authored-by: jack Co-authored-by: Drashna Jaelre Co-authored-by: Ryan --- keyboards/amptrics/0422/0422.c | 67 +++++++++++++++++++ keyboards/amptrics/0422/config.h | 5 ++ keyboards/amptrics/0422/keyboard.json | 40 +++++++++++ .../amptrics/0422/keymaps/default/keymap.c | 58 ++++++++++++++++ keyboards/amptrics/0422/readme.md | 25 +++++++ 5 files changed, 195 insertions(+) create mode 100644 keyboards/amptrics/0422/0422.c create mode 100644 keyboards/amptrics/0422/config.h create mode 100644 keyboards/amptrics/0422/keyboard.json create mode 100644 keyboards/amptrics/0422/keymaps/default/keymap.c create mode 100644 keyboards/amptrics/0422/readme.md diff --git a/keyboards/amptrics/0422/0422.c b/keyboards/amptrics/0422/0422.c new file mode 100644 index 0000000000..034151b5b8 --- /dev/null +++ b/keyboards/amptrics/0422/0422.c @@ -0,0 +1,67 @@ +/* Copyright 2024 Vinod Chowl (@vchowl) + * + * 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.0 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 + +#define LED_LAYER_0 B3 +#define LED_LAYER_1 B4 +#define LED_LAYER_2 B5 +#define LED_LAYER_3 B6 + +#define LED_PINS_COUNT 4 + +pin_t pins[LED_PINS_COUNT] = {LED_LAYER_0, LED_LAYER_1, LED_LAYER_2, LED_LAYER_3}; + + +// Function to turn on all LEDs +void turn_on_all_leds(void) { + for (int i = 0; i < LED_PINS_COUNT; i++) { + gpio_write_pin_high(pins[i]); // Turn on LED + } +} + +// Function to turn off all LEDs +void turn_off_all_leds(void) { + for (int i = 0; i < LED_PINS_COUNT; i++) { + gpio_write_pin_low(pins[i]); // Turn off LED + } +} + +void update_leds_for_layer(uint8_t layer) { + turn_off_all_leds(); + gpio_write_pin_high(pins[layer]); +} + +void keyboard_post_init_kb(void) { + for (int i = 0; i < LED_PINS_COUNT; i++) { + gpio_set_pin_output(pins[i]); + gpio_write_pin_low(pins[i]); + } + + // Blink all LEDs + turn_on_all_leds(); + wait_ms(500); // Keep LEDs on for 500ms + turn_off_all_leds(); + + update_leds_for_layer(0); // Update LEDs to indicate the default layer + keyboard_post_init_user(); +} + +layer_state_t layer_state_set_kb(layer_state_t state) { + uint8_t layer = get_highest_layer(state); + update_leds_for_layer(layer); + return layer_state_set_user(state); +} diff --git a/keyboards/amptrics/0422/config.h b/keyboards/amptrics/0422/config.h new file mode 100644 index 0000000000..e9c1eed8b9 --- /dev/null +++ b/keyboards/amptrics/0422/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define DYNAMIC_KEYMAP_MACRO_COUNT 36 diff --git a/keyboards/amptrics/0422/keyboard.json b/keyboards/amptrics/0422/keyboard.json new file mode 100644 index 0000000000..669e355264 --- /dev/null +++ b/keyboards/amptrics/0422/keyboard.json @@ -0,0 +1,40 @@ +{ + "manufacturer": "Amptrics Technologies", + "keyboard_name": "Amptrics 0422", + "maintainer": "vchowl", + "bootloader": "stm32-dfu", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["C8", "C7", "C6"], + "rows": ["A14", "A13", "A10", "A9"] + }, + "processor": "STM32F072", + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x01A6", + "vid": "0x616D" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3} + ] + } + } +} diff --git a/keyboards/amptrics/0422/keymaps/default/keymap.c b/keyboards/amptrics/0422/keymaps/default/keymap.c new file mode 100644 index 0000000000..ef36a65835 --- /dev/null +++ b/keyboards/amptrics/0422/keymaps/default/keymap.c @@ -0,0 +1,58 @@ +/* Copyright 2024 Vinod Chowl (@vchowl) + * + * 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.0 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┐ + * │Tog│ + * ├───┼───┬───┐ + * │ 7 │ 8 │ 9 │ + * ├───┼───┼───┤ + * │ 4 │ 5 │ 6 │ + * ├───┼───┼───┤ + * │ 1 │ 2 │ 3 │ + * └───┴───┴───┘ + */ + [0] = LAYOUT( + TO(1), + KC_7, KC_8, KC_9, + KC_4, KC_5, KC_6, + KC_1, KC_2, KC_3 + ), + + [1] = LAYOUT( + TO(2), + KC_A, KC_B, KC_C, + KC_D, KC_E, KC_F, + KC_G, KC_H, KC_I + ), + + [2] = LAYOUT( + TO(3), + KC_J, KC_K, KC_L, + KC_M, KC_N, KC_O, + KC_P, KC_Q, KC_R + ), + + [3] = LAYOUT( + TO(0), + KC_S, KC_T, KC_U, + KC_V, KC_W, KC_X, + KC_Y, KC_Z, KC_ENT + ) +}; diff --git a/keyboards/amptrics/0422/readme.md b/keyboards/amptrics/0422/readme.md new file mode 100644 index 0000000000..7d900f9b58 --- /dev/null +++ b/keyboards/amptrics/0422/readme.md @@ -0,0 +1,25 @@ +# Amptrics 0422 Programmable Keypad + +![magtray4x3](https://i.imgur.com/G5QMlpn_d.jpeg) + +* Keyboard Maintainer: [vchowl](https://github.com/vchowl) +* Hardware Supported: STM32F072RBT6 +* Hardware Availability: Not yet available. + +Make example for this keyboard (after setting up your build environment): + + make amptrics/0422:default + +Flashing example for this keyboard: + + make amptrics/0422: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 c26449e64f18940c0a57e459eeae465b26502b64 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Mon, 28 Apr 2025 00:52:20 -0700 Subject: [PATCH 338/592] [Core] Enhance Flow Tap to work better for rolls over multiple tap-hold keys. (#25200) * Flow Tap revision for rolling press. * Remove debugging cruft. * Formatting fix. --- quantum/action_tapping.c | 57 +- .../permissive_hold_flow_tap/config.h | 23 + .../permissive_hold_flow_tap/test.mk | 17 + .../permissive_hold_flow_tap/test_keymap.c | 22 + .../test_one_shot_keys.cpp | 174 ++++ .../test_tap_hold.cpp | 911 ++++++++++++++++++ .../flow_tap/test_tap_hold.cpp | 204 +++- 7 files changed, 1395 insertions(+), 13 deletions(-) create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/config.h create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test.mk create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_keymap.c create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_one_shot_keys.cpp create mode 100644 tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_tap_hold.cpp diff --git a/quantum/action_tapping.c b/quantum/action_tapping.c index 3e391d1526..b105cd60a9 100644 --- a/quantum/action_tapping.c +++ b/quantum/action_tapping.c @@ -103,10 +103,11 @@ __attribute__((weak)) bool get_hold_on_other_key_press(uint16_t keycode, keyreco # endif # if defined(FLOW_TAP_TERM) -static uint32_t flow_tap_prev_time = 0; static uint16_t flow_tap_prev_keycode = KC_NO; +static uint16_t flow_tap_prev_time = 0; +static bool flow_tap_expired = true; -static bool flow_tap_key_if_within_term(keyrecord_t *record); +static bool flow_tap_key_if_within_term(keyrecord_t *record, uint16_t prev_time); # endif // defined(FLOW_TAP_TERM) static keyrecord_t tapping_key = {}; @@ -159,6 +160,12 @@ void action_tapping_process(keyrecord_t record) { } if (IS_EVENT(record.event)) { ac_dprintf("\n"); + } else { +# ifdef FLOW_TAP_TERM + if (!flow_tap_expired && TIMER_DIFF_16(record.event.time, flow_tap_prev_time) >= INT16_MAX / 2) { + flow_tap_expired = true; + } +# endif // FLOW_TAP_TERM } } @@ -240,7 +247,7 @@ bool process_tapping(keyrecord_t *keyp) { // into the "pressed" tapping key state # if defined(FLOW_TAP_TERM) - if (flow_tap_key_if_within_term(keyp)) { + if (flow_tap_key_if_within_term(keyp, flow_tap_prev_time)) { return true; } # endif // defined(FLOW_TAP_TERM) @@ -281,6 +288,27 @@ bool process_tapping(keyrecord_t *keyp) { // copy tapping state keyp->tap = tapping_key.tap; + +# if defined(FLOW_TAP_TERM) + // Now that tapping_key has settled as tapped, check whether + // Flow Tap applies to following yet-unsettled keys. + uint16_t prev_time = tapping_key.event.time; + for (; waiting_buffer_tail != waiting_buffer_head; waiting_buffer_tail = (waiting_buffer_tail + 1) % WAITING_BUFFER_SIZE) { + keyrecord_t *record = &waiting_buffer[waiting_buffer_tail]; + if (!record->event.pressed) { + break; + } + const int16_t next_time = record->event.time; + if (!is_tap_record(record)) { + process_record(record); + } else if (!flow_tap_key_if_within_term(record, prev_time)) { + break; + } + prev_time = next_time; + } + debug_waiting_buffer(); +# endif // defined(FLOW_TAP_TERM) + // enqueue return false; } @@ -557,7 +585,7 @@ bool process_tapping(keyrecord_t *keyp) { } else if (is_tap_record(keyp)) { // Sequential tap can be interfered with other tap key. # if defined(FLOW_TAP_TERM) - if (flow_tap_key_if_within_term(keyp)) { + if (flow_tap_key_if_within_term(keyp, flow_tap_prev_time)) { tapping_key = (keyrecord_t){0}; debug_tapping_key(); return true; @@ -791,11 +819,11 @@ static void waiting_buffer_process_regular(void) { # ifdef FLOW_TAP_TERM void flow_tap_update_last_event(keyrecord_t *record) { + const uint16_t keycode = get_record_keycode(record, false); // Don't update while a tap-hold key is unsettled. - if (waiting_buffer_tail != waiting_buffer_head || (tapping_key.event.pressed && tapping_key.tap.count == 0)) { + if (record->tap.count == 0 && (waiting_buffer_tail != waiting_buffer_head || (tapping_key.event.pressed && tapping_key.tap.count == 0))) { return; } - const uint16_t keycode = get_record_keycode(record, false); // Ignore releases of modifiers and held layer switches. if (!record->event.pressed) { switch (keycode) { @@ -826,20 +854,25 @@ void flow_tap_update_last_event(keyrecord_t *record) { } flow_tap_prev_keycode = keycode; - flow_tap_prev_time = timer_read32(); + flow_tap_prev_time = record->event.time; + flow_tap_expired = false; } -static bool flow_tap_key_if_within_term(keyrecord_t *record) { +static bool flow_tap_key_if_within_term(keyrecord_t *record, uint16_t prev_time) { + const uint16_t idle_time = TIMER_DIFF_16(record->event.time, prev_time); + if (flow_tap_expired || idle_time >= 500) { + return false; + } + const uint16_t keycode = get_record_keycode(record, false); if (is_mt_or_lt(keycode)) { - const uint32_t idle_time = timer_elapsed32(flow_tap_prev_time); - uint16_t term = get_flow_tap_term(keycode, record, flow_tap_prev_keycode); + uint16_t term = get_flow_tap_term(keycode, record, flow_tap_prev_keycode); if (term > 500) { term = 500; } - if (idle_time < 500 && idle_time < term) { + if (idle_time < term) { debug_event(record->event); - ac_dprintf(" within flow tap term (%u < %u) considered a tap\n", (int16_t)idle_time, term); + ac_dprintf(" within flow tap term (%u < %u) considered a tap\n", idle_time, term); record->tap.count = 1; registered_taps_add(record->event.key); debug_registered_taps(); diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/config.h b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/config.h new file mode 100644 index 0000000000..9267b94bec --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/config.h @@ -0,0 +1,23 @@ +/* Copyright 2022 Vladislav Kucheriavykh + * Copyright 2024-2025 Google LLC + * + * 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 "test_common.h" +#define CHORDAL_HOLD +#define PERMISSIVE_HOLD +#define FLOW_TAP_TERM 150 diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test.mk b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test.mk new file mode 100644 index 0000000000..2b049cea3b --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test.mk @@ -0,0 +1,17 @@ +# Copyright 2022 Vladislav Kucheriavykh +# Copyright 2024 Google LLC +# +# 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 . + +INTROSPECTION_KEYMAP_C = test_keymap.c diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_keymap.c b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_keymap.c new file mode 100644 index 0000000000..8a6a2c59b0 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_keymap.c @@ -0,0 +1,22 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "quantum.h" + +const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'*', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, + {'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R'}, +}; diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_one_shot_keys.cpp b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_one_shot_keys.cpp new file mode 100644 index 0000000000..e48cba73e2 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_one_shot_keys.cpp @@ -0,0 +1,174 @@ +/* Copyright 2021 Stefan Kerkmann + * Copyright 2024 Google LLC + * + * 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 "action_util.h" +#include "keyboard_report_util.hpp" +#include "test_common.hpp" + +using testing::_; +using testing::InSequence; + +class OneShot : public TestFixture {}; +class OneShotParametrizedTestFixture : public ::testing::WithParamInterface>, public OneShot {}; + +TEST_P(OneShotParametrizedTestFixture, OSMWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_P(OneShotParametrizedTestFixture, OSMAsRegularModifierWithAdditionalKeypress) { + TestDriver driver; + KeymapKey osm_key = GetParam().first; + KeymapKey regular_key = GetParam().second; + + set_keymap({osm_key, regular_key}); + + // Press OSM. + EXPECT_NO_REPORT(driver); + osm_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (osm_key.report_code)).Times(2); + EXPECT_REPORT(driver, (regular_key.report_code, osm_key.report_code)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSM. + EXPECT_EMPTY_REPORT(driver); + osm_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +// clang-format off + +INSTANTIATE_TEST_CASE_P( + OneShotModifierTests, + OneShotParametrizedTestFixture, + ::testing::Values( + // First is osm key, second is regular key. + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LSFT), KC_LSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LCTL), KC_LCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LALT), KC_LALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_LGUI), KC_LGUI}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RCTL), KC_RCTL}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RSFT), KC_RSFT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RALT), KC_RALT}, KeymapKey{0, 1, 1, KC_A}), + std::make_pair(KeymapKey{0, 0, 0, OSM(MOD_RGUI), KC_RGUI}, KeymapKey{0, 1, 1, KC_A}) + )); +// clang-format on + +TEST_F(OneShot, OSLWithAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osl_key1 = KeymapKey{1, 0, 0, KC_X}; + KeymapKey regular_key0 = KeymapKey{0, 1, 0, KC_Y}; + KeymapKey regular_key1 = KeymapKey{1, 1, 0, KC_A}; + + set_keymap({osl_key, osl_key1, regular_key0, regular_key1}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (regular_key1.report_code)); + EXPECT_EMPTY_REPORT(driver); + regular_key1.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_NO_REPORT(driver); + regular_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(OneShot, OSLWithOsmAndAdditionalKeypress) { + TestDriver driver; + InSequence s; + KeymapKey osl_key = KeymapKey{0, 0, 0, OSL(1)}; + KeymapKey osm_key = KeymapKey{1, 1, 0, OSM(MOD_LSFT), KC_LSFT}; + KeymapKey regular_key = KeymapKey{1, 1, 1, KC_A}; + KeymapKey blank_key = KeymapKey{1, 0, 0, KC_NO}; + + set_keymap({osl_key, osm_key, regular_key, blank_key}); + + // Press OSL key. + EXPECT_NO_REPORT(driver); + osl_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release OSL key. + EXPECT_NO_REPORT(driver); + osl_key.release(); + run_one_scan_loop(); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Press and release OSM. + EXPECT_NO_REPORT(driver); + tap_key(osm_key); + EXPECT_TRUE(layer_state_is(1)); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (osm_key.report_code, regular_key.report_code)); + EXPECT_EMPTY_REPORT(driver); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_tap_hold.cpp b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_tap_hold.cpp new file mode 100644 index 0000000000..05acb6f416 --- /dev/null +++ b/tests/tap_hold_configurations/chordal_hold/permissive_hold_flow_tap/test_tap_hold.cpp @@ -0,0 +1,911 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_report_util.hpp" +#include "keycode.h" +#include "test_common.hpp" +#include "action_tapping.h" +#include "test_fixture.hpp" +#include "test_keymap_key.hpp" + +using testing::_; +using testing::InSequence; + +class ChordalHoldPermissiveHoldFlowTap : public TestFixture {}; + +TEST_F(ChordalHoldPermissiveHoldFlowTap, chordal_hold_handedness) { + EXPECT_EQ(chordal_hold_handedness({.col = 0, .row = 0}), 'L'); + EXPECT_EQ(chordal_hold_handedness({.col = MATRIX_COLS - 1, .row = 0}), 'R'); + EXPECT_EQ(chordal_hold_handedness({.col = 0, .row = 2}), '*'); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, get_chordal_hold_default) { + auto make_record = [](uint8_t row, uint8_t col, keyevent_type_t type = KEY_EVENT) { + return keyrecord_t{ + .event = + { + .key = {.col = col, .row = row}, + .type = type, + .pressed = true, + }, + }; + }; + // Create two records on the left hand. + keyrecord_t record_l0 = make_record(0, 0); + keyrecord_t record_l1 = make_record(1, 0); + // Create a record on the right hand. + keyrecord_t record_r = make_record(0, MATRIX_COLS - 1); + + // Function should return true when records are on opposite hands. + EXPECT_TRUE(get_chordal_hold_default(&record_l0, &record_r)); + EXPECT_TRUE(get_chordal_hold_default(&record_r, &record_l0)); + // ... and false when on the same hand. + EXPECT_FALSE(get_chordal_hold_default(&record_l0, &record_l1)); + EXPECT_FALSE(get_chordal_hold_default(&record_l1, &record_l0)); + // But (2, 0) has handedness '*', for which true is returned for chords + // with either hand. + keyrecord_t record_l2 = make_record(2, 0); + EXPECT_TRUE(get_chordal_hold_default(&record_l2, &record_l0)); + EXPECT_TRUE(get_chordal_hold_default(&record_l2, &record_r)); + + // Create a record resulting from a combo. + keyrecord_t record_combo = make_record(0, 0, COMBO_EVENT); + // Function returns true in all cases. + EXPECT_TRUE(get_chordal_hold_default(&record_l0, &record_combo)); + EXPECT_TRUE(get_chordal_hold_default(&record_r, &record_combo)); + EXPECT_TRUE(get_chordal_hold_default(&record_combo, &record_l0)); + EXPECT_TRUE(get_chordal_hold_default(&record_combo, &record_r)); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, chord_nested_press_settled_as_hold) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Tap regular key. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_A)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + tap_key(regular_key); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, chord_rolled_press_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + // Regular key on the right hand. + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap key and regular key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, non_chord_with_mod_tap_settled_as_tap) { + TestDriver driver; + InSequence s; + // Mod-tap key and regular key both on the left hand. + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + auto regular_key = KeymapKey(0, 2, 0, KC_A); + + set_keymap({mod_tap_key, regular_key}); + + // Press mod-tap-hold key. + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_P)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap-hold key. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, tap_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_NO_REPORT(driver); + mod_tap_key.press(); + idle_for(TAPPING_TERM - 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_P)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, hold_mod_tap_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key = KeymapKey(0, 1, 0, SFT_T(KC_P)); + + set_keymap({mod_tap_key}); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, two_mod_taps_same_hand_hold_til_timeout) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, MATRIX_COLS - 2, 0, RCTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Continue holding til the tapping term. + EXPECT_REPORT(driver, (KC_RIGHT_CTRL)); + EXPECT_REPORT(driver, (KC_RIGHT_CTRL, KC_RIGHT_SHIFT)); + idle_for(TAPPING_TERM); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_RIGHT_SHIFT)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, two_mod_taps_nested_press_opposite_hands) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, two_mod_taps_nested_press_same_hand) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, RSFT_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, three_mod_taps_same_hand_streak_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, three_mod_taps_same_hand_streak_orders) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 3, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 2, 1. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 1, 2. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 2, 3, 1. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_A, KC_C)); + EXPECT_REPORT(driver, (KC_A)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_NO_REPORT(driver); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, three_mod_taps_opposite_hands_roll) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 1, 2, 3. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, three_mod_taps_two_left_one_right) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 2, then key 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 3. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_LEFT_CTRL)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release key 1, then key 2. + EXPECT_REPORT(driver, (KC_LEFT_CTRL)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, three_mod_taps_one_held_two_tapped) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 2, 0, CTL_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, MATRIX_COLS - 1, 0, RSFT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 2, 1. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys 3, 1, 2. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, two_mod_taps_one_regular_key) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, MATRIX_COLS - 2, 0, CTL_T(KC_B)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_C); + + set_keymap({mod_tap_key1, mod_tap_key2, regular_key}); + + // Press keys. + EXPECT_NO_REPORT(driver); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_C)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release keys. + EXPECT_REPORT(driver, (KC_LEFT_SHIFT)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_LEFT_SHIFT, KC_B)); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, tap_regular_key_while_layer_tap_key_is_held) { + TestDriver driver; + InSequence s; + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto no_key = KeymapKey(1, 1, 0, XXXXXXX); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, no_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + // Press regular key. + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, nested_tap_of_layer_0_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on layer 2 but regular keys on layer 1. + auto first_layer_tap_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_layer_tap_key = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_on_layer = KeymapKey(1, 1, 0, KC_B); + auto second_key_on_layer = KeymapKey(1, MATRIX_COLS - 1, 0, KC_Q); + + set_keymap({first_layer_tap_key, second_layer_tap_key, first_key_on_layer, second_key_on_layer}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.press(); + run_one_scan_loop(); + // Press second layer-tap key. + second_layer_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + second_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_layer_tap_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, lt_mt_one_regular_key) { + TestDriver driver; + InSequence s; + auto lt_key = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto mt_key0 = KeymapKey(0, 2, 0, SFT_T(KC_B)); + auto mt_key1 = KeymapKey(1, 2, 0, CTL_T(KC_C)); + auto regular_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_X); + auto no_key0 = KeymapKey(0, MATRIX_COLS - 1, 0, XXXXXXX); + auto no_key1 = KeymapKey(1, 1, 0, XXXXXXX); + + set_keymap({lt_key, mt_key0, mt_key1, regular_key, no_key0, no_key1}); + + // Press LT, MT, and regular key. + EXPECT_NO_REPORT(driver); + lt_key.press(); + run_one_scan_loop(); + mt_key1.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release the regular key. + EXPECT_REPORT(driver, (KC_LCTL)); + EXPECT_REPORT(driver, (KC_LCTL, KC_X)); + EXPECT_REPORT(driver, (KC_LCTL)); + regular_key.release(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), MOD_BIT_LCTRL); + EXPECT_EQ(layer_state, 2); + VERIFY_AND_CLEAR(driver); + + // Release MT key. + EXPECT_EMPTY_REPORT(driver); + mt_key1.release(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); + VERIFY_AND_CLEAR(driver); + + // Release LT key. + EXPECT_NO_REPORT(driver); + lt_key.release(); + run_one_scan_loop(); + EXPECT_EQ(layer_state, 0); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, nested_tap_of_layer_tap_keys) { + TestDriver driver; + InSequence s; + // The keys are layer-taps on all layers. + auto first_key_layer_0 = KeymapKey(0, 1, 0, LT(1, KC_A)); + auto second_key_layer_0 = KeymapKey(0, MATRIX_COLS - 1, 0, LT(1, KC_P)); + auto first_key_layer_1 = KeymapKey(1, 1, 0, LT(2, KC_B)); + auto second_key_layer_1 = KeymapKey(1, MATRIX_COLS - 1, 0, LT(2, KC_Q)); + auto first_key_layer_2 = KeymapKey(2, 1, 0, KC_TRNS); + auto second_key_layer_2 = KeymapKey(2, MATRIX_COLS - 1, 0, KC_TRNS); + + set_keymap({first_key_layer_0, second_key_layer_0, first_key_layer_1, second_key_layer_1, first_key_layer_2, second_key_layer_2}); + + // Press first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press second layer-tap key. + EXPECT_NO_REPORT(driver); + second_key_layer_0.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release second layer-tap key. + EXPECT_REPORT(driver, (KC_Q)); + EXPECT_EMPTY_REPORT(driver); + second_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first layer-tap key. + EXPECT_NO_REPORT(driver); + first_key_layer_0.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, roll_layer_tap_key_with_regular_key) { + TestDriver driver; + InSequence s; + + auto layer_tap_hold_key = KeymapKey(0, 1, 0, LT(1, KC_P)); + auto regular_key = KeymapKey(0, MATRIX_COLS - 1, 0, KC_A); + auto layer_key = KeymapKey(1, MATRIX_COLS - 1, 0, KC_B); + + set_keymap({layer_tap_hold_key, regular_key, layer_key}); + + // Press layer-tap-hold key. + EXPECT_NO_REPORT(driver); + layer_tap_hold_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Press regular key. + EXPECT_NO_REPORT(driver); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release layer-tap-hold key. + EXPECT_REPORT(driver, (KC_P)); + EXPECT_REPORT(driver, (KC_P, KC_A)); + EXPECT_REPORT(driver, (KC_A)); + layer_tap_hold_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release regular key. + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(ChordalHoldPermissiveHoldFlowTap, two_mod_tap_keys_stuttered_press) { + TestDriver driver; + InSequence s; + + auto mod_tap_key1 = KeymapKey(0, 1, 0, LSFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, LCTL_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + // Hold first mod-tap key until the tapping term. + EXPECT_REPORT(driver, (KC_LSFT)); + mod_tap_key1.press(); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Press the second mod-tap key, then quickly release and press the first. + EXPECT_NO_REPORT(driver); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_LSFT, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_REPORT(driver, (KC_B, KC_A)); + mod_tap_key1.press(); + run_one_scan_loop(); + EXPECT_EQ(get_mods(), 0); // Verify that Shift was released. + VERIFY_AND_CLEAR(driver); + + // Release both keys. + EXPECT_REPORT(driver, (KC_A)); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_EMPTY_REPORT(driver); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} diff --git a/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp index a4233f0d57..d419a3b313 100644 --- a/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp +++ b/tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp @@ -98,7 +98,7 @@ TEST_F(FlowTapTest, distinct_taps) { VERIFY_AND_CLEAR(driver); EXPECT_EMPTY_REPORT(driver); - idle_for(FLOW_TAP_TERM + 1); + idle_for(TAPPING_TERM + 1); mod_tap_key2.release(); idle_for(FLOW_TAP_TERM + 1); VERIFY_AND_CLEAR(driver); @@ -640,3 +640,205 @@ TEST_F(FlowTapTest, quick_tap) { run_one_scan_loop(); VERIFY_AND_CLEAR(driver); } + +TEST_F(FlowTapTest, rolling_mt_mt) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 1, 0, SFT_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 2, 0, CTL_T(KC_B)); + + set_keymap({mod_tap_key1, mod_tap_key2}); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for longer than the tapping term. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, rolling_lt_mt_regular) { + TestDriver driver; + InSequence s; + auto layer_tap_key = KeymapKey(0, 0, 0, LT(1, KC_A)); + auto mod_tap_key = KeymapKey(0, 1, 0, CTL_T(KC_B)); + auto regular_key = KeymapKey(0, 2, 0, KC_C); + + set_keymap({layer_tap_key, mod_tap_key, regular_key}); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + layer_tap_key.press(); + run_one_scan_loop(); + mod_tap_key.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B, KC_C)); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for longer than the tapping term. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key.release(); + run_one_scan_loop(); + regular_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, rolling_lt_regular_mt) { + TestDriver driver; + InSequence s; + auto layer_tap_key = KeymapKey(0, 0, 0, LT(1, KC_A)); + auto regular_key = KeymapKey(0, 1, 0, KC_B); + auto mod_tap_key = KeymapKey(0, 2, 0, CTL_T(KC_C)); + + set_keymap({layer_tap_key, regular_key, mod_tap_key}); + + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + layer_tap_key.press(); + run_one_scan_loop(); + regular_key.press(); + run_one_scan_loop(); + mod_tap_key.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B, KC_C)); + layer_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for longer than the tapping term. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release mod-tap keys. + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + regular_key.release(); + run_one_scan_loop(); + mod_tap_key.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, rolling_mt_mt_mt) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 0, 0, CTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 1, 0, GUI_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 2, 0, ALT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + run_one_scan_loop(); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first mod-tap key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_A, KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B, KC_C)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Hold for longer than the tapping term. + EXPECT_NO_REPORT(driver); + idle_for(TAPPING_TERM + 1); + VERIFY_AND_CLEAR(driver); + + // Release other mod-tap keys. + EXPECT_REPORT(driver, (KC_C)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key2.release(); + run_one_scan_loop(); + mod_tap_key3.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} + +TEST_F(FlowTapTest, roll_release_132) { + TestDriver driver; + InSequence s; + auto mod_tap_key1 = KeymapKey(0, 0, 0, CTL_T(KC_A)); + auto mod_tap_key2 = KeymapKey(0, 1, 0, GUI_T(KC_B)); + auto mod_tap_key3 = KeymapKey(0, 2, 0, ALT_T(KC_C)); + + set_keymap({mod_tap_key1, mod_tap_key2, mod_tap_key3}); + + // Press mod-tap keys. + EXPECT_NO_REPORT(driver); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key1.press(); + run_one_scan_loop(); + mod_tap_key2.press(); + idle_for(FLOW_TAP_TERM + 1); + mod_tap_key3.press(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release first mod-tap key. + EXPECT_REPORT(driver, (KC_A)); + EXPECT_REPORT(driver, (KC_A, KC_B)); + EXPECT_REPORT(driver, (KC_B)); + mod_tap_key1.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); + + // Release other mod-tap keys. + EXPECT_REPORT(driver, (KC_B, KC_C)); + EXPECT_REPORT(driver, (KC_B)); + EXPECT_EMPTY_REPORT(driver); + mod_tap_key3.release(); + run_one_scan_loop(); + mod_tap_key2.release(); + run_one_scan_loop(); + VERIFY_AND_CLEAR(driver); +} From 3cf328c64419db714c253eb764166c8cf3be2f17 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 28 Apr 2025 22:37:50 +0100 Subject: [PATCH 339/592] amptrics/0422 - Prevent OOB in `update_leds_for_layer` (#25209) --- keyboards/amptrics/0422/0422.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/keyboards/amptrics/0422/0422.c b/keyboards/amptrics/0422/0422.c index 034151b5b8..4c0ed2e5b8 100644 --- a/keyboards/amptrics/0422/0422.c +++ b/keyboards/amptrics/0422/0422.c @@ -23,30 +23,31 @@ #define LED_PINS_COUNT 4 -pin_t pins[LED_PINS_COUNT] = {LED_LAYER_0, LED_LAYER_1, LED_LAYER_2, LED_LAYER_3}; - +static pin_t pins[LED_PINS_COUNT] = {LED_LAYER_0, LED_LAYER_1, LED_LAYER_2, LED_LAYER_3}; // Function to turn on all LEDs void turn_on_all_leds(void) { - for (int i = 0; i < LED_PINS_COUNT; i++) { + for (uint8_t i = 0; i < LED_PINS_COUNT; i++) { gpio_write_pin_high(pins[i]); // Turn on LED } } // Function to turn off all LEDs void turn_off_all_leds(void) { - for (int i = 0; i < LED_PINS_COUNT; i++) { + for (uint8_t i = 0; i < LED_PINS_COUNT; i++) { gpio_write_pin_low(pins[i]); // Turn off LED } } void update_leds_for_layer(uint8_t layer) { turn_off_all_leds(); - gpio_write_pin_high(pins[layer]); + if (layer < LED_PINS_COUNT) { + gpio_write_pin_high(pins[layer]); + } } void keyboard_post_init_kb(void) { - for (int i = 0; i < LED_PINS_COUNT; i++) { + for (uint8_t i = 0; i < LED_PINS_COUNT; i++) { gpio_set_pin_output(pins[i]); gpio_write_pin_low(pins[i]); } From 45091b04736d07a4d751422cc302901ba52e1f58 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Thu, 1 May 2025 03:08:37 +0900 Subject: [PATCH 340/592] [Keyboard] Add Gravity-45(#25206) * add gravity-45 * readme.md * fix readme * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: jack <0x6a73@protonmail.com> * run qmk format-json -i keyboards/green_keys/gravity_45/keyboard.json * add url * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: Duncan Sutherland * Update keyboard.json * Update keyboard.json * Update keyboards/green_keys/gravity_45/keyboard.json Co-authored-by: Drashna Jaelre --------- Co-authored-by: jack <0x6a73@protonmail.com> Co-authored-by: Duncan Sutherland Co-authored-by: Drashna Jaelre --- keyboards/green_keys/gravity_45/keyboard.json | 95 +++++++++++++++++++ .../gravity_45/keymaps/default/keymap.c | 70 ++++++++++++++ keyboards/green_keys/gravity_45/readme.md | 37 ++++++++ 3 files changed, 202 insertions(+) create mode 100644 keyboards/green_keys/gravity_45/keyboard.json create mode 100644 keyboards/green_keys/gravity_45/keymaps/default/keymap.c create mode 100644 keyboards/green_keys/gravity_45/readme.md diff --git a/keyboards/green_keys/gravity_45/keyboard.json b/keyboards/green_keys/gravity_45/keyboard.json new file mode 100644 index 0000000000..762f3ebae6 --- /dev/null +++ b/keyboards/green_keys/gravity_45/keyboard.json @@ -0,0 +1,95 @@ +{ + "manufacturer": "GreenKeys", + "keyboard_name": "Gravity-45", + "maintainer": "takashicompany", + "processor": "RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["GP14", "GP15", "GP26", "GP27", "GP28", "GP29", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"], + "rows": ["GP10", "GP11", "GP12", "GP13"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "led_count": 1, + "max_brightness": 120 + }, + "url": "https://green-keys.info", + "usb": { + "device_version": "1.0.0", + "pid": "0x9121", + "vid": "0x1209" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP8" + }, + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 9.5, "y": 0}, + {"matrix": [0, 7], "x": 10.5, "y": 0}, + {"matrix": [0, 8], "x": 11.5, "y": 0}, + {"matrix": [0, 9], "x": 12.5, "y": 0}, + {"matrix": [0, 10], "x": 13.5, "y": 0}, + {"matrix": [0, 11], "x": 14.5, "y": 0}, + {"matrix": [1, 0], "x": 0.25, "y": 1}, + {"matrix": [1, 1], "x": 1.25, "y": 1}, + {"matrix": [1, 2], "x": 2.25, "y": 1}, + {"matrix": [1, 3], "x": 3.25, "y": 1}, + {"matrix": [1, 4], "x": 4.25, "y": 1}, + {"matrix": [1, 5], "x": 5.25, "y": 1}, + {"matrix": [3, 11], "x": 7.625, "y": 1.5}, + {"matrix": [1, 6], "x": 9.75, "y": 1}, + {"matrix": [1, 7], "x": 10.75, "y": 1}, + {"matrix": [1, 8], "x": 11.75, "y": 1}, + {"matrix": [1, 9], "x": 12.75, "y": 1}, + {"matrix": [1, 10], "x": 13.75, "y": 1}, + {"matrix": [1, 11], "x": 14.75, "y": 1}, + {"matrix": [2, 0], "x": 0.5, "y": 2}, + {"matrix": [2, 1], "x": 1.5, "y": 2}, + {"matrix": [2, 2], "x": 2.5, "y": 2}, + {"matrix": [2, 3], "x": 3.5, "y": 2}, + {"matrix": [2, 4], "x": 4.5, "y": 2}, + {"matrix": [2, 5], "x": 5.5, "y": 2}, + {"matrix": [2, 6], "x": 10, "y": 2}, + {"matrix": [2, 7], "x": 11, "y": 2}, + {"matrix": [2, 8], "x": 12, "y": 2}, + {"matrix": [2, 9], "x": 13, "y": 2}, + {"matrix": [2, 10], "x": 14, "y": 2}, + {"matrix": [2, 11], "x": 15, "y": 2}, + {"matrix": [3, 2], "x": 2.5, "y": 3}, + {"matrix": [3, 3], "x": 3.5, "y": 3, "w": 1.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3, "w": 1.25}, + {"matrix": [3, 5], "x": 6, "y": 3, "w": 1.25}, + {"matrix": [3, 6], "x": 9.75, "y": 3, "w": 1.25}, + {"matrix": [3, 7], "x": 11, "y": 3, "w": 1.25}, + {"matrix": [3, 8], "x": 12.25, "y": 3, "w": 1.25}, + {"matrix": [3, 9], "x": 13.5, "y": 3, "w": 1.25} + ] + } + } +} diff --git a/keyboards/green_keys/gravity_45/keymaps/default/keymap.c b/keyboards/green_keys/gravity_45/keymaps/default/keymap.c new file mode 100644 index 0000000000..b1031461d5 --- /dev/null +++ b/keyboards/green_keys/gravity_45/keymaps/default/keymap.c @@ -0,0 +1,70 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + KC_ESC, LT(7, KC_Q), KC_W, KC_E, LT(6, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LCTL, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, RGB_TOG, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_ENT, + KC_LSFT, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_DEL, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RALT, KC_RGUI + ), + + [1] = LAYOUT( + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_TRNS, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3, KC_TRNS, + KC_TRNS, LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT( + KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3), KC_TRNS, + KC_TRNS, KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_TRNS, KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [3] = LAYOUT( + KC_TRNS, LT(7, KC_Q), KC_W, KC_E, LT(6, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS, + KC_TRNS, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_TRNS, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_TRNS, + KC_TRNS, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_TRNS, + KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RALT, KC_RGUI + ), + + [4] = LAYOUT( + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_TRNS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3, KC_TRNS, + KC_TRNS, LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT( + KC_TRNS, KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS, KC_TRNS, + KC_TRNS, KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_TRNS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, + KC_TRNS, KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [6] = LAYOUT( + KC_TRNS, KC_ESC, KC_TAB, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, + KC_TRNS, KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [7] = LAYOUT( + KC_TRNS, KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [8] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, DF(0), DF(3), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/green_keys/gravity_45/readme.md b/keyboards/green_keys/gravity_45/readme.md new file mode 100644 index 0000000000..cdf98feab8 --- /dev/null +++ b/keyboards/green_keys/gravity_45/readme.md @@ -0,0 +1,37 @@ +# Gravity-45 + +![green_keys/gravity_45](https://i.imgur.com/FTyC65h.jpeg) + +Gravity-45 is a 45-key integrated keyboard. +It uses the Waveshare RP2040-Zero MCU. +Keyswitch sockets are used for easy keyswitch replacement. +The tight PCB outline lines allow for easy case design. + +--- + +Gravity-45 は 45キーの一体型のキーボードだ。 +MCUにはWaveshare RP2040-Zeroを採用している。 +キースイッチソケットを使用するためキースイッチの交換が容易に行える。 +PCBの外形線がタイトなので、ケースの設計が容易だ。 + +* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany) +* Hardware Supported: PCB, Waveshare RP2040-Zero +* Hardware Availability: [GreenKeys](https://green-keys.info/) + +Make example for this keyboard (after setting up your build environment): + + make green_keys/gravity_45:default + +Flashing example for this keyboard: + + make green_keys/gravity_45: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 4fb3cf0712dc20f23af634e56486a03ba4b4cf30 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 1 May 2025 15:02:17 +0100 Subject: [PATCH 341/592] Remove redundant keyboard headers (#25208) --- keyboards/4pplet/perk60_iso/rev_a/rev_a.c | 15 ++++++++++- keyboards/4pplet/perk60_iso/rev_a/rev_a.h | 23 ---------------- keyboards/4pplet/waffling60/rev_b/rev_b.c | 6 ++++- keyboards/4pplet/waffling60/rev_b/rev_b.h | 22 ---------------- keyboards/4pplet/waffling60/rev_c/rev_c.c | 6 ++++- keyboards/4pplet/waffling60/rev_c/rev_c.h | 22 ---------------- keyboards/4pplet/waffling60/rev_d/rev_d.c | 6 ++++- keyboards/4pplet/waffling60/rev_d/rev_d.h | 22 ---------------- keyboards/4pplet/waffling60/rev_e/rev_e.c | 10 ++++++- keyboards/4pplet/waffling60/rev_e/rev_e.h | 22 ---------------- keyboards/4pplet/waffling80/rev_a/rev_a.c | 14 +++++++++- keyboards/4pplet/waffling80/rev_a/rev_a.h | 26 ------------------- keyboards/4pplet/waffling80/rev_b/rev_b.c | 14 +++++++++- keyboards/4pplet/waffling80/rev_b/rev_b.h | 26 ------------------- .../4pplet/waffling80/rev_b_ansi/rev_b_ansi.c | 14 +++++++++- .../4pplet/waffling80/rev_b_ansi/rev_b_ansi.h | 26 ------------------- keyboards/lendunistus/rpneko65/rev1/config.h | 6 ----- keyboards/lendunistus/rpneko65/rev1/rev1.c | 4 +++ keyboards/umbra/solder/solder.c | 10 ++++++- keyboards/umbra/solder/solder.h | 22 ---------------- 20 files changed, 90 insertions(+), 226 deletions(-) delete mode 100644 keyboards/4pplet/perk60_iso/rev_a/rev_a.h delete mode 100644 keyboards/4pplet/waffling60/rev_b/rev_b.h delete mode 100644 keyboards/4pplet/waffling60/rev_c/rev_c.h delete mode 100644 keyboards/4pplet/waffling60/rev_d/rev_d.h delete mode 100644 keyboards/4pplet/waffling60/rev_e/rev_e.h delete mode 100644 keyboards/4pplet/waffling80/rev_a/rev_a.h delete mode 100644 keyboards/4pplet/waffling80/rev_b/rev_b.h delete mode 100644 keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.h delete mode 100644 keyboards/lendunistus/rpneko65/rev1/config.h delete mode 100644 keyboards/umbra/solder/solder.h diff --git a/keyboards/4pplet/perk60_iso/rev_a/rev_a.c b/keyboards/4pplet/perk60_iso/rev_a/rev_a.c index 2de3acc60d..c4ab064cb2 100644 --- a/keyboards/4pplet/perk60_iso/rev_a/rev_a.c +++ b/keyboards/4pplet/perk60_iso/rev_a/rev_a.c @@ -14,7 +14,20 @@ 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 "rev_a.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif + +#ifndef CAPS_LOCK_COLOR +# define CAPS_LOCK_COLOR RGB_RED +#endif + +#ifndef CAPS_LED_GROUP +// change what leds to target, for example LED_FLAG_KEYLIGHT for alpas or LED_FLAG_MODIFIER for modifiers +# define CAPS_LED_GROUP LED_FLAG_INDICATOR +#endif #ifdef RGB_MATRIX_ENABLE const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { diff --git a/keyboards/4pplet/perk60_iso/rev_a/rev_a.h b/keyboards/4pplet/perk60_iso/rev_a/rev_a.h deleted file mode 100644 index 2f4fa7531a..0000000000 --- a/keyboards/4pplet/perk60_iso/rev_a/rev_a.h +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" <4pplet@protonmail.com> - -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 CAPS_LOCK_ENABLE true -#define CAPS_LOCK_COLOR RGB_RED -#define CAPS_LED_GROUP LED_FLAG_INDICATOR // change what leds to target, for example LED_FLAG_KEYLIGHT for alpas or LED_FLAG_MODIFIER for modifiers - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling60/rev_b/rev_b.c b/keyboards/4pplet/waffling60/rev_b/rev_b.c index c03f3630e6..8923ba6f7d 100644 --- a/keyboards/4pplet/waffling60/rev_b/rev_b.c +++ b/keyboards/4pplet/waffling60/rev_b/rev_b.c @@ -14,7 +14,11 @@ 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 "rev_b.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling60/rev_b/rev_b.h b/keyboards/4pplet/waffling60/rev_b/rev_b.h deleted file mode 100644 index 57a4964202..0000000000 --- a/keyboards/4pplet/waffling60/rev_b/rev_b.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2020 Stefan Sundin "4pplet" <4pplet@protonmail.com> - -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 CAPS_LOCK_ENABLE true -//#define CAPS_LOCK_COLOR HSV_ORANGE - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling60/rev_c/rev_c.c b/keyboards/4pplet/waffling60/rev_c/rev_c.c index fc7e99b601..f7f78f679d 100644 --- a/keyboards/4pplet/waffling60/rev_c/rev_c.c +++ b/keyboards/4pplet/waffling60/rev_c/rev_c.c @@ -14,7 +14,11 @@ 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 "rev_c.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling60/rev_c/rev_c.h b/keyboards/4pplet/waffling60/rev_c/rev_c.h deleted file mode 100644 index 641b663336..0000000000 --- a/keyboards/4pplet/waffling60/rev_c/rev_c.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 CAPS_LOCK_ENABLE true -//#define CAPS_LOCK_COLOR HSV_ORANGE - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling60/rev_d/rev_d.c b/keyboards/4pplet/waffling60/rev_d/rev_d.c index 2e0511459d..f7f78f679d 100644 --- a/keyboards/4pplet/waffling60/rev_d/rev_d.c +++ b/keyboards/4pplet/waffling60/rev_d/rev_d.c @@ -14,7 +14,11 @@ 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 "rev_d.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling60/rev_d/rev_d.h b/keyboards/4pplet/waffling60/rev_d/rev_d.h deleted file mode 100644 index 641b663336..0000000000 --- a/keyboards/4pplet/waffling60/rev_d/rev_d.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 CAPS_LOCK_ENABLE true -//#define CAPS_LOCK_COLOR HSV_ORANGE - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling60/rev_e/rev_e.c b/keyboards/4pplet/waffling60/rev_e/rev_e.c index 81941d54be..ca71947bfe 100644 --- a/keyboards/4pplet/waffling60/rev_e/rev_e.c +++ b/keyboards/4pplet/waffling60/rev_e/rev_e.c @@ -14,7 +14,15 @@ 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 "rev_e.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif + +#ifndef CAPS_LOCK_COLOR +# define CAPS_LOCK_COLOR HSV_GREEN +#endif void keyboard_pre_init_kb(void) { rgblight_set_effect_range(0, 16); diff --git a/keyboards/4pplet/waffling60/rev_e/rev_e.h b/keyboards/4pplet/waffling60/rev_e/rev_e.h deleted file mode 100644 index 61ebac1912..0000000000 --- a/keyboards/4pplet/waffling60/rev_e/rev_e.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 "quantum.h" - -#define CAPS_LOCK_ENABLE true -#define CAPS_LOCK_COLOR HSV_GREEN diff --git a/keyboards/4pplet/waffling80/rev_a/rev_a.c b/keyboards/4pplet/waffling80/rev_a/rev_a.c index d1032e7c6c..9983830548 100644 --- a/keyboards/4pplet/waffling80/rev_a/rev_a.c +++ b/keyboards/4pplet/waffling80/rev_a/rev_a.c @@ -14,7 +14,19 @@ 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 "rev_a.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE 1 +#endif + +#ifndef SCROLL_LOCK_ENABLE +# define SCROLL_LOCK_ENABLE 1 +#endif + +// If colors are defined, they will be static. If not defined, color for indicators can be set in VIA. +//#define CAPS_LOCK_COLOR HSV_GREEN +//#define SCROLL_LOCK_COLOR HSV_GREEN bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling80/rev_a/rev_a.h b/keyboards/4pplet/waffling80/rev_a/rev_a.h deleted file mode 100644 index c8d4c8b971..0000000000 --- a/keyboards/4pplet/waffling80/rev_a/rev_a.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 CAPS_LOCK_ENABLE 1 -#define SCROLL_LOCK_ENABLE 1 - -// If colors are defined, they will be static. If not defined, color for incicators can be set in VIA. -//#define CAPS_LOCK_COLOR HSV_GREEN -//#define SCROLL_LOCK_COLOR HSV_GREEN - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling80/rev_b/rev_b.c b/keyboards/4pplet/waffling80/rev_b/rev_b.c index 15e44b93a1..9983830548 100644 --- a/keyboards/4pplet/waffling80/rev_b/rev_b.c +++ b/keyboards/4pplet/waffling80/rev_b/rev_b.c @@ -14,7 +14,19 @@ 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 "rev_b.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE 1 +#endif + +#ifndef SCROLL_LOCK_ENABLE +# define SCROLL_LOCK_ENABLE 1 +#endif + +// If colors are defined, they will be static. If not defined, color for indicators can be set in VIA. +//#define CAPS_LOCK_COLOR HSV_GREEN +//#define SCROLL_LOCK_COLOR HSV_GREEN bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling80/rev_b/rev_b.h b/keyboards/4pplet/waffling80/rev_b/rev_b.h deleted file mode 100644 index c8d4c8b971..0000000000 --- a/keyboards/4pplet/waffling80/rev_b/rev_b.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 CAPS_LOCK_ENABLE 1 -#define SCROLL_LOCK_ENABLE 1 - -// If colors are defined, they will be static. If not defined, color for incicators can be set in VIA. -//#define CAPS_LOCK_COLOR HSV_GREEN -//#define SCROLL_LOCK_COLOR HSV_GREEN - -#include "quantum.h" diff --git a/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.c b/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.c index 9e617eaa7a..2cadd18a27 100644 --- a/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.c +++ b/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.c @@ -14,7 +14,19 @@ 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 "rev_b_ansi.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE 1 +#endif + +#ifndef SCROLL_LOCK_ENABLE +# define SCROLL_LOCK_ENABLE 1 +#endif + +// If colors are defined, they will be static. If not defined, color for indicators can be set in VIA. +//#define CAPS_LOCK_COLOR HSV_GREEN +//#define SCROLL_LOCK_COLOR HSV_GREEN bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); diff --git a/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.h b/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.h deleted file mode 100644 index c8d4c8b971..0000000000 --- a/keyboards/4pplet/waffling80/rev_b_ansi/rev_b_ansi.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2022 Stefan Sundin "4pplet" - -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 CAPS_LOCK_ENABLE 1 -#define SCROLL_LOCK_ENABLE 1 - -// If colors are defined, they will be static. If not defined, color for incicators can be set in VIA. -//#define CAPS_LOCK_COLOR HSV_GREEN -//#define SCROLL_LOCK_COLOR HSV_GREEN - -#include "quantum.h" diff --git a/keyboards/lendunistus/rpneko65/rev1/config.h b/keyboards/lendunistus/rpneko65/rev1/config.h deleted file mode 100644 index 6786155fbf..0000000000 --- a/keyboards/lendunistus/rpneko65/rev1/config.h +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2023 lendunistus -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#define CAPS_LOCK_ENABLE true diff --git a/keyboards/lendunistus/rpneko65/rev1/rev1.c b/keyboards/lendunistus/rpneko65/rev1/rev1.c index 2cb9cf07f8..a542dc6b31 100644 --- a/keyboards/lendunistus/rpneko65/rev1/rev1.c +++ b/keyboards/lendunistus/rpneko65/rev1/rev1.c @@ -16,6 +16,10 @@ along with this program. If not, see . */ #include "quantum.h" +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif + bool led_update_kb(led_t led_state) { bool res = led_update_user(led_state); if (CAPS_LOCK_ENABLE && res) { diff --git a/keyboards/umbra/solder/solder.c b/keyboards/umbra/solder/solder.c index ef7581deab..de0681b229 100644 --- a/keyboards/umbra/solder/solder.c +++ b/keyboards/umbra/solder/solder.c @@ -14,7 +14,15 @@ 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 "solder.h" +#include "quantum.h" + +#ifndef CAPS_LOCK_ENABLE +# define CAPS_LOCK_ENABLE true +#endif + +#ifndef CAPS_LOCK_COLOR +# define CAPS_LOCK_COLOR HSV_GREEN +#endif void keyboard_pre_init_kb(void) { rgblight_set_effect_range(0, 16); diff --git a/keyboards/umbra/solder/solder.h b/keyboards/umbra/solder/solder.h deleted file mode 100644 index 4a82a87a09..0000000000 --- a/keyboards/umbra/solder/solder.h +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2024 Joseph Williams IV "IV Works" - -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 "quantum.h" - -#define CAPS_LOCK_ENABLE true -#define CAPS_LOCK_COLOR HSV_GREEN From 60ac8598525312f089382d94b18996024f8df9c8 Mon Sep 17 00:00:00 2001 From: Christopher Hoage Date: Thu, 1 May 2025 18:52:36 -0700 Subject: [PATCH 342/592] Fix Spleeb compile when pointing device is enabled (#25016) --- keyboards/spleeb/rules.mk | 1 + keyboards/spleeb/spleeb.c | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 keyboards/spleeb/rules.mk diff --git a/keyboards/spleeb/rules.mk b/keyboards/spleeb/rules.mk new file mode 100644 index 0000000000..fedac72e2e --- /dev/null +++ b/keyboards/spleeb/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c diff --git a/keyboards/spleeb/spleeb.c b/keyboards/spleeb/spleeb.c index 658f30df75..33131fa3e2 100644 --- a/keyboards/spleeb/spleeb.c +++ b/keyboards/spleeb/spleeb.c @@ -8,6 +8,10 @@ # include "print.h" #endif // CONSOLE_ENABLE +#ifdef POINTING_DEVICE_ENABLE +# include "drivers/sensors/cirque_pinnacle_gestures.h" +#endif // POINTING_DEVICE_ENABLE + #if defined(POINTING_DEVICE_ENABLE) || defined(SPLEEB_ENCODER_MODE_MAP_ENABLE) typedef union { uint16_t raw; From bb9dd05c6ae0a53ced5591c70a898feef037b31c Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 5 May 2025 10:07:53 +1000 Subject: [PATCH 343/592] [Bug] Minimise force-included files (#25194) --- builddefs/common_features.mk | 12 ++++++++---- builddefs/common_rules.mk | 10 +++++----- keyboards/stront/stront.h | 2 ++ platforms/chibios/bootloaders/uf2boot.c | 2 ++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 0b9840a14e..5d007e099d 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -267,18 +267,22 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none) ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash) OPT_DEFS += -DHAL_USE_EFL SRC += wear_leveling_efl.c - POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling_efl.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_efl_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_efl_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash) FLASH_DRIVER := spi SRC += wear_leveling_flash_spi.c - POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling_flash_spi.o: FILE_SPECIFIC_CFLAGS += -include $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash) SRC += wear_leveling_rp2040_flash.c - POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling_rp2040_flash.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy) COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash SRC += legacy_flash_ops.c wear_leveling_legacy.c - POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling_legacy.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_legacy_config.h + $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_legacy_config.h endif endif endif diff --git a/builddefs/common_rules.mk b/builddefs/common_rules.mk index e45063cfaf..d6f91b10e4 100644 --- a/builddefs/common_rules.mk +++ b/builddefs/common_rules.mk @@ -168,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@) # For a ChibiOS build, ensure that the board files have the hook overrides injected define BOARDSRC_INJECT_HOOKS -$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h +$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h endef $(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ)))) @@ -289,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) ifneq ($$(VERBOSE_C_INCLUDE),) $$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H)) endif - $$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + $$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$$(BUILD_CMD) ifneq ($$(DUMP_C_MACROS),) - $$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<) + $$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<) @$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD)) endif @@ -300,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) $1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN) @mkdir -p $$(@D) @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$$(BUILD_CMD) $1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN) @mkdir -p $$(@D) @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$$(BUILD_CMD) # Assemble: create object files from assembler source files. diff --git a/keyboards/stront/stront.h b/keyboards/stront/stront.h index 9ca618a6fb..ebd0d491b9 100644 --- a/keyboards/stront/stront.h +++ b/keyboards/stront/stront.h @@ -3,4 +3,6 @@ #pragma once +#include + bool is_display_enabled(void); diff --git a/platforms/chibios/bootloaders/uf2boot.c b/platforms/chibios/bootloaders/uf2boot.c index f5b1a64334..1c736b8356 100644 --- a/platforms/chibios/bootloaders/uf2boot.c +++ b/platforms/chibios/bootloaders/uf2boot.c @@ -1,6 +1,8 @@ // Copyright 2023 QMK // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include #include "bootloader.h" // From mmoskal/uf2-stm32f103's backup.c From 12caf0be4eab171ffeb041cc153f9addb68f404e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 4 May 2025 17:21:47 -0700 Subject: [PATCH 344/592] Add additional hooks for Community modules (#25050) --- data/constants/module_hooks/1.1.0.hjson | 55 +++++++++++++++++++ docs/features/community_modules.md | 33 +++++++---- .../qmk/cli/generate/community_modules.py | 10 ++++ quantum/action_layer.c | 19 +++++++ quantum/action_layer.h | 3 + quantum/led_matrix/led_matrix.c | 10 ++++ quantum/pointing_device/pointing_device.c | 9 ++- quantum/pointing_device/pointing_device.h | 1 + quantum/rgb_matrix/rgb_matrix.c | 10 ++++ 9 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 data/constants/module_hooks/1.1.0.hjson diff --git a/data/constants/module_hooks/1.1.0.hjson b/data/constants/module_hooks/1.1.0.hjson new file mode 100644 index 0000000000..b50dad6a66 --- /dev/null +++ b/data/constants/module_hooks/1.1.0.hjson @@ -0,0 +1,55 @@ +{ + pointing_device_init: { + ret_type: void + args: void + guard: defined(POINTING_DEVICE_ENABLE) + } + pointing_device_task: { + ret_type: report_mouse_t + args: report_mouse_t mouse_report + call_params: mouse_report + guard: defined(POINTING_DEVICE_ENABLE) + header: report.h + } + rgb_matrix_indicators: { + ret_type: bool + args: void + guard: defined(RGB_MATRIX_ENABLE) + header: rgb_matrix.h + } + rgb_matrix_indicators_advanced: { + ret_type: bool + args: uint8_t led_min, uint8_t led_max + call_params: led_min, led_max + guard: defined(RGB_MATRIX_ENABLE) + header: rgb_matrix.h + } + led_matrix_indicators: { + ret_type: bool + args: void + guard: defined(LED_MATRIX_ENABLE) + header: led_matrix.h + } + led_matrix_indicators_advanced: { + ret_type: bool + args: uint8_t led_min, uint8_t led_max + call_params: led_min, led_max + guard: defined(LED_MATRIX_ENABLE) + header: led_matrix.h + } + default_layer_state_set: { + ret_type: layer_state_t + args: layer_state_t state + call_params: state + guard: !defined(NO_ACTION_LAYER) + header: action_layer.h + } + layer_state_set: { + ret_type: layer_state_t + args: layer_state_t state + call_params: state + guard: !defined(NO_ACTION_LAYER) + header: action_layer.h + } + +} diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md index 52526c9fe8..69fc47f617 100644 --- a/docs/features/community_modules.md +++ b/docs/features/community_modules.md @@ -127,18 +127,27 @@ Introspection is a relatively advanced topic within QMK, and existing patterns s Community Modules may provide specializations for the following APIs: -| Base API | API Format | Example (`hello_world` module) | API Version | -|----------------------------|-------------------------------------|----------------------------------------|-------------| -| `keyboard_pre_init` | `keyboard_pre_init_` | `keyboard_pre_init_hello_world` | `0.1.0` | -| `keyboard_post_init` | `keyboard_post_init_` | `keyboard_post_init_hello_world` | `0.1.0` | -| `pre_process_record` | `pre_process_record_` | `pre_process_record_hello_world` | `0.1.0` | -| `process_record` | `process_record_` | `process_record_hello_world` | `0.1.0` | -| `post_process_record` | `post_process_record_` | `post_process_record_hello_world` | `0.1.0` | -| `housekeeping_task` | `housekeeping_task_` | `housekeeping_task_hello_world` | `1.0.0` | -| `suspend_power_down` | `suspend_power_down_` | `suspend_power_down_hello_world` | `1.0.0` | -| `suspend_wakeup_init` | `suspend_wakeup_init_` | `suspend_wakeup_init_hello_world` | `1.0.0` | -| `shutdown` | `shutdown_` | `shutdown_hello_world` | `1.0.0` | -| `process_detected_host_os` | `process_detected_host_os_` | `process_detected_host_os_hello_world` | `1.0.0` | +| Base API | API Format | Example (`hello_world` module) | API Version | +|----------------------------------|-------------------------------------------|---------------------------------------------|-------------| +| `keyboard_pre_init` | `keyboard_pre_init_` | `keyboard_pre_init_hello_world` | `0.1.0` | +| `keyboard_post_init` | `keyboard_post_init_` | `keyboard_post_init_hello_world` | `0.1.0` | +| `pre_process_record` | `pre_process_record_` | `pre_process_record_hello_world` | `0.1.0` | +| `process_record` | `process_record_` | `process_record_hello_world` | `0.1.0` | +| `post_process_record` | `post_process_record_` | `post_process_record_hello_world` | `0.1.0` | +| `housekeeping_task` | `housekeeping_task_` | `housekeeping_task_hello_world` | `1.0.0` | +| `suspend_power_down` | `suspend_power_down_` | `suspend_power_down_hello_world` | `1.0.0` | +| `suspend_wakeup_init` | `suspend_wakeup_init_` | `suspend_wakeup_init_hello_world` | `1.0.0` | +| `shutdown` | `shutdown_` | `shutdown_hello_world` | `1.0.0` | +| `process_detected_host_os` | `process_detected_host_os_` | `process_detected_host_os_hello_world` | `1.0.0` | +| `default_layer_state_set` | `default_layer_state_set_` | `default_layer_state_set_hello_world` | `1.1.0` | +| `layer_state_set` | `layer_state_set_` | `layer_state_set_hello_world` | `1.1.0` | +| `led_matrix_indicators` | `led_matrix_indicators_` | `led_matrix_indicators_hello_word` | `1.1.0` | +| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_` | `led_matrix_indicators_advanced_hello_word` | `1.1.0` | +| `rgb_matrix_indicators` | `rgb_matrix_indicators_` | `rgb_matrix_indicators_hello_word` | `1.1.0` | +| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_` | `rgb_matrix_indicators_advanced_hello_word` | `1.1.0` | +| `pointing_device_init` | `pointing_device_init_` | `pointing_device_init_hello_word` | `1.1.0` | +| `pointing_device_task` | `pointing_device_task_` | `pointing_device_task_hello_word` | `1.1.0` | + ::: info An unspecified API is disregarded if a Community Module does not provide a specialization for it. diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py index e12daccf1c..61e24077d3 100644 --- a/lib/python/qmk/cli/generate/community_modules.py +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -76,6 +76,8 @@ def _render_api_implementations(api, module): lines.append(f'__attribute__((weak)) {api.ret_type} {api.name}_{module_name}_user({api.args}) {{') if api.ret_type == 'bool': lines.append(' return true;') + elif api.ret_type in ['layer_state_t', 'report_mouse_t']: + lines.append(f' return {api.call_params};') else: pass lines.append('}') @@ -86,6 +88,8 @@ def _render_api_implementations(api, module): if api.ret_type == 'bool': lines.append(f' if(!{api.name}_{module_name}_user({api.call_params})) {{ return false; }}') lines.append(' return true;') + elif api.ret_type in ['layer_state_t', 'report_mouse_t']: + lines.append(f' return {api.name}_{module_name}_user({api.call_params});') else: lines.append(f' {api.name}_{module_name}_user({api.call_params});') lines.append('}') @@ -96,6 +100,8 @@ def _render_api_implementations(api, module): if api.ret_type == 'bool': lines.append(f' if(!{api.name}_{module_name}_kb({api.call_params})) {{ return false; }}') lines.append(' return true;') + elif api.ret_type in ['layer_state_t', 'report_mouse_t']: + lines.append(f' return {api.name}_{module_name}_kb({api.call_params});') else: lines.append(f' {api.name}_{module_name}_kb({api.call_params});') lines.append('}') @@ -113,10 +119,14 @@ def _render_core_implementation(api, modules): module_name = Path(module).name if api.ret_type == 'bool': lines.append(f' && {api.name}_{module_name}({api.call_params})') + elif api.ret_type in ['layer_state_t', 'report_mouse_t']: + lines.append(f' {api.call_params} = {api.name}_{module_name}({api.call_params});') else: lines.append(f' {api.name}_{module_name}({api.call_params});') if api.ret_type == 'bool': lines.append(' ;') + elif api.ret_type in ['layer_state_t', 'report_mouse_t']: + lines.append(f' return {api.call_params};') lines.append('}') return lines diff --git a/quantum/action_layer.c b/quantum/action_layer.c index 7c09a5bd1e..5828dcb824 100644 --- a/quantum/action_layer.c +++ b/quantum/action_layer.c @@ -27,11 +27,20 @@ __attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t sta return default_layer_state_set_user(state); } +/** \brief Default Layer State Set At Module Level + * + * Run module code on default layer state change + */ +__attribute__((weak)) layer_state_t default_layer_state_set_modules(layer_state_t state) { + return state; +} + /** \brief Default Layer State Set * * Static function to set the default layer state, prints debug info and clears keys */ static void default_layer_state_set(layer_state_t state) { + state = default_layer_state_set_modules(state); state = default_layer_state_set_kb(state); ac_dprintf("default_layer_state: "); default_layer_debug(); @@ -107,11 +116,21 @@ __attribute__((weak)) layer_state_t layer_state_set_kb(layer_state_t state) { return layer_state_set_user(state); } +/** \brief Layer state set modules + * + * Runs module code on layer state change + */ + +__attribute__((weak)) layer_state_t layer_state_set_modules(layer_state_t state) { + return state; +} + /** \brief Layer state set * * Sets the layer to match the specified state (a bitmask) */ void layer_state_set(layer_state_t state) { + state = layer_state_set_modules(state); state = layer_state_set_kb(state); ac_dprintf("layer_state: "); layer_debug(); diff --git a/quantum/action_layer.h b/quantum/action_layer.h index a2410d49a5..067e33cdb5 100644 --- a/quantum/action_layer.h +++ b/quantum/action_layer.h @@ -78,6 +78,7 @@ extern layer_state_t default_layer_state; void default_layer_debug(void); void default_layer_set(layer_state_t state); +__attribute__((weak)) layer_state_t default_layer_state_set_modules(layer_state_t state); __attribute__((weak)) layer_state_t default_layer_state_set_kb(layer_state_t state); __attribute__((weak)) layer_state_t default_layer_state_set_user(layer_state_t state); @@ -114,6 +115,7 @@ void layer_and(layer_state_t state); void layer_xor(layer_state_t state); layer_state_t layer_state_set_user(layer_state_t state); layer_state_t layer_state_set_kb(layer_state_t state); +layer_state_t layer_state_set_modules(layer_state_t state); /** * @brief Applies the tri layer to global layer state. Not be used in layer_state_set_(kb|user) functions. @@ -149,6 +151,7 @@ layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_ # define layer_or(state) (void)state # define layer_and(state) (void)state # define layer_xor(state) (void)state +# define layer_state_set_modules(state) (void)state # define layer_state_set_kb(state) (void)state # define layer_state_set_user(state) (void)state # define update_tri_layer(layer1, layer2, layer3) diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index f9d76e2776..00bc199ecf 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -358,7 +358,12 @@ void led_matrix_task(void) { } } +__attribute__((weak)) bool led_matrix_indicators_modules(void) { + return true; +} + void led_matrix_indicators(void) { + led_matrix_indicators_modules(); led_matrix_indicators_kb(); } @@ -370,6 +375,10 @@ __attribute__((weak)) bool led_matrix_indicators_user(void) { return true; } +__attribute__((weak)) bool led_matrix_indicators_advanced_modules(uint8_t led_min, uint8_t led_max) { + return true; +} + void led_matrix_indicators_advanced(effect_params_t *params) { /* special handling is needed for "params->iter", since it's already been incremented. * Could move the invocations to led_task_render, but then it's missing a few checks @@ -377,6 +386,7 @@ void led_matrix_indicators_advanced(effect_params_t *params) { * led_task_render, right before the iter++ line. */ LED_MATRIX_USE_LIMITS_ITER(min, max, params->iter - 1); + led_matrix_indicators_advanced_modules(min, max); led_matrix_indicators_advanced_kb(min, max); } diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c index 5ee65c9c61..564c2d294c 100644 --- a/quantum/pointing_device/pointing_device.c +++ b/quantum/pointing_device/pointing_device.c @@ -109,6 +109,11 @@ const pointing_device_driver_t custom_pointing_device_driver = { const pointing_device_driver_t *pointing_device_driver = &POINTING_DEVICE_DRIVER(POINTING_DEVICE_DRIVER_NAME); +__attribute__((weak)) void pointing_device_init_modules(void) {} +__attribute__((weak)) report_mouse_t pointing_device_task_modules(report_mouse_t mouse_report) { + return mouse_report; +} + /** * @brief Keyboard level code pointing device initialisation * @@ -190,6 +195,7 @@ __attribute__((weak)) void pointing_device_init(void) { } #endif + pointing_device_init_modules(); pointing_device_init_kb(); pointing_device_init_user(); } @@ -319,8 +325,9 @@ __attribute__((weak)) bool pointing_device_task(void) { local_mouse_report = is_keyboard_left() ? pointing_device_task_combined_kb(local_mouse_report, shared_mouse_report) : pointing_device_task_combined_kb(shared_mouse_report, local_mouse_report); #else local_mouse_report = pointing_device_adjust_by_defines(local_mouse_report); - local_mouse_report = pointing_device_task_kb(local_mouse_report); #endif + local_mouse_report = pointing_device_task_modules(local_mouse_report); + local_mouse_report = pointing_device_task_kb(local_mouse_report); // automatic mouse layer function #ifdef POINTING_DEVICE_AUTO_MOUSE_ENABLE pointing_device_task_auto_mouse(local_mouse_report); diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h index d8b583c87e..e7a0819ed9 100644 --- a/quantum/pointing_device/pointing_device.h +++ b/quantum/pointing_device/pointing_device.h @@ -17,6 +17,7 @@ along with this program. If not, see . #pragma once +#include #include #include "host.h" #include "report.h" diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 3fc9085f06..94852e3520 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -393,7 +393,12 @@ void rgb_matrix_task(void) { } } +__attribute__((weak)) bool rgb_matrix_indicators_modules(void) { + return true; +} + void rgb_matrix_indicators(void) { + rgb_matrix_indicators_modules(); rgb_matrix_indicators_kb(); } @@ -433,6 +438,10 @@ struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter) { return limits; } +__attribute__((weak)) bool rgb_matrix_indicators_advanced_modules(uint8_t led_min, uint8_t led_max) { + return true; +} + void rgb_matrix_indicators_advanced(effect_params_t *params) { /* special handling is needed for "params->iter", since it's already been incremented. * Could move the invocations to rgb_task_render, but then it's missing a few checks @@ -440,6 +449,7 @@ void rgb_matrix_indicators_advanced(effect_params_t *params) { * rgb_task_render, right before the iter++ line. */ RGB_MATRIX_USE_LIMITS_ITER(min, max, params->iter - 1); + rgb_matrix_indicators_advanced_modules(min, max); rgb_matrix_indicators_advanced_kb(min, max); } From cf5ce64b1b2bc4d5362c94473a2b9f25a64e4892 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 01:22:51 +0100 Subject: [PATCH 345/592] Workaround for resolving keyboard alias for config file values (#25228) --- lib/python/qmk/decorators.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/decorators.py b/lib/python/qmk/decorators.py index 16b44d6d59..0cad55a483 100644 --- a/lib/python/qmk/decorators.py +++ b/lib/python/qmk/decorators.py @@ -5,7 +5,7 @@ from time import monotonic from milc import cli -from qmk.keyboard import find_keyboard_from_dir +from qmk.keyboard import find_keyboard_from_dir, keyboard_folder from qmk.keymap import find_keymap_from_dir @@ -27,6 +27,11 @@ def automagic_keyboard(func): def wrapper(*args, **kwargs): cmd = _get_subcommand_name() + # TODO: Workaround for if config file contains "old" keyboard name + # Potential long-term fix needs to be within global cli or milc + if cli.config_source[cmd]['keyboard'] == 'config_file': + cli.config[cmd]['keyboard'] = keyboard_folder(cli.config[cmd]['keyboard']) + # Ensure that `--keyboard` was not passed and CWD is under `qmk_firmware/keyboards` if cli.config_source[cmd]['keyboard'] != 'argument': keyboard = find_keyboard_from_dir() From dbe30a1b6fd6b5190826c29dba80b2476caeb9bb Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 01:44:08 +0100 Subject: [PATCH 346/592] Generate versions to keycode headers (#25219) --- lib/python/qmk/cli/generate/keycodes.py | 16 ++++++++++++++++ lib/python/qmk/keycodes.py | 1 + quantum/keycodes.h | 6 ++++++ quantum/keymap_extras/keymap_belgian.h | 6 ++++++ quantum/keymap_extras/keymap_bepo.h | 6 ++++++ quantum/keymap_extras/keymap_brazilian_abnt2.h | 6 ++++++ quantum/keymap_extras/keymap_canadian_french.h | 6 ++++++ .../keymap_extras/keymap_canadian_multilingual.h | 6 ++++++ quantum/keymap_extras/keymap_colemak.h | 6 ++++++ quantum/keymap_extras/keymap_croatian.h | 6 ++++++ quantum/keymap_extras/keymap_czech.h | 6 ++++++ quantum/keymap_extras/keymap_czech_mac_ansi.h | 6 ++++++ quantum/keymap_extras/keymap_czech_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_danish.h | 6 ++++++ quantum/keymap_extras/keymap_dvorak.h | 6 ++++++ quantum/keymap_extras/keymap_dvorak_fr.h | 6 ++++++ quantum/keymap_extras/keymap_dvorak_programmer.h | 6 ++++++ quantum/keymap_extras/keymap_estonian.h | 6 ++++++ quantum/keymap_extras/keymap_eurkey.h | 6 ++++++ quantum/keymap_extras/keymap_farsi.h | 6 ++++++ quantum/keymap_extras/keymap_finnish.h | 6 ++++++ quantum/keymap_extras/keymap_french.h | 6 ++++++ quantum/keymap_extras/keymap_french_afnor.h | 6 ++++++ quantum/keymap_extras/keymap_french_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_german.h | 6 ++++++ quantum/keymap_extras/keymap_german_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_greek.h | 6 ++++++ quantum/keymap_extras/keymap_hebrew.h | 6 ++++++ quantum/keymap_extras/keymap_hungarian.h | 6 ++++++ quantum/keymap_extras/keymap_icelandic.h | 6 ++++++ quantum/keymap_extras/keymap_irish.h | 6 ++++++ quantum/keymap_extras/keymap_italian.h | 6 ++++++ quantum/keymap_extras/keymap_italian_mac_ansi.h | 6 ++++++ quantum/keymap_extras/keymap_italian_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_japanese.h | 6 ++++++ quantum/keymap_extras/keymap_korean.h | 6 ++++++ quantum/keymap_extras/keymap_latvian.h | 6 ++++++ quantum/keymap_extras/keymap_lithuanian_azerty.h | 6 ++++++ quantum/keymap_extras/keymap_lithuanian_qwerty.h | 6 ++++++ quantum/keymap_extras/keymap_neo2.h | 6 ++++++ quantum/keymap_extras/keymap_nordic.h | 6 ++++++ quantum/keymap_extras/keymap_norman.h | 6 ++++++ quantum/keymap_extras/keymap_norwegian.h | 6 ++++++ quantum/keymap_extras/keymap_plover.h | 6 ++++++ quantum/keymap_extras/keymap_plover_dvorak.h | 6 ++++++ quantum/keymap_extras/keymap_polish.h | 6 ++++++ quantum/keymap_extras/keymap_portuguese.h | 6 ++++++ .../keymap_extras/keymap_portuguese_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_romanian.h | 6 ++++++ quantum/keymap_extras/keymap_russian.h | 6 ++++++ .../keymap_extras/keymap_russian_typewriter.h | 6 ++++++ quantum/keymap_extras/keymap_serbian.h | 6 ++++++ quantum/keymap_extras/keymap_serbian_latin.h | 6 ++++++ quantum/keymap_extras/keymap_slovak.h | 6 ++++++ quantum/keymap_extras/keymap_slovenian.h | 6 ++++++ quantum/keymap_extras/keymap_spanish.h | 6 ++++++ quantum/keymap_extras/keymap_spanish_dvorak.h | 6 ++++++ .../keymap_extras/keymap_spanish_latin_america.h | 6 ++++++ quantum/keymap_extras/keymap_swedish.h | 6 ++++++ quantum/keymap_extras/keymap_swedish_mac_ansi.h | 6 ++++++ quantum/keymap_extras/keymap_swedish_mac_iso.h | 6 ++++++ .../keymap_extras/keymap_swedish_pro_mac_ansi.h | 6 ++++++ .../keymap_extras/keymap_swedish_pro_mac_iso.h | 6 ++++++ quantum/keymap_extras/keymap_swiss_de.h | 6 ++++++ quantum/keymap_extras/keymap_swiss_fr.h | 6 ++++++ quantum/keymap_extras/keymap_turkish_f.h | 6 ++++++ quantum/keymap_extras/keymap_turkish_q.h | 6 ++++++ quantum/keymap_extras/keymap_uk.h | 6 ++++++ quantum/keymap_extras/keymap_ukrainian.h | 6 ++++++ quantum/keymap_extras/keymap_us.h | 6 ++++++ quantum/keymap_extras/keymap_us_extended.h | 6 ++++++ quantum/keymap_extras/keymap_us_international.h | 6 ++++++ .../keymap_us_international_linux.h | 6 ++++++ quantum/keymap_extras/keymap_workman.h | 6 ++++++ quantum/keymap_extras/keymap_workman_zxcvm.h | 6 ++++++ 75 files changed, 455 insertions(+) diff --git a/lib/python/qmk/cli/generate/keycodes.py b/lib/python/qmk/cli/generate/keycodes.py index 719fced5d5..d686935fa8 100644 --- a/lib/python/qmk/cli/generate/keycodes.py +++ b/lib/python/qmk/cli/generate/keycodes.py @@ -125,6 +125,20 @@ def _generate_aliases(lines, keycodes): lines.append(f'#define {alias} {value.get("key")}') +def _generate_version(lines, keycodes, prefix=''): + version = keycodes['version'] + major, minor, patch = map(int, version.split('.')) + + bcd = f'0x{major:02d}{minor:02d}{patch:04d}' + + lines.append('') + lines.append(f'#define QMK_{prefix}KEYCODES_VERSION "{version}"') + lines.append(f'#define QMK_{prefix}KEYCODES_VERSION_BCD {bcd}') + lines.append(f'#define QMK_{prefix}KEYCODES_VERSION_MAJOR {major}') + lines.append(f'#define QMK_{prefix}KEYCODES_VERSION_MINOR {minor}') + lines.append(f'#define QMK_{prefix}KEYCODES_VERSION_PATCH {patch}') + + @cli.argument('-v', '--version', arg_only=True, required=True, help='Version of keycodes to generate.') @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") @@ -138,6 +152,7 @@ def generate_keycodes(cli): keycodes = load_spec(cli.args.version) + _generate_version(keycodes_h_lines, keycodes) _generate_ranges(keycodes_h_lines, keycodes) _generate_defines(keycodes_h_lines, keycodes) _generate_helpers(keycodes_h_lines, keycodes) @@ -160,6 +175,7 @@ def generate_keycode_extras(cli): keycodes = load_spec(cli.args.version, cli.args.lang) + _generate_version(keycodes_h_lines, keycodes, f'{cli.args.lang.upper()}_') _generate_aliases(keycodes_h_lines, keycodes) # Show the results diff --git a/lib/python/qmk/keycodes.py b/lib/python/qmk/keycodes.py index 966930547c..9e4664e5f1 100644 --- a/lib/python/qmk/keycodes.py +++ b/lib/python/qmk/keycodes.py @@ -89,6 +89,7 @@ def load_spec(version, lang=None): spec = _process_files(_locate_files(path, prefix, versions)) # Sort? + spec['version'] = version spec['keycodes'] = dict(sorted(spec.get('keycodes', {}).items())) spec['ranges'] = dict(sorted(spec.get('ranges', {}).items())) diff --git a/quantum/keycodes.h b/quantum/keycodes.h index b4fc38f5ff..6a59aa376d 100644 --- a/quantum/keycodes.h +++ b/quantum/keycodes.h @@ -26,6 +26,12 @@ #pragma once // clang-format off +#define QMK_KEYCODES_VERSION "0.0.7" +#define QMK_KEYCODES_VERSION_BCD 0x00000007 +#define QMK_KEYCODES_VERSION_MAJOR 0 +#define QMK_KEYCODES_VERSION_MINOR 0 +#define QMK_KEYCODES_VERSION_PATCH 7 + enum qk_keycode_ranges { // Ranges QK_BASIC = 0x0000, diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h index 1869e66d9a..b41ed9d20b 100644 --- a/quantum/keymap_extras/keymap_belgian.h +++ b/quantum/keymap_extras/keymap_belgian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_BELGIAN_KEYCODES_VERSION "0.0.1" +#define QMK_BELGIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_BELGIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_BELGIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_BELGIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define BE_SUP2 KC_GRV // ² #define BE_AMPR KC_1 // & diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index f2ddb99180..c0bb703ecc 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_BEPO_KEYCODES_VERSION "0.0.1" +#define QMK_BEPO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_BEPO_KEYCODES_VERSION_MAJOR 0 +#define QMK_BEPO_KEYCODES_VERSION_MINOR 0 +#define QMK_BEPO_KEYCODES_VERSION_PATCH 1 + // Aliases #define BP_DLR KC_GRV // $ #define BP_DQUO KC_1 // " diff --git a/quantum/keymap_extras/keymap_brazilian_abnt2.h b/quantum/keymap_extras/keymap_brazilian_abnt2.h index 730fe5069f..267b5490c9 100644 --- a/quantum/keymap_extras/keymap_brazilian_abnt2.h +++ b/quantum/keymap_extras/keymap_brazilian_abnt2.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_BRAZILIAN_ABNT2_KEYCODES_VERSION "0.0.1" +#define QMK_BRAZILIAN_ABNT2_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_BRAZILIAN_ABNT2_KEYCODES_VERSION_MAJOR 0 +#define QMK_BRAZILIAN_ABNT2_KEYCODES_VERSION_MINOR 0 +#define QMK_BRAZILIAN_ABNT2_KEYCODES_VERSION_PATCH 1 + // Aliases #define BR_QUOT KC_GRV // ' #define BR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_canadian_french.h b/quantum/keymap_extras/keymap_canadian_french.h index 5771cf6193..df9c73c016 100644 --- a/quantum/keymap_extras/keymap_canadian_french.h +++ b/quantum/keymap_extras/keymap_canadian_french.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CANADIAN_FRENCH_KEYCODES_VERSION "0.0.1" +#define QMK_CANADIAN_FRENCH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CANADIAN_FRENCH_KEYCODES_VERSION_MAJOR 0 +#define QMK_CANADIAN_FRENCH_KEYCODES_VERSION_MINOR 0 +#define QMK_CANADIAN_FRENCH_KEYCODES_VERSION_PATCH 1 + // Aliases #define FR_HASH KC_GRV // # #define FR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index 2a4326b406..4b42457396 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CANADIAN_MULTILINGUAL_KEYCODES_VERSION "0.0.1" +#define QMK_CANADIAN_MULTILINGUAL_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CANADIAN_MULTILINGUAL_KEYCODES_VERSION_MAJOR 0 +#define QMK_CANADIAN_MULTILINGUAL_KEYCODES_VERSION_MINOR 0 +#define QMK_CANADIAN_MULTILINGUAL_KEYCODES_VERSION_PATCH 1 + // Aliases #define CA_SLSH KC_GRV // / #define CA_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h index 0170339aad..a4fc77e80f 100644 --- a/quantum/keymap_extras/keymap_colemak.h +++ b/quantum/keymap_extras/keymap_colemak.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_COLEMAK_KEYCODES_VERSION "0.0.1" +#define QMK_COLEMAK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_COLEMAK_KEYCODES_VERSION_MAJOR 0 +#define QMK_COLEMAK_KEYCODES_VERSION_MINOR 0 +#define QMK_COLEMAK_KEYCODES_VERSION_PATCH 1 + // Aliases #define CM_GRV KC_GRV // ` #define CM_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_croatian.h b/quantum/keymap_extras/keymap_croatian.h index 7e11a85710..cdc032a9eb 100644 --- a/quantum/keymap_extras/keymap_croatian.h +++ b/quantum/keymap_extras/keymap_croatian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CROATIAN_KEYCODES_VERSION "0.0.1" +#define QMK_CROATIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CROATIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_CROATIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_CROATIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define HR_CEDL KC_GRV // ¸ (dead) #define HR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_czech.h b/quantum/keymap_extras/keymap_czech.h index 8e65a4ed0a..cae16cdb9f 100644 --- a/quantum/keymap_extras/keymap_czech.h +++ b/quantum/keymap_extras/keymap_czech.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CZECH_KEYCODES_VERSION "0.0.1" +#define QMK_CZECH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CZECH_KEYCODES_VERSION_MAJOR 0 +#define QMK_CZECH_KEYCODES_VERSION_MINOR 0 +#define QMK_CZECH_KEYCODES_VERSION_PATCH 1 + // Aliases #define CZ_SCLN KC_GRV // ; #define CZ_PLUS KC_1 // + diff --git a/quantum/keymap_extras/keymap_czech_mac_ansi.h b/quantum/keymap_extras/keymap_czech_mac_ansi.h index ed46a78f1c..bdfda933b0 100644 --- a/quantum/keymap_extras/keymap_czech_mac_ansi.h +++ b/quantum/keymap_extras/keymap_czech_mac_ansi.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CZECH_MAC_ANSI_KEYCODES_VERSION "0.0.1" +#define QMK_CZECH_MAC_ANSI_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CZECH_MAC_ANSI_KEYCODES_VERSION_MAJOR 0 +#define QMK_CZECH_MAC_ANSI_KEYCODES_VERSION_MINOR 0 +#define QMK_CZECH_MAC_ANSI_KEYCODES_VERSION_PATCH 1 + // Aliases #define CZ_BSLS KC_GRV // (backslash) #define CZ_PLUS KC_1 // + diff --git a/quantum/keymap_extras/keymap_czech_mac_iso.h b/quantum/keymap_extras/keymap_czech_mac_iso.h index 08285b7952..9c05d8dae0 100644 --- a/quantum/keymap_extras/keymap_czech_mac_iso.h +++ b/quantum/keymap_extras/keymap_czech_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_CZECH_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_CZECH_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_CZECH_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_CZECH_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_CZECH_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define CZ_PLUS KC_1 // + #define CZ_ECAR KC_2 // ě diff --git a/quantum/keymap_extras/keymap_danish.h b/quantum/keymap_extras/keymap_danish.h index a84923007c..1f1ee90e23 100644 --- a/quantum/keymap_extras/keymap_danish.h +++ b/quantum/keymap_extras/keymap_danish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_DANISH_KEYCODES_VERSION "0.0.1" +#define QMK_DANISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_DANISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_DANISH_KEYCODES_VERSION_MINOR 0 +#define QMK_DANISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define DK_HALF KC_GRV // ½ #define DK_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_dvorak.h b/quantum/keymap_extras/keymap_dvorak.h index a926e48295..5cb2c4564a 100644 --- a/quantum/keymap_extras/keymap_dvorak.h +++ b/quantum/keymap_extras/keymap_dvorak.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_DVORAK_KEYCODES_VERSION "0.0.1" +#define QMK_DVORAK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_DVORAK_KEYCODES_VERSION_MAJOR 0 +#define QMK_DVORAK_KEYCODES_VERSION_MINOR 0 +#define QMK_DVORAK_KEYCODES_VERSION_PATCH 1 + // Aliases #define DV_GRV KC_GRV // ` #define DV_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_dvorak_fr.h b/quantum/keymap_extras/keymap_dvorak_fr.h index 6e6498e598..d01bf7fec7 100644 --- a/quantum/keymap_extras/keymap_dvorak_fr.h +++ b/quantum/keymap_extras/keymap_dvorak_fr.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_DVORAK_FR_KEYCODES_VERSION "0.0.1" +#define QMK_DVORAK_FR_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_DVORAK_FR_KEYCODES_VERSION_MAJOR 0 +#define QMK_DVORAK_FR_KEYCODES_VERSION_MINOR 0 +#define QMK_DVORAK_FR_KEYCODES_VERSION_PATCH 1 + // Aliases #define DV_LDAQ KC_GRV // « #define DV_RDAQ KC_1 // » diff --git a/quantum/keymap_extras/keymap_dvorak_programmer.h b/quantum/keymap_extras/keymap_dvorak_programmer.h index 43d9a702bb..f17900105f 100644 --- a/quantum/keymap_extras/keymap_dvorak_programmer.h +++ b/quantum/keymap_extras/keymap_dvorak_programmer.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_DVORAK_PROGRAMMER_KEYCODES_VERSION "0.0.1" +#define QMK_DVORAK_PROGRAMMER_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_DVORAK_PROGRAMMER_KEYCODES_VERSION_MAJOR 0 +#define QMK_DVORAK_PROGRAMMER_KEYCODES_VERSION_MINOR 0 +#define QMK_DVORAK_PROGRAMMER_KEYCODES_VERSION_PATCH 1 + // Aliases #define DP_DLR KC_GRV // $ #define DP_AMPR KC_1 // & diff --git a/quantum/keymap_extras/keymap_estonian.h b/quantum/keymap_extras/keymap_estonian.h index 3e87bbc5f8..5fbeedcbe9 100644 --- a/quantum/keymap_extras/keymap_estonian.h +++ b/quantum/keymap_extras/keymap_estonian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ESTONIAN_KEYCODES_VERSION "0.0.1" +#define QMK_ESTONIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ESTONIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_ESTONIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_ESTONIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define EE_CARN KC_GRV // ˇ (dead) #define EE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_eurkey.h b/quantum/keymap_extras/keymap_eurkey.h index 20f7f58683..5a13d48163 100644 --- a/quantum/keymap_extras/keymap_eurkey.h +++ b/quantum/keymap_extras/keymap_eurkey.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_EURKEY_KEYCODES_VERSION "0.0.1" +#define QMK_EURKEY_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_EURKEY_KEYCODES_VERSION_MAJOR 0 +#define QMK_EURKEY_KEYCODES_VERSION_MINOR 0 +#define QMK_EURKEY_KEYCODES_VERSION_PATCH 1 + // Aliases #define EU_GRV KC_GRV // ` #define EU_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_farsi.h b/quantum/keymap_extras/keymap_farsi.h index 4f34b08d92..e115d9c1c0 100644 --- a/quantum/keymap_extras/keymap_farsi.h +++ b/quantum/keymap_extras/keymap_farsi.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_FARSI_KEYCODES_VERSION "0.0.1" +#define QMK_FARSI_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_FARSI_KEYCODES_VERSION_MAJOR 0 +#define QMK_FARSI_KEYCODES_VERSION_MINOR 0 +#define QMK_FARSI_KEYCODES_VERSION_PATCH 1 + // Aliases #define FA_ZWJ KC_GRV // (zero-width joiner) #define FA_1A KC_1 // ۱ diff --git a/quantum/keymap_extras/keymap_finnish.h b/quantum/keymap_extras/keymap_finnish.h index 045f7295a0..cb21da9962 100644 --- a/quantum/keymap_extras/keymap_finnish.h +++ b/quantum/keymap_extras/keymap_finnish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_FINNISH_KEYCODES_VERSION "0.0.1" +#define QMK_FINNISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_FINNISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_FINNISH_KEYCODES_VERSION_MINOR 0 +#define QMK_FINNISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define FI_SECT KC_GRV // § #define FI_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index 9ff3694a73..d4352c6481 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_FRENCH_KEYCODES_VERSION "0.0.1" +#define QMK_FRENCH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_FRENCH_KEYCODES_VERSION_MAJOR 0 +#define QMK_FRENCH_KEYCODES_VERSION_MINOR 0 +#define QMK_FRENCH_KEYCODES_VERSION_PATCH 1 + // Aliases #define FR_SUP2 KC_GRV // ² #define FR_AMPR KC_1 // & diff --git a/quantum/keymap_extras/keymap_french_afnor.h b/quantum/keymap_extras/keymap_french_afnor.h index 07506e0f6e..8e6905cc01 100644 --- a/quantum/keymap_extras/keymap_french_afnor.h +++ b/quantum/keymap_extras/keymap_french_afnor.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_FRENCH_AFNOR_KEYCODES_VERSION "0.0.1" +#define QMK_FRENCH_AFNOR_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_FRENCH_AFNOR_KEYCODES_VERSION_MAJOR 0 +#define QMK_FRENCH_AFNOR_KEYCODES_VERSION_MINOR 0 +#define QMK_FRENCH_AFNOR_KEYCODES_VERSION_PATCH 1 + // Aliases #define FR_AT KC_GRV // @ #define FR_AGRV KC_1 // à diff --git a/quantum/keymap_extras/keymap_french_mac_iso.h b/quantum/keymap_extras/keymap_french_mac_iso.h index b036ca2009..ad9d280f2a 100644 --- a/quantum/keymap_extras/keymap_french_mac_iso.h +++ b/quantum/keymap_extras/keymap_french_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_FRENCH_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_FRENCH_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_FRENCH_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_FRENCH_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_FRENCH_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define FR_AT KC_GRV // @ #define FR_AMPR KC_1 // & diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index 7ac807934b..bc98daa2fd 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_GERMAN_KEYCODES_VERSION "0.0.1" +#define QMK_GERMAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_GERMAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_GERMAN_KEYCODES_VERSION_MINOR 0 +#define QMK_GERMAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define DE_CIRC KC_GRV // ^ (dead) #define DE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_german_mac_iso.h b/quantum/keymap_extras/keymap_german_mac_iso.h index 56d077c36c..ba3143c570 100644 --- a/quantum/keymap_extras/keymap_german_mac_iso.h +++ b/quantum/keymap_extras/keymap_german_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_GERMAN_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_GERMAN_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_GERMAN_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_GERMAN_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_GERMAN_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define DE_CIRC KC_GRV // ^ (dead) #define DE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_greek.h b/quantum/keymap_extras/keymap_greek.h index 0d2e15dfd8..fb2f02a04f 100644 --- a/quantum/keymap_extras/keymap_greek.h +++ b/quantum/keymap_extras/keymap_greek.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_GREEK_KEYCODES_VERSION "0.0.1" +#define QMK_GREEK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_GREEK_KEYCODES_VERSION_MAJOR 0 +#define QMK_GREEK_KEYCODES_VERSION_MINOR 0 +#define QMK_GREEK_KEYCODES_VERSION_PATCH 1 + // Aliases #define GR_GRV KC_GRV // ` #define GR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_hebrew.h b/quantum/keymap_extras/keymap_hebrew.h index a927364737..5d1d4a29c6 100644 --- a/quantum/keymap_extras/keymap_hebrew.h +++ b/quantum/keymap_extras/keymap_hebrew.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_HEBREW_KEYCODES_VERSION "0.0.1" +#define QMK_HEBREW_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_HEBREW_KEYCODES_VERSION_MAJOR 0 +#define QMK_HEBREW_KEYCODES_VERSION_MINOR 0 +#define QMK_HEBREW_KEYCODES_VERSION_PATCH 1 + // Aliases #define IL_SCLN KC_GRV // ; #define IL_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_hungarian.h b/quantum/keymap_extras/keymap_hungarian.h index 81a842a0fe..27236553e8 100644 --- a/quantum/keymap_extras/keymap_hungarian.h +++ b/quantum/keymap_extras/keymap_hungarian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_HUNGARIAN_KEYCODES_VERSION "0.0.1" +#define QMK_HUNGARIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_HUNGARIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_HUNGARIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_HUNGARIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define HU_0 KC_GRV // 0 #define HU_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_icelandic.h b/quantum/keymap_extras/keymap_icelandic.h index 8e4e04b0f1..409be27b77 100644 --- a/quantum/keymap_extras/keymap_icelandic.h +++ b/quantum/keymap_extras/keymap_icelandic.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ICELANDIC_KEYCODES_VERSION "0.0.1" +#define QMK_ICELANDIC_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ICELANDIC_KEYCODES_VERSION_MAJOR 0 +#define QMK_ICELANDIC_KEYCODES_VERSION_MINOR 0 +#define QMK_ICELANDIC_KEYCODES_VERSION_PATCH 1 + // Aliases #define IS_RNGA KC_GRV // ° (dead) #define IS_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_irish.h b/quantum/keymap_extras/keymap_irish.h index 6cb85dc7a7..587467bcbe 100644 --- a/quantum/keymap_extras/keymap_irish.h +++ b/quantum/keymap_extras/keymap_irish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_IRISH_KEYCODES_VERSION "0.0.1" +#define QMK_IRISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_IRISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_IRISH_KEYCODES_VERSION_MINOR 0 +#define QMK_IRISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define IE_GRV KC_GRV // ` #define IE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h index 57c12ba9b6..9fd7f1b15c 100644 --- a/quantum/keymap_extras/keymap_italian.h +++ b/quantum/keymap_extras/keymap_italian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ITALIAN_KEYCODES_VERSION "0.0.1" +#define QMK_ITALIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ITALIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_ITALIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_ITALIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define IT_BSLS KC_GRV // (backslash) #define IT_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_italian_mac_ansi.h b/quantum/keymap_extras/keymap_italian_mac_ansi.h index 4774c2d5ee..9ef38c0d87 100644 --- a/quantum/keymap_extras/keymap_italian_mac_ansi.h +++ b/quantum/keymap_extras/keymap_italian_mac_ansi.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ITALIAN_MAC_ANSI_KEYCODES_VERSION "0.0.1" +#define QMK_ITALIAN_MAC_ANSI_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ITALIAN_MAC_ANSI_KEYCODES_VERSION_MAJOR 0 +#define QMK_ITALIAN_MAC_ANSI_KEYCODES_VERSION_MINOR 0 +#define QMK_ITALIAN_MAC_ANSI_KEYCODES_VERSION_PATCH 1 + // Aliases #define IT_LABK KC_GRV // < #define IT_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_italian_mac_iso.h b/quantum/keymap_extras/keymap_italian_mac_iso.h index 35ec978ef9..e80cfa450c 100644 --- a/quantum/keymap_extras/keymap_italian_mac_iso.h +++ b/quantum/keymap_extras/keymap_italian_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ITALIAN_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_ITALIAN_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ITALIAN_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_ITALIAN_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_ITALIAN_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define IT_BSLS KC_GRV // (backslash) #define IT_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_japanese.h b/quantum/keymap_extras/keymap_japanese.h index 3ad9495353..55df86e16d 100644 --- a/quantum/keymap_extras/keymap_japanese.h +++ b/quantum/keymap_extras/keymap_japanese.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_JAPANESE_KEYCODES_VERSION "0.0.1" +#define QMK_JAPANESE_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_JAPANESE_KEYCODES_VERSION_MAJOR 0 +#define QMK_JAPANESE_KEYCODES_VERSION_MINOR 0 +#define QMK_JAPANESE_KEYCODES_VERSION_PATCH 1 + // Aliases #define JP_ZKHK KC_GRV // Zenkaku ↔ Hankaku ↔ Kanji (半角 ↔ 全角 ↔ 漢字) #define JP_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_korean.h b/quantum/keymap_extras/keymap_korean.h index 644837734e..7bf64c4841 100644 --- a/quantum/keymap_extras/keymap_korean.h +++ b/quantum/keymap_extras/keymap_korean.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_KOREAN_KEYCODES_VERSION "0.0.1" +#define QMK_KOREAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_KOREAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_KOREAN_KEYCODES_VERSION_MINOR 0 +#define QMK_KOREAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define KR_GRV KC_GRV // ` #define KR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_latvian.h b/quantum/keymap_extras/keymap_latvian.h index b1750ed759..4d60c45163 100644 --- a/quantum/keymap_extras/keymap_latvian.h +++ b/quantum/keymap_extras/keymap_latvian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_LATVIAN_KEYCODES_VERSION "0.0.1" +#define QMK_LATVIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_LATVIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_LATVIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_LATVIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define LV_GRV KC_GRV // ` #define LV_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_lithuanian_azerty.h b/quantum/keymap_extras/keymap_lithuanian_azerty.h index 9d6c1b92f0..e88cc75e07 100644 --- a/quantum/keymap_extras/keymap_lithuanian_azerty.h +++ b/quantum/keymap_extras/keymap_lithuanian_azerty.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_LITHUANIAN_AZERTY_KEYCODES_VERSION "0.0.1" +#define QMK_LITHUANIAN_AZERTY_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_LITHUANIAN_AZERTY_KEYCODES_VERSION_MAJOR 0 +#define QMK_LITHUANIAN_AZERTY_KEYCODES_VERSION_MINOR 0 +#define QMK_LITHUANIAN_AZERTY_KEYCODES_VERSION_PATCH 1 + // Aliases #define LT_GRV KC_GRV // ` #define LT_EXLM KC_1 // ! diff --git a/quantum/keymap_extras/keymap_lithuanian_qwerty.h b/quantum/keymap_extras/keymap_lithuanian_qwerty.h index 84df4c8bd2..3321615c1e 100644 --- a/quantum/keymap_extras/keymap_lithuanian_qwerty.h +++ b/quantum/keymap_extras/keymap_lithuanian_qwerty.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_LITHUANIAN_QWERTY_KEYCODES_VERSION "0.0.1" +#define QMK_LITHUANIAN_QWERTY_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_LITHUANIAN_QWERTY_KEYCODES_VERSION_MAJOR 0 +#define QMK_LITHUANIAN_QWERTY_KEYCODES_VERSION_MINOR 0 +#define QMK_LITHUANIAN_QWERTY_KEYCODES_VERSION_PATCH 1 + // Aliases #define LT_GRV KC_GRV // ` #define LT_AOGO KC_1 // Ą diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index ad285f7d18..5d10f19fd5 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_NEO2_KEYCODES_VERSION "0.0.1" +#define QMK_NEO2_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_NEO2_KEYCODES_VERSION_MAJOR 0 +#define QMK_NEO2_KEYCODES_VERSION_MINOR 0 +#define QMK_NEO2_KEYCODES_VERSION_PATCH 1 + // Aliases #define NE_CIRC KC_GRV // ^ (dead) #define NE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index ff952e6c43..3a11b29fc8 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_NORDIC_KEYCODES_VERSION "0.0.1" +#define QMK_NORDIC_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_NORDIC_KEYCODES_VERSION_MAJOR 0 +#define QMK_NORDIC_KEYCODES_VERSION_MINOR 0 +#define QMK_NORDIC_KEYCODES_VERSION_PATCH 1 + // Aliases #define NO_HALF KC_GRV #define NO_PLUS KC_MINS diff --git a/quantum/keymap_extras/keymap_norman.h b/quantum/keymap_extras/keymap_norman.h index 166a2f22a1..d47c2ff8a7 100644 --- a/quantum/keymap_extras/keymap_norman.h +++ b/quantum/keymap_extras/keymap_norman.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_NORMAN_KEYCODES_VERSION "0.0.1" +#define QMK_NORMAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_NORMAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_NORMAN_KEYCODES_VERSION_MINOR 0 +#define QMK_NORMAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define NM_GRV KC_GRV // ` #define NM_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_norwegian.h b/quantum/keymap_extras/keymap_norwegian.h index 0b0cf65813..021b8c3b9c 100644 --- a/quantum/keymap_extras/keymap_norwegian.h +++ b/quantum/keymap_extras/keymap_norwegian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_NORWEGIAN_KEYCODES_VERSION "0.0.1" +#define QMK_NORWEGIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_NORWEGIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_NORWEGIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_NORWEGIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define NO_PIPE KC_GRV // | #define NO_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_plover.h b/quantum/keymap_extras/keymap_plover.h index a01a23c8a3..e7facfd623 100644 --- a/quantum/keymap_extras/keymap_plover.h +++ b/quantum/keymap_extras/keymap_plover.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_PLOVER_KEYCODES_VERSION "0.0.1" +#define QMK_PLOVER_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_PLOVER_KEYCODES_VERSION_MAJOR 0 +#define QMK_PLOVER_KEYCODES_VERSION_MINOR 0 +#define QMK_PLOVER_KEYCODES_VERSION_PATCH 1 + // Aliases #define PV_NUM KC_1 #define PV_LS KC_Q diff --git a/quantum/keymap_extras/keymap_plover_dvorak.h b/quantum/keymap_extras/keymap_plover_dvorak.h index 0ec7b9acd3..5c8a4f9ada 100644 --- a/quantum/keymap_extras/keymap_plover_dvorak.h +++ b/quantum/keymap_extras/keymap_plover_dvorak.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_PLOVER_DVORAK_KEYCODES_VERSION "0.0.1" +#define QMK_PLOVER_DVORAK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_PLOVER_DVORAK_KEYCODES_VERSION_MAJOR 0 +#define QMK_PLOVER_DVORAK_KEYCODES_VERSION_MINOR 0 +#define QMK_PLOVER_DVORAK_KEYCODES_VERSION_PATCH 1 + // Aliases #define PD_NUM DV_1 #define PD_LS DV_Q diff --git a/quantum/keymap_extras/keymap_polish.h b/quantum/keymap_extras/keymap_polish.h index 2448ef1fef..e5e48097f7 100644 --- a/quantum/keymap_extras/keymap_polish.h +++ b/quantum/keymap_extras/keymap_polish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_POLISH_KEYCODES_VERSION "0.0.1" +#define QMK_POLISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_POLISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_POLISH_KEYCODES_VERSION_MINOR 0 +#define QMK_POLISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define PL_GRV KC_GRV // ` #define PL_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_portuguese.h b/quantum/keymap_extras/keymap_portuguese.h index 9f79862679..44abaf6537 100644 --- a/quantum/keymap_extras/keymap_portuguese.h +++ b/quantum/keymap_extras/keymap_portuguese.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_PORTUGUESE_KEYCODES_VERSION "0.0.1" +#define QMK_PORTUGUESE_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_PORTUGUESE_KEYCODES_VERSION_MAJOR 0 +#define QMK_PORTUGUESE_KEYCODES_VERSION_MINOR 0 +#define QMK_PORTUGUESE_KEYCODES_VERSION_PATCH 1 + // Aliases #define PT_BSLS KC_GRV // (backslash) #define PT_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_portuguese_mac_iso.h b/quantum/keymap_extras/keymap_portuguese_mac_iso.h index 5381956b4c..f2d04440fb 100644 --- a/quantum/keymap_extras/keymap_portuguese_mac_iso.h +++ b/quantum/keymap_extras/keymap_portuguese_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_PORTUGUESE_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_PORTUGUESE_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_PORTUGUESE_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_PORTUGUESE_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_PORTUGUESE_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define PT_SECT KC_GRV // § #define PT_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_romanian.h b/quantum/keymap_extras/keymap_romanian.h index 6410fbbe48..9a7239e032 100644 --- a/quantum/keymap_extras/keymap_romanian.h +++ b/quantum/keymap_extras/keymap_romanian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_ROMANIAN_KEYCODES_VERSION "0.0.1" +#define QMK_ROMANIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_ROMANIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_ROMANIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_ROMANIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define RO_DLQU KC_GRV // „ #define RO_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_russian.h b/quantum/keymap_extras/keymap_russian.h index 364e7aba5c..b756a657df 100644 --- a/quantum/keymap_extras/keymap_russian.h +++ b/quantum/keymap_extras/keymap_russian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_RUSSIAN_KEYCODES_VERSION "0.0.1" +#define QMK_RUSSIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_RUSSIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_RUSSIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_RUSSIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define RU_YO KC_GRV // Ё #define RU_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_russian_typewriter.h b/quantum/keymap_extras/keymap_russian_typewriter.h index 18157726ad..45fb1ede04 100644 --- a/quantum/keymap_extras/keymap_russian_typewriter.h +++ b/quantum/keymap_extras/keymap_russian_typewriter.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_RUSSIAN_TYPEWRITER_KEYCODES_VERSION "0.0.1" +#define QMK_RUSSIAN_TYPEWRITER_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_RUSSIAN_TYPEWRITER_KEYCODES_VERSION_MAJOR 0 +#define QMK_RUSSIAN_TYPEWRITER_KEYCODES_VERSION_MINOR 0 +#define QMK_RUSSIAN_TYPEWRITER_KEYCODES_VERSION_PATCH 1 + // Aliases #define RU_PIPE KC_GRV // | #define RU_NUM KC_1 // № diff --git a/quantum/keymap_extras/keymap_serbian.h b/quantum/keymap_extras/keymap_serbian.h index 6421577c22..202322b591 100644 --- a/quantum/keymap_extras/keymap_serbian.h +++ b/quantum/keymap_extras/keymap_serbian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SERBIAN_KEYCODES_VERSION "0.0.1" +#define QMK_SERBIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SERBIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_SERBIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_SERBIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define RS_GRV KC_GRV // ` #define RS_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_serbian_latin.h b/quantum/keymap_extras/keymap_serbian_latin.h index 358c6c76ed..e863aa4ed8 100644 --- a/quantum/keymap_extras/keymap_serbian_latin.h +++ b/quantum/keymap_extras/keymap_serbian_latin.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SERBIAN_LATIN_KEYCODES_VERSION "0.0.1" +#define QMK_SERBIAN_LATIN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SERBIAN_LATIN_KEYCODES_VERSION_MAJOR 0 +#define QMK_SERBIAN_LATIN_KEYCODES_VERSION_MINOR 0 +#define QMK_SERBIAN_LATIN_KEYCODES_VERSION_PATCH 1 + // Aliases #define RS_SLQU KC_GRV // ‚ (dead) #define RS_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_slovak.h b/quantum/keymap_extras/keymap_slovak.h index a777fce16f..f5848a6aaf 100644 --- a/quantum/keymap_extras/keymap_slovak.h +++ b/quantum/keymap_extras/keymap_slovak.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SLOVAK_KEYCODES_VERSION "0.0.1" +#define QMK_SLOVAK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SLOVAK_KEYCODES_VERSION_MAJOR 0 +#define QMK_SLOVAK_KEYCODES_VERSION_MINOR 0 +#define QMK_SLOVAK_KEYCODES_VERSION_PATCH 1 + // Aliases #define SK_SCLN KC_GRV // ; #define SK_PLUS KC_1 // + diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 402a53cd44..502f06ad64 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SLOVENIAN_KEYCODES_VERSION "0.0.1" +#define QMK_SLOVENIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SLOVENIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_SLOVENIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_SLOVENIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define SI_CEDL KC_GRV // ¸ (dead) #define SI_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 714c8cbb7c..dc23aea639 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SPANISH_KEYCODES_VERSION "0.0.1" +#define QMK_SPANISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SPANISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_SPANISH_KEYCODES_VERSION_MINOR 0 +#define QMK_SPANISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define ES_MORD KC_GRV // º #define ES_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_spanish_dvorak.h b/quantum/keymap_extras/keymap_spanish_dvorak.h index b5a6463452..e19a84b7e5 100644 --- a/quantum/keymap_extras/keymap_spanish_dvorak.h +++ b/quantum/keymap_extras/keymap_spanish_dvorak.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SPANISH_DVORAK_KEYCODES_VERSION "0.0.1" +#define QMK_SPANISH_DVORAK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SPANISH_DVORAK_KEYCODES_VERSION_MAJOR 0 +#define QMK_SPANISH_DVORAK_KEYCODES_VERSION_MINOR 0 +#define QMK_SPANISH_DVORAK_KEYCODES_VERSION_PATCH 1 + // Aliases #define DV_MORD KC_GRV // º #define DV_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_spanish_latin_america.h b/quantum/keymap_extras/keymap_spanish_latin_america.h index 651212d4bf..57329d20cd 100644 --- a/quantum/keymap_extras/keymap_spanish_latin_america.h +++ b/quantum/keymap_extras/keymap_spanish_latin_america.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SPANISH_LATIN_AMERICA_KEYCODES_VERSION "0.0.1" +#define QMK_SPANISH_LATIN_AMERICA_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SPANISH_LATIN_AMERICA_KEYCODES_VERSION_MAJOR 0 +#define QMK_SPANISH_LATIN_AMERICA_KEYCODES_VERSION_MINOR 0 +#define QMK_SPANISH_LATIN_AMERICA_KEYCODES_VERSION_PATCH 1 + // Aliases #define ES_PIPE KC_GRV // | #define ES_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h index 23ec4102d8..a50f8af30d 100644 --- a/quantum/keymap_extras/keymap_swedish.h +++ b/quantum/keymap_extras/keymap_swedish.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWEDISH_KEYCODES_VERSION "0.0.1" +#define QMK_SWEDISH_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWEDISH_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWEDISH_KEYCODES_VERSION_MINOR 0 +#define QMK_SWEDISH_KEYCODES_VERSION_PATCH 1 + // Aliases #define SE_SECT KC_GRV // § #define SE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swedish_mac_ansi.h b/quantum/keymap_extras/keymap_swedish_mac_ansi.h index 18061f0be9..642c161dab 100644 --- a/quantum/keymap_extras/keymap_swedish_mac_ansi.h +++ b/quantum/keymap_extras/keymap_swedish_mac_ansi.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWEDISH_MAC_ANSI_KEYCODES_VERSION "0.0.1" +#define QMK_SWEDISH_MAC_ANSI_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWEDISH_MAC_ANSI_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWEDISH_MAC_ANSI_KEYCODES_VERSION_MINOR 0 +#define QMK_SWEDISH_MAC_ANSI_KEYCODES_VERSION_PATCH 1 + // Aliases #define SE_LABK KC_GRV // < #define SE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swedish_mac_iso.h b/quantum/keymap_extras/keymap_swedish_mac_iso.h index 0c68ffcbd4..50387364cf 100644 --- a/quantum/keymap_extras/keymap_swedish_mac_iso.h +++ b/quantum/keymap_extras/keymap_swedish_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWEDISH_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_SWEDISH_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWEDISH_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWEDISH_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_SWEDISH_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define SE_SECT KC_GRV // § #define SE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h b/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h index 043a7c9fc2..be1581bb3d 100644 --- a/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h +++ b/quantum/keymap_extras/keymap_swedish_pro_mac_ansi.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWEDISH_PRO_MAC_ANSI_KEYCODES_VERSION "0.0.1" +#define QMK_SWEDISH_PRO_MAC_ANSI_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWEDISH_PRO_MAC_ANSI_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWEDISH_PRO_MAC_ANSI_KEYCODES_VERSION_MINOR 0 +#define QMK_SWEDISH_PRO_MAC_ANSI_KEYCODES_VERSION_PATCH 1 + // Aliases #define SE_LABK KC_GRV // < #define SE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h b/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h index 1d691feef1..d50213f987 100644 --- a/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h +++ b/quantum/keymap_extras/keymap_swedish_pro_mac_iso.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWEDISH_PRO_MAC_ISO_KEYCODES_VERSION "0.0.1" +#define QMK_SWEDISH_PRO_MAC_ISO_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWEDISH_PRO_MAC_ISO_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWEDISH_PRO_MAC_ISO_KEYCODES_VERSION_MINOR 0 +#define QMK_SWEDISH_PRO_MAC_ISO_KEYCODES_VERSION_PATCH 1 + // Aliases #define SE_SECT KC_GRV // § #define SE_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_swiss_de.h b/quantum/keymap_extras/keymap_swiss_de.h index 5411353a5f..4ebdb5c610 100644 --- a/quantum/keymap_extras/keymap_swiss_de.h +++ b/quantum/keymap_extras/keymap_swiss_de.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWISS_DE_KEYCODES_VERSION "0.0.1" +#define QMK_SWISS_DE_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWISS_DE_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWISS_DE_KEYCODES_VERSION_MINOR 0 +#define QMK_SWISS_DE_KEYCODES_VERSION_PATCH 1 + #undef CH_H // Aliases diff --git a/quantum/keymap_extras/keymap_swiss_fr.h b/quantum/keymap_extras/keymap_swiss_fr.h index a9a9cab162..11fcc6536d 100644 --- a/quantum/keymap_extras/keymap_swiss_fr.h +++ b/quantum/keymap_extras/keymap_swiss_fr.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_SWISS_FR_KEYCODES_VERSION "0.0.1" +#define QMK_SWISS_FR_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_SWISS_FR_KEYCODES_VERSION_MAJOR 0 +#define QMK_SWISS_FR_KEYCODES_VERSION_MINOR 0 +#define QMK_SWISS_FR_KEYCODES_VERSION_PATCH 1 + #undef CH_H // Aliases diff --git a/quantum/keymap_extras/keymap_turkish_f.h b/quantum/keymap_extras/keymap_turkish_f.h index dcf9e815d7..bbdaa3af25 100644 --- a/quantum/keymap_extras/keymap_turkish_f.h +++ b/quantum/keymap_extras/keymap_turkish_f.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_TURKISH_F_KEYCODES_VERSION "0.0.1" +#define QMK_TURKISH_F_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_TURKISH_F_KEYCODES_VERSION_MAJOR 0 +#define QMK_TURKISH_F_KEYCODES_VERSION_MINOR 0 +#define QMK_TURKISH_F_KEYCODES_VERSION_PATCH 1 + // Aliases #define TR_PLUS KC_GRV // + #define TR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_turkish_q.h b/quantum/keymap_extras/keymap_turkish_q.h index a86af180cd..d3fa00d7ae 100644 --- a/quantum/keymap_extras/keymap_turkish_q.h +++ b/quantum/keymap_extras/keymap_turkish_q.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_TURKISH_Q_KEYCODES_VERSION "0.0.1" +#define QMK_TURKISH_Q_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_TURKISH_Q_KEYCODES_VERSION_MAJOR 0 +#define QMK_TURKISH_Q_KEYCODES_VERSION_MINOR 0 +#define QMK_TURKISH_Q_KEYCODES_VERSION_PATCH 1 + // Aliases #define TR_DQUO KC_GRV // " #define TR_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index 30f9b972db..7490af6cf6 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_UK_KEYCODES_VERSION "0.0.1" +#define QMK_UK_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_UK_KEYCODES_VERSION_MAJOR 0 +#define QMK_UK_KEYCODES_VERSION_MINOR 0 +#define QMK_UK_KEYCODES_VERSION_PATCH 1 + // Aliases #define UK_GRV KC_GRV // ` #define UK_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_ukrainian.h b/quantum/keymap_extras/keymap_ukrainian.h index d3f82a2194..78e39f8c75 100644 --- a/quantum/keymap_extras/keymap_ukrainian.h +++ b/quantum/keymap_extras/keymap_ukrainian.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_UKRAINIAN_KEYCODES_VERSION "0.0.1" +#define QMK_UKRAINIAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_UKRAINIAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_UKRAINIAN_KEYCODES_VERSION_MINOR 0 +#define QMK_UKRAINIAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define UA_QUOT KC_GRV // ' #define UA_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_us.h b/quantum/keymap_extras/keymap_us.h index 74c9b8e7f8..b6e380ab23 100644 --- a/quantum/keymap_extras/keymap_us.h +++ b/quantum/keymap_extras/keymap_us.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_US_KEYCODES_VERSION "0.0.1" +#define QMK_US_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_US_KEYCODES_VERSION_MAJOR 0 +#define QMK_US_KEYCODES_VERSION_MINOR 0 +#define QMK_US_KEYCODES_VERSION_PATCH 1 + // Aliases #define KC_TILD S(KC_GRAVE) // ~ #define KC_EXLM S(KC_1) // ! diff --git a/quantum/keymap_extras/keymap_us_extended.h b/quantum/keymap_extras/keymap_us_extended.h index d17d3e603e..4262a7c44e 100644 --- a/quantum/keymap_extras/keymap_us_extended.h +++ b/quantum/keymap_extras/keymap_us_extended.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_US_EXTENDED_KEYCODES_VERSION "0.0.1" +#define QMK_US_EXTENDED_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_US_EXTENDED_KEYCODES_VERSION_MAJOR 0 +#define QMK_US_EXTENDED_KEYCODES_VERSION_MINOR 0 +#define QMK_US_EXTENDED_KEYCODES_VERSION_PATCH 1 + // Aliases #define US_GRV KC_GRV // ` #define US_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_us_international.h b/quantum/keymap_extras/keymap_us_international.h index a9617494a8..adc7051fe4 100644 --- a/quantum/keymap_extras/keymap_us_international.h +++ b/quantum/keymap_extras/keymap_us_international.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_US_INTERNATIONAL_KEYCODES_VERSION "0.0.1" +#define QMK_US_INTERNATIONAL_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_US_INTERNATIONAL_KEYCODES_VERSION_MAJOR 0 +#define QMK_US_INTERNATIONAL_KEYCODES_VERSION_MINOR 0 +#define QMK_US_INTERNATIONAL_KEYCODES_VERSION_PATCH 1 + // Aliases #define US_DGRV KC_GRV // ` (dead) #define US_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_us_international_linux.h b/quantum/keymap_extras/keymap_us_international_linux.h index b13039be05..db315968d6 100644 --- a/quantum/keymap_extras/keymap_us_international_linux.h +++ b/quantum/keymap_extras/keymap_us_international_linux.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_US_INTERNATIONAL_LINUX_KEYCODES_VERSION "0.0.1" +#define QMK_US_INTERNATIONAL_LINUX_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_US_INTERNATIONAL_LINUX_KEYCODES_VERSION_MAJOR 0 +#define QMK_US_INTERNATIONAL_LINUX_KEYCODES_VERSION_MINOR 0 +#define QMK_US_INTERNATIONAL_LINUX_KEYCODES_VERSION_PATCH 1 + // Aliases #define US_DGRV KC_GRV // ` (dead) #define US_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_workman.h b/quantum/keymap_extras/keymap_workman.h index 29396fdec1..727e44512c 100644 --- a/quantum/keymap_extras/keymap_workman.h +++ b/quantum/keymap_extras/keymap_workman.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_WORKMAN_KEYCODES_VERSION "0.0.1" +#define QMK_WORKMAN_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_WORKMAN_KEYCODES_VERSION_MAJOR 0 +#define QMK_WORKMAN_KEYCODES_VERSION_MINOR 0 +#define QMK_WORKMAN_KEYCODES_VERSION_PATCH 1 + // Aliases #define WK_GRV KC_GRV // ` #define WK_1 KC_1 // 1 diff --git a/quantum/keymap_extras/keymap_workman_zxcvm.h b/quantum/keymap_extras/keymap_workman_zxcvm.h index f7a5689f0f..4655af60d6 100644 --- a/quantum/keymap_extras/keymap_workman_zxcvm.h +++ b/quantum/keymap_extras/keymap_workman_zxcvm.h @@ -27,6 +27,12 @@ #include "keycodes.h" // clang-format off +#define QMK_WORKMAN_ZXCVM_KEYCODES_VERSION "0.0.1" +#define QMK_WORKMAN_ZXCVM_KEYCODES_VERSION_BCD 0x00000001 +#define QMK_WORKMAN_ZXCVM_KEYCODES_VERSION_MAJOR 0 +#define QMK_WORKMAN_ZXCVM_KEYCODES_VERSION_MINOR 0 +#define QMK_WORKMAN_ZXCVM_KEYCODES_VERSION_PATCH 1 + // Aliases #define WK_GRV KC_GRV // ` #define WK_1 KC_1 // 1 From 5f31d5cc80fe7d4daec613a7b8813843b7d97238 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 02:14:40 +0100 Subject: [PATCH 347/592] Resolve alias for `qmk new-keymap` keyboard prompts (#25210) --- lib/python/qmk/cli/new/keymap.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index 16865ceb00..20a0c0198c 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -104,7 +104,9 @@ def new_keymap(cli): converter = cli.config.new_keymap.converter if cli.args.skip_converter or cli.config.new_keymap.converter else prompt_converter(kb_name) # check directories - if not is_keyboard(kb_name): + try: + kb_name = keyboard_folder(kb_name) + except ValueError: cli.log.error(f'Keyboard {{fg_cyan}}{kb_name}{{fg_reset}} does not exist! Please choose a valid name.') return False From 0c0d038a404afc3c5621f2a0c1ad541803f68e28 Mon Sep 17 00:00:00 2001 From: "Silvino R." <366673+silvinor@users.noreply.github.com> Date: Mon, 5 May 2025 11:46:11 +1000 Subject: [PATCH 348/592] [Keyboard] Add Binepad KN01 (#25224) * Add Binepad NeoKnob KN01 * post @waffle87 recommendations --- keyboards/binepad/kn01/keyboard.json | 37 +++++++++++++++++++ .../binepad/kn01/keymaps/default/keymap.json | 29 +++++++++++++++ keyboards/binepad/kn01/readme.md | 29 +++++++++++++++ 3 files changed, 95 insertions(+) create mode 100755 keyboards/binepad/kn01/keyboard.json create mode 100644 keyboards/binepad/kn01/keymaps/default/keymap.json create mode 100755 keyboards/binepad/kn01/readme.md diff --git a/keyboards/binepad/kn01/keyboard.json b/keyboards/binepad/kn01/keyboard.json new file mode 100755 index 0000000000..d7edaee77e --- /dev/null +++ b/keyboards/binepad/kn01/keyboard.json @@ -0,0 +1,37 @@ +{ + "manufacturer": "Binepad", + "keyboard_name": "KN01", + "maintainer": "Binpad", + "bootloader": "stm32duino", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "B3", "pin_b": "B4"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "cols": ["A15"], + "rows": ["A8"] + }, + "processor": "STM32F103", + "url": "http://binepad.com", + "usb": { + "device_version": "1.0.0", + "pid": "0x4040", + "vid": "0x4249" + }, + "community_layouts": ["ortho_1x1"], + "layouts": { + "LAYOUT_ortho_1x1": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "w": 2, "h": 2} + ] + } + } +} diff --git a/keyboards/binepad/kn01/keymaps/default/keymap.json b/keyboards/binepad/kn01/keymaps/default/keymap.json new file mode 100644 index 0000000000..d6a3835f6c --- /dev/null +++ b/keyboards/binepad/kn01/keymaps/default/keymap.json @@ -0,0 +1,29 @@ +{ + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [ + { + "ccw": "KC_VOLD", + "cw": "KC_VOLU" + } + ], + [ + { + "ccw": "KC_MS_WH_DOWN", + "cw": "KC_MS_WH_UP" + } + ] + ], + "keyboard": "binepad/kn01", + "keymap": "default", + "layers": [ + ["LT(1, KC_MUTE)"], + ["_______"] + ], + "layout": "LAYOUT_ortho_1x1", + "version": 1 +} diff --git a/keyboards/binepad/kn01/readme.md b/keyboards/binepad/kn01/readme.md new file mode 100755 index 0000000000..e65709a540 --- /dev/null +++ b/keyboards/binepad/kn01/readme.md @@ -0,0 +1,29 @@ +# BINEPAD NEOKNOB KN01 + +![Binepad NeoKnob KN01](https://i.imgur.com/N8GXq7P.png) + +The KN01 is a multifunction knob, which can be rotated, pressed, and rotated while pressed. + +* Keyboard Maintainer: [Binpad](https://github.com/binepad) +* Hardware Supported: **NEOKNOB KN01** +* Hardware Availability: [Binepad.com](https://www.binepad.com/products/kn01) + +Make example for this keyboard (after setting up your build environment): + + make binepad/kn01:default + +Flashing example for this keyboard: + + make binepad/kn01: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 knob while plugging in the keyboard's USB cable +* **Physical reset button**: Briefly press the button on the underside of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 5611a4006493eb0ec7cf815d4a7a24a671a16df6 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 03:28:33 +0100 Subject: [PATCH 349/592] Add battery changed callbacks (#25207) --- docs/drivers/battery.md | 22 ++++++++++++++++++++++ drivers/battery/battery.c | 10 ++++++++++ drivers/battery/battery.h | 12 ++++++++++++ 3 files changed, 44 insertions(+) diff --git a/docs/drivers/battery.md b/docs/drivers/battery.md index b1f75c1156..0bc8e5aec9 100644 --- a/docs/drivers/battery.md +++ b/docs/drivers/battery.md @@ -49,3 +49,25 @@ Sample battery level. #### Return Value {#api-battery-get-percent-return} The battery percentage, in the range 0-100. + +## Callbacks + +### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user} + +User hook called when battery level changed. + +### Arguments {#api-battery-percent-changed-user-arguments} + + - `uint8_t level` + The battery percentage, in the range 0-100. + +--- + +### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb} + +Keyboard hook called when battery level changed. + +### Arguments {#api-battery-percent-changed-kb-arguments} + + - `uint8_t level` + The battery percentage, in the range 0-100. diff --git a/drivers/battery/battery.c b/drivers/battery/battery.c index 65497399e8..faf3c5a214 100644 --- a/drivers/battery/battery.c +++ b/drivers/battery/battery.c @@ -17,11 +17,21 @@ void battery_init(void) { last_bat_level = battery_driver_sample_percent(); } +__attribute__((weak)) void battery_percent_changed_user(uint8_t level) {} +__attribute__((weak)) void battery_percent_changed_kb(uint8_t level) {} + +static void handle_percent_changed(void) { + battery_percent_changed_user(last_bat_level); + battery_percent_changed_kb(last_bat_level); +} + void battery_task(void) { static uint32_t bat_timer = 0; if (timer_elapsed32(bat_timer) > BATTERY_SAMPLE_INTERVAL) { last_bat_level = battery_driver_sample_percent(); + handle_percent_changed(); + bat_timer = timer_read32(); } } diff --git a/drivers/battery/battery.h b/drivers/battery/battery.h index 831b1f07e5..0985723eaa 100644 --- a/drivers/battery/battery.h +++ b/drivers/battery/battery.h @@ -31,4 +31,16 @@ void battery_task(void); */ uint8_t battery_get_percent(void); +/** + * \brief user hook called when battery level changed. + * + */ +void battery_percent_changed_user(uint8_t level); + +/** + * \brief keyboard hook called when battery level changed. + * + */ +void battery_percent_changed_kb(uint8_t level); + /** \} */ From 614b631ee2649de67a830a39393af416acee58a8 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 03:43:14 +0100 Subject: [PATCH 350/592] Ensure `qmk_userspace_paths` maintains detected order (#25204) --- lib/python/qmk/userspace.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/python/qmk/userspace.py b/lib/python/qmk/userspace.py index 1c2a97f9c1..881490f796 100644 --- a/lib/python/qmk/userspace.py +++ b/lib/python/qmk/userspace.py @@ -12,29 +12,30 @@ from qmk.json_encoders import UserspaceJSONEncoder def qmk_userspace_paths(): - test_dirs = set() + test_dirs = [] # If we're already in a directory with a qmk.json and a keyboards or layouts directory, interpret it as userspace if environ.get('ORIG_CWD') is not None: current_dir = Path(environ['ORIG_CWD']) while len(current_dir.parts) > 1: if (current_dir / 'qmk.json').is_file(): - test_dirs.add(current_dir) + test_dirs.append(current_dir) current_dir = current_dir.parent # If we have a QMK_USERSPACE environment variable, use that if environ.get('QMK_USERSPACE') is not None: current_dir = Path(environ['QMK_USERSPACE']).expanduser() if current_dir.is_dir(): - test_dirs.add(current_dir) + test_dirs.append(current_dir) # If someone has configured a directory, use that if cli.config.user.overlay_dir is not None: current_dir = Path(cli.config.user.overlay_dir).expanduser().resolve() if current_dir.is_dir(): - test_dirs.add(current_dir) + test_dirs.append(current_dir) - return list(test_dirs) + # remove duplicates while maintaining the current order + return list(dict.fromkeys(test_dirs)) def qmk_userspace_validate(path): From 842c8401452f83e691a9df97ffba52a389c885c8 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 5 May 2025 04:05:04 +0100 Subject: [PATCH 351/592] Bind Bluetooth driver to `host_driver_t` (#25199) --- builddefs/common_features.mk | 5 +- drivers/bluetooth/bluetooth.c | 68 ++++++---------------- drivers/bluetooth/bluetooth.h | 26 +++++++++ drivers/bluetooth/bluetooth_drivers.c | 71 +++++++++++++++++++++++ quantum/connection/connection.c | 14 ++--- tmk_core/protocol/host.c | 83 +++++++++++++++++---------- 6 files changed, 174 insertions(+), 93 deletions(-) create mode 100644 drivers/bluetooth/bluetooth_drivers.c diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 5d007e099d..f62b925817 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -898,16 +898,17 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) NO_USB_STARTUP_CHECK := yes CONNECTION_ENABLE := yes COMMON_VPATH += $(DRIVER_PATH)/bluetooth + SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le) SPI_DRIVER_REQUIRED = yes - SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c + SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp endif ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42) UART_DRIVER_REQUIRED = yes - SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c + SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c SRC += $(DRIVER_PATH)/bluetooth/rn42.c endif endif diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c index d5382401e7..3d41d8b11c 100644 --- a/drivers/bluetooth/bluetooth.c +++ b/drivers/bluetooth/bluetooth.c @@ -1,62 +1,26 @@ -/* - * Copyright 2022 - * - * 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 . - */ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later #include "bluetooth.h" -#if defined(BLUETOOTH_BLUEFRUIT_LE) -# include "bluefruit_le.h" -#elif defined(BLUETOOTH_RN42) -# include "rn42.h" -#endif +__attribute__((weak)) void bluetooth_init(void) {} -void bluetooth_init(void) { -#if defined(BLUETOOTH_BLUEFRUIT_LE) - bluefruit_le_init(); -#elif defined(BLUETOOTH_RN42) - rn42_init(); -#endif +__attribute__((weak)) void bluetooth_task(void) {} + +__attribute__((weak)) bool bluetooth_is_connected(void) { + return true; } -void bluetooth_task(void) { -#if defined(BLUETOOTH_BLUEFRUIT_LE) - bluefruit_le_task(); -#endif +__attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) { + return 0; } -void bluetooth_send_keyboard(report_keyboard_t *report) { -#if defined(BLUETOOTH_BLUEFRUIT_LE) - bluefruit_le_send_keyboard(report); -#elif defined(BLUETOOTH_RN42) - rn42_send_keyboard(report); -#endif -} +__attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {} -void bluetooth_send_mouse(report_mouse_t *report) { -#if defined(BLUETOOTH_BLUEFRUIT_LE) - bluefruit_le_send_mouse(report); -#elif defined(BLUETOOTH_RN42) - rn42_send_mouse(report); -#endif -} +__attribute__((weak)) void bluetooth_send_nkro(report_nkro_t *report) {} -void bluetooth_send_consumer(uint16_t usage) { -#if defined(BLUETOOTH_BLUEFRUIT_LE) - bluefruit_le_send_consumer(usage); -#elif defined(BLUETOOTH_RN42) - rn42_send_consumer(usage); -#endif -} +__attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {} + +__attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {} + +__attribute__((weak)) void bluetooth_send_system(uint16_t usage) {} diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h index 2e4d0df538..fe67c0c968 100644 --- a/drivers/bluetooth/bluetooth.h +++ b/drivers/bluetooth/bluetooth.h @@ -30,6 +30,18 @@ void bluetooth_init(void); */ void bluetooth_task(void); +/** + * \brief Detects if Bluetooth is connected. + * + * \return `true` if connected, `false` otherwise. + */ +bool bluetooth_is_connected(void); + +/** + * \brief Get current LED state. + */ +uint8_t bluetooth_keyboard_leds(void); + /** * \brief Send a keyboard report. * @@ -37,6 +49,13 @@ void bluetooth_task(void); */ void bluetooth_send_keyboard(report_keyboard_t *report); +/** + * \brief Send a nkro report. + * + * \param report The nkro report to send. + */ +void bluetooth_send_nkro(report_nkro_t *report); + /** * \brief Send a mouse report. * @@ -50,3 +69,10 @@ void bluetooth_send_mouse(report_mouse_t *report); * \param usage The consumer usage to send. */ void bluetooth_send_consumer(uint16_t usage); + +/** + * \brief Send a system usage. + * + * \param usage The system usage to send. + */ +void bluetooth_send_system(uint16_t usage); diff --git a/drivers/bluetooth/bluetooth_drivers.c b/drivers/bluetooth/bluetooth_drivers.c new file mode 100644 index 0000000000..b91d4501e6 --- /dev/null +++ b/drivers/bluetooth/bluetooth_drivers.c @@ -0,0 +1,71 @@ +/* + * Copyright 2022 + * + * 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 "bluetooth.h" + +#if defined(BLUETOOTH_BLUEFRUIT_LE) +# include "bluefruit_le.h" +#elif defined(BLUETOOTH_RN42) +# include "rn42.h" +#endif + +void bluetooth_init(void) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + bluefruit_le_init(); +#elif defined(BLUETOOTH_RN42) + rn42_init(); +#endif +} + +void bluetooth_task(void) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + bluefruit_le_task(); +#endif +} + +bool bluetooth_is_connected(void) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + return bluefruit_le_is_connected(); +#else + // TODO: drivers should check if BT is connected here + return true; +#endif +} + +void bluetooth_send_keyboard(report_keyboard_t *report) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + bluefruit_le_send_keyboard(report); +#elif defined(BLUETOOTH_RN42) + rn42_send_keyboard(report); +#endif +} + +void bluetooth_send_mouse(report_mouse_t *report) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + bluefruit_le_send_mouse(report); +#elif defined(BLUETOOTH_RN42) + rn42_send_mouse(report); +#endif +} + +void bluetooth_send_consumer(uint16_t usage) { +#if defined(BLUETOOTH_BLUEFRUIT_LE) + bluefruit_le_send_consumer(usage); +#elif defined(BLUETOOTH_RN42) + rn42_send_consumer(usage); +#endif +} diff --git a/quantum/connection/connection.c b/quantum/connection/connection.c index c7f3c4b424..1ff8876876 100644 --- a/quantum/connection/connection.c +++ b/quantum/connection/connection.c @@ -5,6 +5,10 @@ #include "usb_util.h" #include "util.h" +#ifdef BLUETOOTH_ENABLE +# include "bluetooth.h" +#endif + // ======== DEPRECATED DEFINES - DO NOT USE ======== #ifdef OUTPUT_DEFAULT # undef CONNECTION_HOST_DEFAULT @@ -14,16 +18,6 @@ __attribute__((weak)) void set_output_user(uint8_t output) {} // ======== -#ifdef BLUETOOTH_ENABLE -# ifdef BLUETOOTH_BLUEFRUIT_LE -# include "bluefruit_le.h" -# define bluetooth_is_connected() bluefruit_le_is_connected() -# else -// TODO: drivers should check if BT is connected here -# define bluetooth_is_connected() true -# endif -#endif - #define CONNECTION_HOST_INVALID 0xFF #ifndef CONNECTION_HOST_DEFAULT diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c index 453952049f..4f3867df08 100644 --- a/tmk_core/protocol/host.c +++ b/tmk_core/protocol/host.c @@ -30,12 +30,31 @@ along with this program. If not, see . # include "joystick.h" #endif -#ifdef BLUETOOTH_ENABLE -# ifndef CONNECTION_ENABLE -# error CONNECTION_ENABLE required and not enabled -# endif +#ifdef CONNECTION_ENABLE # include "connection.h" +#endif + +#ifdef BLUETOOTH_ENABLE # include "bluetooth.h" + +static void bluetooth_send_extra(report_extra_t *report) { + switch (report->report_id) { + case REPORT_ID_SYSTEM: + bluetooth_send_system(report->usage); + return; + case REPORT_ID_CONSUMER: + bluetooth_send_consumer(report->usage); + return; + } +} + +host_driver_t bt_driver = { + .keyboard_leds = bluetooth_keyboard_leds, + .send_keyboard = bluetooth_send_keyboard, + .send_nkro = bluetooth_send_nkro, + .send_mouse = bluetooth_send_mouse, + .send_extra = bluetooth_send_extra, +}; #endif #ifdef NKRO_ENABLE @@ -55,6 +74,22 @@ host_driver_t *host_get_driver(void) { return driver; } +static host_driver_t *host_get_active_driver(void) { +#ifdef CONNECTION_ENABLE + switch (connection_get_host()) { +# ifdef BLUETOOTH_ENABLE + case CONNECTION_HOST_BLUETOOTH: + return &bt_driver; +# endif + case CONNECTION_HOST_NONE: + return NULL; + default: + break; + } +#endif + return driver; +} + #ifdef SPLIT_KEYBOARD uint8_t split_led_state = 0; void set_split_host_keyboard_leds(uint8_t led_state) { @@ -66,7 +101,10 @@ uint8_t host_keyboard_leds(void) { #ifdef SPLIT_KEYBOARD if (!is_keyboard_master()) return split_led_state; #endif - if (!driver) return 0; + + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->keyboard_leds) return 0; + return (*driver->keyboard_leds)(); } @@ -76,14 +114,9 @@ led_t host_keyboard_led_state(void) { /* send report */ void host_keyboard_send(report_keyboard_t *report) { -#ifdef BLUETOOTH_ENABLE - if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { - bluetooth_send_keyboard(report); - return; - } -#endif + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_keyboard) return; - if (!driver) return; #ifdef KEYBOARD_SHARED_EP report->report_id = REPORT_ID_KEYBOARD; #endif @@ -99,7 +132,9 @@ void host_keyboard_send(report_keyboard_t *report) { } void host_nkro_send(report_nkro_t *report) { - if (!driver) return; + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_nkro) return; + report->report_id = REPORT_ID_NKRO; (*driver->send_nkro)(report); @@ -113,14 +148,9 @@ void host_nkro_send(report_nkro_t *report) { } void host_mouse_send(report_mouse_t *report) { -#ifdef BLUETOOTH_ENABLE - if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { - bluetooth_send_mouse(report); - return; - } -#endif + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_mouse) return; - if (!driver) return; #ifdef MOUSE_SHARED_EP report->report_id = REPORT_ID_MOUSE; #endif @@ -136,7 +166,8 @@ void host_system_send(uint16_t usage) { if (usage == last_system_usage) return; last_system_usage = usage; - if (!driver) return; + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_extra) return; report_extra_t report = { .report_id = REPORT_ID_SYSTEM, @@ -149,14 +180,8 @@ void host_consumer_send(uint16_t usage) { if (usage == last_consumer_usage) return; last_consumer_usage = usage; -#ifdef BLUETOOTH_ENABLE - if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { - bluetooth_send_consumer(usage); - return; - } -#endif - - if (!driver) return; + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_extra) return; report_extra_t report = { .report_id = REPORT_ID_CONSUMER, From ac991405d0c9f47e815786f4732edd00d0f4f571 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 6 May 2025 09:52:41 +1000 Subject: [PATCH 352/592] Deprecate `qmk generate-compilation-database`. (#25237) --- docs/ChangeLog/20250525/pr25237.md | 3 + docs/cli_commands.md | 58 +++--- docs/other_vscode.md | 2 +- lib/python/qmk/build_targets.py | 2 +- .../qmk/cli/generate/compilation_database.py | 174 +----------------- lib/python/qmk/compilation_database.py | 137 ++++++++++++++ 6 files changed, 179 insertions(+), 197 deletions(-) create mode 100644 docs/ChangeLog/20250525/pr25237.md mode change 100755 => 100644 lib/python/qmk/cli/generate/compilation_database.py create mode 100755 lib/python/qmk/compilation_database.py diff --git a/docs/ChangeLog/20250525/pr25237.md b/docs/ChangeLog/20250525/pr25237.md new file mode 100644 index 0000000000..ca09e93ebc --- /dev/null +++ b/docs/ChangeLog/20250525/pr25237.md @@ -0,0 +1,3 @@ +# Deprecation of `qmk generate-compilation-database` + +This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead. diff --git a/docs/cli_commands.md b/docs/cli_commands.md index d17b0eda23..c6a7ffe191 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -17,7 +17,7 @@ qmk compile [-c] **Usage for Keymaps**: ``` -qmk compile [-c] [-e =] [-j ] -kb -km +qmk compile [-c] [-e =] [-j ] [--compiledb] -kb -km ``` **Usage in Keyboard Directory**: @@ -84,6 +84,25 @@ The `num_jobs` argument determines the maximum number of jobs that can be used. qmk compile -j 0 -kb ``` +**Compilation Database**: + +Creates a `compile_commands.json` file. + +Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! Compiling using this argument can create this for you. + +**Example:** + +``` +$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak +$ qmk compile --compiledb +Ψ Making clean +Ψ Gathering build instructions from make ........ +Ψ Found 63 compile commands +Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json +Ψ Compiling keymap with make ........ +... build log continues ... +``` + ## `qmk flash` This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl `. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders. @@ -694,33 +713,6 @@ qmk format-c qmk format-c -b branch_name ``` -## `qmk generate-compilation-database` - -**Usage**: - -``` -qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP] -``` - -Creates a `compile_commands.json` file. - -Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! The qmk tool can build this for you. - -This command needs to know which keyboard and keymap to build. It uses the same configuration options as the `qmk compile` command: arguments, current directory, and config files. - -**Example:** - -``` -$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak -$ qmk generate-compilation-database -Ψ Making clean -Ψ Gathering build instructions from make -n gh60/satan:colemak -Ψ Found 50 compile commands -Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json -``` - -Now open your dev environment and live a squiggly-free life. - ## `qmk docs` This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936. @@ -885,3 +877,13 @@ Run single test: ``` qmk test-c --test basic ``` + +## `qmk generate-compilation-database` + +**Usage**: + +``` +qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP] +``` + +This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead. diff --git a/docs/other_vscode.md b/docs/other_vscode.md index ab2b23e96b..0b39746a6e 100644 --- a/docs/other_vscode.md +++ b/docs/other_vscode.md @@ -112,7 +112,7 @@ Restart once you've installed any extensions. Using the [standard `compile_commands.json` database](https://clang.llvm.org/docs/JSONCompilationDatabase.html), we can get the VS code _clangd_ extension to use the correct includes and defines used for your keyboard and keymap. -1. Run `qmk generate-compilation-database -kb -km ` to generate the `compile_commands.json`. +1. Run `qmk compile -kb -km --compiledb` to generate the `compile_commands.json`. 1. Inside VS code, press Ctrl + Shift + P (macOS: Command + Shift + P) to open the command palette. 1. Start typing `clangd: Download Language Server` and select it when it appears. Note that this only needs to be done once on clangd extension installation, if it didn't already ask to do so. 1. Inside VS code, press Ctrl + Shift + P (macOS: Command + Shift + P) to open the command palette. diff --git a/lib/python/qmk/build_targets.py b/lib/python/qmk/build_targets.py index df5a5ffb42..35a5f89f91 100644 --- a/lib/python/qmk/build_targets.py +++ b/lib/python/qmk/build_targets.py @@ -12,6 +12,7 @@ from qmk.keyboard import keyboard_folder from qmk.info import keymap_json from qmk.keymap import locate_keymap from qmk.path import is_under_qmk_firmware, is_under_qmk_userspace, unix_style_path +from qmk.compilation_database import write_compilation_database # These must be kept in the order in which they're applied to $(TARGET) in the makefiles in order to ensure consistency. TARGET_FILENAME_MODIFIERS = ['FORCE_LAYOUT', 'CONVERT_TO'] @@ -150,7 +151,6 @@ class BuildTarget: def generate_compilation_database(self, build_target: str = None, skip_clean: bool = False, **env_vars) -> None: self.prepare_build(build_target=build_target, **env_vars) command = self.compile_command(build_target=build_target, dry_run=True, **env_vars) - from qmk.cli.generate.compilation_database import write_compilation_database # Lazy load due to circular references output_path = QMK_FIRMWARE / 'compile_commands.json' ret = write_compilation_database(command=command, output_path=output_path, skip_clean=skip_clean, **env_vars) if ret and output_path.exists() and HAS_QMK_USERSPACE: diff --git a/lib/python/qmk/cli/generate/compilation_database.py b/lib/python/qmk/cli/generate/compilation_database.py old mode 100755 new mode 100644 index b9c716bf0c..339b53c2c2 --- a/lib/python/qmk/cli/generate/compilation_database.py +++ b/lib/python/qmk/cli/generate/compilation_database.py @@ -1,169 +1,9 @@ -"""Creates a compilation database for the given keyboard build. -""" - -import json -import os -import re -import shlex -import shutil -from functools import lru_cache -from pathlib import Path -from typing import Dict, Iterator, List, Union - -from milc import cli, MILC - -from qmk.commands import find_make -from qmk.constants import QMK_FIRMWARE -from qmk.decorators import automagic_keyboard, automagic_keymap -from qmk.keyboard import keyboard_completer, keyboard_folder -from qmk.keymap import keymap_completer -from qmk.build_targets import KeyboardKeymapBuildTarget +from milc import cli -@lru_cache(maxsize=10) -def system_libs(binary: str) -> List[Path]: - """Find the system include directory that the given build tool uses. - """ - cli.log.debug("searching for system library directory for binary: %s", binary) - - # Actually query xxxxxx-gcc to find its include paths. - if binary.endswith("gcc") or binary.endswith("g++"): - # (TODO): Remove 'stdin' once 'input' no longer causes issues under MSYS - result = cli.run([binary, '-E', '-Wp,-v', '-'], capture_output=True, check=True, stdin=None, input='\n') - paths = [] - for line in result.stderr.splitlines(): - if line.startswith(" "): - paths.append(Path(line.strip()).resolve()) - return paths - - return list(Path(binary).resolve().parent.parent.glob("*/include")) if binary else [] - - -@lru_cache(maxsize=10) -def cpu_defines(binary: str, compiler_args: str) -> List[str]: - cli.log.debug("gathering definitions for compilation: %s %s", binary, compiler_args) - if binary.endswith("gcc") or binary.endswith("g++"): - invocation = [binary, '-dM', '-E'] - if binary.endswith("gcc"): - invocation.extend(['-x', 'c']) - elif binary.endswith("g++"): - invocation.extend(['-x', 'c++']) - compiler_args = shlex.split(compiler_args) - invocation.extend(compiler_args) - invocation.append('-') - result = cli.run(invocation, capture_output=True, check=True, stdin=None, input='\n') - define_args = [] - for line in result.stdout.splitlines(): - line_args = line.split(' ', 2) - if len(line_args) == 3 and line_args[0] == '#define': - define_args.append(f'-D{line_args[1]}={line_args[2]}') - elif len(line_args) == 2 and line_args[0] == '#define': - define_args.append(f'-D{line_args[1]}') - return list(sorted(set(define_args))) - return [] - - -file_re = re.compile(r'printf "Compiling: ([^"]+)') -cmd_re = re.compile(r'LOG=\$\((.+?)&&') - - -def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]: - """parse the output of `make -n ` - - This function makes many assumptions about the format of your build log. - This happens to work right now for qmk. - """ - - state = 'start' - this_file = None - records = [] - for line in f: - if state == 'start': - m = file_re.search(line) - if m: - this_file = m.group(1) - state = 'cmd' - - if state == 'cmd': - assert this_file - m = cmd_re.search(line) - if m: - # we have a hit! - this_cmd = m.group(1) - args = shlex.split(this_cmd) - binary = shutil.which(args[0]) - compiler_args = set(filter(lambda x: x.startswith('-m') or x.startswith('-f'), args)) - for s in system_libs(binary): - args += ['-isystem', '%s' % s] - args.extend(cpu_defines(binary, ' '.join(shlex.quote(s) for s in compiler_args))) - new_cmd = ' '.join(shlex.quote(s) for s in args) - records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file}) - state = 'start' - - return records - - -def write_compilation_database(keyboard: str = None, keymap: str = None, output_path: Path = QMK_FIRMWARE / 'compile_commands.json', skip_clean: bool = False, command: List[str] = None, **env_vars) -> bool: - # Generate the make command for a specific keyboard/keymap. - if not command: - from qmk.build_targets import KeyboardKeymapBuildTarget # Lazy load due to circular references - target = KeyboardKeymapBuildTarget(keyboard, keymap) - command = target.compile_command(dry_run=True, **env_vars) - - if not command: - cli.log.error('You must supply both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') - cli.echo('usage: qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]') - return False - - # remove any environment variable overrides which could trip us up - env = os.environ.copy() - env.pop("MAKEFLAGS", None) - - # re-use same executable as the main make invocation (might be gmake) - if not skip_clean: - clean_command = [find_make(), "clean"] - cli.log.info('Making clean with {fg_cyan}%s', ' '.join(clean_command)) - cli.run(clean_command, capture_output=False, check=True, env=env) - - cli.log.info('Gathering build instructions from {fg_cyan}%s', ' '.join(command)) - - result = cli.run(command, capture_output=True, check=True, env=env) - db = parse_make_n(result.stdout.splitlines()) - if not db: - cli.log.error("Failed to parse output from make output:\n%s", result.stdout) - return False - - cli.log.info("Found %s compile commands", len(db)) - - cli.log.info(f"Writing build database to {output_path}") - output_path.write_text(json.dumps(db, indent=4)) - - return True - - -@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='The keyboard\'s name') -@cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap\'s name') -@cli.subcommand('Create a compilation database.') -@automagic_keyboard -@automagic_keymap -def generate_compilation_database(cli: MILC) -> Union[bool, int]: - """Creates a compilation database for the given keyboard build. - - Does a make clean, then a make -n for this target and uses the dry-run output to create - a compilation database (compile_commands.json). This file can help some IDEs and - IDE-like editors work better. For more information about this: - - https://clang.llvm.org/docs/JSONCompilationDatabase.html - """ - # check both config domains: the magic decorator fills in `generate_compilation_database` but the user is - # more likely to have set `compile` in their config file. - current_keyboard = cli.config.generate_compilation_database.keyboard or cli.config.user.keyboard - current_keymap = cli.config.generate_compilation_database.keymap or cli.config.user.keymap - - if not current_keyboard: - cli.log.error('Could not determine keyboard!') - elif not current_keymap: - cli.log.error('Could not determine keymap!') - - target = KeyboardKeymapBuildTarget(current_keyboard, current_keymap) - return target.generate_compilation_database() +@cli.argument('-kb', '--keyboard', help='[unused] The keyboard\'s name') +@cli.argument('-km', '--keymap', help='[unused] The keymap\'s name') +@cli.subcommand('[deprecated] Create a compilation database.') +def generate_compilation_database(cli): + cli.log.error('This command is deprecated and has effectively been removed. Please use the `--compiledb` flag with `qmk compile` instead.') + return False diff --git a/lib/python/qmk/compilation_database.py b/lib/python/qmk/compilation_database.py new file mode 100755 index 0000000000..4c88dadbdd --- /dev/null +++ b/lib/python/qmk/compilation_database.py @@ -0,0 +1,137 @@ +"""Creates a compilation database for the given keyboard build. +""" + +import json +import os +import re +import shlex +import shutil +from functools import lru_cache +from pathlib import Path +from typing import Dict, Iterator, List + +from milc import cli + +from qmk.commands import find_make +from qmk.constants import QMK_FIRMWARE + + +@lru_cache(maxsize=10) +def system_libs(binary: str) -> List[Path]: + """Find the system include directory that the given build tool uses. + """ + cli.log.debug("searching for system library directory for binary: %s", binary) + + # Actually query xxxxxx-gcc to find its include paths. + if binary.endswith("gcc") or binary.endswith("g++"): + # (TODO): Remove 'stdin' once 'input' no longer causes issues under MSYS + result = cli.run([binary, '-E', '-Wp,-v', '-'], capture_output=True, check=True, stdin=None, input='\n') + paths = [] + for line in result.stderr.splitlines(): + if line.startswith(" "): + paths.append(Path(line.strip()).resolve()) + return paths + + return list(Path(binary).resolve().parent.parent.glob("*/include")) if binary else [] + + +@lru_cache(maxsize=10) +def cpu_defines(binary: str, compiler_args: str) -> List[str]: + cli.log.debug("gathering definitions for compilation: %s %s", binary, compiler_args) + if binary.endswith("gcc") or binary.endswith("g++"): + invocation = [binary, '-dM', '-E'] + if binary.endswith("gcc"): + invocation.extend(['-x', 'c']) + elif binary.endswith("g++"): + invocation.extend(['-x', 'c++']) + compiler_args = shlex.split(compiler_args) + invocation.extend(compiler_args) + invocation.append('-') + result = cli.run(invocation, capture_output=True, check=True, stdin=None, input='\n') + define_args = [] + for line in result.stdout.splitlines(): + line_args = line.split(' ', 2) + if len(line_args) == 3 and line_args[0] == '#define': + define_args.append(f'-D{line_args[1]}={line_args[2]}') + elif len(line_args) == 2 and line_args[0] == '#define': + define_args.append(f'-D{line_args[1]}') + return list(sorted(set(define_args))) + return [] + + +file_re = re.compile(r'printf "Compiling: ([^"]+)') +cmd_re = re.compile(r'LOG=\$\((.+?)&&') + + +def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]: + """parse the output of `make -n ` + + This function makes many assumptions about the format of your build log. + This happens to work right now for qmk. + """ + + state = 'start' + this_file = None + records = [] + for line in f: + if state == 'start': + m = file_re.search(line) + if m: + this_file = m.group(1) + state = 'cmd' + + if state == 'cmd': + assert this_file + m = cmd_re.search(line) + if m: + # we have a hit! + this_cmd = m.group(1) + args = shlex.split(this_cmd) + binary = shutil.which(args[0]) + compiler_args = set(filter(lambda x: x.startswith('-m') or x.startswith('-f'), args)) + for s in system_libs(binary): + args += ['-isystem', '%s' % s] + args.extend(cpu_defines(binary, ' '.join(shlex.quote(s) for s in compiler_args))) + new_cmd = ' '.join(shlex.quote(s) for s in args) + records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file}) + state = 'start' + + return records + + +def write_compilation_database(keyboard: str = None, keymap: str = None, output_path: Path = QMK_FIRMWARE / 'compile_commands.json', skip_clean: bool = False, command: List[str] = None, **env_vars) -> bool: + # Generate the make command for a specific keyboard/keymap. + if not command: + from qmk.build_targets import KeyboardKeymapBuildTarget # Lazy load due to circular references + target = KeyboardKeymapBuildTarget(keyboard, keymap) + command = target.compile_command(dry_run=True, **env_vars) + + if not command: + cli.log.error('You must supply both `--keyboard` and `--keymap`, or be in a directory for a keyboard or keymap.') + cli.echo('usage: qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]') + return False + + # remove any environment variable overrides which could trip us up + env = os.environ.copy() + env.pop("MAKEFLAGS", None) + + # re-use same executable as the main make invocation (might be gmake) + if not skip_clean: + clean_command = [find_make(), "clean"] + cli.log.info('Making clean with {fg_cyan}%s', ' '.join(clean_command)) + cli.run(clean_command, capture_output=False, check=True, env=env) + + cli.log.info('Gathering build instructions from {fg_cyan}%s', ' '.join(command)) + + result = cli.run(command, capture_output=True, check=True, env=env) + db = parse_make_n(result.stdout.splitlines()) + if not db: + cli.log.error("Failed to parse output from make output:\n%s", result.stdout) + return False + + cli.log.info("Found %s compile commands", len(db)) + + cli.log.info(f"Writing build database to {output_path}") + output_path.write_text(json.dumps(db, indent=4)) + + return True From ab1332bb6cc798c037a0bd58c22d954755226dbf Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 6 May 2025 06:47:44 +0100 Subject: [PATCH 353/592] Remove force disable of NKRO when Bluetooth enabled (#25201) --- drivers/bluetooth/bluetooth.c | 4 ++++ drivers/bluetooth/bluetooth.h | 5 +++++ quantum/action_util.c | 9 +++------ tmk_core/protocol.mk | 8 ++------ tmk_core/protocol/host.c | 18 ++++++++++++++++++ tmk_core/protocol/host.h | 1 + 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c index 3d41d8b11c..61a3f0f32a 100644 --- a/drivers/bluetooth/bluetooth.c +++ b/drivers/bluetooth/bluetooth.c @@ -11,6 +11,10 @@ __attribute__((weak)) bool bluetooth_is_connected(void) { return true; } +__attribute__((weak)) bool bluetooth_can_send_nkro(void) { + return false; +} + __attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) { return 0; } diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h index fe67c0c968..e50b588db2 100644 --- a/drivers/bluetooth/bluetooth.h +++ b/drivers/bluetooth/bluetooth.h @@ -37,6 +37,11 @@ void bluetooth_task(void); */ bool bluetooth_is_connected(void); +/** + * \brief Detects if `bluetooth_send_nkro` should be used over `bluetooth_send_keyboard`. + */ +bool bluetooth_can_send_nkro(void); + /** * \brief Get current LED state. */ diff --git a/quantum/action_util.c b/quantum/action_util.c index 9fe17f2124..e821e113ef 100644 --- a/quantum/action_util.c +++ b/quantum/action_util.c @@ -21,7 +21,6 @@ along with this program. If not, see . #include "action_layer.h" #include "timer.h" #include "keycode_config.h" -#include "usb_device_state.h" #include extern keymap_config_t keymap_config; @@ -319,14 +318,12 @@ void send_nkro_report(void) { */ void send_keyboard_report(void) { #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { send_nkro_report(); - } else { - send_6kro_report(); + return; } -#else - send_6kro_report(); #endif + send_6kro_report(); } /** \brief Get mods diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index 8f01976548..2930efc283 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -46,12 +46,8 @@ else endif ifeq ($(strip $(NKRO_ENABLE)), yes) - ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) - $(info NKRO is not currently supported with Bluetooth, and has been disabled.) - else - OPT_DEFS += -DNKRO_ENABLE - SHARED_EP_ENABLE = yes - endif + OPT_DEFS += -DNKRO_ENABLE + SHARED_EP_ENABLE = yes endif ifeq ($(strip $(NO_SUSPEND_POWER_DOWN)), yes) diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c index 4f3867df08..e785cb24cc 100644 --- a/tmk_core/protocol/host.c +++ b/tmk_core/protocol/host.c @@ -21,6 +21,7 @@ along with this program. If not, see . #include "host.h" #include "util.h" #include "debug.h" +#include "usb_device_state.h" #ifdef DIGITIZER_ENABLE # include "digitizer.h" @@ -90,6 +91,23 @@ static host_driver_t *host_get_active_driver(void) { return driver; } +bool host_can_send_nkro(void) { +#ifdef CONNECTION_ENABLE + switch (connection_get_host()) { +# ifdef BLUETOOTH_ENABLE + case CONNECTION_HOST_BLUETOOTH: + return bluetooth_can_send_nkro(); +# endif + case CONNECTION_HOST_NONE: + return false; + default: + break; + } +#endif + + return usb_device_state_get_protocol() == USB_PROTOCOL_REPORT; +} + #ifdef SPLIT_KEYBOARD uint8_t split_led_state = 0; void set_split_host_keyboard_leds(uint8_t led_state) { diff --git a/tmk_core/protocol/host.h b/tmk_core/protocol/host.h index d824fca077..8e8a18e2ed 100644 --- a/tmk_core/protocol/host.h +++ b/tmk_core/protocol/host.h @@ -32,6 +32,7 @@ void host_set_driver(host_driver_t *driver); host_driver_t *host_get_driver(void); /* host driver interface */ +bool host_can_send_nkro(void); uint8_t host_keyboard_leds(void); led_t host_keyboard_led_state(void); void host_keyboard_send(report_keyboard_t *report); From a1469abc8d0912677c023b650802af803aa0ed71 Mon Sep 17 00:00:00 2001 From: yiancar Date: Tue, 6 May 2025 06:55:31 +0100 Subject: [PATCH 354/592] Keycult 60 (#25213) Co-authored-by: Duncan Sutherland Co-authored-by: jack --- keyboards/keycult/keycult60/keyboard.json | 600 ++++++++++++++++++ keyboards/keycult/keycult60/keycult60.c | 21 + .../keycult60/keymaps/default/keymap.c | 32 + keyboards/keycult/keycult60/readme.md | 32 + keyboards/keycult/keycult60/rules.mk | 2 + 5 files changed, 687 insertions(+) create mode 100755 keyboards/keycult/keycult60/keyboard.json create mode 100755 keyboards/keycult/keycult60/keycult60.c create mode 100644 keyboards/keycult/keycult60/keymaps/default/keymap.c create mode 100755 keyboards/keycult/keycult60/readme.md create mode 100644 keyboards/keycult/keycult60/rules.mk diff --git a/keyboards/keycult/keycult60/keyboard.json b/keyboards/keycult/keycult60/keyboard.json new file mode 100755 index 0000000000..349472d87b --- /dev/null +++ b/keyboards/keycult/keycult60/keyboard.json @@ -0,0 +1,600 @@ +{ + "keyboard_name": "Keycult 60", + "manufacturer": "Yiancar-Designs", + "url": "https://yiancar-designs.com", + "maintainer": "Yiancar-Designs", + "usb": { + "vid": "0x8968", + "pid": "0x6339", + "device_version": "1.0.0" + }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "B6", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["A1", "B1", "B0", "A7", "A6", "A5", "A4", "A3", "B2", "B10", "B11", "B12", "B13", "B14"], + "rows": ["A2", "B9", "B8", "B5", "B4"] + }, + "diode_direction": "COL2ROW", + "processor": "STM32F072", + "bootloader": "stm32-dfu", + "community_layouts": [ + "60_ansi", + "60_ansi_split_bs_rshift", + "60_ansi_tsangan", + "60_ansi_tsangan_split_bs_rshift", + "60_iso", + "60_iso_split_bs_rshift", + "60_iso_tsangan" + ], + "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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": 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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": { + "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_iso_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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.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, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 12], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "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, 6], "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_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": [0, 13], "x": 13, "y": 0}, + {"matrix": [2, 12], "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, 6], "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} + ] + } + } +} diff --git a/keyboards/keycult/keycult60/keycult60.c b/keyboards/keycult/keycult60/keycult60.c new file mode 100755 index 0000000000..69a12503a3 --- /dev/null +++ b/keyboards/keycult/keycult60/keycult60.c @@ -0,0 +1,21 @@ +/* Copyright 2025 Yiancar-Designs + * + * 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" + +void led_init_ports(void) { + // Set our LED pins as open drain outputs + gpio_set_pin_output_open_drain(LED_CAPS_LOCK_PIN); +} diff --git a/keyboards/keycult/keycult60/keymaps/default/keymap.c b/keyboards/keycult/keycult60/keymaps/default/keymap.c new file mode 100644 index 0000000000..47e27e4607 --- /dev/null +++ b/keyboards/keycult/keycult60/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +/* Copyright 2025 Yiancar-Designs + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_all( /* Base */ + 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_NUBS, 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, MO(1), KC_APP, KC_RCTL), + +[1] = LAYOUT_all( /* FN */ + 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_TRNS, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; diff --git a/keyboards/keycult/keycult60/readme.md b/keyboards/keycult/keycult60/readme.md new file mode 100755 index 0000000000..0889d7686b --- /dev/null +++ b/keyboards/keycult/keycult60/readme.md @@ -0,0 +1,32 @@ +# Keycult 60 + +This is a standard 60% layout PCB. + +* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) +* Hardware Supported: A 60% keyboard with STM32F072CB +* Hardware Availability: https://novelkeys.com/ + +## Instructions + +### Build + +Make example for this keyboard (after setting up your build environment): + + make keycult/keycult60:default + +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). + +### Reset + +- Unplug +- Hold Escape +- Plug In +- Unplug +- Release Escape + +### Flash + +- Unplug +- Hold Escape +- Plug In +- Flash using QMK Toolbox or CLI (`make keycult/keycult60::flash`) diff --git a/keyboards/keycult/keycult60/rules.mk b/keyboards/keycult/keycult60/rules.mk new file mode 100644 index 0000000000..0ab54aaaf7 --- /dev/null +++ b/keyboards/keycult/keycult60/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From bb2b7ce7e41d5b2a1e51646267cd96d619a691a8 Mon Sep 17 00:00:00 2001 From: "Silvino R." <366673+silvinor@users.noreply.github.com> Date: Tue, 6 May 2025 16:03:30 +1000 Subject: [PATCH 355/592] [Keyboard] Add Binepad KnobX1 (#25222) Co-authored-by: Drashna Jaelre --- keyboards/binepad/knobx1/keyboard.json | 69 +++++++++++++++++ .../knobx1/keymaps/default/keymap.json | 22 ++++++ keyboards/binepad/knobx1/knobx1.c | 76 +++++++++++++++++++ keyboards/binepad/knobx1/knobx1.h | 49 ++++++++++++ keyboards/binepad/knobx1/readme.md | 26 +++++++ 5 files changed, 242 insertions(+) create mode 100644 keyboards/binepad/knobx1/keyboard.json create mode 100644 keyboards/binepad/knobx1/keymaps/default/keymap.json create mode 100644 keyboards/binepad/knobx1/knobx1.c create mode 100644 keyboards/binepad/knobx1/knobx1.h create mode 100644 keyboards/binepad/knobx1/readme.md diff --git a/keyboards/binepad/knobx1/keyboard.json b/keyboards/binepad/knobx1/keyboard.json new file mode 100644 index 0000000000..f82cf1dbd3 --- /dev/null +++ b/keyboards/binepad/knobx1/keyboard.json @@ -0,0 +1,69 @@ +{ + "manufacturer": "Binepad", + "keyboard_name": "KnobX1", + "maintainer": "binepad", + "bootloader": "stm32duino", + "bootloader_instructions": "Hold down the layer button (small button on the bottom left) and plug in the keyboard.", + "diode_direction": "COL2ROW", + "eeprom": { + "wear_leveling": { + "backing_size": 1024 + } + }, + "encoder": { + "rotary": [ + {"pin_a": "B12", "pin_b": "B13", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "rgblight": true + }, + "matrix_pins": { + "direct": [ + ["A7", "A15"] + ] + }, + "processor": "STM32F103", + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "gradient": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "twinkle": true + }, + "default": { + "hue": 198, + "speed": 2, + "val": 204 + }, + "driver": "ws2812", + "led_count": 2, + "sleep": true + }, + "url": "https://binepad.com/products/knobx1", + "usb": { + "device_version": "1.0.0", + "pid": "0x4249", + "vid": "0x5831" + }, + "ws2812": { + "pin": "C13" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0, "w": 3, "h": 3} + ] + } + } +} diff --git a/keyboards/binepad/knobx1/keymaps/default/keymap.json b/keyboards/binepad/knobx1/keymaps/default/keymap.json new file mode 100644 index 0000000000..4d91c09968 --- /dev/null +++ b/keyboards/binepad/knobx1/keymaps/default/keymap.json @@ -0,0 +1,22 @@ +{ + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [ + { + "ccw": "KC_VOLD", + "cw": "KC_VOLU" + } + ] + ], + "keyboard": "binepad/knobx1", + "keymap": "default", + "layers": [ + ["X1_LYRU", "KC_MUTE"] + ], + "layout": "LAYOUT", + "version": 1 +} diff --git a/keyboards/binepad/knobx1/knobx1.c b/keyboards/binepad/knobx1/knobx1.c new file mode 100644 index 0000000000..7f299b67e3 --- /dev/null +++ b/keyboards/binepad/knobx1/knobx1.c @@ -0,0 +1,76 @@ +// (c) 2025 Binepad (@binpad) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "knobx1.h" + +#ifdef DYNAMIC_KEYMAP_LAYER_COUNT +# define X1_KEYMAP_LAYER_COUNT DYNAMIC_KEYMAP_LAYER_COUNT +#else +# define X1_KEYMAP_LAYER_COUNT 4 +#endif + +void keyboard_pre_init_kb(void) { + const pin_t indicator_leds[4] = {IND1_LED, IND2_LED, IND3_LED, IND4_LED}; + for (int i = 0; i < 4; i++) { + gpio_set_pin_output(indicator_leds[i]); // Set Indicators as output + gpio_write_pin_low(indicator_leds[i]); // Set initial indicator low / OFF + } + + // Call the user pre-init function if needed + // Do it after ._kb incase the user wants to change pin stuff + keyboard_pre_init_user(); +} + +layer_state_t layer_state_set_kb(layer_state_t state) { + state = layer_state_set_user(state); + uint8_t layer = get_highest_layer(state); + x1_layer_led(layer); + return state; +} + +void matrix_init_kb(void) { + // Direct PINS use; gpio -> switch -> ground. + // Setting Row 0 to ground makes it work like a direct pin + gpio_set_pin_output(ROW0_PIN); // Set Col0 as an output + gpio_write_pin_low(ROW0_PIN); // Set Col0 to low / ground + + matrix_init_user(); +} + +bool process_x1_layer_up(keyrecord_t *record) { + if (record->event.pressed) { + uint8_t current_layer = get_highest_layer(layer_state); + // Cycle through layers + uint8_t next_layer = (current_layer + 1) % X1_KEYMAP_LAYER_COUNT; + layer_move(next_layer); + x1_layer_led(next_layer); // Update LED indicators + } + return false; +} + +bool process_x1_layer_down(keyrecord_t *record) { + if (record->event.pressed) { + uint8_t current_layer = get_highest_layer(layer_state); + // Reverse through layers + uint8_t prev_layer = (current_layer == 0) ? (X1_KEYMAP_LAYER_COUNT - 1) : (current_layer - 1); + layer_move(prev_layer); + x1_layer_led(prev_layer); + } + return false; +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { + case X1_LAYER_SELECTOR_UP: + return process_x1_layer_up(record); + + case X1_LAYER_SELECTOR_DOWN: + return process_x1_layer_down(record); + + default: + return true; + } +} diff --git a/keyboards/binepad/knobx1/knobx1.h b/keyboards/binepad/knobx1/knobx1.h new file mode 100644 index 0000000000..7645124057 --- /dev/null +++ b/keyboards/binepad/knobx1/knobx1.h @@ -0,0 +1,49 @@ +// (c) 2025 Binepad (@binpad) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +// PCB has a 1x2 matrix. Set the ROW0 to ground for faster direct pin access. +#define ROW0_PIN B8 + +#define IND1_LED A6 +#define IND2_LED A5 +#define IND3_LED A4 +#define IND4_LED A3 + +// clang-format off +enum x1_keycodes { + X1_LAYER_SELECTOR_UP = QK_USER, + X1_LAYER_SELECTOR_DOWN +}; +// clang-format on + +#define X1_LYRU X1_LAYER_SELECTOR_UP +#define X1_LYRD X1_LAYER_SELECTOR_DOWN + +// clang-format off +static inline void x1_led_1(bool on) { gpio_write_pin(IND1_LED, on); } +static inline void x1_led_2(bool on) { gpio_write_pin(IND2_LED, on); } +static inline void x1_led_3(bool on) { gpio_write_pin(IND3_LED, on); } +static inline void x1_led_4(bool on) { gpio_write_pin(IND4_LED, on); } +static inline void x1_led_1_on(void) { gpio_write_pin_high(IND1_LED); } +static inline void x1_led_2_on(void) { gpio_write_pin_high(IND2_LED); } +static inline void x1_led_3_on(void) { gpio_write_pin_high(IND3_LED); } +static inline void x1_led_4_on(void) { gpio_write_pin_high(IND4_LED); } +static inline void x1_led_1_off(void) { gpio_write_pin_low(IND1_LED); } +static inline void x1_led_2_off(void) { gpio_write_pin_low(IND2_LED); } +static inline void x1_led_3_off(void) { gpio_write_pin_low(IND3_LED); } +static inline void x1_led_4_off(void) { gpio_write_pin_low(IND4_LED); } +// clang-format on + +static inline void x1_layer_led(uint8_t lyr) { + gpio_write_pin(IND1_LED, lyr >= 0); + gpio_write_pin(IND2_LED, lyr >= 1); + gpio_write_pin(IND3_LED, lyr >= 2); + gpio_write_pin(IND4_LED, lyr >= 3); +} + +bool process_x1_layer_up(keyrecord_t *record); +bool process_x1_layer_down(keyrecord_t *record); diff --git a/keyboards/binepad/knobx1/readme.md b/keyboards/binepad/knobx1/readme.md new file mode 100644 index 0000000000..36f082dbfd --- /dev/null +++ b/keyboards/binepad/knobx1/readme.md @@ -0,0 +1,26 @@ +# Binepad KnobX1 + +![Binepad KnobX1](https://i.imgur.com/9HeFQXP.png) + +*A fully customizable knob designed to enhance your PC experience* + +* Keyboard Maintainer: [binepad](https://github.com/binepad) +* Hardware Supported: *Binepad knobX1* +* Hardware Availability: [binepad.com](https://binepad.com/products/knobx1) + +Make example for this keyboard (after setting up your build environment): + + make binepad/knobx1:default + +Flashing example for this keyboard: + + make binepad/knobx1: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 layer button (small button on the bottom left) and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 55909141ef49ac87b29486c95cff6fa52bda69ed Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 5 May 2025 23:19:38 -0700 Subject: [PATCH 356/592] [Keyboard] Update Tractyl Manuform and add F405 (weact) variant (#24764) --- .../tractyl_manuform/5x6_right/config.h | 9 - .../tractyl_manuform/5x6_right/f405/board.h | 23 ++ .../tractyl_manuform/5x6_right/f405/config.h | 89 +++++++ .../tractyl_manuform/5x6_right/f405/f405.c | 52 ++++ .../tractyl_manuform/5x6_right/f405/halconf.h | 35 +++ .../5x6_right/f405/keyboard.json | 66 +++++ .../tractyl_manuform/5x6_right/f405/mcuconf.h | 82 +++++++ .../tractyl_manuform/5x6_right/f411/config.h | 4 +- .../tractyl_manuform/5x6_right/f411/f411.c | 41 ---- .../tractyl_manuform/5x6_right/f411/rules.mk | 2 - .../tractyl_manuform/5x6_right/info.json | 203 +++++++++++++++ .../tractyl_manuform/5x6_right/post_rules.mk | 1 + .../tractyl_manuform/5x6_right/rules.mk | 4 - keyboards/handwired/tractyl_manuform/config.h | 12 - .../handwired/tractyl_manuform/info.json | 6 +- .../handwired/tractyl_manuform/post_config.h | 112 --------- .../tractyl_manuform/tractyl_manuform.c | 231 ++++++++++++------ .../tractyl_manuform/tractyl_manuform.h | 22 +- 18 files changed, 719 insertions(+), 275 deletions(-) create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/board.h create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/config.h create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/f405.c create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/keyboard.json create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f405/mcuconf.h delete mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/f411/rules.mk create mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/post_rules.mk delete mode 100644 keyboards/handwired/tractyl_manuform/5x6_right/rules.mk delete mode 100644 keyboards/handwired/tractyl_manuform/post_config.h diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/config.h index 194874b5cf..686cb30fc2 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/config.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/config.h @@ -21,13 +21,4 @@ along with this program. If not, see . #define ROTATIONAL_TRANSFORM_ANGLE -25 #define POINTING_DEVICE_INVERT_X -#define DYNAMIC_KEYMAP_LAYER_COUNT 16 -#define LAYER_STATE_16BIT - - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT - #define POINTING_DEVICE_RIGHT diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/board.h b/keyboards/handwired/tractyl_manuform/5x6_right/f405/board.h new file mode 100644 index 0000000000..9be86942d6 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/board.h @@ -0,0 +1,23 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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_HSECLK +#define STM32_HSECLK 8000000U +#undef STM32_LSECLK +#define STM32_LSECLK 32768U diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/f405/config.h new file mode 100644 index 0000000000..3878d9c671 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/config.h @@ -0,0 +1,89 @@ +/* +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert + +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 USER_BUTTON_PIN C13 +#define DEBUG_LED_PIN B2 +#define USB_VBUS_PIN B10 + +#ifdef USE_USB_OTG_HS_PORT +# define USB_DRIVER USBD2 +#endif + +// WS2812 RGB LED strip input and number of LEDs +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 1 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_PWM_DMA_CHANNEL 5 +#define WS2812_EXTERNAL_PULLUP + +#define BACKLIGHT_PWM_DRIVER PWMD8 +#define BACKLIGHT_PWM_CHANNEL 2 +#define BACKLIGHT_PAL_MODE 3 + +/* Audio config */ +#define AUDIO_PIN A4 +#define AUDIO_PIN_ALT A5 +#define AUDIO_PIN_ALT_AS_NEGATIVE + +/* serial.c configuration for split keyboard */ +#define SERIAL_USART_DRIVER SD1 +#define SERIAL_USART_TX_PIN A10 +#define SERIAL_USART_TX_PAL_MODE 7 +#define SERIAL_USART_RX_PIN A9 +#define SERIAL_USART_RX_PAL_MODE 7 +#define SERIAL_USART_TIMEOUT 10 +#define SERIAL_USART_SPEED (1 * 1024 * 1024) +#define SERIAL_USART_FULL_DUPLEX + + +/* i2c config for oleds */ +#define I2C_DRIVER I2CD1 +#define I2C1_CLOCK_SPEED 400000 +#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_16_9 + +/* spi config for eeprom and pmw3360 sensor */ +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN B3 +#define SPI_SCK_PAL_MODE 5 +#define SPI_MOSI_PIN B5 +#define SPI_MOSI_PAL_MODE 5 +#define SPI_MISO_PIN B4 +#define SPI_MISO_PAL_MODE 5 + +#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN B13 +#define EXTERNAL_FLASH_SPI_CLOCK_DIVISOR 4 +#define EXTERNAL_FLASH_SIZE (8 * 1024 * 1024) + +/* pmw3360 config */ +#define POINTING_DEVICE_CS_PIN B8 +#define POINTING_DEVICE_ROTATION_270 +#undef ROTATIONAL_TRANSFORM_ANGLE +#define PMW33XX_SPI_DIVISOR 16 + +// lcd +#define DISPLAY_RST_PIN NO_PIN +#define DISPLAY_DC_PIN B12 +#define DISPLAY_CS_PIN B9 +#define DISPLAY_SPI_DIVIDER 1 + +#define DRV2605L_FB_ERM_LRA 0 +#define DRV2605L_GREETING DRV2605L_EFFECT_750_MS_ALERT_100 +#define DRV2605L_DEFAULT_MODE DRV2605L_EFFECT_BUZZ_1_100 diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/f405.c b/keyboards/handwired/tractyl_manuform/5x6_right/f405/f405.c new file mode 100644 index 0000000000..5aabc70dca --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/f405.c @@ -0,0 +1,52 @@ +/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) + * + * 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 "tractyl_manuform.h" + +#ifdef USB_VBUS_PIN +bool usb_vbus_state(void) { + gpio_set_pin_input_low(USB_VBUS_PIN); + wait_us(5); + return gpio_read_pin(USB_VBUS_PIN); +} +#endif + +#ifdef USER_BUTTON_PIN +void user_button_init(void) { + // Pin needs to be configured as input low + gpio_set_pin_input_low(USER_BUTTON_PIN); +} + +bool check_user_button_state(void) { + return gpio_read_pin(USER_BUTTON_PIN); +} +#endif // USER_BUTTON_PIN + +void board_init(void) { + // Board setup sets these pins as SPI, but we aren't using them as such. + // So to prevent them from misbehaving, we need to set them to a different, non-spi mode. + // This is a bit of a hack, but nothing else runs soon enough, without re-implementing spi_init(). + gpio_set_pin_input(A5); + gpio_set_pin_input(A6); + gpio_set_pin_input(A7); + + // If using USB_OTG_HS, we need to set the data pins since they're set wrong for our needs by default. + // We set it here by default, in case it's bridged with A11/A12, as to reduce the chance of issues. + palSetLineMode( + B14, PAL_MODE_ALTERNATE(12) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_FLOATING); + palSetLineMode( + B15, PAL_MODE_ALTERNATE(12) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_FLOATING); +} diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h b/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h new file mode 100644 index 0000000000..23f8e5c934 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h @@ -0,0 +1,35 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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_SERIAL TRUE +#define SERIAL_BUFFERS_SIZE 256 + +#if defined(WS2812_PWM) || defined(BACKLIGHT_PWM) +# define HAL_USE_PWM TRUE +#endif // defined(WS2812_PWM) || defined(BACKLIGHT_PWM) + +#if HAL_USE_SPI == TRUE +# define SPI_USE_WAIT TRUE +# define SPI_SELECT_MODE SPI_SELECT_MODE_PAD +#endif + +#ifdef AUDIO_DRIVER_DAC +# define HAL_USE_GPT TRUE +# define HAL_USE_DAC TRUE +#endif + +#include_next diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/f405/keyboard.json new file mode 100644 index 0000000000..b56e2d31c2 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/keyboard.json @@ -0,0 +1,66 @@ +{ + "keyboard_name": "Tractyl Manuform (5x6) WeAct STM32F405", + "audio": { + "driver": "dac_additive", + "power_control": { + "pin": "A3" + } + }, + "backlight": { + "levels": 16, + "pin": "C7" + }, + "bootloader": "stm32-dfu", + "build": { + "debounce_type": "asym_eager_defer_pk" + }, + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "C0", "pin_b": "A15"} + ] + }, + "eeprom": { + "driver": "wear_leveling", + "wear_leveling": { + "driver": "spi_flash", + "backing_size": 16384, + "logical_size": 4096 + } + }, + "features": { + "console": true, + "haptic": true + }, + "haptic": { + "driver": "drv2605l" + }, + "matrix_pins": { + "cols": ["C1", "C2", "C3", "A0", "A1", "A2"], + "rows": ["A6", "A7", "C4", "C5", "B0", "B1"] + }, + "processor": "STM32F405", + "rgblight": { + "led_count": 24, + "split": true + }, + "split": { + "handedness": { + "pin": "B11" + }, + "serial": { + "driver": "usart" + }, + "transport": { + "sync": { + "activity": true, + "haptic": true, + "matrix_state": true + } + } + }, + "ws2812": { + "driver": "pwm", + "pin": "C6" + } +} diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/mcuconf.h b/keyboards/handwired/tractyl_manuform/5x6_right/f405/mcuconf.h new file mode 100644 index 0000000000..46920b17b3 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/mcuconf.h @@ -0,0 +1,82 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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_LSE_ENABLED +#define STM32_LSE_ENABLED TRUE + +#undef STM32_PLLM_VALUE +#define STM32_PLLM_VALUE 8 + +#undef STM32_RTCSEL +#define STM32_RTCSEL STM32_RTCSEL_LSE + +#undef STM32_SERIAL_USE_USART1 +#define STM32_SERIAL_USE_USART1 TRUE + +#if HAL_USE_WDG == TRUE +# undef STM32_WDG_USE_IWDG +# define STM32_WDG_USE_IWDG TRUE +#endif + +#if HAL_USE_I2C == TRUE +# undef STM32_I2C_USE_I2C1 +# define STM32_I2C_USE_I2C1 TRUE + +# undef STM32_I2C_BUSY_TIMEOUT +# define STM32_I2C_BUSY_TIMEOUT 10 + +# undef STM32_I2C_I2C1_RX_DMA_STREAM +# define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0) +# undef STM32_I2C_I2C1_TX_DMA_STREAM +# define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) +#endif // HAL_USE_I2C + +#ifdef WS2812_PWM +# undef STM32_PWM_USE_TIM3 +# define STM32_PWM_USE_TIM3 TRUE +#endif // WS2812_PWM + +#ifdef BACKLIGHT_PWM +# undef STM32_PWM_USE_TIM8 +# define STM32_PWM_USE_TIM8 TRUE +#endif + +#if HAL_USE_SPI == TRUE +# undef STM32_SPI_USE_SPI1 +# define STM32_SPI_USE_SPI1 TRUE +#endif + +#ifdef AUDIO_DRIVER_DAC +# undef STM32_DAC_USE_DAC1_CH1 +# define STM32_DAC_USE_DAC1_CH1 TRUE +# undef STM32_DAC_USE_DAC1_CH2 +# define STM32_DAC_USE_DAC1_CH2 TRUE + +# undef STM32_GPT_USE_TIM6 +# define STM32_GPT_USE_TIM6 TRUE +#endif // AUDIO_DRIVER_DAC + + +#ifdef USE_USB_OTG_HS_PORT +# undef STM32_USB_USE_OTG1 +# define STM32_USB_USE_OTG1 FALSE +# undef STM32_USB_USE_OTG2 +# define STM32_USB_USE_OTG2 TRUE +#endif diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h index 28acc1e69b..bbbc16e3ea 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h @@ -19,6 +19,7 @@ along with this program. If not, see . #pragma once // #define USB_VBUS_PIN B10 // doesn't seem to work for me on one of my controllers... */ +#define USER_BUTTON_PIN A0 // WS2812 RGB LED strip input and number of LEDs #define WS2812_PWM_DRIVER PWMD2 // default: PWMD2 @@ -70,7 +71,8 @@ along with this program. If not, see . /* eeprom config */ #define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4 -#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64 +#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 8 /* pmw3360 config */ #define PMW33XX_CS_PIN B0 +#define PMW33XX_SPI_DIVISOR 8 diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f411/f411.c b/keyboards/handwired/tractyl_manuform/5x6_right/f411/f411.c index dbacb1685c..cfe97d6318 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f411/f411.c +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f411/f411.c @@ -16,41 +16,6 @@ #include "tractyl_manuform.h" -void keyboard_pre_init_sub(void) { gpio_set_pin_input_high(A0); } - -void matrix_scan_sub_kb(void) { - if (!gpio_read_pin(A0)) { - reset_keyboard(); - } -} - -__attribute__((weak)) void bootmagic_scan(void) { - // We need multiple scans because debouncing can't be turned off. - matrix_scan(); -#if defined(DEBOUNCE) && DEBOUNCE > 0 - wait_ms(DEBOUNCE * 2); -#else - wait_ms(30); -#endif - matrix_scan(); - - uint8_t row = BOOTMAGIC_ROW; - uint8_t col = BOOTMAGIC_COLUMN; - -#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_ROW_RIGHT) && defined(BOOTMAGIC_COLUMN_RIGHT) - if (!is_keyboard_left()) { - row = BOOTMAGIC_ROW_RIGHT; - col = BOOTMAGIC_COLUMN_RIGHT; - } -#endif - - if (matrix_get_row(row) & (1 << col) || !gpio_read_pin(A0)) { - eeconfig_disable(); - bootloader_jump(); - } -} - - #ifdef USB_VBUS_PIN bool usb_vbus_state(void) { gpio_set_pin_input_low(USB_VBUS_PIN); @@ -58,9 +23,3 @@ bool usb_vbus_state(void) { return gpio_read_pin(USB_VBUS_PIN); } #endif - -void matrix_output_unselect_delay(uint8_t line, bool key_pressed) { - for (int32_t i = 0; i < 40; i++) { - __asm__ volatile("nop" ::: "memory"); - } -} diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f411/rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/f411/rules.mk deleted file mode 100644 index 4aa582e7a2..0000000000 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f411/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -KEYBOARD_SHARED_EP = yes -MOUSE_SHARED_EP = yes diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/info.json b/keyboards/handwired/tractyl_manuform/5x6_right/info.json index fe3f2432ca..0264000b20 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/info.json +++ b/keyboards/handwired/tractyl_manuform/5x6_right/info.json @@ -95,9 +95,212 @@ {"matrix": [5, 2], "x": 6, "y": 7}, {"matrix": [5, 3], "x": 7, "y": 7}, + {"matrix": [11, 2], "x": 9, "y": 7}, + {"matrix": [11, 3], "x": 10, "y": 7} + ] + }, + "LAYOUT_5x6_full_right": { + "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": [6, 0], "x": 11, "y": 0}, + {"matrix": [6, 1], "x": 12, "y": 0}, + {"matrix": [6, 2], "x": 13, "y": 0}, + {"matrix": [6, 3], "x": 14, "y": 0}, + {"matrix": [6, 4], "x": 15, "y": 0}, + {"matrix": [6, 5], "x": 16, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [7, 0], "x": 11, "y": 1}, + {"matrix": [7, 1], "x": 12, "y": 1}, + {"matrix": [7, 2], "x": 13, "y": 1}, + {"matrix": [7, 3], "x": 14, "y": 1}, + {"matrix": [7, 4], "x": 15, "y": 1}, + {"matrix": [7, 5], "x": 16, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [8, 0], "x": 11, "y": 2}, + {"matrix": [8, 1], "x": 12, "y": 2}, + {"matrix": [8, 2], "x": 13, "y": 2}, + {"matrix": [8, 3], "x": 14, "y": 2}, + {"matrix": [8, 4], "x": 15, "y": 2}, + {"matrix": [8, 5], "x": 16, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + + {"matrix": [9, 0], "x": 11, "y": 3}, + {"matrix": [9, 1], "x": 12, "y": 3}, + {"matrix": [9, 2], "x": 13, "y": 3}, + {"matrix": [9, 3], "x": 14, "y": 3}, + {"matrix": [9, 4], "x": 15, "y": 3}, + {"matrix": [9, 5], "x": 16, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + + {"matrix": [10, 2], "x": 13, "y": 4}, + {"matrix": [10, 3], "x": 14, "y": 4}, + {"matrix": [10, 4], "x": 15, "y": 4}, + {"matrix": [10, 5], "x": 16, "y": 4}, + + {"matrix": [4, 4], "x": 4, "y": 5}, + {"matrix": [4, 5], "x": 5, "y": 5}, + + {"matrix": [10, 1], "x": 12, "y": 5}, + + {"matrix": [5, 4], "x": 6, "y": 6}, + {"matrix": [5, 5], "x": 7, "y": 6}, + + {"matrix": [11, 1], "x": 10, "y": 6}, + + {"matrix": [5, 2], "x": 6, "y": 7}, + {"matrix": [5, 3], "x": 7, "y": 7}, + {"matrix": [11, 2], "x": 9, "y": 7}, {"matrix": [11, 3], "x": 10, "y": 7} ] } + }, + "rgb_matrix": { + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "rainbow_moving_chevron": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_rain": true, + "pixel_flow": true, + "pixel_fractal": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true + }, + "driver": "ws2812", + "led_count": 64, + "max_brightness": 100, + "split_count": [33, 31], + "sleep": true, + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 10, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 20, "flags": 1}, + {"matrix": [3, 0], "x": 0, "y": 30, "flags": 1}, + {"matrix": [3, 1], "x": 12, "y": 30, "flags": 4}, + {"matrix": [2, 1], "x": 12, "y": 20, "flags": 4}, + {"matrix": [1, 1], "x": 12, "y": 10, "flags": 4}, + {"matrix": [0, 1], "x": 12, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 24, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 24, "y": 10, "flags": 4}, + {"matrix": [2, 2], "x": 24, "y": 20, "flags": 4}, + {"matrix": [3, 2], "x": 24, "y": 30, "flags": 4}, + {"matrix": [4, 2], "x": 24, "y": 40, "flags": 1}, + {"matrix": [4, 3], "x": 36, "y": 40, "flags": 1}, + {"matrix": [3, 3], "x": 36, "y": 30, "flags": 4}, + {"matrix": [2, 3], "x": 36, "y": 20, "flags": 4}, + {"matrix": [1, 3], "x": 36, "y": 10, "flags": 4}, + {"matrix": [0, 3], "x": 36, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 48, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 48, "y": 10, "flags": 4}, + {"matrix": [2, 4], "x": 48, "y": 40, "flags": 4}, + {"matrix": [3, 4], "x": 48, "y": 30, "flags": 4}, + {"matrix": [3, 5], "x": 60, "y": 30, "flags": 4}, + {"matrix": [2, 5], "x": 60, "y": 20, "flags": 4}, + {"matrix": [1, 5], "x": 60, "y": 10, "flags": 4}, + {"matrix": [0, 5], "x": 60, "y": 0, "flags": 4}, + {"matrix": [4, 4], "x": 48, "y": 50, "flags": 1}, + {"matrix": [5, 4], "x": 65, "y": 56, "flags": 1}, + {"matrix": [5, 5], "x": 70, "y": 60, "flags": 1}, + {"matrix": [5, 3], "x": 65, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 60, "y": 60, "flags": 1}, + {"matrix": [4, 1], "x": 0, "y": 40, "flags": 1}, + {"matrix": [4, 0], "x": 12, "y": 40, "flags": 1}, + {"matrix": [6, 5], "x": 224, "y": 0, "flags": 1}, + {"matrix": [7, 5], "x": 224, "y": 10, "flags": 1}, + {"matrix": [8, 5], "x": 224, "y": 20, "flags": 1}, + {"matrix": [9, 5], "x": 224, "y": 30, "flags": 1}, + {"matrix": [9, 4], "x": 212, "y": 30, "flags": 4}, + {"matrix": [8, 4], "x": 212, "y": 20, "flags": 4}, + {"matrix": [7, 4], "x": 212, "y": 10, "flags": 4}, + {"matrix": [6, 4], "x": 212, "y": 0, "flags": 4}, + {"matrix": [6, 3], "x": 200, "y": 0, "flags": 4}, + {"matrix": [7, 3], "x": 200, "y": 10, "flags": 4}, + {"matrix": [8, 3], "x": 200, "y": 20, "flags": 4}, + {"matrix": [9, 3], "x": 200, "y": 30, "flags": 4}, + {"matrix": [10, 3], "x": 200, "y": 40, "flags": 1}, + {"matrix": [10, 2], "x": 188, "y": 40, "flags": 1}, + {"matrix": [9, 2], "x": 188, "y": 30, "flags": 4}, + {"matrix": [8, 2], "x": 188, "y": 20, "flags": 4}, + {"matrix": [7, 2], "x": 188, "y": 10, "flags": 4}, + {"matrix": [6, 2], "x": 188, "y": 0, "flags": 4}, + {"matrix": [6, 1], "x": 176, "y": 0, "flags": 4}, + {"matrix": [7, 1], "x": 176, "y": 10, "flags": 4}, + {"matrix": [8, 1], "x": 176, "y": 20, "flags": 4}, + {"matrix": [9, 1], "x": 176, "y": 30, "flags": 4}, + {"matrix": [9, 0], "x": 164, "y": 30, "flags": 4}, + {"matrix": [8, 0], "x": 164, "y": 20, "flags": 4}, + {"matrix": [7, 0], "x": 164, "y": 10, "flags": 4}, + {"matrix": [6, 0], "x": 164, "y": 0, "flags": 4}, + {"matrix": [11, 1], "x": 164, "y": 60, "flags": 1}, + {"matrix": [11, 3], "x": 152, "y": 70, "flags": 1}, + {"matrix": [11, 2], "x": 140, "y": 70, "flags": 1}, + {"matrix": [10, 4], "x": 224, "y": 40, "flags": 1}, + {"matrix": [10, 5], "x": 208, "y": 40, "flags": 1} + ] } } diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/post_rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/post_rules.mk new file mode 100644 index 0000000000..fab9162dc6 --- /dev/null +++ b/keyboards/handwired/tractyl_manuform/5x6_right/post_rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk deleted file mode 100644 index b7f7c949ec..0000000000 --- a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = yes - -DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp diff --git a/keyboards/handwired/tractyl_manuform/config.h b/keyboards/handwired/tractyl_manuform/config.h index 9f4dd8651b..5a8091a098 100644 --- a/keyboards/handwired/tractyl_manuform/config.h +++ b/keyboards/handwired/tractyl_manuform/config.h @@ -18,18 +18,6 @@ along with this program. If not, see . #pragma once - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT - #define SPLIT_POINTING_ENABLE #define POINTING_DEVICE_TASK_THROTTLE_MS 1 diff --git a/keyboards/handwired/tractyl_manuform/info.json b/keyboards/handwired/tractyl_manuform/info.json index c84d008e15..fb50c8d359 100644 --- a/keyboards/handwired/tractyl_manuform/info.json +++ b/keyboards/handwired/tractyl_manuform/info.json @@ -2,6 +2,10 @@ "manufacturer": "QMK Community", "maintainer": "Drashna Jael're", "usb": { - "vid": "0x44DD" + "vid": "0x44DD", + "shared_endpoint": { + "keyboard": true, + "mouse": true + } } } diff --git a/keyboards/handwired/tractyl_manuform/post_config.h b/keyboards/handwired/tractyl_manuform/post_config.h deleted file mode 100644 index b5d67132b2..0000000000 --- a/keyboards/handwired/tractyl_manuform/post_config.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 - -// mouse config -#ifdef MOUSEKEY_ENABLE -# ifndef MOUSEKEY_MOVE_DELTA -# ifndef MK_KINETIC_SPEED -# define MOUSEKEY_MOVE_DELTA 5 -# else -# define MOUSEKEY_MOVE_DELTA 25 -# endif -# endif -# ifndef MOUSEKEY_DELAY -# ifndef MK_KINETIC_SPEED -# define MOUSEKEY_DELAY 300 -# else -# define MOUSEKEY_DELAY 8 -# endif -# endif -# ifndef MOUSEKEY_INTERVAL -# ifndef MK_KINETIC_SPEED -# define MOUSEKEY_INTERVAL 50 -# else -# define MOUSEKEY_INTERVAL 20 -# endif -# endif -# ifndef MOUSEKEY_MAX_SPEED -# define MOUSEKEY_MAX_SPEED 7 -# endif -# ifndef MOUSEKEY_TIME_TO_MAX -# define MOUSEKEY_TIME_TO_MAX 60 -# endif -# ifndef MOUSEKEY_INITIAL_SPEED -# define MOUSEKEY_INITIAL_SPEED 100 -# endif -# ifndef MOUSEKEY_BASE_SPEED -# define MOUSEKEY_BASE_SPEED 1000 -# endif -# ifndef MOUSEKEY_DECELERATED_SPEED -# define MOUSEKEY_DECELERATED_SPEED 400 -# endif -# ifndef MOUSEKEY_ACCELERATED_SPEED -# define MOUSEKEY_ACCELERATED_SPEED 3000 -# endif - -// mouse scroll config -# ifndef MOUSEKEY_WHEEL_DELAY -# define MOUSEKEY_WHEEL_DELAY 15 -# endif -# ifndef MOUSEKEY_WHEEL_DELTA -# define MOUSEKEY_WHEEL_DELTA 1 -# endif -# ifndef MOUSEKEY_WHEEL_INTERVAL -# define MOUSEKEY_WHEEL_INTERVAL 50 -# endif -# ifndef MOUSEKEY_WHEEL_MAX_SPEED -# define MOUSEKEY_WHEEL_MAX_SPEED 8 -# endif -# ifndef MOUSEKEY_WHEEL_TIME_TO_MAX -# define MOUSEKEY_WHEEL_TIME_TO_MAX 80 -# endif - -# ifndef MOUSEKEY_WHEEL_INITIAL_MOVEMENTS -# define MOUSEKEY_WHEEL_INITIAL_MOVEMENTS 8 -# endif -# ifndef MOUSEKEY_WHEEL_BASE_MOVEMENTS -# define MOUSEKEY_WHEEL_BASE_MOVEMENTS 48 -# endif -# ifndef MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS -# define MOUSEKEY_WHEEL_ACCELERATED_MOVEMENTS 48 -# endif -# ifndef MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS -# define MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS 8 -# endif -#endif - -#ifndef DEBOUNCE -# define DEBOUNCE 5 -#endif - -#if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_LIMIT_VAL) -# if defined(OLED_ENABLE) -# define RGBLIGHT_LIMIT_VAL 100 -# else -# define RGBLIGHT_LIMIT_VAL 150 -# endif -#endif - -#if !defined(OLED_BRIGHTNESS) -# if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) -# define OLED_BRIGHTNESS 80 -# else -# define OLED_BRIGHTNESS 150 -# endif -#endif diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c index 7ded835a6e..3ae74be47f 100644 --- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c +++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c @@ -15,48 +15,47 @@ */ #include "tractyl_manuform.h" +#ifdef POINTING_DEVICE_ENABLE +# include "pointing_device.h" +#endif #include "transactions.h" #include #ifdef CONSOLE_ENABLE # include "print.h" -#endif // CONSOLE_ENABLE +#endif // CONSOLE_ENABLE #ifdef POINTING_DEVICE_ENABLE # ifndef CHARYBDIS_MINIMUM_DEFAULT_DPI # define CHARYBDIS_MINIMUM_DEFAULT_DPI 400 -# endif // CHARYBDIS_MINIMUM_DEFAULT_DPI +# endif // CHARYBDIS_MINIMUM_DEFAULT_DPI # ifndef CHARYBDIS_DEFAULT_DPI_CONFIG_STEP # define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 200 -# endif // CHARYBDIS_DEFAULT_DPI_CONFIG_STEP +# endif // CHARYBDIS_DEFAULT_DPI_CONFIG_STEP # ifndef CHARYBDIS_MINIMUM_SNIPING_DPI # define CHARYBDIS_MINIMUM_SNIPING_DPI 200 -# endif // CHARYBDIS_MINIMUM_SNIPER_MODE_DPI +# endif // CHARYBDIS_MINIMUM_SNIPER_MODE_DPI # ifndef CHARYBDIS_SNIPING_DPI_CONFIG_STEP # define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100 -# endif // CHARYBDIS_SNIPING_DPI_CONFIG_STEP +# endif // CHARYBDIS_SNIPING_DPI_CONFIG_STEP // Fixed DPI for drag-scroll. # ifndef CHARYBDIS_DRAGSCROLL_DPI # define CHARYBDIS_DRAGSCROLL_DPI 100 -# endif // CHARYBDIS_DRAGSCROLL_DPI +# endif // CHARYBDIS_DRAGSCROLL_DPI # ifndef CHARYBDIS_DRAGSCROLL_BUFFER_SIZE # define CHARYBDIS_DRAGSCROLL_BUFFER_SIZE 6 -# endif // !CHARYBDIS_DRAGSCROLL_BUFFER_SIZE - -# ifndef CHARYBDIS_POINTER_ACCELERATION_FACTOR -# define CHARYBDIS_POINTER_ACCELERATION_FACTOR 24 -# endif // !CHARYBDIS_POINTER_ACCELERATION_FACTOR +# endif // !CHARYBDIS_DRAGSCROLL_BUFFER_SIZE typedef union { uint8_t raw; struct { - uint8_t pointer_default_dpi : 4; // 16 steps available. - uint8_t pointer_sniping_dpi : 2; // 4 steps available. + uint8_t pointer_default_dpi : 4; // 16 steps available. + uint8_t pointer_sniping_dpi : 2; // 4 steps available. bool is_dragscroll_enabled : 1; bool is_sniping_enabled : 1; } __attribute__((packed)); @@ -86,13 +85,19 @@ static void read_charybdis_config_from_eeprom(charybdis_config_t* config) { * resets these 2 values to `false` since it does not make sense to persist * these across reboots of the board. */ -static void write_charybdis_config_to_eeprom(charybdis_config_t* config) { eeconfig_update_kb(config->raw); } +static void write_charybdis_config_to_eeprom(charybdis_config_t* config) { + eeconfig_update_kb(config->raw); +} /** \brief Return the current value of the pointer's default DPI. */ -static uint16_t get_pointer_default_dpi(charybdis_config_t* config) { return (uint16_t)config->pointer_default_dpi * CHARYBDIS_DEFAULT_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_DEFAULT_DPI; } +static uint16_t get_pointer_default_dpi(charybdis_config_t* config) { + return (uint16_t)config->pointer_default_dpi * CHARYBDIS_DEFAULT_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_DEFAULT_DPI; +} /** \brief Return the current value of the pointer's sniper-mode DPI. */ -static uint16_t get_pointer_sniping_dpi(charybdis_config_t* config) { return (uint16_t)config->pointer_sniping_dpi * CHARYBDIS_SNIPING_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_SNIPING_DPI; } +static uint16_t get_pointer_sniping_dpi(charybdis_config_t* config) { + return (uint16_t)config->pointer_sniping_dpi * CHARYBDIS_SNIPING_DPI_CONFIG_STEP + CHARYBDIS_MINIMUM_SNIPING_DPI; +} /** \brief Set the appropriate DPI for the input config. */ static void maybe_update_pointing_device_cpi(charybdis_config_t* config) { @@ -127,64 +132,54 @@ static void step_pointer_sniping_dpi(charybdis_config_t* config, bool forward) { maybe_update_pointing_device_cpi(config); } -uint16_t charybdis_get_pointer_default_dpi(void) { return get_pointer_default_dpi(&g_charybdis_config); } +uint16_t charybdis_get_pointer_default_dpi(void) { + return get_pointer_default_dpi(&g_charybdis_config); +} -uint16_t charybdis_get_pointer_sniping_dpi(void) { return get_pointer_sniping_dpi(&g_charybdis_config); } +uint16_t charybdis_get_pointer_sniping_dpi(void) { + return get_pointer_sniping_dpi(&g_charybdis_config); +} -void charybdis_cycle_pointer_default_dpi_noeeprom(bool forward) { step_pointer_default_dpi(&g_charybdis_config, forward); } +void charybdis_cycle_pointer_default_dpi_noeeprom(bool forward) { + step_pointer_default_dpi(&g_charybdis_config, forward); +} void charybdis_cycle_pointer_default_dpi(bool forward) { step_pointer_default_dpi(&g_charybdis_config, forward); write_charybdis_config_to_eeprom(&g_charybdis_config); } -void charybdis_cycle_pointer_sniping_dpi_noeeprom(bool forward) { step_pointer_sniping_dpi(&g_charybdis_config, forward); } +void charybdis_cycle_pointer_sniping_dpi_noeeprom(bool forward) { + step_pointer_sniping_dpi(&g_charybdis_config, forward); +} void charybdis_cycle_pointer_sniping_dpi(bool forward) { step_pointer_sniping_dpi(&g_charybdis_config, forward); write_charybdis_config_to_eeprom(&g_charybdis_config); } -bool charybdis_get_pointer_sniping_enabled(void) { return g_charybdis_config.is_sniping_enabled; } +bool charybdis_get_pointer_sniping_enabled(void) { + return g_charybdis_config.is_sniping_enabled; +} void charybdis_set_pointer_sniping_enabled(bool enable) { g_charybdis_config.is_sniping_enabled = enable; maybe_update_pointing_device_cpi(&g_charybdis_config); } -bool charybdis_get_pointer_dragscroll_enabled(void) { return g_charybdis_config.is_dragscroll_enabled; } +bool charybdis_get_pointer_dragscroll_enabled(void) { + return g_charybdis_config.is_dragscroll_enabled; +} void charybdis_set_pointer_dragscroll_enabled(bool enable) { g_charybdis_config.is_dragscroll_enabled = enable; maybe_update_pointing_device_cpi(&g_charybdis_config); } -# ifndef CONSTRAIN_HID -# define CONSTRAIN_HID(value) ((value) < XY_REPORT_MIN ? XY_REPORT_MIN : ((value) > XY_REPORT_MAX ? XY_REPORT_MAX : (value))) -# endif // !CONSTRAIN_HID - -/** - * \brief Add optional acceleration effect. - * - * If `CHARYBDIS_ENABLE_POINTER_ACCELERATION` is defined, add a simple and naive - * acceleration effect to the provided value. Return the value unchanged - * otherwise. - */ -# ifndef DISPLACEMENT_WITH_ACCELERATION -# ifdef CHARYBDIS_POINTER_ACCELERATION_ENABLE -# define DISPLACEMENT_WITH_ACCELERATION(d) (CONSTRAIN_HID(d > 0 ? d * d / CHARYBDIS_POINTER_ACCELERATION_FACTOR + d : -d * d / CHARYBDIS_POINTER_ACCELERATION_FACTOR + d)) -# else // !CHARYBDIS_POINTER_ACCELERATION_ENABLE -# define DISPLACEMENT_WITH_ACCELERATION(d) (d) -# endif // CHARYBDIS_POINTER_ACCELERATION_ENABLE -# endif // !DISPLACEMENT_WITH_ACCELERATION - /** * \brief Augment the pointing device behavior. * - * Implement the Charybdis-specific features for pointing devices: - * - Drag-scroll - * - Sniping - * - Acceleration + * Implement drag-scroll. */ static void pointing_device_task_charybdis(report_mouse_t* mouse_report) { static int16_t scroll_buffer_x = 0; @@ -194,12 +189,12 @@ static void pointing_device_task_charybdis(report_mouse_t* mouse_report) { scroll_buffer_x -= mouse_report->x; # else scroll_buffer_x += mouse_report->x; -# endif // CHARYBDIS_DRAGSCROLL_REVERSE_X +# endif // CHARYBDIS_DRAGSCROLL_REVERSE_X # ifdef CHARYBDIS_DRAGSCROLL_REVERSE_Y scroll_buffer_y -= mouse_report->y; # else scroll_buffer_y += mouse_report->y; -# endif // CHARYBDIS_DRAGSCROLL_REVERSE_Y +# endif // CHARYBDIS_DRAGSCROLL_REVERSE_Y mouse_report->x = 0; mouse_report->y = 0; if (abs(scroll_buffer_x) > CHARYBDIS_DRAGSCROLL_BUFFER_SIZE) { @@ -210,16 +205,14 @@ static void pointing_device_task_charybdis(report_mouse_t* mouse_report) { mouse_report->v = scroll_buffer_y > 0 ? 1 : -1; scroll_buffer_y = 0; } - } else if (!g_charybdis_config.is_sniping_enabled) { - mouse_report->x = DISPLACEMENT_WITH_ACCELERATION(mouse_report->x); - mouse_report->y = DISPLACEMENT_WITH_ACCELERATION(mouse_report->y); } } report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) { - pointing_device_task_charybdis(&mouse_report); - mouse_report = pointing_device_task_user(mouse_report); - + if (is_keyboard_master()) { + pointing_device_task_charybdis(&mouse_report); + mouse_report = pointing_device_task_user(mouse_report); + } return mouse_report; } @@ -230,9 +223,9 @@ static bool has_shift_mod(void) { return mod_config(get_mods()) & MOD_MASK_SHIFT; # else return mod_config(get_mods() | get_oneshot_mods()) & MOD_MASK_SHIFT; -# endif // NO_ACTION_ONESHOT +# endif // NO_ACTION_ONESHOT } -# endif // POINTING_DEVICE_ENABLE && !NO_CHARYBDIS_KEYCODES +# endif // POINTING_DEVICE_ENABLE && !NO_CHARYBDIS_KEYCODES /** * \brief Outputs the Charybdis configuration to console. @@ -247,16 +240,16 @@ static bool has_shift_mod(void) { */ __attribute__((unused)) static void debug_charybdis_config_to_console(charybdis_config_t* config) { # ifdef CONSOLE_ENABLE - IGNORE_FORMAT_WARNING(dprintf("(charybdis) process_record_kb: config = {\n" - "\traw = 0x%04X,\n" - "\t{\n" - "\t\tis_dragscroll_enabled=%b\n" - "\t\tis_sniping_enabled=%b\n" - "\t\tdefault_dpi=0x%02X (%ld)\n" - "\t\tsniping_dpi=0x%01X (%ld)\n" - "\t}\n" - "}\n", - config->raw, config->is_dragscroll_enabled, config->is_sniping_enabled, config->pointer_default_dpi, get_pointer_default_dpi(config), config->pointer_sniping_dpi, get_pointer_sniping_dpi(config))); + dprintf("(charybdis) process_record_kb: config = {\n" + "\traw = 0x%X,\n" + "\t{\n" + "\t\tis_dragscroll_enabled=%u\n" + "\t\tis_sniping_enabled=%u\n" + "\t\tdefault_dpi=0x%X (%u)\n" + "\t\tsniping_dpi=0x%X (%u)\n" + "\t}\n" + "}\n", + config->raw, config->is_dragscroll_enabled, config->is_sniping_enabled, config->pointer_default_dpi, get_pointer_default_dpi(config), config->pointer_sniping_dpi, get_pointer_sniping_dpi(config)); # endif // CONSOLE_ENABLE } @@ -307,7 +300,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) { } break; } -# endif // !NO_CHARYBDIS_KEYCODES +# endif // !NO_CHARYBDIS_KEYCODES return true; } @@ -318,22 +311,70 @@ void eeconfig_init_kb(void) { eeconfig_init_user(); } -void matrix_power_up(void) { pointing_device_task(); } +void matrix_power_up(void) { + pointing_device_task(); +} void charybdis_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) { if (initiator2target_buffer_size == sizeof(g_charybdis_config)) { memcpy(&g_charybdis_config, initiator2target_buffer, sizeof(g_charybdis_config)); } } +#endif // POINTING_DEVICE_ENABLE + +__attribute__((weak)) void user_button_init(void) { +#ifdef USER_BUTTON_PIN + gpio_set_pin_input_high(USER_BUTTON_PIN); +#endif // USER_BUTTON_PIN +} + +__attribute__((weak)) bool check_user_button_state(void) { +#ifdef USER_BUTTON_PIN + return !gpio_read_pin(USER_BUTTON_PIN); +#endif // USER_BUTTON_PIN + return false; +} void keyboard_post_init_kb(void) { +#ifdef DEBUG_LED_PIN + gpio_set_pin_output(DEBUG_LED_PIN); + gpio_write_pin_low(DEBUG_LED_PIN); +#endif // DEBUG_LED_PIN + +#ifdef POINTING_DEVICE_ENABLE maybe_update_pointing_device_cpi(&g_charybdis_config); transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, charybdis_config_sync_handler); - +#endif // POINTING_DEVICE_ENABLE keyboard_post_init_user(); } +void keyboard_pre_init_kb(void) { + user_button_init(); +#ifdef POINTING_DEVICE_ENABLE + read_charybdis_config_from_eeprom(&g_charybdis_config); +#endif // POINTING_DEVICE_ENAcBLE + keyboard_pre_init_user(); +} + +__attribute__((weak)) void execute_user_button_action(bool state) { + if (state) { + if (is_keyboard_master()) { + reset_keyboard(); + } else { + soft_reset_keyboard(); + } + } +} + void housekeeping_task_kb(void) { + static bool last_state = false; + bool state = check_user_button_state(); + if (state != last_state) { + last_state = state; + execute_user_button_action(state); + } + +#ifdef POINTING_DEVICE_ENABLE if (is_keyboard_master()) { // Keep track of the last state, so that we can tell if we need to propagate to slave static charybdis_config_t last_charybdis_config = {0}; @@ -357,22 +398,50 @@ void housekeeping_task_kb(void) { } } } - // no need for user function, is called already +#endif // POINTING_DEVICE_ENABLE + // no need for user function, is called already } -#endif // POINTING_DEVICE_ENABLE +#ifdef USER_BUTTON_PIN +/** + * @brief Replace and add upon the default bootmagic reset function. + * In this case, we also check the user button. + * + * @return true if the user button is pressed, or normal bootmagic key position. + * @return false if the user button is not pressed and normal bootmagic key position is not pressed. + */ +__attribute__((weak)) bool bootmagic_should_reset(void) { + uint8_t row = BOOTMAGIC_ROW; + uint8_t col = BOOTMAGIC_COLUMN; -__attribute__((weak)) void matrix_init_sub_kb(void) {} -void matrix_init_kb(void) { -#ifdef POINTING_DEVICE_ENABLE - read_charybdis_config_from_eeprom(&g_charybdis_config); -#endif // POINTING_DEVICE_ENABLE - matrix_init_sub_kb(); - matrix_init_user(); +# if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_ROW_RIGHT) && defined(BOOTMAGIC_COLUMN_RIGHT) + if (!is_keyboard_left()) { + row = BOOTMAGIC_ROW_RIGHT; + col = BOOTMAGIC_COLUMN_RIGHT; + } +# endif + + return matrix_get_row(row) & (1 << col) || check_user_button_state(); +} +#endif // USER_BUTTON_PIN + +bool shutdown_kb(bool jump_to_bootloader) { + if (!shutdown_user(jump_to_bootloader)) { + return false; + } +#ifdef RGB_MATRIX_ENABLE + void rgb_matrix_update_pwm_buffers(void); + rgb_matrix_set_color_all(RGB_RED); + rgb_matrix_update_pwm_buffers(); +#endif // RGB_MATRIX_ENABLE + return true; } -__attribute__((weak)) void matrix_scan_sub_kb(void) {} -void matrix_scan_kb(void) { - matrix_scan_sub_kb(); - matrix_scan_user(); +#ifdef POINTING_DEVICE_AUTO_MOUSE_ENABLE +bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) { + if (IS_KB_KEYCODE(keycode)) { + return true; + } + return is_mouse_record_user(keycode, record); } +#endif // POINTING_DEVICE_AUTO_MOUSE_ENABLE diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h index 48020c89bd..0c473517c7 100644 --- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h +++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h @@ -28,14 +28,15 @@ enum charybdis_keycodes { DRAGSCROLL_MODE, DRAGSCROLL_MODE_TOGGLE, }; -# define DPI_MOD POINTER_DEFAULT_DPI_FORWARD -# define DPI_RMOD POINTER_DEFAULT_DPI_REVERSE -# define S_D_MOD POINTER_SNIPING_DPI_FORWARD -# define S_D_RMOD POINTER_SNIPING_DPI_REVERSE -# define SNIPING SNIPING_MODE -# define SNP_TOG SNIPING_MODE_TOGGLE -# define DRGSCRL DRAGSCROLL_MODE -# define DRG_TOG DRAGSCROLL_MODE_TOGGLE + +#define DPI_MOD POINTER_DEFAULT_DPI_FORWARD +#define DPI_RMOD POINTER_DEFAULT_DPI_REVERSE +#define S_D_MOD POINTER_SNIPING_DPI_FORWARD +#define S_D_RMOD POINTER_SNIPING_DPI_REVERSE +#define SNIPING SNIPING_MODE +#define SNP_TOG SNIPING_MODE_TOGGLE +#define DRGSCRL DRAGSCROLL_MODE +#define DRG_TOG DRAGSCROLL_MODE_TOGGLE #ifdef POINTING_DEVICE_ENABLE /** \brief Return the current DPI value for the pointer's default mode. */ @@ -103,7 +104,4 @@ bool charybdis_get_pointer_dragscroll_enabled(void); * are translated into horizontal and vertical scroll movements. */ void charybdis_set_pointer_dragscroll_enabled(bool enable); -#endif // POINTING_DEVICE_ENABLE - -void matrix_init_sub_kb(void); -void matrix_scan_sub_kb(void); +#endif // POINTING_DEVICE_ENABLE From 04fbcdc68d1aceeef061413d2a049b66a00f1bab Mon Sep 17 00:00:00 2001 From: Duncan Sutherland Date: Tue, 6 May 2025 07:23:10 +0100 Subject: [PATCH 357/592] Layout corrections: Zed60 (#25003) --- keyboards/mechlovin/zed60/keyboard.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/mechlovin/zed60/keyboard.json b/keyboards/mechlovin/zed60/keyboard.json index 136170eec6..6abc8e5bf9 100644 --- a/keyboards/mechlovin/zed60/keyboard.json +++ b/keyboards/mechlovin/zed60/keyboard.json @@ -49,7 +49,8 @@ "pin": "A7" }, "layout_aliases": { - "LAYOUT_all": "LAYOUT_60_ansi_split_bs_rshift" + "LAYOUT_all": "LAYOUT_60_ansi_split_bs_rshift", + "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift" }, "layouts": { "LAYOUT_60_ansi": { @@ -250,7 +251,7 @@ {"matrix": [4, 13], "x": 13.75, "y": 4, "w": 1.25} ] }, - "LAYOUT_60_tsangan_hhkb": { + "LAYOUT_60_ansi_tsangan_split_bs_rshift": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, {"matrix": [0, 1], "x": 1, "y": 0}, @@ -312,7 +313,7 @@ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, {"matrix": [4, 6], "x": 4, "y": 4, "w": 7}, {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, - {"matrix": [4, 12], "x": 12, "y": 4}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} ] } From 1becbaefbea5cb48cda9d4ec7f0802c4052de893 Mon Sep 17 00:00:00 2001 From: dabstractor Date: Wed, 7 May 2025 03:09:01 -0400 Subject: [PATCH 358/592] Fixed print statement after enabling 32-bit layers (#25027) --- quantum/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/command.c b/quantum/command.c index 024d96917d..dde9961e99 100644 --- a/quantum/command.c +++ b/quantum/command.c @@ -243,7 +243,7 @@ static void print_status(void) { #if !defined(NO_PRINT) && !defined(USER_PRINT) static void print_eeconfig(void) { - xprintf("eeconfig:\ndefault_layer: %u\n", eeconfig_read_default_layer()); + xprintf("eeconfig:\ndefault_layer: %" PRIu32 "\n", (uint32_t)eeconfig_read_default_layer()); debug_config_t dc; dc.raw = eeconfig_read_debug(); From 396fb4dde75a10486c538ac173afb8d35c33a868 Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Wed, 7 May 2025 16:38:29 +0200 Subject: [PATCH 359/592] Fix Aurora sweep default keymap configuration (#25148) --- .../aurora/sweep/keymaps/default/keymap.json | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json index 1d308d531f..885faaf858 100644 --- a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json @@ -54,31 +54,16 @@ ] ], "config": { - "features": { - "oled": true, - "rgb_matrix": true, - "rgblight": false + "mousekey": { + "interval": 16, + "time_to_max": 40, + "delay": 100, + "wheel_delay": 100 }, - "encoder": { - "enabled": true - }, - "rgblight": { - "hue_steps": 8, - "saturation_steps": 8, - "brightness_steps": 8, - "sleep": true + "tapping": { + "term": 200, + "permissive_hold": true, + "force_hold": true } - }, - "mouse_key": { - "enabled": true, - "interval": 16, - "time_to_max": 40, - "delay": 100, - "wheel_delay": 100 - }, - "tapping": { - "term": 200, - "permissive_hold": true, - "force_hold": true } } From 32204095e52c5492f8eabc2821b779564a430d74 Mon Sep 17 00:00:00 2001 From: Nathan Cain <13713501+nathanscain@users.noreply.github.com> Date: Wed, 7 May 2025 09:41:37 -0500 Subject: [PATCH 360/592] Docs update for installing qmk with uv (#24995) --- docs/cli.md | 12 ++++++++++++ docs/newbs_getting_started.md | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/docs/cli.md b/docs/cli.md index 7d4c10cedd..b46180cdde 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -18,6 +18,18 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware` qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment ``` +### Install Using uv {#install-using-uv} + +If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool: + +``` +uv tool install qmk +export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware` +qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment +``` + +This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information. + ### Install Using pip {#install-using-easy_install-or-pip} If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command: diff --git a/docs/newbs_getting_started.md b/docs/newbs_getting_started.md index 9ebcccc77f..1d2b60781b 100644 --- a/docs/newbs_getting_started.md +++ b/docs/newbs_getting_started.md @@ -101,6 +101,12 @@ Install the QMK CLI by running: python3 -m pip install --user qmk ``` +Alternatively, install the QMK CLI as a [uv](https://docs.astral.sh/uv/) managed tool, kept isolated in a virtual environment (requires uv to be installed): + +```sh +uv tool install qmk +``` + #### Community Packages These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers. From 33a12ca0b67d9b70e819d1d5fb9125f6b50cb943 Mon Sep 17 00:00:00 2001 From: muge <221161+muge@users.noreply.github.com> Date: Wed, 7 May 2025 10:38:10 -0700 Subject: [PATCH 361/592] CXT Studio 12E3: Fix encoder resolutions not applying (#25242) * add resolution to encoders so they apply * Tweak default keymap * replace KC_UNDO with C(KC_Z) as well --- keyboards/cxt_studio/12e3/keyboard.json | 4 ++-- keyboards/cxt_studio/12e3/keymaps/default/keymap.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/cxt_studio/12e3/keyboard.json b/keyboards/cxt_studio/12e3/keyboard.json index 763f6bd5b9..6b5bf3b115 100644 --- a/keyboards/cxt_studio/12e3/keyboard.json +++ b/keyboards/cxt_studio/12e3/keyboard.json @@ -21,8 +21,8 @@ }, "encoder": { "rotary": [ - {"pin_a": "F5", "pin_b": "F6"}, - {"pin_a": "E6", "pin_b": "F0"}, + {"pin_a": "F5", "pin_b": "F6", "resolution": 4}, + {"pin_a": "E6", "pin_b": "F0", "resolution": 4}, {"pin_a": "B3", "pin_b": "B2", "resolution": 2} ] }, diff --git a/keyboards/cxt_studio/12e3/keymaps/default/keymap.c b/keyboards/cxt_studio/12e3/keymaps/default/keymap.c index 78375680d4..ef4b6938eb 100644 --- a/keyboards/cxt_studio/12e3/keymaps/default/keymap.c +++ b/keyboards/cxt_studio/12e3/keymaps/default/keymap.c @@ -11,14 +11,14 @@ enum my_layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT( - KC_PSCR, KC_CUT, KC_COPY, KC_PSTE, MS_BTN3, RM_TOGG, - KC_CALC, KC_UNDO, KC_MPLY, KC_MNXT, KC_MUTE, + KC_ESC, C(KC_X), C(KC_C), C(KC_V), MS_BTN3, RM_TOGG, + KC_PSCR,C(KC_Z), KC_CALC, KC_MNXT, KC_MPLY, MO(1), KC_LGUI, KC_DEL, KC_APP ), [_RGBL] = LAYOUT( - RM_NEXT, RM_SATU, KC_INS, KC_DEL, _______, _______, - RM_PREV, RM_SATD, KC_PGUP, KC_HOME, _______, + RM_NEXT, RM_SATU, KC_INS, KC_DEL, _______, _______, + RM_PREV, RM_SATD, KC_PGUP, KC_HOME, KC_MUTE, _______, QK_BOOT, KC_PGDN, KC_END ), }; From 660d248549b5a699eecc2193870f74f63616b8f1 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 8 May 2025 01:12:58 +0100 Subject: [PATCH 362/592] Add debounce to duplicated defaults check (#25246) --- data/mappings/info_defaults.hjson | 1 + keyboards/mlego/m65/rev1/keyboard.json | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mappings/info_defaults.hjson b/data/mappings/info_defaults.hjson index 00f50437a2..b33cb4fa1f 100644 --- a/data/mappings/info_defaults.hjson +++ b/data/mappings/info_defaults.hjson @@ -10,6 +10,7 @@ "levels": 3, "on_state": 1 }, + "debounce": 5, "features": { "command": false, "console": false diff --git a/keyboards/mlego/m65/rev1/keyboard.json b/keyboards/mlego/m65/rev1/keyboard.json index 0e69b96a19..6959d11456 100644 --- a/keyboards/mlego/m65/rev1/keyboard.json +++ b/keyboards/mlego/m65/rev1/keyboard.json @@ -3,7 +3,6 @@ "keyboard_name": "mlego/m65 rev1", "maintainer": "alin elena", "bootloader": "stm32duino", - "debounce": 5, "diode_direction": "COL2ROW", "encoder": { "rotary": [ From 5a57d2115b96d682534de22518e8d6bdf8ce6ab7 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 8 May 2025 14:18:30 -0700 Subject: [PATCH 363/592] [Docs] Fix typos introduced by PR #25050 (#25250) It isn't a drashna PR if there aren't some typos in it somewhere. --- docs/features/community_modules.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md index 69fc47f617..8dede47bd4 100644 --- a/docs/features/community_modules.md +++ b/docs/features/community_modules.md @@ -141,12 +141,12 @@ Community Modules may provide specializations for the following APIs: | `process_detected_host_os` | `process_detected_host_os_` | `process_detected_host_os_hello_world` | `1.0.0` | | `default_layer_state_set` | `default_layer_state_set_` | `default_layer_state_set_hello_world` | `1.1.0` | | `layer_state_set` | `layer_state_set_` | `layer_state_set_hello_world` | `1.1.0` | -| `led_matrix_indicators` | `led_matrix_indicators_` | `led_matrix_indicators_hello_word` | `1.1.0` | -| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_` | `led_matrix_indicators_advanced_hello_word` | `1.1.0` | -| `rgb_matrix_indicators` | `rgb_matrix_indicators_` | `rgb_matrix_indicators_hello_word` | `1.1.0` | -| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_` | `rgb_matrix_indicators_advanced_hello_word` | `1.1.0` | -| `pointing_device_init` | `pointing_device_init_` | `pointing_device_init_hello_word` | `1.1.0` | -| `pointing_device_task` | `pointing_device_task_` | `pointing_device_task_hello_word` | `1.1.0` | +| `led_matrix_indicators` | `led_matrix_indicators_` | `led_matrix_indicators_hello_world` | `1.1.0` | +| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` | +| `rgb_matrix_indicators` | `rgb_matrix_indicators_` | `rgb_matrix_indicators_hello_world` | `1.1.0` | +| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_` | `rgb_matrix_indicators_advanced_hello_world` | `1.1.0` | +| `pointing_device_init` | `pointing_device_init_` | `pointing_device_init_hello_world` | `1.1.0` | +| `pointing_device_task` | `pointing_device_task_` | `pointing_device_task_hello_world` | `1.1.0` | ::: info From 02525f683e7ad1a2f032dfe8663b0303d1714a7d Mon Sep 17 00:00:00 2001 From: HorrorTroll Date: Sun, 11 May 2025 01:26:50 +0700 Subject: [PATCH 364/592] Allow LVGL onekey keymap to be able compile for other board (#25005) --- .../handwired/onekey/at_start_f415/config.h | 14 ++++++++++++ .../handwired/onekey/at_start_f415/halconf.h | 3 +++ .../onekey/at_start_f415/keyboard.json | 2 +- .../handwired/onekey/at_start_f415/mcuconf.h | 3 +++ keyboards/handwired/onekey/kb2040/config.h | 10 +++++++++ keyboards/handwired/onekey/kb2040/halconf.h | 22 +++++++++++++++++++ keyboards/handwired/onekey/kb2040/mcuconf.h | 3 +++ .../handwired/onekey/keymaps/lvgl/config.h | 15 ------------- .../handwired/onekey/keymaps/lvgl/halconf.h | 12 ---------- .../handwired/onekey/keymaps/lvgl/mcuconf.h | 9 -------- keyboards/handwired/onekey/rp2040/config.h | 11 ++++++++++ keyboards/handwired/onekey/rp2040/halconf.h | 5 +++++ keyboards/handwired/onekey/rp2040/mcuconf.h | 3 +++ 13 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 keyboards/handwired/onekey/kb2040/halconf.h delete mode 100644 keyboards/handwired/onekey/keymaps/lvgl/config.h delete mode 100644 keyboards/handwired/onekey/keymaps/lvgl/halconf.h delete mode 100644 keyboards/handwired/onekey/keymaps/lvgl/mcuconf.h diff --git a/keyboards/handwired/onekey/at_start_f415/config.h b/keyboards/handwired/onekey/at_start_f415/config.h index 41aece900c..7e41e7da89 100644 --- a/keyboards/handwired/onekey/at_start_f415/config.h +++ b/keyboards/handwired/onekey/at_start_f415/config.h @@ -4,11 +4,25 @@ #pragma once +/* ADC pin */ #define ADC_PIN A0 +/* Backlight configs */ #define BACKLIGHT_PWM_DRIVER PWMD5 #define BACKLIGHT_PWM_CHANNEL 1 +/* LCD configs */ +#define LCD_RST_PIN A2 +#define LCD_DC_PIN A3 +#define LCD_CS_PIN A4 + +/* SPI pins */ +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN A5 +#define SPI_MOSI_PIN A7 +#define SPI_MISO_PIN A6 + +/* Haptic configs */ #define SOLENOID_PIN B12 #define SOLENOID_PINS { B12, B13, B14, B15 } #define SOLENOID_PINS_ACTIVE_STATE { high, high, low } diff --git a/keyboards/handwired/onekey/at_start_f415/halconf.h b/keyboards/handwired/onekey/at_start_f415/halconf.h index e3c075936d..1fc1b548a2 100644 --- a/keyboards/handwired/onekey/at_start_f415/halconf.h +++ b/keyboards/handwired/onekey/at_start_f415/halconf.h @@ -10,4 +10,7 @@ #define HAL_USE_PWM TRUE +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE + #include_next diff --git a/keyboards/handwired/onekey/at_start_f415/keyboard.json b/keyboards/handwired/onekey/at_start_f415/keyboard.json index 6e5683a474..8024e776a8 100644 --- a/keyboards/handwired/onekey/at_start_f415/keyboard.json +++ b/keyboards/handwired/onekey/at_start_f415/keyboard.json @@ -16,7 +16,7 @@ }, "ws2812": { "pin": "B0" - } + }, "apa102": { "data_pin": "B0", "clock_pin": "B1" diff --git a/keyboards/handwired/onekey/at_start_f415/mcuconf.h b/keyboards/handwired/onekey/at_start_f415/mcuconf.h index 246f6762d3..8f6333ca01 100644 --- a/keyboards/handwired/onekey/at_start_f415/mcuconf.h +++ b/keyboards/handwired/onekey/at_start_f415/mcuconf.h @@ -14,3 +14,6 @@ #undef AT32_PWM_USE_TMR5 #define AT32_PWM_USE_TMR5 TRUE + +#undef AT32_SPI_USE_SPI1 +#define AT32_SPI_USE_SPI1 TRUE diff --git a/keyboards/handwired/onekey/kb2040/config.h b/keyboards/handwired/onekey/kb2040/config.h index e9c4eef273..a9508bc4cc 100644 --- a/keyboards/handwired/onekey/kb2040/config.h +++ b/keyboards/handwired/onekey/kb2040/config.h @@ -16,3 +16,13 @@ #define I2C1_SDA_PIN GP12 #define I2C1_SCL_PIN GP13 +/* LCD configs */ +#define LCD_RST_PIN GP0 +#define LCD_DC_PIN GP1 +#define LCD_CS_PIN GP2 + +/* SPI pins */ +#define SPI_DRIVER SPID0 +#define SPI_SCK_PIN GP18 +#define SPI_MOSI_PIN GP19 +#define SPI_MISO_PIN GP20 diff --git a/keyboards/handwired/onekey/kb2040/halconf.h b/keyboards/handwired/onekey/kb2040/halconf.h new file mode 100644 index 0000000000..ce781aa374 --- /dev/null +++ b/keyboards/handwired/onekey/kb2040/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2020 QMK + * + * 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 +#define SPI_USE_WAIT TRUE + +#include_next diff --git a/keyboards/handwired/onekey/kb2040/mcuconf.h b/keyboards/handwired/onekey/kb2040/mcuconf.h index 57e58e14d7..cc44ce77c3 100644 --- a/keyboards/handwired/onekey/kb2040/mcuconf.h +++ b/keyboards/handwired/onekey/kb2040/mcuconf.h @@ -22,3 +22,6 @@ #undef RP_I2C_USE_I2C1 #define RP_I2C_USE_I2C1 TRUE + +#undef RP_SPI_USE_SPI0 +#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/handwired/onekey/keymaps/lvgl/config.h b/keyboards/handwired/onekey/keymaps/lvgl/config.h deleted file mode 100644 index 38bb5d0cf3..0000000000 --- a/keyboards/handwired/onekey/keymaps/lvgl/config.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 Jose Pablo Ramirez (@jpe230) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -/* SPI pins */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP18 -#define SPI_MOSI_PIN GP19 -#define SPI_MISO_PIN GP20 - -/* LCD Configuration */ -#define LCD_RST_PIN GP0 -#define LCD_DC_PIN GP1 -#define LCD_CS_PIN GP2 diff --git a/keyboards/handwired/onekey/keymaps/lvgl/halconf.h b/keyboards/handwired/onekey/keymaps/lvgl/halconf.h deleted file mode 100644 index 27646bb3f5..0000000000 --- a/keyboards/handwired/onekey/keymaps/lvgl/halconf.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2022 Jose Pablo Ramirez (@jpe230) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include_next - -#undef HAL_USE_SPI -#define HAL_USE_SPI TRUE - -#undef SPI_USE_WAIT -#define SPI_USE_WAIT TRUE diff --git a/keyboards/handwired/onekey/keymaps/lvgl/mcuconf.h b/keyboards/handwired/onekey/keymaps/lvgl/mcuconf.h deleted file mode 100644 index bff74867ff..0000000000 --- a/keyboards/handwired/onekey/keymaps/lvgl/mcuconf.h +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2022 Jose Pablo Ramirez (@jpe230) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include_next - -#undef RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/handwired/onekey/rp2040/config.h b/keyboards/handwired/onekey/rp2040/config.h index 0030e97b0f..974fc688d3 100644 --- a/keyboards/handwired/onekey/rp2040/config.h +++ b/keyboards/handwired/onekey/rp2040/config.h @@ -17,3 +17,14 @@ #define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A #define ADC_PIN GP26 + +/* LCD configs */ +#define LCD_RST_PIN GP0 +#define LCD_DC_PIN GP1 +#define LCD_CS_PIN GP2 + +/* SPI pins */ +#define SPI_DRIVER SPID0 +#define SPI_SCK_PIN GP18 +#define SPI_MOSI_PIN GP19 +#define SPI_MISO_PIN GP20 diff --git a/keyboards/handwired/onekey/rp2040/halconf.h b/keyboards/handwired/onekey/rp2040/halconf.h index ec56be2263..da4a49b5c1 100644 --- a/keyboards/handwired/onekey/rp2040/halconf.h +++ b/keyboards/handwired/onekey/rp2040/halconf.h @@ -4,7 +4,12 @@ #pragma once #define HAL_USE_I2C TRUE + #define HAL_USE_PWM TRUE + #define HAL_USE_ADC TRUE +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE + #include_next diff --git a/keyboards/handwired/onekey/rp2040/mcuconf.h b/keyboards/handwired/onekey/rp2040/mcuconf.h index e24a0d4f24..c1d22657ca 100644 --- a/keyboards/handwired/onekey/rp2040/mcuconf.h +++ b/keyboards/handwired/onekey/rp2040/mcuconf.h @@ -10,3 +10,6 @@ #undef RP_PWM_USE_PWM4 #define RP_PWM_USE_PWM4 TRUE + +#undef RP_SPI_USE_SPI0 +#define RP_SPI_USE_SPI0 TRUE From 6b1a376aee93c74a0445d918e49c9118c59616fd Mon Sep 17 00:00:00 2001 From: cyxae Date: Sun, 11 May 2025 01:57:40 -0400 Subject: [PATCH 365/592] =?UTF-8?q?[Keyboard]=20Add=20Jason=20Hazel?= =?UTF-8?q?=E2=80=99s=20Bad=20Wings=20v2=20(#25252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Florent Allard --- keyboards/hazel/bad_wings_v2/config.h | 18 +++++ keyboards/hazel/bad_wings_v2/halconf.h | 10 +++ keyboards/hazel/bad_wings_v2/keyboard.json | 67 +++++++++++++++++++ .../bad_wings_v2/keymaps/default/config.h | 11 +++ .../bad_wings_v2/keymaps/default/keymap.json | 32 +++++++++ keyboards/hazel/bad_wings_v2/mcuconf.h | 9 +++ keyboards/hazel/bad_wings_v2/readme.md | 27 ++++++++ keyboards/hazel/bad_wings_v2/rules.mk | 1 + 8 files changed, 175 insertions(+) create mode 100644 keyboards/hazel/bad_wings_v2/config.h create mode 100644 keyboards/hazel/bad_wings_v2/halconf.h create mode 100644 keyboards/hazel/bad_wings_v2/keyboard.json create mode 100644 keyboards/hazel/bad_wings_v2/keymaps/default/config.h create mode 100644 keyboards/hazel/bad_wings_v2/keymaps/default/keymap.json create mode 100644 keyboards/hazel/bad_wings_v2/mcuconf.h create mode 100644 keyboards/hazel/bad_wings_v2/readme.md create mode 100644 keyboards/hazel/bad_wings_v2/rules.mk diff --git a/keyboards/hazel/bad_wings_v2/config.h b/keyboards/hazel/bad_wings_v2/config.h new file mode 100644 index 0000000000..7f861f693f --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/config.h @@ -0,0 +1,18 @@ +// Copyright 2023 Jason Hazel (@jasonhazel) +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN A5 +#define SPI_SCK_PAL_MODE 0 +#define SPI_MOSI_PIN A7 +#define SPI_MOSI_PAL_MODE 0 +#define SPI_MISO_PIN A6 +#define SPI_MISO_PAL_MODE 0 +#define CIRQUE_PINNACLE_SPI_DIVISOR 8 +#define CIRQUE_PINNACLE_SPI_CS_PIN A4 + +#define POINTING_DEVICE_CS_PIN A4 +#define CIRQUE_PINNACLE_DIAMETER_MM 35 +#define POINTING_DEVICE_ROTATION_90 diff --git a/keyboards/hazel/bad_wings_v2/halconf.h b/keyboards/hazel/bad_wings_v2/halconf.h new file mode 100644 index 0000000000..6d6a6511bf --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2023 Jason Hazel (@jasonhazel) +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + +#include_next diff --git a/keyboards/hazel/bad_wings_v2/keyboard.json b/keyboards/hazel/bad_wings_v2/keyboard.json new file mode 100644 index 0000000000..e6f9bad637 --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/keyboard.json @@ -0,0 +1,67 @@ +{ + "manufacturer": "Hazel", + "keyboard_name": "Bad Wings v2", + "maintainer": "jasonhazel", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "pointing_device": true + }, + "matrix_pins": { + "cols": ["F1", "F0", "C15", "C14", "C13"], + "rows": ["B11", "B10", "B2", "B1", "B3", "B4", "B5", "B6"] + }, + "processor": "STM32F072", + "url": "https://github.com/hazels-garage/bad-wings/tree/master/v2", + "usb": { + "device_version": "1.0.0", + "pid": "0x4258", + "vid": "0x4A48" + }, + "community_layouts": ["split_3x5_3"], + "layouts": { + "LAYOUT_split_3x5_3": { + "layout": [ + {"label": "00", "matrix": [0, 0], "x": 0, "y": 0.75, "w": 1}, + {"label": "01", "matrix": [0, 1], "x": 1, "y": 0.5, "w": 1}, + {"label": "02", "matrix": [0, 2], "x": 2, "y": 0, "w": 1}, + {"label": "03", "matrix": [0, 3], "x": 3, "y": 0.25, "w": 1}, + {"label": "04", "matrix": [0, 4], "x": 4, "y": 0.36, "w": 1}, + {"label": "44", "matrix": [4, 4], "x": 8, "y": 0.36, "w": 1}, + {"label": "43", "matrix": [4, 3], "x": 9, "y": 0.25, "w": 1}, + {"label": "42", "matrix": [4, 2], "x": 10, "y": 0, "w": 1}, + {"label": "41", "matrix": [4, 1], "x": 11, "y": 0.5, "w": 1}, + {"label": "40", "matrix": [4, 0], "x": 12, "y": 0.75, "w": 1}, + {"label": "10", "matrix": [1, 0], "x": 0, "y": 1.75, "w": 1}, + {"label": "11", "matrix": [1, 1], "x": 1, "y": 1.5, "w": 1}, + {"label": "12", "matrix": [1, 2], "x": 2, "y": 1, "w": 1}, + {"label": "13", "matrix": [1, 3], "x": 3, "y": 1.25, "w": 1}, + {"label": "14", "matrix": [1, 4], "x": 4, "y": 1.36, "w": 1}, + {"label": "54", "matrix": [5, 4], "x": 8, "y": 1.36, "w": 1}, + {"label": "53", "matrix": [5, 3], "x": 9, "y": 1.25, "w": 1}, + {"label": "52", "matrix": [5, 2], "x": 10, "y": 1, "w": 1}, + {"label": "51", "matrix": [5, 1], "x": 11, "y": 1.5, "w": 1}, + {"label": "50", "matrix": [5, 0], "x": 12, "y": 1.75, "w": 1}, + {"label": "20", "matrix": [2, 0], "x": 0, "y": 2.75, "w": 1}, + {"label": "21", "matrix": [2, 1], "x": 1, "y": 2.5, "w": 1}, + {"label": "22", "matrix": [2, 2], "x": 2, "y": 2, "w": 1}, + {"label": "23", "matrix": [2, 3], "x": 3, "y": 2.25, "w": 1}, + {"label": "24", "matrix": [2, 4], "x": 4, "y": 2.36, "w": 1}, + {"label": "64", "matrix": [6, 4], "x": 8, "y": 2.36, "w": 1}, + {"label": "63", "matrix": [6, 3], "x": 9, "y": 2.25, "w": 1}, + {"label": "62", "matrix": [6, 2], "x": 10, "y": 2, "w": 1}, + {"label": "61", "matrix": [6, 1], "x": 11, "y": 2.5, "w": 1}, + {"label": "60", "matrix": [6, 0], "x": 12, "y": 2.75, "w": 1}, + {"label": "32", "matrix": [3, 2], "x": 3, "y": 3.25, "w": 1}, + {"label": "33", "matrix": [3, 3], "x": 4, "y": 3.36, "w": 1}, + {"label": "34", "matrix": [3, 4], "x": 5, "y": 3.47, "w": 1}, + {"label": "74", "matrix": [7, 4], "x": 7, "y": 3.47, "w": 1}, + {"label": "73", "matrix": [7, 3], "x": 8, "y": 3.36, "w": 1}, + {"label": "72", "matrix": [7, 2], "x": 9, "y": 3.25, "w": 1} + ] + } + } +} diff --git a/keyboards/hazel/bad_wings_v2/keymaps/default/config.h b/keyboards/hazel/bad_wings_v2/keymaps/default/config.h new file mode 100644 index 0000000000..75c535cee8 --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/keymaps/default/config.h @@ -0,0 +1,11 @@ +// Copyright 2023 Jason Hazel (@jasonhazel) +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#define PERMISSIVE_HOLD +#define ONESHOT_TAP_TOGGLE 10 +#define ONESHOT_TIMEOUT 500 +#define CIRQUE_PINNACLE_TAP_ENABLE +#define CIRQUE_PINNACLE_POSITION_MODE CIRQUE_PINNACLE_ABSOLUTE_MODE +#define CIRQUE_DEVICE_GESTURES_SCROLL_ENABLE diff --git a/keyboards/hazel/bad_wings_v2/keymaps/default/keymap.json b/keyboards/hazel/bad_wings_v2/keymaps/default/keymap.json new file mode 100644 index 0000000000..251be09c33 --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/keymaps/default/keymap.json @@ -0,0 +1,32 @@ +{ + "keyboard": "hazel/bad_wings_v2", + "keymap": "default", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_QUOT", + "KC_Z", "LGUI_T(KC_X)", "LALT_T(KC_C)", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", + "KC_LCTL", "OSL(1)", "OSM(MOD_LSFT)", "LT(3,KC_SPC)", "LT(2,KC_BSPC)", "KC_ENT" + ], + [ + "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_RBRC", "KC_RCBR", "KC_RPRN", "KC_GT", "KC_NO", + "KC_GRV", "KC_TILD", "KC_UNDS", "KC_EQL", "KC_NO", "KC_LBRC", "KC_LCBR", "KC_LPRN", "KC_LT", "KC_BSLS", + "KC_NO", "KC_NO", "KC_PLUS", "KC_MINS", "KC_NO", "KC_NO", "KC_NO", "KC_COLN", "KC_DOT", "KC_SCLN", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ], + [ + "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_PIPE", "KC_NO", + "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", + "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", "KC_NO", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ], + [ + "KC_ESC", "KC_F1", "KC_F4", "KC_F7", "KC_F10", "KC_NO", "KC_HOME", "KC_UP", "KC_END", "KC_NO", + "KC_TAB", "KC_F2", "KC_F5", "KC_F8", "KC_F11", "KC_NO", "KC_LEFT", "KC_DOWN", "KC_RGHT", "KC_NO", + "KC_NO", "KC_F3", "KC_F6", "KC_F9", "KC_F12", "KC_NO", "KC_MRWD", "KC_MPLY", "KC_MFFD", "KC_DEL", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" + ] + ], + "author": "Jason Hazel" +} diff --git a/keyboards/hazel/bad_wings_v2/mcuconf.h b/keyboards/hazel/bad_wings_v2/mcuconf.h new file mode 100644 index 0000000000..77c7d10e9b --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2022 Kyle McCreery (@kylemccreery) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI1 +#define STM32_SPI_USE_SPI1 TRUE diff --git a/keyboards/hazel/bad_wings_v2/readme.md b/keyboards/hazel/bad_wings_v2/readme.md new file mode 100644 index 0000000000..1b34057aa3 --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/readme.md @@ -0,0 +1,27 @@ +# Bad Wings v2 + +![Bad Wings v2](https://i.imgur.com/8uCHotK.jpeg) + +36 key unibody split + +* Keyboard Maintainer: [Jason Hazel](https://github.com/jasonhazel) +* Hardware Supported: Bad Wings v2 +* Hardware Availability: [Hazel's Garage GitHub](https://github.com/hazels-garage/bad-wings/tree/master/v2) + +Make example for this keyboard (after setting up your build environment): + + make hazel/bad_wings_v2:default + +Flashing example for this keyboard: + + make hazel/bad_wings_v2: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 top-left key and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/hazel/bad_wings_v2/rules.mk b/keyboards/hazel/bad_wings_v2/rules.mk new file mode 100644 index 0000000000..fb5d649735 --- /dev/null +++ b/keyboards/hazel/bad_wings_v2/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = cirque_pinnacle_spi From 88c094908bb94324e28876f2beb8028a9fad086d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 11 May 2025 23:38:48 +0100 Subject: [PATCH 366/592] Add raw_hid support to host driver (#25255) --- builddefs/common_features.mk | 5 ++++ drivers/bluetooth/bluetooth.c | 2 ++ drivers/bluetooth/bluetooth.h | 8 +++++++ quantum/raw_hid.c | 15 ++++++++++++ tmk_core/protocol.mk | 4 ---- tmk_core/protocol/chibios/chibios.c | 12 +++++++++- tmk_core/protocol/chibios/usb_main.c | 12 ++++------ tmk_core/protocol/host.c | 12 ++++++++++ tmk_core/protocol/host.h | 1 + tmk_core/protocol/host_driver.h | 3 +++ tmk_core/protocol/lufa/lufa.c | 35 +++++++++++++++------------- tmk_core/protocol/vusb/vusb.c | 22 ++++++++++------- 12 files changed, 95 insertions(+), 36 deletions(-) create mode 100644 quantum/raw_hid.c diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index f62b925817..3d01be8205 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -643,6 +643,11 @@ ifeq ($(strip $(VIA_ENABLE)), yes) TRI_LAYER_ENABLE := yes endif +ifeq ($(strip $(RAW_ENABLE)), yes) + OPT_DEFS += -DRAW_ENABLE + SRC += raw_hid.c +endif + ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) SEND_STRING_ENABLE := yes endif diff --git a/drivers/bluetooth/bluetooth.c b/drivers/bluetooth/bluetooth.c index 61a3f0f32a..e61e24e1f2 100644 --- a/drivers/bluetooth/bluetooth.c +++ b/drivers/bluetooth/bluetooth.c @@ -28,3 +28,5 @@ __attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {} __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {} __attribute__((weak)) void bluetooth_send_system(uint16_t usage) {} + +__attribute__((weak)) void bluetooth_send_raw_hid(uint8_t *data, uint8_t length) {} diff --git a/drivers/bluetooth/bluetooth.h b/drivers/bluetooth/bluetooth.h index e50b588db2..bbd41a9194 100644 --- a/drivers/bluetooth/bluetooth.h +++ b/drivers/bluetooth/bluetooth.h @@ -81,3 +81,11 @@ void bluetooth_send_consumer(uint16_t usage); * \param usage The system usage to send. */ void bluetooth_send_system(uint16_t usage); + +/** + * \brief Send a raw_hid packet. + * + * \param data A pointer to the buffer to be sent. Always 32 bytes in length. + * \param length The length of the buffer. Always 32. + */ +void bluetooth_send_raw_hid(uint8_t *data, uint8_t length); diff --git a/quantum/raw_hid.c b/quantum/raw_hid.c new file mode 100644 index 0000000000..2c7a75f325 --- /dev/null +++ b/quantum/raw_hid.c @@ -0,0 +1,15 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "raw_hid.h" +#include "host.h" + +void raw_hid_send(uint8_t *data, uint8_t length) { + host_raw_hid_send(data, length); +} + +__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { + // Users should #include "raw_hid.h" in their own code + // and implement this function there. Leave this as weak linkage + // so users can opt to not handle data coming in. +} diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index 2930efc283..81520c1bc8 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -33,10 +33,6 @@ ifeq ($(strip $(PROGRAMMABLE_BUTTON_ENABLE)), yes) SHARED_EP_ENABLE = yes endif -ifeq ($(strip $(RAW_ENABLE)), yes) - OPT_DEFS += -DRAW_ENABLE -endif - ifeq ($(strip $(CONSOLE_ENABLE)), yes) OPT_DEFS += -DCONSOLE_ENABLE else diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index d752f3746b..19d8121e34 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -66,9 +66,19 @@ void send_keyboard(report_keyboard_t *report); void send_nkro(report_nkro_t *report); void send_mouse(report_mouse_t *report); void send_extra(report_extra_t *report); +void send_raw_hid(uint8_t *data, uint8_t length); /* host struct */ -host_driver_t chibios_driver = {.keyboard_leds = usb_device_state_get_leds, .send_keyboard = send_keyboard, .send_nkro = send_nkro, .send_mouse = send_mouse, .send_extra = send_extra}; +host_driver_t chibios_driver = { + .keyboard_leds = usb_device_state_get_leds, + .send_keyboard = send_keyboard, + .send_nkro = send_nkro, + .send_mouse = send_mouse, + .send_extra = send_extra, +#ifdef RAW_ENABLE + .send_raw_hid = send_raw_hid, +#endif +}; #ifdef VIRTSER_ENABLE void virtser_task(void); diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 5a5354416f..f9d7f5c4d6 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -32,6 +32,10 @@ #include "usb_driver.h" #include "usb_types.h" +#ifdef RAW_ENABLE +# include "raw_hid.h" +#endif + #ifdef NKRO_ENABLE # include "keycode_config.h" @@ -515,19 +519,13 @@ void console_task(void) { #endif /* CONSOLE_ENABLE */ #ifdef RAW_ENABLE -void raw_hid_send(uint8_t *data, uint8_t length) { +void send_raw_hid(uint8_t *data, uint8_t length) { if (length != RAW_EPSIZE) { return; } send_report(USB_ENDPOINT_IN_RAW, data, length); } -__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { - // Users should #include "raw_hid.h" in their own code - // and implement this function there. Leave this as weak linkage - // so users can opt to not handle data coming in. -} - void raw_hid_task(void) { uint8_t buffer[RAW_EPSIZE]; while (receive_report(USB_ENDPOINT_OUT_RAW, buffer, sizeof(buffer))) { diff --git a/tmk_core/protocol/host.c b/tmk_core/protocol/host.c index e785cb24cc..4874d7c1d3 100644 --- a/tmk_core/protocol/host.c +++ b/tmk_core/protocol/host.c @@ -55,6 +55,9 @@ host_driver_t bt_driver = { .send_nkro = bluetooth_send_nkro, .send_mouse = bluetooth_send_mouse, .send_extra = bluetooth_send_extra, +# ifdef RAW_ENABLE + .send_raw_hid = bluetooth_send_raw_hid, +# endif }; #endif @@ -299,6 +302,15 @@ void host_programmable_button_send(uint32_t data) { __attribute__((weak)) void send_programmable_button(report_programmable_button_t *report) {} +#ifdef RAW_ENABLE +void host_raw_hid_send(uint8_t *data, uint8_t length) { + host_driver_t *driver = host_get_active_driver(); + if (!driver || !driver->send_raw_hid) return; + + (*driver->send_raw_hid)(data, length); +} +#endif + uint16_t host_last_system_usage(void) { return last_system_usage; } diff --git a/tmk_core/protocol/host.h b/tmk_core/protocol/host.h index 8e8a18e2ed..a0b1e73dcc 100644 --- a/tmk_core/protocol/host.h +++ b/tmk_core/protocol/host.h @@ -41,6 +41,7 @@ void host_mouse_send(report_mouse_t *report); void host_system_send(uint16_t usage); void host_consumer_send(uint16_t usage); void host_programmable_button_send(uint32_t data); +void host_raw_hid_send(uint8_t *data, uint8_t length); uint16_t host_last_system_usage(void); uint16_t host_last_consumer_usage(void); diff --git a/tmk_core/protocol/host_driver.h b/tmk_core/protocol/host_driver.h index 8aa38b6dee..c2835aaa99 100644 --- a/tmk_core/protocol/host_driver.h +++ b/tmk_core/protocol/host_driver.h @@ -29,6 +29,9 @@ typedef struct { void (*send_nkro)(report_nkro_t *); void (*send_mouse)(report_mouse_t *); void (*send_extra)(report_extra_t *); +#ifdef RAW_ENABLE + void (*send_raw_hid)(uint8_t *, uint8_t); +#endif } host_driver_t; void send_joystick(report_joystick_t *report); diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 81da035f0c..d59468133c 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -75,11 +75,24 @@ static report_keyboard_t keyboard_report_sent; /* Host driver */ -static void send_keyboard(report_keyboard_t *report); -static void send_nkro(report_nkro_t *report); -static void send_mouse(report_mouse_t *report); -static void send_extra(report_extra_t *report); -host_driver_t lufa_driver = {.keyboard_leds = usb_device_state_get_leds, .send_keyboard = send_keyboard, .send_nkro = send_nkro, .send_mouse = send_mouse, .send_extra = send_extra}; +static void send_keyboard(report_keyboard_t *report); +static void send_nkro(report_nkro_t *report); +static void send_mouse(report_mouse_t *report); +static void send_extra(report_extra_t *report); +#ifdef RAW_ENABLE +static void send_raw_hid(uint8_t *data, uint8_t length); +#endif + +host_driver_t lufa_driver = { + .keyboard_leds = usb_device_state_get_leds, + .send_keyboard = send_keyboard, + .send_nkro = send_nkro, + .send_mouse = send_mouse, + .send_extra = send_extra, +#ifdef RAW_ENABLE + .send_raw_hid = send_raw_hid, +#endif +}; void send_report(uint8_t endpoint, void *report, size_t size) { uint8_t timeout = 255; @@ -131,21 +144,11 @@ USB_ClassInfo_CDC_Device_t cdc_device = { * * FIXME: Needs doc */ -void raw_hid_send(uint8_t *data, uint8_t length) { +static void send_raw_hid(uint8_t *data, uint8_t length) { if (length != RAW_EPSIZE) return; send_report(RAW_IN_EPNUM, data, RAW_EPSIZE); } -/** \brief Raw HID Receive - * - * FIXME: Needs doc - */ -__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { - // Users should #include "raw_hid.h" in their own code - // and implement this function there. Leave this as weak linkage - // so users can opt to not handle data coming in. -} - /** \brief Raw HID Task * * FIXME: Needs doc diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 56cf82e5a6..43cce6eb2f 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -144,7 +144,7 @@ static void send_report(uint8_t endpoint, void *report, size_t size) { static uint8_t raw_output_buffer[RAW_BUFFER_SIZE]; static uint8_t raw_output_received_bytes = 0; -void raw_hid_send(uint8_t *data, uint8_t length) { +static void send_raw_hid(uint8_t *data, uint8_t length) { if (length != RAW_BUFFER_SIZE) { return; } @@ -152,12 +152,6 @@ void raw_hid_send(uint8_t *data, uint8_t length) { send_report(4, data, 32); } -__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { - // Users should #include "raw_hid.h" in their own code - // and implement this function there. Leave this as weak linkage - // so users can opt to not handle data coming in. -} - void raw_hid_task(void) { usbPoll(); @@ -213,8 +207,20 @@ static void send_keyboard(report_keyboard_t *report); static void send_nkro(report_nkro_t *report); static void send_mouse(report_mouse_t *report); static void send_extra(report_extra_t *report); +#ifdef RAW_ENABLE +static void send_raw_hid(uint8_t *data, uint8_t length); +#endif -static host_driver_t driver = {.keyboard_leds = usb_device_state_get_leds, .send_keyboard = send_keyboard, .send_nkro = send_nkro, .send_mouse = send_mouse, .send_extra = send_extra}; +static host_driver_t driver = { + .keyboard_leds = usb_device_state_get_leds, + .send_keyboard = send_keyboard, + .send_nkro = send_nkro, + .send_mouse = send_mouse, + .send_extra = send_extra, +#ifdef RAW_ENABLE + .send_raw_hid = send_raw_hid, +#endif +}; host_driver_t *vusb_driver(void) { return &driver; From 3e7ce54902aeff14cf9242d0d5a73d9d655a9de7 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 11 May 2025 23:39:38 +0100 Subject: [PATCH 367/592] Fix Wear Leveling compilation (#25254) --- builddefs/common_features.mk | 8 -------- drivers/wear_leveling/wear_leveling_flash_spi.c | 1 + .../drivers/wear_leveling/wear_leveling_efl.c | 1 + .../drivers/wear_leveling/wear_leveling_legacy.c | 1 + .../wear_leveling/wear_leveling_rp2040_flash.c | 1 + platforms/eeprom.h | 1 + quantum/wear_leveling/wear_leveling.c | 1 + quantum/wear_leveling/wear_leveling_drivers.h | 13 +++++++++++++ 8 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 quantum/wear_leveling/wear_leveling_drivers.h diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 3d01be8205..48a976d663 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -267,22 +267,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none) ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash) OPT_DEFS += -DHAL_USE_EFL SRC += wear_leveling_efl.c - $(INTERMEDIATE_OUTPUT)/wear_leveling_efl.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_efl_config.h - $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_efl_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash) FLASH_DRIVER := spi SRC += wear_leveling_flash_spi.c - $(INTERMEDIATE_OUTPUT)/wear_leveling_flash_spi.o: FILE_SPECIFIC_CFLAGS += -include $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h - $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash) SRC += wear_leveling_rp2040_flash.c - $(INTERMEDIATE_OUTPUT)/wear_leveling_rp2040_flash.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h - $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy) COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash SRC += legacy_flash_ops.c wear_leveling_legacy.c - $(INTERMEDIATE_OUTPUT)/wear_leveling_legacy.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_legacy_config.h - $(INTERMEDIATE_OUTPUT)/wear_leveling.o: FILE_SPECIFIC_CFLAGS += -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_legacy_config.h endif endif endif diff --git a/drivers/wear_leveling/wear_leveling_flash_spi.c b/drivers/wear_leveling/wear_leveling_flash_spi.c index 304aed1641..ca2c174580 100644 --- a/drivers/wear_leveling/wear_leveling_flash_spi.c +++ b/drivers/wear_leveling/wear_leveling_flash_spi.c @@ -5,6 +5,7 @@ #include "util.h" #include "timer.h" #include "wear_leveling.h" +#include "wear_leveling_flash_spi_config.h" #include "wear_leveling_internal.h" #ifndef WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT diff --git a/platforms/chibios/drivers/wear_leveling/wear_leveling_efl.c b/platforms/chibios/drivers/wear_leveling/wear_leveling_efl.c index fed16d20b1..fec4646a5b 100644 --- a/platforms/chibios/drivers/wear_leveling/wear_leveling_efl.c +++ b/platforms/chibios/drivers/wear_leveling/wear_leveling_efl.c @@ -4,6 +4,7 @@ #include #include "timer.h" #include "wear_leveling.h" +#include "wear_leveling_efl_config.h" #include "wear_leveling_internal.h" static flash_offset_t base_offset = UINT32_MAX; diff --git a/platforms/chibios/drivers/wear_leveling/wear_leveling_legacy.c b/platforms/chibios/drivers/wear_leveling/wear_leveling_legacy.c index 7c6fd2d808..3d2af625ca 100644 --- a/platforms/chibios/drivers/wear_leveling/wear_leveling_legacy.c +++ b/platforms/chibios/drivers/wear_leveling/wear_leveling_legacy.c @@ -4,6 +4,7 @@ #include #include "timer.h" #include "wear_leveling.h" +#include "wear_leveling_legacy_config.h" #include "wear_leveling_internal.h" #include "legacy_flash_ops.h" diff --git a/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c b/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c index 6624c30b5b..9bfc68f9d2 100644 --- a/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c +++ b/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c @@ -15,6 +15,7 @@ #include #include "timer.h" #include "wear_leveling.h" +#include "wear_leveling_rp2040_flash_config.h" #include "wear_leveling_internal.h" #ifndef WEAR_LEVELING_RP2040_FLASH_BULK_COUNT diff --git a/platforms/eeprom.h b/platforms/eeprom.h index 067fa01616..557bfb030c 100644 --- a/platforms/eeprom.h +++ b/platforms/eeprom.h @@ -37,6 +37,7 @@ void eeprom_update_block(const void *__src, void *__dst, size_t __n); # endif # define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE) #elif defined(EEPROM_WEAR_LEVELING) +# include "wear_leveling_drivers.h" # define TOTAL_EEPROM_BYTE_COUNT (WEAR_LEVELING_LOGICAL_SIZE) #elif defined(EEPROM_TRANSIENT) # include "eeprom_transient.h" diff --git a/quantum/wear_leveling/wear_leveling.c b/quantum/wear_leveling/wear_leveling.c index 429df45df5..258f074a5c 100644 --- a/quantum/wear_leveling/wear_leveling.c +++ b/quantum/wear_leveling/wear_leveling.c @@ -3,6 +3,7 @@ #include #include "fnv.h" #include "wear_leveling.h" +#include "wear_leveling_drivers.h" #include "wear_leveling_internal.h" /* diff --git a/quantum/wear_leveling/wear_leveling_drivers.h b/quantum/wear_leveling/wear_leveling_drivers.h new file mode 100644 index 0000000000..e81f833fd1 --- /dev/null +++ b/quantum/wear_leveling/wear_leveling_drivers.h @@ -0,0 +1,13 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#if defined(WEAR_LEVELING_EMBEDDED_FLASH) +# include "wear_leveling/wear_leveling_efl_config.h" +#elif defined(WEAR_LEVELING_SPI_FLASH) +# include "wear_leveling/wear_leveling_flash_spi_config.h" +#elif defined(WEAR_LEVELING_RP2040_FLASH) +# include "wear_leveling/wear_leveling_rp2040_flash_config.h" +#elif defined(WEAR_LEVELING_LEGACY) +# include "wear_leveling/wear_leveling_legacy_config.h" +#endif From 7f42a5bc03a3f80d65314c69adb0b1176cf13167 Mon Sep 17 00:00:00 2001 From: art-was-here Date: Sun, 11 May 2025 15:50:36 -0700 Subject: [PATCH 368/592] [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" (#25203) --- docs/features/rgb_matrix.md | 2 ++ .../animations/rgb_matrix_effects.inc | 1 + .../animations/starlight_smooth_anim.h | 26 +++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 quantum/rgb_matrix/animations/starlight_smooth_anim.h diff --git a/docs/features/rgb_matrix.md b/docs/features/rgb_matrix.md index a22f931f1b..ca50fc5257 100644 --- a/docs/features/rgb_matrix.md +++ b/docs/features/rgb_matrix.md @@ -150,6 +150,7 @@ enum rgb_matrix_effects { RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color + RGB_MATRIX_STARLIGHT_SMOOTH, // LEDs slowly increase and decrease in brightness randomly RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30 RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30 RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing @@ -193,6 +194,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi |`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` | |`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` | |`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` | +|`#define ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH` |Enables `RGB_MATRIX_STARLIGHT_SMOOTH` | |`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` | |`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` | |`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` | diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc index e8b7a2bcde..abc2adf2cc 100644 --- a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc +++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc @@ -39,6 +39,7 @@ #include "solid_reactive_nexus.h" #include "splash_anim.h" #include "solid_splash_anim.h" +#include "starlight_smooth_anim.h" #include "starlight_anim.h" #include "starlight_dual_sat_anim.h" #include "starlight_dual_hue_anim.h" diff --git a/quantum/rgb_matrix/animations/starlight_smooth_anim.h b/quantum/rgb_matrix/animations/starlight_smooth_anim.h new file mode 100644 index 0000000000..a87c06f9df --- /dev/null +++ b/quantum/rgb_matrix/animations/starlight_smooth_anim.h @@ -0,0 +1,26 @@ +// Copyright 2022 @art-was-here +// SPDX-License-Identifier: GPL-2.0+ + +#ifdef ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH +RGB_MATRIX_EFFECT(STARLIGHT_SMOOTH) +# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +static uint8_t phase_offsets[RGB_MATRIX_LED_COUNT]; + +hsv_t STARLIGHT_SMOOTH_math(hsv_t hsv, uint8_t i, uint8_t time) { + if (phase_offsets[i] == 0) { + phase_offsets[i] = rand() % 255; + } + hsv.v = scale8(abs8(sin8((time + phase_offsets[i]) / 2) - 128) * 2, hsv.v); + return hsv; +} + +bool STARLIGHT_SMOOTH(effect_params_t* params) { + if (params->init) { + memset(phase_offsets, 0, sizeof(phase_offsets)); + } + return effect_runner_i(params, &STARLIGHT_SMOOTH_math); +} + +# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS +#endif // ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH From f4171412a676ae3cbd1cd50e859a7deb1a554e15 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Sun, 11 May 2025 16:30:19 -0700 Subject: [PATCH 369/592] Enable community modules to define LED matrix and RGB matrix effects. (#25187) Co-authored-by: Joel Challis --- builddefs/build_keyboard.mk | 13 +++- data/constants/module_hooks/1.1.1.hjson | 3 + docs/features/community_modules.md | 8 ++ keyboards/handwired/onekey/info.json | 12 +++ .../cm_flow_led_matrix_effect/config.h | 16 ++++ .../cm_flow_led_matrix_effect/keymap.c | 27 +++++++ .../cm_flow_led_matrix_effect/keymap.json | 3 + .../cm_flow_rgb_matrix_effect/config.h | 16 ++++ .../cm_flow_rgb_matrix_effect/keymap.c | 27 +++++++ .../cm_flow_rgb_matrix_effect/keymap.json | 3 + .../qmk/cli/generate/community_modules.py | 75 ++++++++++--------- .../led_matrix_module.inc | 58 ++++++++++++++ .../flow_led_matrix_effect/qmk_module.json | 8 ++ .../flow_rgb_matrix_effect/qmk_module.json | 8 ++ .../rgb_matrix_module.inc | 64 ++++++++++++++++ quantum/led_matrix/led_matrix.c | 12 +++ quantum/led_matrix/led_matrix.h | 6 ++ quantum/rgb_matrix/rgb_matrix.c | 12 +++ quantum/rgb_matrix/rgb_matrix.h | 6 ++ 19 files changed, 339 insertions(+), 38 deletions(-) create mode 100644 data/constants/module_hooks/1.1.1.hjson create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/config.h create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.json create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/config.h create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.json create mode 100644 modules/qmk/flow_led_matrix_effect/led_matrix_module.inc create mode 100644 modules/qmk/flow_led_matrix_effect/qmk_module.json create mode 100644 modules/qmk/flow_rgb_matrix_effect/qmk_module.json create mode 100644 modules/qmk/flow_rgb_matrix_effect/rgb_matrix_module.inc diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index 514191b17d..c2c47c00fb 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -274,10 +274,19 @@ $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(D $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON)) @$(BUILD_CMD) +$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON)) + @$(BUILD_CMD) + +$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES) + @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) + $(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON)) + @$(BUILD_CMD) + SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c -generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h - +generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc include $(BUILDDEFS_PATH)/converters.mk diff --git a/data/constants/module_hooks/1.1.1.hjson b/data/constants/module_hooks/1.1.1.hjson new file mode 100644 index 0000000000..49f5d0d5d0 --- /dev/null +++ b/data/constants/module_hooks/1.1.1.hjson @@ -0,0 +1,3 @@ +{ + // This version exists to signify addition of LED/RGB effect support. +} diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md index 8dede47bd4..eff07c939a 100644 --- a/docs/features/community_modules.md +++ b/docs/features/community_modules.md @@ -123,6 +123,14 @@ The source file may provide functions which allow access to information specifie Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk). ::: +### `led_matrix_module.inc` + +This file defines LED matrix effects in the same form as used with `led_matrix_kb.inc` and `led_matrix_user.inc` (see [Custom LED Matrix Effects](led_matrix#custom-led-matrix-effects)). Effect mode names are prepended with `LED_MATRIX_COMMUNITY_MODULE_`. + +### `rgb_matrix_module.inc` + +This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`. + ### Compatible APIs Community Modules may provide specializations for the following APIs: diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json index 7b6b7ddab8..d5f650f1bd 100644 --- a/keyboards/handwired/onekey/info.json +++ b/keyboards/handwired/onekey/info.json @@ -26,5 +26,17 @@ {"x": 0, "y": 0, "matrix": [0, 0]} ] } + }, + "led_matrix": { + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1} + ] + }, + "rgb_matrix": { + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1} + ] } } diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/config.h b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/config.h new file mode 100644 index 0000000000..aed1e4ac6f --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/config.h @@ -0,0 +1,16 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.c b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.c new file mode 100644 index 0000000000..0bd835ff25 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// This keymap serves as a test for modules/qmk/flow_led_matrix_effect. + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {LAYOUT_ortho_1x1(LM_TOGG)}; + +const snled27351_led_t PROGMEM g_snled27351_leds[LED_MATRIX_LED_COUNT] = { + {0, CB6_CA1}, +}; + +void keyboard_post_init_user(void) { + led_matrix_mode_noeeprom(LED_MATRIX_COMMUNITY_MODULE_FLOW); +} diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.json b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.json new file mode 100644 index 0000000000..0ff6bf5a4d --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_led_matrix_effect/keymap.json @@ -0,0 +1,3 @@ +{ + "modules": ["qmk/flow_led_matrix_effect"] +} diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/config.h b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/config.h new file mode 100644 index 0000000000..aed1e4ac6f --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/config.h @@ -0,0 +1,16 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#pragma once + +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.c b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.c new file mode 100644 index 0000000000..72ef2d3f80 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// This keymap serves as a test for modules/qmk/flow_rgb_matrix_effect. + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {LAYOUT_ortho_1x1(RM_TOGG)}; + +const snled27351_led_t PROGMEM g_snled27351_leds[LED_MATRIX_LED_COUNT] = { + {0, CB6_CA1}, +}; + +void keyboard_post_init_user(void) { + rgb_matrix_mode_noeeprom(RGB_MATRIX_COMMUNITY_MODULE_FLOW); +} diff --git a/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.json b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.json new file mode 100644 index 0000000000..56d2342867 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/cm_flow_rgb_matrix_effect/keymap.json @@ -0,0 +1,3 @@ +{ + "modules": ["qmk/flow_rgb_matrix_effect"] +} diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py index 61e24077d3..1f37b760ca 100644 --- a/lib/python/qmk/cli/generate/community_modules.py +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -278,33 +278,32 @@ def generate_community_modules_c(cli): dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) +def _generate_include_per_module(cli, include_file_name): + """Generates C code to include "/include_file_name" for each module.""" + if cli.args.output and cli.args.output.name == '-': + cli.args.output = None + + lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE] + + for module in get_modules(cli.args.keyboard, cli.args.filename): + full_path = f'{find_module_path(module)}/{include_file_name}' + lines.append('') + lines.append(f'#if __has_include("{full_path}")') + lines.append(f'#include "{full_path}"') + lines.append(f'#endif // __has_include("{full_path}")') + + dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + + @cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') @cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") -@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules.c for.') +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate community_modules_introspection.h for.') @cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') @cli.subcommand('Creates a community_modules_introspection.h from a keymap.json file.') def generate_community_modules_introspection_h(cli): """Creates a community_modules_introspection.h from a keymap.json file """ - if cli.args.output and cli.args.output.name == '-': - cli.args.output = None - - lines = [ - GPL2_HEADER_C_LIKE, - GENERATED_HEADER_C_LIKE, - '', - ] - - modules = get_modules(cli.args.keyboard, cli.args.filename) - if len(modules) > 0: - for module in modules: - module_path = find_module_path(module) - lines.append(f'#if __has_include("{module_path}/introspection.h")') - lines.append(f'#include "{module_path}/introspection.h"') - lines.append(f'#endif // __has_include("{module_path}/introspection.h")') - lines.append('') - - dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + _generate_include_per_module(cli, 'introspection.h') @cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') @@ -315,22 +314,26 @@ def generate_community_modules_introspection_h(cli): def generate_community_modules_introspection_c(cli): """Creates a community_modules_introspection.c from a keymap.json file """ - if cli.args.output and cli.args.output.name == '-': - cli.args.output = None + _generate_include_per_module(cli, 'introspection.c') - lines = [ - GPL2_HEADER_C_LIKE, - GENERATED_HEADER_C_LIKE, - '', - ] - modules = get_modules(cli.args.keyboard, cli.args.filename) - if len(modules) > 0: - for module in modules: - module_path = find_module_path(module) - lines.append(f'#if __has_include("{module_path}/introspection.c")') - lines.append(f'#include "{module_path}/introspection.c"') - lines.append(f'#endif // __has_include("{module_path}/introspection.c")') - lines.append('') +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate led_matrix_community_modules.inc for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates an led_matrix_community_modules.inc from a keymap.json file.') +def generate_led_matrix_community_modules_inc(cli): + """Creates an led_matrix_community_modules.inc from a keymap.json file + """ + _generate_include_per_module(cli, 'led_matrix_module.inc') - dump_lines(cli.args.output, lines, cli.args.quiet, remove_repeated_newlines=True) + +@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to') +@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") +@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate rgb_matrix_community_modules.inc for.') +@cli.argument('filename', nargs='?', type=qmk.path.FileType('r'), arg_only=True, completer=FilesCompleter('.json'), help='Configurator JSON file') +@cli.subcommand('Creates an rgb_matrix_community_modules.inc from a keymap.json file.') +def generate_rgb_matrix_community_modules_inc(cli): + """Creates an rgb_matrix_community_modules.inc from a keymap.json file + """ + _generate_include_per_module(cli, 'rgb_matrix_module.inc') diff --git a/modules/qmk/flow_led_matrix_effect/led_matrix_module.inc b/modules/qmk/flow_led_matrix_effect/led_matrix_module.inc new file mode 100644 index 0000000000..734e0f3494 --- /dev/null +++ b/modules/qmk/flow_led_matrix_effect/led_matrix_module.inc @@ -0,0 +1,58 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +LED_MATRIX_EFFECT(FLOW) + +#ifdef LED_MATRIX_CUSTOM_EFFECT_IMPLS + +// "Flow" animated effect. Draws moving wave patterns mimicking the appearance +// of flowing liquid. For interesting variety of patterns, space coordinates are +// slowly rotated and a function of several sine waves is evaluated. +static bool FLOW(effect_params_t* params) { + LED_MATRIX_USE_LIMITS(led_min, led_max); + + static uint16_t wrap_correction = 0; + static uint8_t last_high_byte = 0; + const uint8_t time_scale = 1 + led_matrix_eeconfig.speed / 8; + const uint8_t high_byte = (uint8_t)(g_led_timer >> 16); + if (last_high_byte != high_byte) { + last_high_byte = high_byte; + wrap_correction += ((uint16_t)time_scale) << 8; + } + const uint16_t time = scale16by8(g_led_timer, time_scale) + wrap_correction; + + // Compute rotation coefficients with 7 fractional bits. + const int8_t rot_c = cos8(time / 4) - 128; + const int8_t rot_s = sin8(time / 4) - 128; + const uint8_t omega = 32 + sin8(time) / 4; + + for (uint8_t i = led_min; i < led_max; ++i) { + LED_MATRIX_TEST_LED_FLAGS(); + const uint8_t x = g_led_config.point[i].x; + const uint8_t y = g_led_config.point[i].y; + + // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s. + const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) - (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128); + const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) + (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128); + + uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4; + value = (value <= 127) ? value : (255 - value); + + led_matrix_set_value(i, scale8(led_matrix_eeconfig.val, value)); + } + + return led_matrix_check_finished_leds(led_max); +} + +#endif // LED_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/modules/qmk/flow_led_matrix_effect/qmk_module.json b/modules/qmk/flow_led_matrix_effect/qmk_module.json new file mode 100644 index 0000000000..2d047cd0d0 --- /dev/null +++ b/modules/qmk/flow_led_matrix_effect/qmk_module.json @@ -0,0 +1,8 @@ +{ + "module_name": "Flow LED matrix effect", + "maintainer": "QMK Maintainers", + "license": "Apache-2.0", + "features": { + "led_matrix": true + } +} diff --git a/modules/qmk/flow_rgb_matrix_effect/qmk_module.json b/modules/qmk/flow_rgb_matrix_effect/qmk_module.json new file mode 100644 index 0000000000..3e42fe1ef4 --- /dev/null +++ b/modules/qmk/flow_rgb_matrix_effect/qmk_module.json @@ -0,0 +1,8 @@ +{ + "module_name": "Flow RGB matrix effect", + "maintainer": "QMK Maintainers", + "license": "Apache-2.0", + "features": { + "rgb_matrix": true + } +} diff --git a/modules/qmk/flow_rgb_matrix_effect/rgb_matrix_module.inc b/modules/qmk/flow_rgb_matrix_effect/rgb_matrix_module.inc new file mode 100644 index 0000000000..410838f7ec --- /dev/null +++ b/modules/qmk/flow_rgb_matrix_effect/rgb_matrix_module.inc @@ -0,0 +1,64 @@ +// Copyright 2024-2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +RGB_MATRIX_EFFECT(FLOW) + +#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +// "Flow" animated effect. Draws moving wave patterns mimicking the appearance +// of flowing liquid. For interesting variety of patterns, space coordinates are +// slowly rotated and a function of several sine waves is evaluated. +static bool FLOW(effect_params_t* params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + + static uint16_t wrap_correction = 0; + static uint8_t last_high_byte = 0; + const uint8_t time_scale = 1 + rgb_matrix_config.speed / 8; + const uint8_t high_byte = (uint8_t)(g_rgb_timer >> 16); + if (last_high_byte != high_byte) { + last_high_byte = high_byte; + wrap_correction += ((uint16_t)time_scale) << 8; + } + const uint16_t time = scale16by8(g_rgb_timer, time_scale) + wrap_correction; + + // Compute rotation coefficients with 7 fractional bits. + const int8_t rot_c = cos8(time / 4) - 128; + const int8_t rot_s = sin8(time / 4) - 128; + const uint8_t omega = 32 + sin8(time) / 4; + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const uint8_t x = g_led_config.point[i].x; + const uint8_t y = g_led_config.point[i].y; + + // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s. + const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) - (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128); + const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) + (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128); + + uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4; + value = (value <= 127) ? value : (255 - value); + + hsv_t hsv = rgb_matrix_config.hsv; + hsv.h -= value / 4; + hsv.s = scale8(hsv.s, (value < 74) ? 255 : (549 - 4 * value)); + hsv.v = scale8(hsv.v, (value < 95) ? (64 + 2 * value) : 255); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} + +#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index 00bc199ecf..7a0e8a5ebb 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -45,6 +45,9 @@ const led_point_t k_led_matrix_center = LED_MATRIX_CENTER; #define LED_MATRIX_CUSTOM_EFFECT_IMPLS #include "led_matrix_effects.inc" +#ifdef COMMUNITY_MODULES_ENABLE +# include "led_matrix_community_modules.inc" +#endif #ifdef LED_MATRIX_CUSTOM_KB # include "led_matrix_kb.inc" #endif @@ -282,6 +285,15 @@ static void led_task_render(uint8_t effect) { #include "led_matrix_effects.inc" #undef LED_MATRIX_EFFECT +#ifdef COMMUNITY_MODULES_ENABLE +# define LED_MATRIX_EFFECT(name, ...) \ + case LED_MATRIX_COMMUNITY_MODULE_##name: \ + rendering = name(&led_effect_params); \ + break; +# include "led_matrix_community_modules.inc" +# undef LED_MATRIX_EFFECT +#endif + #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) # define LED_MATRIX_EFFECT(name, ...) \ case LED_MATRIX_CUSTOM_##name: \ diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h index 0006d487e9..0dfe33ffab 100644 --- a/quantum/led_matrix/led_matrix.h +++ b/quantum/led_matrix/led_matrix.h @@ -98,6 +98,12 @@ enum led_matrix_effects { #include "led_matrix_effects.inc" #undef LED_MATRIX_EFFECT +#ifdef COMMUNITY_MODULES_ENABLE +# define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_COMMUNITY_MODULE_##name, +# include "led_matrix_community_modules.inc" +# undef LED_MATRIX_EFFECT +#endif + #if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) # define LED_MATRIX_EFFECT(name, ...) LED_MATRIX_CUSTOM_##name, # ifdef LED_MATRIX_CUSTOM_KB diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 94852e3520..2679c48342 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -47,6 +47,9 @@ __attribute__((weak)) rgb_t rgb_matrix_hsv_to_rgb(hsv_t hsv) { #define RGB_MATRIX_CUSTOM_EFFECT_IMPLS #include "rgb_matrix_effects.inc" +#ifdef COMMUNITY_MODULES_ENABLE +# include "rgb_matrix_community_modules.inc" +#endif #ifdef RGB_MATRIX_CUSTOM_KB # include "rgb_matrix_kb.inc" #endif @@ -310,6 +313,15 @@ static void rgb_task_render(uint8_t effect) { #include "rgb_matrix_effects.inc" #undef RGB_MATRIX_EFFECT +#ifdef COMMUNITY_MODULES_ENABLE +# define RGB_MATRIX_EFFECT(name, ...) \ + case RGB_MATRIX_COMMUNITY_MODULE_##name: \ + rendering = name(&rgb_effect_params); \ + break; +# include "rgb_matrix_community_modules.inc" +# undef RGB_MATRIX_EFFECT +#endif + #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) # define RGB_MATRIX_EFFECT(name, ...) \ case RGB_MATRIX_CUSTOM_##name: \ diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h index e00e3927c7..c6b302631e 100644 --- a/quantum/rgb_matrix/rgb_matrix.h +++ b/quantum/rgb_matrix/rgb_matrix.h @@ -123,6 +123,12 @@ enum rgb_matrix_effects { #include "rgb_matrix_effects.inc" #undef RGB_MATRIX_EFFECT +#ifdef COMMUNITY_MODULES_ENABLE +# define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_COMMUNITY_MODULE_##name, +# include "rgb_matrix_community_modules.inc" +# undef RGB_MATRIX_EFFECT +#endif + #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) # define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_CUSTOM_##name, # ifdef RGB_MATRIX_CUSTOM_KB From 070dea4a9cfa7f154a99a57212929dfc4f492268 Mon Sep 17 00:00:00 2001 From: Matti Hiljanen <170205+qvr@users.noreply.github.com> Date: Mon, 12 May 2025 05:15:40 +0300 Subject: [PATCH 370/592] Fix OS_DETECTION_KEYBOARD_RESET (#25015) Co-authored-by: Nick Brassel --- quantum/os_detection.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/quantum/os_detection.c b/quantum/os_detection.c index 9a9f9052f2..552375f61c 100644 --- a/quantum/os_detection.c +++ b/quantum/os_detection.c @@ -68,6 +68,15 @@ static volatile bool first_report = true; static volatile struct usb_device_state current_usb_device_state = {.configure_state = USB_DEVICE_STATE_NO_INIT}; static volatile struct usb_device_state maxprev_usb_device_state = {.configure_state = USB_DEVICE_STATE_NO_INIT}; +// to reset the keyboard on USB state change +#ifdef OS_DETECTION_KEYBOARD_RESET +# ifndef OS_DETECTION_RESET_DEBOUNCE +# define OS_DETECTION_RESET_DEBOUNCE OS_DETECTION_DEBOUNCE +# endif +static volatile fast_timer_t configured_since = 0; +static volatile bool reset_pending = false; +#endif + // the OS detection might be unstable for a while, "debounce" it static volatile bool debouncing = false; static volatile fast_timer_t last_time = 0; @@ -77,7 +86,10 @@ bool process_detected_host_os_modules(os_variant_t os); void os_detection_task(void) { #ifdef OS_DETECTION_KEYBOARD_RESET // resetting the keyboard on the USB device state change callback results in instability, so delegate that to this task - // only take action if it's been stable at least once, to avoid issues with some KVMs + if (reset_pending) { + soft_reset_keyboard(); + } + // reset the keyboard if it is stuck in the init state for longer than debounce duration, which can happen with some KVMs if (current_usb_device_state.configure_state <= USB_DEVICE_STATE_INIT && maxprev_usb_device_state.configure_state >= USB_DEVICE_STATE_CONFIGURED) { if (debouncing && timer_elapsed_fast(last_time) >= OS_DETECTION_DEBOUNCE) { soft_reset_keyboard(); @@ -187,6 +199,18 @@ void os_detection_notify_usb_device_state_change(struct usb_device_state usb_dev current_usb_device_state = usb_device_state; last_time = timer_read_fast(); debouncing = true; + +#ifdef OS_DETECTION_KEYBOARD_RESET + if (configured_since == 0 && current_usb_device_state.configure_state == USB_DEVICE_STATE_CONFIGURED) { + configured_since = timer_read_fast(); + } else if (current_usb_device_state.configure_state == USB_DEVICE_STATE_INIT) { + // reset the keyboard only if it's been stable for at least debounce duration, to avoid issues with some KVMs + if (configured_since > 0 && timer_elapsed_fast(configured_since) >= OS_DETECTION_RESET_DEBOUNCE) { + reset_pending = true; + } + configured_since = 0; + } +#endif } #if defined(SPLIT_KEYBOARD) && defined(SPLIT_DETECTED_OS_ENABLE) From e0b037c2cd532c84244546fdec57c43b567f2832 Mon Sep 17 00:00:00 2001 From: Wasteland Fluttershy Date: Wed, 14 May 2025 06:23:16 +0300 Subject: [PATCH 371/592] Fixes the numlock indicator for Magic Force MF17 numpad (#25260) --- keyboards/magic_force/mf17/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/magic_force/mf17/keyboard.json b/keyboards/magic_force/mf17/keyboard.json index 705318e71e..10469f63c6 100644 --- a/keyboards/magic_force/mf17/keyboard.json +++ b/keyboards/magic_force/mf17/keyboard.json @@ -96,7 +96,7 @@ "sleep": true }, "indicators": { - "caps_lock": "B15", + "num_lock": "B15", "on_state": 0 }, "community_layouts": ["numpad_5x4"], From 59c361259070ac3f5141b8ca9cb43f5b3315143b Mon Sep 17 00:00:00 2001 From: Dane Lipscombe Date: Wed, 14 May 2025 20:12:59 +1000 Subject: [PATCH 372/592] Add Harite v2 keyboard (#24975) --- keyboards/dlip/haritev2/config.h | 20 ++++ keyboards/dlip/haritev2/dual_cirque/config.h | 11 +++ .../dual_cirque/keymaps/default/keymap.c | 19 ++++ keyboards/dlip/haritev2/dual_cirque/readme.md | 39 ++++++++ keyboards/dlip/haritev2/dual_cirque/rules.mk | 3 + keyboards/dlip/haritev2/halconf.h | 10 ++ keyboards/dlip/haritev2/info.json | 98 +++++++++++++++++++ keyboards/dlip/haritev2/mcuconf.h | 7 ++ .../dlip/haritev2/thumbstick_pmw3389/config.h | 9 ++ .../haritev2/thumbstick_pmw3389/keyboard.json | 23 +++++ .../keymaps/default/keymap.c | 19 ++++ .../haritev2/thumbstick_pmw3389/readme.md | 39 ++++++++ .../dlip/haritev2/thumbstick_pmw3389/rules.mk | 3 + 13 files changed, 300 insertions(+) create mode 100644 keyboards/dlip/haritev2/config.h create mode 100644 keyboards/dlip/haritev2/dual_cirque/config.h create mode 100644 keyboards/dlip/haritev2/dual_cirque/keymaps/default/keymap.c create mode 100644 keyboards/dlip/haritev2/dual_cirque/readme.md create mode 100644 keyboards/dlip/haritev2/dual_cirque/rules.mk create mode 100644 keyboards/dlip/haritev2/halconf.h create mode 100644 keyboards/dlip/haritev2/info.json create mode 100644 keyboards/dlip/haritev2/mcuconf.h create mode 100644 keyboards/dlip/haritev2/thumbstick_pmw3389/config.h create mode 100644 keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json create mode 100644 keyboards/dlip/haritev2/thumbstick_pmw3389/keymaps/default/keymap.c create mode 100644 keyboards/dlip/haritev2/thumbstick_pmw3389/readme.md create mode 100644 keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk diff --git a/keyboards/dlip/haritev2/config.h b/keyboards/dlip/haritev2/config.h new file mode 100644 index 0000000000..119ba7cbac --- /dev/null +++ b/keyboards/dlip/haritev2/config.h @@ -0,0 +1,20 @@ +// Copyright 2024 Dane Lipscombe (@dlip) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1500U + +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP1 +#define SERIAL_USART_RX_PIN GP0 +#define SERIAL_USART_PIN_SWAP + +#define EE_HANDS + +#define SPI_DRIVER SPID0 +#define SPI_SCK_PIN GP2 +#define SPI_MOSI_PIN GP3 +#define SPI_MISO_PIN GP4 +#define POINTING_DEVICE_CS_PIN GP5 diff --git a/keyboards/dlip/haritev2/dual_cirque/config.h b/keyboards/dlip/haritev2/dual_cirque/config.h new file mode 100644 index 0000000000..ad92aaa9ad --- /dev/null +++ b/keyboards/dlip/haritev2/dual_cirque/config.h @@ -0,0 +1,11 @@ +// Copyright 2024 Dane Lipscombe (@dlip) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_COMBINED +#define POINTING_DEVICE_ROTATION_90 +#define POINTING_DEVICE_ROTATION_90_RIGHT +#define CIRQUE_PINNACLE_POSITION_MODE CIRQUE_PINNACLE_ABSOLUTE_MODE +#define POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE diff --git a/keyboards/dlip/haritev2/dual_cirque/keymaps/default/keymap.c b/keyboards/dlip/haritev2/dual_cirque/keymaps/default/keymap.c new file mode 100644 index 0000000000..3e23d4b088 --- /dev/null +++ b/keyboards/dlip/haritev2/dual_cirque/keymaps/default/keymap.c @@ -0,0 +1,19 @@ +// 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_split_5x6( + KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, + + KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D, + + KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D + ) +}; diff --git a/keyboards/dlip/haritev2/dual_cirque/readme.md b/keyboards/dlip/haritev2/dual_cirque/readme.md new file mode 100644 index 0000000000..17c540b1c9 --- /dev/null +++ b/keyboards/dlip/haritev2/dual_cirque/readme.md @@ -0,0 +1,39 @@ +# Harite v2 (Cirque trackpad version) + +5 way switch directional keyboard + +![Harite-v2](https://i.imgur.com/v8kUtL3.jpeg) + +* Keyboard Maintainer: [Dane Lipscombe](https://github.com/dlip) +* Hardware Supported: Harite v2 (Cirque trackpad version) +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + +```bash +make dlip/haritev2/dual_cirque:default +``` + +Flashing example for this keyboard: + +```bash +# For the left half... +make dlip/haritev2/dual_cirque:default:uf2-split-left +# or the qmk cli equivalent: +qmk flash -kb dlip/haritev2/dual_cirque --keymap default -bl uf2-split-left + +# For the right half... +make dlip/haritev2/dual_cirque:default:uf2-split-right +# or the qmk cli equivalent: +qmk flash -kb dlip/haritev2/dual_cirque --keymap default -bl uf2-split-right +``` + +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/dlip/haritev2/dual_cirque/rules.mk b/keyboards/dlip/haritev2/dual_cirque/rules.mk new file mode 100644 index 0000000000..01e5b00480 --- /dev/null +++ b/keyboards/dlip/haritev2/dual_cirque/rules.mk @@ -0,0 +1,3 @@ +POINTING_DEVICE_ENABLE = yes +POINTING_DEVICE_DRIVER = cirque_pinnacle_spi + diff --git a/keyboards/dlip/haritev2/halconf.h b/keyboards/dlip/haritev2/halconf.h new file mode 100644 index 0000000000..895fcc3c8c --- /dev/null +++ b/keyboards/dlip/haritev2/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2023 Dane Lipscombe (@dlip) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define HAL_USE_SPI TRUE +#define SPI_USE_WAIT TRUE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + +#include_next + diff --git a/keyboards/dlip/haritev2/info.json b/keyboards/dlip/haritev2/info.json new file mode 100644 index 0000000000..df7b9035e5 --- /dev/null +++ b/keyboards/dlip/haritev2/info.json @@ -0,0 +1,98 @@ +{ + "manufacturer": "Dane Lipscombe", + "keyboard_name": "haritev2", + "maintainer": "dlip", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP11", "GP12", "GP13", "GP14", "GP15", "GP26"], + "rows": ["GP6", "GP7", "GP8", "GP9", "GP10"] + }, + "processor": "RP2040", + "split": { + "enabled": true, + "serial": { + "driver": "vendor" + } + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x4832", + "vid": "0x444C" + }, + "layouts": { + "LAYOUT_split_5x6": { + "layout": [ + {"label": "lpu", "matrix": [0, 0], "x": 1, "y": 0}, + {"label": "lru", "matrix": [0, 1], "x": 5, "y": 0}, + {"label": "lmu", "matrix": [0, 2], "x": 9, "y": 0}, + {"label": "liu", "matrix": [0, 3], "x": 13, "y": 0}, + {"label": "riu", "matrix": [8, 3], "x": 21, "y": 0}, + {"label": "rmu", "matrix": [8, 2], "x": 25, "y": 0}, + {"label": "rru", "matrix": [8, 1], "x": 29, "y": 0}, + {"label": "rpu", "matrix": [8, 0], "x": 33, "y": 0}, + {"label": "lpl", "matrix": [2, 0], "x": 0, "y": 1}, + {"label": "lpc", "matrix": [1, 0], "x": 1, "y": 1}, + {"label": "lpr", "matrix": [3, 0], "x": 2, "y": 1}, + {"label": "lrl", "matrix": [2, 1], "x": 4, "y": 1}, + {"label": "lrc", "matrix": [1, 1], "x": 5, "y": 1}, + {"label": "lrr", "matrix": [3, 1], "x": 6, "y": 1}, + {"label": "lml", "matrix": [2, 2], "x": 8, "y": 1}, + {"label": "lmc", "matrix": [1, 2], "x": 9, "y": 1}, + {"label": "lmr", "matrix": [3, 2], "x": 10, "y": 1}, + {"label": "lil", "matrix": [2, 3], "x": 12, "y": 1}, + {"label": "lic", "matrix": [1, 3], "x": 13, "y": 1}, + {"label": "lir", "matrix": [3, 3], "x": 14, "y": 1}, + {"label": "ril", "matrix": [5, 3], "x": 20, "y": 1}, + {"label": "ric", "matrix": [6, 3], "x": 21, "y": 1}, + {"label": "rir", "matrix": [9, 3], "x": 22, "y": 1}, + {"label": "rml", "matrix": [5, 2], "x": 24, "y": 1}, + {"label": "rmc", "matrix": [6, 2], "x": 25, "y": 1}, + {"label": "rmr", "matrix": [9, 2], "x": 26, "y": 1}, + {"label": "rrl", "matrix": [5, 1], "x": 28, "y": 1}, + {"label": "rrc", "matrix": [6, 1], "x": 29, "y": 1}, + {"label": "rrr", "matrix": [9, 1], "x": 30, "y": 1}, + {"label": "rpl", "matrix": [5, 0], "x": 32, "y": 1}, + {"label": "rpc", "matrix": [6, 0], "x": 33, "y": 1}, + {"label": "rpr", "matrix": [9, 0], "x": 34, "y": 1}, + {"label": "lpd", "matrix": [4, 0], "x": 1, "y": 2}, + {"label": "lrd", "matrix": [4, 1], "x": 5, "y": 2}, + {"label": "lmd", "matrix": [4, 2], "x": 9, "y": 2}, + {"label": "lid", "matrix": [4, 3], "x": 13, "y": 2}, + {"label": "rid", "matrix": [7, 3], "x": 21, "y": 2}, + {"label": "rmd", "matrix": [7, 2], "x": 25, "y": 2}, + {"label": "rrd", "matrix": [7, 1], "x": 29, "y": 2}, + {"label": "rpd", "matrix": [7, 0], "x": 33, "y": 2}, + {"label": "ltu", "matrix": [0, 4], "x": 13, "y": 3}, + {"label": "rtu", "matrix": [5, 4], "x": 21, "y": 3}, + {"label": "ltl", "matrix": [2, 4], "x": 12, "y": 4}, + {"label": "ltc", "matrix": [1, 4], "x": 13, "y": 4}, + {"label": "ltr", "matrix": [3, 4], "x": 14, "y": 4}, + {"label": "rtl", "matrix": [7, 4], "x": 20, "y": 4}, + {"label": "rtc", "matrix": [6, 4], "x": 21, "y": 4}, + {"label": "rtr", "matrix": [8, 4], "x": 22, "y": 4}, + {"label": "ltd", "matrix": [4, 4], "x": 13, "y": 5}, + {"label": "rtd", "matrix": [9, 4], "x": 21, "y": 5}, + {"label": "lt2u", "matrix": [0, 5], "x": 13, "y": 6}, + {"label": "rt2u", "matrix": [5, 5], "x": 21, "y": 6}, + {"label": "lt2l", "matrix": [2, 5], "x": 12, "y": 7}, + {"label": "lt2c", "matrix": [1, 5], "x": 13, "y": 7}, + {"label": "lt2r", "matrix": [3, 5], "x": 14, "y": 7}, + {"label": "rt2l", "matrix": [7, 5], "x": 20, "y": 7}, + {"label": "rt2c", "matrix": [6, 5], "x": 21, "y": 7}, + {"label": "rt2r", "matrix": [8, 5], "x": 22, "y": 7}, + {"label": "lt2d", "matrix": [4, 5], "x": 13, "y": 8}, + {"label": "rt2d", "matrix": [9, 5], "x": 21, "y": 8} + ] + } + } +} diff --git a/keyboards/dlip/haritev2/mcuconf.h b/keyboards/dlip/haritev2/mcuconf.h new file mode 100644 index 0000000000..62375dc72c --- /dev/null +++ b/keyboards/dlip/haritev2/mcuconf.h @@ -0,0 +1,7 @@ +// Copyright 2023 Dane Lipscombe (@dlip) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include_next +#undef RP_SPI_USE_SPI0 +#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/config.h b/keyboards/dlip/haritev2/thumbstick_pmw3389/config.h new file mode 100644 index 0000000000..b050985f3e --- /dev/null +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/config.h @@ -0,0 +1,9 @@ +// Copyright 2024 Dane Lipscombe (@dlip) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define PMW33XX_CPI 1000 +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_INVERT_X +#define POINTING_DEVICE_RIGHT diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json b/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json new file mode 100644 index 0000000000..5ed8b2fe5e --- /dev/null +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json @@ -0,0 +1,23 @@ +{ + "features": { + "joystick": true + }, + "joystick": { + "axes": { + "x": { + "high": 938, + "input_pin": "GP27", + "low": 25, + "rest": 501 + }, + "y": { + "high": 942, + "input_pin": "GP28", + "low": 58, + "rest": 474 + } + }, + "axis_resolution": 10, + "button_count": 32 + } +} diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/keymaps/default/keymap.c b/keyboards/dlip/haritev2/thumbstick_pmw3389/keymaps/default/keymap.c new file mode 100644 index 0000000000..3e23d4b088 --- /dev/null +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/keymaps/default/keymap.c @@ -0,0 +1,19 @@ +// 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_split_5x6( + KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, KC_D, + + KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D, + + KC_U, KC_U, + KC_L, KC_C, KC_R, KC_L, KC_C, KC_R, + KC_D, KC_D + ) +}; diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/readme.md b/keyboards/dlip/haritev2/thumbstick_pmw3389/readme.md new file mode 100644 index 0000000000..ed0caf977a --- /dev/null +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/readme.md @@ -0,0 +1,39 @@ +# Harite v2 (Thumbstick + PMW3389 version) + +5 way switch directional keyboard + +![Harite-v2](https://i.imgur.com/wyrUsjG.jpeg) + +* Keyboard Maintainer: [Dane Lipscombe](https://github.com/dlip) +* Hardware Supported: Harite v2 (Thumbstick + PMW3389 version) +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + +```bash +make dlip/haritev2/thumbstick_pmw3389:default +``` + +Flashing example for this keyboard: + +```bash +# For the left half... +make dlip/haritev2/thumbstick_pmw3389:default:uf2-split-left +# or the qmk cli equivalent: +qmk flash -kb dlip/haritev2/thumbstick_pmw3389 --keymap default -bl uf2-split-left + +# For the right half... +make dlip/haritev2/thumbstick_pmw3389:default:uf2-split-right +# or the qmk cli equivalent: +qmk flash -kb dlip/haritev2/thumbstick_pmw3389 --keymap default -bl uf2-split-right +``` + +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/dlip/haritev2/thumbstick_pmw3389/rules.mk b/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk new file mode 100644 index 0000000000..07df2b48b2 --- /dev/null +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk @@ -0,0 +1,3 @@ +POINTING_DEVICE_ENABLE = yes +POINTING_DEVICE_DRIVER = pmw3389 +JOYSTICK_DRIVER = analog From 8c108efb0d72d7ef6c735c25295538968c68af99 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 14 May 2025 13:00:33 +0100 Subject: [PATCH 373/592] dlip/haritev2 - Post merge fixes (#25264) --- keyboards/dlip/haritev2/dual_cirque/keyboard.json | 5 +++++ keyboards/dlip/haritev2/dual_cirque/rules.mk | 2 -- keyboards/dlip/haritev2/halconf.h | 3 --- keyboards/dlip/haritev2/info.json | 3 --- keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json | 4 +++- keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk | 2 -- 6 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 keyboards/dlip/haritev2/dual_cirque/keyboard.json diff --git a/keyboards/dlip/haritev2/dual_cirque/keyboard.json b/keyboards/dlip/haritev2/dual_cirque/keyboard.json new file mode 100644 index 0000000000..2224a5d894 --- /dev/null +++ b/keyboards/dlip/haritev2/dual_cirque/keyboard.json @@ -0,0 +1,5 @@ +{ + "features": { + "pointing_device": true + } +} diff --git a/keyboards/dlip/haritev2/dual_cirque/rules.mk b/keyboards/dlip/haritev2/dual_cirque/rules.mk index 01e5b00480..fb5d649735 100644 --- a/keyboards/dlip/haritev2/dual_cirque/rules.mk +++ b/keyboards/dlip/haritev2/dual_cirque/rules.mk @@ -1,3 +1 @@ -POINTING_DEVICE_ENABLE = yes POINTING_DEVICE_DRIVER = cirque_pinnacle_spi - diff --git a/keyboards/dlip/haritev2/halconf.h b/keyboards/dlip/haritev2/halconf.h index 895fcc3c8c..102ec51a6b 100644 --- a/keyboards/dlip/haritev2/halconf.h +++ b/keyboards/dlip/haritev2/halconf.h @@ -3,8 +3,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next - diff --git a/keyboards/dlip/haritev2/info.json b/keyboards/dlip/haritev2/info.json index df7b9035e5..b7e12b89d5 100644 --- a/keyboards/dlip/haritev2/info.json +++ b/keyboards/dlip/haritev2/info.json @@ -6,8 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true @@ -23,7 +21,6 @@ "driver": "vendor" } }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x4832", diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json b/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json index 5ed8b2fe5e..687c0ea3a9 100644 --- a/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/keyboard.json @@ -1,8 +1,10 @@ { "features": { - "joystick": true + "joystick": true, + "pointing_device": true }, "joystick": { + "driver": "analog", "axes": { "x": { "high": 938, diff --git a/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk b/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk index 07df2b48b2..8ff6b63653 100644 --- a/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk +++ b/keyboards/dlip/haritev2/thumbstick_pmw3389/rules.mk @@ -1,3 +1 @@ -POINTING_DEVICE_ENABLE = yes POINTING_DEVICE_DRIVER = pmw3389 -JOYSTICK_DRIVER = analog From cd95294a25fba190e6b3383200e178ffd0eab8d0 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 14 May 2025 13:01:08 +0100 Subject: [PATCH 374/592] Remove more USB only branches from NKRO handling (#25263) --- tmk_core/protocol/report.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tmk_core/protocol/report.c b/tmk_core/protocol/report.c index 6203a3116b..f68334adeb 100644 --- a/tmk_core/protocol/report.c +++ b/tmk_core/protocol/report.c @@ -32,7 +32,7 @@ uint8_t has_anykey(void) { uint8_t* p = keyboard_report->keys; uint8_t lp = sizeof(keyboard_report->keys); #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { p = nkro_report->bits; lp = sizeof(nkro_report->bits); } @@ -49,7 +49,7 @@ uint8_t has_anykey(void) { */ uint8_t get_first_key(void) { #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { uint8_t i = 0; for (; i < NKRO_REPORT_BITS && !nkro_report->bits[i]; i++) ; @@ -69,7 +69,7 @@ bool is_key_pressed(uint8_t key) { return false; } #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { if ((key >> 3) < NKRO_REPORT_BITS) { return nkro_report->bits[key >> 3] & 1 << (key & 7); } else { @@ -151,7 +151,7 @@ void del_key_bit(report_nkro_t* nkro_report, uint8_t code) { */ void add_key_to_report(uint8_t key) { #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { add_key_bit(nkro_report, key); return; } @@ -165,7 +165,7 @@ void add_key_to_report(uint8_t key) { */ void del_key_from_report(uint8_t key) { #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { del_key_bit(nkro_report, key); return; } @@ -180,7 +180,7 @@ void del_key_from_report(uint8_t key) { void clear_keys_from_report(void) { // not clear mods #ifdef NKRO_ENABLE - if (usb_device_state_get_protocol() == USB_PROTOCOL_REPORT && keymap_config.nkro) { + if (host_can_send_nkro() && keymap_config.nkro) { memset(nkro_report->bits, 0, sizeof(nkro_report->bits)); return; } From 05ff5443b1d528855332b4b06063fad26f21e391 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 14 May 2025 13:02:43 +0100 Subject: [PATCH 375/592] Deprecate `usb.force_nkro`/`FORCE_NKRO` (#25262) --- data/mappings/info_config.hjson | 5 ++++- data/schemas/keyboard.jsonschema | 18 +++++++++++++++++- docs/config_options.md | 2 -- docs/features/stenography.md | 2 +- docs/reference_info_json.md | 11 ++++++++--- quantum/eeconfig.c | 6 +++++- quantum/keyboard.c | 1 + 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index bab881583a..e4def1a4d7 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -64,6 +64,9 @@ "WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false}, "WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false}, + // host + "NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"}, + // Layer locking "LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"}, @@ -215,7 +218,6 @@ "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"}, // USB - "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"}, "USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"}, "USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"}, "USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"}, @@ -253,6 +255,7 @@ "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"}, "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"}, "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"}, + "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"}, // Items we want flagged in lint "VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 4e8bae1084..c22b0ff0da 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -443,6 +443,18 @@ } } }, + "host": { + "type": "object", + "properties": { + "default": { + "type": "object", + "additionalProperties": false, + "properties": { + "nkro": {"type": "boolean"} + } + } + } + }, "leader_key": { "type": "object", "properties": { @@ -952,7 +964,11 @@ "$comment": "Deprecated: use device_version instead" }, "device_version": {"$ref": "qmk.definitions.v1#/bcd_version"}, - "force_nkro": {"type": "boolean"}, + "force_nkro": { + "type": "boolean", + "$comment": "Deprecated: use host.default.nkro instead" + + }, "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"}, diff --git a/docs/config_options.md b/docs/config_options.md index e75a5b2f7e..b2a2117693 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -140,8 +140,6 @@ If you define these options you will enable the associated feature, which may in * `#define ENABLE_COMPILE_KEYCODE` * Enables the `QK_MAKE` keycode -* `#define FORCE_NKRO` - * NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots. * `#define STRICT_LAYER_RELEASE` * force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases) diff --git a/docs/features/stenography.md b/docs/features/stenography.md index c6c2155a9a..7fd245d59a 100644 --- a/docs/features/stenography.md +++ b/docs/features/stenography.md @@ -8,7 +8,7 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so 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. -To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define FORCE_NKRO` in your `config.h`. +To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define NKRO_DEFAULT_ON true` in your `config.h`. You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys. diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index 0f8f680b55..a64f2992b5 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -274,6 +274,14 @@ Configures the [Encoder](features/encoders) feature. * The number of edge transitions on both pins required to register an input. * Default: `4` +## Host {#host} + +* `host` + * `default` + * `nkro` Boolean + * The default nkro state. + * Default: `false` + ## Indicators {#indicators} Configures the [LED Indicators](features/led_indicators) feature. @@ -818,9 +826,6 @@ Configures the [Stenography](features/stenography) feature. * `vid` String Required * The USB vendor ID as a four-digit hexadecimal number. * Example: `"0xC1ED"` - * `force_nkro` Boolean - * Force NKRO to be active. - * Default: `false` * `max_power` Number * The maximum current draw the host should expect from the device. This does not control the actual current usage. * Default: `500` (500 mA) diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index 1e8cfd758a..f14e6ddf97 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -47,6 +47,10 @@ void eeconfig_init_via(void); void dynamic_keymap_reset(void); #endif // VIA_ENABLE +#ifndef NKRO_DEFAULT_ON +# define NKRO_DEFAULT_ON false +#endif + __attribute__((weak)) void eeconfig_init_user(void) { #if (EECONFIG_USER_DATA_SIZE) == 0 // Reset user EEPROM value to blank, rather than to a set value @@ -82,7 +86,7 @@ void eeconfig_init_quantum(void) { .no_gui = false, .swap_grave_esc = false, .swap_backslash_backspace = false, - .nkro = false, + .nkro = NKRO_DEFAULT_ON, .swap_lctl_lgui = false, .swap_rctl_rgui = false, .oneshot_enable = true, // Enable oneshot by default diff --git a/quantum/keyboard.c b/quantum/keyboard.c index be51190a87..c1a6d444a5 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -509,6 +509,7 @@ void keyboard_init(void) { steno_init(); #endif #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) +# pragma message "FORCE_NKRO option is now deprecated - Please migrate to NKRO_DEFAULT_ON instead." keymap_config.nkro = 1; eeconfig_update_keymap(&keymap_config); #endif From 40d0de39b7ac28ee929729b17e938b98e73db444 Mon Sep 17 00:00:00 2001 From: Danny Date: Fri, 16 May 2025 12:08:51 -0400 Subject: [PATCH 376/592] Add BDN9 Rev. 3 (#25261) --- .../keebio/bdn9/keymaps/default/config.h | 5 - keyboards/keebio/bdn9/rev3/config.h | 14 +++ keyboards/keebio/bdn9/rev3/halconf.h | 8 ++ keyboards/keebio/bdn9/rev3/keyboard.json | 97 +++++++++++++++++++ keyboards/keebio/bdn9/rev3/mcuconf.h | 10 ++ keyboards/keebio/bdn9/rev3/rev3.c | 36 +++++++ 6 files changed, 165 insertions(+), 5 deletions(-) delete mode 100644 keyboards/keebio/bdn9/keymaps/default/config.h create mode 100644 keyboards/keebio/bdn9/rev3/config.h create mode 100644 keyboards/keebio/bdn9/rev3/halconf.h create mode 100644 keyboards/keebio/bdn9/rev3/keyboard.json create mode 100644 keyboards/keebio/bdn9/rev3/mcuconf.h create mode 100644 keyboards/keebio/bdn9/rev3/rev3.c diff --git a/keyboards/keebio/bdn9/keymaps/default/config.h b/keyboards/keebio/bdn9/keymaps/default/config.h deleted file mode 100644 index e09fba9232..0000000000 --- a/keyboards/keebio/bdn9/keymaps/default/config.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#ifdef RGB_MATRIX_ENABLE -# define RGB_MATRIX_KEYPRESSES -#endif diff --git a/keyboards/keebio/bdn9/rev3/config.h b/keyboards/keebio/bdn9/rev3/config.h new file mode 100644 index 0000000000..3afa37bce1 --- /dev/null +++ b/keyboards/keebio/bdn9/rev3/config.h @@ -0,0 +1,14 @@ +// Copyright 2025 Danny Nguyen (@nooges) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Defines for the RGB matrix */ +#ifdef RGB_MATRIX_ENABLE +# define WS2812_PWM_DRIVER PWMD15 +# define WS2812_PWM_CHANNEL 2 +# define WS2812_PWM_PAL_MODE 1 +# define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +# define WS2812_DMA_CHANNEL 2 +# define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM15_UP +#endif diff --git a/keyboards/keebio/bdn9/rev3/halconf.h b/keyboards/keebio/bdn9/rev3/halconf.h new file mode 100644 index 0000000000..969d6e5512 --- /dev/null +++ b/keyboards/keebio/bdn9/rev3/halconf.h @@ -0,0 +1,8 @@ +// Copyright 2025 Danny Nguyen (@nooges) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/keebio/bdn9/rev3/keyboard.json b/keyboards/keebio/bdn9/rev3/keyboard.json new file mode 100644 index 0000000000..e180c04e2a --- /dev/null +++ b/keyboards/keebio/bdn9/rev3/keyboard.json @@ -0,0 +1,97 @@ +{ + "keyboard_name": "BDN9 Rev. 3", + "bootloader": "stm32-dfu", + "encoder": { + "rotary": [ + {"pin_a": "A8", "pin_b": "A4"}, + {"pin_a": "B3", "pin_b": "A15"}, + {"pin_a": "A10", "pin_b": "A9"} + ] + }, + "features": { + "bootmagic": true, + "command": true, + "console": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "matrix_pins": { + "direct": [ + ["B12", "B5", "B6"], + ["B14", "B4", "B7"], + ["A3", "F1", "F0"] + ] + }, + "processor": "STM32G431", + "rgb_matrix": { + "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, + "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, + "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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 224, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [1, 1], "x": 112, "y": 32, "flags": 4}, + {"matrix": [1, 2], "x": 224, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [2, 1], "x": 112, "y": 64, "flags": 4}, + {"matrix": [2, 2], "x": 224, "y": 64, "flags": 4}, + {"x": 56, "y": 64, "flags": 2}, + {"x": 168, "y": 64, "flags": 2} + ] + }, + "usb": { + "device_version": "3.0.0", + "pid": "0x3133" + }, + "ws2812": { + "driver": "pwm", + "pin": "B15" + } +} diff --git a/keyboards/keebio/bdn9/rev3/mcuconf.h b/keyboards/keebio/bdn9/rev3/mcuconf.h new file mode 100644 index 0000000000..0b109bf791 --- /dev/null +++ b/keyboards/keebio/bdn9/rev3/mcuconf.h @@ -0,0 +1,10 @@ +// Copyright 2025 Danny Nguyen (@nooges) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +/* enable TIM15, used for RGB LED PWM driver */ +#undef STM32_PWM_USE_TIM15 +#define STM32_PWM_USE_TIM15 TRUE diff --git a/keyboards/keebio/bdn9/rev3/rev3.c b/keyboards/keebio/bdn9/rev3/rev3.c new file mode 100644 index 0000000000..f15abf9d85 --- /dev/null +++ b/keyboards/keebio/bdn9/rev3/rev3.c @@ -0,0 +1,36 @@ +// Copyright 2025 Danny Nguyen (@nooges) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Disable the PD peripheral in pre-init because its pins (B4, B6) are being used in the matrix: + PWR->CR3 |= PWR_CR3_UCPD_DBDIS; + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_pre_init_user(); +} +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { return false; } + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } + else if (index == 1) { + if (clockwise) { + tap_code(KC_DOWN); + } else { + tap_code(KC_UP); + } + } + else if (index == 2) { + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} From 0b6a460b7f5d4b681da7653b25e4082e8b8c6c1a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 16 May 2025 17:35:05 +0100 Subject: [PATCH 377/592] Remove duplicate of SPI default config from keyboards (#25266) --- docs/drivers/spi.md | 2 -- keyboards/adafruit/macropad/halconf.h | 13 ++----------- keyboards/akko/5087/halconf.h | 2 -- keyboards/akko/5108/halconf.h | 2 -- keyboards/akko/acr87/halconf.h | 2 -- keyboards/akko/top40/halconf.h | 2 -- keyboards/annepro2/halconf.h | 2 -- .../bastardkb/charybdis/3x5/blackpill/halconf.h | 2 -- .../bastardkb/charybdis/3x6/blackpill/halconf.h | 2 -- .../bastardkb/charybdis/4x6/blackpill/halconf.h | 2 -- keyboards/bastardkb/scylla/blackpill/halconf.h | 2 -- keyboards/bastardkb/skeletyl/blackpill/halconf.h | 2 -- keyboards/bastardkb/tbkmini/blackpill/halconf.h | 2 -- keyboards/chosfox/cf81/halconf.h | 2 -- keyboards/custommk/cmk11/halconf.h | 5 ----- keyboards/custommk/elysian/halconf.h | 4 ---- keyboards/custommk/ergostrafer/halconf.h | 5 ----- keyboards/custommk/ergostrafer_rgb/halconf.h | 5 ----- keyboards/custommk/evo70_r2/halconf.h | 5 ----- keyboards/darkproject/kd83a_bfg_edition/halconf.h | 2 -- keyboards/darkproject/kd87a_bfg_edition/halconf.h | 2 -- keyboards/darmoshark/k3/halconf.h | 2 -- keyboards/edi/hardlight/mk2/halconf.h | 5 +---- keyboards/gmmk/gmmk2/p65/halconf.h | 3 --- keyboards/gmmk/gmmk2/p96/halconf.h | 3 --- keyboards/gmmk/numpad/halconf.h | 5 +---- keyboards/gmmk/pro/rev1/halconf.h | 2 -- keyboards/gmmk/pro/rev2/halconf.h | 2 -- keyboards/handwired/onekey/at_start_f415/halconf.h | 1 - keyboards/handwired/onekey/kb2040/halconf.h | 1 - keyboards/handwired/onekey/rp2040/halconf.h | 1 - .../tractyl_manuform/5x6_right/f303/halconf.h | 2 -- .../tractyl_manuform/5x6_right/f405/halconf.h | 5 ----- .../tractyl_manuform/5x6_right/f411/halconf.h | 2 -- keyboards/hazel/bad_wings/halconf.h | 4 +--- keyboards/hazel/bad_wings_v2/halconf.h | 2 -- keyboards/hfdkb/ac001/halconf.h | 2 -- keyboards/horrortroll/handwired_k552/halconf.h | 3 --- keyboards/inland/kb83/halconf.h | 2 -- keyboards/inland/mk47/halconf.h | 2 -- keyboards/inland/v83p/halconf.h | 2 -- keyboards/jidohun/km113/halconf.h | 2 -- keyboards/jukaie/jk01/halconf.h | 2 -- keyboards/kbdfans/odin75/halconf.h | 9 +-------- keyboards/mechwild/puckbuddy/halconf.h | 3 --- keyboards/mechwild/sugarglider/halconf.h | 3 --- keyboards/moky/moky67/halconf.h | 2 -- keyboards/moky/moky88/halconf.h | 2 -- keyboards/monsgeek/m1/halconf.h | 2 -- keyboards/monsgeek/m3/halconf.h | 2 -- keyboards/monsgeek/m5/halconf.h | 2 -- keyboards/monsgeek/m6/halconf.h | 2 -- keyboards/phentech/rpk_001/halconf.h | 2 -- keyboards/projectd/65/projectd_65_ansi/halconf.h | 2 -- keyboards/projectd/75/ansi/halconf.h | 2 -- keyboards/projectd/75/iso/halconf.h | 2 -- keyboards/sawnsprojects/okayu/halconf.h | 3 +-- keyboards/sharkoon/skiller_sgk50_s2/halconf.h | 2 -- keyboards/sharkoon/skiller_sgk50_s3/halconf.h | 2 -- keyboards/sharkoon/skiller_sgk50_s4/halconf.h | 2 -- keyboards/splitkb/elora/rev1/halconf.h | 2 -- keyboards/splitkb/halcyon/elora/rev2/halconf.h | 3 --- keyboards/splitkb/halcyon/kyria/rev4/halconf.h | 3 --- keyboards/tacworks/tac_k1/halconf.h | 2 -- keyboards/trnthsn/s6xty5neor2/halconf.h | 3 +-- 65 files changed, 8 insertions(+), 171 deletions(-) diff --git a/docs/drivers/spi.md b/docs/drivers/spi.md index 140b204945..56b294ad3a 100644 --- a/docs/drivers/spi.md +++ b/docs/drivers/spi.md @@ -39,8 +39,6 @@ To enable SPI, modify your board's `halconf.h` to enable SPI, then modify your b #pragma once #define HAL_USE_SPI TRUE // [!code focus] -#define SPI_USE_WAIT TRUE // [!code focus] -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD // [!code focus] #include_next ``` diff --git a/keyboards/adafruit/macropad/halconf.h b/keyboards/adafruit/macropad/halconf.h index 2e3be29bbf..53c366ea1c 100644 --- a/keyboards/adafruit/macropad/halconf.h +++ b/keyboards/adafruit/macropad/halconf.h @@ -16,16 +16,7 @@ #pragma once -#include_next - -#undef HAL_USE_SPI #define HAL_USE_SPI TRUE - -#undef SPI_USE_WAIT -#define SPI_USE_WAIT TRUE - -#undef SPI_SELECT_MODE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - -#undef HAL_USE_PWM #define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/akko/5087/halconf.h b/keyboards/akko/5087/halconf.h index 55bfe5c977..b8ebdb3369 100644 --- a/keyboards/akko/5087/halconf.h +++ b/keyboards/akko/5087/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/akko/5108/halconf.h b/keyboards/akko/5108/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/akko/5108/halconf.h +++ b/keyboards/akko/5108/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/akko/acr87/halconf.h b/keyboards/akko/acr87/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/akko/acr87/halconf.h +++ b/keyboards/akko/acr87/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/akko/top40/halconf.h b/keyboards/akko/top40/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/akko/top40/halconf.h +++ b/keyboards/akko/top40/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/annepro2/halconf.h b/keyboards/annepro2/halconf.h index dcb04eab1b..980435448f 100644 --- a/keyboards/annepro2/halconf.h +++ b/keyboards/annepro2/halconf.h @@ -26,7 +26,5 @@ #define SERIAL_USB_BUFFERS_SIZE 256 #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h index c43f84e0de..300b0eeaed 100644 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h index 1ba700a80f..5c5dff98d4 100644 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h index c43f84e0de..300b0eeaed 100644 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/scylla/blackpill/halconf.h b/keyboards/bastardkb/scylla/blackpill/halconf.h index 1ba700a80f..5c5dff98d4 100644 --- a/keyboards/bastardkb/scylla/blackpill/halconf.h +++ b/keyboards/bastardkb/scylla/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/skeletyl/blackpill/halconf.h b/keyboards/bastardkb/skeletyl/blackpill/halconf.h index 1ba700a80f..5c5dff98d4 100644 --- a/keyboards/bastardkb/skeletyl/blackpill/halconf.h +++ b/keyboards/bastardkb/skeletyl/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/bastardkb/tbkmini/blackpill/halconf.h b/keyboards/bastardkb/tbkmini/blackpill/halconf.h index 1ba700a80f..5c5dff98d4 100644 --- a/keyboards/bastardkb/tbkmini/blackpill/halconf.h +++ b/keyboards/bastardkb/tbkmini/blackpill/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SERIAL TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/chosfox/cf81/halconf.h b/keyboards/chosfox/cf81/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/chosfox/cf81/halconf.h +++ b/keyboards/chosfox/cf81/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/custommk/cmk11/halconf.h b/keyboards/custommk/cmk11/halconf.h index 6791d829f9..32d126efc5 100644 --- a/keyboards/custommk/cmk11/halconf.h +++ b/keyboards/custommk/cmk11/halconf.h @@ -20,11 +20,6 @@ #define HAL_USE_SPI TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - #define SERIAL_BUFFERS_SIZE 256 -// This enables interrupt-driven mode -#define SPI_USE_WAIT TRUE - #include_next diff --git a/keyboards/custommk/elysian/halconf.h b/keyboards/custommk/elysian/halconf.h index 5b2f7eedd2..501c3e00b5 100644 --- a/keyboards/custommk/elysian/halconf.h +++ b/keyboards/custommk/elysian/halconf.h @@ -5,10 +5,6 @@ #define HAL_USE_SPI TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - #define SERIAL_BUFFERS_SIZE 256 -#define SPI_USE_WAIT TRUE - #include_next diff --git a/keyboards/custommk/ergostrafer/halconf.h b/keyboards/custommk/ergostrafer/halconf.h index aed037ba2a..17a94765ca 100644 --- a/keyboards/custommk/ergostrafer/halconf.h +++ b/keyboards/custommk/ergostrafer/halconf.h @@ -20,11 +20,6 @@ #define HAL_USE_SPI TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - #define SERIAL_BUFFERS_SIZE 256 -// This enables interrupt-driven mode -#define SPI_USE_WAIT TRUE - #include_next diff --git a/keyboards/custommk/ergostrafer_rgb/halconf.h b/keyboards/custommk/ergostrafer_rgb/halconf.h index 6791d829f9..32d126efc5 100644 --- a/keyboards/custommk/ergostrafer_rgb/halconf.h +++ b/keyboards/custommk/ergostrafer_rgb/halconf.h @@ -20,11 +20,6 @@ #define HAL_USE_SPI TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - #define SERIAL_BUFFERS_SIZE 256 -// This enables interrupt-driven mode -#define SPI_USE_WAIT TRUE - #include_next diff --git a/keyboards/custommk/evo70_r2/halconf.h b/keyboards/custommk/evo70_r2/halconf.h index 5268fe5de6..da1c76d1de 100644 --- a/keyboards/custommk/evo70_r2/halconf.h +++ b/keyboards/custommk/evo70_r2/halconf.h @@ -26,11 +26,6 @@ #define HAL_USE_GPT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - #define SERIAL_BUFFERS_SIZE 256 -// This enables interrupt-driven mode -#define SPI_USE_WAIT TRUE - #include_next diff --git a/keyboards/darkproject/kd83a_bfg_edition/halconf.h b/keyboards/darkproject/kd83a_bfg_edition/halconf.h index 8f61d3fc64..adeb248f90 100644 --- a/keyboards/darkproject/kd83a_bfg_edition/halconf.h +++ b/keyboards/darkproject/kd83a_bfg_edition/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/darkproject/kd87a_bfg_edition/halconf.h b/keyboards/darkproject/kd87a_bfg_edition/halconf.h index 8f61d3fc64..adeb248f90 100644 --- a/keyboards/darkproject/kd87a_bfg_edition/halconf.h +++ b/keyboards/darkproject/kd87a_bfg_edition/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/darmoshark/k3/halconf.h b/keyboards/darmoshark/k3/halconf.h index b6a606056a..adf026a47a 100644 --- a/keyboards/darmoshark/k3/halconf.h +++ b/keyboards/darmoshark/k3/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/edi/hardlight/mk2/halconf.h b/keyboards/edi/hardlight/mk2/halconf.h index 498f31a919..f7b5100b2c 100644 --- a/keyboards/edi/hardlight/mk2/halconf.h +++ b/keyboards/edi/hardlight/mk2/halconf.h @@ -25,8 +25,5 @@ along with this program. If not, see . // Activate Serial Peripheral Interface #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD - -#include_next \ No newline at end of file +#include_next diff --git a/keyboards/gmmk/gmmk2/p65/halconf.h b/keyboards/gmmk/gmmk2/p65/halconf.h index 293d182917..24941b1b6c 100644 --- a/keyboards/gmmk/gmmk2/p65/halconf.h +++ b/keyboards/gmmk/gmmk2/p65/halconf.h @@ -22,8 +22,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next - diff --git a/keyboards/gmmk/gmmk2/p96/halconf.h b/keyboards/gmmk/gmmk2/p96/halconf.h index 293d182917..24941b1b6c 100644 --- a/keyboards/gmmk/gmmk2/p96/halconf.h +++ b/keyboards/gmmk/gmmk2/p96/halconf.h @@ -22,8 +22,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next - diff --git a/keyboards/gmmk/numpad/halconf.h b/keyboards/gmmk/numpad/halconf.h index b6b68a4e63..7ac9455f98 100644 --- a/keyboards/gmmk/numpad/halconf.h +++ b/keyboards/gmmk/numpad/halconf.h @@ -18,9 +18,6 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #define HAL_USE_ADC TRUE - -#include_next \ No newline at end of file +#include_next diff --git a/keyboards/gmmk/pro/rev1/halconf.h b/keyboards/gmmk/pro/rev1/halconf.h index 8d9b60c234..cfd866f371 100644 --- a/keyboards/gmmk/pro/rev1/halconf.h +++ b/keyboards/gmmk/pro/rev1/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/gmmk/pro/rev2/halconf.h b/keyboards/gmmk/pro/rev2/halconf.h index 8d9b60c234..cfd866f371 100644 --- a/keyboards/gmmk/pro/rev2/halconf.h +++ b/keyboards/gmmk/pro/rev2/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/handwired/onekey/at_start_f415/halconf.h b/keyboards/handwired/onekey/at_start_f415/halconf.h index 1fc1b548a2..3c3ba3812a 100644 --- a/keyboards/handwired/onekey/at_start_f415/halconf.h +++ b/keyboards/handwired/onekey/at_start_f415/halconf.h @@ -11,6 +11,5 @@ #define HAL_USE_PWM TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE #include_next diff --git a/keyboards/handwired/onekey/kb2040/halconf.h b/keyboards/handwired/onekey/kb2040/halconf.h index ce781aa374..96d14ae85c 100644 --- a/keyboards/handwired/onekey/kb2040/halconf.h +++ b/keyboards/handwired/onekey/kb2040/halconf.h @@ -17,6 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE #include_next diff --git a/keyboards/handwired/onekey/rp2040/halconf.h b/keyboards/handwired/onekey/rp2040/halconf.h index da4a49b5c1..6310808d9a 100644 --- a/keyboards/handwired/onekey/rp2040/halconf.h +++ b/keyboards/handwired/onekey/rp2040/halconf.h @@ -10,6 +10,5 @@ #define HAL_USE_ADC TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE #include_next diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f303/halconf.h b/keyboards/handwired/tractyl_manuform/5x6_right/f303/halconf.h index 62f56e4d2b..b06f52b7df 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f303/halconf.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f303/halconf.h @@ -21,7 +21,5 @@ #define HAL_USE_SPI TRUE #define HAL_USE_GPT TRUE #define HAL_USE_DAC TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h b/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h index 23f8e5c934..3cf07b9be0 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f405/halconf.h @@ -22,11 +22,6 @@ # define HAL_USE_PWM TRUE #endif // defined(WS2812_PWM) || defined(BACKLIGHT_PWM) -#if HAL_USE_SPI == TRUE -# define SPI_USE_WAIT TRUE -# define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - #ifdef AUDIO_DRIVER_DAC # define HAL_USE_GPT TRUE # define HAL_USE_DAC TRUE diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f411/halconf.h b/keyboards/handwired/tractyl_manuform/5x6_right/f411/halconf.h index bc07c10527..296119b080 100644 --- a/keyboards/handwired/tractyl_manuform/5x6_right/f411/halconf.h +++ b/keyboards/handwired/tractyl_manuform/5x6_right/f411/halconf.h @@ -19,7 +19,5 @@ #define HAL_USE_SERIAL TRUE #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/hazel/bad_wings/halconf.h b/keyboards/hazel/bad_wings/halconf.h index ed9500fe75..dbb40c4c27 100644 --- a/keyboards/hazel/bad_wings/halconf.h +++ b/keyboards/hazel/bad_wings/halconf.h @@ -6,7 +6,5 @@ #define HAL_USE_SPI TRUE #define HAL_USE_I2C TRUE #define HAL_USE_PWM TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#include_next \ No newline at end of file +#include_next diff --git a/keyboards/hazel/bad_wings_v2/halconf.h b/keyboards/hazel/bad_wings_v2/halconf.h index 6d6a6511bf..fa7e45bdcd 100644 --- a/keyboards/hazel/bad_wings_v2/halconf.h +++ b/keyboards/hazel/bad_wings_v2/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/hfdkb/ac001/halconf.h b/keyboards/hfdkb/ac001/halconf.h index 7ad0a62d2e..b06fd7e719 100644 --- a/keyboards/hfdkb/ac001/halconf.h +++ b/keyboards/hfdkb/ac001/halconf.h @@ -16,7 +16,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/horrortroll/handwired_k552/halconf.h b/keyboards/horrortroll/handwired_k552/halconf.h index a8be303915..bc38dd1baf 100644 --- a/keyboards/horrortroll/handwired_k552/halconf.h +++ b/keyboards/horrortroll/handwired_k552/halconf.h @@ -22,9 +22,6 @@ #pragma once #define HAL_USE_I2C TRUE - #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/inland/kb83/halconf.h b/keyboards/inland/kb83/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/inland/kb83/halconf.h +++ b/keyboards/inland/kb83/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/inland/mk47/halconf.h b/keyboards/inland/mk47/halconf.h index 55bfe5c977..b8ebdb3369 100644 --- a/keyboards/inland/mk47/halconf.h +++ b/keyboards/inland/mk47/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/inland/v83p/halconf.h b/keyboards/inland/v83p/halconf.h index fcd8b7216a..f3178d93f0 100644 --- a/keyboards/inland/v83p/halconf.h +++ b/keyboards/inland/v83p/halconf.h @@ -5,7 +5,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/jidohun/km113/halconf.h b/keyboards/jidohun/km113/halconf.h index 6ff2f1ec67..7e9c966f40 100644 --- a/keyboards/jidohun/km113/halconf.h +++ b/keyboards/jidohun/km113/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/jukaie/jk01/halconf.h b/keyboards/jukaie/jk01/halconf.h index 64a184eb92..e17fed3886 100644 --- a/keyboards/jukaie/jk01/halconf.h +++ b/keyboards/jukaie/jk01/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/kbdfans/odin75/halconf.h b/keyboards/kbdfans/odin75/halconf.h index 0218214174..15cb9895ba 100644 --- a/keyboards/kbdfans/odin75/halconf.h +++ b/keyboards/kbdfans/odin75/halconf.h @@ -16,13 +16,6 @@ #pragma once -#include_next - -#undef HAL_USE_SPI #define HAL_USE_SPI TRUE -#undef SPI_USE_WAIT -#define SPI_USE_WAIT TRUE - -#undef SPI_SELECT_MODE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD +#include_next diff --git a/keyboards/mechwild/puckbuddy/halconf.h b/keyboards/mechwild/puckbuddy/halconf.h index 07e8cdd17b..fb6312d554 100644 --- a/keyboards/mechwild/puckbuddy/halconf.h +++ b/keyboards/mechwild/puckbuddy/halconf.h @@ -5,9 +5,6 @@ #pragma once #define HAL_USE_I2C TRUE - #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/mechwild/sugarglider/halconf.h b/keyboards/mechwild/sugarglider/halconf.h index 23a1dc04b3..76bd6cf256 100644 --- a/keyboards/mechwild/sugarglider/halconf.h +++ b/keyboards/mechwild/sugarglider/halconf.h @@ -4,9 +4,6 @@ #pragma once #define HAL_USE_I2C TRUE - #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/moky/moky67/halconf.h b/keyboards/moky/moky67/halconf.h index 0a59a1fcb8..5d94695838 100644 --- a/keyboards/moky/moky67/halconf.h +++ b/keyboards/moky/moky67/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/moky/moky88/halconf.h b/keyboards/moky/moky88/halconf.h index 0a59a1fcb8..5d94695838 100644 --- a/keyboards/moky/moky88/halconf.h +++ b/keyboards/moky/moky88/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/monsgeek/m1/halconf.h b/keyboards/monsgeek/m1/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/monsgeek/m1/halconf.h +++ b/keyboards/monsgeek/m1/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/monsgeek/m3/halconf.h b/keyboards/monsgeek/m3/halconf.h index 55bfe5c977..b8ebdb3369 100644 --- a/keyboards/monsgeek/m3/halconf.h +++ b/keyboards/monsgeek/m3/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/monsgeek/m5/halconf.h b/keyboards/monsgeek/m5/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/monsgeek/m5/halconf.h +++ b/keyboards/monsgeek/m5/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/monsgeek/m6/halconf.h b/keyboards/monsgeek/m6/halconf.h index 2f64e65393..2ddb9c35d8 100644 --- a/keyboards/monsgeek/m6/halconf.h +++ b/keyboards/monsgeek/m6/halconf.h @@ -17,7 +17,5 @@ #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/phentech/rpk_001/halconf.h b/keyboards/phentech/rpk_001/halconf.h index 8760386e81..872e0217df 100644 --- a/keyboards/phentech/rpk_001/halconf.h +++ b/keyboards/phentech/rpk_001/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/projectd/65/projectd_65_ansi/halconf.h b/keyboards/projectd/65/projectd_65_ansi/halconf.h index 64a184eb92..e17fed3886 100644 --- a/keyboards/projectd/65/projectd_65_ansi/halconf.h +++ b/keyboards/projectd/65/projectd_65_ansi/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/projectd/75/ansi/halconf.h b/keyboards/projectd/75/ansi/halconf.h index 64a184eb92..e17fed3886 100644 --- a/keyboards/projectd/75/ansi/halconf.h +++ b/keyboards/projectd/75/ansi/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/projectd/75/iso/halconf.h b/keyboards/projectd/75/iso/halconf.h index 64a184eb92..e17fed3886 100644 --- a/keyboards/projectd/75/iso/halconf.h +++ b/keyboards/projectd/75/iso/halconf.h @@ -17,7 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/sawnsprojects/okayu/halconf.h b/keyboards/sawnsprojects/okayu/halconf.h index eb4e81c9ac..08878e9558 100644 --- a/keyboards/sawnsprojects/okayu/halconf.h +++ b/keyboards/sawnsprojects/okayu/halconf.h @@ -4,6 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + #include_next diff --git a/keyboards/sharkoon/skiller_sgk50_s2/halconf.h b/keyboards/sharkoon/skiller_sgk50_s2/halconf.h index 9d456a5106..50251bd9cb 100644 --- a/keyboards/sharkoon/skiller_sgk50_s2/halconf.h +++ b/keyboards/sharkoon/skiller_sgk50_s2/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/sharkoon/skiller_sgk50_s3/halconf.h b/keyboards/sharkoon/skiller_sgk50_s3/halconf.h index 8760386e81..872e0217df 100644 --- a/keyboards/sharkoon/skiller_sgk50_s3/halconf.h +++ b/keyboards/sharkoon/skiller_sgk50_s3/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/sharkoon/skiller_sgk50_s4/halconf.h b/keyboards/sharkoon/skiller_sgk50_s4/halconf.h index 9d456a5106..50251bd9cb 100644 --- a/keyboards/sharkoon/skiller_sgk50_s4/halconf.h +++ b/keyboards/sharkoon/skiller_sgk50_s4/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/splitkb/elora/rev1/halconf.h b/keyboards/splitkb/elora/rev1/halconf.h index 9798aa34f9..4a2cc2c514 100644 --- a/keyboards/splitkb/elora/rev1/halconf.h +++ b/keyboards/splitkb/elora/rev1/halconf.h @@ -6,8 +6,6 @@ #define HAL_USE_SIO TRUE #define HAL_USE_I2C TRUE #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #define HAL_USE_ADC TRUE #include_next diff --git a/keyboards/splitkb/halcyon/elora/rev2/halconf.h b/keyboards/splitkb/halcyon/elora/rev2/halconf.h index fd95e15f83..a6937ddf9d 100644 --- a/keyboards/splitkb/halcyon/elora/rev2/halconf.h +++ b/keyboards/splitkb/halcyon/elora/rev2/halconf.h @@ -6,9 +6,6 @@ //// VIK #define HAL_USE_I2C TRUE - #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h index 1050ebf313..6d2db1bbd2 100644 --- a/keyboards/splitkb/halcyon/kyria/rev4/halconf.h +++ b/keyboards/splitkb/halcyon/kyria/rev4/halconf.h @@ -6,9 +6,6 @@ //// VIK #define HAL_USE_I2C TRUE - #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next \ No newline at end of file diff --git a/keyboards/tacworks/tac_k1/halconf.h b/keyboards/tacworks/tac_k1/halconf.h index 8760386e81..872e0217df 100644 --- a/keyboards/tacworks/tac_k1/halconf.h +++ b/keyboards/tacworks/tac_k1/halconf.h @@ -4,7 +4,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD #include_next diff --git a/keyboards/trnthsn/s6xty5neor2/halconf.h b/keyboards/trnthsn/s6xty5neor2/halconf.h index 337ed5da18..b8f0a217c4 100644 --- a/keyboards/trnthsn/s6xty5neor2/halconf.h +++ b/keyboards/trnthsn/s6xty5neor2/halconf.h @@ -17,6 +17,5 @@ #pragma once #define HAL_USE_SPI TRUE -#define SPI_USE_WAIT TRUE -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD + #include_next From fa35be51358cf23650660cdfa7f547ea6150dd10 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 16 May 2025 17:35:17 +0100 Subject: [PATCH 378/592] Resolve miscellaneous keyboard lint warnings (#25268) --- keyboards/amptrics/0422/keyboard.json | 1 - keyboards/handwired/hen_des/epssp75/keyboard.json | 2 -- keyboards/handwired/lumawing/keyboard.json | 2 -- keyboards/handwired/riblee_split/keyboard.json | 4 +++- keyboards/handwired/tractyl_manuform/4x6_right/rules.mk | 1 - keyboards/keebio/chiri_ce/rev1/keyboard.json | 4 +++- keyboards/keebio/iris_ce/rev1/keyboard.json | 4 +++- keyboards/orthograph/keyboard.json | 4 +++- keyboards/takashicompany/mirageix/keyboard.json | 1 - 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/keyboards/amptrics/0422/keyboard.json b/keyboards/amptrics/0422/keyboard.json index 669e355264..09ca2e10c3 100644 --- a/keyboards/amptrics/0422/keyboard.json +++ b/keyboards/amptrics/0422/keyboard.json @@ -15,7 +15,6 @@ "rows": ["A14", "A13", "A10", "A9"] }, "processor": "STM32F072", - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x01A6", diff --git a/keyboards/handwired/hen_des/epssp75/keyboard.json b/keyboards/handwired/hen_des/epssp75/keyboard.json index 4d0739b800..1917fd87cc 100644 --- a/keyboards/handwired/hen_des/epssp75/keyboard.json +++ b/keyboards/handwired/hen_des/epssp75/keyboard.json @@ -6,8 +6,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/handwired/lumawing/keyboard.json b/keyboards/handwired/lumawing/keyboard.json index a99d6d2a2e..8af89134aa 100644 --- a/keyboards/handwired/lumawing/keyboard.json +++ b/keyboards/handwired/lumawing/keyboard.json @@ -1,7 +1,6 @@ { "keyboard_name": "LuMaWing", "manufacturer": "Lucas Mateijsen", - "url": "", "maintainer": "qmk", "usb": { "vid": "0xBB80", @@ -11,7 +10,6 @@ "features": { "bootmagic": true, "command": true, - "console": false, "extrakey": true, "mousekey": true, "nkro": false diff --git a/keyboards/handwired/riblee_split/keyboard.json b/keyboards/handwired/riblee_split/keyboard.json index 6006f0e4c3..2bf78f96f1 100644 --- a/keyboards/handwired/riblee_split/keyboard.json +++ b/keyboards/handwired/riblee_split/keyboard.json @@ -29,7 +29,9 @@ "driver": "usart" }, "transport": { - "sync_matrix_state": true + "sync": { + "matrix_state": true + } } }, "community_layouts": ["ortho_5x12"], diff --git a/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk index 0f3d0657aa..fab9162dc6 100644 --- a/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk +++ b/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk @@ -1,2 +1 @@ POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = yes diff --git a/keyboards/keebio/chiri_ce/rev1/keyboard.json b/keyboards/keebio/chiri_ce/rev1/keyboard.json index f118a4dd1e..9cf7f51654 100644 --- a/keyboards/keebio/chiri_ce/rev1/keyboard.json +++ b/keyboards/keebio/chiri_ce/rev1/keyboard.json @@ -128,7 +128,9 @@ "driver": "vendor" }, "transport": { - "sync_matrix_state": true + "sync": { + "matrix_state": true + } } }, "usb": { diff --git a/keyboards/keebio/iris_ce/rev1/keyboard.json b/keyboards/keebio/iris_ce/rev1/keyboard.json index c5cab98778..5276d626b1 100644 --- a/keyboards/keebio/iris_ce/rev1/keyboard.json +++ b/keyboards/keebio/iris_ce/rev1/keyboard.json @@ -148,7 +148,9 @@ "driver": "vendor" }, "transport": { - "sync_matrix_state": true + "sync":{ + "matrix_state": true + } } }, "usb": { diff --git a/keyboards/orthograph/keyboard.json b/keyboards/orthograph/keyboard.json index d9ec03a7ad..cb259a620b 100644 --- a/keyboards/orthograph/keyboard.json +++ b/keyboards/orthograph/keyboard.json @@ -32,7 +32,9 @@ "pin": "E6" }, "transport": { - "sync_matrix_state": true + "sync": { + "matrix_state": true + } }, "usb_detect":{ "enabled": true diff --git a/keyboards/takashicompany/mirageix/keyboard.json b/keyboards/takashicompany/mirageix/keyboard.json index d151eeb655..580bce64cb 100644 --- a/keyboards/takashicompany/mirageix/keyboard.json +++ b/keyboards/takashicompany/mirageix/keyboard.json @@ -14,7 +14,6 @@ "cols": ["D4", "C6", "D7", "E6", "B4", "B5"], "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"] }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x0065", From e73b3c08a060bbb0e5a94ee3ac7023a17cea0402 Mon Sep 17 00:00:00 2001 From: Infos <136488157+diffrentGuesser@users.noreply.github.com> Date: Sun, 18 May 2025 05:28:24 +0200 Subject: [PATCH 379/592] Add Zeropad (#24737) Co-authored-by: Drashna Jaelre Co-authored-by: Joel Challis --- keyboards/handwired/zeropad/keyboard.json | 38 +++++++++++++++++++ .../zeropad/keymaps/default/keymap.c | 13 +++++++ keyboards/handwired/zeropad/readme.md | 27 +++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 keyboards/handwired/zeropad/keyboard.json create mode 100644 keyboards/handwired/zeropad/keymaps/default/keymap.c create mode 100644 keyboards/handwired/zeropad/readme.md diff --git a/keyboards/handwired/zeropad/keyboard.json b/keyboards/handwired/zeropad/keyboard.json new file mode 100644 index 0000000000..40bf6c8c2a --- /dev/null +++ b/keyboards/handwired/zeropad/keyboard.json @@ -0,0 +1,38 @@ +{ + "manufacturer": "Leon Sieber", + "keyboard_name": "ZeroPad", + "maintainer": "diffrentGuesser", + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["D1", "D0", "D4"], + "rows": ["C6", "D7", "E6"], + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0x5A50" + }, + "community_layouts": [ "ortho_3x3" ], + "layouts": { + "LAYOUT_ortho_3x3": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"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/handwired/zeropad/keymaps/default/keymap.c b/keyboards/handwired/zeropad/keymaps/default/keymap.c new file mode 100644 index 0000000000..aa674bcbda --- /dev/null +++ b/keyboards/handwired/zeropad/keymaps/default/keymap.c @@ -0,0 +1,13 @@ +// 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_ortho_3x3( + KC_1, KC_2, KC_3, + KC_4, KC_5, KC_6, + KC_7, KC_8, KC_9 + ) +}; diff --git a/keyboards/handwired/zeropad/readme.md b/keyboards/handwired/zeropad/readme.md new file mode 100644 index 0000000000..c021d7dc05 --- /dev/null +++ b/keyboards/handwired/zeropad/readme.md @@ -0,0 +1,27 @@ +# ZeroPad + +![ZeroPad](https://i.imgur.com/KBkI4q1.jpeg) + +This keyboard is inspired by the scotto9 from Joe Scotto. This keyboard is compatible with via and has 4 layers of keybinds (24 keybinds - 4x8 + 1 per layer for changing the layer). + +* Keyboard Maintainer: [Leon Sieber](https://github.com/diffrentGuesser) +* Hardware Supported: Pro Micro, 3 pin switches +* Hardware Availability: [Pro Micro](https://de.aliexpress.com/item/32846843498.html?spm=a2g0o.cart.0.0.146d4ae4kCjqDY&mp=1&gatewayAdapt=glo2deu), [switches](https://de.aliexpress.com/item/1005007135709029.html?spm=a2g0o.cart.0.0.146d4ae4kCjqDY&mp=1&gatewayAdapt=glo2deu) + +Make example for this keyboard (after setting up your build environment): + + make handwired/zeropad:default + +Flashing example for this keyboard: + + make handwired/zeropad: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 top left key) and plug in the keyboard +* **Physical reset**: Short the GND and the RST pins on the Pro Micro. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 0f948fe039fd44d6237653316aafa6ba3d195b1d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 18 May 2025 16:28:42 +0100 Subject: [PATCH 380/592] Add Waveshare RP2040-Keyboard-3 support (#25269) --- .../waveshare/rp2040_keyboard_3/keyboard.json | 84 +++++++++++++++++++ .../keymaps/default/keymap.c | 8 ++ .../waveshare/rp2040_keyboard_3/readme.md | 28 +++++++ 3 files changed, 120 insertions(+) create mode 100644 keyboards/waveshare/rp2040_keyboard_3/keyboard.json create mode 100644 keyboards/waveshare/rp2040_keyboard_3/keymaps/default/keymap.c create mode 100644 keyboards/waveshare/rp2040_keyboard_3/readme.md diff --git a/keyboards/waveshare/rp2040_keyboard_3/keyboard.json b/keyboards/waveshare/rp2040_keyboard_3/keyboard.json new file mode 100644 index 0000000000..1c8bd11de5 --- /dev/null +++ b/keyboards/waveshare/rp2040_keyboard_3/keyboard.json @@ -0,0 +1,84 @@ +{ + "manufacturer": "Waveshare", + "keyboard_name": "RP2040-Keyboard-3", + "maintainer": "zvecr", + "url": "https://www.waveshare.com/wiki/RP2040-Keyboard-3", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0xFEED", + "pid": "0x0000", + "device_version": "1.0.0" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "rgb_matrix": { + "driver": "ws2812", + "animations": { + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true + }, + "layout": [ + {"flags": 4, "matrix": [0, 0], "x": 50, "y": 20}, + {"flags": 4, "matrix": [0, 1], "x": 112, "y": 20}, + {"flags": 4, "matrix": [0, 2], "x": 162, "y": 20} + ], + "sleep": true + }, + "ws2812": { + "driver": "vendor", + "pin": "GP18" + }, + "matrix_pins": { + "direct": [ + ["GP14", "GP13", "GP12"] + ] + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0} + ] + } + } +} diff --git a/keyboards/waveshare/rp2040_keyboard_3/keymaps/default/keymap.c b/keyboards/waveshare/rp2040_keyboard_3/keymaps/default/keymap.c new file mode 100644 index 0000000000..4b95bf189e --- /dev/null +++ b/keyboards/waveshare/rp2040_keyboard_3/keymaps/default/keymap.c @@ -0,0 +1,8 @@ +// Copyright 2025 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_LCTL, KC_C, KC_V) +}; diff --git a/keyboards/waveshare/rp2040_keyboard_3/readme.md b/keyboards/waveshare/rp2040_keyboard_3/readme.md new file mode 100644 index 0000000000..c6f5f5e122 --- /dev/null +++ b/keyboards/waveshare/rp2040_keyboard_3/readme.md @@ -0,0 +1,28 @@ +# RP2040-Keyboard-3 + +![waveshare/rp2040_keyboard_3](https://i.imgur.com/HYoHwVk.jpeg) + +RP2040-Keyboard-3 is a high-performance, cost-effective three-key keyboard development board designed by Waveshare. +It features programmable custom key functions and RGB lighting effects. + +* Keyboard Maintainer: [zvecr](https://github.com/zvecr) +* Hardware Supported: +* Hardware Availability: + +Make example for this keyboard (after setting up your build environment): + + make waveshare/rp2040_keyboard_3:default + +Flashing example for this keyboard: + + make waveshare/rp2040_keyboard_3: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 (top left key) and plug in the keyboard +* **Physical reset button**: Press and hold the `BOOT` button, then briefly press the `RESET` button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 02517bd8069ea6d22a3b10945611b0170f7ef7d4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 18 May 2025 16:42:43 +0100 Subject: [PATCH 381/592] Update PR checklist notes on custom matrix (#25240) --- docs/pr_checklist.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/pr_checklist.md b/docs/pr_checklist.md index 268e3b1b11..61119178bb 100644 --- a/docs/pr_checklist.md +++ b/docs/pr_checklist.md @@ -127,7 +127,8 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard - empty `xxxx_xxxx_kb()`, `xxxx_xxxx_user()`, or other weak-defined default implemented functions removed - commented-out functions removed too - `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions#keyboard_pre_init_-function-documentation) - - prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix#lite) + - when configuring custom matrix, the 'lite' variant (`CUSTOM_MATRIX = lite`) must be used where possible, as this allows for standard debounce. See [custom matrix 'lite'](custom_matrix#lite) + - justification for full custom matrix (`CUSTOM_MATRIX = yes`) must be provided when used - prefer LED indicator [Configuration Options](features/led_indicators#configuration-options) to custom `led_update_*()` implementations where possible - hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here - `.h` From 81355045cc7a59238485d340724a01f6d1d5d537 Mon Sep 17 00:00:00 2001 From: Florent Linguenheld Date: Sun, 18 May 2025 19:53:00 +0200 Subject: [PATCH 382/592] Chew folders (#24785) --- keyboards/chew/info.json | 17 +++++++ keyboards/chew/{ => mono}/config.h | 2 - keyboards/chew/mono/keyboard.json | 48 +++++++++++++++++++ keyboards/chew/mono/keymaps/default/keymap.c | 25 ++++++++++ keyboards/chew/mono/readme.md | 37 ++++++++++++++ keyboards/chew/readme.md | 36 ++------------ keyboards/chew/split/config.h | 8 ++++ keyboards/chew/{ => split}/keyboard.json | 20 ++------ .../chew/{ => split}/keymaps/default/keymap.c | 0 keyboards/chew/split/readme.md | 38 +++++++++++++++ 10 files changed, 182 insertions(+), 49 deletions(-) create mode 100644 keyboards/chew/info.json rename keyboards/chew/{ => mono}/config.h (94%) create mode 100644 keyboards/chew/mono/keyboard.json create mode 100644 keyboards/chew/mono/keymaps/default/keymap.c create mode 100644 keyboards/chew/mono/readme.md create mode 100644 keyboards/chew/split/config.h rename keyboards/chew/{ => split}/keyboard.json (87%) rename keyboards/chew/{ => split}/keymaps/default/keymap.c (100%) create mode 100644 keyboards/chew/split/readme.md diff --git a/keyboards/chew/info.json b/keyboards/chew/info.json new file mode 100644 index 0000000000..306e7f3057 --- /dev/null +++ b/keyboards/chew/info.json @@ -0,0 +1,17 @@ +{ + "manufacturer": "florent@linguenheld.fr", + "maintainer": "florent@linguenheld.fr", + "bootloader": "rp2040", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + } +} diff --git a/keyboards/chew/config.h b/keyboards/chew/mono/config.h similarity index 94% rename from keyboards/chew/config.h rename to keyboards/chew/mono/config.h index df672bc4e1..bb047c0adf 100644 --- a/keyboards/chew/config.h +++ b/keyboards/chew/mono/config.h @@ -6,5 +6,3 @@ /* Flash */ #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // In ms in which the double tap can occur - -#define EE_HANDS diff --git a/keyboards/chew/mono/keyboard.json b/keyboards/chew/mono/keyboard.json new file mode 100644 index 0000000000..9e48102367 --- /dev/null +++ b/keyboards/chew/mono/keyboard.json @@ -0,0 +1,48 @@ +{ + "keyboard_name": "chew/mono", + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": ["GP28", "GP27", "GP26", "GP15", "GP14", "GP4", "GP3", "GP2", "GP1", "GP0"], + "rows": ["GP5", "GP6", "GP7", "GP8"] + }, + "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}, + {"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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3} + ] + } + } +} diff --git a/keyboards/chew/mono/keymaps/default/keymap.c b/keyboards/chew/mono/keymaps/default/keymap.c new file mode 100644 index 0000000000..0a69b72f85 --- /dev/null +++ b/keyboards/chew/mono/keymaps/default/keymap.c @@ -0,0 +1,25 @@ +// Copyright 2024 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ + * ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ + * │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ + * ├───┼───┼───┼───┼───┴───┼───┼───┼───┼───┤ + * │ Z │ X │ C │ V │ │ M │ , │ . │ / │ + * └───┴───┼───┼───┼───┬───┼───┼───┼───┴───┘ + * │ B │Bsp│Alt│ ␣ │Ent│ N │ + * └───┴───┴───┴───┴───┴───┘ + */ + [0] = LAYOUT( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + KC_Z, KC_X, KC_C, KC_V, KC_M, KC_COMM, KC_DOT, KC_SLSH, + KC_B, KC_BSPC, KC_RALT, KC_SPC, KC_ENT, KC_N + + ) +}; diff --git a/keyboards/chew/mono/readme.md b/keyboards/chew/mono/readme.md new file mode 100644 index 0000000000..a0c15170e4 --- /dev/null +++ b/keyboards/chew/mono/readme.md @@ -0,0 +1,37 @@ +## Chew Mono + +[![Chew mono front photo](https://live.staticflickr.com/65535/53759880304_2e97179f76_b.jpg)](https://live.staticflickr.com/65535/53759880304_b9eb4130cf_o.png) +[![Chew mono front photo](https://live.staticflickr.com/65535/53759543226_57e3d6354f_b.jpg)](https://live.staticflickr.com/65535/53759543226_decbf17d2a_o.png) + +A crunched *monobloc* 34 key choc-spaced keyboard. + +- Keyboard Maintainer: [Florent Linguenheld](https://github.com/flinguenheld/) +- Visit the repository to get the last release: [Chew](https://github.com/flinguenheld/chew) +- Read the wiki to have some help or information: [Chew wiki](https://github.com/flinguenheld/chew/wiki) + + +![fox](https://github.com/flinguenheld/chew/blob/main/images/fox_brown.png?raw=true) + +### Requirements + +- 1x PCB +- 1x MCU board [RP2040-Zero](https://www.waveshare.com/wiki/RP2040-Zero) +- 34x [1N4148W SMD diodes](https://splitkb.com/collections/keyboard-parts/products/smd-diodes) +- 34x switches Choc V1 **only** +- 34x keycaps Choc V1 + +Optional: +- 18x [Mill Max sockets](https://splitkb.com/collections/keyboard-parts/products/mill-max-low-profile-sockets) +- 34x [kailh hotswap sockets](https://cdn.shopify.com/s/files/1/0588/1108/9090/files/5118-Choc-Socket.pdf?v=1686715063) +- 1x Back PCB + screws and bolts + +### Bootloader + +The controller has two buttons, so you can enter the bootloader in 2 ways: + +- Maintain the **boot** button and plug the usb cable in. +- Press twice the **reset** button. + +![sausages](https://github.com/flinguenheld/chew/blob/main/images/sausages.png?raw=true) + +[![Chew mono back photo](https://live.staticflickr.com/65535/53758638612_167c55f840_o.png)](https://live.staticflickr.com/65535/53758638612_167c55f840_o.png) diff --git a/keyboards/chew/readme.md b/keyboards/chew/readme.md index a08398ea0f..d478f86c49 100644 --- a/keyboards/chew/readme.md +++ b/keyboards/chew/readme.md @@ -1,38 +1,12 @@ -## Chew +## Chew Mono -![Chew front photo](https://live.staticflickr.com/65535/53681212617_90e4eebaf9_o.jpg) -![Chew front photo](https://live.staticflickr.com/65535/53682442119_1fcea26fef_o.jpg) +[![Chew both](https://live.staticflickr.com/65535/53759959610_2960edcb50_b.jpg)](https://live.staticflickr.com/65535/53759959610_0c255fe2d4_o.png) -A humble 34 key choc-spaced keyboard. +A crunched 34 key choc-spaced keyboard. +Built with a RP2040 zero and available in [monobloc](https://github.com/qmk/qmk_firmware/tree/master/keyboards/chew/mono) and [splitted](https://github.com/qmk/qmk_firmware/tree/master/keyboards/chew/split) flavors. - Keyboard Maintainer: [Florent Linguenheld](https://github.com/flinguenheld/) - Visit the repository to get the last release: [Chew](https://github.com/flinguenheld/chew) - Read the wiki to have some help or information: [Chew wiki](https://github.com/flinguenheld/chew/wiki) - -![squirrel](https://github.com/flinguenheld/chew/blob/main/images/squirrel_brown.png?raw=true) - -### Requirements - -- 2x PCB -- 2x MCU board [RP2040-Zero](https://www.waveshare.com/wiki/RP2040-Zero) -- 2x TRRS jack -- 34 switches Choc V1 **only** -- 34 keycaps Choc V1 - -Optional: -- 23 [Mill Max sockets](https://splitkb.com/collections/keyboard-parts/products/mill-max-low-profile-sockets) -- 34 [kailh hotswap sockets](https://cdn.shopify.com/s/files/1/0588/1108/9090/files/5118-Choc-Socket.pdf?v=1686715063) -- 2x Back PCB + screws and bolts -- 2x [Tenting pucks](https://splitkb.com/collections/keyboard-parts/products/tenting-puck) -- 2x [Tripods](https://www.manfrotto.com/us-en/pocket-support-large-black-mp3-bk/) - -### Bootloader - -The controller has two buttons, so you can enter the bootloader in 2 ways: - -- Maintain the **boot** button and plug the usb cable in. -- Press twice the **reset** button. - -![hazelnuts](https://github.com/flinguenheld/chew/blob/main/images/hazelnuts.png?raw=true) -![Chew back photo](https://live.staticflickr.com/65535/53682442124_677ffa6cb5_o.jpg) +![fox](https://github.com/flinguenheld/chew/blob/main/images/fox_brown.png?raw=true) diff --git a/keyboards/chew/split/config.h b/keyboards/chew/split/config.h new file mode 100644 index 0000000000..bb047c0adf --- /dev/null +++ b/keyboards/chew/split/config.h @@ -0,0 +1,8 @@ +// Copyright 2024 Florent (@FLinguenheld) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Flash */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // In ms in which the double tap can occur diff --git a/keyboards/chew/keyboard.json b/keyboards/chew/split/keyboard.json similarity index 87% rename from keyboards/chew/keyboard.json rename to keyboards/chew/split/keyboard.json index 304f788af3..2a0245a9b4 100644 --- a/keyboards/chew/keyboard.json +++ b/keyboards/chew/split/keyboard.json @@ -1,14 +1,5 @@ { - "manufacturer": "florent@linguenheld.fr", - "keyboard_name": "chew", - "maintainer": "florent@linguenheld.fr", - "bootloader": "rp2040", - "features": { - "bootmagic": true, - "extrakey": true, - "mousekey": true, - "nkro": true - }, + "keyboard_name": "chew/split", "matrix_pins": { "direct": [ ["GP4", "GP3", "GP2", "GP1", "GP0"], @@ -17,9 +8,11 @@ ["GP7", "GP6", "GP5", "NO_PIN", "NO_PIN"] ] }, - "processor": "RP2040", "split": { "enabled": true, + "handedness": { + "pin": "GP10" + }, "matrix_pins": { "right": { "direct": [ @@ -38,11 +31,6 @@ "watchdog": true } }, - "usb": { - "device_version": "1.0.0", - "pid": "0x0000", - "vid": "0xFEED" - }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/chew/keymaps/default/keymap.c b/keyboards/chew/split/keymaps/default/keymap.c similarity index 100% rename from keyboards/chew/keymaps/default/keymap.c rename to keyboards/chew/split/keymaps/default/keymap.c diff --git a/keyboards/chew/split/readme.md b/keyboards/chew/split/readme.md new file mode 100644 index 0000000000..b47d5ac0fa --- /dev/null +++ b/keyboards/chew/split/readme.md @@ -0,0 +1,38 @@ +## Chew Split + +[![Chew](https://live.staticflickr.com/65535/53745130678_97ce7dfedf_b.jpg)](https://live.staticflickr.com/65535/53745130678_2d3318d279_o.png) +[![Chew](https://live.staticflickr.com/65535/53745130683_c98f1a152b_b.jpg)](https://live.staticflickr.com/65535/53745130683_90aa38b210_o.png) + +A crunched 34 key choc-spaced keyboard. + +- Keyboard Maintainer: [Florent Linguenheld](https://github.com/flinguenheld/) +- Visit the repository to get the last release: [Chew](https://github.com/flinguenheld/chew) +- Read the wiki to have some help or information: [Chew wiki](https://github.com/flinguenheld/chew/wiki) + + +![squirrel](https://github.com/flinguenheld/chew/blob/main/images/squirrel_brown.png?raw=true) + +### Requirements + +- 2x PCB +- 2x MCU board [RP2040-Zero](https://www.waveshare.com/wiki/RP2040-Zero) +- 2x TRRS jack +- 34 switches Choc V1 **only** +- 34 keycaps Choc V1 + +Optional: +- 23 [Mill Max sockets](https://splitkb.com/collections/keyboard-parts/products/mill-max-low-profile-sockets) +- 34 [kailh hotswap sockets](https://cdn.shopify.com/s/files/1/0588/1108/9090/files/5118-Choc-Socket.pdf?v=1686715063) +- 2x Back PCB + screws and bolts +- 2x [Tenting pucks](https://splitkb.com/collections/keyboard-parts/products/tenting-puck) +- 2x [Tripods](https://www.manfrotto.com/us-en/pocket-support-large-black-mp3-bk/) + +### Bootloader + +The controller has two buttons, so you can enter the bootloader in 2 ways: + +- Maintain the **boot** button and plug the usb cable in. +- Press twice the **reset** button. + +![hazelnuts](https://github.com/flinguenheld/chew/blob/main/images/hazelnuts.png?raw=true) +[![Chew](https://live.staticflickr.com/65535/53744026347_a95fe6d897_b.jpg)](https://live.staticflickr.com/65535/53744026347_a0a3bbedb4_o.png) From a4ef1ae736cd58375affed966cf1399fe8df5774 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 19 May 2025 09:22:31 +1000 Subject: [PATCH 383/592] gcc15 AVR compilation fixes (#25238) --- Makefile | 1 + builddefs/build_keyboard.mk | 1 + builddefs/build_test.mk | 1 + builddefs/support.mk | 11 +++++++++++ platforms/avr/platform.mk | 13 ++++++++----- 5 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 builddefs/support.mk diff --git a/Makefile b/Makefile index c68ee7418a..f1e3bf856f 100644 --- a/Makefile +++ b/Makefile @@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),) endif include paths.mk +include $(BUILDDEFS_PATH)/support.mk TEST_OUTPUT_DIR := $(BUILD_DIR)/test ERROR_FILE := $(BUILD_DIR)/error_occurred diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk index c2c47c00fb..640dedc31e 100644 --- a/builddefs/build_keyboard.mk +++ b/builddefs/build_keyboard.mk @@ -11,6 +11,7 @@ endif .DEFAULT_GOAL := all include paths.mk +include $(BUILDDEFS_PATH)/support.mk include $(BUILDDEFS_PATH)/message.mk # Helper to add defines with a 'QMK_' prefix diff --git a/builddefs/build_test.mk b/builddefs/build_test.mk index d0de63c6f5..0c5c98e2a3 100644 --- a/builddefs/build_test.mk +++ b/builddefs/build_test.mk @@ -7,6 +7,7 @@ endif OPT = g include paths.mk +include $(BUILDDEFS_PATH)/support.mk include $(BUILDDEFS_PATH)/message.mk TARGET=test/$(TEST_OUTPUT) diff --git a/builddefs/support.mk b/builddefs/support.mk new file mode 100644 index 0000000000..7ef7b9b041 --- /dev/null +++ b/builddefs/support.mk @@ -0,0 +1,11 @@ +# Helper to determine if a compiler option is supported +# Args: +# $(1) = option to test, if successful will be output +# $(2) = option to use if $(1) is not supported +# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output +cc-option = $(shell \ + if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \ + then echo "$(1)"; else echo "$(2)"; fi) + +# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments) +, := , diff --git a/platforms/avr/platform.mk b/platforms/avr/platform.mk index a625f2e5d0..f0187457b3 100644 --- a/platforms/avr/platform.mk +++ b/platforms/avr/platform.mk @@ -12,9 +12,10 @@ HEX = $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature EEP = $(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) BIN = -ifeq ("$(shell echo "int main(){}" | $(CC) --param=min-pagesize=0 -x c - -o /dev/null 2>&1)", "") -COMPILEFLAGS += --param=min-pagesize=0 -endif +COMPILEFLAGS += $(call cc-option,--param=min-pagesize=0) + +# Fix ICE's: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116389 +COMPILEFLAGS += $(call cc-option,-mlra) COMPILEFLAGS += -funsigned-char COMPILEFLAGS += -funsigned-bitfields @@ -25,10 +26,12 @@ COMPILEFLAGS += -fshort-enums COMPILEFLAGS += -mcall-prologues COMPILEFLAGS += -fno-builtin-printf -# Linker relaxation is only possible if -# link time optimizations are not enabled. +# On older compilers, linker relaxation is only possible if link time optimizations are not enabled. ifeq ($(strip $(LTO_ENABLE)), no) COMPILEFLAGS += -mrelax +else + # Newer compilers may support both, so quickly check before adding `-mrelax`. + COMPILEFLAGS += $(call cc-option,-mrelax,,-flto=auto) endif ASFLAGS += $(AVR_ASFLAGS) From f686ad9e6361e05fcfa78f453f90cd72181a7516 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Mon, 19 May 2025 07:51:28 +0200 Subject: [PATCH 384/592] [Core] STM32G0x1 support (#24301) --- builddefs/common_features.mk | 2 +- data/schemas/keyboard.jsonschema | 1 + .../handwired/onekey/weact_g0b1cb/config.h | 28 ++ .../handwired/onekey/weact_g0b1cb/halconf.h | 11 + .../onekey/weact_g0b1cb/keyboard.json | 20 ++ .../handwired/onekey/weact_g0b1cb/mcuconf.h | 18 + .../handwired/onekey/weact_g0b1cb/readme.md | 5 + lib/chibios | 2 +- lib/python/qmk/constants.py | 3 +- .../GENERIC_STM32_G0B1XB/board/board.mk | 12 + .../boards/GENERIC_STM32_G0B1XB/board/extra.c | 68 ++++ .../GENERIC_STM32_G0B1XB/configs/config.h | 7 + .../GENERIC_STM32_G0B1XB/configs/mcuconf.h | 310 ++++++++++++++++++ .../chibios/boards/common/ld/STM32G0B1xB.ld | 85 +++++ platforms/chibios/drivers/analog.c | 23 +- platforms/chibios/mcu_selection.mk | 35 ++ 16 files changed, 625 insertions(+), 5 deletions(-) create mode 100644 keyboards/handwired/onekey/weact_g0b1cb/config.h create mode 100644 keyboards/handwired/onekey/weact_g0b1cb/halconf.h create mode 100644 keyboards/handwired/onekey/weact_g0b1cb/keyboard.json create mode 100644 keyboards/handwired/onekey/weact_g0b1cb/mcuconf.h create mode 100644 keyboards/handwired/onekey/weact_g0b1cb/readme.md create mode 100644 platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/board.mk create mode 100644 platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/extra.c create mode 100644 platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/config.h create mode 100644 platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/mcuconf.h create mode 100644 platforms/chibios/boards/common/ld/STM32G0B1xB.ld diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 48a976d663..9a87a6ce02 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -219,7 +219,7 @@ ifneq ($(strip $(EEPROM_DRIVER)),none) COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash COMMON_VPATH += $(DRIVER_PATH)/flash SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c - else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),) + else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),) # Wear-leveling EEPROM implementation, backed by MCU flash OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING SRC += eeprom_driver.c eeprom_wear_leveling.c diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index c22b0ff0da..6c9c703bda 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -84,6 +84,7 @@ "STM32F407", "STM32F411", "STM32F446", + "STM32G0B1", "STM32G431", "STM32G474", "STM32H723", diff --git a/keyboards/handwired/onekey/weact_g0b1cb/config.h b/keyboards/handwired/onekey/weact_g0b1cb/config.h new file mode 100644 index 0000000000..b4550b15f4 --- /dev/null +++ b/keyboards/handwired/onekey/weact_g0b1cb/config.h @@ -0,0 +1,28 @@ +// Copyright 2025 Stefan Kerkmann (@karlk90) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define ADC_PIN A0 + +#define BACKLIGHT_PAL_MODE 1 +#define BACKLIGHT_PWM_CHANNEL 1 +#define BACKLIGHT_PWM_DRIVER PWMD3 + +#define I2C1_SCL_PAL_MODE 6 +#define I2C1_SDA_PAL_MODE 6 + +#define LCD_RST_PIN B12 +#define LCD_DC_PIN B11 +#define LCD_CS_PIN B10 + +#define SPI_MOSI_PAL_MODE 0 +#define SPI_MISO_PAL_MODE 0 +#define SPI_SCK_PAL_MODE 0 + +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_DMA_CHANNEL 2 +#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM3_UP +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_PAL_MODE 1 diff --git a/keyboards/handwired/onekey/weact_g0b1cb/halconf.h b/keyboards/handwired/onekey/weact_g0b1cb/halconf.h new file mode 100644 index 0000000000..2d6f87eba2 --- /dev/null +++ b/keyboards/handwired/onekey/weact_g0b1cb/halconf.h @@ -0,0 +1,11 @@ +// Copyright 2025 Stefan Kerkmann (@karlk90) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_ADC TRUE +#define HAL_USE_I2C TRUE +#define HAL_USE_PWM TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/handwired/onekey/weact_g0b1cb/keyboard.json b/keyboards/handwired/onekey/weact_g0b1cb/keyboard.json new file mode 100644 index 0000000000..bb1ce7d5ca --- /dev/null +++ b/keyboards/handwired/onekey/weact_g0b1cb/keyboard.json @@ -0,0 +1,20 @@ +{ + "keyboard_name": "Onekey WeAct G0B1CB", + "processor": "STM32G0B1", + "bootloader": "stm32-dfu", + "matrix_pins": { + "cols": ["B4"], + "rows": ["B5"] + }, + "backlight": { + "pin": "C6" + }, + "ws2812": { + "driver": "pwm", + "pin": "B0" + }, + "apa102": { + "data_pin": "B15", + "clock_pin": "B13" + } +} diff --git a/keyboards/handwired/onekey/weact_g0b1cb/mcuconf.h b/keyboards/handwired/onekey/weact_g0b1cb/mcuconf.h new file mode 100644 index 0000000000..50f2bcf627 --- /dev/null +++ b/keyboards/handwired/onekey/weact_g0b1cb/mcuconf.h @@ -0,0 +1,18 @@ +// Copyright 2025 Stefan Kerkmann (@karlk90) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_ADC_USE_ADC1 +#define STM32_ADC_USE_ADC1 TRUE + +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/handwired/onekey/weact_g0b1cb/readme.md b/keyboards/handwired/onekey/weact_g0b1cb/readme.md new file mode 100644 index 0000000000..4119ffa2ed --- /dev/null +++ b/keyboards/handwired/onekey/weact_g0b1cb/readme.md @@ -0,0 +1,5 @@ +# WeAct Studio STM32G0B1CB onekey + +Supported Hardware: + +To trigger keypress, short together pins *B4* and *B5*. diff --git a/lib/chibios b/lib/chibios index 2365f84429..8bd61b8043 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit 2365f844292513ea0ee9eea6ab778d56f9ccd3b9 +Subproject commit 8bd61b804303f1614d574546c2dd735eeabb09f5 diff --git a/lib/python/qmk/constants.py b/lib/python/qmk/constants.py index e055d3fbc9..e3e47c2bd2 100644 --- a/lib/python/qmk/constants.py +++ b/lib/python/qmk/constants.py @@ -22,7 +22,7 @@ QMK_FIRMWARE_UPSTREAM = 'qmk/qmk_firmware' MAX_KEYBOARD_SUBFOLDERS = 5 # Supported processor types -CHIBIOS_PROCESSORS = 'cortex-m0', 'cortex-m0plus', 'cortex-m3', 'cortex-m4', 'MKL26Z64', 'MK20DX128', 'MK20DX256', 'MK64FX512', 'MK66FX1M0', 'RP2040', 'STM32F042', 'STM32F072', 'STM32F103', 'STM32F303', 'STM32F401', 'STM32F405', 'STM32F407', 'STM32F411', 'STM32F446', 'STM32G431', 'STM32G474', 'STM32H723', 'STM32H733', 'STM32L412', 'STM32L422', 'STM32L432', 'STM32L433', 'STM32L442', 'STM32L443', 'GD32VF103', 'WB32F3G71', 'WB32FQ95', 'AT32F415' +CHIBIOS_PROCESSORS = 'cortex-m0', 'cortex-m0plus', 'cortex-m3', 'cortex-m4', 'MKL26Z64', 'MK20DX128', 'MK20DX256', 'MK64FX512', 'MK66FX1M0', 'RP2040', 'STM32F042', 'STM32F072', 'STM32F103', 'STM32F303', 'STM32F401', 'STM32F405', 'STM32F407', 'STM32F411', 'STM32F446', 'STM32G0B1', 'STM32G431', 'STM32G474', 'STM32H723', 'STM32H733', 'STM32L412', 'STM32L422', 'STM32L432', 'STM32L433', 'STM32L442', 'STM32L443', 'GD32VF103', 'WB32F3G71', 'WB32FQ95', 'AT32F415' LUFA_PROCESSORS = 'at90usb162', 'atmega16u2', 'atmega32u2', 'atmega16u4', 'atmega32u4', 'at90usb646', 'at90usb647', 'at90usb1286', 'at90usb1287', None VUSB_PROCESSORS = 'atmega32a', 'atmega328p', 'atmega328', 'attiny85' @@ -42,6 +42,7 @@ MCU2BOOTLOADER = { "STM32F407": "stm32-dfu", "STM32F411": "stm32-dfu", "STM32F446": "stm32-dfu", + "STM32G0B1": "stm32-dfu", "STM32G431": "stm32-dfu", "STM32G474": "stm32-dfu", "STM32H723": "stm32-dfu", diff --git a/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/board.mk b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/board.mk new file mode 100644 index 0000000000..7e551e4dc7 --- /dev/null +++ b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/board.mk @@ -0,0 +1,12 @@ +# List of all the board related files. +BOARDSRC = $(CHIBIOS)/os/hal/boards/ST_NUCLEO64_G0B1RE/board.c + +# Extra files +BOARDSRC += $(BOARD_PATH)/board/extra.c + +# Required include directories +BOARDINC = $(CHIBIOS)/os/hal/boards/ST_NUCLEO64_G0B1RE + +# Shared variables +ALLCSRC += $(BOARDSRC) +ALLINC += $(BOARDINC) diff --git a/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/extra.c b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/extra.c new file mode 100644 index 0000000000..4dbc5dd8b4 --- /dev/null +++ b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/board/extra.c @@ -0,0 +1,68 @@ +// Copyright 2025 Stefan Kerkmann (@karlk90) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +#define FLASH_OPTKEY1 0x08192A3BU +#define FLASH_OPTKEY2 0x4C5D6E7FU +#define FLASH_OPTR_CLR_MASK (FLASH_OPTR_nBOOT_SEL) +#define FLASH_OPTR_SET_MASK (FLASH_OPTR_NRST_MODE_Msk) + +static void wait_for_flash(void) { + while (READ_BIT(FLASH->SR, FLASH_SR_BSY1)) { + } +} + +void __attribute__((constructor)) enable_boot0_and_nrst_pin(void) { + // Only apply on STM32G0x1 devices, see RM0444 Rev 6, Table 265: "DEV_ID + // and REV_ID field values." + switch (READ_BIT(DBG->IDCODE, DBG_IDCODE_DEV_ID)) { + case 0x467: // STM32G0B1xx and STM32G0C1xx + case 0x460: // STM32G071xx and STM32G081xx + case 0x456: // STM32G051xx and STM32G061xx + case 0x466: // STM32G041xx and STM32G031xx + break; + default: + return; + } + + uint32_t optr = FLASH->OPTR; + + // Make sure that: + // 1. legacy boot0 pin handling is enabled. + // OPTR[24] = 0 + // 2. legacy nRST pin handling is enabled. + // OPTR[28:27] = 0b11 + // To match the default behavior found in older (F0/F1/F3/F4) STM32 devices. + if (READ_BIT(optr, FLASH_OPTR_CLR_MASK) || (READ_BIT(optr, FLASH_OPTR_SET_MASK) != FLASH_OPTR_SET_MASK)) { + if (READ_BIT(FLASH->CR, FLASH_CR_LOCK)) { + WRITE_REG(FLASH->KEYR, FLASH_KEY1); + WRITE_REG(FLASH->KEYR, FLASH_KEY2); + while (READ_BIT(FLASH->CR, FLASH_CR_LOCK)) { + } + wait_for_flash(); + } + if (READ_BIT(FLASH->CR, FLASH_CR_OPTLOCK)) { + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1); + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2); + while (READ_BIT(FLASH->CR, FLASH_CR_OPTLOCK)) { + } + wait_for_flash(); + } + + MODIFY_REG(FLASH->OPTR, FLASH_OPTR_CLR_MASK, FLASH_OPTR_SET_MASK); + wait_for_flash(); + + SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT); + wait_for_flash(); + + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT); + wait_for_flash(); + + // Launch the option byte (re)loading, which resets the device. This + // should not return. + SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH); + } +} diff --git a/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/config.h new file mode 100644 index 0000000000..bb2d1b5816 --- /dev/null +++ b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 Stefan Kerkmann (@karlk90) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP +# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE +#endif diff --git a/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/mcuconf.h b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/mcuconf.h new file mode 100644 index 0000000000..80726e0308 --- /dev/null +++ b/platforms/chibios/boards/GENERIC_STM32_G0B1XB/configs/mcuconf.h @@ -0,0 +1,310 @@ +/* + ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * STM32G0xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 3...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#ifndef MCUCONF_H +#define MCUCONF_H + +#define STM32G0xx_MCUCONF +#define STM32G0B1_MCUCONF +#define STM32G0C1_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_CLOCK_DYNAMIC TRUE +#define STM32_VOS STM32_VOS_RANGE1 +#define STM32_PWR_CR2 (STM32_PVDRT_LEV0 | STM32_PVDFT_LEV0 | STM32_PVDE_DISABLED) +#define STM32_PWR_CR3 (PWR_CR3_EIWUL) +#define STM32_PWR_CR4 (0U) +#define STM32_PWR_PUCRA (0U) +#define STM32_PWR_PDCRA (0U) +#define STM32_PWR_PUCRB (0U) +#define STM32_PWR_PDCRB (0U) +#define STM32_PWR_PUCRC (0U) +#define STM32_PWR_PDCRC (0U) +#define STM32_PWR_PUCRD (0U) +#define STM32_PWR_PDCRD (0U) +#define STM32_PWR_PUCRE (0U) +#define STM32_PWR_PDCRE (0U) +#define STM32_PWR_PUCRF (0U) +#define STM32_PWR_PDCRF (0U) +#define STM32_HSIDIV_VALUE 1 +#define STM32_HSI16_ENABLED TRUE +#define STM32_HSI48_ENABLED TRUE +#define STM32_HSE_ENABLED FALSE +#define STM32_LSI_ENABLED FALSE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLLRCLK +#define STM32_PLLSRC STM32_PLLSRC_HSI16 +#define STM32_PLLM_VALUE 2 +#define STM32_PLLN_VALUE 16 +#define STM32_PLLP_VALUE 2 +#define STM32_PLLQ_VALUE 4 +#define STM32_PLLR_VALUE 2 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE STM32_PPRE_DIV1 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_MCOPRE STM32_MCOPRE_DIV1 +#define STM32_LSCOSEL STM32_LSCOSEL_NOCLOCK + +/* + * Peripherals clocks and sources. + */ +#define STM32_FDCANSEL STM32_USBSEL_HSI48 +#define STM32_USBSEL STM32_USBSEL_HSI48 +#define STM32_USART1SEL STM32_USART1SEL_SYSCLK +#define STM32_USART2SEL STM32_USART2SEL_SYSCLK +#define STM32_USART3SEL STM32_USART3SEL_SYSCLK +#define STM32_LPUART1SEL STM32_LPUART1SEL_SYSCLK +#define STM32_LPUART2SEL STM32_LPUART2SEL_SYSCLK +#define STM32_CECSEL STM32_CECSEL_HSI16DIV +#define STM32_I2C1SEL STM32_I2C1SEL_PCLK +#define STM32_I2C2SEL STM32_I2C1SEL_PCLK +#define STM32_I2S1SEL STM32_I2S1SEL_SYSCLK +#define STM32_I2S2SEL STM32_I2S2SEL_SYSCLK +#define STM32_LPTIM1SEL STM32_LPTIM1SEL_PCLK +#define STM32_LPTIM2SEL STM32_LPTIM2SEL_PCLK +#define STM32_TIM1SEL STM32_TIM1SEL_TIMPCLK +#define STM32_TIM15SEL STM32_TIM15SEL_TIMPCLK +#define STM32_RNGSEL STM32_RNGSEL_HSI16 +#define STM32_RNGDIV_VALUE 1 +#define STM32_ADCSEL STM32_ADCSEL_PLLPCLK +#define STM32_RTCSEL STM32_RTCSEL_NOCLOCK + +/* + * Shared IRQ settings. + */ +#define STM32_IRQ_EXTI0_1_PRIORITY 3 +#define STM32_IRQ_EXTI2_3_PRIORITY 3 +#define STM32_IRQ_EXTI4_15_PRIORITY 3 +#define STM32_IRQ_EXTI1921_PRIORITY 3 + +#define STM32_IRQ_USART1_PRIORITY 2 +#define STM32_IRQ_USART2_LP2_PRIORITY 2 +#define STM32_IRQ_USART3_4_5_6_LP1_PRIORITY 2 + +#define STM32_IRQ_TIM1_UP_PRIORITY 1 +#define STM32_IRQ_TIM1_CC_PRIORITY 1 +#define STM32_IRQ_TIM2_PRIORITY 1 +#define STM32_IRQ_TIM3_4_PRIORITY 1 +#define STM32_IRQ_TIM6_PRIORITY 1 +#define STM32_IRQ_TIM7_PRIORITY 1 +#define STM32_IRQ_TIM14_PRIORITY 1 +#define STM32_IRQ_TIM15_PRIORITY 1 +#define STM32_IRQ_TIM16_PRIORITY 1 +#define STM32_IRQ_TIM17_PRIORITY 1 + +/* + * ADC driver system settings. + */ +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_ADC1_CFGR2 ADC_CFGR2_CKMODE_ADCCLK +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_ADC_PRESCALER_VALUE 2 + +/* + * DAC driver system settings. + */ +#define STM32_DAC_DUAL_MODE FALSE +#define STM32_DAC_USE_DAC1_CH1 FALSE +#define STM32_DAC_USE_DAC1_CH2 FALSE +#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 3 +#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 3 +#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH1_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_DAC_DAC1_CH2_DMA_STREAM STM32_DMA_STREAM_ID_ANY + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM6 FALSE +#define STM32_GPT_USE_TIM7 FALSE +#define STM32_GPT_USE_TIM14 FALSE +#define STM32_GPT_USE_TIM15 FALSE +#define STM32_GPT_USE_TIM16 FALSE +#define STM32_GPT_USE_TIM17 FALSE + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 FALSE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_USE_I2C3 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_I2C_I2C1_IRQ_PRIORITY 3 +#define STM32_I2C_I2C2_IRQ_PRIORITY 3 +#define STM32_I2C_I2C1_DMA_PRIORITY 3 +#define STM32_I2C_I2C2_DMA_PRIORITY 3 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM15 FALSE + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM14 FALSE +#define STM32_PWM_USE_TIM15 FALSE +#define STM32_PWM_USE_TIM16 FALSE +#define STM32_PWM_USE_TIM17 FALSE + +/* + * RTC driver system settings. + */ +#define STM32_RTC_PRESA_VALUE 32 +#define STM32_RTC_PRESS_VALUE 1024 +#define STM32_RTC_CR_INIT 0 +#define STM32_RTC_TAMPCR_INIT 0 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 FALSE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USE_USART6 FALSE +#define STM32_SERIAL_USE_LPUART1 FALSE +#define STM32_SERIAL_USE_LPUART2 FALSE + +/* + * SIO driver system settings. + */ +#define STM32_SIO_USE_USART1 FALSE +#define STM32_SIO_USE_USART2 FALSE +#define STM32_SIO_USE_USART3 FALSE +#define STM32_SIO_USE_UART4 FALSE +#define STM32_SIO_USE_UART5 FALSE +#define STM32_SIO_USE_USART6 FALSE +#define STM32_SIO_USE_LPUART1 FALSE +#define STM32_SIO_USE_LPUART2 FALSE + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 FALSE +#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 2 +#define STM32_SPI_SPI2_IRQ_PRIORITY 2 +#define STM32_SPI_SPI3_IRQ_PRIORITY 2 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 2 +#define STM32_ST_USE_TIMER 2 + +/* + * TRNG driver system settings. + * NOTE: STM32G0C1 only. + */ +#define STM32_TRNG_USE_RNG1 FALSE + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USE_UART4 FALSE +#define STM32_UART_USE_UART5 FALSE +#define STM32_UART_USE_USART6 FALSE +#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART3_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART3_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_UART4_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_UART4_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_UART5_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_UART5_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_UART4_DMA_PRIORITY 0 +#define STM32_UART_UART5_DMA_PRIORITY 0 +#define STM32_UART_USART6_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_USB1_LP_IRQ_PRIORITY 3 +#define STM32_USB_USE_ISOCHRONOUS FALSE +#define STM32_USB_USE_FAST_COPY TRUE +#define STM32_USB_HOST_WAKEUP_DURATION 2 +#define STM32_USB_48MHZ_DELTA 0 + +/* + * WDG driver system settings. + */ +#define STM32_WDG_USE_IWDG FALSE + +#endif /* MCUCONF_H */ diff --git a/platforms/chibios/boards/common/ld/STM32G0B1xB.ld b/platforms/chibios/boards/common/ld/STM32G0B1xB.ld new file mode 100644 index 0000000000..0109504992 --- /dev/null +++ b/platforms/chibios/boards/common/ld/STM32G0B1xB.ld @@ -0,0 +1,85 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * STM32G0B1xB memory setup. + */ +MEMORY +{ + flash0 (rx) : org = 0x08000000, len = 128k + flash1 (rx) : org = 0x00000000, len = 0 + flash2 (rx) : org = 0x00000000, len = 0 + flash3 (rx) : org = 0x00000000, len = 0 + flash4 (rx) : org = 0x00000000, len = 0 + flash5 (rx) : org = 0x00000000, len = 0 + flash6 (rx) : org = 0x00000000, len = 0 + flash7 (rx) : org = 0x00000000, len = 0 + ram0 (wx) : org = 0x20000000, len = 144k + ram1 (wx) : org = 0x00000000, len = 0 + ram2 (wx) : org = 0x00000000, len = 0 + ram3 (wx) : org = 0x00000000, len = 0 + ram4 (wx) : org = 0x00000000, len = 0 + ram5 (wx) : org = 0x00000000, len = 0 + ram6 (wx) : org = 0x00000000, len = 0 + ram7 (wx) : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/platforms/chibios/drivers/analog.c b/platforms/chibios/drivers/analog.c index 7e1f87e6c9..a916cc9a1d 100644 --- a/platforms/chibios/drivers/analog.c +++ b/platforms/chibios/drivers/analog.c @@ -43,7 +43,7 @@ #endif // Otherwise assume V3 -#if defined(STM32F0XX) || defined(STM32L0XX) +#if defined(STM32F0XX) || defined(STM32L0XX) || defined(STM32G0XX) # define USE_ADCV1 #elif defined(STM32F1XX) || defined(STM32F2XX) || defined(STM32F4XX) || defined(GD32VF103) || defined(WB32F3G71xx) || defined(WB32FQ95xx) || defined(AT32F415) # define USE_ADCV2 @@ -82,7 +82,7 @@ /* User configurable ADC options */ #ifndef ADC_COUNT -# if defined(RP2040) || defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F4XX) || defined(GD32VF103) || defined(WB32F3G71xx) || defined(WB32FQ95xx) || defined(AT32F415) +# if defined(RP2040) || defined(STM32F0XX) || defined(STM32F1XX) || defined(STM32F4XX) || defined(STM32G0XX) || defined(GD32VF103) || defined(WB32F3G71xx) || defined(WB32FQ95xx) || defined(AT32F415) # define ADC_COUNT 1 # elif defined(STM32F3XX) || defined(STM32G4XX) # define ADC_COUNT 4 @@ -114,6 +114,8 @@ # define ADC_SAMPLING_RATE ADC_SMPR_SMP_1P5 # elif defined(ADC_SMPR_SMP_2P5) // STM32L4XX, STM32L4XXP, STM32G4XX, STM32WBXX # define ADC_SAMPLING_RATE ADC_SMPR_SMP_2P5 +# elif defined(ADC_SMPR_SMP1_1P5) // STM32G0XX +# define ADC_SAMPLING_RATE ADC_SMPR_SMP1_1P5 # else # error "Cannot determine the default ADC_SAMPLING_RATE for this MCU." # endif @@ -293,6 +295,23 @@ __attribute__((weak)) adc_mux pinToMux(pin_t pin) { case F9: return TO_MUX( ADC_CHANNEL_IN12, 2 ); case F10: return TO_MUX( ADC_CHANNEL_IN13, 2 ); # endif +#elif defined(STM32G0XX) + case A0: return TO_MUX( 0, 0 ); + case A1: return TO_MUX( 1, 0 ); + case A2: return TO_MUX( 2, 0 ); + case A3: return TO_MUX( 3, 0 ); + case A4: return TO_MUX( 4, 0 ); + case A5: return TO_MUX( 5, 0 ); + case A6: return TO_MUX( 6, 0 ); + case A7: return TO_MUX( 7, 0 ); + case B0: return TO_MUX( 8, 0 ); + case B1: return TO_MUX( 9, 0 ); + case B2: return TO_MUX( 10, 0 ); + case B10: return TO_MUX( 11, 0 ); + case B11: return TO_MUX( 15, 0 ); + case B12: return TO_MUX( 16, 0 ); + case C4: return TO_MUX( 17, 0 ); + case C5: return TO_MUX( 18, 0 ); #elif defined(STM32G4XX) case A0: return TO_MUX( ADC_CHANNEL_IN1, 0 ); // Can also be ADC2 case A1: return TO_MUX( ADC_CHANNEL_IN2, 0 ); // Can also be ADC2 diff --git a/platforms/chibios/mcu_selection.mk b/platforms/chibios/mcu_selection.mk index 086a2b31c6..199bdb2321 100644 --- a/platforms/chibios/mcu_selection.mk +++ b/platforms/chibios/mcu_selection.mk @@ -511,6 +511,41 @@ ifneq ($(findstring STM32F446, $(MCU)),) EEPROM_DRIVER ?= transient endif +ifneq ($(findstring STM32G0B1, $(MCU)),) + # Cortex version + MCU = cortex-m0plus + + # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 + ARMV = 6 + + ## chip/board settings + # - the next two should match the directories in + # /os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES) + # OR + # /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) + MCU_FAMILY = STM32 + MCU_SERIES = STM32G0xx + + # Linker script to use + # - it should exist either in /os/common/startup/ARMCMx/compilers/GCC/ld/ + # or /ld/ + MCU_LDSCRIPT ?= STM32G0B1xB + + # Startup code to use + # - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ + MCU_STARTUP ?= stm32g0xx + + # Board: it should exist either in /os/hal/boards/, + # /boards/, or drivers/boards/ + BOARD ?= GENERIC_STM32_G0B1XB + + # UF2 settings + UF2_FAMILY ?= STM32G0 + + # Bootloader address for STM32 DFU + STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000 +endif + ifneq ($(findstring STM32G431, $(MCU)),) # Cortex version MCU = cortex-m4 From 919e2a4f5c1fb8cb3a0bd465091a31ae98486546 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 19 May 2025 22:10:39 +1000 Subject: [PATCH 385/592] Use relative paths for schemas, instead of $id. Enables VScode validation. (#25251) --- .vscode/settings.json | 27 ++- data/schemas/api_keyboard.jsonschema | 6 +- data/schemas/community_module.jsonschema | 8 +- data/schemas/keyboard.jsonschema | 290 +++++++++++------------ data/schemas/keycodes.jsonschema | 4 +- data/schemas/keymap.jsonschema | 16 +- data/schemas/user_repo_v1.jsonschema | 4 +- data/schemas/user_repo_v1_1.jsonschema | 6 +- lib/python/qmk/json_schema.py | 5 + 9 files changed, 197 insertions(+), 169 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f369ecb174..c04ea51de1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,13 @@ "**/*.uf2": true }, "files.associations": { + // QMK Filetypes + "keyboard.json": "jsonc", + "info.json": "jsonc", + "keymap.json": "jsonc", + "qmk.json": "jsonc", + "qmk_module.json": "jsonc", + // Standard filetypes "*.h": "c", "*.c": "c", "*.inc": "c", @@ -28,7 +35,23 @@ "[json]": { "editor.formatOnSave": false }, - "clangd.arguments": [ - "--header-insertion=never" + "clangd.arguments": ["--header-insertion=never"], + "json.schemas": [ + { + "fileMatch": ["qmk.json"], + "url": "./data/schemas/user_repo_v1_1.jsonschema" + }, + { + "fileMatch": ["qmk_module.json"], + "url": "./data/schemas/community_module.jsonschema" + }, + { + "fileMatch": ["keyboard.json", "info.json"], + "url": "./data/schemas/keyboard.jsonschema" + }, + { + "fileMatch": ["keymap.json"], + "url": "./data/schemas/keymap.jsonschema" + } ] } diff --git a/data/schemas/api_keyboard.jsonschema b/data/schemas/api_keyboard.jsonschema index 6a30b5d990..a3b7872ee0 100644 --- a/data/schemas/api_keyboard.jsonschema +++ b/data/schemas/api_keyboard.jsonschema @@ -1,7 +1,7 @@ { "$id": "qmk.api.keyboard.v1", "allOf": [ - {"$ref": "qmk.keyboard.v1"}, + {"$ref": "./keyboard.jsonschema#"}, { "properties": { "keymaps": { @@ -10,8 +10,8 @@ "url": {"type": "string"} } }, - "parse_errors": {"$ref": "qmk.definitions.v1#/string_array"}, - "parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"}, + "parse_errors": {"$ref": "./definitions.jsonschema#/string_array"}, + "parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"}, "processor_type": {"type": "string"}, "protocol": {"type": "string"}, "keyboard_folder": {"type": "string"}, diff --git a/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema index feced00508..92981ceb5c 100644 --- a/data/schemas/community_module.jsonschema +++ b/data/schemas/community_module.jsonschema @@ -5,14 +5,14 @@ "type": "object", "required": ["module_name", "maintainer"], "properties": { - "module_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, + "module_name": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"}, "license": {"type": "string"}, "url": { "type": "string", "format": "uri" }, - "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, - "features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"} + "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"}, + "features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"} } } diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 6c9c703bda..3aa259605e 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -17,9 +17,9 @@ "additionalProperties": false, "required": ["pin_a", "pin_b"], "properties": { - "pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"} } } } @@ -28,22 +28,22 @@ "dip_switch_config": { "type": "object", "properties": { - "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} + "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} } }, "features_config": { - "$ref": "qmk.definitions.v1#/boolean_array", - "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, + "$ref": "./definitions.jsonschema#/boolean_array", + "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"}, "not": {"required": ["lto"]} } }, "type": "object", "not": {"required": ["vendorId", "productId"]}, // reject via keys... "properties": { - "keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"}, - "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"}, + "keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"}, + "maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"}, "url": { "type": "string", "format": "uri" @@ -119,8 +119,8 @@ "type": "object", "additionalProperties": false, "properties": { - "data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, "default_brightness": { "type": "integer", "minimum": 0, @@ -145,13 +145,13 @@ "enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"] }, "macro_beep": {"type": "boolean"}, - "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, + "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}, "power_control": { "type": "object", "additionalProperties": false, "properties": { - "on_state": {"$ref": "qmk.definitions.v1#/bit"}, - "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"} + "on_state": {"$ref": "./definitions.jsonschema#/bit"}, + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"} } }, "voices": {"type": "boolean"} @@ -171,20 +171,20 @@ "properties": { "on": {"type": "boolean"}, "breathing": {"type": "boolean"}, - "brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } }, "breathing": {"type": "boolean"}, - "breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, + "breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, "levels": { "type": "integer", "minimum": 1, "maximum": 31 }, - "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, - "on_state": {"$ref": "qmk.definitions.v1#/bit"}, + "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}, + "on_state": {"$ref": "./definitions.jsonschema#/bit"}, "as_caps_lock": {"type": "boolean"} } }, @@ -269,7 +269,7 @@ "type": "string", "enum": ["COL2ROW", "ROW2COL"] }, - "debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "caps_word": { "type": "object", "additionalProperties": false, @@ -277,20 +277,20 @@ "enabled": {"type": "boolean"}, "both_shifts_turns_on": {"type": "boolean"}, "double_tap_shift_turns_on": {"type": "boolean"}, - "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "invert_on_shift": {"type": "boolean"} } }, "combo": { "type": "object", "properties": { - "count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "term": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "count": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "term": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "community_layouts": { "type": "array", - "items": {"$ref": "qmk.definitions.v1#/filename"} + "items": {"$ref": "./definitions.jsonschema#/filename"} }, "dip_switch": { "$ref": "#/definitions/dip_switch_config", @@ -322,8 +322,8 @@ "type": "string", "enum": ["none", "custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"] }, - "backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"} } } } @@ -338,12 +338,12 @@ "indicators": { "type": "object", "properties": { - "caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "compose": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "kana": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "on_state": {"$ref": "qmk.definitions.v1#/bit"} + "caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "compose": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "kana": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "on_state": {"$ref": "./definitions.jsonschema#/bit"} } }, "joystick": { @@ -351,8 +351,8 @@ "properties": { "enabled": {"type": "boolean"}, "driver": {"type": "string"}, - "button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "axes": { "type": "object", "propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}, @@ -361,10 +361,10 @@ { "type": "object", "properties": { - "input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "low": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "rest": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "high": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "low": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "rest": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "high": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, { @@ -376,20 +376,20 @@ } } }, - "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, + "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"}, "layer_lock": { "type": "object", "properties": { - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "layout_aliases": { "type": "object", - "additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"} + "additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"} }, "layouts": { "type": "object", - "propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"}, + "propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"}, "additionalProperties": { "type": "object", "additionalProperties": false, @@ -404,7 +404,7 @@ "additionalProperties": false, "required": ["x", "y"], "properties": { - "encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "label": { "type": "string", "pattern": "^[^\\n]*$" @@ -418,13 +418,13 @@ "minimum": 0 } }, - "r": {"$ref": "qmk.definitions.v1#/signed_decimal"}, - "rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, - "ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, - "h": {"$ref": "qmk.definitions.v1#/key_unit"}, - "w": {"$ref": "qmk.definitions.v1#/key_unit"}, - "x": {"$ref": "qmk.definitions.v1#/key_unit"}, - "y": {"$ref": "qmk.definitions.v1#/key_unit"}, + "r": {"$ref": "./definitions.jsonschema#/signed_decimal"}, + "rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"}, + "ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"}, + "h": {"$ref": "./definitions.jsonschema#/key_unit"}, + "w": {"$ref": "./definitions.jsonschema#/key_unit"}, + "x": {"$ref": "./definitions.jsonschema#/key_unit"}, + "y": {"$ref": "./definitions.jsonschema#/key_unit"}, "hand": { "type": "string", "enum": ["L", "R", "*"] @@ -461,7 +461,7 @@ "properties": { "timing": {"type": "boolean"}, "strict_processing": {"type": "boolean"}, - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "matrix_pins": { @@ -471,14 +471,14 @@ "custom": {"type": "boolean"}, "custom_lite": {"type": "boolean"}, "ghost": {"type": "boolean"}, - "input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "direct": { "type": "array", - "items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} + "items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} }, - "cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, - "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} + "cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}, + "rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} } }, "modules": { @@ -491,18 +491,18 @@ "type": "object", "properties": { "enabled": {"type": "boolean"}, - "delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } }, "oneshot": { "type": "object", "properties": { - "tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "led_matrix": { @@ -510,7 +510,7 @@ "properties": { "animations": { "type": "object", - "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, + "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"}, "additionalProperties": {"type": "boolean"} }, "default": { @@ -519,8 +519,8 @@ "properties": { "on": {"type": "boolean"}, "animation": {"type": "string"}, - "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } }, "driver": { @@ -546,21 +546,21 @@ "type": "array", "minItems": 2, "maxItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} }, - "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "react_on_keyup": {"type": "boolean"}, "sleep": {"type": "boolean"}, "split_count": { "type": "array", "minItems": 2, "maxItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int"} }, "layout": { "type": "array", @@ -578,9 +578,9 @@ "minimum": 0 } }, - "x": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "y": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "x": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "y": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } } } @@ -591,7 +591,7 @@ "properties": { "animations": { "type": "object", - "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, + "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"}, "additionalProperties": {"type": "boolean"} }, "default": { @@ -600,10 +600,10 @@ "properties": { "on": {"type": "boolean"}, "animation": {"type": "string"}, - "hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } }, "driver": { @@ -631,23 +631,23 @@ "type": "array", "minItems": 2, "maxItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} }, - "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "react_on_keyup": {"type": "boolean"}, "sleep": {"type": "boolean"}, "split_count": { "type": "array", "minItems": 2, "maxItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int"} }, "layout": { "type": "array", @@ -665,9 +665,9 @@ "minimum": 0 } }, - "x": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "y": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "x": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "y": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } } } @@ -679,27 +679,27 @@ "properties": { "animations": { "type": "object", - "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, + "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"}, "additionalProperties": {"type": "boolean"} }, - "brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "default": { "type": "object", "additionalProperties": false, "properties": { "on": {"type": "boolean"}, "animation": {"type": "string"}, - "hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} + "hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"} } }, "driver": { "type": "string", "enum": ["apa102", "custom", "ws2812"] }, - "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "layers": { "type": "object", "additionalProperties": false, @@ -714,29 +714,29 @@ "override_rgb": {"type": "boolean"} } }, - "led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "led_map": { "type": "array", "minItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int"} }, - "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, + "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, "pin": { - "$ref": "qmk.definitions.v1#/mcu_pin", + "$ref": "./definitions.jsonschema#/mcu_pin", "$comment": "Deprecated: use ws2812.pin instead" }, "rgbw": { "type": "boolean", "$comment": "Deprecated: use ws2812.rgbw instead" }, - "saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "sleep": {"type": "boolean"}, "split": {"type": "boolean"}, "split_count": { "type": "array", "minItems": 2, "maxItems": 2, - "items": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "items": {"$ref": "./definitions.jsonschema#/unsigned_int"} } } }, @@ -745,8 +745,8 @@ "additionalProperties": false, "properties": { "enabled": {"type": "boolean"}, - "unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "unlock_sequence": { "type": "array", "minItems": 1, @@ -780,8 +780,8 @@ "properties": { "enabled": {"type": "boolean"}, "mouse_enabled": {"type": "boolean"}, - "clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, "driver": { "type": "string", "enum": ["busywait", "interrupt", "usart", "vendor"] @@ -818,11 +818,11 @@ "properties": { "direct": { "type": "array", - "items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} + "items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} }, - "cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, - "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, - "unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} + "cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}, + "rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}, + "unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} } } } @@ -849,16 +849,16 @@ "type": "object", "additionalProperties": false, "properties": { - "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, "matrix_grid": { - "$ref": "qmk.definitions.v1#/mcu_pin_array", + "$ref": "./definitions.jsonschema#/mcu_pin_array", "minItems": 2, "maxItems": 2 } } }, "soft_serial_pin": { - "$ref": "qmk.definitions.v1#/mcu_pin", + "$ref": "./definitions.jsonschema#/mcu_pin", "$comment": "Deprecated: use split.serial.pin instead" }, "soft_serial_speed": { @@ -874,7 +874,7 @@ "type": "string", "enum": ["bitbang", "usart", "vendor"] }, - "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"} + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"} } }, "transport": { @@ -902,7 +902,7 @@ } }, "watchdog": {"type": "boolean"}, - "watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "sync_matrix_state": { "type": "boolean", "$comment": "Deprecated: use sync.matrix_state instead" @@ -918,8 +918,8 @@ "additionalProperties": false, "properties": { "enabled": {"type": "boolean"}, - "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "main": { @@ -929,7 +929,7 @@ }, "matrix_grid": { "type": "array", - "items": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "items": {"$ref": "./definitions.jsonschema#/mcu_pin"}, "$comment": "Deprecated: use split.handedness.matrix_grid instead" } } @@ -951,9 +951,9 @@ "permissive_hold_per_key": {"type": "boolean"}, "retro": {"type": "boolean"}, "retro_per_key": {"type": "boolean"}, - "term": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "term": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "term_per_key": {"type": "boolean"}, - "toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"} } }, "usb": { @@ -961,20 +961,20 @@ "additionalProperties": false, "properties": { "device_ver": { - "$ref": "qmk.definitions.v1#/hex_number_4d", + "$ref": "./definitions.jsonschema#/hex_number_4d", "$comment": "Deprecated: use device_version instead" }, - "device_version": {"$ref": "qmk.definitions.v1#/bcd_version"}, + "device_version": {"$ref": "./definitions.jsonschema#/bcd_version"}, "force_nkro": { "type": "boolean", "$comment": "Deprecated: use host.default.nkro instead" }, - "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, - "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, - "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"}, + "vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"}, + "max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "no_startup_check": {"type": "boolean"}, - "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, + "polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, "shared_endpoint": { "type": "object", "additionalProperties": false, @@ -983,7 +983,7 @@ "mouse": {"type": "boolean"} } }, - "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "wait_for_enumeration": {"type": "boolean"} } }, @@ -991,9 +991,9 @@ "type": "object", "additionalProperties": false, "properties": { - "keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, - "tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, - "tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}, + "tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "locking": { "type": "object", "additionalProperties": false, @@ -1008,10 +1008,10 @@ "type": "object", "additionalProperties": false, "properties": { - "esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "led": {"$ref": "qmk.definitions.v1#/mcu_pin"}, - "speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"} + "esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "led": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"} } }, "ws2812": { @@ -1022,10 +1022,10 @@ "type": "string", "enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"] }, - "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, "rgbw": {"type": "boolean"}, - "i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"}, - "i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} + "i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"}, + "i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"} } } } diff --git a/data/schemas/keycodes.jsonschema b/data/schemas/keycodes.jsonschema index df6ce95a83..0f9dfc763e 100644 --- a/data/schemas/keycodes.jsonschema +++ b/data/schemas/keycodes.jsonschema @@ -30,10 +30,10 @@ "keycodes": { "type": "object", "propertyNames": { - "$ref": "qmk.definitions.v1#/hex_number_4d" + "$ref": "./definitions.jsonschema#/hex_number_4d" }, "additionalProperties": { - "type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed + "type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed "required": [ "key" ], diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema index b92a536c2c..99aeaa6b6c 100644 --- a/data/schemas/keymap.jsonschema +++ b/data/schemas/keymap.jsonschema @@ -10,10 +10,10 @@ "minLength": 1, "pattern": "^[a-z][0-9a-z_]*$" }, - "host_language": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "keymap": {"$ref": "qmk.definitions.v1#/text_identifier"}, - "layout": {"$ref": "qmk.definitions.v1#/layout_macro"}, + "host_language": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "keymap": {"$ref": "./definitions.jsonschema#/text_identifier"}, + "layout": {"$ref": "./definitions.jsonschema#/layout_macro"}, "layers": { "type": "array", "items": { @@ -55,11 +55,11 @@ "keycodes": { "type": "array", "items": { - "$ref": "qmk.definitions.v1#/text_identifier" + "$ref": "./definitions.jsonschema#/text_identifier" } }, "duration": { - "$ref": "qmk.definitions.v1#/unsigned_int" + "$ref": "./definitions.jsonschema#/unsigned_int" } } } @@ -67,8 +67,8 @@ } } }, - "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, - "config": {"$ref": "qmk.keyboard.v1"}, + "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"}, + "config": {"$ref": "./keyboard.jsonschema#"}, "notes": { "type": "string" }, diff --git a/data/schemas/user_repo_v1.jsonschema b/data/schemas/user_repo_v1.jsonschema index 88b50e8a72..07c61d0fea 100644 --- a/data/schemas/user_repo_v1.jsonschema +++ b/data/schemas/user_repo_v1.jsonschema @@ -6,8 +6,8 @@ "definitions": { "build_target": { "oneOf": [ - {"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"}, - {"$ref": "qmk.definitions.v1#/json_file_path"} + {"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"}, + {"$ref": "./definitions.jsonschema#/json_file_path"} ] } }, diff --git a/data/schemas/user_repo_v1_1.jsonschema b/data/schemas/user_repo_v1_1.jsonschema index 173d8d26d6..cd6d89ad81 100644 --- a/data/schemas/user_repo_v1_1.jsonschema +++ b/data/schemas/user_repo_v1_1.jsonschema @@ -6,9 +6,9 @@ "definitions": { "build_target": { "oneOf": [ - {"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"}, - {"$ref": "qmk.definitions.v1#/keyboard_keymap_env"}, - {"$ref": "qmk.definitions.v1#/json_file_path"} + {"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"}, + {"$ref": "./definitions.jsonschema#/keyboard_keymap_env"}, + {"$ref": "./definitions.jsonschema#/json_file_path"} ] } }, diff --git a/lib/python/qmk/json_schema.py b/lib/python/qmk/json_schema.py index b11a0ed7ea..e871598565 100644 --- a/lib/python/qmk/json_schema.py +++ b/lib/python/qmk/json_schema.py @@ -76,8 +76,13 @@ def compile_schema_store(): if not isinstance(schema_data, dict): cli.log.debug('Skipping schema file %s', schema_file) continue + + # `$id`-based references schema_store[schema_data['$id']] = schema_data + # Path-based references + schema_store[Path(schema_file).name] = schema_data + return schema_store From 28720c4d343a9c5e9f5a62dbd583dbf536a2e61e Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Mon, 19 May 2025 16:53:02 -0400 Subject: [PATCH 386/592] add doio/kb03 (#24815) Co-authored-by: Drashna Jaelre Co-authored-by: Joel Challis --- keyboards/doio/kb03/config.h | 9 ++ keyboards/doio/kb03/halconf.h | 9 ++ keyboards/doio/kb03/kb03.c | 64 +++++++++++++ keyboards/doio/kb03/keyboard.json | 96 ++++++++++++++++++++ keyboards/doio/kb03/keymaps/default/keymap.c | 44 +++++++++ keyboards/doio/kb03/keymaps/default/rules.mk | 1 + keyboards/doio/kb03/mcuconf.h | 10 ++ keyboards/doio/kb03/readme.md | 27 ++++++ keyboards/doio/kb03/rules.mk | 2 + 9 files changed, 262 insertions(+) create mode 100644 keyboards/doio/kb03/config.h create mode 100644 keyboards/doio/kb03/halconf.h create mode 100644 keyboards/doio/kb03/kb03.c create mode 100644 keyboards/doio/kb03/keyboard.json create mode 100644 keyboards/doio/kb03/keymaps/default/keymap.c create mode 100644 keyboards/doio/kb03/keymaps/default/rules.mk create mode 100644 keyboards/doio/kb03/mcuconf.h create mode 100644 keyboards/doio/kb03/readme.md create mode 100644 keyboards/doio/kb03/rules.mk diff --git a/keyboards/doio/kb03/config.h b/keyboards/doio/kb03/config.h new file mode 100644 index 0000000000..f0f974d940 --- /dev/null +++ b/keyboards/doio/kb03/config.h @@ -0,0 +1,9 @@ +// Copyright (C) 2025 DOIO +// Copyright (C) 2025 ClownFish (@clownfish-og) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5 diff --git a/keyboards/doio/kb03/halconf.h b/keyboards/doio/kb03/halconf.h new file mode 100644 index 0000000000..8c0968d792 --- /dev/null +++ b/keyboards/doio/kb03/halconf.h @@ -0,0 +1,9 @@ +// Copyright (C) 2025 DOIO +// Copyright (C) 2025 ClownFish (@clownfish-og) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/doio/kb03/kb03.c b/keyboards/doio/kb03/kb03.c new file mode 100644 index 0000000000..9368bc5d41 --- /dev/null +++ b/keyboards/doio/kb03/kb03.c @@ -0,0 +1,64 @@ +// Copyright (C) 2025 DOIO +// Copyright (C) 2025 ClownFish (@clownfish-og) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef RGB_MATRIX_ENABLE + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + if (!process_record_user(keycode, record)) { + return false; + } + switch (keycode) { + case RM_TOGG: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_set_color_all(0, 0, 0); + } break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + } break; + } + } + if (!rgb_matrix_is_enabled()) { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable(); + } + return false; + } + return true; +} + +bool rgb_matrix_indicators_kb(void) { + if (!rgb_matrix_indicators_user()) { + return false; + } + + hsv_t hsv = {0, 255, 100}; + switch (get_highest_layer(layer_state)) { + case 0: + hsv = (hsv_t){HSV_RED}; + break; + case 1: + hsv = (hsv_t){HSV_GREEN}; + break; + case 2: + hsv = (hsv_t){HSV_BLUE}; + break; + case 3: + hsv = (hsv_t){HSV_WHITE}; + break; + default: + hsv = (hsv_t){HSV_YELLOW}; + break; + } + hsv.v = (rgb_matrix_get_val() * 70 / 200) + 30; //set indicator brightness range 30-100, vary based on RGB Matrix brightness + rgb_t rgb = hsv_to_rgb(hsv); + rgb_matrix_set_color(9, rgb.r, rgb.g, rgb.b); + return false; +} + +#endif diff --git a/keyboards/doio/kb03/keyboard.json b/keyboards/doio/kb03/keyboard.json new file mode 100644 index 0000000000..d2a214c92f --- /dev/null +++ b/keyboards/doio/kb03/keyboard.json @@ -0,0 +1,96 @@ +{ + "manufacturer": "DOIO", + "keyboard_name": "KB03-01", + "maintainer": "clownfish-og", + "bootloader": "stm32duino", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "B5", "pin_b": "B6", "resolution": 4}, + {"pin_a": "A2", "pin_b": "A1", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["B14", "B13", "B12", "B0", "A7"], + "rows": ["B3"] + }, + "processor": "STM32F103", + "rgb_matrix": { + "animations": { + "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, + "dual_beacon": true, + "gradient_left_right": true, + "gradient_up_down": true, + "hue_breathing": true, + "hue_wave": true, + "jellybean_raindrops": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": true, + "solid_reactive": true, + "solid_reactive_cross": true, + "solid_reactive_nexus": true, + "solid_reactive_simple": true, + "solid_reactive_wide": true, + "solid_splash": true, + "splash": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 224, "y": 0, "flags": 4}, + {"x": 224, "y": 0, "flags": 2}, + {"x": 0, "y": 0, "flags": 2}, + {"x": 0, "y": 32, "flags": 2}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 224, "y": 32, "flags": 2}, + {"x": 10, "y": 0, "flags": 8} + ], + "max_brightness": 200, + "sleep": true + }, + "url": "https://www.keebmonkey.com/products/megalodon-dual-layer-knob-macro-pad", + "usb": { + "device_version": "0.0.1", + "pid": "0x0301", + "vid": "0xD010" + }, + "ws2812": { + "pin": "A10", + "driver": "pwm" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Layers", "matrix": [0, 3], "x": 0.75, "y": 0, "h": 0.5}, + {"label": "1!", "matrix": [0, 0], "x": 0, "y": 0.75}, + {"label": "2@", "matrix": [0, 1], "x": 1, "y": 0.75}, + {"label": "3#", "matrix": [0, 2], "x": 2, "y": 0.75}, + {"label": "Encoder", "matrix": [0, 4], "x": 0.5, "y": 2, "w": 2, "h": 2} + ] + } + } +} diff --git a/keyboards/doio/kb03/keymaps/default/keymap.c b/keyboards/doio/kb03/keymaps/default/keymap.c new file mode 100644 index 0000000000..67e43faca4 --- /dev/null +++ b/keyboards/doio/kb03/keymaps/default/keymap.c @@ -0,0 +1,44 @@ +// Copyright 2025 DOIO +// Copyright 2025 ClownFish (@clownfish-og) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum my_layers { + _BASE, + _MOUSE, + _MEDIA, + _LIGHTS +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + TO(_MOUSE), + KC_1, KC_2, KC_3, + KC_ENT + ), + [_MOUSE] = LAYOUT( + TO(_MEDIA), + MS_BTN1, MS_BTN3, MS_BTN2, + KC_LCTL + ), + [_MEDIA] = LAYOUT( + TO(_LIGHTS), + KC_MRWD, KC_MPLY, KC_MFFD, + KC_MUTE + ), + [_LIGHTS] = LAYOUT( + TO(_BASE), + RM_VALD, RM_NEXT, RM_VALU, + RM_TOGG + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(MS_WHLL, MS_WHLR) }, + [_MOUSE] = { ENCODER_CCW_CW(MS_LEFT, MS_RGHT), ENCODER_CCW_CW(MS_UP, MS_DOWN) }, + [_MEDIA] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) }, + [_LIGHTS] = { ENCODER_CCW_CW(RM_SATD, RM_SATU), ENCODER_CCW_CW(RM_HUED, RM_HUEU) } +}; +#endif diff --git a/keyboards/doio/kb03/keymaps/default/rules.mk b/keyboards/doio/kb03/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/doio/kb03/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/doio/kb03/mcuconf.h b/keyboards/doio/kb03/mcuconf.h new file mode 100644 index 0000000000..5869741c98 --- /dev/null +++ b/keyboards/doio/kb03/mcuconf.h @@ -0,0 +1,10 @@ +// Copyright (C) 2025 DOIO +// Copyright (C) 2025 ClownFish (@clownfish-og) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/doio/kb03/readme.md b/keyboards/doio/kb03/readme.md new file mode 100644 index 0000000000..873ab2f38d --- /dev/null +++ b/keyboards/doio/kb03/readme.md @@ -0,0 +1,27 @@ +# DOIO KB03-01 + +![KB03-01](https://i.imgur.com/bnlDpkY.png) + +QMK for Megalodon DOIO Dual Layer Knob 3 Key macropad. + +* Keyboard Maintainer: [clownfish-og](https://github.com/clownfish-og) +* Hardware Supported: DOIO KB03-01 using APM32F103CBT6 (clone STM32F103CBT6) +* Hardware Availability: https://www.keebmonkey.com/products/megalodon-dual-layer-knob-macro-pad + +Make example for this keyboard (after setting up your build environment): + + make doio/kb03:default + +Flashing example for this keyboard: + + make doio/kb03: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/doio/kb03/rules.mk b/keyboards/doio/kb03/rules.mk new file mode 100644 index 0000000000..6f0a3736a7 --- /dev/null +++ b/keyboards/doio/kb03/rules.mk @@ -0,0 +1,2 @@ +# Configure for 128K flash +MCU_LDSCRIPT = STM32F103xB From 24895c46f3b513483964b2ad79916f0e589dd168 Mon Sep 17 00:00:00 2001 From: ivan <81021475+ivndbt@users.noreply.github.com> Date: Mon, 19 May 2025 23:15:19 +0200 Subject: [PATCH 387/592] Move rookiebwoy to ivndbt (#25142) --- data/mappings/keyboard_aliases.hjson | 14 +++-- .../{rookiebwoy => ivndbt}/late9/readme.md | 8 +-- .../late9/rev1/config.h | 2 +- .../late9/rev1/keyboard.json | 6 +-- .../late9/rev1/keymaps/default/keymap.c | 2 +- .../late9/rev1/readme.md | 2 +- .../{rookiebwoy => ivndbt}/late9/rev1/rev1.c | 54 +++++++++---------- .../{rookiebwoy => ivndbt}/neopad/readme.md | 8 +-- .../neopad/rev1/config.h | 2 +- .../neopad/rev1/keyboard.json | 10 ++-- .../neopad/rev1/keymaps/default/keymap.c | 2 +- .../neopad/rev1/readme.md | 2 +- .../{rookiebwoy => ivndbt}/neopad/rev1/rev1.c | 2 +- 13 files changed, 60 insertions(+), 54 deletions(-) rename keyboards/{rookiebwoy => ivndbt}/late9/readme.md (85%) rename keyboards/{rookiebwoy => ivndbt}/late9/rev1/config.h (96%) rename keyboards/{rookiebwoy => ivndbt}/late9/rev1/keyboard.json (93%) rename keyboards/{rookiebwoy => ivndbt}/late9/rev1/keymaps/default/keymap.c (98%) rename keyboards/{rookiebwoy => ivndbt}/late9/rev1/readme.md (50%) rename keyboards/{rookiebwoy => ivndbt}/late9/rev1/rev1.c (53%) rename keyboards/{rookiebwoy => ivndbt}/neopad/readme.md (80%) rename keyboards/{rookiebwoy => ivndbt}/neopad/rev1/config.h (96%) rename keyboards/{rookiebwoy => ivndbt}/neopad/rev1/keyboard.json (86%) rename keyboards/{rookiebwoy => ivndbt}/neopad/rev1/keymaps/default/keymap.c (99%) rename keyboards/{rookiebwoy => ivndbt}/neopad/rev1/readme.md (55%) rename keyboards/{rookiebwoy => ivndbt}/neopad/rev1/rev1.c (98%) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 0a640fd3e0..86850af7a4 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1042,7 +1042,7 @@ "target": "kprepublic/bm68hsrgb/rev1" }, "late9/rev1": { - "target": "rookiebwoy/late9/rev1" + "target": "ivndbt/late9/rev1" }, "latin17rgb": { "target": "latincompass/latin17rgb" @@ -1207,7 +1207,7 @@ "target": "spaceholdings/nebula68b" }, "neopad/rev1": { - "target": "rookiebwoy/neopad/rev1" + "target": "ivndbt/neopad/rev1" }, "niu_mini": { "target": "kbdfans/niu_mini" @@ -2104,10 +2104,16 @@ "target": "rmi_kb/wete/v2" }, "rookiebwoy/late9": { - "target": "rookiebwoy/late9/rev1" + "target": "ivndbt/late9/rev1" }, "rookiebwoy/neopad": { - "target": "rookiebwoy/neopad/rev1" + "target": "ivndbt/neopad/rev1" + }, + "ivndbt/late9": { + "target": "ivndbt/late9/rev1" + }, + "ivndbt/neopad": { + "target": "ivndbt/neopad/rev1" }, "rura66": { "target": "rura66/rev1" diff --git a/keyboards/rookiebwoy/late9/readme.md b/keyboards/ivndbt/late9/readme.md similarity index 85% rename from keyboards/rookiebwoy/late9/readme.md rename to keyboards/ivndbt/late9/readme.md index bc6dfab57e..8f1ae628fe 100644 --- a/keyboards/rookiebwoy/late9/readme.md +++ b/keyboards/ivndbt/late9/readme.md @@ -5,17 +5,17 @@ The LATE-9 is a multi-tap input keyboard based on mobile phones from the late '9 ![LATE-9](https://i.imgur.com/QXycTC3h.jpg "LATE-9 first proto") -* Keyboard maintainer: [rookiebwoy](https://github.com/rookiebwoy) +* Keyboard maintainer: [ivndbt](https://github.com/ivndbt) * Hardware supported: ProMicro, _Elite-C (not tested)_ -* Hardware Availability: LATE-9 is open source, check the [project repository](https://github.com/rookiebwoy/late-9) for gerbers. +* Hardware Availability: LATE-9 is open source, check the [project repository](https://github.com/ivndbt/late-9) for gerbers. Make example for this keyboard (after setting up your build environment): - make rookiebwoy/late9/rev1:default + make ivndbt/late9/rev1:default Flashing example for this keyboard: - make rookiebwoy/late9/rev1:default:flash + make ivndbt/late9/rev1: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). diff --git a/keyboards/rookiebwoy/late9/rev1/config.h b/keyboards/ivndbt/late9/rev1/config.h similarity index 96% rename from keyboards/rookiebwoy/late9/rev1/config.h rename to keyboards/ivndbt/late9/rev1/config.h index 8c9a5702f2..b6c0ba55b9 100644 --- a/keyboards/rookiebwoy/late9/rev1/config.h +++ b/keyboards/ivndbt/late9/rev1/config.h @@ -1,5 +1,5 @@ /* -Copyright 2021 rookiebwoy +Copyright 2021 ivndbt 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 diff --git a/keyboards/rookiebwoy/late9/rev1/keyboard.json b/keyboards/ivndbt/late9/rev1/keyboard.json similarity index 93% rename from keyboards/rookiebwoy/late9/rev1/keyboard.json rename to keyboards/ivndbt/late9/rev1/keyboard.json index 48f3cff840..a9bc229588 100644 --- a/keyboards/rookiebwoy/late9/rev1/keyboard.json +++ b/keyboards/ivndbt/late9/rev1/keyboard.json @@ -1,8 +1,8 @@ { "keyboard_name": "LATE-9", - "manufacturer": "rookiebwoy", - "url": "https://github.com/rookiebwoy/late-9)", - "maintainer": "rookiebwoy", + "manufacturer": "ivndbt", + "url": "https://github.com/ivndbt/late-9)", + "maintainer": "ivndbt", "usb": { "vid": "0x6961", "pid": "0x3032", diff --git a/keyboards/rookiebwoy/late9/rev1/keymaps/default/keymap.c b/keyboards/ivndbt/late9/rev1/keymaps/default/keymap.c similarity index 98% rename from keyboards/rookiebwoy/late9/rev1/keymaps/default/keymap.c rename to keyboards/ivndbt/late9/rev1/keymaps/default/keymap.c index f93958fe8f..cf38757100 100644 --- a/keyboards/rookiebwoy/late9/rev1/keymaps/default/keymap.c +++ b/keyboards/ivndbt/late9/rev1/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2021 rookiebwoy +/* Copyright 2021 ivndbt * * 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 diff --git a/keyboards/rookiebwoy/late9/rev1/readme.md b/keyboards/ivndbt/late9/rev1/readme.md similarity index 50% rename from keyboards/rookiebwoy/late9/rev1/readme.md rename to keyboards/ivndbt/late9/rev1/readme.md index d9683222a9..5641e32127 100644 --- a/keyboards/rookiebwoy/late9/rev1/readme.md +++ b/keyboards/ivndbt/late9/rev1/readme.md @@ -1,5 +1,5 @@ # LATE-9 rev1 -First (and final untill now) revision of the LATE-9. For in depth look please go to [project repository](https://github.com/rookiebwoy/late-9). +First (and final untill now) revision of the LATE-9. For in depth look please go to [project repository](https://github.com/ivndbt/late-9). diff --git a/keyboards/rookiebwoy/late9/rev1/rev1.c b/keyboards/ivndbt/late9/rev1/rev1.c similarity index 53% rename from keyboards/rookiebwoy/late9/rev1/rev1.c rename to keyboards/ivndbt/late9/rev1/rev1.c index aa45141b06..f472de2ff5 100644 --- a/keyboards/rookiebwoy/late9/rev1/rev1.c +++ b/keyboards/ivndbt/late9/rev1/rev1.c @@ -1,4 +1,4 @@ -/* Copyright 2021 rookiebwoy +/* Copyright 2021 ivndbt * * 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 @@ -20,39 +20,39 @@ bool oled_task_kb(void) { if (!oled_task_user()) { return false; } static const char PROGMEM rb_logo[] = { - // rookiebwoy 128x32px - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 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, 0xf0, 0xf0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, - 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, - 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xe3, 0xe3, 0xe3, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0x1c, - 0x1c, 0x1c, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, - 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, - 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, - 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, - 0x3f, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x07, 0x07, 0x07, - 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x3f, - 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x3f, 0x3f, - 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, - 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x38, 0x38, 0x38, 0x3f, 0x3f, 0x3f, 0x00, - 0x00, 0x00, 0x07, 0x07, 0x07, 0x38, 0x38, 0x38, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + // ivndbt 128x32px + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x78, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xe1, 0xe1, 0xf8, 0xf8, + 0x00, 0x00, 0x80, 0x80, 0x06, 0x06, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xcc, 0x00, 0x80, 0xc0, 0xe0, + 0x00, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x80, 0xc0, 0xe0, 0x80, 0x40, 0x20, 0xe0, 0xe0, 0x00, 0x00, + 0xc0, 0xe0, 0x20, 0x60, 0xc8, 0xfc, 0xfc, 0x00, 0x10, 0xf8, 0xfc, 0x80, 0x40, 0x60, 0xe0, 0xc0, + 0x00, 0x50, 0xf8, 0xfc, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x20, 0x60, 0xc0, + 0xe0, 0x00, 0x80, 0xc0, 0x20, 0x60, 0xe0, 0xc0, 0x80, 0x00, 0x80, 0xc0, 0xe0, 0x80, 0x40, 0xe0, + 0xe0, 0x80, 0x40, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x60, 0x01, 0x01, 0x00, 0x00, 0x1f, 0x1f, 0x87, 0x87, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1f, 0x1f, 0x08, 0x00, 0x07, 0x0f, + 0x1c, 0x18, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1f, 0x1f, 0x08, 0x00, 0x00, 0x1f, 0x1f, 0x08, 0x00, + 0x07, 0x0f, 0x1c, 0x18, 0x08, 0x1f, 0x1f, 0x08, 0x00, 0x1f, 0x1f, 0x10, 0x10, 0x10, 0x0f, 0x07, + 0x00, 0x00, 0x1f, 0x1f, 0x08, 0x04, 0x00, 0x18, 0x18, 0x00, 0x07, 0x0f, 0x1c, 0x18, 0x10, 0x10, + 0x08, 0x00, 0x07, 0x0f, 0x1c, 0x18, 0x10, 0x0f, 0x07, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x1f, + 0x1f, 0x00, 0x00, 0x1f, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x0e, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; oled_write_raw_P(rb_logo, sizeof(rb_logo)); return false; diff --git a/keyboards/rookiebwoy/neopad/readme.md b/keyboards/ivndbt/neopad/readme.md similarity index 80% rename from keyboards/rookiebwoy/neopad/readme.md rename to keyboards/ivndbt/neopad/readme.md index 5b0ae7abc7..4b99835449 100644 --- a/keyboards/rookiebwoy/neopad/readme.md +++ b/keyboards/ivndbt/neopad/readme.md @@ -7,17 +7,17 @@ _Actually the number of switches is six, because even the encoder are allowed to The Neopad in the photo above is the first prototype. See the project repository for revision 1 update and KiCad files. -* Keyboard maintainer: [rookiebwoy](https://github.com/rookiebwoy) +* Keyboard maintainer: [ivndbt](https://github.com/ivndbt) * Hardware supported: ProMicro, _Elite-C (not tested)_ -* Project repository: [Neopad on github](https://github.com/rookiebwoy/neopad) +* Project repository: [Neopad on github](https://github.com/ivndbt/neopad) Make example for this keyboard (after setting up your build environment): - make rookiebwoy/neopad/rev1:default + make ivndbt/neopad/rev1:default Flashing example for this keyboard: - make rookiebwoy/neopad/rev1:default:flash + make ivndbt/neopad/rev1:default:flash When asked by the terminal, press the dedicated `RESET` button (the one above the 2 LEDs) to enter the bootloader and let the OS detects the device. diff --git a/keyboards/rookiebwoy/neopad/rev1/config.h b/keyboards/ivndbt/neopad/rev1/config.h similarity index 96% rename from keyboards/rookiebwoy/neopad/rev1/config.h rename to keyboards/ivndbt/neopad/rev1/config.h index fd1724caf1..7475224d1a 100755 --- a/keyboards/rookiebwoy/neopad/rev1/config.h +++ b/keyboards/ivndbt/neopad/rev1/config.h @@ -1,5 +1,5 @@ /* -Copyright 2021 rookiebwoy +Copyright 2021 ivndbt 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 diff --git a/keyboards/rookiebwoy/neopad/rev1/keyboard.json b/keyboards/ivndbt/neopad/rev1/keyboard.json similarity index 86% rename from keyboards/rookiebwoy/neopad/rev1/keyboard.json rename to keyboards/ivndbt/neopad/rev1/keyboard.json index 426d8af7ec..a07852acf0 100755 --- a/keyboards/rookiebwoy/neopad/rev1/keyboard.json +++ b/keyboards/ivndbt/neopad/rev1/keyboard.json @@ -1,11 +1,11 @@ { "keyboard_name": "neopad", - "manufacturer": "rookiebwoy", - "url": "https://github.com/rookiebwoy/neopad)", - "maintainer": "rookiebwoy", + "manufacturer": "ivndbt", + "url": "https://github.com/ivndbt/neopad)", + "maintainer": "ivndbt", "usb": { - "vid": "0xFEED", - "pid": "0x0913", + "vid": "0x6961", + "pid": "0x3031", "device_version": "0.1.0" }, "features": { diff --git a/keyboards/rookiebwoy/neopad/rev1/keymaps/default/keymap.c b/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c similarity index 99% rename from keyboards/rookiebwoy/neopad/rev1/keymaps/default/keymap.c rename to keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c index 08227c84f9..721c21ef3c 100755 --- a/keyboards/rookiebwoy/neopad/rev1/keymaps/default/keymap.c +++ b/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2021 rookiebwoy +/* Copyright 2021 ivndbt * * 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 diff --git a/keyboards/rookiebwoy/neopad/rev1/readme.md b/keyboards/ivndbt/neopad/rev1/readme.md similarity index 55% rename from keyboards/rookiebwoy/neopad/rev1/readme.md rename to keyboards/ivndbt/neopad/rev1/readme.md index 1265922722..6f8c6f1f25 100644 --- a/keyboards/rookiebwoy/neopad/rev1/readme.md +++ b/keyboards/ivndbt/neopad/rev1/readme.md @@ -1,5 +1,5 @@ # Neopad rev1 -Final revision of the Neopad macropad. For in depth look please go to [project repository](https://github.com/rookiebwoy/neopad). +Final revision of the Neopad macropad. For in depth look please go to [project repository](https://github.com/ivndbt/neopad). diff --git a/keyboards/rookiebwoy/neopad/rev1/rev1.c b/keyboards/ivndbt/neopad/rev1/rev1.c similarity index 98% rename from keyboards/rookiebwoy/neopad/rev1/rev1.c rename to keyboards/ivndbt/neopad/rev1/rev1.c index 3b527794c0..c093c37e20 100755 --- a/keyboards/rookiebwoy/neopad/rev1/rev1.c +++ b/keyboards/ivndbt/neopad/rev1/rev1.c @@ -1,4 +1,4 @@ -/* Copyright 2021 rookiebwoy +/* Copyright 2021 ivndbt * * 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 From 4f0a0f32f2c998107ed21698a72dcf951c303af4 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Tue, 20 May 2025 20:23:20 +0200 Subject: [PATCH 388/592] [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides (#25271) --- quantum/rgb_matrix/animations/pixel_flow_anim.h | 4 ++-- quantum/rgblight/rgblight.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quantum/rgb_matrix/animations/pixel_flow_anim.h b/quantum/rgb_matrix/animations/pixel_flow_anim.h index 35170f9588..44b4b5c481 100644 --- a/quantum/rgb_matrix/animations/pixel_flow_anim.h +++ b/quantum/rgb_matrix/animations/pixel_flow_anim.h @@ -22,7 +22,7 @@ static bool PIXEL_FLOW(effect_params_t* params) { // Clear LEDs and fill the state array rgb_matrix_set_color_all(0, 0, 0); for (uint8_t j = 0; j < RGB_MATRIX_LED_COUNT; ++j) { - led[j] = (random8() & 2) ? (rgb_t){0, 0, 0} : hsv_to_rgb((hsv_t){random8(), random8_min_max(127, 255), rgb_matrix_config.hsv.v}); + led[j] = (random8() & 2) ? (rgb_t){0, 0, 0} : rgb_matrix_hsv_to_rgb((hsv_t){random8(), random8_min_max(127, 255), rgb_matrix_config.hsv.v}); } } @@ -39,7 +39,7 @@ static bool PIXEL_FLOW(effect_params_t* params) { led[j] = led[j + 1]; } // Fill last LED - led[led_max - 1] = (random8() & 2) ? (rgb_t){0, 0, 0} : hsv_to_rgb((hsv_t){random8(), random8_min_max(127, 255), rgb_matrix_config.hsv.v}); + led[led_max - 1] = (random8() & 2) ? (rgb_t){0, 0, 0} : rgb_matrix_hsv_to_rgb((hsv_t){random8(), random8_min_max(127, 255), rgb_matrix_config.hsv.v}); // Set pulse timer wait_timer = g_rgb_timer + interval(); } diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c index 83f97c8114..bfccb472b5 100644 --- a/quantum/rgblight/rgblight.c +++ b/quantum/rgblight/rgblight.c @@ -496,7 +496,7 @@ void rgblight_decrease_speed_noeeprom(void) { void rgblight_sethsv_noeeprom_old(uint8_t hue, uint8_t sat, uint8_t val) { if (rgblight_config.enable) { - rgb_t rgb = hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); + rgb_t rgb = rgblight_hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); rgblight_setrgb(rgb.r, rgb.g, rgb.b); } } @@ -515,7 +515,7 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w // needed for rgblight_layers_write() to get the new val, since it reads rgblight_config.val rgblight_config.val = val; #endif - rgb_t rgb = hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); + rgb_t rgb = rgblight_hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); rgblight_setrgb(rgb.r, rgb.g, rgb.b); } else { // all LEDs in same color @@ -647,7 +647,7 @@ void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index) { return; } - rgb_t rgb = hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); + rgb_t rgb = rgblight_hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); rgblight_setrgb_at(rgb.r, rgb.g, rgb.b, index); } @@ -679,7 +679,7 @@ void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start, return; } - rgb_t rgb = hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); + rgb_t rgb = rgblight_hsv_to_rgb((hsv_t){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val}); rgblight_setrgb_range(rgb.r, rgb.g, rgb.b, start, end); } From fa24b0fcce2c5f3330f2d798c3caf91a130babdb Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 21 May 2025 07:17:58 +1000 Subject: [PATCH 389/592] Remove outdated `nix` support due to bit-rot. (#25280) --- shell.nix | 72 ----- util/nix/poetry.lock | 671 ---------------------------------------- util/nix/pyproject.toml | 39 --- util/nix/sources.json | 38 --- util/nix/sources.nix | 198 ------------ 5 files changed, 1018 deletions(-) delete mode 100644 shell.nix delete mode 100644 util/nix/poetry.lock delete mode 100644 util/nix/pyproject.toml delete mode 100644 util/nix/sources.json delete mode 100644 util/nix/sources.nix diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 88822b0b17..0000000000 --- a/shell.nix +++ /dev/null @@ -1,72 +0,0 @@ -let - # We specify sources via Niv: use "niv update nixpkgs" to update nixpkgs, for example. - sources = import ./util/nix/sources.nix { }; -in -# However, if you want to override Niv's inputs, this will let you do that. -{ pkgs ? import sources.nixpkgs { } -, poetry2nix ? pkgs.callPackage (import sources.poetry2nix) { } -, avr ? true -, arm ? true -, teensy ? true }: -with pkgs; -let - avrlibc = pkgsCross.avr.libcCross; - - avr_incflags = [ - "-isystem ${avrlibc}/avr/include" - "-B${avrlibc}/avr/lib/avr5" - "-L${avrlibc}/avr/lib/avr5" - "-B${avrlibc}/avr/lib/avr35" - "-L${avrlibc}/avr/lib/avr35" - "-B${avrlibc}/avr/lib/avr51" - "-L${avrlibc}/avr/lib/avr51" - ]; - - # Builds the python env based on nix/pyproject.toml and - # nix/poetry.lock Use the "poetry update --lock", "poetry add - # --lock" etc. in the nix folder to adjust the contents of those - # files if the requirements*.txt files change - pythonEnv = poetry2nix.mkPoetryEnv { - projectDir = ./util/nix; - overrides = poetry2nix.overrides.withDefaults (self: super: { - qmk = super.qmk.overridePythonAttrs(old: { - # Allow QMK CLI to run "qmk" as a subprocess (the wrapper changes - # $PATH and breaks these invocations). - dontWrapPythonPrograms = true; - - # Fix "qmk setup" to use the Python interpreter from the environment - # when invoking "qmk doctor" (sys.executable gets its value from - # $NIX_PYTHONEXECUTABLE, which is set by the "qmk" wrapper from the - # Python environment, so "qmk doctor" then runs with the proper - # $NIX_PYTHONPATH too, because sys.executable actually points to - # another wrapper from the same Python environment). - postPatch = '' - substituteInPlace qmk_cli/subcommands/setup.py \ - --replace "[Path(sys.argv[0]).as_posix()" \ - "[Path(sys.executable).as_posix(), Path(sys.argv[0]).as_posix()" - ''; - }); - }); - }; -in -mkShell { - name = "qmk-firmware"; - - buildInputs = [ clang-tools_11 dfu-programmer dfu-util diffutils git pythonEnv niv ] - ++ lib.optional avr [ - pkgsCross.avr.buildPackages.binutils - pkgsCross.avr.buildPackages.gcc8 - avrlibc - avrdude - ] - ++ lib.optional arm [ gcc-arm-embedded ] - ++ lib.optional teensy [ teensy-loader-cli ]; - - AVR_CFLAGS = lib.optional avr avr_incflags; - AVR_ASFLAGS = lib.optional avr avr_incflags; - shellHook = '' - # Prevent the avr-gcc wrapper from picking up host GCC flags - # like -iframework, which is problematic on Darwin - unset NIX_CFLAGS_COMPILE_FOR_TARGET - ''; -} diff --git a/util/nix/poetry.lock b/util/nix/poetry.lock deleted file mode 100644 index e9ac914702..0000000000 --- a/util/nix/poetry.lock +++ /dev/null @@ -1,671 +0,0 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "argcomplete" -version = "3.2.2" -description = "Bash tab completion for argparse" -optional = false -python-versions = ">=3.8" -files = [ - {file = "argcomplete-3.2.2-py3-none-any.whl", hash = "sha256:e44f4e7985883ab3e73a103ef0acd27299dbfe2dfed00142c35d4ddd3005901d"}, - {file = "argcomplete-3.2.2.tar.gz", hash = "sha256:f3e49e8ea59b4026ee29548e24488af46e30c9de57d48638e24f54a1ea1000a2"}, -] - -[package.extras] -test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "dotty-dict" -version = "1.3.1" -description = "Dictionary wrapper for quick access to deeply nested keys." -optional = false -python-versions = ">=3.5,<4.0" -files = [ - {file = "dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f"}, - {file = "dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15"}, -] - -[[package]] -name = "flake8" -version = "7.0.0" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, -] - -[package.dependencies] -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" -pyflakes = ">=3.2.0,<3.3.0" - -[[package]] -name = "halo" -version = "0.0.31" -description = "Beautiful terminal spinners in Python" -optional = false -python-versions = ">=3.4" -files = [ - {file = "halo-0.0.31-py2-none-any.whl", hash = "sha256:5350488fb7d2aa7c31a1344120cee67a872901ce8858f60da7946cef96c208ab"}, - {file = "halo-0.0.31.tar.gz", hash = "sha256:7b67a3521ee91d53b7152d4ee3452811e1d2a6321975137762eb3d70063cc9d6"}, -] - -[package.dependencies] -colorama = ">=0.3.9" -log-symbols = ">=0.0.14" -six = ">=1.12.0" -spinners = ">=0.0.24" -termcolor = ">=1.1.0" - -[package.extras] -ipython = ["IPython (==5.7.0)", "ipywidgets (==7.1.0)"] - -[[package]] -name = "hid" -version = "1.0.6" -description = "ctypes bindings for hidapi" -optional = false -python-versions = "*" -files = [ - {file = "hid-1.0.6-py3-none-any.whl", hash = "sha256:60446054aec54a767d9a4e97920761f41809a055c6d51c54879e37a706dcb588"}, - {file = "hid-1.0.6.tar.gz", hash = "sha256:48d764d7ae9746ba123b96dbf457893ca80268b7791c4b1d2e051310eeb83860"}, -] - -[[package]] -name = "hjson" -version = "3.1.0" -description = "Hjson, a user interface for JSON." -optional = false -python-versions = "*" -files = [ - {file = "hjson-3.1.0-py3-none-any.whl", hash = "sha256:65713cdcf13214fb554eb8b4ef803419733f4f5e551047c9b711098ab7186b89"}, - {file = "hjson-3.1.0.tar.gz", hash = "sha256:55af475a27cf83a7969c808399d7bccdec8fb836a07ddbd574587593b9cdcf75"}, -] - -[[package]] -name = "importlib-metadata" -version = "7.0.1" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] - -[[package]] -name = "jsonschema" -version = "4.21.1" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - -[[package]] -name = "log-symbols" -version = "0.0.14" -description = "Colored symbols for various log levels for Python" -optional = false -python-versions = "*" -files = [ - {file = "log_symbols-0.0.14-py3-none-any.whl", hash = "sha256:4952106ff8b605ab7d5081dd2c7e6ca7374584eff7086f499c06edd1ce56dcca"}, - {file = "log_symbols-0.0.14.tar.gz", hash = "sha256:cf0bbc6fe1a8e53f0d174a716bc625c4f87043cc21eb55dd8a740cfe22680556"}, -] - -[package.dependencies] -colorama = ">=0.3.9" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "milc" -version = "1.8.0" -description = "Opinionated Batteries-Included Python 3 CLI Framework." -optional = false -python-versions = ">=3.7" -files = [ - {file = "milc-1.8.0-py2.py3-none-any.whl", hash = "sha256:faee16fe92ce13eb1b0b4e24ac5b5003d7234880a8d21e4210016d70512bc921"}, - {file = "milc-1.8.0.tar.gz", hash = "sha256:cabe658de07ab97f937c7672b8a604cc825174c28d66d3afd047a9b4b2770bbe"}, -] - -[package.dependencies] -appdirs = "*" -argcomplete = "*" -colorama = "*" -halo = "*" -spinners = "*" -types-colorama = "*" - -[[package]] -name = "nose2" -version = "0.14.1" -description = "unittest with plugins" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nose2-0.14.1-py3-none-any.whl", hash = "sha256:dfbf0d90c98b8d7bbf47d7721c7554ffcca86828ec074c985bb6ecc83c445a4e"}, - {file = "nose2-0.14.1.tar.gz", hash = "sha256:7f8f03a21c9de2c33015933afcef72bf8e4a2d5dfec3b40092287de6e41b093a"}, -] - -[package.extras] -coverage-plugin = ["coverage"] -dev = ["Sphinx", "sphinx-issues", "sphinx-rtd-theme"] - -[[package]] -name = "pep8-naming" -version = "0.13.3" -description = "Check PEP-8 naming conventions, plugin for flake8" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, - {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, -] - -[package.dependencies] -flake8 = ">=5.0.0" - -[[package]] -name = "pillow" -version = "10.2.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -fpx = ["olefile"] -mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] -xmp = ["defusedxml"] - -[[package]] -name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] - -[[package]] -name = "pycodestyle" -version = "2.11.1" -description = "Python style guide checker" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, -] - -[[package]] -name = "pyflakes" -version = "3.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - -[[package]] -name = "pygments" -version = "2.17.2" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, -] - -[package.extras] -plugins = ["importlib-metadata"] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pyserial" -version = "3.5" -description = "Python Serial Port Extension" -optional = false -python-versions = "*" -files = [ - {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, - {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, -] - -[package.extras] -cp2110 = ["hidapi"] - -[[package]] -name = "pyusb" -version = "1.2.1" -description = "Python USB access module" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "pyusb-1.2.1-py3-none-any.whl", hash = "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36"}, - {file = "pyusb-1.2.1.tar.gz", hash = "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"}, -] - -[[package]] -name = "qmk" -version = "1.1.5" -description = "A program to help users work with QMK Firmware." -optional = false -python-versions = ">=3.7" -files = [ - {file = "qmk-1.1.5-py2.py3-none-any.whl", hash = "sha256:9c16fa2ad9b279ce9cc121a5462f02637611c6f54c49f9f2cac8ba2898f35b94"}, - {file = "qmk-1.1.5.tar.gz", hash = "sha256:2efe3c752230c6ba24b8719c3b6e85a5644bf8f7d0dd237757eda9b7b7e60b11"}, -] - -[package.dependencies] -dotty-dict = "*" -hid = "*" -hjson = "*" -jsonschema = ">=4" -milc = ">=1.6.8" -pillow = "*" -pygments = "*" -pyserial = "*" -pyusb = "*" -setuptools = ">=45" - -[[package]] -name = "referencing" -version = "0.33.0" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, - {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - -[[package]] -name = "rpds-py" -version = "0.18.0" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, -] - -[[package]] -name = "setuptools" -version = "69.1.1" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, - {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "spinners" -version = "0.0.24" -description = "Spinners for terminals" -optional = false -python-versions = "*" -files = [ - {file = "spinners-0.0.24-py3-none-any.whl", hash = "sha256:2fa30d0b72c9650ad12bbe031c9943b8d441e41b4f5602b0ec977a19f3290e98"}, - {file = "spinners-0.0.24.tar.gz", hash = "sha256:1eb6aeb4781d72ab42ed8a01dcf20f3002bf50740d7154d12fb8c9769bf9e27f"}, -] - -[[package]] -name = "termcolor" -version = "2.4.0" -description = "ANSI color formatting for output in terminal" -optional = false -python-versions = ">=3.8" -files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "types-colorama" -version = "0.4.15.20240205" -description = "Typing stubs for colorama" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-colorama-0.4.15.20240205.tar.gz", hash = "sha256:7ae4f58d407d387f4f98b24d81e1b7657ec754ea1dc4619ae5bd27f0c367637e"}, - {file = "types_colorama-0.4.15.20240205-py3-none-any.whl", hash = "sha256:3ab26dcd76d2f13b1b795ed5c87a1a1a29331ea64cf614bb6ae958a3cebc3a53"}, -] - -[[package]] -name = "yapf" -version = "0.40.2" -description = "A formatter for Python code" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yapf-0.40.2-py3-none-any.whl", hash = "sha256:adc8b5dd02c0143108878c499284205adb258aad6db6634e5b869e7ee2bd548b"}, - {file = "yapf-0.40.2.tar.gz", hash = "sha256:4dab8a5ed7134e26d57c1647c7483afb3f136878b579062b786c9ba16b94637b"}, -] - -[package.dependencies] -importlib-metadata = ">=6.6.0" -platformdirs = ">=3.5.1" -tomli = ">=2.0.1" - -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "6146ea1571def62c4f7ff33173e0144bcfd206c178936365bff8b4e1669b90ff" diff --git a/util/nix/pyproject.toml b/util/nix/pyproject.toml deleted file mode 100644 index fa62eb96c0..0000000000 --- a/util/nix/pyproject.toml +++ /dev/null @@ -1,39 +0,0 @@ -# This file should be kept in sync with requirements.txt and requirements-dev.txt -# It is particularly required by the Nix environment (see shell.nix). To update versions, -# normally one would run "poetry update --lock" -[tool.poetry] -name = "qmk_firmware" -version = "0.1.0" -description = "" -authors = [] - -[tool.poetry.dependencies] -python = "^3.11" -appdirs = "*" -argcomplete = "*" -colorama = "*" -dotty-dict = "*" -hid = "*" -hjson = "*" -jsonschema = ">=4" -milc = ">=1.4.2" -Pygments = "*" -pyserial = "*" -pyusb = "*" -pillow = "*" - -# This dependency is not mentioned in requirements.txt (QMK CLI is not a -# library package that is required by the Python code in qmk_firmware), but is -# required to build a proper nix-shell environment. -qmk = "*" - -[tool.poetry.dev-dependencies] -nose2 = "*" -flake8 = "*" -pep8-naming = "*" -pyflakes = "*" -yapf = "*" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/util/nix/sources.json b/util/nix/sources.json deleted file mode 100644 index 3985f75e03..0000000000 --- a/util/nix/sources.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "niv": { - "branch": "master", - "description": "Easy dependency management for Nix projects", - "homepage": "https://github.com/nmattia/niv", - "owner": "nmattia", - "repo": "niv", - "rev": "af958e8057f345ee1aca714c1247ef3ba1c15f5e", - "sha256": "1qjavxabbrsh73yck5dcq8jggvh3r2jkbr6b5nlz5d9yrqm9255n", - "type": "tarball", - "url": "https://github.com/nmattia/niv/archive/af958e8057f345ee1aca714c1247ef3ba1c15f5e.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "nixpkgs": { - "branch": "nixpkgs-unstable", - "description": "Nix Packages collection", - "homepage": "", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "98b00b6947a9214381112bdb6f89c25498db4959", - "sha256": "1m6dm144mbm56n9293m26f46bjrklknyr4q4kzvxkiv036ijma98", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/98b00b6947a9214381112bdb6f89c25498db4959.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - }, - "poetry2nix": { - "branch": "master", - "description": "Convert poetry projects to nix automagically [maintainer=@adisbladis] ", - "homepage": "", - "owner": "nix-community", - "repo": "poetry2nix", - "rev": "3c92540611f42d3fb2d0d084a6c694cd6544b609", - "sha256": "1jfrangw0xb5b8sdkimc550p3m98zhpb1fayahnr7crg74as4qyq", - "type": "tarball", - "url": "https://github.com/nix-community/poetry2nix/archive/3c92540611f42d3fb2d0d084a6c694cd6544b609.tar.gz", - "url_template": "https://github.com///archive/.tar.gz" - } -} diff --git a/util/nix/sources.nix b/util/nix/sources.nix deleted file mode 100644 index fe3dadf7eb..0000000000 --- a/util/nix/sources.nix +++ /dev/null @@ -1,198 +0,0 @@ -# This file has been generated by Niv. - -let - - # - # The fetchers. fetch_ fetches specs of type . - # - - fetch_file = pkgs: name: spec: - let - name' = sanitizeName name + "-src"; - in - if spec.builtin or true then - builtins_fetchurl { inherit (spec) url sha256; name = name'; } - else - pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; - - fetch_tarball = pkgs: name: spec: - let - name' = sanitizeName name + "-src"; - in - if spec.builtin or true then - builtins_fetchTarball { name = name'; inherit (spec) url sha256; } - else - pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; - - fetch_git = name: spec: - let - ref = - spec.ref or ( - if spec ? branch then "refs/heads/${spec.branch}" else - if spec ? tag then "refs/tags/${spec.tag}" else - abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!" - ); - submodules = spec.submodules or false; - submoduleArg = - let - nixSupportsSubmodules = builtins.compareVersions builtins.nixVersion "2.4" >= 0; - emptyArgWithWarning = - if submodules - then - builtins.trace - ( - "The niv input \"${name}\" uses submodules " - + "but your nix's (${builtins.nixVersion}) builtins.fetchGit " - + "does not support them" - ) - { } - else { }; - in - if nixSupportsSubmodules - then { inherit submodules; } - else emptyArgWithWarning; - in - builtins.fetchGit - ({ url = spec.repo; inherit (spec) rev; inherit ref; } // submoduleArg); - - fetch_local = spec: spec.path; - - fetch_builtin-tarball = name: throw - ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=tarball -a builtin=true''; - - fetch_builtin-url = name: throw - ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. - $ niv modify ${name} -a type=file -a builtin=true''; - - # - # Various helpers - # - - # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 - sanitizeName = name: - ( - concatMapStrings (s: if builtins.isList s then "-" else s) - ( - builtins.split "[^[:alnum:]+._?=-]+" - ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) - ) - ); - - # The set of packages used when specs are fetched using non-builtins. - mkPkgs = sources: system: - let - sourcesNixpkgs = - import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; - hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; - hasThisAsNixpkgsPath = == ./.; - in - if builtins.hasAttr "nixpkgs" sources - then sourcesNixpkgs - else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then - import { } - else - abort - '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; - - # The actual fetching function. - fetch = pkgs: name: spec: - - if ! builtins.hasAttr "type" spec then - abort "ERROR: niv spec ${name} does not have a 'type' attribute" - else if spec.type == "file" then fetch_file pkgs name spec - else if spec.type == "tarball" then fetch_tarball pkgs name spec - else if spec.type == "git" then fetch_git name spec - else if spec.type == "local" then fetch_local spec - else if spec.type == "builtin-tarball" then fetch_builtin-tarball name - else if spec.type == "builtin-url" then fetch_builtin-url name - else - abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; - - # If the environment variable NIV_OVERRIDE_${name} is set, then use - # the path directly as opposed to the fetched source. - replace = name: drv: - let - saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name; - ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; - in - if ersatz == "" then drv else - # this turns the string into an actual Nix path (for both absolute and - # relative paths) - if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; - - # Ports of functions for older nix versions - - # a Nix version of mapAttrs if the built-in doesn't exist - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 - stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); - - # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 - stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); - concatMapStrings = f: list: concatStrings (map f list); - concatStrings = builtins.concatStringsSep ""; - - # https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 - optionalAttrs = cond: as: if cond then as else { }; - - # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name ? null, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchTarball; - in - if lessThan nixVersion "1.12" then - fetchTarball ({ inherit url; } // (optionalAttrs (name != null) { inherit name; })) - else - fetchTarball attrs; - - # fetchurl version that is compatible between all the versions of Nix - builtins_fetchurl = { url, name ? null, sha256 }@attrs: - let - inherit (builtins) lessThan nixVersion fetchurl; - in - if lessThan nixVersion "1.12" then - fetchurl ({ inherit url; } // (optionalAttrs (name != null) { inherit name; })) - else - fetchurl attrs; - - # Create the final "sources" from the config - mkSources = config: - mapAttrs - ( - name: spec: - if builtins.hasAttr "outPath" spec - then - abort - "The values in sources.json should not have an 'outPath' attribute" - else - spec // { outPath = replace name (fetch config.pkgs name spec); } - ) - config.sources; - - # The "config" used by the fetchers - mkConfig = - { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null - , sources ? if sourcesFile == null then { } else builtins.fromJSON (builtins.readFile sourcesFile) - , system ? builtins.currentSystem - , pkgs ? mkPkgs sources system - }: rec { - # The sources, i.e. the attribute set of spec name to spec - inherit sources; - - # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers - inherit pkgs; - }; - -in -mkSources (mkConfig { }) // { __functor = _: settings: mkSources (mkConfig settings); } From 955809bd5aee8b1444595b450eeeef1f42799995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Mart=C3=ADnez?= <58857054+elpekenin@users.noreply.github.com> Date: Thu, 22 May 2025 15:31:15 +0200 Subject: [PATCH 390/592] Add `compiler_support.h` (#25274) --- docs/quantum_painter_qff.md | 4 ++-- docs/quantum_painter_qgf.md | 8 ++++---- drivers/lcd/st7565.c | 3 ++- drivers/oled/oled_driver.c | 4 +++- drivers/sensors/azoteq_iqs5xx.h | 7 ++++--- drivers/sensors/pmw33xx_common.h | 5 +++-- lib/fnv/qmk_fnv_type_validation.c | 9 +++++---- .../qmk/cli/generate/community_modules.py | 6 ++++-- platforms/atomic_util.h | 12 +++++++----- platforms/avr/drivers/i2c_slave.h | 4 +++- platforms/avr/gpio.h | 6 ++++-- platforms/chibios/chibios_config.h | 4 +++- .../wear_leveling/wear_leveling_rp2040_flash.c | 6 ++++-- quantum/audio/audio.h | 4 +++- quantum/backlight/backlight.h | 4 +++- quantum/compiler_support.h | 15 +++++++++++++++ quantum/connection/connection.h | 4 +++- quantum/haptic.h | 4 +++- quantum/keycode_config.h | 6 ++---- quantum/keymap_introspection.c | 13 +++++++------ quantum/led_matrix/led_matrix_types.h | 4 +++- quantum/nvm/eeprom/nvm_dynamic_keymap.c | 7 ++++--- .../nvm/eeprom/nvm_eeprom_eeconfig_internal.h | 4 +++- quantum/painter/qff.h | 9 +++++---- quantum/painter/qgf.h | 17 +++++++++-------- quantum/painter/qp_draw_core.c | 3 ++- quantum/painter/qp_internal.c | 4 +++- quantum/painter/qp_internal_formats.h | 3 ++- quantum/rgb_matrix/rgb_matrix_types.h | 4 +++- quantum/rgblight/rgblight.h | 4 +++- quantum/split_common/split_util.c | 8 +++++--- quantum/split_common/transaction_id_define.h | 4 +++- quantum/split_common/transport.c | 3 ++- quantum/unicode/unicode.h | 4 +++- quantum/wear_leveling/wear_leveling_internal.h | 14 ++++++-------- tmk_core/protocol/vusb/vusb.c | 3 ++- 36 files changed, 142 insertions(+), 81 deletions(-) create mode 100644 quantum/compiler_support.h diff --git a/docs/quantum_painter_qff.md b/docs/quantum_painter_qff.md index 3695be2c5b..198d87384a 100644 --- a/docs/quantum_painter_qff.md +++ b/docs/quantum_painter_qff.md @@ -44,7 +44,7 @@ typedef struct __attribute__((packed)) qff_font_descriptor_v1_t { uint8_t compression_scheme; // compression scheme, see below. uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented) } qff_font_descriptor_v1_t; -// _Static_assert(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF"); +// STATIC_ASSERT(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF"); ``` The values for `format`, `flags`, `compression_scheme`, and `transparency_index` match [QGF's frame descriptor block](quantum_painter_qgf#qgf-frame-descriptor), with the exception that the `delta` flag is ignored by QFF. @@ -66,7 +66,7 @@ typedef struct __attribute__((packed)) qff_ascii_glyph_table_v1_t { qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 } uint24_t glyph[95]; // 95 glyphs, 0x20..0x7E, see bits/masks above for values } qff_ascii_glyph_table_v1_t; -// _Static_assert(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF"); +// STATIC_ASSERT(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF"); ``` ## Unicode glyph table {#qff-unicode-table} diff --git a/docs/quantum_painter_qgf.md b/docs/quantum_painter_qgf.md index 700b78d105..dd525e4b83 100644 --- a/docs/quantum_painter_qgf.md +++ b/docs/quantum_painter_qgf.md @@ -32,7 +32,7 @@ typedef struct __attribute__((packed)) qgf_block_header_v1_t { uint8_t neg_type_id; // Negated type ID, used for detecting parsing errors uint24_t length; // 24-bit blob length, allowing for block sizes of a maximum of 16MB } qgf_block_header_v1_t; -// _Static_assert(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF"); +// STATIC_ASSERT(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF"); ``` The _length_ describes the number of octets in the data following the block header -- a block header may specify a _length_ of `0` if no blob is specified. @@ -56,7 +56,7 @@ typedef struct __attribute__((packed)) qgf_graphics_descriptor_v1_t { uint16_t image_height; // in pixels uint16_t frame_count; // minimum of 1 } qgf_graphics_descriptor_v1_t; -// _Static_assert(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF"); +// STATIC_ASSERT(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF"); ``` ## Frame offset block {#qgf-frame-offset-descriptor} @@ -95,7 +95,7 @@ typedef struct __attribute__((packed)) qgf_frame_v1_t { uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented) uint16_t delay; // frame delay time for animations (in units of milliseconds) } qgf_frame_v1_t; -// _Static_assert(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF"); +// STATIC_ASSERT(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF"); ``` If this frame is grayscale, the _frame descriptor block_ (or _frame delta block_ if flags denote a delta frame) is immediately followed by this frame's corresponding _frame data block_. @@ -160,7 +160,7 @@ typedef struct __attribute__((packed)) qgf_delta_v1_t { uint16_t right; // The right pixel location to to draw the delta image uint16_t bottom; // The bottom pixel location to to draw the delta image } qgf_delta_v1_t; -// _Static_assert(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF"); +// STATIC_ASSERT(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF"); ``` ## Frame data block {#qgf-frame-data-descriptor} diff --git a/drivers/lcd/st7565.c b/drivers/lcd/st7565.c index cf71c5e5a3..f24bb78048 100644 --- a/drivers/lcd/st7565.c +++ b/drivers/lcd/st7565.c @@ -19,6 +19,7 @@ along with this program. If not, see . #include +#include "compiler_support.h" #include "keyboard.h" #include "progmem.h" #include "timer.h" @@ -265,7 +266,7 @@ void st7565_write_char(const char data, bool invert) { static uint8_t st7565_temp_buffer[ST7565_FONT_WIDTH]; memcpy(&st7565_temp_buffer, st7565_cursor, ST7565_FONT_WIDTH); - _Static_assert(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array"); + STATIC_ASSERT(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array"); // set the reder buffer data uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c index 1d1c2a90c4..7e46bcb3f7 100644 --- a/drivers/oled/oled_driver.c +++ b/drivers/oled/oled_driver.c @@ -23,6 +23,8 @@ along with this program. If not, see . # include "keyboard.h" # endif #endif + +#include "compiler_support.h" #include "oled_driver.h" #include OLED_FONT_H #include "timer.h" @@ -601,7 +603,7 @@ void oled_write_char(const char data, bool invert) { static uint8_t oled_temp_buffer[OLED_FONT_WIDTH]; memcpy(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH); - _Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array"); + STATIC_ASSERT(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array"); // set the reder buffer data uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index diff --git a/drivers/sensors/azoteq_iqs5xx.h b/drivers/sensors/azoteq_iqs5xx.h index e1e8b67b31..eb01903e33 100644 --- a/drivers/sensors/azoteq_iqs5xx.h +++ b/drivers/sensors/azoteq_iqs5xx.h @@ -4,6 +4,7 @@ #pragma once +#include "compiler_support.h" #include "i2c_master.h" #include "pointing_device.h" #include "util.h" @@ -79,7 +80,7 @@ typedef struct { azoteq_iqs5xx_relative_xy_t y; } azoteq_iqs5xx_base_data_t; -_Static_assert(sizeof(azoteq_iqs5xx_base_data_t) == 10, "azoteq_iqs5xx_basic_report_t should be 10 bytes"); +STATIC_ASSERT(sizeof(azoteq_iqs5xx_base_data_t) == 10, "azoteq_iqs5xx_basic_report_t should be 10 bytes"); typedef struct { uint8_t number_of_fingers; @@ -87,7 +88,7 @@ typedef struct { azoteq_iqs5xx_relative_xy_t y; } azoteq_iqs5xx_report_data_t; -_Static_assert(sizeof(azoteq_iqs5xx_report_data_t) == 5, "azoteq_iqs5xx_report_data_t should be 5 bytes"); +STATIC_ASSERT(sizeof(azoteq_iqs5xx_report_data_t) == 5, "azoteq_iqs5xx_report_data_t should be 5 bytes"); typedef struct PACKED { bool sw_input : 1; @@ -159,7 +160,7 @@ typedef struct PACKED { uint16_t zoom_consecutive_distance; } azoteq_iqs5xx_gesture_config_t; -_Static_assert(sizeof(azoteq_iqs5xx_gesture_config_t) == 24, "azoteq_iqs5xx_gesture_config_t should be 24 bytes"); +STATIC_ASSERT(sizeof(azoteq_iqs5xx_gesture_config_t) == 24, "azoteq_iqs5xx_gesture_config_t should be 24 bytes"); typedef struct { uint16_t x_resolution; diff --git a/drivers/sensors/pmw33xx_common.h b/drivers/sensors/pmw33xx_common.h index 22e35c3327..82303ba6d9 100644 --- a/drivers/sensors/pmw33xx_common.h +++ b/drivers/sensors/pmw33xx_common.h @@ -10,6 +10,7 @@ #pragma once +#include "compiler_support.h" #include "keyboard.h" #include #include "spi_master.h" @@ -39,8 +40,8 @@ typedef struct __attribute__((packed)) { int16_t delta_y; // displacement on y directions. } pmw33xx_report_t; -_Static_assert(sizeof(pmw33xx_report_t) == 6, "pmw33xx_report_t must be 6 bytes in size"); -_Static_assert(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.motion must be 1 byte in size"); +STATIC_ASSERT(sizeof(pmw33xx_report_t) == 6, "pmw33xx_report_t must be 6 bytes in size"); +STATIC_ASSERT(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.motion must be 1 byte in size"); #if !defined(PMW33XX_CLOCK_SPEED) # define PMW33XX_CLOCK_SPEED 2000000 diff --git a/lib/fnv/qmk_fnv_type_validation.c b/lib/fnv/qmk_fnv_type_validation.c index e8576617ba..5e8ef5c54c 100644 --- a/lib/fnv/qmk_fnv_type_validation.c +++ b/lib/fnv/qmk_fnv_type_validation.c @@ -1,14 +1,15 @@ // Copyright 2022 Nick Brassel (@tzarc) // SPDX-License-Identifier: GPL-2.0-or-later #include "fnv.h" +#include "compiler_support.h" // This library was originally sourced from: // http://www.isthe.com/chongo/tech/comp/fnv/index.html // // Version at the time of retrieval on 2022-06-26: v5.0.3 -_Static_assert(sizeof(long long) == 8, "long long should be 64 bits"); -_Static_assert(sizeof(unsigned long long) == 8, "unsigned long long should be 64 bits"); +STATIC_ASSERT(sizeof(long long) == 8, "long long should be 64 bits"); +STATIC_ASSERT(sizeof(unsigned long long) == 8, "unsigned long long should be 64 bits"); -_Static_assert(sizeof(Fnv32_t) == 4, "Fnv32_t should be 32 bits"); -_Static_assert(sizeof(Fnv64_t) == 8, "Fnv64_t should be 64 bits"); +STATIC_ASSERT(sizeof(Fnv32_t) == 4, "Fnv32_t should be 32 bits"); +STATIC_ASSERT(sizeof(Fnv64_t) == 8, "Fnv64_t should be 64 bits"); diff --git a/lib/python/qmk/cli/generate/community_modules.py b/lib/python/qmk/cli/generate/community_modules.py index 1f37b760ca..a5ab61f9bd 100644 --- a/lib/python/qmk/cli/generate/community_modules.py +++ b/lib/python/qmk/cli/generate/community_modules.py @@ -52,7 +52,7 @@ def _render_keycodes(module_jsons): lines.append('') lines.append(' LAST_COMMUNITY_MODULE_KEY') lines.append('};') - lines.append('_Static_assert((int)LAST_COMMUNITY_MODULE_KEY <= (int)(QK_COMMUNITY_MODULE_MAX+1), "Too many community module keycodes");') + lines.append('STATIC_ASSERT((int)LAST_COMMUNITY_MODULE_KEY <= (int)(QK_COMMUNITY_MODULE_MAX+1), "Too many community module keycodes");') return lines @@ -215,9 +215,11 @@ def generate_community_modules_h(cli): '#include ', '#include ', '', + '#include "compiler_support.h"', + '', '#define COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) (((((uint32_t)(ver_major))&0xFF) << 24) | ((((uint32_t)(ver_minor))&0xFF) << 16) | (((uint32_t)(ver_patch))&0xFF))', f'#define COMMUNITY_MODULES_API_VERSION COMMUNITY_MODULES_API_VERSION_BUILDER({ver_major},{ver_minor},{ver_patch})', - f'#define ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(ver_major,ver_minor,ver_patch) _Static_assert(COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) <= COMMUNITY_MODULES_API_VERSION, "Community module requires a newer version of QMK modules API -- needs: " #ver_major "." #ver_minor "." #ver_patch ", current: {api_version}.")', + f'#define ASSERT_COMMUNITY_MODULES_MIN_API_VERSION(ver_major,ver_minor,ver_patch) STATIC_ASSERT(COMMUNITY_MODULES_API_VERSION_BUILDER(ver_major,ver_minor,ver_patch) <= COMMUNITY_MODULES_API_VERSION, "Community module requires a newer version of QMK modules API -- needs: " #ver_major "." #ver_minor "." #ver_patch ", current: {api_version}.")', '', 'typedef struct keyrecord_t keyrecord_t; // forward declaration so we don\'t need to include quantum.h', '', diff --git a/platforms/atomic_util.h b/platforms/atomic_util.h index 21286d72eb..8e81eacdb8 100644 --- a/platforms/atomic_util.h +++ b/platforms/atomic_util.h @@ -15,17 +15,19 @@ */ #pragma once +#include "compiler_support.h" + // Macro to help make GPIO and other controls atomic. #ifndef IGNORE_ATOMIC_BLOCK # if __has_include_next("atomic_util.h") # include_next "atomic_util.h" /* Include the platforms atomic.h */ # else -# define ATOMIC_BLOCK _Static_assert(0, "ATOMIC_BLOCK not implemented") -# define ATOMIC_BLOCK_RESTORESTATE _Static_assert(0, "ATOMIC_BLOCK_RESTORESTATE not implemented") -# define ATOMIC_BLOCK_FORCEON _Static_assert(0, "ATOMIC_BLOCK_FORCEON not implemented") -# define ATOMIC_FORCEON _Static_assert(0, "ATOMIC_FORCEON not implemented") -# define ATOMIC_RESTORESTATE _Static_assert(0, "ATOMIC_RESTORESTATE not implemented") +# define ATOMIC_BLOCK STATIC_ASSERT(0, "ATOMIC_BLOCK not implemented") +# define ATOMIC_BLOCK_RESTORESTATE STATIC_ASSERT(0, "ATOMIC_BLOCK_RESTORESTATE not implemented") +# define ATOMIC_BLOCK_FORCEON STATIC_ASSERT(0, "ATOMIC_BLOCK_FORCEON not implemented") +# define ATOMIC_FORCEON STATIC_ASSERT(0, "ATOMIC_FORCEON not implemented") +# define ATOMIC_RESTORESTATE STATIC_ASSERT(0, "ATOMIC_RESTORESTATE not implemented") # endif #else /* do nothing atomic macro */ # define ATOMIC_BLOCK(t) for (uint8_t __ToDo = 1; __ToDo; __ToDo = 0) diff --git a/platforms/avr/drivers/i2c_slave.h b/platforms/avr/drivers/i2c_slave.h index 178b6a29df..8614bd865a 100644 --- a/platforms/avr/drivers/i2c_slave.h +++ b/platforms/avr/drivers/i2c_slave.h @@ -22,6 +22,8 @@ #pragma once +#include "compiler_support.h" + #ifndef I2C_SLAVE_REG_COUNT # if defined(USE_I2C) && defined(SPLIT_COMMON_TRANSACTIONS) @@ -33,7 +35,7 @@ #endif // I2C_SLAVE_REG_COUNT -_Static_assert(I2C_SLAVE_REG_COUNT < 256, "I2C target registers must be single byte"); +STATIC_ASSERT(I2C_SLAVE_REG_COUNT < 256, "I2C target registers must be single byte"); extern volatile uint8_t i2c_slave_reg[I2C_SLAVE_REG_COUNT]; diff --git a/platforms/avr/gpio.h b/platforms/avr/gpio.h index 6f089bc663..4c09619772 100644 --- a/platforms/avr/gpio.h +++ b/platforms/avr/gpio.h @@ -16,6 +16,8 @@ #pragma once #include + +#include "compiler_support.h" #include "pin_defs.h" typedef uint8_t pin_t; @@ -24,9 +26,9 @@ typedef uint8_t pin_t; #define gpio_set_pin_input(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF)) #define gpio_set_pin_input_high(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) -#define gpio_set_pin_input_low(pin) _Static_assert(0, "GPIO pulldowns in input mode are not available on AVR") +#define gpio_set_pin_input_low(pin) STATIC_ASSERT(0, "GPIO pulldowns in input mode are not available on AVR") #define gpio_set_pin_output_push_pull(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF)) -#define gpio_set_pin_output_open_drain(pin) _Static_assert(0, "Open-drain outputs are not available on AVR") +#define gpio_set_pin_output_open_drain(pin) STATIC_ASSERT(0, "Open-drain outputs are not available on AVR") #define gpio_set_pin_output(pin) gpio_set_pin_output_push_pull(pin) #define gpio_write_pin_high(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF)) diff --git a/platforms/chibios/chibios_config.h b/platforms/chibios/chibios_config.h index 9ef8e9b4fe..41546e3e50 100644 --- a/platforms/chibios/chibios_config.h +++ b/platforms/chibios/chibios_config.h @@ -15,6 +15,8 @@ */ #pragma once +#include "compiler_support.h" + #ifndef USB_VBUS_PIN # define SPLIT_USB_DETECT // Force this on when dedicated pin is not used #endif @@ -26,7 +28,7 @@ # define REALTIME_COUNTER_CLOCK 1000000 # define USE_GPIOV1 -# define PAL_OUTPUT_TYPE_OPENDRAIN _Static_assert(0, "RP2040 has no Open Drain GPIO configuration, setting this is not possible"); +# define PAL_OUTPUT_TYPE_OPENDRAIN STATIC_ASSERT(0, "RP2040 has no Open Drain GPIO configuration, setting this is not possible"); /* Aliases for GPIO PWM channels - every pin has at least one PWM channel * assigned */ diff --git a/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c b/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c index 9bfc68f9d2..2f3c7c58ca 100644 --- a/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c +++ b/platforms/chibios/drivers/wear_leveling/wear_leveling_rp2040_flash.c @@ -6,13 +6,15 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include + #include "pico/bootrom.h" #include "hardware/flash.h" #include "hardware/sync.h" #include "hardware/structs/ssi.h" #include "hardware/structs/ioqspi.h" -#include +#include "compiler_support.h" #include "timer.h" #include "wear_leveling.h" #include "wear_leveling_rp2040_flash_config.h" @@ -178,7 +180,7 @@ bool backing_store_erase(void) { #endif // Ensure the backing size can be cleanly subtracted from the flash size without alignment issues. - _Static_assert((WEAR_LEVELING_BACKING_SIZE) % (FLASH_SECTOR_SIZE) == 0, "Backing size must be a multiple of FLASH_SECTOR_SIZE"); + STATIC_ASSERT((WEAR_LEVELING_BACKING_SIZE) % (FLASH_SECTOR_SIZE) == 0, "Backing size must be a multiple of FLASH_SECTOR_SIZE"); interrupts = save_and_disable_interrupts(); flash_range_erase((WEAR_LEVELING_RP2040_FLASH_BASE), (WEAR_LEVELING_BACKING_SIZE)); diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 93dc6f62b1..647744a686 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -18,6 +18,8 @@ #include #include + +#include "compiler_support.h" #include "musical_notes.h" #include "song_list.h" #include "voices.h" @@ -38,7 +40,7 @@ typedef union audio_config_t { }; } audio_config_t; -_Static_assert(sizeof(audio_config_t) == sizeof(uint8_t), "Audio EECONFIG out of spec."); +STATIC_ASSERT(sizeof(audio_config_t) == sizeof(uint8_t), "Audio EECONFIG out of spec."); /* * a 'musical note' is represented by pitch and duration; a 'musical tone' adds intensity and timbre diff --git a/quantum/backlight/backlight.h b/quantum/backlight/backlight.h index 561c7f8a94..2faa8fc4f2 100644 --- a/quantum/backlight/backlight.h +++ b/quantum/backlight/backlight.h @@ -20,6 +20,8 @@ along with this program. If not, see . #include #include +#include "compiler_support.h" + #ifndef BACKLIGHT_LEVELS # define BACKLIGHT_LEVELS 3 #elif BACKLIGHT_LEVELS > 31 @@ -44,7 +46,7 @@ typedef union backlight_config_t { }; } backlight_config_t; -_Static_assert(sizeof(backlight_config_t) == sizeof(uint8_t), "Backlight EECONFIG out of spec."); +STATIC_ASSERT(sizeof(backlight_config_t) == sizeof(uint8_t), "Backlight EECONFIG out of spec."); void backlight_init(void); void backlight_toggle(void); diff --git a/quantum/compiler_support.h b/quantum/compiler_support.h new file mode 100644 index 0000000000..5c0c4d2835 --- /dev/null +++ b/quantum/compiler_support.h @@ -0,0 +1,15 @@ +// Copyright 2025 QMK Contributors +// SPDX-License-Identifier: GPL-2.0-or-later + +/** + * @brief Perfom an assertion at compile time. + * + * `_Static_assert` is C<23, while `static_assert` is C++/C23. + */ +#if !defined(STATIC_ASSERT) +# ifdef __cplusplus +# define STATIC_ASSERT static_assert +# else +# define STATIC_ASSERT _Static_assert +# endif +#endif diff --git a/quantum/connection/connection.h b/quantum/connection/connection.h index e403141fae..b25160c759 100644 --- a/quantum/connection/connection.h +++ b/quantum/connection/connection.h @@ -3,6 +3,8 @@ #pragma once #include + +#include "compiler_support.h" #include "util.h" /** @@ -29,7 +31,7 @@ typedef union connection_config_t { connection_host_t desired_host : 8; } PACKED connection_config_t; -_Static_assert(sizeof(connection_config_t) == sizeof(uint8_t), "Connection EECONFIG out of spec."); +STATIC_ASSERT(sizeof(connection_config_t) == sizeof(uint8_t), "Connection EECONFIG out of spec."); /** * \brief Initialize the subsystem. diff --git a/quantum/haptic.h b/quantum/haptic.h index e27f546d40..f854c75ec3 100644 --- a/quantum/haptic.h +++ b/quantum/haptic.h @@ -20,6 +20,8 @@ #include #include +#include "compiler_support.h" + #ifndef HAPTIC_DEFAULT_FEEDBACK # define HAPTIC_DEFAULT_FEEDBACK 0 #endif @@ -42,7 +44,7 @@ typedef union haptic_config_t { }; } haptic_config_t; -_Static_assert(sizeof(haptic_config_t) == sizeof(uint32_t), "Haptic EECONFIG out of spec."); +STATIC_ASSERT(sizeof(haptic_config_t) == sizeof(uint32_t), "Haptic EECONFIG out of spec."); typedef enum HAPTIC_FEEDBACK { KEY_PRESS, diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h index 529cd0e127..804f1381d0 100644 --- a/quantum/keycode_config.h +++ b/quantum/keycode_config.h @@ -16,9 +16,7 @@ #pragma once -#ifdef __cplusplus -# define _Static_assert static_assert -#endif +#include "compiler_support.h" #include "eeconfig.h" #include "keycode.h" @@ -47,6 +45,6 @@ typedef union keymap_config_t { }; } keymap_config_t; -_Static_assert(sizeof(keymap_config_t) == sizeof(uint16_t), "Keycode (magic) EECONFIG out of spec."); +STATIC_ASSERT(sizeof(keymap_config_t) == sizeof(uint16_t), "Keycode (magic) EECONFIG out of spec."); extern keymap_config_t keymap_config; diff --git a/quantum/keymap_introspection.c b/quantum/keymap_introspection.c index 23e842353a..99fd3f929e 100644 --- a/quantum/keymap_introspection.c +++ b/quantum/keymap_introspection.c @@ -13,6 +13,7 @@ # include INTROSPECTION_KEYMAP_C #endif // INTROSPECTION_KEYMAP_C +#include "compiler_support.h" #include "keymap_introspection.h" #include "util.h" @@ -30,9 +31,9 @@ __attribute__((weak)) uint8_t keymap_layer_count(void) { } #ifdef DYNAMIC_KEYMAP_ENABLE -_Static_assert(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by DYNAMIC_KEYMAP_LAYER_COUNT"); +STATIC_ASSERT(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by DYNAMIC_KEYMAP_LAYER_COUNT"); #else -_Static_assert(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by LAYER_STATE_(8|16|32)BIT"); +STATIC_ASSERT(NUM_KEYMAP_LAYERS_RAW <= MAX_LAYER, "Number of keymap layers exceeds maximum set by LAYER_STATE_(8|16|32)BIT"); #endif uint16_t keycode_at_keymap_location_raw(uint8_t layer_num, uint8_t row, uint8_t column) { @@ -61,7 +62,7 @@ __attribute__((weak)) uint8_t encodermap_layer_count(void) { return encodermap_layer_count_raw(); } -_Static_assert(NUM_KEYMAP_LAYERS_RAW == NUM_ENCODERMAP_LAYERS_RAW, "Number of encoder_map layers doesn't match the number of keymap layers"); +STATIC_ASSERT(NUM_KEYMAP_LAYERS_RAW == NUM_ENCODERMAP_LAYERS_RAW, "Number of encoder_map layers doesn't match the number of keymap layers"); uint16_t keycode_at_encodermap_location_raw(uint8_t layer_num, uint8_t encoder_idx, bool clockwise) { if (layer_num < NUM_ENCODERMAP_LAYERS_RAW && encoder_idx < NUM_ENCODERS) { @@ -106,7 +107,7 @@ __attribute__((weak)) uint16_t combo_count(void) { return combo_count_raw(); } -_Static_assert(ARRAY_SIZE(key_combos) <= (QK_KB), "Number of combos is abnormally high. Are you using SAFE_RANGE in an enum for combos?"); +STATIC_ASSERT(ARRAY_SIZE(key_combos) <= (QK_KB), "Number of combos is abnormally high. Are you using SAFE_RANGE in an enum for combos?"); combo_t* combo_get_raw(uint16_t combo_idx) { if (combo_idx >= combo_count_raw()) { @@ -133,7 +134,7 @@ __attribute__((weak)) uint16_t tap_dance_count(void) { return tap_dance_count_raw(); } -_Static_assert(ARRAY_SIZE(tap_dance_actions) <= (QK_TAP_DANCE_MAX - QK_TAP_DANCE), "Number of tap dance actions exceeds maximum. Are you using SAFE_RANGE in tap dance enum?"); +STATIC_ASSERT(ARRAY_SIZE(tap_dance_actions) <= (QK_TAP_DANCE_MAX - QK_TAP_DANCE), "Number of tap dance actions exceeds maximum. Are you using SAFE_RANGE in tap dance enum?"); tap_dance_action_t* tap_dance_get_raw(uint16_t tap_dance_idx) { if (tap_dance_idx >= tap_dance_count_raw()) { @@ -161,7 +162,7 @@ __attribute__((weak)) uint16_t key_override_count(void) { return key_override_count_raw(); } -_Static_assert(ARRAY_SIZE(key_overrides) <= (QK_KB), "Number of key overrides is abnormally high. Are you using SAFE_RANGE in an enum for key overrides?"); +STATIC_ASSERT(ARRAY_SIZE(key_overrides) <= (QK_KB), "Number of key overrides is abnormally high. Are you using SAFE_RANGE in an enum for key overrides?"); const key_override_t* key_override_get_raw(uint16_t key_override_idx) { if (key_override_idx >= key_override_count_raw()) { diff --git a/quantum/led_matrix/led_matrix_types.h b/quantum/led_matrix/led_matrix_types.h index 810420f46f..26a199701e 100644 --- a/quantum/led_matrix/led_matrix_types.h +++ b/quantum/led_matrix/led_matrix_types.h @@ -18,6 +18,8 @@ #include #include + +#include "compiler_support.h" #include "util.h" #if defined(LED_MATRIX_KEYPRESSES) || defined(LED_MATRIX_KEYRELEASES) @@ -82,4 +84,4 @@ typedef union led_eeconfig_t { }; } led_eeconfig_t; -_Static_assert(sizeof(led_eeconfig_t) == sizeof(uint32_t), "LED Matrix EECONFIG out of spec."); +STATIC_ASSERT(sizeof(led_eeconfig_t) == sizeof(uint32_t), "LED Matrix EECONFIG out of spec."); diff --git a/quantum/nvm/eeprom/nvm_dynamic_keymap.c b/quantum/nvm/eeprom/nvm_dynamic_keymap.c index 5f514acc1a..3e315f2bcb 100644 --- a/quantum/nvm/eeprom/nvm_dynamic_keymap.c +++ b/quantum/nvm/eeprom/nvm_dynamic_keymap.c @@ -1,6 +1,7 @@ // Copyright 2024 Nick Brassel (@tzarc) // SPDX-License-Identifier: GPL-2.0-or-later +#include "compiler_support.h" #include "keycodes.h" #include "eeprom.h" #include "dynamic_keymap.h" @@ -25,10 +26,10 @@ # define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1) #endif -_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= (TOTAL_EEPROM_BYTE_COUNT - 1), "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver"); +STATIC_ASSERT(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= (TOTAL_EEPROM_BYTE_COUNT - 1), "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver"); // Due to usage of uint16_t check for max 65535 -_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536"); +STATIC_ASSERT(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536"); // If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h, #ifndef DYNAMIC_KEYMAP_EEPROM_ADDR @@ -56,7 +57,7 @@ _Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_M // The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it, // or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has // more than the default. -_Static_assert((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); +STATIC_ASSERT((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); #ifndef TOTAL_EEPROM_BYTE_COUNT # error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps. diff --git a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h index 41b76f1f65..78b8190eaf 100644 --- a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h +++ b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h @@ -4,6 +4,8 @@ #include #include // offsetof + +#include "compiler_support.h" #include "eeconfig.h" #include "util.h" @@ -58,4 +60,4 @@ typedef struct PACKED { // Size of EEPROM being used, other code can refer to this for available EEPROM #define EECONFIG_SIZE ((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE) + (EECONFIG_USER_DATA_SIZE)) -_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect"); +STATIC_ASSERT((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect"); diff --git a/quantum/painter/qff.h b/quantum/painter/qff.h index c3b831da17..ed88508d73 100644 --- a/quantum/painter/qff.h +++ b/quantum/painter/qff.h @@ -9,6 +9,7 @@ #include #include +#include "compiler_support.h" #include "qp_stream.h" #include "qp_internal.h" #include "qgf.h" @@ -36,7 +37,7 @@ typedef struct QP_PACKED qff_font_descriptor_v1_t { uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented) } qff_font_descriptor_v1_t; -_Static_assert(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF"); +STATIC_ASSERT(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF"); #define QFF_MAGIC 0x464651 @@ -54,14 +55,14 @@ typedef struct QP_PACKED qff_ascii_glyph_v1_t { uint32_t value : 24; // Uses QFF_GLYPH_*_(BITS|MASK) as bitfield ordering is compiler-defined } qff_ascii_glyph_v1_t; -_Static_assert(sizeof(qff_ascii_glyph_v1_t) == 3, "qff_ascii_glyph_v1_t must be 3 bytes in v1 of QFF"); +STATIC_ASSERT(sizeof(qff_ascii_glyph_v1_t) == 3, "qff_ascii_glyph_v1_t must be 3 bytes in v1 of QFF"); typedef struct QP_PACKED qff_ascii_glyph_table_v1_t { qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 } qff_ascii_glyph_v1_t glyph[95]; // 95 glyphs, 0x20..0x7E } qff_ascii_glyph_table_v1_t; -_Static_assert(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + (95 * sizeof(qff_ascii_glyph_v1_t))), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF"); +STATIC_ASSERT(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + (95 * sizeof(qff_ascii_glyph_v1_t))), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF"); ///////////////////////////////////////// // Unicode glyph table descriptor @@ -73,7 +74,7 @@ typedef struct QP_PACKED qff_unicode_glyph_v1_t { uint32_t value : 24; // Uses QFF_GLYPH_*_(BITS|MASK) as bitfield ordering is compiler-defined } qff_unicode_glyph_v1_t; -_Static_assert(sizeof(qff_unicode_glyph_v1_t) == 6, "qff_unicode_glyph_v1_t must be 6 bytes in v1 of QFF"); +STATIC_ASSERT(sizeof(qff_unicode_glyph_v1_t) == 6, "qff_unicode_glyph_v1_t must be 6 bytes in v1 of QFF"); typedef struct QP_PACKED qff_unicode_glyph_table_v1_t { qgf_block_header_v1_t header; // = { .type_id = 0x02, .neg_type_id = (~0x02), .length = (N * 6) } diff --git a/quantum/painter/qgf.h b/quantum/painter/qgf.h index 33a37709e6..a1e245f15d 100644 --- a/quantum/painter/qgf.h +++ b/quantum/painter/qgf.h @@ -9,6 +9,7 @@ #include #include +#include "compiler_support.h" #include "qp_stream.h" #include "qp_internal.h" @@ -24,7 +25,7 @@ typedef struct QP_PACKED qgf_block_header_v1_t { uint32_t length : 24; // 24-bit blob length, allowing for block sizes of a maximum of 16MB. } qgf_block_header_v1_t; -_Static_assert(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF"); ///////////////////////////////////////// // Graphics descriptor @@ -42,7 +43,7 @@ typedef struct QP_PACKED qgf_graphics_descriptor_v1_t { uint16_t frame_count; // minimum of 1 } qgf_graphics_descriptor_v1_t; -_Static_assert(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF"); #define QGF_MAGIC 0x464751 @@ -56,7 +57,7 @@ typedef struct QP_PACKED qgf_frame_offsets_v1_t { uint32_t offset[0]; // '0' signifies that this struct is immediately followed by the frame offsets } qgf_frame_offsets_v1_t; -_Static_assert(sizeof(qgf_frame_offsets_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_frame_offsets_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_frame_offsets_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_frame_offsets_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); ///////////////////////////////////////// // Frame descriptor @@ -72,7 +73,7 @@ typedef struct QP_PACKED qgf_frame_v1_t { uint16_t delay; // frame delay time for animations (in units of milliseconds) } qgf_frame_v1_t; -_Static_assert(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF"); #define QGF_FRAME_FLAG_DELTA 0x02 #define QGF_FRAME_FLAG_TRANSPARENT 0x01 @@ -88,14 +89,14 @@ typedef struct QP_PACKED qgf_palette_entry_v1_t { uint8_t v; // value component: `[0,1]` is mapped to `[0,255]` uint8_t. } qgf_palette_entry_v1_t; -_Static_assert(sizeof(qgf_palette_entry_v1_t) == 3, "Palette entry is not 3 bytes in size"); +STATIC_ASSERT(sizeof(qgf_palette_entry_v1_t) == 3, "Palette entry is not 3 bytes in size"); typedef struct QP_PACKED qgf_palette_v1_t { qgf_block_header_v1_t header; // = { .type_id = 0x03, .neg_type_id = (~0x03), .length = (N * 3 * sizeof(uint8_t)) } qgf_palette_entry_v1_t hsv[0]; // N * hsv, where N is the number of palette entries depending on the frame format in the descriptor } qgf_palette_v1_t; -_Static_assert(sizeof(qgf_palette_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_palette_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_palette_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_palette_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); ///////////////////////////////////////// // Frame delta descriptor @@ -110,7 +111,7 @@ typedef struct QP_PACKED qgf_delta_v1_t { uint16_t bottom; // The bottom pixel location to to draw the delta image } qgf_delta_v1_t; -_Static_assert(sizeof(qgf_delta_v1_t) == (sizeof(qgf_block_header_v1_t) + 8), "qgf_delta_v1_t must be 13 bytes in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_delta_v1_t) == (sizeof(qgf_block_header_v1_t) + 8), "qgf_delta_v1_t must be 13 bytes in v1 of QGF"); ///////////////////////////////////////// // Frame data descriptor @@ -122,7 +123,7 @@ typedef struct QP_PACKED qgf_data_v1_t { uint8_t data[0]; // 0 signifies that this struct is immediately followed by the length of data specified in the header } qgf_data_v1_t; -_Static_assert(sizeof(qgf_data_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_data_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); +STATIC_ASSERT(sizeof(qgf_data_v1_t) == sizeof(qgf_block_header_v1_t), "qgf_data_v1_t must only contain qgf_block_header_v1_t in v1 of QGF"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // QGF API diff --git a/quantum/painter/qp_draw_core.c b/quantum/painter/qp_draw_core.c index aa5fa4aa76..852abb19e8 100644 --- a/quantum/painter/qp_draw_core.c +++ b/quantum/painter/qp_draw_core.c @@ -2,12 +2,13 @@ // Copyright 2021 Paul Cotter (@gr1mr3aver) // SPDX-License-Identifier: GPL-2.0-or-later +#include "compiler_support.h" #include "qp_internal.h" #include "qp_comms.h" #include "qp_draw.h" #include "qgf.h" -_Static_assert((QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE > 0) && (QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE % 16) == 0, "QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE needs to be a non-zero multiple of 16"); +STATIC_ASSERT((QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE > 0) && (QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE % 16) == 0, "QUANTUM_PAINTER_PIXDATA_BUFFER_SIZE needs to be a non-zero multiple of 16"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Global variables diff --git a/quantum/painter/qp_internal.c b/quantum/painter/qp_internal.c index 24b881bd09..fe0c598d78 100644 --- a/quantum/painter/qp_internal.c +++ b/quantum/painter/qp_internal.c @@ -3,6 +3,8 @@ #include "qp_internal.h" +#include "compiler_support.h" + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Quantum Painter Core API: device registration @@ -67,7 +69,7 @@ static void qp_internal_display_timeout_task(void) { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Quantum Painter Core API: qp_internal_task -_Static_assert((QUANTUM_PAINTER_TASK_THROTTLE) > 0 && (QUANTUM_PAINTER_TASK_THROTTLE) < 1000, "QUANTUM_PAINTER_TASK_THROTTLE must be between 1 and 999"); +STATIC_ASSERT((QUANTUM_PAINTER_TASK_THROTTLE) > 0 && (QUANTUM_PAINTER_TASK_THROTTLE) < 1000, "QUANTUM_PAINTER_TASK_THROTTLE must be between 1 and 999"); void qp_internal_task(void) { // Perform throttling of the internal processing of Quantum Painter diff --git a/quantum/painter/qp_internal_formats.h b/quantum/painter/qp_internal_formats.h index 1beb604b9e..bd7105cab2 100644 --- a/quantum/painter/qp_internal_formats.h +++ b/quantum/painter/qp_internal_formats.h @@ -3,6 +3,7 @@ #pragma once +#include "compiler_support.h" #include "qp_internal.h" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -29,7 +30,7 @@ typedef union QP_PACKED qp_pixel_t { uint32_t dummy; } qp_pixel_t; -_Static_assert(sizeof(qp_pixel_t) == 4, "Invalid size for qp_pixel_t"); +STATIC_ASSERT(sizeof(qp_pixel_t) == 4, "Invalid size for qp_pixel_t"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Quantum Painter image format diff --git a/quantum/rgb_matrix/rgb_matrix_types.h b/quantum/rgb_matrix/rgb_matrix_types.h index 62005ebea9..0115edee6a 100644 --- a/quantum/rgb_matrix/rgb_matrix_types.h +++ b/quantum/rgb_matrix/rgb_matrix_types.h @@ -18,6 +18,8 @@ #include #include + +#include "compiler_support.h" #include "color.h" #include "util.h" @@ -84,4 +86,4 @@ typedef union rgb_config_t { }; } rgb_config_t; -_Static_assert(sizeof(rgb_config_t) == sizeof(uint64_t), "RGB Matrix EECONFIG out of spec."); +STATIC_ASSERT(sizeof(rgb_config_t) == sizeof(uint64_t), "RGB Matrix EECONFIG out of spec."); diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h index f5fd450d4c..c061e71895 100644 --- a/quantum/rgblight/rgblight.h +++ b/quantum/rgblight/rgblight.h @@ -16,6 +16,8 @@ #pragma once +#include "compiler_support.h" + // DEPRECATED DEFINES - DO NOT USE #if defined(RGBLED_NUM) # define RGBLIGHT_LED_COUNT RGBLED_NUM @@ -260,7 +262,7 @@ typedef union rgblight_config_t { }; } rgblight_config_t; -_Static_assert(sizeof(rgblight_config_t) == sizeof(uint64_t), "RGB Light EECONFIG out of spec."); +STATIC_ASSERT(sizeof(rgblight_config_t) == sizeof(uint64_t), "RGB Light EECONFIG out of spec."); typedef struct _rgblight_status_t { uint8_t base_mode; diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 9af3c29d75..59b6009ec4 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -13,6 +13,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +#include "compiler_support.h" #include "split_util.h" #include "matrix.h" #include "keyboard.h" @@ -62,7 +64,7 @@ static struct { } split_config; #if defined(SPLIT_USB_DETECT) -_Static_assert((SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL) <= UINT16_MAX, "Please lower SPLIT_USB_TIMEOUT and/or increase SPLIT_USB_TIMEOUT_POLL."); +STATIC_ASSERT((SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL) <= UINT16_MAX, "Please lower SPLIT_USB_TIMEOUT and/or increase SPLIT_USB_TIMEOUT_POLL."); static bool usb_bus_detected(void) { for (uint16_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) { // This will return true if a USB connection has been established @@ -88,9 +90,9 @@ static inline bool usb_bus_detected(void) { # endif # endif # if defined(SPLIT_USB_DETECT) -_Static_assert(SPLIT_USB_TIMEOUT < SPLIT_WATCHDOG_TIMEOUT, "SPLIT_WATCHDOG_TIMEOUT should not be below SPLIT_USB_TIMEOUT."); +STATIC_ASSERT(SPLIT_USB_TIMEOUT < SPLIT_WATCHDOG_TIMEOUT, "SPLIT_WATCHDOG_TIMEOUT should not be below SPLIT_USB_TIMEOUT."); # endif -_Static_assert(SPLIT_MAX_CONNECTION_ERRORS > 0, "SPLIT_WATCHDOG_ENABLE requires SPLIT_MAX_CONNECTION_ERRORS be above 0 for a functioning disconnection check."); +STATIC_ASSERT(SPLIT_MAX_CONNECTION_ERRORS > 0, "SPLIT_WATCHDOG_ENABLE requires SPLIT_MAX_CONNECTION_ERRORS be above 0 for a functioning disconnection check."); static uint32_t split_watchdog_started = 0; static bool split_watchdog_done = false; diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h index 5bfbe2aec7..694737868a 100644 --- a/quantum/split_common/transaction_id_define.h +++ b/quantum/split_common/transaction_id_define.h @@ -16,6 +16,8 @@ #pragma once +#include "compiler_support.h" + enum serial_transaction_id { #ifdef USE_I2C I2C_EXECUTE_CALLBACK, @@ -122,4 +124,4 @@ enum serial_transaction_id { }; // Ensure we only use 5 bits for transaction -_Static_assert(NUM_TOTAL_TRANSACTIONS <= (1 << 5), "Max number of usable transactions exceeded"); +STATIC_ASSERT(NUM_TOTAL_TRANSACTIONS <= (1 << 5), "Max number of usable transactions exceeded"); diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c index 83edc34859..ea687af1c2 100644 --- a/quantum/split_common/transport.c +++ b/quantum/split_common/transport.c @@ -17,6 +17,7 @@ #include #include +#include "compiler_support.h" #include "transactions.h" #include "transport.h" #include "transaction_id_define.h" @@ -36,7 +37,7 @@ # include "i2c_slave.h" // Ensure the I2C buffer has enough space -_Static_assert(sizeof(split_shared_memory_t) <= I2C_SLAVE_REG_COUNT, "split_shared_memory_t too large for I2C_SLAVE_REG_COUNT"); +STATIC_ASSERT(sizeof(split_shared_memory_t) <= I2C_SLAVE_REG_COUNT, "split_shared_memory_t too large for I2C_SLAVE_REG_COUNT"); split_shared_memory_t *const split_shmem = (split_shared_memory_t *)i2c_slave_reg; diff --git a/quantum/unicode/unicode.h b/quantum/unicode/unicode.h index f19d803335..7cddc78b7a 100644 --- a/quantum/unicode/unicode.h +++ b/quantum/unicode/unicode.h @@ -17,6 +17,8 @@ #pragma once #include + +#include "compiler_support.h" #include "unicode_keycodes.h" /** @@ -33,7 +35,7 @@ typedef union unicode_config_t { }; } unicode_config_t; -_Static_assert(sizeof(unicode_config_t) == sizeof(uint8_t), "Unicode EECONFIG out of spec."); +STATIC_ASSERT(sizeof(unicode_config_t) == sizeof(uint8_t), "Unicode EECONFIG out of spec."); extern unicode_config_t unicode_config; diff --git a/quantum/wear_leveling/wear_leveling_internal.h b/quantum/wear_leveling/wear_leveling_internal.h index e83f9b22ea..c590f42235 100644 --- a/quantum/wear_leveling/wear_leveling_internal.h +++ b/quantum/wear_leveling/wear_leveling_internal.h @@ -2,9 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#ifdef __cplusplus -# define _Static_assert static_assert -#endif +#include "compiler_support.h" #include #include @@ -62,9 +60,9 @@ typedef uint64_t backing_store_int_t; #endif // WEAR_LEVELING_ASSERTS // Compile-time validation of configurable options -_Static_assert(WEAR_LEVELING_BACKING_SIZE >= (WEAR_LEVELING_LOGICAL_SIZE * 2), "Total backing size must be at least twice the size of the logical size"); -_Static_assert(WEAR_LEVELING_LOGICAL_SIZE % BACKING_STORE_WRITE_SIZE == 0, "Logical size must be a multiple of write size"); -_Static_assert(WEAR_LEVELING_BACKING_SIZE % WEAR_LEVELING_LOGICAL_SIZE == 0, "Backing size must be a multiple of logical size"); +STATIC_ASSERT(WEAR_LEVELING_BACKING_SIZE >= (WEAR_LEVELING_LOGICAL_SIZE * 2), "Total backing size must be at least twice the size of the logical size"); +STATIC_ASSERT(WEAR_LEVELING_LOGICAL_SIZE % BACKING_STORE_WRITE_SIZE == 0, "Logical size must be a multiple of write size"); +STATIC_ASSERT(WEAR_LEVELING_BACKING_SIZE % WEAR_LEVELING_LOGICAL_SIZE == 0, "Backing size must be a multiple of logical size"); // Backing Store API, to be implemented elsewhere by flash driver etc. bool backing_store_init(void); @@ -86,7 +84,7 @@ typedef union write_log_entry_t { uint8_t raw8[8]; } write_log_entry_t; -_Static_assert(sizeof(write_log_entry_t) == 8, "Wear leveling write log entry size was not 8"); +STATIC_ASSERT(sizeof(write_log_entry_t) == 8, "Wear leveling write log entry size was not 8"); /** * Log entry type discriminator. @@ -104,7 +102,7 @@ enum { LOG_ENTRY_TYPES }; -_Static_assert(LOG_ENTRY_TYPES <= (1 << 2), "Too many log entry types to fit into 2 bits of storage"); +STATIC_ASSERT(LOG_ENTRY_TYPES <= (1 << 2), "Too many log entry types to fit into 2 bits of storage"); #define BITMASK_FOR_BITCOUNT(n) ((1 << (n)) - 1) diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 43cce6eb2f..1f0f82664b 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -21,6 +21,7 @@ along with this program. If not, see . #include +#include "compiler_support.h" #include "usbconfig.h" #include "host.h" #include "report.h" @@ -80,7 +81,7 @@ enum usb_interfaces { #define MAX_INTERFACES 3 -_Static_assert(TOTAL_INTERFACES <= MAX_INTERFACES, "There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console."); +STATIC_ASSERT(TOTAL_INTERFACES <= MAX_INTERFACES, "There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console."); #if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) && CONSOLE_ENABLE # error Mouse/Extra Keys share an endpoint with Console. Please disable one of the two. From 243c21568ab47aeca069f5d0a0744ae51d39bd53 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 22 May 2025 20:49:22 +0100 Subject: [PATCH 391/592] Configure boards to use development_board - 0-9 (#25287) --- keyboards/0_sixty/info.json | 3 +-- keyboards/0xcb/tutelpad/keyboard.json | 3 +-- keyboards/1upkeyboards/super16/keyboard.json | 3 +-- keyboards/1upkeyboards/sweet16/v1/keyboard.json | 3 +-- keyboards/25keys/cassette42/keyboard.json | 3 +-- keyboards/25keys/zinc/rev1/keyboard.json | 3 +-- keyboards/25keys/zinc/reva/keyboard.json | 3 +-- keyboards/30wer/keyboard.json | 3 +-- keyboards/40percentclub/25/keyboard.json | 3 +-- keyboards/40percentclub/4pack/keyboard.json | 3 +-- keyboards/40percentclub/6lit/keyboard.json | 3 +-- keyboards/40percentclub/foobar/keyboard.json | 3 +-- keyboards/40percentclub/half_n_half/keyboard.json | 3 +-- keyboards/40percentclub/i75/promicro/keyboard.json | 3 +-- keyboards/40percentclub/luddite/keyboard.json | 3 +-- keyboards/40percentclub/mf68/keyboard.json | 3 +-- keyboards/40percentclub/nano/keyboard.json | 3 +-- keyboards/40percentclub/nein/keyboard.json | 3 +-- keyboards/40percentclub/nori/keyboard.json | 3 +-- keyboards/40percentclub/polyandry/promicro/keyboard.json | 3 +-- keyboards/40percentclub/sixpack/keyboard.json | 3 +-- keyboards/40percentclub/tomato/keyboard.json | 3 +-- keyboards/4by3/keyboard.json | 3 +-- keyboards/8pack/info.json | 3 +-- keyboards/adkb96/rev1/keyboard.json | 3 +-- 25 files changed, 25 insertions(+), 50 deletions(-) diff --git a/keyboards/0_sixty/info.json b/keyboards/0_sixty/info.json index ebe4d39625..79b9388ed3 100644 --- a/keyboards/0_sixty/info.json +++ b/keyboards/0_sixty/info.json @@ -25,8 +25,7 @@ "resync": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_1x2uC": { "layout": [ diff --git a/keyboards/0xcb/tutelpad/keyboard.json b/keyboards/0xcb/tutelpad/keyboard.json index 2517fa7072..dfb4ee1a0b 100644 --- a/keyboards/0xcb/tutelpad/keyboard.json +++ b/keyboards/0xcb/tutelpad/keyboard.json @@ -30,8 +30,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "extrakey": true, diff --git a/keyboards/1upkeyboards/super16/keyboard.json b/keyboards/1upkeyboards/super16/keyboard.json index 461b43764d..3b5859474a 100644 --- a/keyboards/1upkeyboards/super16/keyboard.json +++ b/keyboards/1upkeyboards/super16/keyboard.json @@ -94,8 +94,7 @@ "rows": ["D1", "D0", "F4", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x4", "numpad_4x4"], "layouts": { "LAYOUT_ortho_4x4": { diff --git a/keyboards/1upkeyboards/sweet16/v1/keyboard.json b/keyboards/1upkeyboards/sweet16/v1/keyboard.json index 161ca65950..a8c5bf7e92 100644 --- a/keyboards/1upkeyboards/sweet16/v1/keyboard.json +++ b/keyboards/1upkeyboards/sweet16/v1/keyboard.json @@ -48,8 +48,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_4x4": { "layout": [ diff --git a/keyboards/25keys/cassette42/keyboard.json b/keyboards/25keys/cassette42/keyboard.json index cba2e61272..97aab705ca 100644 --- a/keyboards/25keys/cassette42/keyboard.json +++ b/keyboards/25keys/cassette42/keyboard.json @@ -43,8 +43,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "direct": [ ["B4", "F6", "F5", "F4", "B5", "F7"] diff --git a/keyboards/25keys/zinc/rev1/keyboard.json b/keyboards/25keys/zinc/rev1/keyboard.json index fd11273c18..fc7160cb6c 100644 --- a/keyboards/25keys/zinc/rev1/keyboard.json +++ b/keyboards/25keys/zinc/rev1/keyboard.json @@ -8,8 +8,7 @@ "pid": "0xEA3B", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "cols": ["F4", "D4", "C6", "D7", "E6", "B4"], "rows": ["F6", "F7", "B1", "B3"] diff --git a/keyboards/25keys/zinc/reva/keyboard.json b/keyboards/25keys/zinc/reva/keyboard.json index dedc8f22f8..6acd188c75 100644 --- a/keyboards/25keys/zinc/reva/keyboard.json +++ b/keyboards/25keys/zinc/reva/keyboard.json @@ -8,8 +8,7 @@ "pid": "0xEA3B", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "cols": ["F4", "F5", "F6", "F7", "B1", "B3"], "rows": ["D4", "C6", "D7", "E6"] diff --git a/keyboards/30wer/keyboard.json b/keyboards/30wer/keyboard.json index d5d4c5fa56..4d27043ed9 100644 --- a/keyboards/30wer/keyboard.json +++ b/keyboards/30wer/keyboard.json @@ -19,8 +19,7 @@ "rows": ["E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/40percentclub/25/keyboard.json b/keyboards/40percentclub/25/keyboard.json index ceaff11454..b6c6621eed 100644 --- a/keyboards/40percentclub/25/keyboard.json +++ b/keyboards/40percentclub/25/keyboard.json @@ -31,8 +31,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x5", "ortho_5x10"], "layout_aliases": { "LAYOUT_macro": "LAYOUT_ortho_5x5", diff --git a/keyboards/40percentclub/4pack/keyboard.json b/keyboards/40percentclub/4pack/keyboard.json index 0b26e75b92..08c70e61d0 100644 --- a/keyboards/40percentclub/4pack/keyboard.json +++ b/keyboards/40percentclub/4pack/keyboard.json @@ -11,8 +11,7 @@ "driver": "timer", "pins": ["F6", "F7"] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "backlight": true, "bootmagic": false, diff --git a/keyboards/40percentclub/6lit/keyboard.json b/keyboards/40percentclub/6lit/keyboard.json index 96644a7a44..ffab3266ae 100644 --- a/keyboards/40percentclub/6lit/keyboard.json +++ b/keyboards/40percentclub/6lit/keyboard.json @@ -31,8 +31,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_2x3", "ortho_2x6"], "layout_aliases": { "LAYOUT_macro": "LAYOUT_ortho_2x3", diff --git a/keyboards/40percentclub/foobar/keyboard.json b/keyboards/40percentclub/foobar/keyboard.json index c0a77c4e9a..b47af21598 100644 --- a/keyboards/40percentclub/foobar/keyboard.json +++ b/keyboards/40percentclub/foobar/keyboard.json @@ -31,8 +31,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_3x10"], "layout_aliases": { "LAYOUT_macro": "LAYOUT_ortho_3x5", diff --git a/keyboards/40percentclub/half_n_half/keyboard.json b/keyboards/40percentclub/half_n_half/keyboard.json index 21ca55f162..1b19794cce 100644 --- a/keyboards/40percentclub/half_n_half/keyboard.json +++ b/keyboards/40percentclub/half_n_half/keyboard.json @@ -31,8 +31,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/40percentclub/i75/promicro/keyboard.json b/keyboards/40percentclub/i75/promicro/keyboard.json index 933c4f8616..58a9b11b1c 100644 --- a/keyboards/40percentclub/i75/promicro/keyboard.json +++ b/keyboards/40percentclub/i75/promicro/keyboard.json @@ -4,6 +4,5 @@ "rows": ["B4", "E6", "D7", "C6", "D4", "D0", "D1", "D2", "D3"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/40percentclub/luddite/keyboard.json b/keyboards/40percentclub/luddite/keyboard.json index 812bbdc7aa..f8c47ef7d4 100644 --- a/keyboards/40percentclub/luddite/keyboard.json +++ b/keyboards/40percentclub/luddite/keyboard.json @@ -48,8 +48,7 @@ "ws2812": { "pin": "B4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["60_ansi"], "layouts": { "LAYOUT_60_ansi": { diff --git a/keyboards/40percentclub/mf68/keyboard.json b/keyboards/40percentclub/mf68/keyboard.json index daeab7d4de..fd3d5be874 100644 --- a/keyboards/40percentclub/mf68/keyboard.json +++ b/keyboards/40percentclub/mf68/keyboard.json @@ -29,8 +29,7 @@ "pin": "B5", "breathing": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["68_ansi"], "layouts": { "LAYOUT_68_ansi": { diff --git a/keyboards/40percentclub/nano/keyboard.json b/keyboards/40percentclub/nano/keyboard.json index 4d797ed076..46158c11d6 100644 --- a/keyboards/40percentclub/nano/keyboard.json +++ b/keyboards/40percentclub/nano/keyboard.json @@ -25,8 +25,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "extrakey": true, diff --git a/keyboards/40percentclub/nein/keyboard.json b/keyboards/40percentclub/nein/keyboard.json index 267e708038..d2d48e6b0c 100644 --- a/keyboards/40percentclub/nein/keyboard.json +++ b/keyboards/40percentclub/nein/keyboard.json @@ -8,8 +8,7 @@ "pid": "0x9999", "device_version": "99.9.9" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "extrakey": true, diff --git a/keyboards/40percentclub/nori/keyboard.json b/keyboards/40percentclub/nori/keyboard.json index feb66f9501..e4f2b3604a 100644 --- a/keyboards/40percentclub/nori/keyboard.json +++ b/keyboards/40percentclub/nori/keyboard.json @@ -50,8 +50,7 @@ "ws2812": { "pin": "B4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x4", "ortho_4x12"], "layouts": { "LAYOUT_ortho_4x4": { diff --git a/keyboards/40percentclub/polyandry/promicro/keyboard.json b/keyboards/40percentclub/polyandry/promicro/keyboard.json index a8169c93dd..e8b2fcdb23 100644 --- a/keyboards/40percentclub/polyandry/promicro/keyboard.json +++ b/keyboards/40percentclub/polyandry/promicro/keyboard.json @@ -4,6 +4,5 @@ "rows": ["D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/40percentclub/sixpack/keyboard.json b/keyboards/40percentclub/sixpack/keyboard.json index 9bed19df3f..892d929ff5 100644 --- a/keyboards/40percentclub/sixpack/keyboard.json +++ b/keyboards/40percentclub/sixpack/keyboard.json @@ -19,8 +19,7 @@ "num_lock": "D5", "on_state": 0 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "backlight": true, "bootmagic": true, diff --git a/keyboards/40percentclub/tomato/keyboard.json b/keyboards/40percentclub/tomato/keyboard.json index c11b747f24..6fc1d7df98 100644 --- a/keyboards/40percentclub/tomato/keyboard.json +++ b/keyboards/40percentclub/tomato/keyboard.json @@ -48,8 +48,7 @@ "rows": ["F7", "B1", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_3x10"], "layouts": { "LAYOUT_ortho_3x10": { diff --git a/keyboards/4by3/keyboard.json b/keyboards/4by3/keyboard.json index 8801a1e920..4de26c809d 100644 --- a/keyboards/4by3/keyboard.json +++ b/keyboards/4by3/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D1", "D0", "D4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_horizontal" }, diff --git a/keyboards/8pack/info.json b/keyboards/8pack/info.json index 84d81c11d3..041990fbb3 100644 --- a/keyboards/8pack/info.json +++ b/keyboards/8pack/info.json @@ -36,8 +36,7 @@ "ws2812": { "pin": "D2" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "backlight": true, "bootmagic": false, diff --git a/keyboards/adkb96/rev1/keyboard.json b/keyboards/adkb96/rev1/keyboard.json index 5def3c9da3..3c0c757c05 100644 --- a/keyboards/adkb96/rev1/keyboard.json +++ b/keyboards/adkb96/rev1/keyboard.json @@ -34,8 +34,7 @@ "tapping": { "term": 100 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_ortho_6x16" }, From f3b974f2168331e279ca6c64f8f848633eb5f433 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Thu, 22 May 2025 23:52:45 +0200 Subject: [PATCH 392/592] [Fix] lib8tion: enable fixed scale8 and blend functions (#25272) lib8tion: enable fixed scale8 and blend functions These FastLED derived lib8tion functions have been fixed and enabled by default in FastLED. QMK just never set these defines, there is no reason to keep the buggy implementation. It is assumed that nobody relied on the buggy behavior. --- builddefs/common_features.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 9a87a6ce02..ca60873bec 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -722,6 +722,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes) # ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines OPT_DEFS += -DLIB8_ATTINY endif + OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1 SRC += $(LIB_PATH)/lib8tion/lib8tion.c endif From 196285c59c8ad906803747e1ca2de0de12e575cd Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 23 May 2025 01:27:00 +0100 Subject: [PATCH 393/592] Configure boards to use development_board - UVWXYZ (#25288) --- keyboards/ungodly/nines/keyboard.json | 3 +-- keyboards/unikeyboard/diverge3/keyboard.json | 3 +-- keyboards/unikeyboard/divergetm2/keyboard.json | 3 +-- keyboards/unikeyboard/felix/keyboard.json | 3 +-- keyboards/uzu42/rev1/keyboard.json | 3 +-- keyboards/vagrant_10/keyboard.json | 3 +-- keyboards/wsk/alpha9/keyboard.json | 3 +-- keyboards/wsk/g4m3ralpha/keyboard.json | 3 +-- keyboards/wsk/jerkin/keyboard.json | 3 +-- keyboards/wsk/kodachi50/keyboard.json | 3 +-- keyboards/wsk/pain27/keyboard.json | 3 +-- keyboards/xenon/keyboard.json | 3 +-- keyboards/yampad/keyboard.json | 3 +-- keyboards/yeehaw/keyboard.json | 3 +-- keyboards/yosino58/rev1/keyboard.json | 3 +-- keyboards/yushakobo/navpad/10/info.json | 3 +-- keyboards/yushakobo/navpad/10_helix_r/keyboard.json | 3 +-- keyboards/yushakobo/quick17/keyboard.json | 3 +-- keyboards/yushakobo/quick7/keyboard.json | 3 +-- keyboards/yynmt/dozen0/keyboard.json | 3 +-- keyboards/zigotica/z12/keyboard.json | 3 +-- keyboards/zigotica/z34/keyboard.json | 3 +-- 22 files changed, 22 insertions(+), 44 deletions(-) diff --git a/keyboards/ungodly/nines/keyboard.json b/keyboards/ungodly/nines/keyboard.json index ee4c65f9bb..a92711c5c3 100644 --- a/keyboards/ungodly/nines/keyboard.json +++ b/keyboards/ungodly/nines/keyboard.json @@ -14,8 +14,7 @@ {"pin_a": "E6", "pin_b": "B4", "resolution": 2} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "encoder": true, diff --git a/keyboards/unikeyboard/diverge3/keyboard.json b/keyboards/unikeyboard/diverge3/keyboard.json index 53c5f55fcd..187e5dead0 100644 --- a/keyboards/unikeyboard/diverge3/keyboard.json +++ b/keyboards/unikeyboard/diverge3/keyboard.json @@ -37,8 +37,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/unikeyboard/divergetm2/keyboard.json b/keyboards/unikeyboard/divergetm2/keyboard.json index 3dc19772fa..c0c0f15c0c 100644 --- a/keyboards/unikeyboard/divergetm2/keyboard.json +++ b/keyboards/unikeyboard/divergetm2/keyboard.json @@ -31,8 +31,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_ortho_4x12_2x2u": "LAYOUT" }, diff --git a/keyboards/unikeyboard/felix/keyboard.json b/keyboards/unikeyboard/felix/keyboard.json index 232c5f80f1..612bccd196 100644 --- a/keyboards/unikeyboard/felix/keyboard.json +++ b/keyboards/unikeyboard/felix/keyboard.json @@ -29,8 +29,7 @@ "pin": "C6", "levels": 5 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x4"], "layout_aliases": { "LAYOUT": "LAYOUT_ortho_5x4" diff --git a/keyboards/uzu42/rev1/keyboard.json b/keyboards/uzu42/rev1/keyboard.json index 6f4f080e67..3b152c7b59 100644 --- a/keyboards/uzu42/rev1/keyboard.json +++ b/keyboards/uzu42/rev1/keyboard.json @@ -45,8 +45,7 @@ "twinkle": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/vagrant_10/keyboard.json b/keyboards/vagrant_10/keyboard.json index 4bf29fba11..d59095c2d7 100644 --- a/keyboards/vagrant_10/keyboard.json +++ b/keyboards/vagrant_10/keyboard.json @@ -25,8 +25,7 @@ "rows": ["F7", "B1", "B3", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wsk/alpha9/keyboard.json b/keyboards/wsk/alpha9/keyboard.json index acdc1be307..ff9e26b0d2 100644 --- a/keyboards/wsk/alpha9/keyboard.json +++ b/keyboards/wsk/alpha9/keyboard.json @@ -49,8 +49,7 @@ "ws2812": { "pin": "F4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wsk/g4m3ralpha/keyboard.json b/keyboards/wsk/g4m3ralpha/keyboard.json index 4f88fd0ce1..f008a77a26 100644 --- a/keyboards/wsk/g4m3ralpha/keyboard.json +++ b/keyboards/wsk/g4m3ralpha/keyboard.json @@ -50,8 +50,7 @@ "rows": ["D4", "B4", "B5", "D1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wsk/jerkin/keyboard.json b/keyboards/wsk/jerkin/keyboard.json index 3fc05080b0..4ff9701f6e 100644 --- a/keyboards/wsk/jerkin/keyboard.json +++ b/keyboards/wsk/jerkin/keyboard.json @@ -25,8 +25,7 @@ "rows": ["B3", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wsk/kodachi50/keyboard.json b/keyboards/wsk/kodachi50/keyboard.json index c93952d808..d37eb965e2 100644 --- a/keyboards/wsk/kodachi50/keyboard.json +++ b/keyboards/wsk/kodachi50/keyboard.json @@ -46,8 +46,7 @@ "rows": ["D2", "B5", "B6", "B2", "B3", "B1", "F7", "F6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wsk/pain27/keyboard.json b/keyboards/wsk/pain27/keyboard.json index af882a112e..43a9ce5f59 100644 --- a/keyboards/wsk/pain27/keyboard.json +++ b/keyboards/wsk/pain27/keyboard.json @@ -46,8 +46,7 @@ "rows": ["F4", "F5", "D0"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/xenon/keyboard.json b/keyboards/xenon/keyboard.json index 0229f73ebd..72d2a5b0d8 100644 --- a/keyboards/xenon/keyboard.json +++ b/keyboards/xenon/keyboard.json @@ -39,8 +39,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/yampad/keyboard.json b/keyboards/yampad/keyboard.json index 789565e342..becdc2204d 100644 --- a/keyboards/yampad/keyboard.json +++ b/keyboards/yampad/keyboard.json @@ -40,8 +40,7 @@ "rows": ["C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "debounce": 2, "layouts": { "LAYOUT": { diff --git a/keyboards/yeehaw/keyboard.json b/keyboards/yeehaw/keyboard.json index 0f10738685..86db217fe1 100644 --- a/keyboards/yeehaw/keyboard.json +++ b/keyboards/yeehaw/keyboard.json @@ -34,8 +34,7 @@ "ws2812": { "pin": "B2" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "encoder": true, diff --git a/keyboards/yosino58/rev1/keyboard.json b/keyboards/yosino58/rev1/keyboard.json index ffc1a5d827..939a11c49d 100644 --- a/keyboards/yosino58/rev1/keyboard.json +++ b/keyboards/yosino58/rev1/keyboard.json @@ -25,8 +25,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/yushakobo/navpad/10/info.json b/keyboards/yushakobo/navpad/10/info.json index e28a2e2cb1..355cec2347 100644 --- a/keyboards/yushakobo/navpad/10/info.json +++ b/keyboards/yushakobo/navpad/10/info.json @@ -37,6 +37,5 @@ "rgb_test": true } }, - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/yushakobo/navpad/10_helix_r/keyboard.json b/keyboards/yushakobo/navpad/10_helix_r/keyboard.json index 89613390c1..89004dd0d3 100644 --- a/keyboards/yushakobo/navpad/10_helix_r/keyboard.json +++ b/keyboards/yushakobo/navpad/10_helix_r/keyboard.json @@ -63,8 +63,7 @@ "rgb_test": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/yushakobo/quick17/keyboard.json b/keyboards/yushakobo/quick17/keyboard.json index aa0d39756d..627642a179 100644 --- a/keyboards/yushakobo/quick17/keyboard.json +++ b/keyboards/yushakobo/quick17/keyboard.json @@ -51,8 +51,7 @@ "ws2812": { "pin": "D2" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/yushakobo/quick7/keyboard.json b/keyboards/yushakobo/quick7/keyboard.json index 146397d088..4bd42a2f16 100644 --- a/keyboards/yushakobo/quick7/keyboard.json +++ b/keyboards/yushakobo/quick7/keyboard.json @@ -28,8 +28,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "command": true, diff --git a/keyboards/yynmt/dozen0/keyboard.json b/keyboards/yynmt/dozen0/keyboard.json index f627152d0e..84b62cce5c 100644 --- a/keyboards/yynmt/dozen0/keyboard.json +++ b/keyboards/yynmt/dozen0/keyboard.json @@ -46,8 +46,7 @@ "rows": ["F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/zigotica/z12/keyboard.json b/keyboards/zigotica/z12/keyboard.json index 8d797907de..9af7b86eb0 100644 --- a/keyboards/zigotica/z12/keyboard.json +++ b/keyboards/zigotica/z12/keyboard.json @@ -14,8 +14,7 @@ {"pin_a": "B6", "pin_b": "B2"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "build": { "lto": true }, diff --git a/keyboards/zigotica/z34/keyboard.json b/keyboards/zigotica/z34/keyboard.json index 0a96fa0091..c5d2cc8ae9 100644 --- a/keyboards/zigotica/z34/keyboard.json +++ b/keyboards/zigotica/z34/keyboard.json @@ -20,8 +20,7 @@ "resync": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "direct": [ ["C6", "F7", "F6", "F5", "F4"], From 8b7c351e562f13bae5f25efb0120e13cfa491e9b Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 24 May 2025 19:00:22 +0100 Subject: [PATCH 394/592] [Docs] Fix tap_hold code blocks (#25298) --- docs/tap_hold.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tap_hold.md b/docs/tap_hold.md index f1af753eba..55cb64a498 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -450,7 +450,7 @@ Optionally, define the `is_flow_tap_key()` callback to specify where Flow Tap is The default implementation of this callback is: -```.c +```c bool is_flow_tap_key(uint16_t keycode) { if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) { return false; // Disable Flow Tap on hotkeys. @@ -476,7 +476,7 @@ Optionally, for further flexibility, define the `get_flow_tap_term()` callback. The default implementation of this callback is -```.c +```c uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record, uint16_t prev_keycode) { if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) { From ba5c70732720abbf133c4d466636964459a6921e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 24 May 2025 19:04:01 +0100 Subject: [PATCH 395/592] salicylic_acid3/getta25 - Fix oled keymap (#25295) --- keyboards/salicylic_acid3/getta25/keymaps/oled/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h b/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h index 23f8b5343f..15c247f961 100644 --- a/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h +++ b/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h @@ -21,5 +21,5 @@ #define QUICK_TAP_TERM 0 #define TAPPING_TERM 180 -#define OLED_FONT_H "keyboards/getta25/keymaps/oled/glcdfont.c" +#define OLED_FONT_H "keyboards/salicylic_acid3/getta25/keymaps/oled/glcdfont.c" From dd871d010547695f5975ab673e998eb11e1dc67a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 24 May 2025 21:19:52 +0100 Subject: [PATCH 396/592] Configure boards to use development_board - S (#25293) --- keyboards/salicylic_acid3/7skb/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/7splus/keyboard.json | 3 +-- keyboards/salicylic_acid3/ajisai74/keyboard.json | 3 +-- keyboards/salicylic_acid3/ergoarrows/keyboard.json | 3 +-- keyboards/salicylic_acid3/getta25/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/guide68/keyboard.json | 3 +-- keyboards/salicylic_acid3/jisplit89/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/nafuda/keyboard.json | 3 +-- keyboards/salicylic_acid3/naked48/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/naked60/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/naked64/rev1/keyboard.json | 3 +-- keyboards/salicylic_acid3/nknl7en/keyboard.json | 3 +-- keyboards/salicylic_acid3/nknl7jp/keyboard.json | 3 +-- keyboards/salicylic_acid3/setta21/rev1/keyboard.json | 3 +-- keyboards/sck/neiso/keyboard.json | 3 +-- keyboards/sendyyeah/75pixels/keyboard.json | 3 +-- keyboards/sendyyeah/bevi/keyboard.json | 3 +-- keyboards/sendyyeah/pix/keyboard.json | 3 +-- keyboards/sergiopoverony/creator_pro/keyboard.json | 3 +-- keyboards/shandoncodes/mino/hotswap/keyboard.json | 3 +-- keyboards/shapeshifter4060/keyboard.json | 3 +-- keyboards/shiro/keyboard.json | 3 +-- keyboards/shoc/keyboard.json | 3 +-- keyboards/silverbullet44/keyboard.json | 3 +-- keyboards/snampad/keyboard.json | 3 +-- keyboards/soup10/keyboard.json | 3 +-- keyboards/spaceman/2_milk/keyboard.json | 3 +-- keyboards/spaceman/pancake/rev1/feather/keyboard.json | 2 ++ keyboards/spaceman/pancake/rev1/info.json | 2 -- keyboards/spaceman/pancake/rev1/promicro/keyboard.json | 1 + keyboards/spacetime/info.json | 3 +-- keyboards/sparrow62/keyboard.json | 3 +-- keyboards/splitish/keyboard.json | 3 +-- keyboards/sporewoh/banime40/keyboard.json | 3 +-- keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json | 3 +-- keyboards/subrezon/la_nc/keyboard.json | 3 +-- 36 files changed, 36 insertions(+), 68 deletions(-) diff --git a/keyboards/salicylic_acid3/7skb/rev1/keyboard.json b/keyboards/salicylic_acid3/7skb/rev1/keyboard.json index 4a338811ea..342b81cbbd 100644 --- a/keyboards/salicylic_acid3/7skb/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/7skb/rev1/keyboard.json @@ -59,8 +59,7 @@ "build": { "lto": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/7splus/keyboard.json b/keyboards/salicylic_acid3/7splus/keyboard.json index aa04293c9c..5d2cab5a98 100644 --- a/keyboards/salicylic_acid3/7splus/keyboard.json +++ b/keyboards/salicylic_acid3/7splus/keyboard.json @@ -56,8 +56,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/ajisai74/keyboard.json b/keyboards/salicylic_acid3/ajisai74/keyboard.json index a74cb07902..34743952fb 100644 --- a/keyboards/salicylic_acid3/ajisai74/keyboard.json +++ b/keyboards/salicylic_acid3/ajisai74/keyboard.json @@ -34,8 +34,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/ergoarrows/keyboard.json b/keyboards/salicylic_acid3/ergoarrows/keyboard.json index 08911ca103..ac9ea3179a 100644 --- a/keyboards/salicylic_acid3/ergoarrows/keyboard.json +++ b/keyboards/salicylic_acid3/ergoarrows/keyboard.json @@ -55,8 +55,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/getta25/rev1/keyboard.json b/keyboards/salicylic_acid3/getta25/rev1/keyboard.json index 884ed684ea..d6e4f60c54 100644 --- a/keyboards/salicylic_acid3/getta25/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/getta25/rev1/keyboard.json @@ -46,8 +46,7 @@ "rows": ["D4", "C6", "D7", "E6", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/guide68/keyboard.json b/keyboards/salicylic_acid3/guide68/keyboard.json index 327794adf9..99235fdf6a 100644 --- a/keyboards/salicylic_acid3/guide68/keyboard.json +++ b/keyboards/salicylic_acid3/guide68/keyboard.json @@ -2,7 +2,7 @@ "manufacturer": "Salicylic-acid3", "keyboard_name": "guide68", "maintainer": "Salicylic-acid3", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "features": { "bootmagic": true, @@ -15,7 +15,6 @@ "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B5"], "rows": ["D4", "C6", "D7", "E6", "B4"] }, - "processor": "atmega32u4", "usb": { "vid": "0x04D8", "pid": "0xE6DD", diff --git a/keyboards/salicylic_acid3/jisplit89/rev1/keyboard.json b/keyboards/salicylic_acid3/jisplit89/rev1/keyboard.json index e4525ecf74..03e376adde 100644 --- a/keyboards/salicylic_acid3/jisplit89/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/jisplit89/rev1/keyboard.json @@ -56,8 +56,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/nafuda/keyboard.json b/keyboards/salicylic_acid3/nafuda/keyboard.json index e3c84885cf..0a33ad58c9 100644 --- a/keyboards/salicylic_acid3/nafuda/keyboard.json +++ b/keyboards/salicylic_acid3/nafuda/keyboard.json @@ -46,8 +46,7 @@ "rows": ["D1", "D0", "D4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/naked48/rev1/keyboard.json b/keyboards/salicylic_acid3/naked48/rev1/keyboard.json index 3bac1d8864..2cf2dbc45b 100644 --- a/keyboards/salicylic_acid3/naked48/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/naked48/rev1/keyboard.json @@ -63,8 +63,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/naked60/rev1/keyboard.json b/keyboards/salicylic_acid3/naked60/rev1/keyboard.json index 5037414c3d..f41d2e1413 100644 --- a/keyboards/salicylic_acid3/naked60/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/naked60/rev1/keyboard.json @@ -37,8 +37,7 @@ } } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/naked64/rev1/keyboard.json b/keyboards/salicylic_acid3/naked64/rev1/keyboard.json index 688edf53d3..be60079590 100644 --- a/keyboards/salicylic_acid3/naked64/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/naked64/rev1/keyboard.json @@ -51,8 +51,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/nknl7en/keyboard.json b/keyboards/salicylic_acid3/nknl7en/keyboard.json index 3b6f71c58d..2f3b9609df 100644 --- a/keyboards/salicylic_acid3/nknl7en/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7en/keyboard.json @@ -55,8 +55,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/nknl7jp/keyboard.json b/keyboards/salicylic_acid3/nknl7jp/keyboard.json index 66daa50da7..818644dd7d 100644 --- a/keyboards/salicylic_acid3/nknl7jp/keyboard.json +++ b/keyboards/salicylic_acid3/nknl7jp/keyboard.json @@ -55,8 +55,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/salicylic_acid3/setta21/rev1/keyboard.json b/keyboards/salicylic_acid3/setta21/rev1/keyboard.json index 75517a7d40..545c6285e4 100644 --- a/keyboards/salicylic_acid3/setta21/rev1/keyboard.json +++ b/keyboards/salicylic_acid3/setta21/rev1/keyboard.json @@ -76,8 +76,7 @@ "rows": ["D4", "C6", "D7", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["numpad_6x4"], "layouts": { "LAYOUT_numpad_6x4": { diff --git a/keyboards/sck/neiso/keyboard.json b/keyboards/sck/neiso/keyboard.json index 51c1fb0092..93d3e5a905 100644 --- a/keyboards/sck/neiso/keyboard.json +++ b/keyboards/sck/neiso/keyboard.json @@ -25,8 +25,7 @@ "rows": ["F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/sendyyeah/75pixels/keyboard.json b/keyboards/sendyyeah/75pixels/keyboard.json index 8200574dd9..0d23952052 100644 --- a/keyboards/sendyyeah/75pixels/keyboard.json +++ b/keyboards/sendyyeah/75pixels/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B6", "F4", "F5", "F6", "F7", "B1", "B3", "B2", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x15"], "layouts": { "LAYOUT_ortho_5x15": { diff --git a/keyboards/sendyyeah/bevi/keyboard.json b/keyboards/sendyyeah/bevi/keyboard.json index 2c45339d26..e408ded1b4 100644 --- a/keyboards/sendyyeah/bevi/keyboard.json +++ b/keyboards/sendyyeah/bevi/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B3", "B2", "D3", "D2", "D1", "D0", "D4", "C6", "D7", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/sendyyeah/pix/keyboard.json b/keyboards/sendyyeah/pix/keyboard.json index bb74798d00..6f81d20d01 100644 --- a/keyboards/sendyyeah/pix/keyboard.json +++ b/keyboards/sendyyeah/pix/keyboard.json @@ -34,8 +34,7 @@ {"pin_a": "B1", "pin_b": "B3"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "encoder": true, diff --git a/keyboards/sergiopoverony/creator_pro/keyboard.json b/keyboards/sergiopoverony/creator_pro/keyboard.json index 9b3cafe183..f5d2fb0afb 100644 --- a/keyboards/sergiopoverony/creator_pro/keyboard.json +++ b/keyboards/sergiopoverony/creator_pro/keyboard.json @@ -13,8 +13,7 @@ {"pin_a": "D2", "pin_b": "D3", "resolution": 1} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "command": true, diff --git a/keyboards/shandoncodes/mino/hotswap/keyboard.json b/keyboards/shandoncodes/mino/hotswap/keyboard.json index b7f55f6535..d9f460b391 100644 --- a/keyboards/shandoncodes/mino/hotswap/keyboard.json +++ b/keyboards/shandoncodes/mino/hotswap/keyboard.json @@ -27,8 +27,7 @@ "rows": ["D3", "C6", "D4", "D2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_default": { "layout": [ diff --git a/keyboards/shapeshifter4060/keyboard.json b/keyboards/shapeshifter4060/keyboard.json index 9274923088..5f7d7d3150 100644 --- a/keyboards/shapeshifter4060/keyboard.json +++ b/keyboards/shapeshifter4060/keyboard.json @@ -27,8 +27,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/shiro/keyboard.json b/keyboards/shiro/keyboard.json index c401126591..141dd61847 100644 --- a/keyboards/shiro/keyboard.json +++ b/keyboards/shiro/keyboard.json @@ -27,8 +27,7 @@ "rows": ["D4", "C6", "D7", "E6", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/shoc/keyboard.json b/keyboards/shoc/keyboard.json index b0da52f9f6..2fbf06c5e3 100644 --- a/keyboards/shoc/keyboard.json +++ b/keyboards/shoc/keyboard.json @@ -21,8 +21,7 @@ "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B6", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/silverbullet44/keyboard.json b/keyboards/silverbullet44/keyboard.json index 69c291a1cc..26e2bcce3a 100644 --- a/keyboards/silverbullet44/keyboard.json +++ b/keyboards/silverbullet44/keyboard.json @@ -60,8 +60,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "debounce": 10, "layouts": { "LAYOUT": { diff --git a/keyboards/snampad/keyboard.json b/keyboards/snampad/keyboard.json index b835f0bf35..66fa76b5e8 100644 --- a/keyboards/snampad/keyboard.json +++ b/keyboards/snampad/keyboard.json @@ -26,8 +26,7 @@ "rows": ["F4", "F5", "F6", "F7", "B1", "B3"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["numpad_6x4"], "layouts": { "LAYOUT_numpad_6x4": { diff --git a/keyboards/soup10/keyboard.json b/keyboards/soup10/keyboard.json index 54b9fa9cf6..08c1b8b5dd 100644 --- a/keyboards/soup10/keyboard.json +++ b/keyboards/soup10/keyboard.json @@ -31,8 +31,7 @@ "bootmagic": { "matrix": [0, 1] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/spaceman/2_milk/keyboard.json b/keyboards/spaceman/2_milk/keyboard.json index aed735c58f..748f3e9854 100644 --- a/keyboards/spaceman/2_milk/keyboard.json +++ b/keyboards/spaceman/2_milk/keyboard.json @@ -13,8 +13,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "command": true, diff --git a/keyboards/spaceman/pancake/rev1/feather/keyboard.json b/keyboards/spaceman/pancake/rev1/feather/keyboard.json index 3b82e3d499..7ba561ab61 100644 --- a/keyboards/spaceman/pancake/rev1/feather/keyboard.json +++ b/keyboards/spaceman/pancake/rev1/feather/keyboard.json @@ -1,4 +1,6 @@ { + "processor": "atmega32u4", + "bootloader": "caterina", "features": { "bluetooth": true, "bootmagic": true, diff --git a/keyboards/spaceman/pancake/rev1/info.json b/keyboards/spaceman/pancake/rev1/info.json index 9d6f30ab51..29f48c672b 100644 --- a/keyboards/spaceman/pancake/rev1/info.json +++ b/keyboards/spaceman/pancake/rev1/info.json @@ -7,8 +7,6 @@ "pid": "0x504B", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", "community_layouts": ["ortho_4x12", "planck_mit"], "layouts": { "LAYOUT_planck_mit": { diff --git a/keyboards/spaceman/pancake/rev1/promicro/keyboard.json b/keyboards/spaceman/pancake/rev1/promicro/keyboard.json index 658eaa39c1..feda013255 100644 --- a/keyboards/spaceman/pancake/rev1/promicro/keyboard.json +++ b/keyboards/spaceman/pancake/rev1/promicro/keyboard.json @@ -1,4 +1,5 @@ { + "development_board": "promicro", "features": { "bootmagic": true, "command": true, diff --git a/keyboards/spacetime/info.json b/keyboards/spacetime/info.json index e103f58ebb..b11a43f53c 100644 --- a/keyboards/spacetime/info.json +++ b/keyboards/spacetime/info.json @@ -32,8 +32,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/sparrow62/keyboard.json b/keyboards/sparrow62/keyboard.json index 66efa2288b..e732ab6539 100644 --- a/keyboards/sparrow62/keyboard.json +++ b/keyboards/sparrow62/keyboard.json @@ -34,8 +34,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/splitish/keyboard.json b/keyboards/splitish/keyboard.json index 986a08709f..5984f2fd97 100644 --- a/keyboards/splitish/keyboard.json +++ b/keyboards/splitish/keyboard.json @@ -25,8 +25,7 @@ "rows": ["B4", "B5", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/sporewoh/banime40/keyboard.json b/keyboards/sporewoh/banime40/keyboard.json index 39a60e9b56..7d0bb54db1 100644 --- a/keyboards/sporewoh/banime40/keyboard.json +++ b/keyboards/sporewoh/banime40/keyboard.json @@ -22,8 +22,7 @@ "dynamic_keymap": { "layer_count": 10 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x10"], "layouts": { "LAYOUT_ortho_4x10": { diff --git a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json index 90d6187434..9cbed0feb9 100644 --- a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json @@ -21,8 +21,7 @@ "rows": ["F4", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/subrezon/la_nc/keyboard.json b/keyboards/subrezon/la_nc/keyboard.json index 9a9a511fbf..eb9a35fded 100644 --- a/keyboards/subrezon/la_nc/keyboard.json +++ b/keyboards/subrezon/la_nc/keyboard.json @@ -18,8 +18,7 @@ "rows": ["D3", "F4", "D2", "B2", "B5", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ From c97a798af76f6717d56d7279d418f49a96730e4f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 24 May 2025 21:20:16 +0100 Subject: [PATCH 397/592] Configure boards to use development_board - T (#25294) --- keyboards/takashicompany/center_enter/keyboard.json | 3 +-- keyboards/takashicompany/compacx/keyboard.json | 3 +-- keyboards/takashicompany/dogtag/keyboard.json | 3 +-- keyboards/takashicompany/endzone34/keyboard.json | 5 ++--- keyboards/takashicompany/qoolee/keyboard.json | 5 ++--- keyboards/takashicompany/radialex/keyboard.json | 3 +-- keyboards/takashicompany/spreadwriter/keyboard.json | 3 +-- keyboards/takashiski/hecomi/alpha/keyboard.json | 3 +-- keyboards/takashiski/namecard2x4/info.json | 3 +-- keyboards/tanuki/keyboard.json | 3 +-- keyboards/tender/macrowo_pad/keyboard.json | 3 +-- keyboards/tenki/keyboard.json | 3 +-- keyboards/tg4x/keyboard.json | 5 ++--- keyboards/tominabox1/qaz/keyboard.json | 3 +-- 14 files changed, 17 insertions(+), 31 deletions(-) diff --git a/keyboards/takashicompany/center_enter/keyboard.json b/keyboards/takashicompany/center_enter/keyboard.json index 992ca29efd..4666a91484 100644 --- a/keyboards/takashicompany/center_enter/keyboard.json +++ b/keyboards/takashicompany/center_enter/keyboard.json @@ -51,8 +51,7 @@ {"pin_a": "D2", "pin_b": "D1", "resolution": 1} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/takashicompany/compacx/keyboard.json b/keyboards/takashicompany/compacx/keyboard.json index 71d6d2ec74..916b6bfd24 100644 --- a/keyboards/takashicompany/compacx/keyboard.json +++ b/keyboards/takashicompany/compacx/keyboard.json @@ -64,8 +64,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/takashicompany/dogtag/keyboard.json b/keyboards/takashicompany/dogtag/keyboard.json index af8d2119d4..73d138da12 100644 --- a/keyboards/takashicompany/dogtag/keyboard.json +++ b/keyboards/takashicompany/dogtag/keyboard.json @@ -40,8 +40,7 @@ } } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "rgblight": { "led_count": 8, "split_count": [4, 4], diff --git a/keyboards/takashicompany/endzone34/keyboard.json b/keyboards/takashicompany/endzone34/keyboard.json index c0b696e845..38379c0c46 100644 --- a/keyboards/takashicompany/endzone34/keyboard.json +++ b/keyboards/takashicompany/endzone34/keyboard.json @@ -48,9 +48,8 @@ "rows": ["B3", "B2", "B6", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", - "layouts": { + "development_board": "promicro", + "layouts": { "LAYOUT": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0.5}, diff --git a/keyboards/takashicompany/qoolee/keyboard.json b/keyboards/takashicompany/qoolee/keyboard.json index 26389b03a3..873ca082ac 100644 --- a/keyboards/takashicompany/qoolee/keyboard.json +++ b/keyboards/takashicompany/qoolee/keyboard.json @@ -52,9 +52,8 @@ {"pin_a": "D2", "pin_b": "D1", "resolution": 1} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", - "layouts": { + "development_board": "promicro", + "layouts": { "LAYOUT": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0, "w": 1.5}, diff --git a/keyboards/takashicompany/radialex/keyboard.json b/keyboards/takashicompany/radialex/keyboard.json index 3b71cc6a5b..e1b88feac8 100644 --- a/keyboards/takashicompany/radialex/keyboard.json +++ b/keyboards/takashicompany/radialex/keyboard.json @@ -47,8 +47,7 @@ "rows": ["B6", "D4", "C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/takashicompany/spreadwriter/keyboard.json b/keyboards/takashicompany/spreadwriter/keyboard.json index 59c78c4532..d544a3e13e 100644 --- a/keyboards/takashicompany/spreadwriter/keyboard.json +++ b/keyboards/takashicompany/spreadwriter/keyboard.json @@ -2,7 +2,7 @@ "manufacturer": "takashicompany", "keyboard_name": "Spreadwriter", "maintainer": "takashicompany", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "features": { "bootmagic": true, @@ -16,7 +16,6 @@ "cols": ["D4", "C6", "D7", "E6", "B4", "B5", "D2"], "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"] }, - "processor": "atmega32u4", "url": "https://github.com/takashicompany/spreadwriter", "usb": { "device_version": "1.0.0", diff --git a/keyboards/takashiski/hecomi/alpha/keyboard.json b/keyboards/takashiski/hecomi/alpha/keyboard.json index edb920c82d..58167f38d6 100644 --- a/keyboards/takashiski/hecomi/alpha/keyboard.json +++ b/keyboards/takashiski/hecomi/alpha/keyboard.json @@ -43,8 +43,7 @@ "ws2812": { "pin": "D4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/takashiski/namecard2x4/info.json b/keyboards/takashiski/namecard2x4/info.json index 895f3e4c4b..dd95017b3b 100644 --- a/keyboards/takashiski/namecard2x4/info.json +++ b/keyboards/takashiski/namecard2x4/info.json @@ -16,8 +16,7 @@ "pid": "0x0000", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/tanuki/keyboard.json b/keyboards/tanuki/keyboard.json index 90c5cd7cf7..ac6b257652 100644 --- a/keyboards/tanuki/keyboard.json +++ b/keyboards/tanuki/keyboard.json @@ -45,8 +45,7 @@ "rows": ["F7", "B1", "D4", "D0"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/tender/macrowo_pad/keyboard.json b/keyboards/tender/macrowo_pad/keyboard.json index 2380daf8b1..13f486d5b5 100644 --- a/keyboards/tender/macrowo_pad/keyboard.json +++ b/keyboards/tender/macrowo_pad/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B5", "D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/tenki/keyboard.json b/keyboards/tenki/keyboard.json index 913017866b..394e4cbfdf 100644 --- a/keyboards/tenki/keyboard.json +++ b/keyboards/tenki/keyboard.json @@ -48,8 +48,7 @@ "rows": ["B1", "B4", "F6", "B6", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x4"], "layouts": { "LAYOUT_ortho_5x4": { diff --git a/keyboards/tg4x/keyboard.json b/keyboards/tg4x/keyboard.json index a2e4a84ff5..0cedae15d6 100644 --- a/keyboards/tg4x/keyboard.json +++ b/keyboards/tg4x/keyboard.json @@ -49,9 +49,8 @@ "rows": ["B5", "B4", "E6", "D7", "C6", "D4", "D0", "D1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", - "layouts": { + "development_board": "promicro", + "layouts": { "LAYOUT": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, diff --git a/keyboards/tominabox1/qaz/keyboard.json b/keyboards/tominabox1/qaz/keyboard.json index 4595b5f42f..cc0a4c5e84 100644 --- a/keyboards/tominabox1/qaz/keyboard.json +++ b/keyboards/tominabox1/qaz/keyboard.json @@ -45,8 +45,7 @@ "rows": ["F4", "D4", "C6", "E6", "D1", "D0"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_split_space": { "layout": [ From 3703699757b6ce938ff412aca0a8b064927c0cdb Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 26 May 2025 12:04:52 +0100 Subject: [PATCH 398/592] 2025 Q2 changelog (#25297) Co-authored-by: Drashna Jaelre Co-authored-by: Nick Brassel --- docs/ChangeLog/20250525.md | 299 +++++++++++++++++++++++++++++ docs/ChangeLog/20250525/pr25237.md | 3 - docs/_sidebar.json | 2 +- docs/breaking_changes.md | 20 +- docs/breaking_changes_history.md | 1 + readme.md | 4 - 6 files changed, 311 insertions(+), 18 deletions(-) create mode 100644 docs/ChangeLog/20250525.md delete mode 100644 docs/ChangeLog/20250525/pr25237.md diff --git a/docs/ChangeLog/20250525.md b/docs/ChangeLog/20250525.md new file mode 100644 index 0000000000..c8859e0ea1 --- /dev/null +++ b/docs/ChangeLog/20250525.md @@ -0,0 +1,299 @@ +# QMK Breaking Changes - 2025 May 25 Changelog + +## Notable Features + +### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125)) + +Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle. + +Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately. + +See the [Flow Tap documentation](../tap_hold#flow-tap) for more information. + +### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187)) + +Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks. + +See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks. + +## Changes Requiring User Action + +### Updated Keyboard Codebases + +| Old Keyboard Name | New Keyboard Name | +|------------------------|----------------------| +| chew | chew/split | +| deemen17/de60fs | deemen17/de60/r1 | +| keyten/kt60hs_t | keyten/kt60hs_t/v1 | +| plywrks/ply8x | plywrks/ply8x/solder | +| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 | +| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 | + +## Deprecation Notices + +In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here. + +### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237)) + +This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead. + +### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262)) + +Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected. + +The new defaults can be configured in the following ways: + +:::::tabs + +==== keyboard.json + +```json [keyboard.json] +{ + "host": { // [!code focus] + "default": { // [!code focus] + "nkro": true // [!code focus] + } // [!code focus] + } // [!code focus] +} + +``` + +==== keymap.json + +```json [keymap.json] +{ + "config": { + "host": { // [!code focus] + "default": { // [!code focus] + "nkro": true // [!code focus] + } // [!code focus] + } // [!code focus] + } +} + +``` + +==== config.h + +```c [config.h] +#pragma once + +#define NKRO_DEFAULT_ON true // [!code focus] +``` + +::::: + +The deprecated options will be removed in a future breaking changes cycle. + +### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111)) + +Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`. + +see the [Converters Feature](../feature_converters) documentation for more information. + +### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281)) + +`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system. +Parent folders containing common configuration would create invalid build targets. + +With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets. +The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration. + +Backwards compatibility of build targets has been maintained where possible. + +### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330)) + +Converter support will be further limited to only function if a keyboard declares that is is compatible. + +This can be configured in the following ways: + +:::::tabs + +==== keyboard.json + +```json [keyboard.json] +{ + "development_board": "promicro", // [!code focus] +} +``` + +==== rules.mk + +```make [rules.mk] +PIN_COMPATIBLE = promicro +``` + +::::: + +see the [Converters Feature](../feature_converters) documentation for more information. + +### Deprecation of `encoder_update_{kb|user}` + +These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map). + +`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely. + +To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`: + +:::::tabs + +=== 1. Add keycode definitions + +Define new keycodes: + +```c +enum { + MY_ENCODER_LEFT = QK_USER, // [!code focus] + MY_ENCODER_RIGHT, // [!code focus] +}; +``` + +=== 2. Add encoder mapping + +Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence): + +```c +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus] + [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus] + [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus] + [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus] +}; +#endif +``` + +=== 3. Add keycode processing + +Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap: + +```c +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case MY_ENCODER_LEFT: // [!code focus] + if (record->event.pressed) { // [!code focus] + // Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus] + } // [!code focus] + return false; // Skip all further processing of this keycode // [!code focus] + case MY_ENCODER_RIGHT: // [!code focus] + if (record->event.pressed) { // [!code focus] + // Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus] + } // [!code focus] + return false; // Skip all further processing of this keycode // [!code focus] + } +} +``` + +=== 4. Remove old code + +Remove your implementation of `encoder_update_user` from your `keymap.c`. + +:::::: + +If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above. + +## Full changelist + +Core: +* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356)) +* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423)) +* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666)) +* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787)) +* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952)) +* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990)) +* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042)) +* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050)) +* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111)) +* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125)) +* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129)) +* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135)) +* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141)) +* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171)) +* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173)) +* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176)) +* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184)) +* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187)) +* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199)) +* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200)) +* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201)) +* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203)) +* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207)) +* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219)) +* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255)) +* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262)) +* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271)) +* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280)) + +CLI: +* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553)) +* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680)) +* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061)) +* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085)) +* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116)) +* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149)) +* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182)) +* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237)) +* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251)) + +Submodule updates: +* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301)) +* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178)) +* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274)) + +Keyboards: +* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459)) +* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558)) +* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884)) +* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690)) +* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723)) +* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764)) +* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785)) +* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932)) +* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001)) +* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005)) +* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010)) +* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046)) +* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070)) +* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080)) +* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088)) +* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142)) +* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146)) +* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157)) +* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169)) +* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181)) +* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189)) +* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190)) +* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193)) +* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208)) +* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246)) +* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266)) +* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268)) +* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287)) +* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288)) +* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293)) +* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294)) + +Keyboard fixes: +* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018)) +* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209)) +* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295)) + +Others: +* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997)) +* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191)) + +Bugs: +* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015)) +* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060)) +* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121)) +* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166)) +* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175)) +* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194)) +* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204)) +* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210)) +* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238)) +* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250)) +* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254)) +* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263)) +* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272)) +* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298)) diff --git a/docs/ChangeLog/20250525/pr25237.md b/docs/ChangeLog/20250525/pr25237.md deleted file mode 100644 index ca09e93ebc..0000000000 --- a/docs/ChangeLog/20250525/pr25237.md +++ /dev/null @@ -1,3 +0,0 @@ -# Deprecation of `qmk generate-compilation-database` - -This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead. diff --git a/docs/_sidebar.json b/docs/_sidebar.json index f504f6f900..37f2dc580c 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -207,7 +207,7 @@ { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "Most Recent ChangeLog", - "link": "/ChangeLog/20250223" + "link": "/ChangeLog/20250525" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Deprecation Policy", "link": "/support_deprecation_policy" } diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md index a5a57ccd12..9063fc18db 100644 --- a/docs/breaking_changes.md +++ b/docs/breaking_changes.md @@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch ## What has been included in past Breaking Changes? +* [2025 May 25](ChangeLog/20250525) * [2025 Feb 23](ChangeLog/20250223) * [2024 Nov 24](ChangeLog/20241124) -* [2024 Aug 25](ChangeLog/20240825) * [Older Breaking Changes](breaking_changes_history) ## When is the next Breaking Change? -The next Breaking Change is scheduled for May 25, 2025. +The next Breaking Change is scheduled for Aug 31, 2025. ### Important Dates -* 2025 Feb 23 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. -* 2025 Apr 27 - `develop` closed to new PRs. -* 2025 Apr 27 - Call for testers. -* 2025 May 11 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes -* 2025 May 18 - `develop` is locked, only critical bugfix PRs merged. -* 2025 May 23 - `master` is locked, no PRs merged. -* 2025 May 25 - Merge `develop` to `master`. -* 2025 May 25 - `master` is unlocked. PRs can be merged again. +* 2025 May 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. +* 2025 Aug 3 - `develop` closed to new PRs. +* 2025 Aug 3 - Call for testers. +* 2025 Aug 17 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes +* 2025 Aug 24 - `develop` is locked, only critical bugfix PRs merged. +* 2025 Aug 29 - `master` is locked, no PRs merged. +* 2025 Aug 31 - Merge `develop` to `master`. +* 2025 Aug 31 - `master` is unlocked. PRs can be merged again. ## What changes will be included? diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md index af8c1c04d5..274aa340df 100644 --- a/docs/breaking_changes_history.md +++ b/docs/breaking_changes_history.md @@ -2,6 +2,7 @@ This page links to all previous changelogs from the QMK Breaking Changes process. +* [2025 May 25](ChangeLog/20250525) - version 0.29.0 * [2025 Feb 23](ChangeLog/20250223) - version 0.28.0 * [2024 Nov 24](ChangeLog/20241124) - version 0.27.0 * [2024 Aug 25](ChangeLog/20240825) - version 0.26.0 diff --git a/readme.md b/readme.md index e5c0d41b7b..62aed12066 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,3 @@ -# THIS IS THE DEVELOP BRANCH - -Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. - # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From 76cf8dff93ff59ec6e8e268cf7aad173068d1fba Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 26 May 2025 21:43:45 +1000 Subject: [PATCH 399/592] Branch point for 2025-05-25 Breaking Change --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 62aed12066..e5c0d41b7b 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,7 @@ +# THIS IS THE DEVELOP BRANCH + +Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. + # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From 41b1bb4aef8b550ba67c5a546be970820e072f8f Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Tue, 27 May 2025 14:22:55 +0100 Subject: [PATCH 400/592] Fix dynamic keymap macro only sending first. (#25309) --- quantum/dynamic_keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 59027fb694..25029e39c4 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -166,6 +166,6 @@ void dynamic_keymap_macro_send(uint8_t id) { ++offset; } - send_string_nvm_state_t state = {.offset = 0}; + send_string_nvm_state_t state = {.offset = offset}; send_string_with_delay_impl(send_string_get_next_nvm, &state, DYNAMIC_KEYMAP_MACRO_DELAY); } From c8a39b69a0cba8184c2f348f7326ce75610a67b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 18:07:22 +0100 Subject: [PATCH 401/592] Bump vite from 5.4.18 to 5.4.19 in /builddefs/docsgen (#25306) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.18 to 5.4.19. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.19/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.19/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 5.4.19 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index c2e5412a06..69e229ae61 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.4.18", + "vite": "^5.4.19", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index a096b8d5c0..8a8457eb8d 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -766,10 +766,10 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.9, vite@^5.4.18: - version "5.4.18" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.18.tgz#b5af357f9d5ebb2e0c085779b7a37a77f09168a4" - integrity sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA== +vite@^5.2.9, vite@^5.4.19: + version "5.4.19" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959" + integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From 9e2d8999bf62c835ef6f94f4ac093d9554b73cf2 Mon Sep 17 00:00:00 2001 From: Sergey Radionov Date: Wed, 28 May 2025 05:24:20 +0700 Subject: [PATCH 402/592] Fix reference to wrong layer when LM used with right modifiers (#25303) --- quantum/keymap_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index abdcd5c7ba..9be9bae943 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -156,7 +156,7 @@ action_t action_for_keycode(uint16_t keycode) { case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: mod = mod_config(QK_LAYER_MOD_GET_MODS(keycode)); action_layer = QK_LAYER_MOD_GET_LAYER(keycode); - action.code = ACTION_LAYER_MODS(action_layer, (mod & 0x10) ? mod << 4 : mod); + action.code = ACTION_LAYER_MODS(action_layer, (mod & 0x10) ? (mod & 0xF) << 4 : mod); break; #endif // NO_ACTION_LAYER case QK_MOD_TAP ... QK_MOD_TAP_MAX: From 2b8aeed02bf131c8943b8dcc66585ce44112fc4e Mon Sep 17 00:00:00 2001 From: Idkau Date: Tue, 27 May 2025 18:47:00 -0600 Subject: [PATCH 403/592] Fix Sofle OLED layer indication code (#25311) Fixed oled raise/lower layer order and added adjust layer text to oled display --- keyboards/sofle/sofle.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/keyboards/sofle/sofle.c b/keyboards/sofle/sofle.c index 3f88e2b5ba..bbd9595def 100644 --- a/keyboards/sofle/sofle.c +++ b/keyboards/sofle/sofle.c @@ -85,10 +85,13 @@ void print_status_narrow(void) { oled_write_P(PSTR("Base\n"), false); break; case 2: - oled_write_P(PSTR("Raise"), false); + oled_write_P(PSTR("Lower"), false); break; case 3: - oled_write_P(PSTR("Lower"), false); + oled_write_P(PSTR("Raise"), false); + break; + case 4: + oled_write_P(PSTR("Adjust"), false); break; default: oled_write_ln_P(PSTR("Undef"), false); From faf77f1651f7660c55f7a8f2a7b653808a29e0e3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 28 May 2025 07:05:44 +0100 Subject: [PATCH 404/592] Fix typo in Battery Driver docs (#25312) * Fix typo in Battery Driver docs * Update battery.md --- docs/drivers/battery.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/drivers/battery.md b/docs/drivers/battery.md index 0bc8e5aec9..e482ffc8b6 100644 --- a/docs/drivers/battery.md +++ b/docs/drivers/battery.md @@ -36,8 +36,8 @@ The following `#define`s apply only to the `adc` driver: |-----------------------------|--------------|--------------------------------------------------------------| |`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. | |`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. | -|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. | -|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_VOLTAGE_DIVIDER_R1` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | |`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. | ## Functions From 1d145c75113ebcfc9916c929ed1ba90cb397ce7a Mon Sep 17 00:00:00 2001 From: Stephen Ostermiller Date: Mon, 2 Jun 2025 14:24:02 -0400 Subject: [PATCH 405/592] Fix quantum.c keycode handling (#25322) --- quantum/quantum.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index 0bb6ee0a91..319f477ae7 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -461,8 +461,8 @@ bool process_record_quantum(keyrecord_t *record) { } else { print("DEBUG: disabled.\n"); } -#endif return false; +#endif case QK_CLEAR_EEPROM: #ifdef NO_RESET eeconfig_init(); @@ -479,13 +479,13 @@ bool process_record_quantum(keyrecord_t *record) { #ifndef NO_ACTION_ONESHOT case QK_ONE_SHOT_TOGGLE: oneshot_toggle(); - break; + return false; case QK_ONE_SHOT_ON: oneshot_enable(); - break; + return false; case QK_ONE_SHOT_OFF: oneshot_disable(); - break; + return false; #endif #ifdef ENABLE_COMPILE_KEYCODE case QK_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader @@ -512,6 +512,7 @@ bool process_record_quantum(keyrecord_t *record) { if (temp_mod & MOD_MASK_SHIFT && temp_mod & MOD_MASK_CTRL) { reset_keyboard(); } + return false; } #endif } From 57374489daf456ac224cd178d4e12e1f9eb6f6ff Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 2 Jun 2025 19:24:23 +0100 Subject: [PATCH 406/592] Configure boards to use development_board - P (#25317) --- keyboards/pabile/p18/keyboard.json | 3 +-- keyboards/pabile/p20/ver1/keyboard.json | 3 +-- keyboards/pabile/p20/ver2/keyboard.json | 3 +-- keyboards/pabile/p40/keyboard.json | 3 +-- keyboards/pabile/p40_ortho/keyboard.json | 3 +-- keyboards/pabile/p42/keyboard.json | 3 +-- keyboards/peej/tripel/info.json | 3 +-- keyboards/peranekofactory/tone/rev1/keyboard.json | 3 +-- keyboards/peranekofactory/tone/rev2/keyboard.json | 3 +-- keyboards/pica40/rev1/keyboard.json | 3 +-- keyboards/pimentoso/paddino02/rev1/keyboard.json | 3 +-- keyboards/pimentoso/paddino02/rev2/left/keyboard.json | 3 +-- keyboards/pimentoso/paddino02/rev2/right/keyboard.json | 3 +-- keyboards/pimentoso/touhoupad/keyboard.json | 3 +-- keyboards/pinky/3/keyboard.json | 3 +-- keyboards/pinky/4/keyboard.json | 3 +-- keyboards/plum47/keyboard.json | 3 +-- keyboards/psuieee/pluto12/keyboard.json | 3 +-- keyboards/pteron36/keyboard.json | 3 +-- 19 files changed, 19 insertions(+), 38 deletions(-) diff --git a/keyboards/pabile/p18/keyboard.json b/keyboards/pabile/p18/keyboard.json index bf3380038a..12b7006680 100644 --- a/keyboards/pabile/p18/keyboard.json +++ b/keyboards/pabile/p18/keyboard.json @@ -27,8 +27,7 @@ {"pin_a": "F6", "pin_b": "F5"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pabile/p20/ver1/keyboard.json b/keyboards/pabile/p20/ver1/keyboard.json index 3e3a16a6d9..2cc5fed1ee 100644 --- a/keyboards/pabile/p20/ver1/keyboard.json +++ b/keyboards/pabile/p20/ver1/keyboard.json @@ -22,8 +22,7 @@ {"pin_a": "F7", "pin_b": "B1"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_numpad_5x4": { "layout": [ diff --git a/keyboards/pabile/p20/ver2/keyboard.json b/keyboards/pabile/p20/ver2/keyboard.json index cdacbf3aec..b82959af7a 100644 --- a/keyboards/pabile/p20/ver2/keyboard.json +++ b/keyboards/pabile/p20/ver2/keyboard.json @@ -15,8 +15,7 @@ "rows": ["C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_numpad_5x4": { "layout": [ diff --git a/keyboards/pabile/p40/keyboard.json b/keyboards/pabile/p40/keyboard.json index fbe4896687..de4eca82ac 100644 --- a/keyboards/pabile/p40/keyboard.json +++ b/keyboards/pabile/p40/keyboard.json @@ -20,8 +20,7 @@ "rows": ["F6", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x10"], "layouts": { "LAYOUT_ortho_4x10": { diff --git a/keyboards/pabile/p40_ortho/keyboard.json b/keyboards/pabile/p40_ortho/keyboard.json index 3e5d9ea504..838c58235c 100644 --- a/keyboards/pabile/p40_ortho/keyboard.json +++ b/keyboards/pabile/p40_ortho/keyboard.json @@ -19,8 +19,7 @@ "rows": ["D1", "D0", "F4", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_4x10": { "layout": [ diff --git a/keyboards/pabile/p42/keyboard.json b/keyboards/pabile/p42/keyboard.json index 42c8964332..8311becdfc 100644 --- a/keyboards/pabile/p42/keyboard.json +++ b/keyboards/pabile/p42/keyboard.json @@ -20,8 +20,7 @@ "rows": ["D1", "D0", "D4", "C6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/peej/tripel/info.json b/keyboards/peej/tripel/info.json index 7a5c12461a..e716e20cfe 100644 --- a/keyboards/peej/tripel/info.json +++ b/keyboards/peej/tripel/info.json @@ -20,6 +20,5 @@ "rows": ["C6", "D4", "D0", "B4", "E6", "D7", "D1", "D2", "D3"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/peranekofactory/tone/rev1/keyboard.json b/keyboards/peranekofactory/tone/rev1/keyboard.json index fb7b41b27a..9e9f7013c2 100644 --- a/keyboards/peranekofactory/tone/rev1/keyboard.json +++ b/keyboards/peranekofactory/tone/rev1/keyboard.json @@ -27,8 +27,7 @@ }, "tap_keycode_delay": 100 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "direct": [ ["D4", "C6", "D7", "E6", "F6", "F7", "B1", "B3"] diff --git a/keyboards/peranekofactory/tone/rev2/keyboard.json b/keyboards/peranekofactory/tone/rev2/keyboard.json index fb7b41b27a..9e9f7013c2 100644 --- a/keyboards/peranekofactory/tone/rev2/keyboard.json +++ b/keyboards/peranekofactory/tone/rev2/keyboard.json @@ -27,8 +27,7 @@ }, "tap_keycode_delay": 100 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "matrix_pins": { "direct": [ ["D4", "C6", "D7", "E6", "F6", "F7", "B1", "B3"] diff --git a/keyboards/pica40/rev1/keyboard.json b/keyboards/pica40/rev1/keyboard.json index 85c2221a13..a616a2e497 100644 --- a/keyboards/pica40/rev1/keyboard.json +++ b/keyboards/pica40/rev1/keyboard.json @@ -1,6 +1,5 @@ { - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "matrix_pins": { "cols": ["D2", "B5", "B4", "E6", "D7"], diff --git a/keyboards/pimentoso/paddino02/rev1/keyboard.json b/keyboards/pimentoso/paddino02/rev1/keyboard.json index b0fddff9d3..30ac2a9a06 100644 --- a/keyboards/pimentoso/paddino02/rev1/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev1/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D1", "D0", "D4"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json index f89552220d..ff9687b2b1 100644 --- a/keyboards/pimentoso/paddino02/rev2/left/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/left/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D0", "D4", "D1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json index 1148564a05..006eca8794 100644 --- a/keyboards/pimentoso/paddino02/rev2/right/keyboard.json +++ b/keyboards/pimentoso/paddino02/rev2/right/keyboard.json @@ -24,8 +24,7 @@ "rows": ["F4", "F6", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pimentoso/touhoupad/keyboard.json b/keyboards/pimentoso/touhoupad/keyboard.json index fed01eb5a6..5407d49e59 100644 --- a/keyboards/pimentoso/touhoupad/keyboard.json +++ b/keyboards/pimentoso/touhoupad/keyboard.json @@ -35,8 +35,7 @@ "rows": ["D4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pinky/3/keyboard.json b/keyboards/pinky/3/keyboard.json index f02b6c72d0..9ca44c26f3 100644 --- a/keyboards/pinky/3/keyboard.json +++ b/keyboards/pinky/3/keyboard.json @@ -17,8 +17,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_split_3x7_4" }, diff --git a/keyboards/pinky/4/keyboard.json b/keyboards/pinky/4/keyboard.json index 68b1dcb14c..bc651638ac 100644 --- a/keyboards/pinky/4/keyboard.json +++ b/keyboards/pinky/4/keyboard.json @@ -17,8 +17,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_split_4x7_4" }, diff --git a/keyboards/plum47/keyboard.json b/keyboards/plum47/keyboard.json index 2c6e009300..00efab2c28 100644 --- a/keyboards/plum47/keyboard.json +++ b/keyboards/plum47/keyboard.json @@ -2,7 +2,7 @@ "manufacturer": "Masayuki Takagi", "keyboard_name": "plum47", "maintainer": "awh-tokyo", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "features": { "bootmagic": true, @@ -14,7 +14,6 @@ "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6", "B5", "B4", "E6", "D7"], "rows": ["D1", "D0", "D4", "C6"] }, - "processor": "atmega32u4", "url": "ihttps://github.com/takagi/plum47_buildguide", "usb": { "device_version": "1.0.0", diff --git a/keyboards/psuieee/pluto12/keyboard.json b/keyboards/psuieee/pluto12/keyboard.json index 02db5bc0a1..815c3b5949 100644 --- a/keyboards/psuieee/pluto12/keyboard.json +++ b/keyboards/psuieee/pluto12/keyboard.json @@ -31,8 +31,7 @@ {"pin_a": "B6", "pin_b": "B2"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/pteron36/keyboard.json b/keyboards/pteron36/keyboard.json index 783e1e8db0..5daca888e9 100644 --- a/keyboards/pteron36/keyboard.json +++ b/keyboards/pteron36/keyboard.json @@ -54,8 +54,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["split_3x5_3"], "layouts": { "LAYOUT_split_3x5_3": { From 97168180cf41b417e4091cc258011dd8a885ee63 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 2 Jun 2025 19:24:29 +0100 Subject: [PATCH 407/592] Configure boards to use development_board - R (#25316) --- keyboards/rainkeebs/rainkeeb/keyboard.json | 3 +-- keyboards/rart/rart4x4/keyboard.json | 3 +-- keyboards/rart/rart67m/keyboard.json | 3 +-- keyboards/rart/rartlite/keyboard.json | 3 +-- keyboards/rart/rartpad/keyboard.json | 3 +-- keyboards/rate/pistachio_mp/keyboard.json | 3 +-- keyboards/recompile_keys/choco60/rev1/keyboard.json | 3 +-- keyboards/recompile_keys/cocoa40/keyboard.json | 3 +-- keyboards/recompile_keys/nomu30/rev1/keyboard.json | 3 +-- keyboards/rect44/keyboard.json | 3 +-- keyboards/redox_media/keyboard.json | 3 +-- keyboards/reviung/reviung34/keyboard.json | 3 +-- keyboards/reviung/reviung39/keyboard.json | 3 +-- keyboards/reviung/reviung41/keyboard.json | 3 +-- keyboards/reviung/reviung5/keyboard.json | 3 +-- keyboards/reviung/reviung53/keyboard.json | 3 +-- keyboards/rgbkb/zen/rev1/keyboard.json | 3 +-- keyboards/rgbkb/zen/rev2/keyboard.json | 3 +-- keyboards/rpiguy9907/southpaw66/keyboard.json | 3 +-- keyboards/rura66/rev1/keyboard.json | 3 +-- keyboards/ryanbaekr/rb1/keyboard.json | 3 +-- 21 files changed, 21 insertions(+), 42 deletions(-) diff --git a/keyboards/rainkeebs/rainkeeb/keyboard.json b/keyboards/rainkeebs/rainkeeb/keyboard.json index 2d4a2ac5b9..b14ea45dde 100644 --- a/keyboards/rainkeebs/rainkeeb/keyboard.json +++ b/keyboards/rainkeebs/rainkeeb/keyboard.json @@ -32,8 +32,7 @@ {"pin_a": "B2", "pin_b": "B6"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/rart/rart4x4/keyboard.json b/keyboards/rart/rart4x4/keyboard.json index a18e4a4606..13d7ca3345 100644 --- a/keyboards/rart/rart4x4/keyboard.json +++ b/keyboards/rart/rart4x4/keyboard.json @@ -54,8 +54,7 @@ {"pin_a": "D7", "pin_b": "E6"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x4"], "layouts": { "LAYOUT_ortho_4x4": { diff --git a/keyboards/rart/rart67m/keyboard.json b/keyboards/rart/rart67m/keyboard.json index bade7834fd..a9ab73ce57 100644 --- a/keyboards/rart/rart67m/keyboard.json +++ b/keyboards/rart/rart67m/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D3", "D2", "D4", "F6", "B3", "B4", "B2", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_all": "LAYOUT" }, diff --git a/keyboards/rart/rartlite/keyboard.json b/keyboards/rart/rartlite/keyboard.json index df9180d622..48325bf391 100644 --- a/keyboards/rart/rartlite/keyboard.json +++ b/keyboards/rart/rartlite/keyboard.json @@ -29,8 +29,7 @@ "num_lock": "F6", "on_state": 0 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_right_numpad": { "layout": [ diff --git a/keyboards/rart/rartpad/keyboard.json b/keyboards/rart/rartpad/keyboard.json index cc3f7120d2..70195fc4bf 100644 --- a/keyboards/rart/rartpad/keyboard.json +++ b/keyboards/rart/rartpad/keyboard.json @@ -57,8 +57,7 @@ "twinkle": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x4", "numpad_5x4"], "layouts": { "LAYOUT_ortho_5x4": { diff --git a/keyboards/rate/pistachio_mp/keyboard.json b/keyboards/rate/pistachio_mp/keyboard.json index 71e3244523..cea6190b84 100644 --- a/keyboards/rate/pistachio_mp/keyboard.json +++ b/keyboards/rate/pistachio_mp/keyboard.json @@ -39,8 +39,7 @@ {"pin_a": "F4", "pin_b": "F5"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/recompile_keys/choco60/rev1/keyboard.json b/keyboards/recompile_keys/choco60/rev1/keyboard.json index 4e5a8903bd..6c0b363011 100644 --- a/keyboards/recompile_keys/choco60/rev1/keyboard.json +++ b/keyboards/recompile_keys/choco60/rev1/keyboard.json @@ -19,6 +19,5 @@ "pin": "D3" } }, - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/recompile_keys/cocoa40/keyboard.json b/keyboards/recompile_keys/cocoa40/keyboard.json index 9fad026ea7..a576e54551 100644 --- a/keyboards/recompile_keys/cocoa40/keyboard.json +++ b/keyboards/recompile_keys/cocoa40/keyboard.json @@ -28,8 +28,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/recompile_keys/nomu30/rev1/keyboard.json b/keyboards/recompile_keys/nomu30/rev1/keyboard.json index 01afb9fe7d..8865eb0535 100644 --- a/keyboards/recompile_keys/nomu30/rev1/keyboard.json +++ b/keyboards/recompile_keys/nomu30/rev1/keyboard.json @@ -10,6 +10,5 @@ "rows": ["D1", "D0", "D4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/rect44/keyboard.json b/keyboards/rect44/keyboard.json index c863bec9a3..7e0202cde7 100644 --- a/keyboards/rect44/keyboard.json +++ b/keyboards/rect44/keyboard.json @@ -37,8 +37,7 @@ "rows": ["D3", "D2", "F5", "F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_all": { "layout": [ diff --git a/keyboards/redox_media/keyboard.json b/keyboards/redox_media/keyboard.json index dba5657ea2..145d9116ca 100644 --- a/keyboards/redox_media/keyboard.json +++ b/keyboards/redox_media/keyboard.json @@ -36,8 +36,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/reviung/reviung34/keyboard.json b/keyboards/reviung/reviung34/keyboard.json index 7495b7cc9d..d7e6fe422a 100755 --- a/keyboards/reviung/reviung34/keyboard.json +++ b/keyboards/reviung/reviung34/keyboard.json @@ -26,8 +26,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": [ "split_3x5_2" ], diff --git a/keyboards/reviung/reviung39/keyboard.json b/keyboards/reviung/reviung39/keyboard.json index e18c1c163e..b57100d1eb 100644 --- a/keyboards/reviung/reviung39/keyboard.json +++ b/keyboards/reviung/reviung39/keyboard.json @@ -49,8 +49,7 @@ "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_reviung39": "LAYOUT" }, diff --git a/keyboards/reviung/reviung41/keyboard.json b/keyboards/reviung/reviung41/keyboard.json index b44827c3d2..f0ad524da2 100644 --- a/keyboards/reviung/reviung41/keyboard.json +++ b/keyboards/reviung/reviung41/keyboard.json @@ -49,8 +49,7 @@ "rows": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_reviung41": "LAYOUT" }, diff --git a/keyboards/reviung/reviung5/keyboard.json b/keyboards/reviung/reviung5/keyboard.json index 7e7101c0ab..014cbb288a 100644 --- a/keyboards/reviung/reviung5/keyboard.json +++ b/keyboards/reviung/reviung5/keyboard.json @@ -53,8 +53,7 @@ {"pin_a": "D0", "pin_b": "D1"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_reviung5": "LAYOUT" }, diff --git a/keyboards/reviung/reviung53/keyboard.json b/keyboards/reviung/reviung53/keyboard.json index 15f896e7d4..0468912f82 100644 --- a/keyboards/reviung/reviung53/keyboard.json +++ b/keyboards/reviung/reviung53/keyboard.json @@ -47,8 +47,7 @@ "rows": ["D0", "D4", "C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_reviung53": "LAYOUT" }, diff --git a/keyboards/rgbkb/zen/rev1/keyboard.json b/keyboards/rgbkb/zen/rev1/keyboard.json index b35381f607..94164016bb 100644 --- a/keyboards/rgbkb/zen/rev1/keyboard.json +++ b/keyboards/rgbkb/zen/rev1/keyboard.json @@ -38,8 +38,7 @@ "ws2812": { "pin": "D1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/rgbkb/zen/rev2/keyboard.json b/keyboards/rgbkb/zen/rev2/keyboard.json index 917274f186..d34fd7afb1 100644 --- a/keyboards/rgbkb/zen/rev2/keyboard.json +++ b/keyboards/rgbkb/zen/rev2/keyboard.json @@ -56,8 +56,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/rpiguy9907/southpaw66/keyboard.json b/keyboards/rpiguy9907/southpaw66/keyboard.json index c751ee6d8e..980d217806 100644 --- a/keyboards/rpiguy9907/southpaw66/keyboard.json +++ b/keyboards/rpiguy9907/southpaw66/keyboard.json @@ -35,8 +35,7 @@ "tapping": { "term": 400 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/rura66/rev1/keyboard.json b/keyboards/rura66/rev1/keyboard.json index cb9ad6f29a..3dc41aabd4 100644 --- a/keyboards/rura66/rev1/keyboard.json +++ b/keyboards/rura66/rev1/keyboard.json @@ -55,8 +55,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ryanbaekr/rb1/keyboard.json b/keyboards/ryanbaekr/rb1/keyboard.json index a7222869e0..8b1b1a5a82 100644 --- a/keyboards/ryanbaekr/rb1/keyboard.json +++ b/keyboards/ryanbaekr/rb1/keyboard.json @@ -7,8 +7,7 @@ "pid": "0x0001", "device_version": "0.0.3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "extrakey": true, From 8525ab03de3b818dcd23d257d7a7f382d1aad35c Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:03:59 +0100 Subject: [PATCH 408/592] Fix dynamic keymap static assert (#25327) --- quantum/nvm/eeprom/nvm_dynamic_keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/nvm/eeprom/nvm_dynamic_keymap.c b/quantum/nvm/eeprom/nvm_dynamic_keymap.c index 3e315f2bcb..5ff49795b2 100644 --- a/quantum/nvm/eeprom/nvm_dynamic_keymap.c +++ b/quantum/nvm/eeprom/nvm_dynamic_keymap.c @@ -57,7 +57,7 @@ STATIC_ASSERT(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_MA // The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it, // or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has // more than the default. -STATIC_ASSERT((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); +STATIC_ASSERT((int64_t)(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (int64_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available."); #ifndef TOTAL_EEPROM_BYTE_COUNT # error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps. From f096e5a3f3af404e6f752185260f183d3ecd503e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 3 Jun 2025 23:44:46 +0100 Subject: [PATCH 409/592] Relocate remaining `process_record_quantum` keycodes (#25328) --- builddefs/common_features.mk | 2 + quantum/process_keycode/process_oneshot.c | 25 +++++++ quantum/process_keycode/process_oneshot.h | 10 +++ quantum/process_keycode/process_quantum.c | 76 +++++++++++++++++++ quantum/process_keycode/process_quantum.h | 10 +++ quantum/process_keycode/process_underglow.c | 5 ++ quantum/quantum.c | 83 ++------------------- 7 files changed, 136 insertions(+), 75 deletions(-) create mode 100644 quantum/process_keycode/process_oneshot.c create mode 100644 quantum/process_keycode/process_oneshot.h create mode 100644 quantum/process_keycode/process_quantum.c create mode 100644 quantum/process_keycode/process_quantum.h diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index ca60873bec..90231c9a96 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -29,6 +29,8 @@ QUANTUM_SRC += \ $(QUANTUM_DIR)/logging/debug.c \ $(QUANTUM_DIR)/logging/sendchar.c \ $(QUANTUM_DIR)/process_keycode/process_default_layer.c \ + $(QUANTUM_DIR)/process_keycode/process_oneshot.c \ + $(QUANTUM_DIR)/process_keycode/process_quantum.c \ include $(QUANTUM_DIR)/nvm/rules.mk diff --git a/quantum/process_keycode/process_oneshot.c b/quantum/process_keycode/process_oneshot.c new file mode 100644 index 0000000000..6c43da1011 --- /dev/null +++ b/quantum/process_keycode/process_oneshot.c @@ -0,0 +1,25 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "process_oneshot.h" +#include "action_util.h" + +bool process_oneshot(uint16_t keycode, keyrecord_t *record) { +#ifndef NO_ACTION_ONESHOT + if (record->event.pressed) { + switch (keycode) { + case QK_ONE_SHOT_TOGGLE: + oneshot_toggle(); + return false; + case QK_ONE_SHOT_ON: + oneshot_enable(); + return false; + case QK_ONE_SHOT_OFF: + oneshot_disable(); + return false; + } + } +#endif + + return true; +} diff --git a/quantum/process_keycode/process_oneshot.h b/quantum/process_keycode/process_oneshot.h new file mode 100644 index 0000000000..11445b9b38 --- /dev/null +++ b/quantum/process_keycode/process_oneshot.h @@ -0,0 +1,10 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "action.h" + +bool process_oneshot(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/process_keycode/process_quantum.c b/quantum/process_keycode/process_quantum.c new file mode 100644 index 0000000000..703e00755b --- /dev/null +++ b/quantum/process_keycode/process_quantum.c @@ -0,0 +1,76 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "process_quantum.h" +#include "quantum.h" + +#ifdef ENABLE_COMPILE_KEYCODE +/** \brief Compiles the firmware, and adds the flash command based on keyboard bootloader + */ +static void send_make_command(void) { +# ifdef NO_ACTION_ONESHOT + const uint8_t temp_mod = mod_config(get_mods()); +# else + const uint8_t temp_mod = mod_config(get_mods() | get_oneshot_mods()); + clear_oneshot_mods(); +# endif + clear_mods(); + + SEND_STRING_DELAY("qmk", TAP_CODE_DELAY); + if (temp_mod & MOD_MASK_SHIFT) { // if shift is held, flash rather than compile + SEND_STRING_DELAY(" flash ", TAP_CODE_DELAY); + } else { + SEND_STRING_DELAY(" compile ", TAP_CODE_DELAY); + } +# if defined(CONVERTER_ENABLED) + SEND_STRING_DELAY("-kb " QMK_KEYBOARD " -km " QMK_KEYMAP " -e CONVERT_TO=" CONVERTER_TARGET SS_TAP(X_ENTER), TAP_CODE_DELAY); +# else + SEND_STRING_DELAY("-kb " QMK_KEYBOARD " -km " QMK_KEYMAP SS_TAP(X_ENTER), TAP_CODE_DELAY); +# endif + if (temp_mod & MOD_MASK_SHIFT && temp_mod & MOD_MASK_CTRL) { + reset_keyboard(); + } +} +#endif + +bool process_quantum(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { +#ifndef NO_RESET + case QK_BOOTLOADER: + reset_keyboard(); + return false; + case QK_REBOOT: + soft_reset_keyboard(); + return false; +#endif +#ifndef NO_DEBUG + case QK_DEBUG_TOGGLE: + debug_enable ^= 1; + if (debug_enable) { + print("DEBUG: enabled.\n"); + } else { + print("DEBUG: disabled.\n"); + } + return false; +#endif + case QK_CLEAR_EEPROM: +#ifdef NO_RESET + eeconfig_init(); +#else + eeconfig_disable(); + soft_reset_keyboard(); +#endif + return false; +#ifdef ENABLE_COMPILE_KEYCODE + case QK_MAKE: + send_make_command(); + return false; +#endif + default: + break; + } + } + + return true; +} diff --git a/quantum/process_keycode/process_quantum.h b/quantum/process_keycode/process_quantum.h new file mode 100644 index 0000000000..5c2462be01 --- /dev/null +++ b/quantum/process_keycode/process_quantum.h @@ -0,0 +1,10 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include "action.h" + +bool process_quantum(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/process_keycode/process_underglow.c b/quantum/process_keycode/process_underglow.c index b8d8989ef3..78006ee099 100644 --- a/quantum/process_keycode/process_underglow.c +++ b/quantum/process_keycode/process_underglow.c @@ -200,6 +200,11 @@ bool process_underglow(uint16_t keycode, keyrecord_t *record) { } #endif return false; +#ifdef VELOCIKEY_ENABLE + case QK_VELOCIKEY_TOGGLE: + velocikey_toggle(); + return false; +#endif } } diff --git a/quantum/quantum.c b/quantum/quantum.c index 319f477ae7..5503c88953 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -15,6 +15,7 @@ */ #include "quantum.h" +#include "process_quantum.h" #ifdef BACKLIGHT_ENABLE # include "process_backlight.h" @@ -84,6 +85,10 @@ # include "process_layer_lock.h" #endif +#ifndef NO_ACTION_ONESHOT +# include "process_oneshot.h" +#endif + #ifdef AUDIO_ENABLE # ifndef GOODBYE_SONG # define GOODBYE_SONG SONG(GOODBYE_SOUND) @@ -438,84 +443,12 @@ bool process_record_quantum(keyrecord_t *record) { #endif #ifdef CONNECTION_ENABLE process_connection(keycode, record) && -#endif - true)) { - return false; - } - - if (record->event.pressed) { - switch (keycode) { -#ifndef NO_RESET - case QK_BOOTLOADER: - reset_keyboard(); - return false; - case QK_REBOOT: - soft_reset_keyboard(); - return false; -#endif -#ifndef NO_DEBUG - case QK_DEBUG_TOGGLE: - debug_enable ^= 1; - if (debug_enable) { - print("DEBUG: enabled.\n"); - } else { - print("DEBUG: disabled.\n"); - } - return false; -#endif - case QK_CLEAR_EEPROM: -#ifdef NO_RESET - eeconfig_init(); -#else - eeconfig_disable(); - soft_reset_keyboard(); -#endif - return false; -#ifdef VELOCIKEY_ENABLE - case QK_VELOCIKEY_TOGGLE: - velocikey_toggle(); - return false; #endif #ifndef NO_ACTION_ONESHOT - case QK_ONE_SHOT_TOGGLE: - oneshot_toggle(); - return false; - case QK_ONE_SHOT_ON: - oneshot_enable(); - return false; - case QK_ONE_SHOT_OFF: - oneshot_disable(); - return false; + process_oneshot(keycode, record) && #endif -#ifdef ENABLE_COMPILE_KEYCODE - case QK_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader - { -# ifdef NO_ACTION_ONESHOT - const uint8_t temp_mod = mod_config(get_mods()); -# else - const uint8_t temp_mod = mod_config(get_mods() | get_oneshot_mods()); - clear_oneshot_mods(); -# endif - clear_mods(); - - SEND_STRING_DELAY("qmk", TAP_CODE_DELAY); - if (temp_mod & MOD_MASK_SHIFT) { // if shift is held, flash rather than compile - SEND_STRING_DELAY(" flash ", TAP_CODE_DELAY); - } else { - SEND_STRING_DELAY(" compile ", TAP_CODE_DELAY); - } -# if defined(CONVERTER_ENABLED) - SEND_STRING_DELAY("-kb " QMK_KEYBOARD " -km " QMK_KEYMAP " -e CONVERT_TO=" CONVERTER_TARGET SS_TAP(X_ENTER), TAP_CODE_DELAY); -# else - SEND_STRING_DELAY("-kb " QMK_KEYBOARD " -km " QMK_KEYMAP SS_TAP(X_ENTER), TAP_CODE_DELAY); -# endif - if (temp_mod & MOD_MASK_SHIFT && temp_mod & MOD_MASK_CTRL) { - reset_keyboard(); - } - return false; - } -#endif - } + process_quantum(keycode, record))) { + return false; } return process_action_kb(record); From 7b36727ed17b0c09efd7cf693d49e51af04eca54 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 4 Jun 2025 13:37:40 +0100 Subject: [PATCH 410/592] Remove `process_action_kb` callback (#25331) --- quantum/quantum.c | 13 +++++-------- quantum/quantum.h | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index 5503c88953..cc20c7db2b 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -179,10 +179,6 @@ __attribute__((weak)) bool pre_process_record_user(uint16_t keycode, keyrecord_t return true; } -__attribute__((weak)) bool process_action_kb(keyrecord_t *record) { - return true; -} - __attribute__((weak)) bool process_record_modules(uint16_t keycode, keyrecord_t *record) { return true; } @@ -297,9 +293,10 @@ void post_process_record_quantum(keyrecord_t *record) { post_process_record_kb(keycode, record); } -/* Core keycode function, hands off handling to other functions, - then processes internal quantum keycodes, and then processes - ACTIONs. */ +/** \brief Core keycode function + * + * Hands off handling to other quantum/process_keycode/ functions + */ bool process_record_quantum(keyrecord_t *record) { uint16_t keycode = get_record_keycode(record, true); @@ -451,7 +448,7 @@ bool process_record_quantum(keyrecord_t *record) { return false; } - return process_action_kb(record); + return true; } void set_single_default_layer(uint8_t default_layer) { diff --git a/quantum/quantum.h b/quantum/quantum.h index 3a994e9a03..0036cd784b 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -263,7 +263,6 @@ uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache); bool pre_process_record_quantum(keyrecord_t *record); bool pre_process_record_kb(uint16_t keycode, keyrecord_t *record); bool pre_process_record_user(uint16_t keycode, keyrecord_t *record); -bool process_action_kb(keyrecord_t *record); bool process_record_kb(uint16_t keycode, keyrecord_t *record); bool process_record_user(uint16_t keycode, keyrecord_t *record); void post_process_record_kb(uint16_t keycode, keyrecord_t *record); From fad44ae10cc3a6918bc38104addaaabae5473394 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 4 Jun 2025 13:41:37 +0100 Subject: [PATCH 411/592] [Docs] Fix PS/2 Driver headers (#25332) --- docs/features/ps2_mouse.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/features/ps2_mouse.md b/docs/features/ps2_mouse.md index 52443c3ce2..6ef7e46768 100644 --- a/docs/features/ps2_mouse.md +++ b/docs/features/ps2_mouse.md @@ -23,8 +23,11 @@ MODULE 5+ --------+--+--------- PWR CONTROLLER CLK ------+------------ PIN ``` +## Driver Configuration {#driver-configuration} -## Busywait Version {#busywait-version} +Driver selection can be configured in `rules.mk` as `PS2_DRIVER`, or in `info.json` as `ps2.driver`. Valid values are `busywait` (default), `interrupt`, `usart`, or `vendor`. See below for information on individual drivers. + +### Busywait Driver {#busywait-driver} Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible. @@ -45,7 +48,7 @@ In your keyboard config.h: #endif ``` -### Interrupt Version (AVR/ATMega32u4) {#interrupt-version-avr} +### Interrupt Driver (AVR/ATMega32u4) {#interrupt-driver-avr} The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data. @@ -78,7 +81,7 @@ In your keyboard config.h: #endif ``` -### Interrupt Version (ARM chibios) {#interrupt-version-chibios} +### Interrupt Driver (ARM chibios) {#interrupt-driver-chibios} Pretty much any two pins can be used for the (software) interrupt variant on ARM cores. The example below uses A8 for clock, and A9 for data. @@ -107,7 +110,7 @@ And in the ChibiOS specific `halconf.h`: #include_next ``` -### USART Version {#usart-version} +### USART Driver {#usart-driver} To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version. @@ -159,7 +162,7 @@ In your keyboard config.h: #endif ``` -### RP2040 PIO Version {#rp2040-pio-version} +### RP2040 PIO Driver {#rp2040-pio-driver} The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU. From 2e3664d2c005a36f06c567aa55702ac950866598 Mon Sep 17 00:00:00 2001 From: obosob Date: Wed, 4 Jun 2025 13:42:57 +0100 Subject: [PATCH 412/592] Add CrossDIY to license_violations.md (#25324) Co-authored-by: jack --- docs/license_violations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/license_violations.md b/docs/license_violations.md index 0bc62102ed..da805f5f7e 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -26,6 +26,7 @@ If you own a board from one of the following vendors already, consider asking th | Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. | | CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | | ColorReco | Selling tri-mode boards based on QMK without sources. | +| CrossDIY | Selling wired boards based on QMK without sources. | | Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | | Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | | Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. | From 0d477bf5703740c691b77f6edfb7eed5fe65d379 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 6 Jun 2025 01:29:53 +1000 Subject: [PATCH 413/592] More Yunzii notes regarding refusal to provide sources. (#25335) --- docs/license_violations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/license_violations.md b/docs/license_violations.md index da805f5f7e..0b152f6960 100644 --- a/docs/license_violations.md +++ b/docs/license_violations.md @@ -26,7 +26,7 @@ If you own a board from one of the following vendors already, consider asking th | Chosfox | Selling L75 wired/wireless boards based on QMK without sources, just `via.json` provided. Raised on discord over multiple weeks without response. | | CIDOO | Selling wired boards based on QMK without sources, just `via.json` provided. | | ColorReco | Selling tri-mode boards based on QMK without sources. | -| CrossDIY | Selling wired boards based on QMK without sources. | +| CrossDIY | Selling wired boards based on QMK without sources. | | Darmoshark | Selling wired boards based on QMK without sources, just `via.json` provided. | | Epomaker | Lots of historical keyboards with `via.json` but no corresponding sources. Wireless code for a small handful provided, pending core cleanup for QMK upstreaming. Most other boards have source nowhere to be seen. | | Ergokbd (IFKB) | At least their crkbd clone ships with QMK+Vial, seemingly refuses to disclose sources despite multiple customers requesting them. | @@ -51,7 +51,7 @@ If you own a board from one of the following vendors already, consider asking th | Womier | Selling tri-mode boards based on QMK without sources, attempted upstreaming crippled firmware without wireless. | | Wuque Studio | Selling wired and tri-mode boards based on QMK without sources, just `via.json` provided. | | XVX | Ambiguity on PRs -- marketing says wireless, PR author said wired-only. Seemingly intentionally deceptive. | -| Yunzii | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | +| Yunzii | Selling tri-mode boards based on QMK without sources, just `via.json` provided. Refuses to release sources due to proprietary wireless driver, in direct violation of the GPL. | | Zuoya | Selling tri-mode boards based on QMK without sources, just `via.json` provided. | ::: danger Violations From 824ad46e5d83748ff1276df00a39f8b328f93a05 Mon Sep 17 00:00:00 2001 From: bytetinkerer Date: Fri, 6 Jun 2025 01:02:38 +0200 Subject: [PATCH 414/592] add kinesis/kint32 (#25013) Co-authored-by: Drashna Jaelre --- keyboards/kinesis/kint32/chconf.h | 28 ++++++ keyboards/kinesis/kint32/config.h | 19 ++++ keyboards/kinesis/kint32/keyboard.json | 125 +++++++++++++++++++++++++ keyboards/kinesis/kint32/kint32.c | 27 ++++++ keyboards/kinesis/kint32/mcuconf.h | 51 ++++++++++ keyboards/kinesis/kint32/readme.md | 3 + 6 files changed, 253 insertions(+) create mode 100644 keyboards/kinesis/kint32/chconf.h create mode 100644 keyboards/kinesis/kint32/config.h create mode 100644 keyboards/kinesis/kint32/keyboard.json create mode 100644 keyboards/kinesis/kint32/kint32.c create mode 100644 keyboards/kinesis/kint32/mcuconf.h create mode 100644 keyboards/kinesis/kint32/readme.md diff --git a/keyboards/kinesis/kint32/chconf.h b/keyboards/kinesis/kint32/chconf.h new file mode 100644 index 0000000000..5c0b6e8580 --- /dev/null +++ b/keyboards/kinesis/kint32/chconf.h @@ -0,0 +1,28 @@ +/* Copyright 2020 QMK + * + * 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 . + */ + +/* + * This file was auto-generated by: + * `qmk chibios-confmigrate -i keyboards/kinesis/kint32/chconf.h -r platforms/chibios/common/configs/chconf.h` + */ + +#pragma once + +#define CH_CFG_ST_TIMEDELTA 0 + +#define CH_CFG_TIME_QUANTUM 20 + +#include_next diff --git a/keyboards/kinesis/kint32/config.h b/keyboards/kinesis/kint32/config.h new file mode 100644 index 0000000000..a794b4d8b0 --- /dev/null +++ b/keyboards/kinesis/kint32/config.h @@ -0,0 +1,19 @@ +/* Copyright 2020 QMK + * + * 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 EEPROM_SIZE 2048 diff --git a/keyboards/kinesis/kint32/keyboard.json b/keyboards/kinesis/kint32/keyboard.json new file mode 100644 index 0000000000..4f403c2ffa --- /dev/null +++ b/keyboards/kinesis/kint32/keyboard.json @@ -0,0 +1,125 @@ +{ + "manufacturer": "https://github.com/stapelberg", + "keyboard_name": "kinT (kint32)", + "bootloader": "halfkay", + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 20, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "indicators": { + "caps_lock": "C7", + "on_state": 0 + }, + "matrix_pins": { + "cols": ["B3", "D1", "C0", "D5", "C1", "B2", "D4"], + "rows": ["D3", "C3", "C4", "C6", "D2", "B0", "D7", "A12", "A13", "B17", "B16", "D0", "B1", "C2", "D6"] + }, + "processor": "MK20DX256", + "usb": { + "device_version": "0.0.1", + "max_power": 100, + "pid": "0x345C", + "vid": "0x1209" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [12, 0], "x": 0, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 0], "x": 0.7, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 0], "x": 1.39, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [12, 1], "x": 2.09, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 1], "x": 2.78, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 1], "x": 3.48, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [12, 2], "x": 4.17, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 2], "x": 4.87, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 2], "x": 5.56, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [12, 3], "x": 9.25, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 3], "x": 9.95, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 3], "x": 10.64, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [12, 4], "x": 11.34, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 4], "x": 12.03, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 4], "x": 12.73, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [12, 5], "x": 13.42, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [14, 5], "x": 14.12, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [13, 5], "x": 14.81, "y": 0, "w": 0.69, "h": 0.85}, + {"matrix": [0, 0], "x": 0, "y": 1.25, "w": 1.25}, + {"matrix": [1, 0], "x": 1.25, "y": 1.25}, + {"matrix": [2, 0], "x": 2.25, "y": 1}, + {"matrix": [3, 0], "x": 3.25, "y": 1}, + {"matrix": [4, 0], "x": 4.25, "y": 1}, + {"matrix": [5, 0], "x": 5.25, "y": 1}, + {"matrix": [6, 0], "x": 9.25, "y": 1}, + {"matrix": [7, 0], "x": 10.25, "y": 1}, + {"matrix": [8, 0], "x": 11.25, "y": 1}, + {"matrix": [9, 0], "x": 12.25, "y": 1}, + {"matrix": [10, 0], "x": 13.25, "y": 1.25}, + {"matrix": [11, 0], "x": 14.25, "y": 1.25, "w": 1.25}, + {"matrix": [0, 1], "x": 0, "y": 2.25, "w": 1.25}, + {"matrix": [1, 1], "x": 1.25, "y": 2.25}, + {"matrix": [2, 1], "x": 2.25, "y": 2}, + {"matrix": [3, 1], "x": 3.25, "y": 2}, + {"matrix": [4, 1], "x": 4.25, "y": 2}, + {"matrix": [5, 1], "x": 5.25, "y": 2}, + {"matrix": [6, 1], "x": 9.25, "y": 2}, + {"matrix": [7, 1], "x": 10.25, "y": 2}, + {"matrix": [8, 1], "x": 11.25, "y": 2}, + {"matrix": [9, 1], "x": 12.25, "y": 2}, + {"matrix": [10, 1], "x": 13.25, "y": 2.25}, + {"matrix": [11, 1], "x": 14.25, "y": 2.25, "w": 1.25}, + {"matrix": [0, 2], "x": 0, "y": 3.25, "w": 1.25}, + {"matrix": [1, 2], "x": 1.25, "y": 3.25}, + {"matrix": [2, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 2], "x": 3.25, "y": 3}, + {"matrix": [4, 2], "x": 4.25, "y": 3}, + {"matrix": [5, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 2], "x": 9.25, "y": 3}, + {"matrix": [7, 2], "x": 10.25, "y": 3}, + {"matrix": [8, 2], "x": 11.25, "y": 3}, + {"matrix": [9, 2], "x": 12.25, "y": 3}, + {"matrix": [10, 2], "x": 13.25, "y": 3.25}, + {"matrix": [11, 2], "x": 14.25, "y": 3.25, "w": 1.25}, + {"matrix": [0, 3], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [1, 3], "x": 1.25, "y": 4.25}, + {"matrix": [2, 3], "x": 2.25, "y": 4}, + {"matrix": [3, 3], "x": 3.25, "y": 4}, + {"matrix": [4, 3], "x": 4.25, "y": 4}, + {"matrix": [5, 3], "x": 5.25, "y": 4}, + {"matrix": [6, 3], "x": 9.25, "y": 4}, + {"matrix": [7, 3], "x": 10.25, "y": 4}, + {"matrix": [8, 3], "x": 11.25, "y": 4}, + {"matrix": [9, 3], "x": 12.25, "y": 4}, + {"matrix": [10, 3], "x": 13.25, "y": 4.25}, + {"matrix": [11, 3], "x": 14.25, "y": 4.25, "w": 1.25}, + {"matrix": [1, 4], "x": 1.25, "y": 5.25}, + {"matrix": [2, 4], "x": 2.25, "y": 5}, + {"matrix": [3, 4], "x": 3.25, "y": 5}, + {"matrix": [5, 4], "x": 4.25, "y": 5}, + {"matrix": [6, 4], "x": 10.25, "y": 5}, + {"matrix": [8, 4], "x": 11.25, "y": 5}, + {"matrix": [9, 4], "x": 12.25, "y": 5}, + {"matrix": [10, 4], "x": 13.25, "y": 5.25}, + {"matrix": [5, 6], "x": 5.25, "y": 6}, + {"matrix": [5, 5], "x": 6.25, "y": 6}, + {"matrix": [9, 6], "x": 8.25, "y": 6}, + {"matrix": [8, 5], "x": 9.25, "y": 6}, + {"matrix": [3, 5], "x": 6.25, "y": 7}, + {"matrix": [8, 6], "x": 8.25, "y": 7}, + {"matrix": [3, 6], "x": 4.25, "y": 7, "h": 2}, + {"matrix": [4, 6], "x": 5.25, "y": 7, "h": 2}, + {"matrix": [2, 5], "x": 6.25, "y": 8}, + {"matrix": [6, 6], "x": 8.25, "y": 8}, + {"matrix": [7, 5], "x": 9.25, "y": 7, "h": 2}, + {"matrix": [6, 5], "x": 10.25, "y": 7, "h": 2} + ] + } + } +} diff --git a/keyboards/kinesis/kint32/kint32.c b/keyboards/kinesis/kint32/kint32.c new file mode 100644 index 0000000000..dd4ccbca3f --- /dev/null +++ b/keyboards/kinesis/kint32/kint32.c @@ -0,0 +1,27 @@ +/* Copyright 2020 QMK + * + * 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" + +#define LED_POWER C5 + +void keyboard_pre_init_kb(void) { + // Turn on the Teensy 3.2 Power LED: + gpio_set_pin_output(LED_POWER); + gpio_write_pin_high(LED_POWER); + + keyboard_pre_init_user(); +} diff --git a/keyboards/kinesis/kint32/mcuconf.h b/keyboards/kinesis/kint32/mcuconf.h new file mode 100644 index 0000000000..327f5c9aa3 --- /dev/null +++ b/keyboards/kinesis/kint32/mcuconf.h @@ -0,0 +1,51 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +#define K20x_MCUCONF + +/* + * HAL driver system settings. + */ +/* PEE mode - 48MHz system clock driven by (16 MHz) external crystal. */ +#define KINETIS_MCG_MODE KINETIS_MCG_MODE_PEE +#define KINETIS_PLLCLK_FREQUENCY 96000000UL +#define KINETIS_SYSCLK_FREQUENCY 48000000UL + +/* + * SERIAL driver system settings. + */ +#define KINETIS_SERIAL_USE_UART0 TRUE + +/* + * USB driver settings + */ +#define KINETIS_USB_USE_USB0 TRUE + +/* Need to redefine this, since the default (configured for K20x) might not apply + * 2 for Teensy LC + * 5 for Teensy 3.x */ +#define KINETIS_USB_USB0_IRQ_PRIORITY 5 + +/* + * I2C driver settings + */ +#define KINETIS_I2C_USE_I2C0 TRUE +#define KINETIS_I2C_I2C0_PRIORITY 4 + +#endif /* _MCUCONF_H_ */ diff --git a/keyboards/kinesis/kint32/readme.md b/keyboards/kinesis/kint32/readme.md new file mode 100644 index 0000000000..fe85e3e1f4 --- /dev/null +++ b/keyboards/kinesis/kint32/readme.md @@ -0,0 +1,3 @@ +# kinesis_kint32 keyboard firmware + +Please see https://github.com/kinx-project/kint for details. From e8e3c7addb836c10e66b29f44ef4e9764225570a Mon Sep 17 00:00:00 2001 From: spacehangover <51838046+spacehangover@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:31:08 -0300 Subject: [PATCH 415/592] Added Encoder support for Soyuz (#25279) --- keyboards/handwired/wwa/soyuz/keyboard.json | 10 +++++++++- keyboards/handwired/wwa/soyuz/keymaps/default/keymap.c | 10 ++++++++-- keyboards/handwired/wwa/soyuz/keymaps/default/rules.mk | 1 + keyboards/handwired/wwa/soyuz/readme.md | 2 +- 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 keyboards/handwired/wwa/soyuz/keymaps/default/rules.mk diff --git a/keyboards/handwired/wwa/soyuz/keyboard.json b/keyboards/handwired/wwa/soyuz/keyboard.json index 4b3a015a35..b922af10a2 100644 --- a/keyboards/handwired/wwa/soyuz/keyboard.json +++ b/keyboards/handwired/wwa/soyuz/keyboard.json @@ -8,7 +8,8 @@ "bootmagic": true, "extrakey": true, "mousekey": true, - "nkro": true + "nkro": true, + "encoder" : true }, "matrix_pins": { "cols": ["GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6"], @@ -20,6 +21,13 @@ "pid": "0x0004", "vid": "0x5757" }, + "encoder": { + "rotary": [ + {"pin_a": "GP16", "pin_b": "GP17"}, + {"pin_a": "GP18", "pin_b": "GP19"}, + {"pin_a": "GP20", "pin_b": "GP21"} + ] + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/handwired/wwa/soyuz/keymaps/default/keymap.c b/keyboards/handwired/wwa/soyuz/keymaps/default/keymap.c index af0eb592dc..c1d75ffc54 100644 --- a/keyboards/handwired/wwa/soyuz/keymaps/default/keymap.c +++ b/keyboards/handwired/wwa/soyuz/keymaps/default/keymap.c @@ -3,11 +3,17 @@ #include QMK_KEYBOARD_H - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24 ) -}; \ No newline at end of file +}; + + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, +}; +#endif diff --git a/keyboards/handwired/wwa/soyuz/keymaps/default/rules.mk b/keyboards/handwired/wwa/soyuz/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/handwired/wwa/soyuz/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/handwired/wwa/soyuz/readme.md b/keyboards/handwired/wwa/soyuz/readme.md index 69f8ef9d76..01a3b60dfe 100644 --- a/keyboards/handwired/wwa/soyuz/readme.md +++ b/keyboards/handwired/wwa/soyuz/readme.md @@ -2,7 +2,7 @@ ![soyuz](https://i.imgur.com/KwwORGSh.jpeg) -21 Key and 3 MIDI Potentiometers Macro Keyboard +21 Key, 3 Encoder * Keyboard Maintainer: [spacehangover](https://github.com/spacehangover) * Hardware Supported: RP2040 Handwired From b4cabc3cf7311c76930788fdf5b43645e191a7e9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 7 Jun 2025 01:31:42 +0100 Subject: [PATCH 416/592] Configure boards to use development_board - NO (#25338) --- keyboards/nacly/sodium42/keyboard.json | 3 +-- keyboards/nacly/sodium50/keyboard.json | 3 +-- keyboards/nacly/sodium62/keyboard.json | 3 +-- keyboards/nacly/splitreus62/keyboard.json | 3 +-- keyboards/nacly/ua62/keyboard.json | 3 +-- keyboards/newgame40/keyboard.json | 3 +-- keyboards/nightly_boards/n9/keyboard.json | 3 +-- keyboards/nightly_boards/ph_arisu/keyboard.json | 3 +-- keyboards/np12/keyboard.json | 3 +-- keyboards/numatreus/keyboard.json | 3 +-- keyboards/obosob/arch_36/keyboard.json | 3 +-- keyboards/obosob/steal_this_keyboard/keyboard.json | 3 +-- keyboards/ocean/addon/keyboard.json | 3 +-- keyboards/ocean/gin_v2/keyboard.json | 3 +-- keyboards/ocean/slamz/keyboard.json | 3 +-- keyboards/ocean/stealth/keyboard.json | 3 +-- keyboards/ocean/sus/keyboard.json | 3 +-- keyboards/ocean/wang_ergo/keyboard.json | 3 +-- keyboards/ocean/wang_v2/keyboard.json | 3 +-- keyboards/ocean/yuri/keyboard.json | 3 +-- keyboards/om60/keyboard.json | 3 +-- keyboards/omkbd/ergodash/info.json | 3 +-- keyboards/omkbd/runner3680/info.json | 3 +-- keyboards/orthodox/rev1/keyboard.json | 3 +-- keyboards/orthodox/rev3/keyboard.json | 3 +-- 25 files changed, 25 insertions(+), 50 deletions(-) diff --git a/keyboards/nacly/sodium42/keyboard.json b/keyboards/nacly/sodium42/keyboard.json index a1d7b65ab3..97b6a837c5 100644 --- a/keyboards/nacly/sodium42/keyboard.json +++ b/keyboards/nacly/sodium42/keyboard.json @@ -35,8 +35,7 @@ "pin": "D3" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/nacly/sodium50/keyboard.json b/keyboards/nacly/sodium50/keyboard.json index e41495755f..dd1604c480 100644 --- a/keyboards/nacly/sodium50/keyboard.json +++ b/keyboards/nacly/sodium50/keyboard.json @@ -35,8 +35,7 @@ "pin": "D3" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/nacly/sodium62/keyboard.json b/keyboards/nacly/sodium62/keyboard.json index ab16bf45fa..64cb488159 100644 --- a/keyboards/nacly/sodium62/keyboard.json +++ b/keyboards/nacly/sodium62/keyboard.json @@ -36,8 +36,7 @@ "pin": "D3" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/nacly/splitreus62/keyboard.json b/keyboards/nacly/splitreus62/keyboard.json index d356578690..567cb6d6db 100644 --- a/keyboards/nacly/splitreus62/keyboard.json +++ b/keyboards/nacly/splitreus62/keyboard.json @@ -42,8 +42,7 @@ "ws2812": { "pin": "B1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/nacly/ua62/keyboard.json b/keyboards/nacly/ua62/keyboard.json index 0bf01308f5..85fbbd431c 100644 --- a/keyboards/nacly/ua62/keyboard.json +++ b/keyboards/nacly/ua62/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D3", "D2", "D1", "D0", "D4"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/newgame40/keyboard.json b/keyboards/newgame40/keyboard.json index ad59f2bcd0..62c567cb40 100644 --- a/keyboards/newgame40/keyboard.json +++ b/keyboards/newgame40/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "F6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x10"], "layouts": { "LAYOUT_ortho_4x10": { diff --git a/keyboards/nightly_boards/n9/keyboard.json b/keyboards/nightly_boards/n9/keyboard.json index e3d8a3be84..f99ff31258 100644 --- a/keyboards/nightly_boards/n9/keyboard.json +++ b/keyboards/nightly_boards/n9/keyboard.json @@ -46,8 +46,7 @@ "ws2812": { "pin": "F5" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/nightly_boards/ph_arisu/keyboard.json b/keyboards/nightly_boards/ph_arisu/keyboard.json index afcbdd905a..7d64536c1a 100644 --- a/keyboards/nightly_boards/ph_arisu/keyboard.json +++ b/keyboards/nightly_boards/ph_arisu/keyboard.json @@ -25,8 +25,7 @@ "rows": ["D3", "D2", "D1", "D0", "D4", "C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/np12/keyboard.json b/keyboards/np12/keyboard.json index 435f2db3b7..d12307f117 100644 --- a/keyboards/np12/keyboard.json +++ b/keyboards/np12/keyboard.json @@ -25,8 +25,7 @@ {"pin_a": "F4", "pin_b": "F5"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/numatreus/keyboard.json b/keyboards/numatreus/keyboard.json index 3441a769e1..5a9df0f429 100644 --- a/keyboards/numatreus/keyboard.json +++ b/keyboards/numatreus/keyboard.json @@ -33,8 +33,7 @@ "led_count": 6, "max_brightness": 200 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/obosob/arch_36/keyboard.json b/keyboards/obosob/arch_36/keyboard.json index 791c08d3f1..661d335daa 100644 --- a/keyboards/obosob/arch_36/keyboard.json +++ b/keyboards/obosob/arch_36/keyboard.json @@ -34,8 +34,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["split_3x5_3"], "layouts": { "LAYOUT_split_3x5_3": { diff --git a/keyboards/obosob/steal_this_keyboard/keyboard.json b/keyboards/obosob/steal_this_keyboard/keyboard.json index 4865f54283..60abd1ecf9 100644 --- a/keyboards/obosob/steal_this_keyboard/keyboard.json +++ b/keyboards/obosob/steal_this_keyboard/keyboard.json @@ -8,8 +8,7 @@ "pid": "0x50AD", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "extrakey": true, diff --git a/keyboards/ocean/addon/keyboard.json b/keyboards/ocean/addon/keyboard.json index 0793a7082a..671c04cba0 100644 --- a/keyboards/ocean/addon/keyboard.json +++ b/keyboards/ocean/addon/keyboard.json @@ -19,8 +19,7 @@ "rows": ["C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ocean/gin_v2/keyboard.json b/keyboards/ocean/gin_v2/keyboard.json index d20aa5916f..08a7f29b8c 100644 --- a/keyboards/ocean/gin_v2/keyboard.json +++ b/keyboards/ocean/gin_v2/keyboard.json @@ -18,8 +18,7 @@ "rows": ["D1", "D0", "D4", "C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ocean/slamz/keyboard.json b/keyboards/ocean/slamz/keyboard.json index cf3ed54426..65bc91eebe 100644 --- a/keyboards/ocean/slamz/keyboard.json +++ b/keyboards/ocean/slamz/keyboard.json @@ -18,8 +18,7 @@ "rows": ["D2", "D1", "D0", "D4"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ocean/stealth/keyboard.json b/keyboards/ocean/stealth/keyboard.json index a15d2fffac..0f0070de63 100644 --- a/keyboards/ocean/stealth/keyboard.json +++ b/keyboards/ocean/stealth/keyboard.json @@ -18,8 +18,7 @@ "rows": ["D1"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ocean/sus/keyboard.json b/keyboards/ocean/sus/keyboard.json index 3ac426f6aa..ebbb247035 100644 --- a/keyboards/ocean/sus/keyboard.json +++ b/keyboards/ocean/sus/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B5", "B4", "E6", "D7"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_4x3": { "layout": [ diff --git a/keyboards/ocean/wang_ergo/keyboard.json b/keyboards/ocean/wang_ergo/keyboard.json index d552028bc6..e32f21d802 100644 --- a/keyboards/ocean/wang_ergo/keyboard.json +++ b/keyboards/ocean/wang_ergo/keyboard.json @@ -18,8 +18,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_all" }, diff --git a/keyboards/ocean/wang_v2/keyboard.json b/keyboards/ocean/wang_v2/keyboard.json index 79ef6b3697..e64345db2f 100644 --- a/keyboards/ocean/wang_v2/keyboard.json +++ b/keyboards/ocean/wang_v2/keyboard.json @@ -18,8 +18,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ocean/yuri/keyboard.json b/keyboards/ocean/yuri/keyboard.json index aeb4cd895d..fee89b9de7 100644 --- a/keyboards/ocean/yuri/keyboard.json +++ b/keyboards/ocean/yuri/keyboard.json @@ -19,8 +19,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/om60/keyboard.json b/keyboards/om60/keyboard.json index 08eb898b01..d91f28f8af 100644 --- a/keyboards/om60/keyboard.json +++ b/keyboards/om60/keyboard.json @@ -49,8 +49,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/omkbd/ergodash/info.json b/keyboards/omkbd/ergodash/info.json index 306a3970bb..18138dd692 100644 --- a/keyboards/omkbd/ergodash/info.json +++ b/keyboards/omkbd/ergodash/info.json @@ -1,6 +1,5 @@ { - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "split": { "enabled": true } diff --git a/keyboards/omkbd/runner3680/info.json b/keyboards/omkbd/runner3680/info.json index c626b2e3b4..e06cb1243c 100644 --- a/keyboards/omkbd/runner3680/info.json +++ b/keyboards/omkbd/runner3680/info.json @@ -1,6 +1,5 @@ { - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "extrakey": false, diff --git a/keyboards/orthodox/rev1/keyboard.json b/keyboards/orthodox/rev1/keyboard.json index 0444009f2b..bd08fc19d2 100644 --- a/keyboards/orthodox/rev1/keyboard.json +++ b/keyboards/orthodox/rev1/keyboard.json @@ -17,8 +17,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/orthodox/rev3/keyboard.json b/keyboards/orthodox/rev3/keyboard.json index 61d8281f55..411df12f98 100644 --- a/keyboards/orthodox/rev3/keyboard.json +++ b/keyboards/orthodox/rev3/keyboard.json @@ -17,8 +17,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ From 1646000c9b4da8e73cf4c7d1d160cefaf8ab7cb0 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 7 Jun 2025 14:08:56 +1000 Subject: [PATCH 417/592] [tzarc/djinn] Include community modules in RGB naming. (#25343) --- keyboards/1upkeyboards/pi50/pi50.c | 6 ++++++ keyboards/tzarc/djinn/graphics/theme_djinn_default.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/keyboards/1upkeyboards/pi50/pi50.c b/keyboards/1upkeyboards/pi50/pi50.c index ea73875970..cc0cdbe333 100644 --- a/keyboards/1upkeyboards/pi50/pi50.c +++ b/keyboards/1upkeyboards/pi50/pi50.c @@ -33,6 +33,9 @@ enum { #ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" #endif +#if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") +# include "rgb_matrix_community_modules.inc" +#endif }; #define RGB_MATRIX_EFFECT(x) \ @@ -49,6 +52,9 @@ const char* rgb_matrix_name(uint8_t effect) { #endif #ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" +#endif +#if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") +# include "rgb_matrix_community_modules.inc" #endif default: return "UNKNOWN"; diff --git a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c index c651cd660d..739a0817b0 100644 --- a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c +++ b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c @@ -49,6 +49,9 @@ enum { # ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" # endif +# if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") +# include "rgb_matrix_community_modules.inc" +# endif # undef RGB_MATRIX_EFFECT }; @@ -66,6 +69,9 @@ const char *rgb_matrix_name(uint8_t effect) { # ifdef RGB_MATRIX_CUSTOM_USER # include "rgb_matrix_user.inc" # endif +# if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") +# include "rgb_matrix_community_modules.inc" +# endif # undef RGB_MATRIX_EFFECT default: return "UNKNOWN"; From 7808f8f56b0734ea54d367ff9e6abb4b52d1d85a Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 7 Jun 2025 22:56:58 +1000 Subject: [PATCH 418/592] Add `{rgb|led}_matrix_get_mode_name()`. (#25344) --- docs/features/led_matrix.md | 21 +++++++ docs/features/rgb_matrix.md | 21 +++++++ keyboards/1upkeyboards/pi50/config.h | 1 + keyboards/1upkeyboards/pi50/pi50.c | 45 +-------------- keyboards/tzarc/djinn/config.h | 2 + .../djinn/graphics/theme_djinn_default.c | 51 +---------------- quantum/led_matrix/led_matrix.c | 55 +++++++++++++++++- quantum/led_matrix/led_matrix.h | 4 ++ quantum/rgb_matrix/rgb_matrix.c | 56 ++++++++++++++++++- quantum/rgb_matrix/rgb_matrix.h | 4 ++ 10 files changed, 164 insertions(+), 96 deletions(-) diff --git a/docs/features/led_matrix.md b/docs/features/led_matrix.md index 113b13f03b..28d24bc400 100644 --- a/docs/features/led_matrix.md +++ b/docs/features/led_matrix.md @@ -214,9 +214,30 @@ led_matrix_mode(LED_MATRIX_CUSTOM_my_cool_effect); For inspiration and examples, check out the built-in effects under `quantum/led_matrix/animations/`. +## Naming + +If you wish to be able to use the name of an effect in your code -- say for a display indicator -- then you can enable the function `led_matrix_get_mode_name` in the following manner: + +In your keymap's `config.h`: +```c +#define LED_MATRIX_MODE_NAME_ENABLE +``` + +In your `keymap.c` +```c +const char* effect_name = led_matrix_get_mode_name(led_matrix_get_mode()); +// do something with `effect_name`, like `oled_write_ln(effect_name, false);` +``` + +::: info +`led_matrix_get_mode_name()` is not enabled by default as it increases the amount of flash memory used by the firmware based on the number of effects enabled. +::: + + ## Additional `config.h` Options {#additional-configh-options} ```c +#define LED_MATRIX_MODE_NAME_ENABLE // enables led_matrix_get_mode_name() #define LED_MATRIX_KEYRELEASES // reactive effects respond to keyreleases (instead of keypresses) #define LED_MATRIX_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off #define LED_MATRIX_SLEEP // turn off effects when suspended diff --git a/docs/features/rgb_matrix.md b/docs/features/rgb_matrix.md index ca50fc5257..8f50b28c03 100644 --- a/docs/features/rgb_matrix.md +++ b/docs/features/rgb_matrix.md @@ -365,9 +365,30 @@ These are shorthands to popular colors. The `RGB` ones can be passed to the `set These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/color.h). Feel free to add to this list! +## Naming + +If you wish to be able to use the name of an effect in your code -- say for a display indicator -- then you can enable the function `rgb_matrix_get_mode_name` in the following manner: + +In your keymap's `config.h`: +```c +#define RGB_MATRIX_MODE_NAME_ENABLE +``` + +In your `keymap.c` +```c +const char* effect_name = rgb_matrix_get_mode_name(rgb_matrix_get_mode()); +// do something with `effect_name`, like `oled_write_ln(effect_name, false);` +``` + +::: info +`rgb_matrix_get_mode_name()` is not enabled by default as it increases the amount of flash memory used by the firmware based on the number of effects enabled. +::: + + ## Additional `config.h` Options {#additional-configh-options} ```c +#define RGB_MATRIX_MODE_NAME_ENABLE // enables rgb_matrix_get_mode_name() #define RGB_MATRIX_KEYRELEASES // reactive effects respond to keyreleases (instead of keypresses) #define RGB_MATRIX_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off #define RGB_MATRIX_SLEEP // turn off effects when suspended diff --git a/keyboards/1upkeyboards/pi50/config.h b/keyboards/1upkeyboards/pi50/config.h index e20a9854a5..8d40ecdaec 100644 --- a/keyboards/1upkeyboards/pi50/config.h +++ b/keyboards/1upkeyboards/pi50/config.h @@ -8,3 +8,4 @@ #define I2C_DRIVER I2CD1 #define OLED_BRIGHTNESS 128 #define OLED_FONT_H "keyboards/1upkeyboards/pi50/lib/glcdfont.c" +#define RGB_MATRIX_MODE_NAME_ENABLE diff --git a/keyboards/1upkeyboards/pi50/pi50.c b/keyboards/1upkeyboards/pi50/pi50.c index cc0cdbe333..c55b2669ef 100644 --- a/keyboards/1upkeyboards/pi50/pi50.c +++ b/keyboards/1upkeyboards/pi50/pi50.c @@ -18,49 +18,6 @@ #include #include -#if defined(RGB_MATRIX_EFFECT) -# undef RGB_MATRIX_EFFECT -#endif // defined(RGB_MATRIX_EFFECT) - -#define RGB_MATRIX_EFFECT(x) RGB_MATRIX_EFFECT_##x, -enum { - RGB_MATRIX_EFFECT_NONE, -#include "rgb_matrix_effects.inc" -#undef RGB_MATRIX_EFFECT -#ifdef RGB_MATRIX_CUSTOM_KB -# include "rgb_matrix_kb.inc" -#endif -#ifdef RGB_MATRIX_CUSTOM_USER -# include "rgb_matrix_user.inc" -#endif -#if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") -# include "rgb_matrix_community_modules.inc" -#endif -}; - -#define RGB_MATRIX_EFFECT(x) \ - case RGB_MATRIX_EFFECT_##x: \ - return #x; -const char* rgb_matrix_name(uint8_t effect) { - switch (effect) { - case RGB_MATRIX_EFFECT_NONE: - return "NONE"; -#include "rgb_matrix_effects.inc" -#undef RGB_MATRIX_EFFECT -#ifdef RGB_MATRIX_CUSTOM_KB -# include "rgb_matrix_kb.inc" -#endif -#ifdef RGB_MATRIX_CUSTOM_USER -# include "rgb_matrix_user.inc" -#endif -#if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") -# include "rgb_matrix_community_modules.inc" -#endif - default: - return "UNKNOWN"; - } -} - #ifdef OLED_ENABLE static uint32_t oled_logo_timer = 0; @@ -154,7 +111,7 @@ void user_oled_magic(void) { oled_write_P(led_state.num_lock ? PSTR("Num(x) ") : PSTR("Num( ) "), false); oled_write_P(led_state.scroll_lock ? PSTR("Scrl(x)") : PSTR("Scrl( )"), false); - char *mode_name = strdup(rgb_matrix_name(rgb_matrix_get_mode())); + char *mode_name = strdup(rgb_matrix_get_mode_name(rgb_matrix_get_mode())); if (mode_name != NULL) { int len = strlen(mode_name); bool capitalize_next = true; diff --git a/keyboards/tzarc/djinn/config.h b/keyboards/tzarc/djinn/config.h index 24357b6a35..717ce4ee50 100644 --- a/keyboards/tzarc/djinn/config.h +++ b/keyboards/tzarc/djinn/config.h @@ -50,3 +50,5 @@ #ifndef STARTUP_SONG # define STARTUP_SONG SONG(STARTUP_SOUND) #endif // STARTUP_SONG + +#define RGB_MATRIX_MODE_NAME_ENABLE diff --git a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c index 739a0817b0..03535587c4 100644 --- a/keyboards/tzarc/djinn/graphics/theme_djinn_default.c +++ b/keyboards/tzarc/djinn/graphics/theme_djinn_default.c @@ -30,55 +30,6 @@ static painter_image_handle_t lock_scrl_on; static painter_image_handle_t lock_scrl_off; static painter_font_handle_t thintel; -//---------------------------------------------------------- -// RGB Matrix naming -#if defined(RGB_MATRIX_ENABLE) -# include - -# if defined(RGB_MATRIX_EFFECT) -# undef RGB_MATRIX_EFFECT -# endif // defined(RGB_MATRIX_EFFECT) - -# define RGB_MATRIX_EFFECT(x) RGB_MATRIX_EFFECT_##x, -enum { - RGB_MATRIX_EFFECT_NONE, -# include "rgb_matrix_effects.inc" -# ifdef RGB_MATRIX_CUSTOM_KB -# include "rgb_matrix_kb.inc" -# endif -# ifdef RGB_MATRIX_CUSTOM_USER -# include "rgb_matrix_user.inc" -# endif -# if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") -# include "rgb_matrix_community_modules.inc" -# endif -# undef RGB_MATRIX_EFFECT -}; - -# define RGB_MATRIX_EFFECT(x) \ - case RGB_MATRIX_EFFECT_##x: \ - return #x; -const char *rgb_matrix_name(uint8_t effect) { - switch (effect) { - case RGB_MATRIX_EFFECT_NONE: - return "NONE"; -# include "rgb_matrix_effects.inc" -# ifdef RGB_MATRIX_CUSTOM_KB -# include "rgb_matrix_kb.inc" -# endif -# ifdef RGB_MATRIX_CUSTOM_USER -# include "rgb_matrix_user.inc" -# endif -# if defined(COMMUNITY_MODULES_ENABLE) && __has_include("rgb_matrix_community_modules.inc") -# include "rgb_matrix_community_modules.inc" -# endif -# undef RGB_MATRIX_EFFECT - default: - return "UNKNOWN"; - } -} -#endif // defined(RGB_MATRIX_ENABLE) - //---------------------------------------------------------- // UI Initialisation void keyboard_post_init_display(void) { @@ -163,7 +114,7 @@ void draw_ui_user(bool force_redraw) { if (hue_redraw || rgb_effect_redraw) { static int max_rgb_xpos = 0; xpos = 16; - snprintf(buf, sizeof(buf), "rgb: %s", rgb_matrix_name(curr_effect)); + snprintf(buf, sizeof(buf), "rgb: %s", rgb_matrix_get_mode_name(curr_effect)); for (int i = 5; i < sizeof(buf); ++i) { if (buf[i] == 0) diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index 7a0e8a5ebb..9c8004cc17 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -107,7 +107,11 @@ void eeconfig_update_led_matrix_default(void) { void eeconfig_debug_led_matrix(void) { dprintf("led_matrix_eeconfig EEPROM\n"); dprintf("led_matrix_eeconfig.enable = %d\n", led_matrix_eeconfig.enable); +#ifdef LED_MATRIX_MODE_NAME_ENABLE + dprintf("led_matrix_eeconfig.mode = %d (%s)\n", led_matrix_eeconfig.mode, led_matrix_get_mode_name(led_matrix_eeconfig.mode)); +#else dprintf("led_matrix_eeconfig.mode = %d\n", led_matrix_eeconfig.mode); +#endif // LED_MATRIX_MODE_NAME_ENABLE dprintf("led_matrix_eeconfig.val = %d\n", led_matrix_eeconfig.val); dprintf("led_matrix_eeconfig.speed = %d\n", led_matrix_eeconfig.speed); dprintf("led_matrix_eeconfig.flags = %d\n", led_matrix_eeconfig.flags); @@ -525,7 +529,11 @@ void led_matrix_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { } led_task_state = STARTING; eeconfig_flag_led_matrix(write_to_eeprom); - dprintf("led matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", led_matrix_eeconfig.mode); +#ifdef LED_MATRIX_MODE_NAME_ENABLE + dprintf("led matrix mode [%s]: %u (%s)\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", (unsigned)led_matrix_eeconfig.mode, led_matrix_get_mode_name(led_matrix_eeconfig.mode)); +#else + dprintf("led matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", (unsigned)led_matrix_eeconfig.mode); +#endif // LED_MATRIX_MODE_NAME_ENABLE } void led_matrix_mode_noeeprom(uint8_t mode) { led_matrix_mode_eeprom_helper(mode, false); @@ -652,3 +660,48 @@ void led_matrix_set_flags(led_flags_t flags) { void led_matrix_set_flags_noeeprom(led_flags_t flags) { led_matrix_set_flags_eeprom_helper(flags, false); } + +// LED Matrix naming +#undef LED_MATRIX_EFFECT +#ifdef LED_MATRIX_MODE_NAME_ENABLE +const char *led_matrix_get_mode_name(uint8_t mode) { + switch (mode) { + case LED_MATRIX_NONE: + return "NONE"; + +# define LED_MATRIX_EFFECT(name, ...) \ + case LED_MATRIX_##name: \ + return #name; +# include "led_matrix_effects.inc" +# undef LED_MATRIX_EFFECT + +# ifdef COMMUNITY_MODULES_ENABLE +# define LED_MATRIX_EFFECT(name, ...) \ + case LED_MATRIX_COMMUNITY_MODULE_##name: \ + return #name; +# include "led_matrix_community_modules.inc" +# undef LED_MATRIX_EFFECT +# endif // COMMUNITY_MODULES_ENABLE + +# if defined(LED_MATRIX_CUSTOM_KB) || defined(LED_MATRIX_CUSTOM_USER) +# define LED_MATRIX_EFFECT(name, ...) \ + case LED_MATRIX_CUSTOM_##name: \ + return #name; + +# ifdef LED_MATRIX_CUSTOM_KB +# include "led_matrix_kb.inc" +# endif // LED_MATRIX_CUSTOM_KB + +# ifdef LED_MATRIX_CUSTOM_USER +# include "led_matrix_user.inc" +# endif // LED_MATRIX_CUSTOM_USER + +# undef LED_MATRIX_EFFECT +# endif // LED_MATRIX_CUSTOM_KB || LED_MATRIX_CUSTOM_USER + + default: + return "UNKNOWN"; + } +} +# undef LED_MATRIX_EFFECT +#endif // LED_MATRIX_MODE_NAME_ENABLE diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h index 0dfe33ffab..9a49515ab2 100644 --- a/quantum/led_matrix/led_matrix.h +++ b/quantum/led_matrix/led_matrix.h @@ -184,6 +184,10 @@ led_flags_t led_matrix_get_flags(void); void led_matrix_set_flags(led_flags_t flags); void led_matrix_set_flags_noeeprom(led_flags_t flags); +#ifdef LED_MATRIX_MODE_NAME_ENABLE +const char *led_matrix_get_mode_name(uint8_t mode); +#endif // LED_MATRIX_MODE_NAME_ENABLE + static inline bool led_matrix_check_finished_leds(uint8_t led_idx) { #if defined(LED_MATRIX_SPLIT) if (is_keyboard_left()) { diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 2679c48342..ab0aa17512 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -109,7 +109,11 @@ void eeconfig_update_rgb_matrix_default(void) { void eeconfig_debug_rgb_matrix(void) { dprintf("rgb_matrix_config EEPROM\n"); dprintf("rgb_matrix_config.enable = %d\n", rgb_matrix_config.enable); +#ifdef RGB_MATRIX_MODE_NAME_ENABLE + dprintf("rgb_matrix_config.mode = %d (%s)\n", rgb_matrix_config.mode, rgb_matrix_get_mode_name(rgb_matrix_config.mode)); +#else dprintf("rgb_matrix_config.mode = %d\n", rgb_matrix_config.mode); +#endif // RGB_MATRIX_MODE_NAME_ENABLE dprintf("rgb_matrix_config.hsv.h = %d\n", rgb_matrix_config.hsv.h); dprintf("rgb_matrix_config.hsv.s = %d\n", rgb_matrix_config.hsv.s); dprintf("rgb_matrix_config.hsv.v = %d\n", rgb_matrix_config.hsv.v); @@ -560,7 +564,11 @@ void rgb_matrix_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { } rgb_task_state = STARTING; eeconfig_flag_rgb_matrix(write_to_eeprom); - dprintf("rgb matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", rgb_matrix_config.mode); +#ifdef RGB_MATRIX_MODE_NAME_ENABLE + dprintf("rgb matrix mode [%s]: %u (%s)\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", (unsigned)rgb_matrix_config.mode, rgb_matrix_get_mode_name(rgb_matrix_config.mode)); +#else + dprintf("rgb matrix mode [%s]: %u\n", (write_to_eeprom) ? "EEPROM" : "NOEEPROM", (unsigned)rgb_matrix_config.mode); +#endif // RGB_MATRIX_MODE_NAME_ENABLE } void rgb_matrix_mode_noeeprom(uint8_t mode) { rgb_matrix_mode_eeprom_helper(mode, false); @@ -738,3 +746,49 @@ void rgb_matrix_set_flags(led_flags_t flags) { void rgb_matrix_set_flags_noeeprom(led_flags_t flags) { rgb_matrix_set_flags_eeprom_helper(flags, false); } + +//---------------------------------------------------------- +// RGB Matrix naming +#undef RGB_MATRIX_EFFECT +#ifdef RGB_MATRIX_MODE_NAME_ENABLE +const char *rgb_matrix_get_mode_name(uint8_t mode) { + switch (mode) { + case RGB_MATRIX_NONE: + return "NONE"; + +# define RGB_MATRIX_EFFECT(name, ...) \ + case RGB_MATRIX_##name: \ + return #name; +# include "rgb_matrix_effects.inc" +# undef RGB_MATRIX_EFFECT + +# ifdef COMMUNITY_MODULES_ENABLE +# define RGB_MATRIX_EFFECT(name, ...) \ + case RGB_MATRIX_COMMUNITY_MODULE_##name: \ + return #name; +# include "rgb_matrix_community_modules.inc" +# undef RGB_MATRIX_EFFECT +# endif // COMMUNITY_MODULES_ENABLE + +# if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) +# define RGB_MATRIX_EFFECT(name, ...) \ + case RGB_MATRIX_CUSTOM_##name: \ + return #name; + +# ifdef RGB_MATRIX_CUSTOM_KB +# include "rgb_matrix_kb.inc" +# endif // RGB_MATRIX_CUSTOM_KB + +# ifdef RGB_MATRIX_CUSTOM_USER +# include "rgb_matrix_user.inc" +# endif // RGB_MATRIX_CUSTOM_USER + +# undef RGB_MATRIX_EFFECT +# endif // RGB_MATRIX_CUSTOM_KB || RGB_MATRIX_CUSTOM_USER + + default: + return "UNKNOWN"; + } +} +# undef RGB_MATRIX_EFFECT +#endif // RGB_MATRIX_MODE_NAME_ENABLE diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h index c6b302631e..a91dded4a8 100644 --- a/quantum/rgb_matrix/rgb_matrix.h +++ b/quantum/rgb_matrix/rgb_matrix.h @@ -220,6 +220,10 @@ void rgb_matrix_set_flags(led_flags_t flags); void rgb_matrix_set_flags_noeeprom(led_flags_t flags); void rgb_matrix_update_pwm_buffers(void); +#ifdef RGB_MATRIX_MODE_NAME_ENABLE +const char *rgb_matrix_get_mode_name(uint8_t mode); +#endif // RGB_MATRIX_MODE_NAME_ENABLE + #ifndef RGBLIGHT_ENABLE # define eeconfig_update_rgblight_current eeconfig_force_flush_rgb_matrix # define rgblight_reload_from_eeprom rgb_matrix_reload_from_eeprom From 0b3a54f9f22a520d145f7d19328001ab38de1a02 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 7 Jun 2025 16:50:54 +0100 Subject: [PATCH 419/592] maple_computing/launchpad - Remove broken `default_rgb` keymap (#25342) --- .../launchpad/keymaps/default_rgb/config.h | 18 ----- .../launchpad/keymaps/default_rgb/keymap.c | 76 ------------------- .../launchpad/keymaps/default_rgb/readme.md | 41 ---------- .../launchpad/keymaps/default_rgb/rules.mk | 1 - 4 files changed, 136 deletions(-) delete mode 100644 keyboards/maple_computing/launchpad/keymaps/default_rgb/config.h delete mode 100644 keyboards/maple_computing/launchpad/keymaps/default_rgb/keymap.c delete mode 100644 keyboards/maple_computing/launchpad/keymaps/default_rgb/readme.md delete mode 100644 keyboards/maple_computing/launchpad/keymaps/default_rgb/rules.mk diff --git a/keyboards/maple_computing/launchpad/keymaps/default_rgb/config.h b/keyboards/maple_computing/launchpad/keymaps/default_rgb/config.h deleted file mode 100644 index c50e010375..0000000000 --- a/keyboards/maple_computing/launchpad/keymaps/default_rgb/config.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -/* Underlight Configuration */ -#define WS2812_DI_PIN F4 -#define RGBLIGHT_EFFECT_BREATHING -#define RGBLIGHT_EFFECT_RAINBOW_MOOD -#define RGBLIGHT_EFFECT_RAINBOW_SWIRL -#define RGBLIGHT_EFFECT_SNAKE -#define RGBLIGHT_EFFECT_KNIGHT -#define RGBLIGHT_EFFECT_CHRISTMAS -#define RGBLIGHT_EFFECT_STATIC_GRADIENT -#define RGBLIGHT_EFFECT_RGB_TEST -#define RGBLIGHT_EFFECT_ALTERNATING -#define RGBLIGHT_EFFECT_TWINKLE -#define RGBLIGHT_LED_COUNT 2 // Number of LEDs -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 diff --git a/keyboards/maple_computing/launchpad/keymaps/default_rgb/keymap.c b/keyboards/maple_computing/launchpad/keymaps/default_rgb/keymap.c deleted file mode 100644 index 0b2335af98..0000000000 --- a/keyboards/maple_computing/launchpad/keymaps/default_rgb/keymap.c +++ /dev/null @@ -1,76 +0,0 @@ -// Below layout is based upon /u/That-Canadian's planck layout -#include QMK_KEYBOARD_H - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_names { - _QWERTY, - _RGB, - _FUNC -}; - -// Defines for task manager and such -#define CALTDEL LCTL(LALT(KC_DEL)) -#define TSKMGR LCTL(LSFT(KC_ESC)) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-------------. - * | 1 | 2 | - * |------+------| - * | 3 | 4 | - * |------+------| - * | 5 | 6 | - * |------+------| - * | FUNC | RGB | - * `-------------' - */ - [_QWERTY] = LAYOUT( - KC_1, KC_2, - KC_3, KC_4, - KC_5, KC_6, - MO(_FUNC), TG(_RGB) - ), - - /* RGB - * ,-------------. - * | Mode-| Mode+| - * |------+------| - * | HUE- | HUE+ | - * |------+------| - * | SAT- | SAT+ | - * |------+------| - * |RGBTOG| | - * `-------------' - */ - [_RGB] = LAYOUT( - UG_PREV, UG_NEXT, - UG_HUED, UG_HUEU, - UG_SATD, UG_SATU, - UG_TOGG, KC_TRNS - ), - - /* Function - * ,-------------. - * | Q |CALDEL| - * |------+------| - * | A |TSKMGR| - * |------+------| - * | Z | X | - * |------+------| - * | | C | - * `-------------' - */ - [_FUNC] = LAYOUT( - KC_Q, CALTDEL, - KC_A, TSKMGR, - KC_Z, KC_X, - _______, KC_C - ) - -}; diff --git a/keyboards/maple_computing/launchpad/keymaps/default_rgb/readme.md b/keyboards/maple_computing/launchpad/keymaps/default_rgb/readme.md deleted file mode 100644 index 3f15ff9bc3..0000000000 --- a/keyboards/maple_computing/launchpad/keymaps/default_rgb/readme.md +++ /dev/null @@ -1,41 +0,0 @@ -# Launch Pad - -![Launch Pad](https://i.imgur.com/WVTe0Ku.png) - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -A budget-minded, 4-8 key macro-pad with built in legs, plate & case. - -Supports MX & Alps switches. 2x 1u or 1x 2u supported for each row. - -Supports 2u PCB-Mount stabilizers. - -Runs off of 1x Pro Micro & 8x diodes (1n4148). - -Optional "Reset" switch can be used on the PCB. - -A fantastic project for beginners to learn to solder, veteran's of the hobby who want to add an easy macro-pad to their collection, and everyone in between. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -Make example for this keyboard (after setting up your build environment): - - make launchpad/rev1:default - -See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. - -# Under Glow - -![Underglow](https://i.imgur.com/3zFIOmu.jpg) - -SpaceCat now provides an underglow add-on kit. Please refer to the picture above for wiring. - -Make example for this keyboard (after setting up your build environment): - - make launchpad/rev1:default_rgb - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - -Due to PCB tolerance issues outside of our control, the snap-apart legs included on the PCB may need extra padding to prevent a small amount of wobbling once placed properly. We have included small, clear, and semi-permanent "glue dots" in each order (PCB Only -and- Full Kit) to help with this. You may also use plastic wrap, tape, Elmer's glue, hot glue, rubber cement, etc. We advise against using anything more "permanent" in case you wish to make changes to your Launch Pad in the future. It is also best to attach legs after all of your soldering and building is finished, to get the most accurate feel for your Launch Pad. - --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- diff --git a/keyboards/maple_computing/launchpad/keymaps/default_rgb/rules.mk b/keyboards/maple_computing/launchpad/keymaps/default_rgb/rules.mk deleted file mode 100644 index 1e3cebb145..0000000000 --- a/keyboards/maple_computing/launchpad/keymaps/default_rgb/rules.mk +++ /dev/null @@ -1 +0,0 @@ -RGBLIGHT_ENABLE = yes From 021c3cc12587d3b1b3d51b753470614d11e318bd Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 7 Jun 2025 22:17:38 +0100 Subject: [PATCH 420/592] Configure boards to use development_board - LM (#25341) --- keyboards/latincompass/latinpad/keyboard.json | 3 +-- keyboards/lets_split/info.json | 3 +-- keyboards/lily58/glow_enc/keyboard.json | 3 +-- keyboards/lily58/light/keyboard.json | 3 +-- keyboards/lily58/rev1/keyboard.json | 3 +-- keyboards/lime/rev1/keyboard.json | 3 +-- keyboards/machkeyboards/mach3/keyboard.json | 3 +-- keyboards/makrosu/keyboard.json | 3 +-- keyboards/manta60/keyboard.json | 3 +-- keyboards/maple_computing/6ball/keyboard.json | 3 +-- keyboards/maple_computing/christmas_tree/v2017/keyboard.json | 3 +-- keyboards/maple_computing/launchpad/rev1/keyboard.json | 3 +-- keyboards/maple_computing/minidox/rev1/keyboard.json | 3 +-- keyboards/marksard/leftover30/keyboard.json | 3 +-- keyboards/marksard/rhymestone/rev1/keyboard.json | 3 +-- keyboards/maxipad/promicro/keyboard.json | 3 +-- keyboards/mechwild/mokulua/mirrored/keyboard.json | 3 +-- keyboards/mechwild/mokulua/standard/keyboard.json | 3 +-- keyboards/mechwild/murphpad/keyboard.json | 3 +-- keyboards/meow48/keyboard.json | 3 +-- keyboards/merge/uc1/keyboard.json | 3 +-- keyboards/minimacro5/keyboard.json | 3 +-- keyboards/mint60/keyboard.json | 3 +-- keyboards/mixi/keyboard.json | 3 +-- keyboards/montsinger/rewind/keyboard.json | 3 +-- keyboards/morizon/keyboard.json | 3 +-- keyboards/mountainblocks/mb17/keyboard.json | 3 +-- 27 files changed, 27 insertions(+), 54 deletions(-) diff --git a/keyboards/latincompass/latinpad/keyboard.json b/keyboards/latincompass/latinpad/keyboard.json index 2efc370ad3..3b4563b1ca 100644 --- a/keyboards/latincompass/latinpad/keyboard.json +++ b/keyboards/latincompass/latinpad/keyboard.json @@ -65,8 +65,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/lets_split/info.json b/keyboards/lets_split/info.json index 9152226cab..dc46a7eb66 100644 --- a/keyboards/lets_split/info.json +++ b/keyboards/lets_split/info.json @@ -1,6 +1,5 @@ { "maintainer": "qmk", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x12"] } diff --git a/keyboards/lily58/glow_enc/keyboard.json b/keyboards/lily58/glow_enc/keyboard.json index 9f7a2760aa..63ee5b6a99 100644 --- a/keyboards/lily58/glow_enc/keyboard.json +++ b/keyboards/lily58/glow_enc/keyboard.json @@ -44,8 +44,7 @@ "max_brightness": 120, "split_count": [36, 36] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "build": { "lto": true }, diff --git a/keyboards/lily58/light/keyboard.json b/keyboards/lily58/light/keyboard.json index 0eadf11eb6..738a9418a6 100644 --- a/keyboards/lily58/light/keyboard.json +++ b/keyboards/lily58/light/keyboard.json @@ -45,8 +45,7 @@ "max_brightness": 120, "split_count": [35, 35] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "build": { "lto": true }, diff --git a/keyboards/lily58/rev1/keyboard.json b/keyboards/lily58/rev1/keyboard.json index 3488b0e2b5..f23d4dbaa1 100644 --- a/keyboards/lily58/rev1/keyboard.json +++ b/keyboards/lily58/rev1/keyboard.json @@ -27,8 +27,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/lime/rev1/keyboard.json b/keyboards/lime/rev1/keyboard.json index 50fc82ae19..b61a91a0da 100644 --- a/keyboards/lime/rev1/keyboard.json +++ b/keyboards/lime/rev1/keyboard.json @@ -42,8 +42,7 @@ "qmk": { "tap_keycode_delay": 10 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/machkeyboards/mach3/keyboard.json b/keyboards/machkeyboards/mach3/keyboard.json index 126845a37d..383f4a738e 100644 --- a/keyboards/machkeyboards/mach3/keyboard.json +++ b/keyboards/machkeyboards/mach3/keyboard.json @@ -26,8 +26,7 @@ "levels": 5, "breathing": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_3x3": { "layout": [ diff --git a/keyboards/makrosu/keyboard.json b/keyboards/makrosu/keyboard.json index e79a03f475..1e83c20aa7 100644 --- a/keyboards/makrosu/keyboard.json +++ b/keyboards/makrosu/keyboard.json @@ -34,8 +34,7 @@ "bootmagic": { "matrix": [0, 5] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/manta60/keyboard.json b/keyboards/manta60/keyboard.json index 007f015379..84af2a2752 100644 --- a/keyboards/manta60/keyboard.json +++ b/keyboards/manta60/keyboard.json @@ -53,8 +53,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/maple_computing/6ball/keyboard.json b/keyboards/maple_computing/6ball/keyboard.json index 335294e51e..f68f2ec8ba 100644 --- a/keyboards/maple_computing/6ball/keyboard.json +++ b/keyboards/maple_computing/6ball/keyboard.json @@ -38,8 +38,7 @@ "rows": ["F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/maple_computing/christmas_tree/v2017/keyboard.json b/keyboards/maple_computing/christmas_tree/v2017/keyboard.json index d2ebc781d6..6682c574c9 100644 --- a/keyboards/maple_computing/christmas_tree/v2017/keyboard.json +++ b/keyboards/maple_computing/christmas_tree/v2017/keyboard.json @@ -8,8 +8,7 @@ "pid": "0x3070", "device_version": "20.1.7" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "backlight": true, "bootmagic": false, diff --git a/keyboards/maple_computing/launchpad/rev1/keyboard.json b/keyboards/maple_computing/launchpad/rev1/keyboard.json index 272a2eef6d..9f7a23c7c8 100644 --- a/keyboards/maple_computing/launchpad/rev1/keyboard.json +++ b/keyboards/maple_computing/launchpad/rev1/keyboard.json @@ -30,8 +30,7 @@ "rows": ["C6", "B1", "B3", "D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/maple_computing/minidox/rev1/keyboard.json b/keyboards/maple_computing/minidox/rev1/keyboard.json index 340a8bd39e..a11c2d94e6 100644 --- a/keyboards/maple_computing/minidox/rev1/keyboard.json +++ b/keyboards/maple_computing/minidox/rev1/keyboard.json @@ -18,8 +18,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/marksard/leftover30/keyboard.json b/keyboards/marksard/leftover30/keyboard.json index 1b1131d6fc..9983935f66 100644 --- a/keyboards/marksard/leftover30/keyboard.json +++ b/keyboards/marksard/leftover30/keyboard.json @@ -56,8 +56,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_all": { "layout": [ diff --git a/keyboards/marksard/rhymestone/rev1/keyboard.json b/keyboards/marksard/rhymestone/rev1/keyboard.json index 3fe23d6d94..aaff1515e0 100644 --- a/keyboards/marksard/rhymestone/rev1/keyboard.json +++ b/keyboards/marksard/rhymestone/rev1/keyboard.json @@ -44,8 +44,7 @@ "static_gradient": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/maxipad/promicro/keyboard.json b/keyboards/maxipad/promicro/keyboard.json index 1499162155..d48a1c9d11 100644 --- a/keyboards/maxipad/promicro/keyboard.json +++ b/keyboards/maxipad/promicro/keyboard.json @@ -4,6 +4,5 @@ "rows": ["B6", "B2", "B3", "B1", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/mechwild/mokulua/mirrored/keyboard.json b/keyboards/mechwild/mokulua/mirrored/keyboard.json index dc66c0c53a..e76314f869 100644 --- a/keyboards/mechwild/mokulua/mirrored/keyboard.json +++ b/keyboards/mechwild/mokulua/mirrored/keyboard.json @@ -61,8 +61,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_mirrored": "LAYOUT" }, diff --git a/keyboards/mechwild/mokulua/standard/keyboard.json b/keyboards/mechwild/mokulua/standard/keyboard.json index f3eccd921f..e9c81c7e6d 100644 --- a/keyboards/mechwild/mokulua/standard/keyboard.json +++ b/keyboards/mechwild/mokulua/standard/keyboard.json @@ -61,8 +61,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_standard": "LAYOUT" }, diff --git a/keyboards/mechwild/murphpad/keyboard.json b/keyboards/mechwild/murphpad/keyboard.json index 8ab90bd937..a79810afd7 100644 --- a/keyboards/mechwild/murphpad/keyboard.json +++ b/keyboards/mechwild/murphpad/keyboard.json @@ -59,8 +59,7 @@ "ws2812": { "pin": "F4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/meow48/keyboard.json b/keyboards/meow48/keyboard.json index 7861555648..f3b1453547 100644 --- a/keyboards/meow48/keyboard.json +++ b/keyboards/meow48/keyboard.json @@ -43,8 +43,7 @@ "rows": ["D4", "C6", "D7", "E6", "B4", "B5", "F4", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/merge/uc1/keyboard.json b/keyboards/merge/uc1/keyboard.json index 496b9a6b5f..4d0393399f 100644 --- a/keyboards/merge/uc1/keyboard.json +++ b/keyboards/merge/uc1/keyboard.json @@ -48,8 +48,7 @@ {"pin_a": "F5", "pin_b": "F6"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/minimacro5/keyboard.json b/keyboards/minimacro5/keyboard.json index 033bc1e85a..b868a3b058 100644 --- a/keyboards/minimacro5/keyboard.json +++ b/keyboards/minimacro5/keyboard.json @@ -34,8 +34,7 @@ {"pin_a": "C6", "pin_b": "E6", "resolution": 2} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "encoder": true, diff --git a/keyboards/mint60/keyboard.json b/keyboards/mint60/keyboard.json index 1bb54aebd9..9e581ce7b8 100644 --- a/keyboards/mint60/keyboard.json +++ b/keyboards/mint60/keyboard.json @@ -51,8 +51,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/mixi/keyboard.json b/keyboards/mixi/keyboard.json index a08d54b883..bde1eb6390 100644 --- a/keyboards/mixi/keyboard.json +++ b/keyboards/mixi/keyboard.json @@ -35,8 +35,7 @@ {"pin_a": "B1", "pin_b": "B3"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "command": true, diff --git a/keyboards/montsinger/rewind/keyboard.json b/keyboards/montsinger/rewind/keyboard.json index ddb6ab6496..46468d4c67 100644 --- a/keyboards/montsinger/rewind/keyboard.json +++ b/keyboards/montsinger/rewind/keyboard.json @@ -27,8 +27,7 @@ "rows": ["B5", "B4", "D2", "D3", "B2"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_5x10": { "layout": [ diff --git a/keyboards/morizon/keyboard.json b/keyboards/morizon/keyboard.json index 13999e5753..1b3dba08d4 100644 --- a/keyboards/morizon/keyboard.json +++ b/keyboards/morizon/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D3", "D2", "D1", "D0", "D4", "C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/mountainblocks/mb17/keyboard.json b/keyboards/mountainblocks/mb17/keyboard.json index 9103f7775f..d8ef466def 100644 --- a/keyboards/mountainblocks/mb17/keyboard.json +++ b/keyboards/mountainblocks/mb17/keyboard.json @@ -26,8 +26,7 @@ "rows": ["F4", "B1", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_numpad_5x4": { "layout": [ From e57226d9a2f6502e6ede685971fe0788c53f9c89 Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Sun, 8 Jun 2025 19:04:56 +0200 Subject: [PATCH 421/592] [Keyboard] Add splitkb.com's Halcyon Lily58 rev2 (#25144) --- keyboards/splitkb/halcyon/lily58/info.json | 73 ++++++++ .../lily58/keymaps/default/keymap.json | 47 +++++ .../halcyon/lily58/keymaps/default/readme.md | 88 +++++++++ keyboards/splitkb/halcyon/lily58/readme.md | 31 ++++ .../splitkb/halcyon/lily58/rev2/config.h | 32 ++++ .../splitkb/halcyon/lily58/rev2/halconf.h | 11 ++ .../splitkb/halcyon/lily58/rev2/keyboard.json | 170 ++++++++++++++++++ .../splitkb/halcyon/lily58/rev2/mcuconf.h | 14 ++ keyboards/splitkb/halcyon/lily58/rev2/rev2.c | 28 +++ 9 files changed, 494 insertions(+) create mode 100755 keyboards/splitkb/halcyon/lily58/info.json create mode 100644 keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json create mode 100644 keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md create mode 100755 keyboards/splitkb/halcyon/lily58/readme.md create mode 100755 keyboards/splitkb/halcyon/lily58/rev2/config.h create mode 100644 keyboards/splitkb/halcyon/lily58/rev2/halconf.h create mode 100755 keyboards/splitkb/halcyon/lily58/rev2/keyboard.json create mode 100644 keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h create mode 100644 keyboards/splitkb/halcyon/lily58/rev2/rev2.c diff --git a/keyboards/splitkb/halcyon/lily58/info.json b/keyboards/splitkb/halcyon/lily58/info.json new file mode 100755 index 0000000000..178527f838 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/info.json @@ -0,0 +1,73 @@ +{ + "manufacturer": "splitkb.com", + "maintainer": "splitkb.com", + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "L01", "matrix": [0, 0], "x": 0, "y": 0.5}, + {"label": "L02", "matrix": [0, 1], "x": 1, "y": 0.375}, + {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0.125}, + {"label": "L04", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "L05", "matrix": [0, 4], "x": 4, "y": 0.125}, + {"label": "L06", "matrix": [0, 5], "x": 5, "y": 0.25}, + {"label": "R06", "matrix": [5, 5], "x": 10.5, "y": 0.25}, + {"label": "R05", "matrix": [5, 4], "x": 11.5, "y": 0.125}, + {"label": "R04", "matrix": [5, 3], "x": 12.5, "y": 0}, + {"label": "R03", "matrix": [5, 2], "x": 13.5, "y": 0.125}, + {"label": "R02", "matrix": [5, 1], "x": 14.5, "y": 0.375}, + {"label": "R01", "matrix": [5, 0], "x": 15.5, "y": 0.5}, + {"label": "L07", "matrix": [1, 0], "x": 0, "y": 1.5}, + {"label": "L08", "matrix": [1, 1], "x": 1, "y": 1.375}, + {"label": "L09", "matrix": [1, 2], "x": 2, "y": 1.125}, + {"label": "L10", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "L11", "matrix": [1, 4], "x": 4, "y": 1.125}, + {"label": "L12", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "R12", "matrix": [6, 5], "x": 10.5, "y": 1.25}, + {"label": "R11", "matrix": [6, 4], "x": 11.5, "y": 1.125}, + {"label": "R10", "matrix": [6, 3], "x": 12.5, "y": 1}, + {"label": "R09", "matrix": [6, 2], "x": 13.5, "y": 1.125}, + {"label": "R08", "matrix": [6, 1], "x": 14.5, "y": 1.375}, + {"label": "R07", "matrix": [6, 0], "x": 15.5, "y": 1.5}, + {"label": "L13", "matrix": [2, 0], "x": 0, "y": 2.5}, + {"label": "L14", "matrix": [2, 1], "x": 1, "y": 2.375}, + {"label": "L15", "matrix": [2, 2], "x": 2, "y": 2.125}, + {"label": "L16", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "L17", "matrix": [2, 4], "x": 4, "y": 2.125}, + {"label": "L18", "matrix": [2, 5], "x": 5, "y": 2.25}, + {"label": "R18", "matrix": [7, 5], "x": 10.5, "y": 2.25}, + {"label": "R17", "matrix": [7, 4], "x": 11.5, "y": 2.125}, + {"label": "R16", "matrix": [7, 3], "x": 12.5, "y": 2}, + {"label": "R15", "matrix": [7, 2], "x": 13.5, "y": 2.125}, + {"label": "R14", "matrix": [7, 1], "x": 14.5, "y": 2.375}, + {"label": "R13", "matrix": [7, 0], "x": 15.5, "y": 2.5}, + {"label": "L20", "matrix": [3, 0], "x": 0, "y": 3.5}, + {"label": "L21", "matrix": [3, 1], "x": 1, "y": 3.375}, + {"label": "L22", "matrix": [3, 2], "x": 2, "y": 3.125}, + {"label": "L23", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "L24", "matrix": [3, 4], "x": 4, "y": 3.125}, + {"label": "L25", "matrix": [3, 5], "x": 5, "y": 3.25}, + {"label": "L19", "matrix": [4, 1], "x": 6, "y": 2.75}, + {"label": "R19", "matrix": [9, 1], "x": 9.5, "y": 2.75}, + {"label": "R25", "matrix": [8, 5], "x": 10.5, "y": 3.25}, + {"label": "R24", "matrix": [8, 4], "x": 11.5, "y": 3.125}, + {"label": "R23", "matrix": [8, 3], "x": 12.5, "y": 3}, + {"label": "R22", "matrix": [8, 2], "x": 13.5, "y": 3.125}, + {"label": "R21", "matrix": [8, 1], "x": 14.5, "y": 3.375}, + {"label": "R20", "matrix": [8, 0], "x": 15.5, "y": 3.5}, + {"label": "L26", "matrix": [4, 2], "x": 2.5, "y": 4.15}, + {"label": "L27", "matrix": [4, 3], "x": 3.5, "y": 4.15}, + {"label": "L28", "matrix": [4, 4], "x": 4.5, "y": 4.25}, + {"label": "L29", "matrix": [4, 5], "x": 6, "y": 4.25}, + {"label": "R29", "matrix": [9, 5], "x": 9.5, "y": 4.25}, + {"label": "R28", "matrix": [9, 4], "x": 11, "y": 4.25}, + {"label": "R27", "matrix": [9, 3], "x": 12, "y": 4.15}, + {"label": "R26", "matrix": [9, 2], "x": 13, "y": 4.15} + ] + } + } +} diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json new file mode 100644 index 0000000000..05c4d89bcc --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json @@ -0,0 +1,47 @@ +{ + "keyboard": "splitkb/halcyon/lily58/rev2", + "keymap": "default", + "version": 1, + "layout": "LAYOUT", + "layers": [ + [ + "KC_ESC" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_GRV" , + "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_LBRC", "KC_RBRC", "KC_N" , "KC_M" , "KC_COMM", "KC_DOT" , "KC_SLSH", "KC_RSFT", + "KC_LALT", "KC_LGUI", "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_BSPC", "KC_RGUI" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "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_GRV" , "KC_EXLM", "KC_AT" , "KC_HASH", "KC_DLR" , "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "KC_TILD", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "XXXXXXX", "KC_UNDS", "KC_PLUS", "KC_LCBR", "KC_RCBR", "KC_PIPE", + "_______", "_______", "_______", "_______", "_______", "MO(3)" , "_______", "_______" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "KC_GRV" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "_______", + "KC_F1" , "KC_F2" , "KC_F3" , "KC_F4" , "KC_F5" , "KC_F6" , "XXXXXXX", "KC_LEFT", "KC_DOWN", "KC_UP" , "KC_RGHT", "XXXXXXX", + "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10" , "KC_F11" , "KC_F12" , "_______", "_______", "KC_PLUS", "KC_MINS", "KC_EQL" , "KC_LBRC", "KC_RBRC", "KC_BSLS", + "_______", "_______", "MO(3)" , "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU", + "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "XXXXXXX", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______" + ] + ], + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}] + ] +} diff --git a/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md new file mode 100644 index 0000000000..d186641d1c --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/keymaps/default/readme.md @@ -0,0 +1,88 @@ +# Halcyon Lily58's Default Keymap +_This keymap is a copy of the [Lily58 default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/lily58/keymaps/default), with slight modifications._ + +A simple default keymap for the Halcyon Lily58 +============================================= + +Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box. + +What do all these layers do? +---------------------------- + +### Layer 0: Base layer + +![Layer 0](https://i.imgur.com/sq8Rql7h.png) + +This is where your basic letters live. + +The homing thumb fingers are used to access the different layers. + +* The homing left thumb finger gives access to the Symbols (or lower) layer +* The homing right thumb finger gives access to the Navigation (or raise) layer +* Pressing both homing thumb fingers gives access to the Adjust layer + +### Layer 1: Lower + +![Layer 1](https://i.imgur.com/baSE2OJh.png) + +The Lower layer gives access to the F keys on the second row, and shifted number keys on the home row. It also provides some shifted symbol keys. + +### Layer 2: Raise + +![Layer 2](https://i.imgur.com/CRnDa6Nh.png) + +The Raise layer gives access the arrow keys on the right hand, in addition to some unshifted symbols. The left hand provides an alternative set of F keys, while the second row provides an alternative set of number keys. + +### Layer 3: Adjust + +![Layer 3](https://i.imgur.com/QbCiTcyh.png) + +The Adjust layer exposes RGB adjustment keys on the right hand. + +Where is the keymap.c? +---------------------- + +The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system. + +This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface. + +How do I edit and update the keymap? +------------------------------------ + +The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard. + +To edit it, you may: +* Edit it directly from a text editor. +* Edit it from the QMK Configurator. + +If you decide to use the latter workflow, here are the steps to follow: + +* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/lily58/rev2/LAYOUT), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it). +* Browse to the location of your keymap (for example, `/keyboards/splitkb/halcyon/lily58/keymaps/default/keymap.json`) +* Perform any modification to the keymap in the web UI +* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it) +* Replace your original keymap with the one you just downloaded + +_**Note:** At the time of writing (the 24th of October 2022), not every feature used in the default keymap is supported by the QMK Configurator. You cannot yet upload the default `keymap.json` due to a file format mismatch - use the "Load Default" button to load the default keymap instead. Additionally, custom configuration options are still being worked on: if your keymap depends on them, please compile your firmware offline for now._ + +I want to do more than the JSON format supports! +------------------------------------------------- + +While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour. + +To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation. + +First, from the root of your qmk repo, move to your keymap folder + +```bash +cd ./keyboards/splitkb/halcyon/lily58/keymaps/my_personal_keymap +``` + +Next, convert your `keymap.json` to a `keymap.c` + +```bash +qmk json2c -o keymap.c keymap.json +``` + +You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both! +**If a JSON file is present, the C file is ignored.** diff --git a/keyboards/splitkb/halcyon/lily58/readme.md b/keyboards/splitkb/halcyon/lily58/readme.md new file mode 100755 index 0000000000..ec200fda15 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/readme.md @@ -0,0 +1,31 @@ +# Halcyon Lily58 + +![splitkb/halcyon/lily58](https://i.imgur.com/q7VIrbz.png) + +The Halcyon Lily58 rev2 is the second Lily58 revision and the fourth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights: + +- Halcyon keyboards come preassembled! You won't need a soldering iron. +- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules. +- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases. +- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C. +- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO! +- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing. + +* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com) +* Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/halcyon/lily58/rev2:default + +The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive. + +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: + +* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port. +* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. diff --git a/keyboards/splitkb/halcyon/lily58/rev2/config.h b/keyboards/splitkb/halcyon/lily58/rev2/config.h new file mode 100755 index 0000000000..b5cd6f95f2 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/rev2/config.h @@ -0,0 +1,32 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP28 // USART TX pin +#define SERIAL_USART_RX_PIN GP29 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + +// VBUS detection +#define USB_VBUS_PIN GP1 + +//// VIK + +// GPIO1 = GP27 +// GPIO2 = GP26 +// CS = GP13 + +#define I2C_DRIVER I2C0 +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP14 +#define SPI_MOSI_PIN GP15 +#define SPI_MISO_PIN GP12 diff --git a/keyboards/splitkb/halcyon/lily58/rev2/halconf.h b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h new file mode 100644 index 0000000000..a6937ddf9d --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/rev2/halconf.h @@ -0,0 +1,11 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//// VIK + +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json new file mode 100755 index 0000000000..76bb538388 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/rev2/keyboard.json @@ -0,0 +1,170 @@ +{ + "keyboard_name": "Halcyon Lily58 rev2", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP23", "pin_b": "GP22", "resolution": 2} + ] + }, + "features": { + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP8", "GP11", "GP7", "GP6", "GP5", "GP10"], + "rows": ["GP19", "GP20", "GP25", "GP4", "GP9"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"x": 51, "y": 13, "flags": 2}, + {"x": 22, "y": 18, "flags": 2}, + {"x": 22, "y": 53, "flags": 2}, + {"x": 58, "y": 60, "flags": 2}, + {"x": 87, "y": 56, "flags": 2}, + {"matrix": [0, 0], "x": 0, "y": 8, "flags": 4}, + {"matrix": [0, 1], "x": 14, "y": 6, "flags": 4}, + {"matrix": [0, 2], "x": 29, "y": 2, "flags": 4}, + {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 58, "y": 2, "flags": 4}, + {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 23, "flags": 4}, + {"matrix": [1, 1], "x": 14, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 29, "y": 17, "flags": 4}, + {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 58, "y": 17, "flags": 4}, + {"matrix": [1, 5], "x": 72, "y": 19, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 38, "flags": 4}, + {"matrix": [2, 1], "x": 14, "y": 36, "flags": 4}, + {"matrix": [2, 2], "x": 29, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4}, + {"matrix": [2, 4], "x": 58, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 34, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 53, "flags": 4}, + {"matrix": [3, 1], "x": 14, "y": 51, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 47, "flags": 4}, + {"matrix": [3, 3], "x": 43, "y": 45, "flags": 4}, + {"matrix": [3, 4], "x": 58, "y": 47, "flags": 4}, + {"matrix": [3, 5], "x": 72, "y": 49, "flags": 4}, + {"matrix": [4, 1], "x": 87, "y": 41, "flags": 4}, + {"matrix": [4, 2], "x": 36, "y": 62, "flags": 4}, + {"matrix": [4, 3], "x": 51, "y": 62, "flags": 4}, + {"matrix": [4, 4], "x": 65, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 87, "y": 64, "flags": 4}, + {"x": 173, "y": 13, "flags": 2}, + {"x": 202, "y": 18, "flags": 2}, + {"x": 202, "y": 53, "flags": 2}, + {"x": 166, "y": 60, "flags": 2}, + {"x": 137, "y": 56, "flags": 2}, + {"matrix": [5, 5], "x": 152, "y": 4, "flags": 4}, + {"matrix": [5, 4], "x": 166, "y": 2, "flags": 4}, + {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 195, "y": 2, "flags": 4}, + {"matrix": [5, 1], "x": 210, "y": 6, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 8, "flags": 4}, + {"matrix": [6, 5], "x": 152, "y": 19, "flags": 4}, + {"matrix": [6, 4], "x": 166, "y": 17, "flags": 4}, + {"matrix": [6, 3], "x": 181, "y": 15, "flags": 4}, + {"matrix": [6, 2], "x": 195, "y": 17, "flags": 4}, + {"matrix": [6, 1], "x": 210, "y": 21, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 23, "flags": 4}, + {"matrix": [7, 5], "x": 152, "y": 34, "flags": 4}, + {"matrix": [7, 4], "x": 166, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 181, "y": 30, "flags": 4}, + {"matrix": [7, 2], "x": 195, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 210, "y": 36, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 38, "flags": 4}, + {"matrix": [9, 1], "x": 137, "y": 41, "flags": 4}, + {"matrix": [8, 5], "x": 152, "y": 49, "flags": 4}, + {"matrix": [8, 4], "x": 166, "y": 47, "flags": 4}, + {"matrix": [8, 3], "x": 181, "y": 45, "flags": 4}, + {"matrix": [8, 2], "x": 195, "y": 47, "flags": 4}, + {"matrix": [8, 1], "x": 210, "y": 51, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 53, "flags": 4}, + {"matrix": [9, 5], "x": 137, "y": 64, "flags": 4}, + {"matrix": [9, 4], "x": 159, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 173, "y": 62, "flags": 4}, + {"matrix": [9, 2], "x": 188, "y": 62, "flags": 4} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [34, 34] + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP24" + }, + "matrix_pins": { + "right": { + "cols": ["GP4", "GP9", "GP10", "GP5", "GP6", "GP8"], + "rows": ["GP19", "GP20", "GP25", "GP7", "GP11"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "pid": "0xEA1D" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP3" + } +} diff --git a/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h new file mode 100644 index 0000000000..126697a4a0 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/rev2/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +//// VIK + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE diff --git a/keyboards/splitkb/halcyon/lily58/rev2/rev2.c b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c new file mode 100644 index 0000000000..e0a64ae9a4 --- /dev/null +++ b/keyboards/splitkb/halcyon/lily58/rev2/rev2.c @@ -0,0 +1,28 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + if (index == 0) { + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} +#endif From 319844407c9ba04d985ce5600f7575ca77fd3886 Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Sun, 8 Jun 2025 19:24:54 +0200 Subject: [PATCH 422/592] [Keyboard] Add splitkb.com's Halcyon Ferris rev1 (#25145) Co-authored-by: Thomas Baart --- keyboards/splitkb/halcyon/ferris/info.json | 52 +++++++ .../ferris/keymaps/default/keymap.json | 69 +++++++++ .../halcyon/ferris/keymaps/default/readme.md | 142 ++++++++++++++++++ keyboards/splitkb/halcyon/ferris/readme.md | 31 ++++ .../splitkb/halcyon/ferris/rev1/config.h | 32 ++++ .../splitkb/halcyon/ferris/rev1/halconf.h | 11 ++ .../splitkb/halcyon/ferris/rev1/keyboard.json | 142 ++++++++++++++++++ .../splitkb/halcyon/ferris/rev1/mcuconf.h | 14 ++ 8 files changed, 493 insertions(+) create mode 100755 keyboards/splitkb/halcyon/ferris/info.json create mode 100644 keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json create mode 100644 keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md create mode 100755 keyboards/splitkb/halcyon/ferris/readme.md create mode 100755 keyboards/splitkb/halcyon/ferris/rev1/config.h create mode 100644 keyboards/splitkb/halcyon/ferris/rev1/halconf.h create mode 100755 keyboards/splitkb/halcyon/ferris/rev1/keyboard.json create mode 100644 keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h diff --git a/keyboards/splitkb/halcyon/ferris/info.json b/keyboards/splitkb/halcyon/ferris/info.json new file mode 100755 index 0000000000..66d69f717c --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/info.json @@ -0,0 +1,52 @@ +{ + "manufacturer": "splitkb.com", + "maintainer": "splitkb.com", + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x5_2" + }, + "layouts": { + "LAYOUT_split_3x5_2": { + "layout": [ + {"label": "L01", "matrix": [0, 4], "x": 0, "y": 0.93}, + {"label": "L02", "matrix": [0, 3], "x": 1, "y": 0.31}, + {"label": "L03", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "L04", "matrix": [0, 1], "x": 3, "y": 0.28}, + {"label": "L05", "matrix": [0, 0], "x": 4, "y": 0.42}, + {"label": "R05", "matrix": [4, 0], "x": 7, "y": 0.42}, + {"label": "R04", "matrix": [4, 1], "x": 8, "y": 0.28}, + {"label": "R03", "matrix": [4, 2], "x": 9, "y": 0}, + {"label": "R02", "matrix": [4, 3], "x": 10, "y": 0.31}, + {"label": "R01", "matrix": [4, 4], "x": 11, "y": 0.93}, + {"label": "L06", "matrix": [1, 4], "x": 0, "y": 1.93}, + {"label": "L07", "matrix": [1, 3], "x": 1, "y": 1.31}, + {"label": "L08", "matrix": [1, 2], "x": 2, "y": 1}, + {"label": "L09", "matrix": [1, 1], "x": 3, "y": 1.28}, + {"label": "L10", "matrix": [1, 0], "x": 4, "y": 1.42}, + {"label": "R10", "matrix": [5, 0], "x": 7, "y": 1.42}, + {"label": "R09", "matrix": [5, 1], "x": 8, "y": 1.28}, + {"label": "R08", "matrix": [5, 2], "x": 9, "y": 1}, + {"label": "R07", "matrix": [5, 3], "x": 10, "y": 1.31}, + {"label": "R06", "matrix": [5, 4], "x": 11, "y": 1.93}, + {"label": "L11", "matrix": [2, 4], "x": 0, "y": 2.93}, + {"label": "L12", "matrix": [2, 3], "x": 1, "y": 2.31}, + {"label": "L13", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "L14", "matrix": [2, 1], "x": 3, "y": 2.28}, + {"label": "L15", "matrix": [2, 0], "x": 4, "y": 2.42}, + {"label": "R15", "matrix": [6, 0], "x": 7, "y": 2.42}, + {"label": "R14", "matrix": [6, 1], "x": 8, "y": 2.28}, + {"label": "R13", "matrix": [6, 2], "x": 9, "y": 2}, + {"label": "R12", "matrix": [6, 3], "x": 10, "y": 2.31}, + {"label": "R11", "matrix": [6, 4], "x": 11, "y": 2.93}, + {"label": "L16", "matrix": [3, 1], "x": 3.5, "y": 3.75}, + {"label": "L17", "matrix": [3, 0], "x": 4.5, "y": 4}, + {"label": "R17", "matrix": [7, 0], "x": 6.5, "y": 4}, + {"label": "R16", "matrix": [7, 1], "x": 7.5, "y": 3.75} + ] + } + } +} diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json new file mode 100644 index 0000000000..95748c743f --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json @@ -0,0 +1,69 @@ +{ + "keyboard": "splitkb/halcyon/ferris/rev1", + "keymap": "default", + "version": 1, + "layout": "LAYOUT", + "layers": [ + [ + "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P", + "LSFT_T(KC_A)", "LT(5,KC_S)" , "LT(1,KC_D)" , "LT(3,KC_F)" , "KC_G" , "KC_H" , "LT(4,KC_J)" , "LT(2,KC_K)" , "LT(6,KC_L)" , "LSFT_T(KC_SCLN)", + "KC_Z" , "LCTL_T(KC_X)", "LALT_T(KC_C)" , "KC_V" , "KC_B" , "KC_N" , "KC_M" , "LALT_T(KC_COMM)", "LCTL_T(KC_DOT)", "KC_SLSH", + "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1" + ], + [ + "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", + "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", + "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" + ], + [ + "KC_TRNS" , "KC_TRNS" , "KC_PGUP" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_LEFT" , "KC_UP" , "KC_DOWN" , "KC_RGHT" , "KC_TRNS" , "KC_TRNS" , "KC_LGUI" , "KC_NO" , "LCTL(KC_LALT)" , "LCA(KC_LSFT)", + "KC_TRNS" , "KC_HOME" , "KC_PGDN" , "KC_END" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" + ], + [ + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_UNDS" , "KC_PIPE" , "KC_QUOT" , "KC_TRNS", + "KC_CIRC" , "KC_ASTR" , "KC_AMPR" , "KC_NO" , "KC_TRNS" , "KC_HASH" , "KC_TILD" , "KC_SLSH" , "KC_DQUO" , "KC_DLR", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_MINS" , "KC_BSLS" , "KC_GRV" , "KC_TRNS", + "RM_PREV" , "KC_TRNS" , "KC_TRNS" , "RM_NEXT" + ], + [ + "KC_TRNS" , "KC_COLN" , "KC_LT" , "KC_GT" , "KC_SCLN" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_LCBR" , "KC_RCBR" , "KC_LPRN" , "KC_RPRN" , "KC_AT" , "KC_TRNS" , "KC_NO" , "KC_EQL" , "KC_PLUS" , "KC_PERC", + "KC_TRNS" , "KC_EXLM" , "KC_LBRC" , "KC_RBRC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_VOLD" , "KC_TRNS" , "KC_TRNS" , "KC_VOLU" + ], + [ + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F7" , "KC_F8" , "KC_F9" , "KC_F10", + "KC_TRNS" , "KC_NO" , "LCTL(KC_LALT)" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F4" , "KC_F5" , "KC_F6" , "KC_F11", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_F1" , "KC_F2" , "KC_F3" , "KC_F12", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" + ], + [ + "KC_PSLS" , "KC_7" , "KC_8" , "KC_9" , "KC_PPLS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_0" , "KC_1" , "KC_2" , "KC_3" , "KC_PMNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_NO" , "KC_TRNS", + "KC_PAST" , "KC_4" , "KC_5" , "KC_6" , "KC_PEQL" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" + ], + [ + "KC_TRNS" , "KC_TRNS" , "KC_COLN" , "KC_ESC" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_DEL", + "KC_TRNS" , "KC_PERC" , "KC_SLSH" , "KC_ENT" , "KC_TRNS" , "DF(1)" , "KC_LGUI" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", + "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_EXLM" , "KC_TRNS" , "DF(0)" , "KC_TRNS" , "RALT_T(KC_COMM)", "RCTL_T(KC_DOT)", "QK_BOOT", + "KC_TRNS" , "KC_TAB" , "KC_NO" , "KC_TRNS" + ] + ], + "config": { + "mousekey": { + "interval": 16, + "time_to_max": 40, + "delay": 100, + "wheel_delay": 100 + }, + "tapping": { + "term": 200, + "permissive_hold": true, + "force_hold": true + } + } +} diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md new file mode 100644 index 0000000000..dcdc6b3aa1 --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/readme.md @@ -0,0 +1,142 @@ +# Halcyon Ferris's Default Keymap +_This keymap is a copy of the [Ferris default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ferris/keymaps/default), with the addition of RGB modifier keys._ + +A usable default keymap for the Ferris keyboard +=============================================== + +Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. + +This keymap makes heavy use of keys behaving differently when tapped and held, so that all the keys one may need remain accessible despite the low number of thumb keys. + +It comes with a number of layers to give access to most of the keys one may need on a keyboard. It is not meant to be the best possible keymap, but rather a good base on which to build a keymap that works for you. + +This is not the only way to make 34 keys a comfortable typing experience, but it is one way to do so. If you don't already know of a better way, this may be as good a starting point as any :) + +Note that this keymap was built from the perspective that it is OK to take a steep learning curve if it results in a keymap that is easier to use in the long run. This means that it may take more effort to learn this keymap than some alternatives. "Easy to use" was assessed against the workflow of the author, so your mileage may vary on some of the details. + +What do all these layers do? +---------------------------- + +### Layer 0: Base layer + +![Layer 0](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer0.png) + +On tapping the keys, our base layer is qwerty with space on the right homing thumb and backspace on the left homing thumb. + +In this layer, the non-homing-thumb positions have 0 and 1. I recommend modifying this to some frequently accessed shortcut such as copy/paste, previous/next tab or anything that makes most sense in your own workflow. O and 1 are place-holders and make it easy to troubleshoot that all keys are working properly before soldering in the switches. +The reason I recommend convenience shortcuts instead of more commonly used keys like tab or meta is that unhoming of the thumbs was a frequent source of typos for me when I used more than one thumb key frequently in the context of typing. + +Despite being missing on this layer, "meta", "tab", "esc" and such are accessible from any other layer: see Layer 7. + +The behaviour of some keys differ when held: +* Both homing pinkies behave as shift. +* Both bottom-row ring fingers behave as ctrl. +* Both bottom-row middle fingers behave as alt. + +* The homing left ring finger gives access to the Function keys layer +* The homing right ring finger gives access to the Numbers layer +* The homing left middle finger gives access to the Mouse layer +* The homing right middle finger gives access to the Navigation layer +* The homing left index finger gives access to the Right symbols layer +* The homing right index finger gives access to the Left symbols layer +* The homing right thumb gives access to the Always accessible layer + +### Layer 1: Mouse + +![Layer 1](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer1.png) + +Layer 1 is a mouse layer: it can be used one-handed or two-handed. The most common way to use it is two handed, with left and right click on the homerow of the left hand and directions on the homerow of the right hand. +Scrolling is available on the right hand with mid finger up and down for vertical scroll and index and ring finger down for horizontal scroll. +On the right hand, left click and right click are also available with index and ring finger up to allow one handed operation. This can be particularly handy when enabling the mouse layer permanently (no need to hold the left middle finger), which can be done from Layer 7. + +**Addition**: The Halcyon Ferris allows the RGB settings to be modified on this layer. This is an extra feature over the default Ferris keymap. + +### Layer 2: Navigation + +![Layer 2](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer2.png) + +The navigation layer somewhat mirrors the mouse layer. It is accessed by holding the right middle finger and gives access to arrow keys on the left homerow. Page up and down, Home and End mirror the vertical scrolling and horizontal scrolling on the mouse layer. + +On the right hand, in addition to ctrl and alt which are available through transparency, ctrl + alt, ctrl + alt + shift and meta are accessible on the homerow to enable common shortcuts in some window managers. This part is quite workflow dependent, so make sure to adapt it to your own workflow as appropriate. + +### Layer 3: Right symbols + +![Layer 3](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer3.png) + +When holding down the left index, one may access about half of the symbols. The pinkies store `^` and `$` symbols that represent begin and end in vim. The left homerow hosts `*` and `&`, symbols which are related in the way that they represent some form of indirection in programming languages such as rust. On the right hand, most symbols used when navigating the command line are stored together, organized by columns of related symbols. + +### Layer 4: Left symbols + +![Layer 4](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer4.png) + +When holding down the right index, one may access the other symbols. On the left hand, most of the different brackets are laid out. The most frequent ones (round brackets and curly brackets) get a spot on the homerow. The rest of the layer hosts the remaining symbols that are easier to access here than on any other layers. + +### Layer 5: Function keys + +![Layer 5](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer5.png) + +By holding down the left ring finger, one may access the function keys, roughly in a numpad layout. +This means that alt+F4 is easy to type, with F4 being on the homerow. +There is a shortcut for ctrl+alt on the left hand to enable convenient switching between virtual terminals on Linux. + +### Layer 6: Numbers + +![Layer 6](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer6.png) + +The number layer is accessed by holding the right ring finger. It hosts the numbers and some duplicated symbols that are commonly accessed next to numbers, such as mathematical operators. +The number are layed out similarly to a numpad, but with the middle row and the homerow swapped so that the most used numbers: 0, 1, 2 and 3 are all available in homing positions. + +### Layer 7: Always accessible + +![Layer 7](https://raw.githubusercontent.com/splitkb/qmk_firmware/assets/aurora/sweep/keymaps/default/layer7.png) + +Layer 7 is accessed by holding the right homing thumb down. Because this position is left transparent from every other layer, this layer is always accessible. +It gives access to some essential keys that would typically be accessed on a thumb cluster or pinkies, such as meta, enter, tab, esc and delete. + +As the layer hosting esc, we duplicated some symbols here to allow for fast navigation in vim. For instance, esc, :, w, q can be done in a single roll. + +Where is the keymap.c? +---------------------- + +The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system. + +This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface. + +How do I edit and update the keymap? +------------------------------------ + +The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard. + +To edit it, you may: +* Edit it directly from a text editor. +* Edit it from the QMK Configurator. + +If you decide to use the latter workflow, here are the steps to follow: + +* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/ferris/rev1/LAYOUT_split_3x5_2), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it). +* Browse to the location of your keymap (for example, `/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json`) +* Perform any modification to the keymap in the web UI +* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it) +* Replace your original keymap with the one you just downloaded + +I want to do more than the JSON format supports! +------------------------------------------------- + +While the `json` format is easy to use, it does lack certain functionality. + +To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation. + +First, from the root of your qmk repo, move to your keymap folder + +```bash +cd ./keyboards/splitkb/halcyon/ferris/keymaps/my_personal_keymap +``` + +Next, convert your `keymap.json` to a `keymap.c` + +```bash +qmk json2c -o keymap.c keymap.json +``` + +You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both! +**If a JSON file is present, the C file is ignored.** diff --git a/keyboards/splitkb/halcyon/ferris/readme.md b/keyboards/splitkb/halcyon/ferris/readme.md new file mode 100755 index 0000000000..c19a8b16db --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/readme.md @@ -0,0 +1,31 @@ +# Halcyon Ferris + +![splitkb/halcyon/ferris](https://i.imgur.com/TlgU8iR.png) + +The Halcyon Ferris rev1 is the first Ferris revision and the fifth keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights: + +- Halcyon keyboards come preassembled! You won't need a soldering iron. +- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules. +- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases. +- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C. +- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO! +- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing. + +* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com) +* Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/halcyon/ferris/rev1:default + +The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive. + +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: + +* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port. +* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. diff --git a/keyboards/splitkb/halcyon/ferris/rev1/config.h b/keyboards/splitkb/halcyon/ferris/rev1/config.h new file mode 100755 index 0000000000..b5cd6f95f2 --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/rev1/config.h @@ -0,0 +1,32 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP28 // USART TX pin +#define SERIAL_USART_RX_PIN GP29 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + +// VBUS detection +#define USB_VBUS_PIN GP1 + +//// VIK + +// GPIO1 = GP27 +// GPIO2 = GP26 +// CS = GP13 + +#define I2C_DRIVER I2C0 +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP14 +#define SPI_MOSI_PIN GP15 +#define SPI_MISO_PIN GP12 diff --git a/keyboards/splitkb/halcyon/ferris/rev1/halconf.h b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h new file mode 100644 index 0000000000..a6937ddf9d --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/rev1/halconf.h @@ -0,0 +1,11 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//// VIK + +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json new file mode 100755 index 0000000000..4cd0b23f4c --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/rev1/keyboard.json @@ -0,0 +1,142 @@ +{ + "keyboard_name": "Halcyon Ferris rev1", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP8", "GP6", "GP5", "GP9", "GP4"], + "rows": ["GP10", "GP25", "GP7", "GP11"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"flags": 2, "x": 71, "y": 15}, + {"flags": 2, "x": 51, "y": 8}, + {"flags": 2, "x": 10, "y": 13}, + {"flags": 2, "x": 10, "y": 42}, + {"flags": 2, "x": 41, "y": 45}, + {"flags": 2, "x": 76, "y": 50}, + {"flags": 4, "matrix": [0, 4], "x": 0, "y": 15}, + {"flags": 4, "matrix": [0, 3], "x": 20, "y": 5}, + {"flags": 4, "matrix": [0, 2], "x": 41, "y": 0}, + {"flags": 4, "matrix": [0, 1], "x": 61, "y": 4}, + {"flags": 4, "matrix": [0, 0], "x": 81, "y": 7}, + {"flags": 4, "matrix": [1, 4], "x": 0, "y": 31}, + {"flags": 4, "matrix": [1, 3], "x": 20, "y": 21}, + {"flags": 4, "matrix": [1, 2], "x": 41, "y": 16}, + {"flags": 4, "matrix": [1, 1], "x": 61, "y": 20}, + {"flags": 4, "matrix": [1, 0], "x": 81, "y": 23}, + {"flags": 4, "matrix": [2, 4], "x": 0, "y": 47}, + {"flags": 4, "matrix": [2, 3], "x": 20, "y": 37}, + {"flags": 4, "matrix": [2, 2], "x": 41, "y": 32}, + {"flags": 4, "matrix": [2, 1], "x": 61, "y": 36}, + {"flags": 4, "matrix": [2, 0], "x": 81, "y": 39}, + {"flags": 4, "matrix": [3, 1], "x": 71, "y": 60}, + {"flags": 4, "matrix": [3, 0], "x": 92, "y": 64}, + {"flags": 2, "x": 150, "y": 15}, + {"flags": 2, "x": 190, "y": 8}, + {"flags": 2, "x": 210, "y": 13}, + {"flags": 2, "x": 220, "y": 42}, + {"flags": 2, "x": 183, "y": 45}, + {"flags": 2, "x": 155, "y": 50}, + {"flags": 4, "matrix": [4, 0], "x": 143, "y": 7}, + {"flags": 4, "matrix": [4, 1], "x": 163, "y": 4}, + {"flags": 4, "matrix": [4, 2], "x": 183, "y": 0}, + {"flags": 4, "matrix": [4, 3], "x": 204, "y": 5}, + {"flags": 4, "matrix": [4, 4], "x": 224, "y": 15}, + {"flags": 4, "matrix": [5, 0], "x": 143, "y": 23}, + {"flags": 4, "matrix": [5, 1], "x": 163, "y": 20}, + {"flags": 4, "matrix": [5, 2], "x": 183, "y": 16}, + {"flags": 4, "matrix": [5, 3], "x": 204, "y": 21}, + {"flags": 4, "matrix": [5, 4], "x": 224, "y": 31}, + {"flags": 4, "matrix": [6, 0], "x": 143, "y": 39}, + {"flags": 4, "matrix": [6, 1], "x": 163, "y": 36}, + {"flags": 4, "matrix": [6, 2], "x": 183, "y": 32}, + {"flags": 4, "matrix": [6, 3], "x": 204, "y": 37}, + {"flags": 4, "matrix": [6, 4], "x": 224, "y": 47}, + {"flags": 4, "matrix": [7, 0], "x": 132, "y": 64}, + {"flags": 4, "matrix": [7, 1], "x": 153, "y": 60} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [23, 23] + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP20" + }, + "matrix_pins": { + "right": { + "cols": ["GP8", "GP25", "GP7", "GP4", "GP9"], + "rows": ["GP6", "GP5", "GP10", "GP11"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "pid": "0xE050" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP3" + } +} diff --git a/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h new file mode 100644 index 0000000000..126697a4a0 --- /dev/null +++ b/keyboards/splitkb/halcyon/ferris/rev1/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +//// VIK + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE From 1a54ecf2468456713d26d7e0747aee7a2c5a1edc Mon Sep 17 00:00:00 2001 From: VeyPatch <126267034+VeyPatch@users.noreply.github.com> Date: Mon, 9 Jun 2025 03:43:31 +0200 Subject: [PATCH 423/592] [Keyboard] Add splitkb.com's Halcyon Corne rev2 (#25143) Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com> --- keyboards/splitkb/halcyon/corne/info.json | 60 +++++++ .../halcyon/corne/keymaps/default/keymap.json | 43 +++++ .../halcyon/corne/keymaps/default/readme.md | 87 ++++++++++ keyboards/splitkb/halcyon/corne/readme.md | 31 ++++ keyboards/splitkb/halcyon/corne/rev2/config.h | 32 ++++ .../splitkb/halcyon/corne/rev2/halconf.h | 11 ++ .../splitkb/halcyon/corne/rev2/keyboard.json | 156 ++++++++++++++++++ .../splitkb/halcyon/corne/rev2/mcuconf.h | 14 ++ keyboards/splitkb/halcyon/corne/rev2/rev2.c | 28 ++++ 9 files changed, 462 insertions(+) create mode 100755 keyboards/splitkb/halcyon/corne/info.json create mode 100644 keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json create mode 100755 keyboards/splitkb/halcyon/corne/keymaps/default/readme.md create mode 100755 keyboards/splitkb/halcyon/corne/readme.md create mode 100755 keyboards/splitkb/halcyon/corne/rev2/config.h create mode 100644 keyboards/splitkb/halcyon/corne/rev2/halconf.h create mode 100755 keyboards/splitkb/halcyon/corne/rev2/keyboard.json create mode 100644 keyboards/splitkb/halcyon/corne/rev2/mcuconf.h create mode 100644 keyboards/splitkb/halcyon/corne/rev2/rev2.c diff --git a/keyboards/splitkb/halcyon/corne/info.json b/keyboards/splitkb/halcyon/corne/info.json new file mode 100755 index 0000000000..8b3325910d --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/info.json @@ -0,0 +1,60 @@ +{ + "manufacturer": "splitkb.com", + "maintainer": "splitkb.com", + "url": "https://splitkb.com", + "usb": { + "device_version": "1.0.0", + "vid": "0x8D1D" + }, + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x6_3" + }, + "layouts": { + "LAYOUT_split_3x6_3": { + "layout": [ + {"label": "L06", "matrix": [0, 0], "x": 0, "y": 0.3}, + {"label": "L05", "matrix": [0, 1], "x": 1, "y": 0.3}, + {"label": "L04", "matrix": [0, 2], "x": 2, "y": 0.1}, + {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "L02", "matrix": [0, 4], "x": 4, "y": 0.1}, + {"label": "L01", "matrix": [0, 5], "x": 5, "y": 0.2}, + {"label": "R01", "matrix": [4, 5], "x": 9, "y": 0.2}, + {"label": "R02", "matrix": [4, 4], "x": 10, "y": 0.1}, + {"label": "R03", "matrix": [4, 3], "x": 11, "y": 0}, + {"label": "R04", "matrix": [4, 2], "x": 12, "y": 0.1}, + {"label": "R05", "matrix": [4, 1], "x": 13, "y": 0.3}, + {"label": "R06", "matrix": [4, 0], "x": 14, "y": 0.3}, + {"label": "L12", "matrix": [1, 0], "x": 0, "y": 1.3}, + {"label": "L11", "matrix": [1, 1], "x": 1, "y": 1.3}, + {"label": "L10", "matrix": [1, 2], "x": 2, "y": 1.1}, + {"label": "L09", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "L08", "matrix": [1, 4], "x": 4, "y": 1.1}, + {"label": "L07", "matrix": [1, 5], "x": 5, "y": 1.2}, + {"label": "R07", "matrix": [5, 5], "x": 9, "y": 1.2}, + {"label": "R08", "matrix": [5, 4], "x": 10, "y": 1.1}, + {"label": "R09", "matrix": [5, 3], "x": 11, "y": 1}, + {"label": "R10", "matrix": [5, 2], "x": 12, "y": 1.1}, + {"label": "R11", "matrix": [5, 1], "x": 13, "y": 1.3}, + {"label": "R12", "matrix": [5, 0], "x": 14, "y": 1.3}, + {"label": "L18", "matrix": [2, 0], "x": 0, "y": 2.3}, + {"label": "L17", "matrix": [2, 1], "x": 1, "y": 2.3}, + {"label": "L16", "matrix": [2, 2], "x": 2, "y": 2.1}, + {"label": "L15", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "L14", "matrix": [2, 4], "x": 4, "y": 2.1}, + {"label": "L13", "matrix": [2, 5], "x": 5, "y": 2.2}, + {"label": "R13", "matrix": [6, 5], "x": 9, "y": 2.2}, + {"label": "R14", "matrix": [6, 4], "x": 10, "y": 2.1}, + {"label": "R15", "matrix": [6, 3], "x": 11, "y": 2}, + {"label": "R16", "matrix": [6, 2], "x": 12, "y": 2.1}, + {"label": "R17", "matrix": [6, 1], "x": 13, "y": 2.3}, + {"label": "R18", "matrix": [6, 0], "x": 14, "y": 2.3}, + {"label": "L21", "matrix": [3, 3], "x": 4, "y": 3.7}, + {"label": "L20", "matrix": [3, 4], "x": 5, "y": 3.7}, + {"label": "L19", "matrix": [3, 5], "w": 1.5, "x": 6, "y": 3.2}, + {"label": "R19", "matrix": [7, 5], "w": 1.5, "x": 8, "y": 3.2}, + {"label": "R20", "matrix": [7, 4], "x": 9, "y": 3.7}, + {"label": "R21", "matrix": [7, 3], "x": 10, "y": 3.7} + ] + } + } +} diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json new file mode 100644 index 0000000000..ab42d0731c --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json @@ -0,0 +1,43 @@ +{ + "keyboard": "splitkb/halcyon/corne/rev2", + "keymap": "default", + "version": 1, + "layout": "LAYOUT_split_3x6_3", + "layers": [ + [ + "KC_TAB" , "KC_Q" , "KC_W" , "KC_E" , "KC_R" , "KC_T" , "KC_Y" , "KC_U" , "KC_I" , "KC_O" , "KC_P" , "KC_BSPC" , + "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_ESC" , + "KC_LGUI" , "MO(1)" , "KC_SPC" , "KC_ENT" , "MO(2)" , "KC_RALT" + ], + [ + "KC_TAB" , "KC_1" , "KC_2" , "KC_3" , "KC_4" , "KC_5" , "KC_6" , "KC_7" , "KC_8" , "KC_9" , "KC_0" , "KC_BSPC" , + "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_LEFT" , "KC_DOWN" , "KC_UP" , "KC_RIGHT", "XXXXXXX" , "XXXXXXX" , + "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "MO(3)" , "KC_RALT" + ], + [ + "KC_TAB" , "KC_EXLM" , "KC_AT" , "KC_HASH" , "KC_DLR" , "KC_PERC" , "KC_CIRC" , "KC_AMPR" , "KC_ASTR" , "KC_LPRN" , "KC_RPRN" , "KC_BSPC" , + "KC_LCTL" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_MINS" , "KC_EQL" , "KC_LBRC" , "KC_RBRC" , "KC_BSLS" , "KC_GRV" , + "KC_LSFT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "KC_UNDS" , "KC_PLUS" , "KC_LCBR" , "KC_RCBR" , "KC_PIPE" , "KC_TILD" , + "KC_LGUI" , "MO(3)" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT" + ], + [ + "QK_BOOT" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "RM_TOGG" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "RM_NEXT" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , "XXXXXXX" , + "KC_LGUI" , "_______" , "KC_SPC" , "KC_ENT" , "_______" , "KC_RALT" + ] + ], + "config": { + "features": { + "encoder_map": true + } + }, + "encoders": [ + [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}] + ] +} diff --git a/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md new file mode 100755 index 0000000000..8e44629494 --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/keymaps/default/readme.md @@ -0,0 +1,87 @@ +# Halcyon Corne's Default Keymap +_This keymap is a copy of the [Corne default keymap](https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd/keymaps/default)_ + +A simple default keymap for the Halcyon Corne +============================================ + +Keymaps in general are quite personal, so it is difficult to come up with a default that will suit every user. We hope this keymap serves as a good starting point for your own - although it should be fairly usable out-of-the-box. + +What do all these layers do? +---------------------------- + +### Layer 0: Base layer + +![Layer 0](https://i.imgur.com/Ri5cTHqh.png) + +This is where your basic letters live. + +The homing thumb fingers are used to access the different layers. + +* The homing left thumb finger gives access to the Numbers (or lower) layer +* The homing right thumb finger gives access to the Symbols (or raise) layer +* Pressing both homing thumb fingers gives access to the Adjust layer + +### Layer 1: Lower + +![Layer 1](https://i.imgur.com/9h6ZRQLh.png) + +The Lower layer gives access to your number keys on the top row. It also exposes the arrow keys in the usual Vim-style layout. + +### Layer 2: Raise + +![Layer 2](https://i.imgur.com/U1pf7pJh.png) + +The Raise layer gives access to the symbols. In addition to shifted number keys on the top row, the right hand also exposes the remaining symbol keys, both as shifted and non-shifted variants. + +### Layer 3: Adjust + +![Layer 3](https://i.imgur.com/A6z1DCbh.png) + +The Adjust layer exposes RGB adjustment keys on the left hand. + +Where is the keymap.c? +---------------------- + +The keymap.c file is not published to the repository. It is generated from `keymap.json` by the build system. + +This avoids duplicating information and allow users to edit their keymap from the QMK Configurator web interface. + +How do I edit and update the keymap? +------------------------------------ + +The `keymap.json` file is generated from the QMK Configurator interface and formatted for better readability in the context of the Ferris keyboard. + +To edit it, you may: +* Edit it directly from a text editor. +* Edit it from the QMK Configurator. + +If you decide to use the latter workflow, here are the steps to follow: + +* From the [QMK Configurator](https://config.qmk.fm/#/splitkb/halcyon/corne/rev2/LAYOUT_split_3x5_3), hit the "import QMK keymap json file" button (it has a drawing with an up arrow on it). +* Browse to the location of your keymap (for example, `/keyboards/splitkb/halcyon/corne/keymaps/default/keymap.json`) +* Perform any modification to the keymap in the web UI +* Export the keymap to your downloads folder, by hitting the "Export QMK keymap json file" button (it has a drawing with a down arrow on it) +* Replace your original keymap with the one you just downloaded + +I want to do more than the JSON format supports! +------------------------------------------------- + +While the `json` format is easy to use, it does lack certain functionality - most notably custom OLED or encoder behaviour. + +To add this, you need to convert it to the `c` format. Do keep in mind that this is generally a one-way operation. + +First, from the root of your qmk repo, move to your keymap folder + +```bash +cd ./keyboards/splitkb/halcyon/corne/keymaps/my_personal_keymap +``` + +Next, convert your `keymap.json` to a `keymap.c` + +```bash +qmk json2c -o keymap.c keymap.json +``` + + +You can add custom C code to the newly generated `keymap.c` file. Do note that you have to use **either** a C file **or** a JSON file - you cannot do both! +**If a JSON file is present, the C file is ignored.** diff --git a/keyboards/splitkb/halcyon/corne/readme.md b/keyboards/splitkb/halcyon/corne/readme.md new file mode 100755 index 0000000000..b859da2edd --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/readme.md @@ -0,0 +1,31 @@ +# Halcyon Corne + +![splitkb/halcyon/corne](https://i.imgur.com/Cpo2dM8.png) + +The Halcyon Corne rev2 is the second Corne revision and the third keyboard in our Halcyon range. Similar to Aurora, all keyboards in the series share the same feature set. The key highlights: + +- Halcyon keyboards come preassembled! You won't need a soldering iron. +- You'll be able to install [VIK](https://github.com/sadekbaroudi/vik) modules. +- It'll come fully documented, which includes the unboxing, assembly (with only a screwdriver), first installation and some advanced use cases. +- Both the connection to the host device as well as the interconnect between the keyboard halves use USB C. +- The controller has full ESD protection on all USB C ports, as well as all switch matrix GPIO! +- The controller is interchangable. If part of your keyboard ever breaks, we can replace just the bits that need replacing. + +* Keyboard Maintainer: [splitkb.com](https://github.com/splitkb.com) +* Hardware Availability: [splitkb.com](https://splitkb.com). + +Make example for this keyboard (after setting up your build environment): + + make splitkb/halcyon/corne/rev2:default + +The keyboard can be flashed by copying the resulting `.uf2` file onto the `RPI-RP2` flash drive. + +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: + +* **Reset button**: Double-tap the reset button at the top of the controller, right above the USB-C port. +* **Bootloader reset**: Hold down the "Boot" button and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. diff --git a/keyboards/splitkb/halcyon/corne/rev2/config.h b/keyboards/splitkb/halcyon/corne/rev2/config.h new file mode 100755 index 0000000000..b5cd6f95f2 --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/rev2/config.h @@ -0,0 +1,32 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// Make it easier to enter the bootloader +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U + +// UART1, communication between the two halves +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP28 // USART TX pin +#define SERIAL_USART_RX_PIN GP29 // USART RX pin +#define SERIAL_PIO_USE_PIO1 // Use PIO1 as PIO0 is used for WS2812 driver + +// VBUS detection +#define USB_VBUS_PIN GP1 + +//// VIK + +// GPIO1 = GP27 +// GPIO2 = GP26 +// CS = GP13 + +#define I2C_DRIVER I2C0 +#define I2C1_SDA_PIN GP16 +#define I2C1_SCL_PIN GP17 + +#define SPI_DRIVER SPID1 +#define SPI_SCK_PIN GP14 +#define SPI_MOSI_PIN GP15 +#define SPI_MISO_PIN GP12 diff --git a/keyboards/splitkb/halcyon/corne/rev2/halconf.h b/keyboards/splitkb/halcyon/corne/rev2/halconf.h new file mode 100644 index 0000000000..a6937ddf9d --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/rev2/halconf.h @@ -0,0 +1,11 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//// VIK + +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/splitkb/halcyon/corne/rev2/keyboard.json b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json new file mode 100755 index 0000000000..33e8e7a907 --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/rev2/keyboard.json @@ -0,0 +1,156 @@ +{ + "keyboard_name": "Halcyon Corne rev2", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP24", "pin_b": "GP23", "resolution": 2} + ] + }, + "features": { + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP9", "GP4", "GP7", "GP6", "GP5", "GP10"], + "rows": ["GP20", "GP25", "GP11", "GP8"] + }, + "processor": "RP2040", + "rgb_matrix": { + "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, + "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, + "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, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"x": 93, "y": 17, "flags": 2}, + {"x": 59, "y": 3, "flags": 2}, + {"x": 25, "y": 7, "flags": 2}, + {"x": 29, "y": 49, "flags": 2}, + {"x": 70, "y": 51, "flags": 2}, + {"x": 104, "y": 55, "flags": 2}, + {"matrix": [3, 2], "x": 95, "y": 63, "flags": 4}, + {"matrix": [3, 1], "x": 80, "y": 58, "flags": 4}, + {"matrix": [3, 0], "x": 60, "y": 55, "flags": 4}, + {"matrix": [2, 5], "x": 85, "y": 39, "flags": 4}, + {"matrix": [2, 4], "x": 68, "y": 37, "flags": 4}, + {"matrix": [2, 3], "x": 50, "y": 35, "flags": 4}, + {"matrix": [2, 2], "x": 33, "y": 37, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4}, + {"matrix": [1, 5], "x": 85, "y": 21, "flags": 4}, + {"matrix": [1, 4], "x": 68, "y": 19, "flags": 4}, + {"matrix": [1, 3], "x": 50, "y": 13, "flags": 4}, + {"matrix": [1, 2], "x": 33, "y": 20, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [0, 5], "x": 85, "y": 4, "flags": 4}, + {"matrix": [0, 4], "x": 68, "y": 2, "flags": 4}, + {"matrix": [0, 3], "x": 50, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 33, "y": 3, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 7, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 7, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 24, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 41, "flags": 4}, + {"x": 131, "y": 17, "flags": 2}, + {"x": 165, "y": 3, "flags": 2}, + {"x": 199, "y": 7, "flags": 2}, + {"x": 195, "y": 49, "flags": 2}, + {"x": 154, "y": 51, "flags": 2}, + {"x": 120, "y": 55, "flags": 2}, + {"matrix": [7, 2], "x": 129, "y": 63, "flags": 4}, + {"matrix": [7, 1], "x": 144, "y": 58, "flags": 4}, + {"matrix": [7, 0], "x": 164, "y": 55, "flags": 4}, + {"matrix": [6, 5], "x": 139, "y": 39, "flags": 4}, + {"matrix": [6, 4], "x": 156, "y": 37, "flags": 4}, + {"matrix": [6, 3], "x": 174, "y": 35, "flags": 4}, + {"matrix": [6, 2], "x": 191, "y": 37, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, + {"matrix": [5, 5], "x": 139, "y": 21, "flags": 4}, + {"matrix": [5, 4], "x": 156, "y": 19, "flags": 4}, + {"matrix": [5, 3], "x": 174, "y": 13, "flags": 4}, + {"matrix": [5, 2], "x": 191, "y": 20, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [4, 5], "x": 139, "y": 4, "flags": 4}, + {"matrix": [4, 4], "x": 156, "y": 2, "flags": 4}, + {"matrix": [4, 3], "x": 174, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 191, "y": 3, "flags": 4}, + {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 7, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 24, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 41, "flags": 4} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [27, 27] + }, + "split": { + "enabled": true, + "handedness": { + "pin": "GP19" + }, + "matrix_pins": { + "right": { + "cols": ["GP5", "GP9", "GP7", "GP20", "GP25", "GP4"], + "rows": ["GP6", "GP10", "GP11", "GP8"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "pid": "0x3A07" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP3" + } +} diff --git a/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h new file mode 100644 index 0000000000..126697a4a0 --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/rev2/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +//// VIK + +#undef RP_I2C_USE_I2C0 +#define RP_I2C_USE_I2C0 TRUE + +#undef RP_SPI_USE_SPI1 +#define RP_SPI_USE_SPI1 TRUE diff --git a/keyboards/splitkb/halcyon/corne/rev2/rev2.c b/keyboards/splitkb/halcyon/corne/rev2/rev2.c new file mode 100644 index 0000000000..e0a64ae9a4 --- /dev/null +++ b/keyboards/splitkb/halcyon/corne/rev2/rev2.c @@ -0,0 +1,28 @@ +// Copyright 2025 splitkb.com (support@splitkb.com) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef ENCODER_ENABLE +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { + return false; + } + if (index == 0) { + // Volume control + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + // Page up/Page down + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} +#endif From 0326355edcfd8008646d2ff2f6eca3e69fdc5738 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 9 Jun 2025 05:08:56 +0100 Subject: [PATCH 424/592] Remove `DEFAULT_FOLDER` handling (#23281) --- Makefile | 8 +++--- data/mappings/info_rules.hjson | 2 +- docs/config_options.md | 2 -- lib/python/qmk/cli/ci/validate_aliases.py | 6 +--- lib/python/qmk/cli/list/keyboards.py | 3 +- lib/python/qmk/cli/migrate.py | 4 +-- lib/python/qmk/cli/resolve_alias.py | 2 +- lib/python/qmk/info.py | 11 -------- lib/python/qmk/keyboard.py | 34 ++++++----------------- lib/python/qmk/path.py | 6 ++-- 10 files changed, 20 insertions(+), 58 deletions(-) diff --git a/Makefile b/Makefile index f1e3bf856f..5bb4f0d8eb 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ endef TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND) # As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional -# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule +# resolution of keyboard_aliases.hjson for provided rule define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB # Split on ":", padding with empty strings to avoid indexing issues TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE)) @@ -255,7 +255,7 @@ endef # if we are going to compile all keyboards, match the rest of the rule # for each of them define PARSE_ALL_KEYBOARDS - $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults))) + $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell $(QMK_BIN) list-keyboards))) endef # Prints a list of all known keymaps for the given keyboard @@ -447,7 +447,7 @@ git-submodules: git-submodule .PHONY: list-keyboards list-keyboards: - $(QMK_BIN) list-keyboards --no-resolve-defaults | tr '\n' ' ' + $(QMK_BIN) list-keyboards | tr '\n' ' ' .PHONY: list-tests list-tests: @@ -455,7 +455,7 @@ list-tests: .PHONY: generate-keyboards-file generate-keyboards-file: - $(QMK_BIN) list-keyboards --no-resolve-defaults + $(QMK_BIN) list-keyboards .PHONY: clean clean: diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 238957f170..d43d83c3ea 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -53,8 +53,8 @@ "WS2812_DRIVER": {"info_key": "ws2812.driver"}, // Items we want flagged in lint - "DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true}, "CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"}, "CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"}, + "DEFAULT_FOLDER": {"info_key": "_invalid.default_folder", "invalid": true}, "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} } diff --git a/docs/config_options.md b/docs/config_options.md index b2a2117693..91c17cf09d 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -364,8 +364,6 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i ## Build Options -* `DEFAULT_FOLDER` - * Used to specify a default folder when a keyboard has more than one sub-folder. * `FIRMWARE_FORMAT` * Defines which format (bin, hex) is copied to the root `qmk_firmware` folder after building. * `SRC` diff --git a/lib/python/qmk/cli/ci/validate_aliases.py b/lib/python/qmk/cli/ci/validate_aliases.py index 7f781d4397..8b062dbe56 100644 --- a/lib/python/qmk/cli/ci/validate_aliases.py +++ b/lib/python/qmk/cli/ci/validate_aliases.py @@ -2,7 +2,7 @@ """ from milc import cli -from qmk.keyboard import resolve_keyboard, keyboard_folder, keyboard_alias_definitions +from qmk.keyboard import keyboard_folder, keyboard_alias_definitions def _safe_keyboard_folder(target): @@ -17,10 +17,6 @@ def _target_keyboard_exists(target): if not target: return False - # If the target directory existed but there was no rules.mk or rules.mk was incorrectly parsed, then we can't build it. - if not resolve_keyboard(target): - return False - # If the target directory exists but it itself has an invalid alias or invalid rules.mk, then we can't build it either. if not _safe_keyboard_folder(target): return False diff --git a/lib/python/qmk/cli/list/keyboards.py b/lib/python/qmk/cli/list/keyboards.py index 405b9210e4..8b6c451673 100644 --- a/lib/python/qmk/cli/list/keyboards.py +++ b/lib/python/qmk/cli/list/keyboards.py @@ -5,10 +5,9 @@ from milc import cli import qmk.keyboard -@cli.argument('--no-resolve-defaults', arg_only=True, action='store_false', help='Ignore any "DEFAULT_FOLDER" within keyboards rules.mk') @cli.subcommand("List the keyboards currently defined within QMK") def list_keyboards(cli): """List the keyboards currently defined within QMK """ - for keyboard_name in qmk.keyboard.list_keyboards(cli.args.no_resolve_defaults): + for keyboard_name in qmk.keyboard.list_keyboards(): print(keyboard_name) diff --git a/lib/python/qmk/cli/migrate.py b/lib/python/qmk/cli/migrate.py index 0bab5c1949..d0f195d737 100644 --- a/lib/python/qmk/cli/migrate.py +++ b/lib/python/qmk/cli/migrate.py @@ -6,14 +6,14 @@ from dotty_dict import dotty from milc import cli -from qmk.keyboard import keyboard_completer, keyboard_folder, resolve_keyboard +from qmk.keyboard import keyboard_completer, keyboard_folder from qmk.info import info_json, find_info_json from qmk.json_encoders import InfoJSONEncoder from qmk.json_schema import json_load def _candidate_files(keyboard): - kb_dir = Path(resolve_keyboard(keyboard)) + kb_dir = Path(keyboard) cur_dir = Path('keyboards') files = [] diff --git a/lib/python/qmk/cli/resolve_alias.py b/lib/python/qmk/cli/resolve_alias.py index b9ffb46618..dff2242b28 100644 --- a/lib/python/qmk/cli/resolve_alias.py +++ b/lib/python/qmk/cli/resolve_alias.py @@ -5,7 +5,7 @@ from milc import cli @cli.argument('--allow-unknown', arg_only=True, action='store_true', help="Return original if rule is not a valid keyboard.") @cli.argument('keyboard', arg_only=True, help='The keyboard\'s name') -@cli.subcommand('Resolve DEFAULT_FOLDER and any keyboard_aliases for provided rule') +@cli.subcommand('Resolve any keyboard_aliases for provided rule') def resolve_alias(cli): try: print(keyboard_folder(cli.args.keyboard)) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index d95fd3d799..db8a02d132 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -223,12 +223,6 @@ def _validate(keyboard, info_data): def info_json(keyboard, force_layout=None): """Generate the info.json data for a specific keyboard. """ - cur_dir = Path('keyboards') - root_rules_mk = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk') - - if 'DEFAULT_FOLDER' in root_rules_mk: - keyboard = root_rules_mk['DEFAULT_FOLDER'] - info_data = { 'keyboard_name': str(keyboard), 'keyboard_folder': str(keyboard), @@ -1005,11 +999,6 @@ def find_info_json(keyboard): keyboard_parent = keyboard_path.parent info_jsons = [keyboard_path / 'info.json', keyboard_path / 'keyboard.json'] - # Add DEFAULT_FOLDER before parents, if present - rules = rules_mk(keyboard) - if 'DEFAULT_FOLDER' in rules: - info_jsons.append(Path(rules['DEFAULT_FOLDER']) / 'info.json') - # Add in parent folders for least specific for _ in range(5): if keyboard_parent == base_path: diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py index fcf5b5b158..254dc62309 100644 --- a/lib/python/qmk/keyboard.py +++ b/lib/python/qmk/keyboard.py @@ -99,8 +99,6 @@ def find_keyboard_from_dir(): keymap_index = len(current_path.parts) - current_path.parts.index('keymaps') - 1 current_path = current_path.parents[keymap_index] - current_path = resolve_keyboard(current_path) - if qmk.path.is_keyboard(current_path): return str(current_path) @@ -121,7 +119,7 @@ def find_readme(keyboard): def keyboard_folder(keyboard): """Returns the actual keyboard folder. - This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. + This checks aliases to resolve the actual path for a keyboard. """ aliases = keyboard_alias_definitions() @@ -131,8 +129,6 @@ def keyboard_folder(keyboard): if keyboard == last_keyboard: break - keyboard = resolve_keyboard(keyboard) - if not qmk.path.is_keyboard(keyboard): raise ValueError(f'Invalid keyboard: {keyboard}') @@ -158,7 +154,7 @@ def keyboard_aliases(keyboard): def keyboard_folder_or_all(keyboard): """Returns the actual keyboard folder. - This checks aliases and DEFAULT_FOLDER to resolve the actual path for a keyboard. + This checks aliases to resolve the actual path for a keyboard. If the supplied argument is "all", it returns an AllKeyboards object. """ if keyboard == 'all': @@ -179,32 +175,18 @@ def keyboard_completer(prefix, action, parser, parsed_args): return list_keyboards() -def list_keyboards(resolve_defaults=True): - """Returns a list of all keyboards - optionally processing any DEFAULT_FOLDER. +def list_keyboards(): + """Returns a list of all keyboards """ # We avoid pathlib here because this is performance critical code. - paths = [] - for marker in ['rules.mk', 'keyboard.json']: - kb_wildcard = os.path.join(base_path, "**", marker) - paths += [path for path in glob(kb_wildcard, recursive=True) if os.path.sep + 'keymaps' + os.path.sep not in path] + kb_wildcard = os.path.join(base_path, "**", 'keyboard.json') + paths = [path for path in glob(kb_wildcard, recursive=True) if os.path.sep + 'keymaps' + os.path.sep not in path] found = map(_find_name, paths) - if resolve_defaults: - found = map(resolve_keyboard, found) return sorted(set(found)) -@lru_cache(maxsize=None) -def resolve_keyboard(keyboard): - cur_dir = Path('keyboards') - rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk') - while 'DEFAULT_FOLDER' in rules and keyboard != rules['DEFAULT_FOLDER']: - keyboard = rules['DEFAULT_FOLDER'] - rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk') - return keyboard - - def config_h(keyboard): """Parses all the config.h files for a keyboard. @@ -216,7 +198,7 @@ def config_h(keyboard): """ config = {} cur_dir = Path('keyboards') - keyboard = Path(resolve_keyboard(keyboard)) + keyboard = Path(keyboard) for dir in keyboard.parts: cur_dir = cur_dir / dir @@ -235,7 +217,7 @@ def rules_mk(keyboard): a dictionary representing the content of the entire rules.mk tree for a keyboard """ cur_dir = Path('keyboards') - keyboard = Path(resolve_keyboard(keyboard)) + keyboard = Path(keyboard) rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk') for i, dir in enumerate(keyboard.parts): diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py index c47ed18362..1739689adf 100644 --- a/lib/python/qmk/path.py +++ b/lib/python/qmk/path.py @@ -21,11 +21,9 @@ def is_keyboard(keyboard_name): if Path(keyboard_name).is_absolute(): return False - keyboard_path = QMK_FIRMWARE / 'keyboards' / keyboard_name - rules_mk = keyboard_path / 'rules.mk' - keyboard_json = keyboard_path / 'keyboard.json' + keyboard_json = QMK_FIRMWARE / 'keyboards' / keyboard_name / 'keyboard.json' - return rules_mk.exists() or keyboard_json.exists() + return keyboard_json.exists() def under_qmk_firmware(path=Path(os.environ['ORIG_CWD'])): From 802a199bbd5dc5a533d912b1e508a84d1de08724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Mart=C3=ADnez?= <58857054+elpekenin@users.noreply.github.com> Date: Mon, 9 Jun 2025 20:35:48 +0200 Subject: [PATCH 425/592] [Bugfix] User eeconfig utility macros (#25350) --- quantum/eeconfig.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index d4d8d957be..66f8934a99 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -154,8 +154,8 @@ bool eeconfig_is_user_datablock_valid(void); uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull)); void eeconfig_init_user_datablock(void); -# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field)) -# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field)) +# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field)) +# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field)) #endif // (EECONFIG_USER_DATA_SIZE) > 0 // Any "checked" debounce variant used requires implementation of: From 8347a6688f479edb3c46fba91d79ac1d5848586b Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Tue, 10 Jun 2025 16:21:00 -0400 Subject: [PATCH 426/592] update winry25 VID and PID (#25351) --- keyboards/winry/winry25tc/keyboard.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/winry/winry25tc/keyboard.json b/keyboards/winry/winry25tc/keyboard.json index c2682daa9a..ebe3d0cc77 100644 --- a/keyboards/winry/winry25tc/keyboard.json +++ b/keyboards/winry/winry25tc/keyboard.json @@ -3,8 +3,8 @@ "manufacturer": "SpiderIsland", "maintainer": "qmk", "usb": { - "vid": "0xFEED", - "pid": "0x0000", + "vid": "0xF1F1", + "pid": "0x0025", "device_version": "0.0.1" }, "ws2812": { From 5bdeb7dad11c1566cf35ea2c70db20f66d1823a8 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 10 Jun 2025 22:20:34 +0100 Subject: [PATCH 427/592] Migrate remaining `DEFAULT_FOLDER` to keyboard aliases (#25291) --- data/mappings/keyboard_aliases.hjson | 49 +++++++++++++++++++ keyboards/cannonkeys/satisfaction75/rules.mk | 2 - keyboards/converter/adb_usb/rules.mk | 2 - keyboards/converter/sun_usb/rules.mk | 2 - keyboards/converter/usb_usb/rules.mk | 2 - keyboards/durgod/dgk6x/rules.mk | 2 - keyboards/ergodox_ez/rules.mk | 2 - keyboards/ferris/0_2/rules.mk | 2 - keyboards/handwired/dygma/raise/rules.mk | 2 - keyboards/helix/pico/rules.mk | 2 - keyboards/helix/rev2/rules.mk | 2 - keyboards/helix/rules.mk | 2 - keyboards/ibm/model_m/mschwingen/rules.mk | 2 - keyboards/mechwild/sugarglider/rules.mk | 2 - .../mechwild/sugarglider/wide_oled/rules.mk | 2 - keyboards/novelkeys/nk65/rules.mk | 2 - keyboards/redox/rules.mk | 2 - keyboards/sirius/uni660/rev2/rules.mk | 2 - keyboards/tzarc/djinn/rules.mk | 2 - keyboards/tzarc/ghoul/rules.mk | 2 - 20 files changed, 49 insertions(+), 38 deletions(-) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 86850af7a4..13c3b81305 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -2258,5 +2258,54 @@ }, "zsa/planck_ez": { "target": "zsa/planck_ez/base" + }, + // DEFAULT_FOLDER removed during 2025 Q3 cycle + "cannonkeys/satisfaction75": { + "target": "cannonkeys/satisfaction75/rev1" + }, + "converter/adb_usb": { + "target": "converter/adb_usb/rev1" + }, + "converter/sun_usb": { + "target": "converter/sun_usb/type5" + }, + "converter/usb_usb": { + "target": "converter/usb_usb/hasu" + }, + "durgod/dgk6x": { + "target": "durgod/dgk6x/hades_ansi" + }, + "ergodox_ez": { + "target": "ergodox_ez/base" + }, + "ferris/0_2": { + "target": "ferris/0_2/base" + }, + "handwired/dygma/raise": { + "target": "handwired/dygma/raise/ansi" + }, + "helix/pico": { + "target": "helix/pico/base" + }, + "helix": { + "target": "helix/rev2/base" + }, + "helix/rev2": { + "target": "helix/rev2/base" + }, + "ibm/model_m/mschwingen": { + "target": "ibm/model_m/mschwingen/led_wired" + }, + "mechwild/sugarglider": { + "target": "mechwild/sugarglider/wide_oled/f401" + }, + "mechwild/sugarglider/wide_oled": { + "target": "mechwild/sugarglider/wide_oled/f401" + }, + "novelkeys/nk65": { + "target": "novelkeys/nk65/base" + }, + "sirius/uni660/rev2": { + "target": "sirius/uni660/rev2/ansi" } } diff --git a/keyboards/cannonkeys/satisfaction75/rules.mk b/keyboards/cannonkeys/satisfaction75/rules.mk index c92469d1bd..25eebb9054 100644 --- a/keyboards/cannonkeys/satisfaction75/rules.mk +++ b/keyboards/cannonkeys/satisfaction75/rules.mk @@ -5,5 +5,3 @@ VPATH += keyboards/cannonkeys/lib/satisfaction75 SRC += satisfaction_encoder.c \ satisfaction_oled.c \ satisfaction_core.c - -DEFAULT_FOLDER = cannonkeys/satisfaction75/rev1 \ No newline at end of file diff --git a/keyboards/converter/adb_usb/rules.mk b/keyboards/converter/adb_usb/rules.mk index 28df56c337..b4a73249dd 100644 --- a/keyboards/converter/adb_usb/rules.mk +++ b/keyboards/converter/adb_usb/rules.mk @@ -3,5 +3,3 @@ CUSTOM_MATRIX = yes SRC += matrix.c adb.c led.c # OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE - -DEFAULT_FOLDER = converter/adb_usb/rev1 diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index d3ec00c5d5..0268798cc0 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -3,5 +3,3 @@ CUSTOM_MATRIX = yes SRC += matrix.c led.c UART_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = converter/sun_usb/type5 diff --git a/keyboards/converter/usb_usb/rules.mk b/keyboards/converter/usb_usb/rules.mk index 1e278514f6..682fa821ef 100644 --- a/keyboards/converter/usb_usb/rules.mk +++ b/keyboards/converter/usb_usb/rules.mk @@ -1,5 +1,3 @@ CUSTOM_MATRIX = yes SRC += custom_matrix.cpp - -DEFAULT_FOLDER = converter/usb_usb/hasu diff --git a/keyboards/durgod/dgk6x/rules.mk b/keyboards/durgod/dgk6x/rules.mk index 597f5bbcf9..c74ac83e91 100644 --- a/keyboards/durgod/dgk6x/rules.mk +++ b/keyboards/durgod/dgk6x/rules.mk @@ -1,4 +1,2 @@ # Do not put the microcontroller into power saving mode NO_SUSPEND_POWER_DOWN = yes - -DEFAULT_FOLDER=durgod/dgk6x/hades_ansi diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index 187d9dd8e2..9c0392f5d0 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -14,5 +14,3 @@ AUDIO_SUPPORTED = no BACKLIGHT_SUPPORTED = no MOUSE_SHARED_EP = no - -DEFAULT_FOLDER = ergodox_ez/base diff --git a/keyboards/ferris/0_2/rules.mk b/keyboards/ferris/0_2/rules.mk index 11b9d33a69..c04c3c92ed 100644 --- a/keyboards/ferris/0_2/rules.mk +++ b/keyboards/ferris/0_2/rules.mk @@ -2,5 +2,3 @@ CUSTOM_MATRIX = lite SRC += matrix.c I2C_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = ferris/0_2/base diff --git a/keyboards/handwired/dygma/raise/rules.mk b/keyboards/handwired/dygma/raise/rules.mk index cd02f80200..195edabcae 100644 --- a/keyboards/handwired/dygma/raise/rules.mk +++ b/keyboards/handwired/dygma/raise/rules.mk @@ -7,5 +7,3 @@ CUSTOM_MATRIX = lite I2C_DRIVER_REQUIRED = yes SRC += matrix.c - -DEFAULT_FOLDER = handwired/dygma/raise/ansi diff --git a/keyboards/helix/pico/rules.mk b/keyboards/helix/pico/rules.mk index 449df9caa6..e18b8fb0c4 100644 --- a/keyboards/helix/pico/rules.mk +++ b/keyboards/helix/pico/rules.mk @@ -3,5 +3,3 @@ LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) LED_ANIMATIONS = yes # LED animations IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -DEFAULT_FOLDER = helix/pico/base diff --git a/keyboards/helix/rev2/rules.mk b/keyboards/helix/rev2/rules.mk index 4f830403f4..e827ae111f 100644 --- a/keyboards/helix/rev2/rules.mk +++ b/keyboards/helix/rev2/rules.mk @@ -7,5 +7,3 @@ LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) LED_ANIMATIONS = yes # LED animations IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -DEFAULT_FOLDER = helix/rev2/base diff --git a/keyboards/helix/rules.mk b/keyboards/helix/rules.mk index f743d48d0e..a2f233cf91 100644 --- a/keyboards/helix/rules.mk +++ b/keyboards/helix/rules.mk @@ -1,3 +1 @@ -DEFAULT_FOLDER = helix/rev2 - HELIX_TOP_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) diff --git a/keyboards/ibm/model_m/mschwingen/rules.mk b/keyboards/ibm/model_m/mschwingen/rules.mk index 65761bcf9a..e9091cdbae 100644 --- a/keyboards/ibm/model_m/mschwingen/rules.mk +++ b/keyboards/ibm/model_m/mschwingen/rules.mk @@ -5,5 +5,3 @@ UART_DRIVER_REQUIRED = yes SPI_DRIVER_REQUIRED = yes OPT_DEFS += -DSLEEP_LED_ENABLE - -DEFAULT_FOLDER = ibm/model_m/mschwingen/led_wired diff --git a/keyboards/mechwild/sugarglider/rules.mk b/keyboards/mechwild/sugarglider/rules.mk index a01a95a868..73a141ac91 100644 --- a/keyboards/mechwild/sugarglider/rules.mk +++ b/keyboards/mechwild/sugarglider/rules.mk @@ -7,5 +7,3 @@ CUSTOM_MATRIX = lite VPATH += drivers/gpio SRC += mcp23018.c matrix.c I2C_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = mechwild/sugarglider/wide_oled diff --git a/keyboards/mechwild/sugarglider/wide_oled/rules.mk b/keyboards/mechwild/sugarglider/wide_oled/rules.mk index 23e6cab873..a77f1a8af2 100644 --- a/keyboards/mechwild/sugarglider/wide_oled/rules.mk +++ b/keyboards/mechwild/sugarglider/wide_oled/rules.mk @@ -2,5 +2,3 @@ # change yes to no to disable # WIDE_OLED_ENABLE = yes - -DEFAULT_FOLDER = mechwild/sugarglider/wide_oled/f401 diff --git a/keyboards/novelkeys/nk65/rules.mk b/keyboards/novelkeys/nk65/rules.mk index c0d789a5a6..3b7a32713c 100755 --- a/keyboards/novelkeys/nk65/rules.mk +++ b/keyboards/novelkeys/nk65/rules.mk @@ -11,5 +11,3 @@ SRC = keyboards/wilba_tech/wt_main.c \ keyboards/wilba_tech/wt_rgb_backlight.c \ drivers/led/issi/is31fl3733.c \ quantum/color.c - -DEFAULT_FOLDER = novelkeys/nk65/base diff --git a/keyboards/redox/rules.mk b/keyboards/redox/rules.mk index a2f52752e0..4df55cd220 100644 --- a/keyboards/redox/rules.mk +++ b/keyboards/redox/rules.mk @@ -1,5 +1,3 @@ -DEFAULT_FOLDER = redox/rev1/base - # Disable unsupported hardware AUDIO_SUPPORTED = no BACKLIGHT_SUPPORTED = no diff --git a/keyboards/sirius/uni660/rev2/rules.mk b/keyboards/sirius/uni660/rev2/rules.mk index c03b052c56..18d234d62a 100644 --- a/keyboards/sirius/uni660/rev2/rules.mk +++ b/keyboards/sirius/uni660/rev2/rules.mk @@ -3,5 +3,3 @@ CUSTOM_MATRIX = lite # project specific files SRC += matrix.c UART_DRIVER_REQUIRED = yes - -DEFAULT_FOLDER = sirius/uni660/rev2/ansi diff --git a/keyboards/tzarc/djinn/rules.mk b/keyboards/tzarc/djinn/rules.mk index d5060d9814..91dc4fe478 100644 --- a/keyboards/tzarc/djinn/rules.mk +++ b/keyboards/tzarc/djinn/rules.mk @@ -8,5 +8,3 @@ SRC += \ djinn_portscan_matrix.c \ djinn_split_sync.c \ djinn_usbpd.c - -DEFAULT_FOLDER = tzarc/djinn/rev2 diff --git a/keyboards/tzarc/ghoul/rules.mk b/keyboards/tzarc/ghoul/rules.mk index 4bf96d9824..a9abdfe116 100644 --- a/keyboards/tzarc/ghoul/rules.mk +++ b/keyboards/tzarc/ghoul/rules.mk @@ -1,6 +1,4 @@ CUSTOM_MATRIX = lite QUANTUM_PAINTER_DRIVERS = ssd1351_spi -DEFAULT_FOLDER = tzarc/ghoul/rev1/stm32 - ANALOG_DRIVER_REQUIRED = yes From 0516cf5ed85874f61944332c175e1b228fd137b2 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 11 Jun 2025 14:29:37 +1000 Subject: [PATCH 428/592] Specify language standard when generating compilation database. (#25354) --- lib/python/qmk/compilation_database.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/python/qmk/compilation_database.py b/lib/python/qmk/compilation_database.py index 4c88dadbdd..c403297405 100755 --- a/lib/python/qmk/compilation_database.py +++ b/lib/python/qmk/compilation_database.py @@ -41,9 +41,9 @@ def cpu_defines(binary: str, compiler_args: str) -> List[str]: if binary.endswith("gcc") or binary.endswith("g++"): invocation = [binary, '-dM', '-E'] if binary.endswith("gcc"): - invocation.extend(['-x', 'c']) + invocation.extend(['-x', 'c', '-std=gnu11']) elif binary.endswith("g++"): - invocation.extend(['-x', 'c++']) + invocation.extend(['-x', 'c++', '-std=gnu++14']) compiler_args = shlex.split(compiler_args) invocation.extend(compiler_args) invocation.append('-') From f4aa8ae845c0920d89e2e9f9bcbf6f56e7c6003a Mon Sep 17 00:00:00 2001 From: oxnh <77563973+Hardware7253@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:31:05 +1200 Subject: [PATCH 429/592] Add keyboard Lily58 Koca (#24847) Co-authored-by: Ryan Co-authored-by: Drashna Jaelre Co-authored-by: Dasky <32983009+daskygit@users.noreply.github.com> --- keyboards/koca58/board.h | 8 ++ keyboards/koca58/config.h | 10 +++ keyboards/koca58/halconf.h | 7 ++ keyboards/koca58/keyboard.json | 100 ++++++++++++++++++++++ keyboards/koca58/keymaps/default/keymap.c | 78 +++++++++++++++++ keyboards/koca58/mcuconf.h | 11 +++ keyboards/koca58/readme.md | 25 ++++++ 7 files changed, 239 insertions(+) create mode 100644 keyboards/koca58/board.h create mode 100644 keyboards/koca58/config.h create mode 100644 keyboards/koca58/halconf.h create mode 100644 keyboards/koca58/keyboard.json create mode 100644 keyboards/koca58/keymaps/default/keymap.c create mode 100644 keyboards/koca58/mcuconf.h create mode 100644 keyboards/koca58/readme.md diff --git a/keyboards/koca58/board.h b/keyboards/koca58/board.h new file mode 100644 index 0000000000..d9de50c2b8 --- /dev/null +++ b/keyboards/koca58/board.h @@ -0,0 +1,8 @@ +/* Copyright 2025 oxnh */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#include_next + +#undef STM32_HSECLK +#define STM32_HSECLK 12000000U diff --git a/keyboards/koca58/config.h b/keyboards/koca58/config.h new file mode 100644 index 0000000000..3256cc474f --- /dev/null +++ b/keyboards/koca58/config.h @@ -0,0 +1,10 @@ +/* Copyright 2025 oxnh */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN C10 // USART TX pin +#define SERIAL_USART_RX_PIN C11 // USART RX pin +#define SERIAL_USART_DRIVER SD3 +#define USART3_PARTIALREMAP + diff --git a/keyboards/koca58/halconf.h b/keyboards/koca58/halconf.h new file mode 100644 index 0000000000..79853fe70d --- /dev/null +++ b/keyboards/koca58/halconf.h @@ -0,0 +1,7 @@ +/* Copyright 2025 oxnh */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#define HAL_USE_SERIAL TRUE + +#include_next diff --git a/keyboards/koca58/keyboard.json b/keyboards/koca58/keyboard.json new file mode 100644 index 0000000000..5a58f6c26c --- /dev/null +++ b/keyboards/koca58/keyboard.json @@ -0,0 +1,100 @@ +{ + "manufacturer": "oxnh", + "keyboard_name": "Koca58", + "maintainer": "oxnh", + "bootloader": "stm32duino", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "direct": [["A10", "A9", "A8", "C9", "C8", "C7", "B2", "B13", "B12", "B14", "B15", "C6", "A6", "A7", "C4", "C5", "B0", "B1", "B5", "A0", "A1", "A2", "A3", "A4", "A5", "C14", "C13", "B7", "B6"]] + }, + "processor": "STM32F103", + "split": { + "enabled": true, + "handedness": { + "pin": "C15" + }, + "matrix_pins": { + "right": { + "direct": [["A10", "A9", "A8", "C9", "C8", "C7", "B2", "B13", "B12", "B14", "B15", "C6", "A6", "A7", "C4", "C5", "B0", "B1", "C14", "A0", "A1", "A2", "A3", "A4", "A5", "C13", "B7", "B6", "B5"]] + } + }, + "serial": { + "driver": "usart" + } + }, + "url": "https://github.com/Hardware7253/Koca58", + "usb": { + "device_version": "1.0.0", + "pid": "0x5106", + "vid": "0x4C17" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.45}, + {"matrix": [0, 1], "x": 1, "y": 0.375}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.25}, + {"matrix": [1, 0], "x": 10, "y": 0.25}, + {"matrix": [1, 1], "x": 11, "y": 0.125}, + {"matrix": [1, 2], "x": 12, "y": 0}, + {"matrix": [1, 3], "x": 13, "y": 0.125}, + {"matrix": [1, 4], "x": 14, "y": 0.375}, + {"matrix": [1, 5], "x": 15, "y": 0.45}, + {"matrix": [0, 6], "x": 0, "y": 1.45}, + {"matrix": [0, 7], "x": 1, "y": 1.375}, + {"matrix": [0, 8], "x": 2, "y": 1.125}, + {"matrix": [0, 9], "x": 3, "y": 1}, + {"matrix": [0, 10], "x": 4, "y": 1.125}, + {"matrix": [0, 11], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 10, "y": 1.25}, + {"matrix": [1, 7], "x": 11, "y": 1.125}, + {"matrix": [1, 8], "x": 12, "y": 1}, + {"matrix": [1, 9], "x": 13, "y": 1.125}, + {"matrix": [1, 10], "x": 14, "y": 1.375}, + {"matrix": [1, 11], "x": 15, "y": 1.45}, + {"matrix": [0, 12], "x": 0, "y": 2.45}, + {"matrix": [0, 13], "x": 1, "y": 2.375}, + {"matrix": [0, 14], "x": 2, "y": 2.125}, + {"matrix": [0, 15], "x": 3, "y": 2}, + {"matrix": [0, 16], "x": 4, "y": 2.125}, + {"matrix": [0, 17], "x": 5, "y": 2.25}, + {"matrix": [1, 12], "x": 10, "y": 2.25}, + {"matrix": [1, 13], "x": 11, "y": 2.125}, + {"matrix": [1, 14], "x": 12, "y": 2}, + {"matrix": [1, 15], "x": 13, "y": 2.125}, + {"matrix": [1, 16], "x": 14, "y": 2.375}, + {"matrix": [1, 17], "x": 15, "y": 2.45}, + {"matrix": [0, 19], "x": 0, "y": 3.45}, + {"matrix": [0, 20], "x": 1, "y": 3.375}, + {"matrix": [0, 21], "x": 2, "y": 3.125}, + {"matrix": [0, 22], "x": 3, "y": 3}, + {"matrix": [0, 23], "x": 4, "y": 3.125}, + {"matrix": [0, 24], "x": 5, "y": 3.25}, + {"matrix": [0, 18], "x": 6, "y": 2.75}, + {"matrix": [1, 18], "x": 9, "y": 2.75}, + {"matrix": [1, 19], "x": 10, "y": 3.25}, + {"matrix": [1, 20], "x": 11, "y": 3.125}, + {"matrix": [1, 21], "x": 12, "y": 3}, + {"matrix": [1, 22], "x": 13, "y": 3.125}, + {"matrix": [1, 23], "x": 14, "y": 3.375}, + {"matrix": [1, 24], "x": 15, "y": 3.45}, + {"matrix": [0, 25], "x": 2.5, "y": 4.15}, + {"matrix": [0, 26], "x": 3.5, "y": 4.15}, + {"matrix": [0, 27], "x": 4.5, "y": 4.25}, + {"matrix": [0, 28], "x": 6, "y": 4.25, "h": 1.5}, + {"matrix": [1, 25], "x": 9, "y": 4.25, "h": 1.5}, + {"matrix": [1, 26], "x": 10.45, "y": 4.25}, + {"matrix": [1, 27], "x": 11.5, "y": 4.15}, + {"matrix": [1, 28], "x": 12.5, "y": 4.15} + ] + } + } +} diff --git a/keyboards/koca58/keymaps/default/keymap.c b/keyboards/koca58/keymaps/default/keymap.c new file mode 100644 index 0000000000..b571cadda8 --- /dev/null +++ b/keyboards/koca58/keymaps/default/keymap.c @@ -0,0 +1,78 @@ +/* Copyright 2025 oxnh */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include QMK_KEYBOARD_H + +enum layer_number { + _QWERTY = 0, + _LOWER, + _RAISE, + _ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* QWERTY + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |LCTRL | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | + * | | | |/ / \ \ | | | | + * `----------------------------' '------''--------------------' + */ + [_QWERTY] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, + 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, KC_ENT, MO(_RAISE), KC_BSPC, KC_RGUI + ), + /* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | ~ | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | _ | + | { | } | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | + * | | | |/ / \ \ | | | | + * `----------------------------' '------''--------------------' + */ + [_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, + 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_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + /* RAISE + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | + * `-----------------------------------------/ / \ \-----------------------------------------' + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | + * | | | |/ / \ \ | | | | + * `----------------------------' '------''--------------------' + */ + + [_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/koca58/mcuconf.h b/keyboards/koca58/mcuconf.h new file mode 100644 index 0000000000..3270d5f778 --- /dev/null +++ b/keyboards/koca58/mcuconf.h @@ -0,0 +1,11 @@ +/* Copyright 2025 oxnh */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#include_next + +#undef STM32_SERIAL_USE_USART3 +#define STM32_SERIAL_USE_USART3 TRUE + +#undef STM32_PLLMUL_VALUE +#define STM32_PLLMUL_VALUE 6 diff --git a/keyboards/koca58/readme.md b/keyboards/koca58/readme.md new file mode 100644 index 0000000000..fbf1c59954 --- /dev/null +++ b/keyboards/koca58/readme.md @@ -0,0 +1,25 @@ +# Koca58 + +![Koca58](https://i.imgur.com/loOGjGq.jpeg) + +A Lily58 variant featuring SMT components, powered by an STM32F103 MCU and utilizing direct wiring. If you have a Lily58 with a soldered dev board (e.g., pro micro), please visit the original [Lily58](/keyboards/lily58) directory. + +* Keyboard Maintainer: [oxnh](https://github.com/Hardware7253) +* Hardware Supported: All Koca58 PCBs +* Hardware Availability: [Open source design](https://github.com/Hardware7253/Koca58) + +Make example for this keyboard (after setting up your build environment): + + make koca58:default + +Flashing example for this keyboard: + + make koca58: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: + +* **Physical reset button**: Briefly press the button on the back of the PCB before or during uploading firmware From 8ae01715d63a06c32578ee99c5fefb2c5f69e95d Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Thu, 12 Jun 2025 08:43:15 -0400 Subject: [PATCH 430/592] fix winry25tc lightsout keymap (#25353) --- keyboards/winry/winry25tc/keymaps/lightsout/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c b/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c index f175f36b91..4e22b6b751 100644 --- a/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c +++ b/keyboards/winry/winry25tc/keymaps/lightsout/keymap.c @@ -82,9 +82,9 @@ void refresh_leds(void) { uint8_t tile = tiles[x][y]; uint8_t index = (y * 5) + x; if (tile) { - setrgb(RGB_RED, &led[remap[index]]); + rgblight_setrgb_at(RGB_RED, remap[index]); } else { - setrgb(RGB_WHITE, &led[remap[index]]); + rgblight_setrgb_at(RGB_WHITE, remap[index]); } } } From dcdd0372768e3a430b9aab19ee0dad75cf2079d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20A=2E=20Volpato?= Date: Thu, 12 Jun 2025 20:40:25 -0300 Subject: [PATCH 431/592] Add support for Protagonist PCBs (#22918) --- keyboards/wiredin/protagonist/pro_h/config.h | 24 + keyboards/wiredin/protagonist/pro_h/halconf.h | 22 + .../wiredin/protagonist/pro_h/keyboard.json | 372 +++++++++ .../pro_h/keymaps/default/keymap.c | 33 + keyboards/wiredin/protagonist/pro_h/mcuconf.h | 22 + keyboards/wiredin/protagonist/pro_s/config.h | 27 + keyboards/wiredin/protagonist/pro_s/halconf.h | 22 + .../wiredin/protagonist/pro_s/keyboard.json | 703 ++++++++++++++++++ .../pro_s/keymaps/default/keymap.c | 33 + keyboards/wiredin/protagonist/pro_s/mcuconf.h | 25 + keyboards/wiredin/protagonist/readme.md | 29 + 11 files changed, 1312 insertions(+) create mode 100644 keyboards/wiredin/protagonist/pro_h/config.h create mode 100644 keyboards/wiredin/protagonist/pro_h/halconf.h create mode 100644 keyboards/wiredin/protagonist/pro_h/keyboard.json create mode 100644 keyboards/wiredin/protagonist/pro_h/keymaps/default/keymap.c create mode 100644 keyboards/wiredin/protagonist/pro_h/mcuconf.h create mode 100644 keyboards/wiredin/protagonist/pro_s/config.h create mode 100644 keyboards/wiredin/protagonist/pro_s/halconf.h create mode 100644 keyboards/wiredin/protagonist/pro_s/keyboard.json create mode 100644 keyboards/wiredin/protagonist/pro_s/keymaps/default/keymap.c create mode 100644 keyboards/wiredin/protagonist/pro_s/mcuconf.h create mode 100644 keyboards/wiredin/protagonist/readme.md diff --git a/keyboards/wiredin/protagonist/pro_h/config.h b/keyboards/wiredin/protagonist/pro_h/config.h new file mode 100644 index 0000000000..ba515a74a2 --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_h/config.h @@ -0,0 +1,24 @@ +/* Copyright 2024 Gondolindrim + +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_PWM_COMPLEMENTARY_OUTPUT +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 1 +#define WS2812_DMA_STREAM STM32_DMA2_STREAM5 +#define WS2812_DMA_CHANNEL 6 diff --git a/keyboards/wiredin/protagonist/pro_h/halconf.h b/keyboards/wiredin/protagonist/pro_h/halconf.h new file mode 100644 index 0000000000..77e63e63ea --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_h/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 Gondolindrim + * + * 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_PWM TRUE +#define HAL_USE_PAL TRUE + +#include_next diff --git a/keyboards/wiredin/protagonist/pro_h/keyboard.json b/keyboards/wiredin/protagonist/pro_h/keyboard.json new file mode 100644 index 0000000000..75c60f6ab9 --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_h/keyboard.json @@ -0,0 +1,372 @@ +{ + "manufacturer": "WiredIn", + "keyboard_name": "Protagonist PRO-H", + "maintainer": "Gondolindrim", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A4", "A3", "A2", "A10", "A8", "B12", "A15", "B3", "B4", "B5", "C15", "C14", "B9", "C13"], + "rows": ["B1", "B10", "B14", "B8", "A0", "A1"] + }, + "processor": "STM32F411", + "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": 22 + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x5048", + "vid": "0x5749" + }, + "ws2812": { + "driver": "pwm", + "pin": "B15" + }, + "community_layouts": ["60_ansi_tsangan", "60_ansi_tsangan_split_bs_rshift", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb"], + "layout_aliases": { + "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift" + }, + "layouts": { + "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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4} + ] + } + } +} diff --git a/keyboards/wiredin/protagonist/pro_h/keymaps/default/keymap.c b/keyboards/wiredin/protagonist/pro_h/keymaps/default/keymap.c new file mode 100644 index 0000000000..b152af99bc --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_h/keymaps/default/keymap.c @@ -0,0 +1,33 @@ +/* Copyright 2020 Gondolindrim + * + * 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 + +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_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_COLN, 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, MO(1), KC_RCTL + ), + [1] = LAYOUT_all( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; diff --git a/keyboards/wiredin/protagonist/pro_h/mcuconf.h b/keyboards/wiredin/protagonist/pro_h/mcuconf.h new file mode 100644 index 0000000000..1474fe4f97 --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_h/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 Gondolindrim + * + * 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_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/wiredin/protagonist/pro_s/config.h b/keyboards/wiredin/protagonist/pro_s/config.h new file mode 100644 index 0000000000..90b01da8cc --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_s/config.h @@ -0,0 +1,27 @@ +/* Copyright 2024 Gondolindrim + +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 BACKLIGHT_PWM_DRIVER PWMD3 +#define BACKLIGHT_PWM_CHANNEL 4 + +#define WS2812_PWM_COMPLEMENTARY_OUTPUT +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 1 +#define WS2812_DMA_STREAM STM32_DMA2_STREAM5 +#define WS2812_DMA_CHANNEL 6 diff --git a/keyboards/wiredin/protagonist/pro_s/halconf.h b/keyboards/wiredin/protagonist/pro_s/halconf.h new file mode 100644 index 0000000000..77e63e63ea --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_s/halconf.h @@ -0,0 +1,22 @@ +/* Copyright 2024 Gondolindrim + * + * 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_PWM TRUE +#define HAL_USE_PAL TRUE + +#include_next diff --git a/keyboards/wiredin/protagonist/pro_s/keyboard.json b/keyboards/wiredin/protagonist/pro_s/keyboard.json new file mode 100644 index 0000000000..01b1cb3daf --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_s/keyboard.json @@ -0,0 +1,703 @@ +{ + "manufacturer": "WiredIn", + "keyboard_name": "Protagonist PRO-S", + "maintainer": "Gondolindrim", + "backlight": { + "as_caps_lock": true, + "levels": 20, + "pin": "B1" + }, + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "features": { + "backlight": true, + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A3", "A2", "A1", "B14", "B12", "A10", "A8", "B4", "B3", "A15", "C15", "C14", "C13", "B8"], + "rows": ["A4", "A7", "B0", "B5", "B9", "A0", "B10"] + }, + "processor": "STM32F411", + "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": 22 + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x5053", + "vid": "0x5749" + }, + "ws2812": { + "driver": "pwm", + "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_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": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 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": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "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": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "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": [0, 13], "x": 13, "y": 0}, + {"matrix": [4, 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": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 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, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "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": [4, 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, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3}, + {"matrix": [6, 2], "x": 2.25, "y": 3}, + {"matrix": [6, 3], "x": 3.25, "y": 3}, + {"matrix": [6, 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": [5, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [5, 1], "x": 1.5, "y": 4}, + {"matrix": [5, 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": 12.5, "y": 4}, + {"matrix": [4, 12], "x": 13.5, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/wiredin/protagonist/pro_s/keymaps/default/keymap.c b/keyboards/wiredin/protagonist/pro_s/keymaps/default/keymap.c new file mode 100644 index 0000000000..68bc778caa --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_s/keymaps/default/keymap.c @@ -0,0 +1,33 @@ +/* Copyright 2020 Gondolindrim + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all(/* Base */ + 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_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_COLN, KC_QUOT, KC_NUHS, KC_ENT, + 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, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL + ), + [1] = LAYOUT_all( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; diff --git a/keyboards/wiredin/protagonist/pro_s/mcuconf.h b/keyboards/wiredin/protagonist/pro_s/mcuconf.h new file mode 100644 index 0000000000..0b2d6e95d8 --- /dev/null +++ b/keyboards/wiredin/protagonist/pro_s/mcuconf.h @@ -0,0 +1,25 @@ +/* Copyright 2024 Gondolindrim + * + * 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_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE + +#undef STM32_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/wiredin/protagonist/readme.md b/keyboards/wiredin/protagonist/readme.md new file mode 100644 index 0000000000..153c3fb734 --- /dev/null +++ b/keyboards/wiredin/protagonist/readme.md @@ -0,0 +1,29 @@ +# WiredIn Protagonist + +* Keyboard Maintainer: [Gondolindrim](https://github.com/Gondolindrim) +* Hardware Supported: proprietary PCB using STM32F411 microcontroller; +* Hardware Availability: the Protagonist entered Group Buy in february 2024 and as of april 2025 there were no more public sales. + +The Protagonist is a 60% keyboard designed by WiredIn and PCB designed by [Gondolindrim](http://github.com/Gondolindrim), who is also the firwmare maintainer. + +## How to flash + +### Enter bootloader + +The DFU state in the bootloader can be accessed in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (escape in the default keymap) and plug in the keyboard; +* **Physical reset button**: press the button on the back of the PCB and hold it for 5 seconds; +* **Keycode in layout**: Press the key mapped to `RESET`; in the default layout, that is top left key ('escape') in layer 1. + +### How to compile and flash + +The Protagonist has two PCB versions: PRO-S (solderable) and PRO-H (hotswap). After checking what PCB you own and setting up your build environment, you can compile the default keymap by using one of the options below. + + make wiredin/protagonist/:default + +Where `` can be `pro_s` or `pro_h`. And use dfu-util in the command line or through a GUI like QMK toolbox to upload the firmware to the PCB. To directly flash the PCB after it is put into a DFU state, use: + + make wiredin/protagonist/: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). From 7ecdb574147fb67a89c46609161ca08891a103c0 Mon Sep 17 00:00:00 2001 From: luroc Date: Sat, 14 Jun 2025 05:11:58 +0200 Subject: [PATCH 432/592] [Docs] Fix example code on key_overrides.md (#25367) The description of the code snippet says right alt, but the snippet itself contained the right control keycode --- docs/features/key_overrides.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/key_overrides.md b/docs/features/key_overrides.md index 9b6015175c..e83f0295ab 100644 --- a/docs/features/key_overrides.md +++ b/docs/features/key_overrides.md @@ -135,11 +135,11 @@ bool momentary_layer(bool key_down, void *layer) { return false; } -const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), // +const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), // .layers = ~(1 << LAYER_FN), // - .suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), // + .suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), // .options = ko_option_no_unregister_on_other_key_down, // - .negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL)), // + .negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT)), // .custom_action = momentary_layer, // .context = (void *)LAYER_FN, // .trigger = KC_NO, // From 7919848324076250894542c12adcd6781c99b9d1 Mon Sep 17 00:00:00 2001 From: Dasky <32983009+daskygit@users.noreply.github.com> Date: Sat, 14 Jun 2025 13:55:35 +0100 Subject: [PATCH 433/592] Add core handling for pointing device failures. (#25315) --- docs/features/pointing_device.md | 32 +++--- drivers/sensors/adns5050.c | 6 +- drivers/sensors/adns5050.h | 2 +- drivers/sensors/adns9800.c | 11 +- drivers/sensors/adns9800.h | 2 +- drivers/sensors/analog_joystick.c | 4 +- drivers/sensors/analog_joystick.h | 2 +- drivers/sensors/azoteq_iqs5xx.c | 104 +++++++++-------- drivers/sensors/azoteq_iqs5xx.h | 2 +- drivers/sensors/cirque_pinnacle.c | 7 +- drivers/sensors/cirque_pinnacle.h | 2 +- drivers/sensors/cirque_pinnacle_i2c.c | 21 ++-- drivers/sensors/cirque_pinnacle_spi.c | 41 +++---- drivers/sensors/paw3204.c | 16 ++- drivers/sensors/paw3204.h | 2 +- drivers/sensors/pimoroni_trackball.c | 7 +- drivers/sensors/pimoroni_trackball.h | 2 +- drivers/sensors/pmw3320.c | 6 +- drivers/sensors/pmw3320.h | 2 +- drivers/sensors/pmw3389.c | 2 +- drivers/sensors/pmw33xx_common.c | 6 +- drivers/sensors/pmw33xx_common.h | 2 +- keyboards/splitkb/elora/rev1/myriad.c | 124 +++++++++++++-------- quantum/pointing_device/pointing_device.c | 42 ++++++- quantum/pointing_device/pointing_device.h | 27 +++-- tests/pointing/test_pointing.cpp | 20 ++++ tests/test_common/pointing_device_driver.c | 3 +- 27 files changed, 300 insertions(+), 197 deletions(-) diff --git a/docs/features/pointing_device.md b/docs/features/pointing_device.md index a139df9dc4..f25ea1b033 100644 --- a/docs/features/pointing_device.md +++ b/docs/features/pointing_device.md @@ -379,7 +379,7 @@ POINTING_DEVICE_DRIVER = custom Using the custom driver will require implementing the following functions: ```c -void pointing_device_driver_init(void) {} +bool pointing_device_driver_init(void) { return true; } report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; } uint16_t pointing_device_driver_get_cpi(void) { return 0; } void pointing_device_driver_set_cpi(uint16_t cpi) {} @@ -467,20 +467,22 @@ If there is a `_RIGHT` configuration option or callback, the [common configurati ## Callbacks and Functions -| Function | Description | -| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. | -| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. | -| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. | -| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. | -| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. | -| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. | -| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. | -| `pointing_device_get_report(void)` | Returns the current mouse report (as a `report_mouse_t` data structure). | -| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `report_mouse_t` data structured passed to the function. | -| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. | -| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `report_mouse_t` data and returns true only if it has changed. | -| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. | +| Function | Description | +| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. | +| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. | +| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. | +| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. | +| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. | +| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. | +| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. | +| `pointing_device_get_report(void)` | Returns the current mouse report (as a `report_mouse_t` data structure). | +| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `report_mouse_t` data structured passed to the function. | +| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. | +| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `report_mouse_t` data and returns true only if it has changed. | +| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. | +| `pointing_device_get_status(void)` | Returns device status as `pointing_device_status_t` a good return is `POINTING_DEVICE_STATUS_SUCCESS`. | +| `pointing_device_set_status(pointing_device_status_t status)` | Sets device status, anything other than `POINTING_DEVICE_STATUS_SUCCESS` will disable reports from the device.| ## Split Keyboard Callbacks and Functions diff --git a/drivers/sensors/adns5050.c b/drivers/sensors/adns5050.c index 1768c9f3b4..ac4c95b0c2 100644 --- a/drivers/sensors/adns5050.c +++ b/drivers/sensors/adns5050.c @@ -55,7 +55,7 @@ const pointing_device_driver_t adns5050_pointing_device_driver = { static bool powered_down = false; -void adns5050_init(void) { +bool adns5050_init(void) { // Initialize the ADNS serial pins. gpio_set_pin_output(ADNS5050_SCLK_PIN); gpio_set_pin_output(ADNS5050_SDIO_PIN); @@ -75,6 +75,8 @@ void adns5050_init(void) { // gets the adns ready for write commands // (for example, setting the dpi). adns5050_read_burst(); + + return adns5050_check_signature(); } // Perform a synchronization with the ADNS. @@ -220,7 +222,7 @@ uint16_t adns5050_get_cpi(void) { return (uint16_t)((cpival & 0b10000) * 125); } -bool adns5050_check_signature(void) { +bool __attribute__((weak)) adns5050_check_signature(void) { uint8_t pid = adns5050_read_reg(REG_PRODUCT_ID); uint8_t rid = adns5050_read_reg(REG_REVISION_ID); uint8_t pid2 = adns5050_read_reg(REG_PRODUCT_ID2); diff --git a/drivers/sensors/adns5050.h b/drivers/sensors/adns5050.h index 4dfcbc3c70..004c54f560 100644 --- a/drivers/sensors/adns5050.h +++ b/drivers/sensors/adns5050.h @@ -75,7 +75,7 @@ const pointing_device_driver_t adns5050_pointing_device_driver; // A bunch of functions to implement the ADNS5050-specific serial protocol. // Note that the "serial.h" driver is insufficient, because it does not // manually manipulate a serial clock signal. -void adns5050_init(void); +bool adns5050_init(void); void adns5050_sync(void); uint8_t adns5050_serial_read(void); void adns5050_serial_write(uint8_t data); diff --git a/drivers/sensors/adns9800.c b/drivers/sensors/adns9800.c index 0dbc528351..f5958dd350 100644 --- a/drivers/sensors/adns9800.c +++ b/drivers/sensors/adns9800.c @@ -115,7 +115,14 @@ uint8_t adns9800_read(uint8_t reg_addr) { return data; } -void adns9800_init(void) { +bool __attribute__((weak)) adns9800_check_signature(void) { + if (adns9800_read(REG_Product_ID) != 0x33) { + return false; + } + return true; +} + +bool adns9800_init(void) { gpio_set_pin_output(ADNS9800_CS_PIN); spi_init(); @@ -178,6 +185,8 @@ void adns9800_init(void) { adns9800_write(REG_LASER_CTRL0, laser_ctrl0 & 0xf0); adns9800_set_cpi(ADNS9800_CPI); + + return adns9800_check_signature(); } config_adns9800_t adns9800_get_config(void) { diff --git a/drivers/sensors/adns9800.h b/drivers/sensors/adns9800.h index 023f31b132..797aaf3cd0 100644 --- a/drivers/sensors/adns9800.h +++ b/drivers/sensors/adns9800.h @@ -63,7 +63,7 @@ typedef struct { const pointing_device_driver_t adns9800_pointing_device_driver; -void adns9800_init(void); +bool adns9800_init(void); config_adns9800_t adns9800_get_config(void); void adns9800_set_config(config_adns9800_t); uint16_t adns9800_get_cpi(void); diff --git a/drivers/sensors/analog_joystick.c b/drivers/sensors/analog_joystick.c index 93bbaa1b51..eec97e8eed 100644 --- a/drivers/sensors/analog_joystick.c +++ b/drivers/sensors/analog_joystick.c @@ -135,7 +135,7 @@ report_analog_joystick_t analog_joystick_read(void) { return report; } -void analog_joystick_init(void) { +bool analog_joystick_init(void) { gpio_set_pin_input_high(ANALOG_JOYSTICK_X_AXIS_PIN); gpio_set_pin_input_high(ANALOG_JOYSTICK_Y_AXIS_PIN); @@ -152,6 +152,8 @@ void analog_joystick_init(void) { maxAxisValues[0] = xOrigin + 100; maxAxisValues[1] = yOrigin + 100; #endif + + return true; } report_mouse_t analog_joystick_get_report(report_mouse_t mouse_report) { diff --git a/drivers/sensors/analog_joystick.h b/drivers/sensors/analog_joystick.h index c84da83db1..4838f502f1 100644 --- a/drivers/sensors/analog_joystick.h +++ b/drivers/sensors/analog_joystick.h @@ -51,5 +51,5 @@ typedef struct { bool button; } report_analog_joystick_t; report_analog_joystick_t analog_joystick_read(void); -void analog_joystick_init(void); +bool analog_joystick_init(void); report_mouse_t analog_joystick_get_report(report_mouse_t mouse_report); diff --git a/drivers/sensors/azoteq_iqs5xx.c b/drivers/sensors/azoteq_iqs5xx.c index ae26ee60cf..7586ac52d1 100644 --- a/drivers/sensors/azoteq_iqs5xx.c +++ b/drivers/sensors/azoteq_iqs5xx.c @@ -321,7 +321,7 @@ void azoteq_iqs5xx_setup_resolution(void) { static i2c_status_t azoteq_iqs5xx_init_status = 1; -void azoteq_iqs5xx_init(void) { +bool azoteq_iqs5xx_init(void) { i2c_init(); i2c_ping_address(AZOTEQ_IQS5XX_ADDRESS, 1); // wake azoteq_iqs5xx_reset_suspend(true, false, true); @@ -349,67 +349,65 @@ void azoteq_iqs5xx_init(void) { azoteq_iqs5xx_init_status |= azoteq_iqs5xx_set_gesture_config(true); wait_ms(AZOTEQ_IQS5XX_REPORT_RATE + 1); } + + return azoteq_iqs5xx_init_status == I2C_STATUS_SUCCESS; }; report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report) { report_mouse_t temp_report = {0}; - if (azoteq_iqs5xx_init_status == I2C_STATUS_SUCCESS) { - azoteq_iqs5xx_base_data_t base_data = {0}; - i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data); - bool ignore_movement = false; + azoteq_iqs5xx_base_data_t base_data = {0}; + i2c_status_t status = azoteq_iqs5xx_get_base_data(&base_data); + bool ignore_movement = false; - if (status == I2C_STATUS_SUCCESS) { + if (status == I2C_STATUS_SUCCESS) { #ifdef POINTING_DEVICE_DEBUG - if (base_data.previous_cycle_time > AZOTEQ_IQS5XX_REPORT_RATE) { - pd_dprintf("IQS5XX - previous cycle time missed, took: %dms\n", base_data.previous_cycle_time); - } -#endif - if (base_data.gesture_events_0.single_tap || base_data.gesture_events_0.press_and_hold) { - pd_dprintf("IQS5XX - Single tap/hold.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON1); - } else if (base_data.gesture_events_1.two_finger_tap) { - pd_dprintf("IQS5XX - Two finger tap.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON2); - } else if (base_data.gesture_events_0.swipe_x_neg) { - pd_dprintf("IQS5XX - X-.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON4); - ignore_movement = true; - } else if (base_data.gesture_events_0.swipe_x_pos) { - pd_dprintf("IQS5XX - X+.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON5); - ignore_movement = true; - } else if (base_data.gesture_events_0.swipe_y_neg) { - pd_dprintf("IQS5XX - Y-.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON6); - ignore_movement = true; - } else if (base_data.gesture_events_0.swipe_y_pos) { - pd_dprintf("IQS5XX - Y+.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON3); - ignore_movement = true; - } else if (base_data.gesture_events_1.zoom) { - if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) < 0) { - pd_dprintf("IQS5XX - Zoom out.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON7); - } else if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) > 0) { - pd_dprintf("IQS5XX - Zoom in.\n"); - temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON8); - } - } else if (base_data.gesture_events_1.scroll) { - pd_dprintf("IQS5XX - Scroll.\n"); - temp_report.h = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l)); - temp_report.v = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l)); - } - if (base_data.number_of_fingers == 1 && !ignore_movement) { - temp_report.x = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l)); - temp_report.y = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l)); - } - - } else { - pd_dprintf("IQS5XX - get report failed, i2c status: %d \n", status); + if (base_data.previous_cycle_time > AZOTEQ_IQS5XX_REPORT_RATE) { + pd_dprintf("IQS5XX - previous cycle time missed, took: %dms\n", base_data.previous_cycle_time); } +#endif + if (base_data.gesture_events_0.single_tap || base_data.gesture_events_0.press_and_hold) { + pd_dprintf("IQS5XX - Single tap/hold.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON1); + } else if (base_data.gesture_events_1.two_finger_tap) { + pd_dprintf("IQS5XX - Two finger tap.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON2); + } else if (base_data.gesture_events_0.swipe_x_neg) { + pd_dprintf("IQS5XX - X-.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON4); + ignore_movement = true; + } else if (base_data.gesture_events_0.swipe_x_pos) { + pd_dprintf("IQS5XX - X+.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON5); + ignore_movement = true; + } else if (base_data.gesture_events_0.swipe_y_neg) { + pd_dprintf("IQS5XX - Y-.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON6); + ignore_movement = true; + } else if (base_data.gesture_events_0.swipe_y_pos) { + pd_dprintf("IQS5XX - Y+.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON3); + ignore_movement = true; + } else if (base_data.gesture_events_1.zoom) { + if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) < 0) { + pd_dprintf("IQS5XX - Zoom out.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON7); + } else if (AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l) > 0) { + pd_dprintf("IQS5XX - Zoom in.\n"); + temp_report.buttons = pointing_device_handle_buttons(temp_report.buttons, true, POINTING_DEVICE_BUTTON8); + } + } else if (base_data.gesture_events_1.scroll) { + pd_dprintf("IQS5XX - Scroll.\n"); + temp_report.h = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l)); + temp_report.v = CONSTRAIN_HID(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l)); + } + if (base_data.number_of_fingers == 1 && !ignore_movement) { + temp_report.x = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.x.h, base_data.x.l)); + temp_report.y = CONSTRAIN_HID_XY(AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(base_data.y.h, base_data.y.l)); + } + } else { - pd_dprintf("IQS5XX - Init failed, i2c status: %d \n", azoteq_iqs5xx_init_status); + pd_dprintf("IQS5XX - get report failed, i2c status: %d \n", status); } return temp_report; diff --git a/drivers/sensors/azoteq_iqs5xx.h b/drivers/sensors/azoteq_iqs5xx.h index eb01903e33..1a70ac6149 100644 --- a/drivers/sensors/azoteq_iqs5xx.h +++ b/drivers/sensors/azoteq_iqs5xx.h @@ -180,7 +180,7 @@ typedef struct { const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver; -void azoteq_iqs5xx_init(void); +bool azoteq_iqs5xx_init(void); i2c_status_t azoteq_iqs5xx_wake(void); report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report); i2c_status_t azoteq_iqs5xx_get_report_rate(azoteq_iqs5xx_report_rate_t *report_rate, azoteq_iqs5xx_charging_modes_t mode, bool end_session); diff --git a/drivers/sensors/cirque_pinnacle.c b/drivers/sensors/cirque_pinnacle.c index 893cb98bf0..45072ae874 100644 --- a/drivers/sensors/cirque_pinnacle.c +++ b/drivers/sensors/cirque_pinnacle.c @@ -18,7 +18,6 @@ # endif #endif -bool touchpad_init; uint16_t scale_data = CIRQUE_PINNACLE_DEFAULT_SCALE; void cirque_pinnacle_clear_flags(void); @@ -232,14 +231,14 @@ bool cirque_pinnacle_connected(void) { } /* Pinnacle-based TM040040/TM035035/TM023023 Functions */ -void cirque_pinnacle_init(void) { +bool cirque_pinnacle_init(void) { #if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_spi) spi_init(); #elif defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_i2c) i2c_init(); #endif - touchpad_init = true; + bool touchpad_init = true; // send a RESET command now, in case QMK had a soft-reset without a power cycle RAP_Write(HOSTREG__SYSCONFIG1, HOSTREG__SYSCONFIG1__RESET); @@ -293,6 +292,8 @@ void cirque_pinnacle_init(void) { #ifndef CIRQUE_PINNACLE_SKIP_SENSOR_CHECK touchpad_init = cirque_pinnacle_connected(); #endif + + return touchpad_init; } pinnacle_data_t cirque_pinnacle_read_data(void) { diff --git a/drivers/sensors/cirque_pinnacle.h b/drivers/sensors/cirque_pinnacle.h index 1a17e539a4..3541d62463 100644 --- a/drivers/sensors/cirque_pinnacle.h +++ b/drivers/sensors/cirque_pinnacle.h @@ -114,7 +114,7 @@ typedef struct { #define cirque_pinnacle_spi_pointing_device_driver cirque_pinnacle_pointing_device_driver const pointing_device_driver_t cirque_pinnacle_pointing_device_driver; -void cirque_pinnacle_init(void); +bool cirque_pinnacle_init(void); void cirque_pinnacle_calibrate(void); void cirque_pinnacle_cursor_smoothing(bool enable); pinnacle_data_t cirque_pinnacle_read_data(void); diff --git a/drivers/sensors/cirque_pinnacle_i2c.c b/drivers/sensors/cirque_pinnacle_i2c.c index a3622e9d60..8d766c69d9 100644 --- a/drivers/sensors/cirque_pinnacle_i2c.c +++ b/drivers/sensors/cirque_pinnacle_i2c.c @@ -7,29 +7,22 @@ #define WRITE_MASK 0x80 #define READ_MASK 0xA0 -extern bool touchpad_init; - /* RAP Functions */ // Reads Pinnacle registers starting at
void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) { uint8_t cmdByte = READ_MASK | address; // Form the READ command byte - if (touchpad_init) { - i2c_write_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT); - if (i2c_read_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { - pd_dprintf("error cirque_pinnacle i2c_read_register\n"); - touchpad_init = false; - } + i2c_write_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT); + if (i2c_read_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { + pd_dprintf("error cirque_pinnacle i2c_read_register\n"); + pointing_device_set_status(POINTING_DEVICE_STATUS_FAILED); } } // Writes single-byte to
void RAP_Write(uint8_t address, uint8_t data) { uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte - - if (touchpad_init) { - if (i2c_write_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { - pd_dprintf("error cirque_pinnacle i2c_write_register\n"); - touchpad_init = false; - } + if (i2c_write_register(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { + pd_dprintf("error cirque_pinnacle i2c_write_register\n"); + pointing_device_set_status(POINTING_DEVICE_STATUS_FAILED); } } diff --git a/drivers/sensors/cirque_pinnacle_spi.c b/drivers/sensors/cirque_pinnacle_spi.c index 5cb39aebb0..eefdb4d0a7 100644 --- a/drivers/sensors/cirque_pinnacle_spi.c +++ b/drivers/sensors/cirque_pinnacle_spi.c @@ -7,40 +7,35 @@ #define READ_MASK 0xA0 #define FILLER_BYTE 0xFC -extern bool touchpad_init; - /* RAP Functions */ // Reads Pinnacle registers starting at
void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) { uint8_t cmdByte = READ_MASK | address; // Form the READ command byte - if (touchpad_init) { - if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { - spi_write(cmdByte); // write command byte, receive filler - spi_write(FILLER_BYTE); // write & receive filler - spi_write(FILLER_BYTE); // write & receive filler - for (uint8_t i = 0; i < count; i++) { - data[i] = spi_write(FILLER_BYTE); // write filler, receive data on the third filler send - } - } else { - pd_dprintf("error cirque_pinnacle spi_start read\n"); - touchpad_init = false; + + if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { + spi_write(cmdByte); // write command byte, receive filler + spi_write(FILLER_BYTE); // write & receive filler + spi_write(FILLER_BYTE); // write & receive filler + for (uint8_t i = 0; i < count; i++) { + data[i] = spi_write(FILLER_BYTE); // write filler, receive data on the third filler send } - spi_stop(); + } else { + pd_dprintf("error cirque_pinnacle spi_start read\n"); + pointing_device_set_status(POINTING_DEVICE_STATUS_FAILED); } + spi_stop(); } // Writes single-byte to
void RAP_Write(uint8_t address, uint8_t data) { uint8_t cmdByte = WRITE_MASK | address; // Form the WRITE command byte - if (touchpad_init) { - if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { - spi_write(cmdByte); - spi_write(data); - } else { - pd_dprintf("error cirque_pinnacle spi_start write\n"); - touchpad_init = false; - } - spi_stop(); + if (spi_start(CIRQUE_PINNACLE_SPI_CS_PIN, CIRQUE_PINNACLE_SPI_LSBFIRST, CIRQUE_PINNACLE_SPI_MODE, CIRQUE_PINNACLE_SPI_DIVISOR)) { + spi_write(cmdByte); + spi_write(data); + } else { + pd_dprintf("error cirque_pinnacle spi_start write\n"); + pointing_device_set_status(POINTING_DEVICE_STATUS_FAILED); } + spi_stop(); } diff --git a/drivers/sensors/paw3204.c b/drivers/sensors/paw3204.c index 475821f175..228b7fa986 100644 --- a/drivers/sensors/paw3204.c +++ b/drivers/sensors/paw3204.c @@ -58,7 +58,15 @@ const pointing_device_driver_t paw3204_pointing_device_driver = { .get_cpi = paw3204_get_cpi, }; -void paw3204_init(void) { +uint8_t read_pid_paw3204(void) { + return paw3204_read_reg(REG_PID1); +} + +bool __attribute__((weak)) paw3204_check_signature(void) { + return (read_pid_paw3204() == 0x30); +} + +bool paw3204_init(void) { gpio_set_pin_output(PAW3204_SCLK_PIN); // setclockpin to output gpio_set_pin_input_high(PAW3204_SDIO_PIN); // set datapin input high @@ -69,6 +77,8 @@ void paw3204_init(void) { paw3204_read_reg(0x01); // read id2 // PAW3204_write_reg(REG_SETUP,0x06); // dont reset sensor and set cpi 1600 paw3204_write_reg(REG_IMGTRASH, 0x32); // write image trashhold + + return paw3204_check_signature(); } uint8_t paw3204_serial_read(void) { @@ -175,10 +185,6 @@ uint16_t paw3204_get_cpi(void) { return cpival; } -uint8_t read_pid_paw3204(void) { - return paw3204_read_reg(REG_PID1); -} - report_mouse_t paw3204_get_report(report_mouse_t mouse_report) { report_paw3204_t data = paw3204_read(); if (data.isMotion) { diff --git a/drivers/sensors/paw3204.h b/drivers/sensors/paw3204.h index a4bb8e16a6..11759d64c3 100644 --- a/drivers/sensors/paw3204.h +++ b/drivers/sensors/paw3204.h @@ -50,7 +50,7 @@ const pointing_device_driver_t paw3204_pointing_device_driver; * @return true Initialization was a success * @return false Initialization failed, do not proceed operation */ -void paw3204_init(void); +bool paw3204_init(void); /** * @brief Reads and clears the current delta, and motion register values on the diff --git a/drivers/sensors/pimoroni_trackball.c b/drivers/sensors/pimoroni_trackball.c index 06e5042953..daa5786554 100644 --- a/drivers/sensors/pimoroni_trackball.c +++ b/drivers/sensors/pimoroni_trackball.c @@ -82,9 +82,12 @@ i2c_status_t read_pimoroni_trackball(pimoroni_data_t *data) { return status; } -__attribute__((weak)) void pimoroni_trackball_device_init(void) { +__attribute__((weak)) bool pimoroni_trackball_device_init(void) { i2c_init(); - pimoroni_trackball_set_rgbw(0x00, 0x00, 0x00, 0x00); + uint8_t rgbw_data[4] = {0}; + i2c_status_t status = i2c_write_register(PIMORONI_TRACKBALL_ADDRESS << 1, PIMORONI_TRACKBALL_REG_LED_RED, rgbw_data, sizeof(rgbw_data), PIMORONI_TRACKBALL_TIMEOUT); + + return (status == I2C_STATUS_SUCCESS); } int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale) { diff --git a/drivers/sensors/pimoroni_trackball.h b/drivers/sensors/pimoroni_trackball.h index 1904214a74..4b8a2548ae 100644 --- a/drivers/sensors/pimoroni_trackball.h +++ b/drivers/sensors/pimoroni_trackball.h @@ -52,7 +52,7 @@ typedef struct { const pointing_device_driver_t pimoroni_trackball_pointing_device_driver; -void pimoroni_trackball_device_init(void); +bool pimoroni_trackball_device_init(void); void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white); int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale); uint16_t pimoroni_trackball_get_cpi(void); diff --git a/drivers/sensors/pmw3320.c b/drivers/sensors/pmw3320.c index 74fefd4c53..db74540ec1 100644 --- a/drivers/sensors/pmw3320.c +++ b/drivers/sensors/pmw3320.c @@ -30,7 +30,7 @@ const pointing_device_driver_t pmw3320_pointing_device_drivera = { .get_cpi = pmw3320_get_cpi, }; -void pmw3320_init(void) { +bool pmw3320_init(void) { // Initialize sensor serial pins. gpio_set_pin_output(PMW3320_SCLK_PIN); gpio_set_pin_output(PMW3320_SDIO_PIN); @@ -56,6 +56,8 @@ void pmw3320_init(void) { pmw3320_write_reg(REG_Led_Control, 0x4); // Disable rest mode pmw3320_write_reg(REG_Performance, 0x80); + + return pmw3320_check_signature(); } // Perform a synchronization with sensor. @@ -192,7 +194,7 @@ void pmw3320_set_cpi(uint16_t cpi) { pmw3320_write_reg(REG_Resolution, 0x20 | cpival); } -bool pmw3320_check_signature(void) { +bool __attribute__((weak)) pmw3320_check_signature(void) { uint8_t pid = pmw3320_read_reg(REG_Product_ID); uint8_t pid2 = pmw3320_read_reg(REG_Inverse_Product_ID); diff --git a/drivers/sensors/pmw3320.h b/drivers/sensors/pmw3320.h index cfff25bd8a..42fd72a52c 100644 --- a/drivers/sensors/pmw3320.h +++ b/drivers/sensors/pmw3320.h @@ -61,7 +61,7 @@ const pointing_device_driver_t pmw3320_pointing_device_driver; // Mostly taken from ADNS5050 driver. // Note that the "serial.h" driver is insufficient, because it does not // manually manipulate a serial clock signal. -void pmw3320_init(void); +bool pmw3320_init(void); void pmw3320_sync(void); uint8_t pmw3320_serial_read(void); void pmw3320_serial_write(uint8_t data); diff --git a/drivers/sensors/pmw3389.c b/drivers/sensors/pmw3389.c index 85d2c8a429..efa90c2100 100644 --- a/drivers/sensors/pmw3389.c +++ b/drivers/sensors/pmw3389.c @@ -29,4 +29,4 @@ void pmw33xx_set_cpi(uint8_t sensor, uint16_t cpi) { } // PID, Inverse PID -const uint8_t pmw33xx_firmware_signature[2] PROGMEM = {0x42, 0xBD}; +const uint8_t pmw33xx_firmware_signature[2] PROGMEM = {0x47, 0xB8}; diff --git a/drivers/sensors/pmw33xx_common.c b/drivers/sensors/pmw33xx_common.c index f3285ec497..61e309ea27 100644 --- a/drivers/sensors/pmw33xx_common.c +++ b/drivers/sensors/pmw33xx_common.c @@ -102,7 +102,7 @@ uint8_t pmw33xx_read(uint8_t sensor, uint8_t reg_addr) { return data; } -bool pmw33xx_check_signature(uint8_t sensor) { +__attribute__((weak)) bool pmw33xx_check_signature(uint8_t sensor) { uint8_t signature_dump[2] = { pmw33xx_read(sensor, REG_Product_ID), pmw33xx_read(sensor, REG_Inverse_Product_ID), @@ -236,8 +236,8 @@ pmw33xx_report_t pmw33xx_read_burst(uint8_t sensor) { return report; } -void pmw33xx_init_wrapper(void) { - pmw33xx_init(0); +bool pmw33xx_init_wrapper(void) { + return pmw33xx_init(0); } void pmw33xx_set_cpi_wrapper(uint16_t cpi) { diff --git a/drivers/sensors/pmw33xx_common.h b/drivers/sensors/pmw33xx_common.h index 82303ba6d9..8fb10b1b2f 100644 --- a/drivers/sensors/pmw33xx_common.h +++ b/drivers/sensors/pmw33xx_common.h @@ -177,7 +177,7 @@ uint8_t pmw33xx_read(uint8_t sensor, uint8_t reg_addr); */ bool pmw33xx_write(uint8_t sensor, uint8_t reg_addr, uint8_t data); -void pmw33xx_init_wrapper(void); +bool pmw33xx_init_wrapper(void); void pmw33xx_set_cpi_wrapper(uint16_t cpi); uint16_t pmw33xx_get_cpi_wrapper(void); report_mouse_t pmw33xx_get_report(report_mouse_t mouse_report); diff --git a/keyboards/splitkb/elora/rev1/myriad.c b/keyboards/splitkb/elora/rev1/myriad.c index 8bb6054df9..0263821b81 100644 --- a/keyboards/splitkb/elora/rev1/myriad.c +++ b/keyboards/splitkb/elora/rev1/myriad.c @@ -9,10 +9,10 @@ #include "analog.h" typedef struct __attribute__((__packed__)) { - char magic_numbers[3]; - uint8_t version_major; - uint8_t version_minor; - uint8_t version_patch; + char magic_numbers[3]; + uint8_t version_major; + uint8_t version_minor; + uint8_t version_patch; uint32_t checksum; uint16_t payload_length; } myriad_header_t; @@ -20,34 +20,36 @@ typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) { uint16_t vendor_id; uint16_t product_id; - uint8_t revision; + uint8_t revision; } identity_record_t; static bool myriad_reader(uint8_t *data, uint16_t length) { - const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit - const uint16_t i2c_timeout = 100; // in milliseconds + const uint8_t eeprom_address = 0x50; // 1010 000 - NOT shifted for R/W bit + const uint16_t i2c_timeout = 100; // in milliseconds - uint8_t num_pages = (length / 256) + 1; + uint8_t num_pages = (length / 256) + 1; uint8_t last_page_size = length % 256; for (int i = 0; i < num_pages; i++) { - uint8_t reg = 0; // We always start on a page boundary, so this is always zero + uint8_t reg = 0; // We always start on a page boundary, so this is always zero uint16_t read_length; if (i == num_pages - 1) { read_length = last_page_size; } else { read_length = 256; } - i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i*256]), read_length, i2c_timeout); - if (s != I2C_STATUS_SUCCESS) { return false; } + i2c_status_t s = i2c_read_register((eeprom_address + i) << 1, reg, &(data[i * 256]), read_length, i2c_timeout); + if (s != I2C_STATUS_SUCCESS) { + return false; + } } return true; } static bool verify_header(myriad_header_t *header) { - char magic_numbers[] = {'M', 'Y', 'R'}; - uint8_t version_major = 1; - uint16_t version_minor = 0; + char magic_numbers[] = {'M', 'Y', 'R'}; + uint8_t version_major = 1; + uint16_t version_minor = 0; for (int i = 0; i < sizeof(magic_numbers); i++) { // Check that the header starts with 'MYR', indicating that this is indeed a Myriad card. @@ -82,16 +84,15 @@ static bool verify_checksum(uint8_t *data, uint16_t length, uint32_t checksum) { const uint32_t MOD_ADLER = 65521; uint32_t a = 1, b = 0; - size_t index; - + size_t index; + // Process each byte of the data in order - for (index = 0; index < length; ++index) - { + for (index = 0; index < length; ++index) { a = (a + data[index]) % MOD_ADLER; b = (b + a) % MOD_ADLER; } uint32_t calculated = ((b << 16) | a); - + return calculated == checksum; } @@ -108,9 +109,9 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8 while (offset < maximum) { if (data[offset] == entry_type) { // Type matches! - if (data[offset+1] == entry_data_length) { + if (data[offset + 1] == entry_data_length) { // We found what we are looking for, so return payload reference. - return offset+2; + return offset + 2; } else { // The entry is the wrong length? return -2; @@ -118,7 +119,7 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8 } else { // No type match, so skip this one // We skip the type byte, the length byte, and any potential data (with length stored in the length byte) - offset += 2 + data[offset+1]; + offset += 2 + data[offset + 1]; } } @@ -127,13 +128,15 @@ static int16_t locate_entry(uint8_t entry_type, uint8_t entry_data_length, uint8 } static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t *record) { - const uint8_t identity_type = 0x01; + const uint8_t identity_type = 0x01; const uint8_t entry_data_length = sizeof(identity_record_t); - int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length); - if (result < 0) { return false; } + int16_t result = locate_entry(identity_type, entry_data_length, data, 0, length); + if (result < 0) { + return false; + } for (int i = 0; i < sizeof(identity_record_t); i++) { - ((uint8_t*)record)[i] = data[result + i]; + ((uint8_t *)record)[i] = data[result + i]; } return true; } @@ -141,27 +144,37 @@ static bool read_card_identity(uint8_t *data, uint16_t length, identity_record_t static myriad_card_t _detect_myriad(void) { gpio_set_pin_input(MYRIAD_PRESENT); wait_ms(100); - // The pin has an external pull-up, and a Myriad card shorts it to ground. - #ifndef MYRIAD_OVERRIDE_PRESENCE +// The pin has an external pull-up, and a Myriad card shorts it to ground. +#ifndef MYRIAD_OVERRIDE_PRESENCE if (gpio_read_pin(MYRIAD_PRESENT)) { return NONE; } - #endif +#endif // Attempt to read header myriad_header_t header; - if (!myriad_reader((uint8_t*)&header, sizeof(header))) { return INVALID; } - if (!verify_header(&header)) { return INVALID; } + if (!myriad_reader((uint8_t *)&header, sizeof(header))) { + return INVALID; + } + if (!verify_header(&header)) { + return INVALID; + } // Now that we have determined that the header is valid // and we know the payload length, read the entire thing - uint8_t data[2048]; // Guaranteed to be large enough. - uint16_t data_size = sizeof(header)+header.payload_length; - if (!myriad_reader(data, data_size)) { return INVALID; } - if (!verify_checksum(data, data_size, header.checksum)) { return INVALID; } + uint8_t data[2048]; // Guaranteed to be large enough. + uint16_t data_size = sizeof(header) + header.payload_length; + if (!myriad_reader(data, data_size)) { + return INVALID; + } + if (!verify_checksum(data, data_size, header.checksum)) { + return INVALID; + } identity_record_t identity; - if (!read_card_identity(data, data_size, &identity)) { return INVALID; } + if (!read_card_identity(data, data_size, &identity)) { + return INVALID; + } if (identity.vendor_id == 0x0001 && identity.product_id == 0x0001) { return SKB_ENCODER; @@ -201,7 +214,7 @@ static void myr_encoder_init(void) { } static uint16_t myr_joystick_timer; -static void myr_joystick_init(void) { +static void myr_joystick_init(void) { gpio_set_pin_input_high(MYRIAD_GPIO1); // Press myr_joystick_timer = timer_read(); @@ -235,7 +248,7 @@ static myriad_card_t myriad_card_init(void) { bool myriad_hook_matrix(matrix_row_t current_matrix[]) { myriad_card_t card = myriad_card_init(); - uint8_t word = 0; + uint8_t word = 0; if (card == SKB_SWITCHES) { word |= ((!gpio_read_pin(MYRIAD_GPIO3)) & 1) << 0; @@ -252,7 +265,7 @@ bool myriad_hook_matrix(matrix_row_t current_matrix[]) { // 5 bytes of on-board keys, so we are the 6th bool matrix_has_changed = current_matrix[5] ^ word; - current_matrix[5] = word; + current_matrix[5] = word; return matrix_has_changed; } @@ -261,16 +274,20 @@ static pin_t encoders_pad_a[NUM_ENCODERS_MAX_PER_SIDE]; static pin_t encoders_pad_b[NUM_ENCODERS_MAX_PER_SIDE]; uint8_t myriad_hook_encoder(uint8_t index, bool pad_b) { - if (myriad_card_init() != SKB_ENCODER) { return 0; } + if (myriad_card_init() != SKB_ENCODER) { + return 0; + } // 3 onboard encoders, so we are number 4 - pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index]; + pin_t pin = pad_b ? encoders_pad_b[index] : encoders_pad_a[index]; encoders_pad_a[3] = MYRIAD_GPIO2; encoders_pad_b[3] = MYRIAD_GPIO3; return gpio_read_pin(pin) ? 1 : 0; } report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { - if (myriad_card_init() != SKB_JOYSTICK) { return mouse_report; } + if (myriad_card_init() != SKB_JOYSTICK) { + return mouse_report; + } if (timer_elapsed(myr_joystick_timer) < 10) { wait_ms(2); @@ -286,10 +303,10 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { // Create a dead zone in the middle where the mouse doesn't move const int16_t dead_zone = 10; - if ((y < 0 && y > -1*dead_zone) || (y > 0 && y < dead_zone)) { + if ((y < 0 && y > -1 * dead_zone) || (y > 0 && y < dead_zone)) { y = 0; } - if ((x < 0 && x > -1*dead_zone) || (x > 0 && x < dead_zone)) { + if ((x < 0 && x > -1 * dead_zone) || (x > 0 && x < dead_zone)) { x = 0; } @@ -298,10 +315,18 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { y = abs(y) * y / 5000; // Clamp final value to make sure we don't under/overflow - if (y < -127) { y = -127; } - if (y > 127) { y = 127; } - if (x < -127) { x = -127; } - if (x > 127) { x = 127; } + if (y < -127) { + y = -127; + } + if (y > 127) { + y = 127; + } + if (x < -127) { + x = -127; + } + if (x > 127) { + x = 127; + } mouse_report.x = x; mouse_report.y = y; @@ -309,7 +334,8 @@ report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; } -void pointing_device_driver_init(void) { +bool pointing_device_driver_init(void) { gpio_set_pin_input(MYRIAD_ADC1); // Y gpio_set_pin_input(MYRIAD_ADC2); // X + return true; } \ No newline at end of file diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c index 564c2d294c..fe88d5a1af 100644 --- a/quantum/pointing_device/pointing_device.c +++ b/quantum/pointing_device/pointing_device.c @@ -80,8 +80,10 @@ uint16_t pointing_device_get_shared_cpi(void) { #endif // defined(SPLIT_POINTING_ENABLE) -static report_mouse_t local_mouse_report = {}; -static bool pointing_device_force_send = false; +static report_mouse_t local_mouse_report = {}; +static bool pointing_device_force_send = false; +static pointing_device_status_t pointing_device_status = POINTING_DEVICE_STATUS_UNKNOWN; + #ifdef POINTING_DEVICE_HIRES_SCROLL_ENABLE static uint16_t hires_scroll_resolution; #endif @@ -90,7 +92,9 @@ static uint16_t hires_scroll_resolution; #define POINTING_DEVICE_DRIVER(name) POINTING_DEVICE_DRIVER_CONCAT(name) #ifdef POINTING_DEVICE_DRIVER_custom -__attribute__((weak)) void pointing_device_driver_init(void) {} +__attribute__((weak)) bool pointing_device_driver_init(void) { + return false; +} __attribute__((weak)) report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; } @@ -179,7 +183,11 @@ __attribute__((weak)) void pointing_device_init(void) { if ((POINTING_DEVICE_THIS_SIDE)) #endif { - pointing_device_driver->init(); + if (pointing_device_driver->init()) { + pointing_device_status = POINTING_DEVICE_STATUS_SUCCESS; + } else { + pointing_device_status = POINTING_DEVICE_STATUS_INIT_FAILED; + } #ifdef POINTING_DEVICE_MOTION_PIN # ifdef POINTING_DEVICE_MOTION_PIN_ACTIVE_LOW gpio_set_pin_input_high(POINTING_DEVICE_MOTION_PIN); @@ -200,6 +208,28 @@ __attribute__((weak)) void pointing_device_init(void) { pointing_device_init_user(); } +/** + * @brief Gets status of pointing device + * + * Returns current pointing device status + * @return pointing_device_status_t + */ +__attribute__((weak)) pointing_device_status_t pointing_device_get_status(void) { +#ifdef SPLIT_POINTING_ENABLE + // Assume target side is always good, split transaction checksum should stop additional reports being generated. + return POINTING_DEVICE_THIS_SIDE ? pointing_device_status : POINTING_DEVICE_STATUS_SUCCESS; +#else + return pointing_device_status; +#endif +} + +/** + * @brief Sets status of pointing device + */ +void pointing_device_set_status(pointing_device_status_t status) { + pointing_device_status = status; +} + /** * @brief Sends processed mouse report to host * @@ -281,6 +311,10 @@ __attribute__((weak)) bool pointing_device_task(void) { last_exec = timer_read32(); #endif + if (pointing_device_get_status() != POINTING_DEVICE_STATUS_SUCCESS) { + return false; + } + // Gather report info #ifdef POINTING_DEVICE_MOTION_PIN # if defined(SPLIT_POINTING_ENABLE) diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h index e7a0819ed9..5dfb9ce196 100644 --- a/quantum/pointing_device/pointing_device.h +++ b/quantum/pointing_device/pointing_device.h @@ -23,7 +23,7 @@ along with this program. If not, see . #include "report.h" typedef struct { - void (*init)(void); + bool (*init)(void); report_mouse_t (*get_report)(report_mouse_t mouse_report); void (*set_cpi)(uint16_t); uint16_t (*get_cpi)(void); @@ -75,7 +75,7 @@ typedef struct { # include "drivers/sensors/pmw33xx_common.h" # define POINTING_DEVICE_MOTION_PIN_ACTIVE_LOW #else -void pointing_device_driver_init(void); +bool pointing_device_driver_init(void); report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report); uint16_t pointing_device_driver_get_cpi(void); void pointing_device_driver_set_cpi(uint16_t cpi); @@ -92,6 +92,13 @@ typedef enum { POINTING_DEVICE_BUTTON8, } pointing_device_buttons_t; +typedef enum { + POINTING_DEVICE_STATUS_UNKNOWN, + POINTING_DEVICE_STATUS_INIT_FAILED, + POINTING_DEVICE_STATUS_FAILED, + POINTING_DEVICE_STATUS_SUCCESS, +} pointing_device_status_t; + #ifdef MOUSE_EXTENDED_REPORT typedef int32_t xy_clamp_range_t; #else @@ -107,13 +114,15 @@ typedef int16_t hv_clamp_range_t; #define CONSTRAIN_HID(amt) ((amt) < INT8_MIN ? INT8_MIN : ((amt) > INT8_MAX ? INT8_MAX : (amt))) #define CONSTRAIN_HID_XY(amt) ((amt) < MOUSE_REPORT_XY_MIN ? MOUSE_REPORT_XY_MIN : ((amt) > MOUSE_REPORT_XY_MAX ? MOUSE_REPORT_XY_MAX : (amt))) -void pointing_device_init(void); -bool pointing_device_task(void); -bool pointing_device_send(void); -report_mouse_t pointing_device_get_report(void); -void pointing_device_set_report(report_mouse_t mouse_report); -uint16_t pointing_device_get_cpi(void); -void pointing_device_set_cpi(uint16_t cpi); +void pointing_device_init(void); +bool pointing_device_task(void); +bool pointing_device_send(void); +report_mouse_t pointing_device_get_report(void); +void pointing_device_set_report(report_mouse_t mouse_report); +uint16_t pointing_device_get_cpi(void); +void pointing_device_set_cpi(uint16_t cpi); +pointing_device_status_t pointing_device_get_status(void); +void pointing_device_set_status(pointing_device_status_t status); void pointing_device_init_kb(void); void pointing_device_init_user(void); diff --git a/tests/pointing/test_pointing.cpp b/tests/pointing/test_pointing.cpp index d59d014925..bd886b18a2 100644 --- a/tests/pointing/test_pointing.cpp +++ b/tests/pointing/test_pointing.cpp @@ -12,6 +12,26 @@ using testing::_; class Pointing : public TestFixture {}; class PointingButtonsViaMousekeysParametrized : public ::testing::WithParamInterface>, public Pointing {}; +TEST_F(Pointing, NoMovementOnInitFailure) { + TestDriver driver; + + pointing_device_set_status(POINTING_DEVICE_STATUS_INIT_FAILED); + pd_set_x(-50); + pd_set_y(100); + EXPECT_NO_MOUSE_REPORT(driver); + run_one_scan_loop(); + + pointing_device_set_status(POINTING_DEVICE_STATUS_SUCCESS); + EXPECT_MOUSE_REPORT(driver, (-50, 100, 0, 0, 0)); + run_one_scan_loop(); + + pd_clear_movement(); + // EXPECT_EMPTY_MOUSE_REPORT(driver); + run_one_scan_loop(); + + VERIFY_AND_CLEAR(driver); +} + TEST_F(Pointing, SendMouseIsNotCalledWithNoInput) { TestDriver driver; EXPECT_NO_MOUSE_REPORT(driver); diff --git a/tests/test_common/pointing_device_driver.c b/tests/test_common/pointing_device_driver.c index b64dbad506..42c7a814a4 100644 --- a/tests/test_common/pointing_device_driver.c +++ b/tests/test_common/pointing_device_driver.c @@ -22,8 +22,9 @@ typedef struct { static pd_config_t pd_config = {0}; -void pointing_device_driver_init(void) { +bool pointing_device_driver_init(void) { pd_set_init(true); + return pd_config.initiated; } report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { From 7f9ceef3dd52066b6349130a93bfc681cd435d68 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 15 Jun 2025 11:56:10 +1000 Subject: [PATCH 434/592] More compiledb fixes. (#25355) --- .clangd | 35 +++++++++++++++++++++++--- lib/python/qmk/compilation_database.py | 13 ++++++---- platforms/avr/_wait.h | 2 ++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/.clangd b/.clangd index 63dadd7e7c..82ee5628b0 100644 --- a/.clangd +++ b/.clangd @@ -1,4 +1,33 @@ CompileFlags: - Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option] - Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues, -D__has_include*] - Compiler: clang + Add: + [ + -Wno-unknown-attributes, + -Wno-maybe-uninitialized, + -Wno-unknown-warning-option, + -Wno-pointer-to-int-cast, + -Wno-int-to-void-pointer-cast, + -DPROGMEM=, + ] + Remove: + [ + -W*, + -mmcu=*, + -mcpu=*, + -mfpu=*, + -mfloat-abi=*, + -mno-unaligned-access, + -mno-thumb-interwork, + -mcall-prologues, + -D__has_include*, + -mlra, + ] + Compiler: clang +Diagnostics: + UnusedIncludes: None + Suppress: + [ + asm_invalid_output_constraint, + asm_invalid_input_constraint, + invalid_asm_value_for_constraint, + anyx86_interrupt_attribute, + ] diff --git a/lib/python/qmk/compilation_database.py b/lib/python/qmk/compilation_database.py index c403297405..851dc3f157 100755 --- a/lib/python/qmk/compilation_database.py +++ b/lib/python/qmk/compilation_database.py @@ -44,8 +44,7 @@ def cpu_defines(binary: str, compiler_args: str) -> List[str]: invocation.extend(['-x', 'c', '-std=gnu11']) elif binary.endswith("g++"): invocation.extend(['-x', 'c++', '-std=gnu++14']) - compiler_args = shlex.split(compiler_args) - invocation.extend(compiler_args) + invocation.extend(shlex.split(compiler_args)) invocation.append('-') result = cli.run(invocation, capture_output=True, check=True, stdin=None, input='\n') define_args = [] @@ -55,7 +54,11 @@ def cpu_defines(binary: str, compiler_args: str) -> List[str]: define_args.append(f'-D{line_args[1]}={line_args[2]}') elif len(line_args) == 2 and line_args[0] == '#define': define_args.append(f'-D{line_args[1]}') - return list(sorted(set(define_args))) + + type_filter = re.compile( + r'^-D__(SIZE|INT|UINT|WINT|WCHAR|BYTE|SHRT|SIG|FLOAT|LONG|CHAR|SCHAR|DBL|FLT|LDBL|PTRDIFF|QQ|DQ|DA|HA|HQ|SA|SQ|TA|TQ|UDA|UDQ|UHA|UHQ|USQ|USA|UTQ|UTA|UQQ|UQA|ACCUM|FRACT|UACCUM|UFRACT|LACCUM|LFRACT|ULACCUM|ULFRACT|LLACCUM|LLFRACT|ULLACCUM|ULLFRACT|SACCUM|SFRACT|USACCUM|USFRACT)' + ) + return list(sorted(set(filter(lambda x: not type_filter.match(x), define_args)))) return [] @@ -92,8 +95,8 @@ def parse_make_n(f: Iterator[str]) -> List[Dict[str, str]]: for s in system_libs(binary): args += ['-isystem', '%s' % s] args.extend(cpu_defines(binary, ' '.join(shlex.quote(s) for s in compiler_args))) - new_cmd = ' '.join(shlex.quote(s) for s in args) - records.append({"directory": str(QMK_FIRMWARE.resolve()), "command": new_cmd, "file": this_file}) + args[0] = binary + records.append({"arguments": args, "directory": str(QMK_FIRMWARE.resolve()), "file": this_file}) state = 'start' return records diff --git a/platforms/avr/_wait.h b/platforms/avr/_wait.h index 39cbf618d2..54f578ace0 100644 --- a/platforms/avr/_wait.h +++ b/platforms/avr/_wait.h @@ -21,6 +21,8 @@ #include #pragma GCC diagnostic pop +extern void __builtin_avr_delay_cycles(uint32_t); + // http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf // page 22: Table 4-2. Arithmetic and Logic Instructions /* From 091eac1fce89cfb3b470fbdedaccd58720203b21 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 17 Jun 2025 04:23:22 +0100 Subject: [PATCH 435/592] Configure boards to use development_board - FGHIJ (#25370) --- keyboards/ffkeebs/puca/keyboard.json | 3 +-- keyboards/flehrad/numbrero/keyboard.json | 3 +-- keyboards/flehrad/snagpad/keyboard.json | 3 +-- keyboards/flehrad/tradestation/keyboard.json | 3 +-- keyboards/for_science/keyboard.json | 3 +-- keyboards/fr4/southpaw75/keyboard.json | 3 +-- keyboards/fr4/unix60/keyboard.json | 3 +-- keyboards/fractal/keyboard.json | 3 +-- keyboards/free_willy/keyboard.json | 3 +-- keyboards/fungo/rev1/keyboard.json | 3 +-- keyboards/funky40/keyboard.json | 3 +-- keyboards/gl516/a52gl/keyboard.json | 3 +-- keyboards/gl516/j73gl/keyboard.json | 3 +-- keyboards/gl516/n51gl/keyboard.json | 3 +-- keyboards/gowla/keyboard.json | 3 +-- keyboards/halfcliff/keyboard.json | 3 +-- keyboards/hifumi/keyboard.json | 3 +-- keyboards/horizon/keyboard.json | 3 +-- keyboards/ibnuda/alicia_cook/keyboard.json | 3 +-- keyboards/ibnuda/gurindam/keyboard.json | 3 +-- keyboards/ibnuda/squiggle/rev1/keyboard.json | 3 +-- keyboards/ivndbt/late9/rev1/keyboard.json | 3 +-- keyboards/ivndbt/neopad/rev1/keyboard.json | 3 +-- keyboards/jiran/info.json | 3 +-- keyboards/jorne/rev1/keyboard.json | 3 +-- 25 files changed, 25 insertions(+), 50 deletions(-) diff --git a/keyboards/ffkeebs/puca/keyboard.json b/keyboards/ffkeebs/puca/keyboard.json index e79032593a..3e3acdb1e1 100644 --- a/keyboards/ffkeebs/puca/keyboard.json +++ b/keyboards/ffkeebs/puca/keyboard.json @@ -54,8 +54,7 @@ "ws2812": { "pin": "D4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_all" }, diff --git a/keyboards/flehrad/numbrero/keyboard.json b/keyboards/flehrad/numbrero/keyboard.json index ac21bb0fbb..353712358a 100644 --- a/keyboards/flehrad/numbrero/keyboard.json +++ b/keyboards/flehrad/numbrero/keyboard.json @@ -24,8 +24,7 @@ "rows": ["F6", "B5", "B4", "E6", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_numbrero_numpad": "LAYOUT_numpad", "LAYOUT_numbrero_ortho": "LAYOUT_ortho" diff --git a/keyboards/flehrad/snagpad/keyboard.json b/keyboards/flehrad/snagpad/keyboard.json index d1a2f3ddee..641e6efedd 100644 --- a/keyboards/flehrad/snagpad/keyboard.json +++ b/keyboards/flehrad/snagpad/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D1", "D0", "D4", "C6", "D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x4", "numpad_5x4"], "layouts": { "LAYOUT_ortho_5x4": { diff --git a/keyboards/flehrad/tradestation/keyboard.json b/keyboards/flehrad/tradestation/keyboard.json index b753ce2f8e..55b75c4d51 100644 --- a/keyboards/flehrad/tradestation/keyboard.json +++ b/keyboards/flehrad/tradestation/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D1", "C6", "D4", "D0"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x4"], "layout_aliases": { "LAYOUT_tradestation": "LAYOUT_4x2u" diff --git a/keyboards/for_science/keyboard.json b/keyboards/for_science/keyboard.json index 5ae7808d42..62718933cd 100644 --- a/keyboards/for_science/keyboard.json +++ b/keyboards/for_science/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D4", "D7", "E6", "B4", "B5"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_split_4x5_3": { "layout": [ diff --git a/keyboards/fr4/southpaw75/keyboard.json b/keyboards/fr4/southpaw75/keyboard.json index dc919b2ee4..c5d5094c96 100644 --- a/keyboards/fr4/southpaw75/keyboard.json +++ b/keyboards/fr4/southpaw75/keyboard.json @@ -25,8 +25,7 @@ "rows": ["D3", "D2", "D1", "D0", "D4", "C6", "D7", "E6", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/fr4/unix60/keyboard.json b/keyboards/fr4/unix60/keyboard.json index 97da97dd0e..7f7bc3fbc7 100644 --- a/keyboards/fr4/unix60/keyboard.json +++ b/keyboards/fr4/unix60/keyboard.json @@ -19,8 +19,7 @@ "rows": ["D3", "D2", "D1", "D0", "D4", "C6", "D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": [ "60_hhkb" ], diff --git a/keyboards/fractal/keyboard.json b/keyboards/fractal/keyboard.json index 1e322e63b4..38a8bf4593 100644 --- a/keyboards/fractal/keyboard.json +++ b/keyboards/fractal/keyboard.json @@ -13,8 +13,7 @@ "rows": ["B1", "F7", "F6", "F5", "F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/free_willy/keyboard.json b/keyboards/free_willy/keyboard.json index 815f5808f5..d6d7d2d155 100644 --- a/keyboards/free_willy/keyboard.json +++ b/keyboards/free_willy/keyboard.json @@ -19,8 +19,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/fungo/rev1/keyboard.json b/keyboards/fungo/rev1/keyboard.json index 0b0abec8e7..e494bce0ad 100644 --- a/keyboards/fungo/rev1/keyboard.json +++ b/keyboards/fungo/rev1/keyboard.json @@ -40,8 +40,7 @@ "resync": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "debounce": 3, "tapping": { "toggle": 3 diff --git a/keyboards/funky40/keyboard.json b/keyboards/funky40/keyboard.json index 0658fc4974..856a9262f0 100644 --- a/keyboards/funky40/keyboard.json +++ b/keyboards/funky40/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D4", "C6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/gl516/a52gl/keyboard.json b/keyboards/gl516/a52gl/keyboard.json index ad4921f635..4167f7ffc1 100644 --- a/keyboards/gl516/a52gl/keyboard.json +++ b/keyboards/gl516/a52gl/keyboard.json @@ -8,8 +8,7 @@ "pid": "0xE8D1", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/gl516/j73gl/keyboard.json b/keyboards/gl516/j73gl/keyboard.json index 5fba198a71..06f1a8d763 100644 --- a/keyboards/gl516/j73gl/keyboard.json +++ b/keyboards/gl516/j73gl/keyboard.json @@ -26,8 +26,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/gl516/n51gl/keyboard.json b/keyboards/gl516/n51gl/keyboard.json index c1ea4ab579..388541c23a 100644 --- a/keyboards/gl516/n51gl/keyboard.json +++ b/keyboards/gl516/n51gl/keyboard.json @@ -31,8 +31,7 @@ {"pin_a": "D7", "pin_b": "E6", "resolution": 3} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/gowla/keyboard.json b/keyboards/gowla/keyboard.json index f4f0b96838..0922862146 100644 --- a/keyboards/gowla/keyboard.json +++ b/keyboards/gowla/keyboard.json @@ -19,8 +19,7 @@ "rows": ["D1", "D0", "D4"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_3x3": { "layout": [ diff --git a/keyboards/halfcliff/keyboard.json b/keyboards/halfcliff/keyboard.json index 7d780c016a..3cc2b0de33 100644 --- a/keyboards/halfcliff/keyboard.json +++ b/keyboards/halfcliff/keyboard.json @@ -29,8 +29,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/hifumi/keyboard.json b/keyboards/hifumi/keyboard.json index 320c14a2be..e859ceef69 100644 --- a/keyboards/hifumi/keyboard.json +++ b/keyboards/hifumi/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/horizon/keyboard.json b/keyboards/horizon/keyboard.json index 8dabea33a3..cb70b74470 100644 --- a/keyboards/horizon/keyboard.json +++ b/keyboards/horizon/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D3", "D2", "D1", "F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ibnuda/alicia_cook/keyboard.json b/keyboards/ibnuda/alicia_cook/keyboard.json index ba9e22f63b..d8a98f92ed 100644 --- a/keyboards/ibnuda/alicia_cook/keyboard.json +++ b/keyboards/ibnuda/alicia_cook/keyboard.json @@ -19,8 +19,7 @@ "rows": ["D2", "D3", "F4", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_all": { "layout": [ diff --git a/keyboards/ibnuda/gurindam/keyboard.json b/keyboards/ibnuda/gurindam/keyboard.json index f136c8ecb2..72fdba4f7f 100644 --- a/keyboards/ibnuda/gurindam/keyboard.json +++ b/keyboards/ibnuda/gurindam/keyboard.json @@ -43,8 +43,7 @@ "rows": ["B5", "B4", "E6", "D7", "C6", "D4", "D0", "D1", "D2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ibnuda/squiggle/rev1/keyboard.json b/keyboards/ibnuda/squiggle/rev1/keyboard.json index 41061674a9..e614da39bd 100644 --- a/keyboards/ibnuda/squiggle/rev1/keyboard.json +++ b/keyboards/ibnuda/squiggle/rev1/keyboard.json @@ -19,8 +19,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/ivndbt/late9/rev1/keyboard.json b/keyboards/ivndbt/late9/rev1/keyboard.json index a9bc229588..523ae83492 100644 --- a/keyboards/ivndbt/late9/rev1/keyboard.json +++ b/keyboards/ivndbt/late9/rev1/keyboard.json @@ -24,8 +24,7 @@ "nkro": true, "oled": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ivndbt/neopad/rev1/keyboard.json b/keyboards/ivndbt/neopad/rev1/keyboard.json index a07852acf0..f40f06549b 100755 --- a/keyboards/ivndbt/neopad/rev1/keyboard.json +++ b/keyboards/ivndbt/neopad/rev1/keyboard.json @@ -28,8 +28,7 @@ {"pin_a": "D4", "pin_b": "C6"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "tapping": { "toggle": 2 }, diff --git a/keyboards/jiran/info.json b/keyboards/jiran/info.json index b06266ec8c..00c4239781 100644 --- a/keyboards/jiran/info.json +++ b/keyboards/jiran/info.json @@ -19,6 +19,5 @@ "pin": "D1" } }, - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/jorne/rev1/keyboard.json b/keyboards/jorne/rev1/keyboard.json index 4e905e4bfc..7fffc8be02 100644 --- a/keyboards/jorne/rev1/keyboard.json +++ b/keyboards/jorne/rev1/keyboard.json @@ -32,8 +32,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, From d044a6bcc2c6a643e83754f5b746ea0dd900607f Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 17 Jun 2025 04:23:33 +0100 Subject: [PATCH 436/592] Configure boards to use development_board - DE (#25369) --- keyboards/dailycraft/bat43/info.json | 3 +-- keyboards/dailycraft/claw44/rev1/keyboard.json | 3 +-- keyboards/dailycraft/sandbox/rev1/keyboard.json | 3 +-- keyboards/dailycraft/sandbox/rev2/keyboard.json | 3 +-- keyboards/dailycraft/wings42/rev1/keyboard.json | 3 +-- keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json | 3 +-- keyboards/dailycraft/wings42/rev2/keyboard.json | 3 +-- keyboards/delikeeb/flatbread60/keyboard.json | 3 +-- keyboards/delikeeb/vaneela/keyboard.json | 3 +-- keyboards/delikeeb/vaneelaex/keyboard.json | 3 +-- keyboards/deltasplit75/v2/keyboard.json | 3 +-- keyboards/dm9records/ergoinu/keyboard.json | 3 +-- keyboards/doodboard/duckboard/keyboard.json | 3 +-- keyboards/doodboard/duckboard_r2/keyboard.json | 3 +-- keyboards/draculad/keyboard.json | 3 +-- keyboards/drhigsby/bkf/keyboard.json | 3 +-- keyboards/drhigsby/dubba175/keyboard.json | 3 +-- keyboards/drhigsby/ogurec/info.json | 3 +-- keyboards/drhigsby/packrat/keyboard.json | 3 +-- keyboards/dumbo/keyboard.json | 3 +-- keyboards/dumbpad/v0x/keyboard.json | 3 +-- keyboards/dumbpad/v0x_dualencoder/keyboard.json | 3 +-- keyboards/dumbpad/v0x_right/keyboard.json | 3 +-- keyboards/dumbpad/v1x/keyboard.json | 3 +-- keyboards/dumbpad/v1x_dualencoder/keyboard.json | 3 +-- keyboards/dumbpad/v1x_oled/keyboard.json | 3 +-- keyboards/dumbpad/v1x_right/keyboard.json | 3 +-- keyboards/dumbpad/v3x/keyboard.json | 3 +-- keyboards/earth_rover/keyboard.json | 3 +-- keyboards/eco/info.json | 3 +-- keyboards/elephant42/keyboard.json | 3 +-- keyboards/emajesty/eiri/keyboard.json | 3 +-- keyboards/emptystring/nqg/keyboard.json | 3 +-- keyboards/ergoslab/rev1/keyboard.json | 3 +-- keyboards/ergotravel/rev1/keyboard.json | 3 +-- keyboards/evancookaudio/sleepingdinosaur/keyboard.json | 3 +-- keyboards/evancookaudio/tenpad/keyboard.json | 3 +-- 37 files changed, 37 insertions(+), 74 deletions(-) diff --git a/keyboards/dailycraft/bat43/info.json b/keyboards/dailycraft/bat43/info.json index 90e14e3434..a8b6f83792 100644 --- a/keyboards/dailycraft/bat43/info.json +++ b/keyboards/dailycraft/bat43/info.json @@ -18,6 +18,5 @@ "rows": ["E6", "D7", "C6", "D4", "F7", "F6", "F5", "F4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/dailycraft/claw44/rev1/keyboard.json b/keyboards/dailycraft/claw44/rev1/keyboard.json index 2391bc262f..c10fa57cb3 100644 --- a/keyboards/dailycraft/claw44/rev1/keyboard.json +++ b/keyboards/dailycraft/claw44/rev1/keyboard.json @@ -18,8 +18,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/dailycraft/sandbox/rev1/keyboard.json b/keyboards/dailycraft/sandbox/rev1/keyboard.json index 50a114457d..19e4e924b2 100644 --- a/keyboards/dailycraft/sandbox/rev1/keyboard.json +++ b/keyboards/dailycraft/sandbox/rev1/keyboard.json @@ -12,8 +12,7 @@ "rows": ["B5", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dailycraft/sandbox/rev2/keyboard.json b/keyboards/dailycraft/sandbox/rev2/keyboard.json index b1991cf56c..d94593cced 100644 --- a/keyboards/dailycraft/sandbox/rev2/keyboard.json +++ b/keyboards/dailycraft/sandbox/rev2/keyboard.json @@ -18,8 +18,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dailycraft/wings42/rev1/keyboard.json b/keyboards/dailycraft/wings42/rev1/keyboard.json index 307b675d06..3f71586581 100644 --- a/keyboards/dailycraft/wings42/rev1/keyboard.json +++ b/keyboards/dailycraft/wings42/rev1/keyboard.json @@ -18,8 +18,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json b/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json index ef5b4331b1..a3ea3c2b45 100644 --- a/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json +++ b/keyboards/dailycraft/wings42/rev1_extkeys/keyboard.json @@ -18,8 +18,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dailycraft/wings42/rev2/keyboard.json b/keyboards/dailycraft/wings42/rev2/keyboard.json index 4d41f54f3b..7ed0fb9967 100644 --- a/keyboards/dailycraft/wings42/rev2/keyboard.json +++ b/keyboards/dailycraft/wings42/rev2/keyboard.json @@ -24,8 +24,7 @@ { "pin_a": "B6", "pin_b": "B2" } ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "encoder": true, diff --git a/keyboards/delikeeb/flatbread60/keyboard.json b/keyboards/delikeeb/flatbread60/keyboard.json index eabb301dc0..2536df862d 100644 --- a/keyboards/delikeeb/flatbread60/keyboard.json +++ b/keyboards/delikeeb/flatbread60/keyboard.json @@ -46,8 +46,7 @@ "rows": ["F6", "B1", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_5x12": { "layout": [ diff --git a/keyboards/delikeeb/vaneela/keyboard.json b/keyboards/delikeeb/vaneela/keyboard.json index 8e30581e70..7a467a59aa 100644 --- a/keyboards/delikeeb/vaneela/keyboard.json +++ b/keyboards/delikeeb/vaneela/keyboard.json @@ -25,8 +25,7 @@ "rows": ["F6", "F7", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_5x12": { "layout": [ diff --git a/keyboards/delikeeb/vaneelaex/keyboard.json b/keyboards/delikeeb/vaneelaex/keyboard.json index 1890c860e6..295ad722b5 100644 --- a/keyboards/delikeeb/vaneelaex/keyboard.json +++ b/keyboards/delikeeb/vaneelaex/keyboard.json @@ -25,8 +25,7 @@ "rows": ["D3", "D2", "D1", "D0", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ss_6x12": { "layout": [ diff --git a/keyboards/deltasplit75/v2/keyboard.json b/keyboards/deltasplit75/v2/keyboard.json index 031d2b9185..efd4217f13 100644 --- a/keyboards/deltasplit75/v2/keyboard.json +++ b/keyboards/deltasplit75/v2/keyboard.json @@ -24,8 +24,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/dm9records/ergoinu/keyboard.json b/keyboards/dm9records/ergoinu/keyboard.json index 0e124d1a21..05150f5e06 100644 --- a/keyboards/dm9records/ergoinu/keyboard.json +++ b/keyboards/dm9records/ergoinu/keyboard.json @@ -25,8 +25,7 @@ "ws2812": { "pin": "B6" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/doodboard/duckboard/keyboard.json b/keyboards/doodboard/duckboard/keyboard.json index 7e88a22e10..b5f07ead98 100644 --- a/keyboards/doodboard/duckboard/keyboard.json +++ b/keyboards/doodboard/duckboard/keyboard.json @@ -37,8 +37,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/doodboard/duckboard_r2/keyboard.json b/keyboards/doodboard/duckboard_r2/keyboard.json index 6cbf51bcb4..cffb2904e3 100644 --- a/keyboards/doodboard/duckboard_r2/keyboard.json +++ b/keyboards/doodboard/duckboard_r2/keyboard.json @@ -40,8 +40,7 @@ "bootmagic": { "matrix": [0, 1] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/draculad/keyboard.json b/keyboards/draculad/keyboard.json index c72bda7c38..9c21b2a97d 100644 --- a/keyboards/draculad/keyboard.json +++ b/keyboards/draculad/keyboard.json @@ -48,8 +48,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/drhigsby/bkf/keyboard.json b/keyboards/drhigsby/bkf/keyboard.json index 76808f93de..17f1adc364 100644 --- a/keyboards/drhigsby/bkf/keyboard.json +++ b/keyboards/drhigsby/bkf/keyboard.json @@ -31,8 +31,7 @@ {"pin_a": "F4", "pin_b": "F5"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_625uC": { "layout": [ diff --git a/keyboards/drhigsby/dubba175/keyboard.json b/keyboards/drhigsby/dubba175/keyboard.json index 0f395d10ff..f1d55d1855 100644 --- a/keyboards/drhigsby/dubba175/keyboard.json +++ b/keyboards/drhigsby/dubba175/keyboard.json @@ -25,8 +25,7 @@ "rows": ["B1", "B3", "B2", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/drhigsby/ogurec/info.json b/keyboards/drhigsby/ogurec/info.json index 7e65e924e2..bc43e1563a 100644 --- a/keyboards/drhigsby/ogurec/info.json +++ b/keyboards/drhigsby/ogurec/info.json @@ -25,6 +25,5 @@ "rows": ["F6", "B6", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/drhigsby/packrat/keyboard.json b/keyboards/drhigsby/packrat/keyboard.json index b41b383aee..8713ec034d 100644 --- a/keyboards/drhigsby/packrat/keyboard.json +++ b/keyboards/drhigsby/packrat/keyboard.json @@ -31,8 +31,7 @@ {"pin_a": "F5", "pin_b": "F4"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_3uc": { "layout": [ diff --git a/keyboards/dumbo/keyboard.json b/keyboards/dumbo/keyboard.json index 8026f22790..4f8f04c06c 100644 --- a/keyboards/dumbo/keyboard.json +++ b/keyboards/dumbo/keyboard.json @@ -32,8 +32,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/dumbpad/v0x/keyboard.json b/keyboards/dumbpad/v0x/keyboard.json index f0cecd8063..9d25d80494 100644 --- a/keyboards/dumbpad/v0x/keyboard.json +++ b/keyboards/dumbpad/v0x/keyboard.json @@ -15,8 +15,7 @@ "bootmagic": { "matrix": [3, 0] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v0x_dualencoder/keyboard.json b/keyboards/dumbpad/v0x_dualencoder/keyboard.json index 71b501cedd..0754f301b7 100644 --- a/keyboards/dumbpad/v0x_dualencoder/keyboard.json +++ b/keyboards/dumbpad/v0x_dualencoder/keyboard.json @@ -16,8 +16,7 @@ "bootmagic": { "matrix": [3, 0] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v0x_right/keyboard.json b/keyboards/dumbpad/v0x_right/keyboard.json index 883f2f785d..f581dd8e87 100644 --- a/keyboards/dumbpad/v0x_right/keyboard.json +++ b/keyboards/dumbpad/v0x_right/keyboard.json @@ -15,8 +15,7 @@ "bootmagic": { "matrix": [3, 4] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v1x/keyboard.json b/keyboards/dumbpad/v1x/keyboard.json index 9ab78e1a9f..c78bbfef04 100644 --- a/keyboards/dumbpad/v1x/keyboard.json +++ b/keyboards/dumbpad/v1x/keyboard.json @@ -15,8 +15,7 @@ "bootmagic": { "matrix": [3, 0] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v1x_dualencoder/keyboard.json b/keyboards/dumbpad/v1x_dualencoder/keyboard.json index f3aeafe625..413d1970a0 100644 --- a/keyboards/dumbpad/v1x_dualencoder/keyboard.json +++ b/keyboards/dumbpad/v1x_dualencoder/keyboard.json @@ -16,8 +16,7 @@ "bootmagic": { "matrix": [3, 0] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v1x_oled/keyboard.json b/keyboards/dumbpad/v1x_oled/keyboard.json index 3a437699b8..6547b9ca39 100644 --- a/keyboards/dumbpad/v1x_oled/keyboard.json +++ b/keyboards/dumbpad/v1x_oled/keyboard.json @@ -13,8 +13,7 @@ {"pin_a": "E6", "pin_b": "D7"} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/dumbpad/v1x_right/keyboard.json b/keyboards/dumbpad/v1x_right/keyboard.json index 583d60bc5d..b9a62f2e69 100644 --- a/keyboards/dumbpad/v1x_right/keyboard.json +++ b/keyboards/dumbpad/v1x_right/keyboard.json @@ -15,8 +15,7 @@ "bootmagic": { "matrix": [3, 4] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/dumbpad/v3x/keyboard.json b/keyboards/dumbpad/v3x/keyboard.json index 7ea29cd9ad..58b8da5b3a 100644 --- a/keyboards/dumbpad/v3x/keyboard.json +++ b/keyboards/dumbpad/v3x/keyboard.json @@ -55,8 +55,7 @@ "ws2812": { "pin": "D1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": false, diff --git a/keyboards/earth_rover/keyboard.json b/keyboards/earth_rover/keyboard.json index 516585ca24..b3f5d2bae4 100644 --- a/keyboards/earth_rover/keyboard.json +++ b/keyboards/earth_rover/keyboard.json @@ -25,8 +25,7 @@ "rows": ["D4", "C6", "D7", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/eco/info.json b/keyboards/eco/info.json index f62d91a01f..a234ea2399 100644 --- a/keyboards/eco/info.json +++ b/keyboards/eco/info.json @@ -6,8 +6,7 @@ "vid": "0x1337", "pid": "0x6006" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "qmk": { "locking": { "enabled": true, diff --git a/keyboards/elephant42/keyboard.json b/keyboards/elephant42/keyboard.json index d1d321623e..60b135b086 100644 --- a/keyboards/elephant42/keyboard.json +++ b/keyboards/elephant42/keyboard.json @@ -54,8 +54,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": false, diff --git a/keyboards/emajesty/eiri/keyboard.json b/keyboards/emajesty/eiri/keyboard.json index 2ad711bf9e..3dd0ab0888 100644 --- a/keyboards/emajesty/eiri/keyboard.json +++ b/keyboards/emajesty/eiri/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B4", "B5", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/emptystring/nqg/keyboard.json b/keyboards/emptystring/nqg/keyboard.json index 17116704c7..226ab34303 100644 --- a/keyboards/emptystring/nqg/keyboard.json +++ b/keyboards/emptystring/nqg/keyboard.json @@ -18,8 +18,7 @@ "rows": ["B6", "B2", "B3", "B1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ergoslab/rev1/keyboard.json b/keyboards/ergoslab/rev1/keyboard.json index 0d017d7a97..59e3e038e9 100644 --- a/keyboards/ergoslab/rev1/keyboard.json +++ b/keyboards/ergoslab/rev1/keyboard.json @@ -25,8 +25,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/ergotravel/rev1/keyboard.json b/keyboards/ergotravel/rev1/keyboard.json index 0c34bf04bd..803653fb70 100644 --- a/keyboards/ergotravel/rev1/keyboard.json +++ b/keyboards/ergotravel/rev1/keyboard.json @@ -25,8 +25,7 @@ "ws2812": { "pin": "D3" }, - "bootloader": "caterina", - "processor": "atmega32u4", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/evancookaudio/sleepingdinosaur/keyboard.json b/keyboards/evancookaudio/sleepingdinosaur/keyboard.json index c6b77a26c8..4bedb82481 100644 --- a/keyboards/evancookaudio/sleepingdinosaur/keyboard.json +++ b/keyboards/evancookaudio/sleepingdinosaur/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D1", "D0", "D4", "C6", "D7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/evancookaudio/tenpad/keyboard.json b/keyboards/evancookaudio/tenpad/keyboard.json index 46107a1c9b..c52556b4f4 100644 --- a/keyboards/evancookaudio/tenpad/keyboard.json +++ b/keyboards/evancookaudio/tenpad/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D0", "D1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_ortho_2x5": { "layout": [ 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 437/592] [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 a4e5ed88fc..9fad83726e 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 438/592] 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 4e8a44d3bc..1dd58441fc 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 439/592] 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 e1ad9aac9e..f04b67d3aa 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 440/592] 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 b48e8c3586..1a31316f9c 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 441/592] 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 0000000000..f0a03453b4 --- /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 0000000000..5f5ccb88b0 --- /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 0000000000..ceda19acba --- /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 442/592] [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 cf170721c8..891a4f6f17 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 6ff422f89b..66dfbe6ded 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 da2ecc9a85..8b420d30b6 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 443/592] 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 7d0664c0a6..595841449e 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 444/592] 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 4c82a557ee..2920da52e1 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 a564e4e4e1..df7df65678 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 0000000000..ee32568148 --- /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 445/592] 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 d1f01fc8cb..b3ac9906db 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 2be5285394..abadaccd34 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 446/592] 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 a1c184eaac..9304a0fa8d 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 447/592] 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 8fdd83c18d..d533e41aaa 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 448/592] 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 36a6d63c33..042c8df129 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 bc5c5e3251d019f3e070d7ea9e5c77501b25738d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 27 Jun 2025 08:17:28 +0100 Subject: [PATCH 449/592] Align sleep_led logic (#25395) --- quantum/command.c | 5 ++++- quantum/quantum.c | 12 ++++++++++++ tmk_core/protocol/chibios/chibios.c | 3 --- tmk_core/protocol/chibios/usb_main.c | 12 ------------ tmk_core/protocol/lufa/lufa.c | 13 ------------- tmk_core/protocol/vusb/protocol.c | 24 ++---------------------- 6 files changed, 18 insertions(+), 51 deletions(-) diff --git a/quantum/command.c b/quantum/command.c index 998d9b9aa1..ea2fd68e2b 100644 --- a/quantum/command.c +++ b/quantum/command.c @@ -28,7 +28,6 @@ along with this program. If not, see . #include "action_layer.h" #include "action_util.h" #include "eeconfig.h" -#include "sleep_led.h" #include "led.h" #include "command.h" #include "quantum.h" @@ -39,6 +38,10 @@ along with this program. If not, see . # include "backlight.h" #endif +#ifdef SLEEP_LED_ENABLE +# include "sleep_led.h" +#endif + #if defined(MOUSEKEY_ENABLE) # include "mousekey.h" #endif diff --git a/quantum/quantum.c b/quantum/quantum.c index cc20c7db2b..09e5fe1dac 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -17,6 +17,10 @@ #include "quantum.h" #include "process_quantum.h" +#ifdef SLEEP_LED_ENABLE +# include "sleep_led.h" +#endif + #ifdef BACKLIGHT_ENABLE # include "process_backlight.h" #endif @@ -487,6 +491,10 @@ void suspend_power_down_quantum(void) { backlight_level_noeeprom(0); # endif +# ifdef SLEEP_LED_ENABLE + sleep_led_enable(); +# endif + # ifdef LED_MATRIX_ENABLE led_matrix_task(); # endif @@ -533,6 +541,10 @@ __attribute__((weak)) void suspend_wakeup_init_quantum(void) { backlight_init(); #endif +#ifdef SLEEP_LED_ENABLE + sleep_led_disable(); +#endif + // Restore LED indicators led_wakeup(); diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 19d8121e34..5720bc3c4c 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -40,9 +40,6 @@ # define EARLY_INIT_PERFORM_BOOTLOADER_JUMP FALSE #endif -#ifdef SLEEP_LED_ENABLE -# include "sleep_led.h" -#endif #ifdef MIDI_ENABLE # include "qmk_midi.h" #endif diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index f9d7f5c4d6..b798a8d1cb 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -21,10 +21,6 @@ #include "host.h" #include "suspend.h" #include "timer.h" -#ifdef SLEEP_LED_ENABLE -# include "sleep_led.h" -# include "led.h" -#endif #include "wait.h" #include "usb_endpoints.h" #include "usb_device_state.h" @@ -131,19 +127,11 @@ static inline bool usb_event_queue_dequeue(usbevent_t *event) { static inline void usb_event_suspend_handler(void) { usb_device_state_set_suspend(USB_DRIVER.configuration != 0, USB_DRIVER.configuration); -#ifdef SLEEP_LED_ENABLE - sleep_led_enable(); -#endif /* SLEEP_LED_ENABLE */ } static inline void usb_event_wakeup_handler(void) { suspend_wakeup_init(); usb_device_state_set_resume(USB_DRIVER.configuration != 0, USB_DRIVER.configuration); -#ifdef SLEEP_LED_ENABLE - sleep_led_disable(); - // NOTE: converters may not accept this - led_set(host_keyboard_leds()); -#endif /* SLEEP_LED_ENABLE */ } bool last_suspend_state = false; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d59468133c..e13f4b548e 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -44,9 +44,6 @@ #include "led.h" #include "sendchar.h" #include "debug.h" -#ifdef SLEEP_LED_ENABLE -# include "sleep_led.h" -#endif #include "suspend.h" #include "wait.h" @@ -278,10 +275,6 @@ void EVENT_USB_Device_Reset(void) { void EVENT_USB_Device_Suspend(void) { print("[S]"); usb_device_state_set_suspend(USB_Device_ConfigurationNumber != 0, USB_Device_ConfigurationNumber); - -#ifdef SLEEP_LED_ENABLE - sleep_led_enable(); -#endif } /** \brief Event USB Device Connect @@ -295,12 +288,6 @@ void EVENT_USB_Device_WakeUp(void) { #endif usb_device_state_set_resume(USB_DeviceState == DEVICE_STATE_Configured, USB_Device_ConfigurationNumber); - -#ifdef SLEEP_LED_ENABLE - sleep_led_disable(); - // NOTE: converters may not accept this - led_set(host_keyboard_leds()); -#endif } #ifdef CONSOLE_ENABLE diff --git a/tmk_core/protocol/vusb/protocol.c b/tmk_core/protocol/vusb/protocol.c index 41ccf451fd..e2d0c4112e 100644 --- a/tmk_core/protocol/vusb/protocol.c +++ b/tmk_core/protocol/vusb/protocol.c @@ -27,10 +27,6 @@ #include "wait.h" #include "sendchar.h" -#ifdef SLEEP_LED_ENABLE -# include "sleep_led.h" -#endif - /* This is from main.c of USBaspLoader */ static void initForUsbConnectivity(void) { uint8_t i = 0; @@ -64,22 +60,6 @@ static inline void vusb_send_remote_wakeup(void) { bool vusb_suspended = false; -static inline void vusb_suspend(void) { -#ifdef SLEEP_LED_ENABLE - sleep_led_enable(); -#endif - - suspend_power_down(); -} - -static inline void vusb_wakeup(void) { - suspend_wakeup_init(); - -#ifdef SLEEP_LED_ENABLE - sleep_led_disable(); -#endif -} - /** \brief Setup USB * * FIXME: Needs doc @@ -133,7 +113,7 @@ void protocol_pre_task(void) { if (should_do_suspend()) { dprintln("suspending keyboard"); while (should_do_suspend()) { - vusb_suspend(); + suspend_power_down(); if (suspend_wakeup_condition()) { vusb_send_remote_wakeup(); @@ -148,7 +128,7 @@ void protocol_pre_task(void) { # endif } } - vusb_wakeup(); + suspend_wakeup_init(); } #endif } From a1a5869ef871937c2ae7646ab639c4f5ffe59355 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 27 Jun 2025 08:17:45 +0100 Subject: [PATCH 450/592] Add MATRIX_MASKED DD config (#25383) --- data/mappings/info_config.hjson | 1 + data/schemas/keyboard.jsonschema | 1 + docs/reference_info_json.md | 3 +++ lib/python/qmk/cli/generate/config_h.py | 15 --------------- lib/python/qmk/info.py | 20 ++++++++++++++++++++ 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index e4def1a4d7..356dd6ba52 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -120,6 +120,7 @@ "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "flag"}, "MATRIX_INPUT_PRESSED_STATE": {"info_key": "matrix_pins.input_pressed_state", "value_type": "int"}, "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"}, + "MATRIX_MASKED": {"info_key": "matrix_pins.masked", "value_type": "flag"}, // Mouse Keys "MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 3aa259605e..13ceec5afa 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -473,6 +473,7 @@ "ghost": {"type": "boolean"}, "input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"}, "io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"}, + "masked": {"type": "boolean"}, "direct": { "type": "array", "items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"} diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index a64f2992b5..71d1c5c865 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -480,6 +480,9 @@ Configures the [LED Matrix](features/led_matrix) feature. * `io_delay` Number * The amount of time to wait between row/col selection and col/row pin reading, in microseconds. * Default: `30` (30 µs) + * `masked` Boolean + * Whether configured intersections should be ignored. + * Default: `false` * `rows` Array: Pin * A list of GPIO pins connected to the matrix rows. * Example: `["B0", "B1", "B2"]` diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py index d613f7b92c..d6d0299291 100755 --- a/lib/python/qmk/cli/generate/config_h.py +++ b/lib/python/qmk/cli/generate/config_h.py @@ -72,19 +72,6 @@ def generate_matrix_size(kb_info_json, config_h_lines): config_h_lines.append(generate_define('MATRIX_ROWS', kb_info_json['matrix_size']['rows'])) -def generate_matrix_masked(kb_info_json, config_h_lines): - """"Enable matrix mask if required""" - mask_required = False - - if 'matrix_grid' in kb_info_json.get('dip_switch', {}): - mask_required = True - if 'matrix_grid' in kb_info_json.get('split', {}).get('handedness', {}): - mask_required = True - - if mask_required: - config_h_lines.append(generate_define('MATRIX_MASKED')) - - def generate_config_items(kb_info_json, config_h_lines): """Iterate through the info_config map to generate basic config values. """ @@ -202,8 +189,6 @@ def generate_config_h(cli): generate_matrix_size(kb_info_json, config_h_lines) - generate_matrix_masked(kb_info_json, config_h_lines) - if 'matrix_pins' in kb_info_json: config_h_lines.append(matrix_pins(kb_info_json['matrix_pins'])) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index db8a02d132..b4fa481b1b 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -254,6 +254,7 @@ def info_json(keyboard, force_layout=None): # Ensure that we have various calculated values info_data = _matrix_size(info_data) info_data = _joystick_axis_count(info_data) + info_data = _matrix_masked(info_data) # Merge in data from info_data = _extract_led_config(info_data, str(keyboard)) @@ -830,6 +831,25 @@ def _joystick_axis_count(info_data): return info_data +def _matrix_masked(info_data): + """"Add info_data['matrix_pins.masked'] if required""" + mask_required = False + + if 'matrix_grid' in info_data.get('dip_switch', {}): + mask_required = True + if 'matrix_grid' in info_data.get('split', {}).get('handedness', {}): + mask_required = True + + if mask_required: + if 'masked' not in info_data.get('matrix_pins', {}): + if 'matrix_pins' not in info_data: + info_data['matrix_pins'] = {} + + info_data['matrix_pins']['masked'] = True + + return info_data + + def _check_matrix(info_data): """Check the matrix to ensure that row/column count is consistent. """ From 21ca1eb7aefaec962057185b7903897824604c17 Mon Sep 17 00:00:00 2001 From: Less/Rikki <86894501+lesshonor@users.noreply.github.com> Date: Fri, 27 Jun 2025 15:04:52 -0400 Subject: [PATCH 451/592] refactor(mercutio): layouts & reformatting (#25408) --- keyboards/mechwild/mercutio/keyboard.json | 339 ++++++++++++++++-- .../mercutio/keymaps/default/keymap.c | 24 +- .../keymaps/default_625u_space/keymap.c | 10 +- 3 files changed, 318 insertions(+), 55 deletions(-) diff --git a/keyboards/mechwild/mercutio/keyboard.json b/keyboards/mechwild/mercutio/keyboard.json index d0b7d51029..58ff0b216e 100644 --- a/keyboards/mechwild/mercutio/keyboard.json +++ b/keyboards/mechwild/mercutio/keyboard.json @@ -1,12 +1,14 @@ { - "keyboard_name": "Mercutio", "manufacturer": "MechWild", - "url": "mechwild.com", + "keyboard_name": "Mercutio", "maintainer": "kylemccreery", - "usb": { - "vid": "0x6D77", - "pid": "0x1703", - "device_version": "1.0.0" + "bootloader": "usbasploader", + "bootloader_instructions": "Hold down the BOOT button, then tap the RESET button.", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "B4", "pin_b": "B5"} + ] }, "features": { "bootmagic": true, @@ -20,26 +22,72 @@ "cols": ["B0", "D7", "D6", "D5", "B1", "B2", "B3"], "rows": ["D0", "D1", "D4", "C3", "C0", "C1", "C2"] }, - "diode_direction": "COL2ROW", - "encoder": { - "rotary": [ - {"pin_a": "B4", "pin_b": "B5"} - ] - }, + "processor": "atmega328p", "qmk": { - "tap_keycode_delay": 10, "locking": { "enabled": true, "resync": true - } + }, + "tap_keycode_delay": 10 + }, + "url": "https://mechwild.com", + "usb": { + "device_version": "1.0.0", + "pid": "0x1703", + "vid": "0x6D77" }, - "processor": "atmega328p", - "bootloader": "usbasploader", "layouts": { - "LAYOUT_all": { + "LAYOUT_625u_space": { "layout": [ - {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0}, - + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "'", "matrix": [4, 1], "x": 10.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 11.75, "y": 2, "w": 1.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "/", "matrix": [2, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [3, 5], "x": 3.25, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_all": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, @@ -52,7 +100,6 @@ {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, - {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, @@ -65,7 +112,6 @@ {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, {"label": "'", "matrix": [4, 1], "x": 10.75, "y": 2}, {"label": "Enter", "matrix": [5, 3], "x": 11.75, "y": 2, "w": 1.25}, - {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.25}, {"label": "/", "matrix": [2, 1], "x": 1.25, "y": 3}, {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, @@ -78,7 +124,6 @@ {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, - {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, @@ -90,10 +135,9 @@ {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} ] }, - "LAYOUT_625u_space": { + "LAYOUT_full_enter": { "layout": [ - {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0}, - + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, @@ -106,7 +150,6 @@ {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, - {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, @@ -117,9 +160,56 @@ {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, - {"label": "'", "matrix": [4, 1], "x": 10.75, "y": 2}, - {"label": "Enter", "matrix": [5, 3], "x": 11.75, "y": 2, "w": 1.25}, - + {"label": "Enter", "matrix": [5, 3], "x": 10.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.25}, + {"label": "/", "matrix": [2, 1], "x": 1.25, "y": 3}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [3, 4], "x": 3.5, "y": 4, "w": 2.25}, + {"label": "Space", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "Space", "matrix": [3, 6], "x": 6.75, "y": 4, "w": 2.75}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_full_enter_625u_space": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 10.75, "y": 2, "w": 2.25}, {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 1.25}, {"label": "/", "matrix": [2, 1], "x": 1.25, "y": 3}, {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, @@ -132,7 +222,6 @@ {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, - {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4}, @@ -141,6 +230,196 @@ {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} ] + }, + "LAYOUT_full_enter_full_lshift_625u_space": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 10.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [3, 5], "x": 3.25, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_full_lshift": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "'", "matrix": [4, 1], "x": 10.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 11.75, "y": 2, "w": 1.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [3, 4], "x": 3.5, "y": 4, "w": 2.25}, + {"label": "Space", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "Space", "matrix": [3, 6], "x": 6.75, "y": 4, "w": 2.75}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_full_lshift_625u_space": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "'", "matrix": [4, 1], "x": 10.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 11.75, "y": 2, "w": 1.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4}, + {"label": "Space", "matrix": [3, 5], "x": 3.25, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_full_lshift_full_enter": { + "layout": [ + {"label": "Mute", "matrix": [4, 2], "x": 12, "y": 0, "encoder": 0}, + {"label": "Tab", "matrix": [0, 0], "x": 0, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [0, 1], "x": 1.5, "y": 1}, + {"label": "W", "matrix": [0, 2], "x": 2.5, "y": 1}, + {"label": "E", "matrix": [0, 3], "x": 3.5, "y": 1}, + {"label": "R", "matrix": [0, 4], "x": 4.5, "y": 1}, + {"label": "T", "matrix": [0, 5], "x": 5.5, "y": 1}, + {"label": "Y", "matrix": [0, 6], "x": 6.5, "y": 1}, + {"label": "U", "matrix": [4, 6], "x": 7.5, "y": 1}, + {"label": "I", "matrix": [4, 5], "x": 8.5, "y": 1}, + {"label": "O", "matrix": [4, 4], "x": 9.5, "y": 1}, + {"label": "P", "matrix": [4, 3], "x": 10.5, "y": 1}, + {"label": "Backspace", "matrix": [5, 2], "x": 11.5, "y": 1, "w": 1.5}, + {"label": "Fn", "matrix": [1, 0], "x": 0, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [1, 1], "x": 1.75, "y": 2}, + {"label": "S", "matrix": [1, 2], "x": 2.75, "y": 2}, + {"label": "D", "matrix": [1, 3], "x": 3.75, "y": 2}, + {"label": "F", "matrix": [1, 4], "x": 4.75, "y": 2}, + {"label": "G", "matrix": [1, 5], "x": 5.75, "y": 2}, + {"label": "H", "matrix": [1, 6], "x": 6.75, "y": 2}, + {"label": "J", "matrix": [5, 6], "x": 7.75, "y": 2}, + {"label": "K", "matrix": [5, 5], "x": 8.75, "y": 2}, + {"label": "L", "matrix": [5, 4], "x": 9.75, "y": 2}, + {"label": "Enter", "matrix": [5, 3], "x": 10.75, "y": 2, "w": 2.25}, + {"label": "Shift", "matrix": [2, 0], "x": 0, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [6, 1], "x": 2.25, "y": 3}, + {"label": "X", "matrix": [2, 3], "x": 3.25, "y": 3}, + {"label": "C", "matrix": [2, 4], "x": 4.25, "y": 3}, + {"label": "V", "matrix": [2, 5], "x": 5.25, "y": 3}, + {"label": "B", "matrix": [2, 6], "x": 6.25, "y": 3}, + {"label": "N", "matrix": [6, 6], "x": 7.25, "y": 3}, + {"label": "M", "matrix": [6, 5], "x": 8.25, "y": 3}, + {"label": ",", "matrix": [6, 4], "x": 9.25, "y": 3}, + {"label": ".", "matrix": [6, 3], "x": 10.25, "y": 3}, + {"label": "Shift", "matrix": [6, 2], "x": 11.25, "y": 3, "w": 1.75}, + {"label": "Ctrl", "matrix": [3, 0], "x": 0, "y": 4, "w": 1.25}, + {"label": "GUI", "matrix": [5, 1], "x": 1.25, "y": 4}, + {"label": "Alt", "matrix": [3, 1], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [3, 4], "x": 3.5, "y": 4, "w": 2.25}, + {"label": "Space", "matrix": [3, 5], "x": 5.75, "y": 4}, + {"label": "Space", "matrix": [3, 6], "x": 6.75, "y": 4, "w": 2.75}, + {"label": "Alt", "matrix": [3, 3], "x": 9.5, "y": 4, "w": 1.25}, + {"label": "Fn2", "matrix": [3, 2], "x": 10.75, "y": 4}, + {"label": "Ctrl", "matrix": [2, 2], "x": 11.75, "y": 4, "w": 1.25} + ] } } } diff --git a/keyboards/mechwild/mercutio/keymaps/default/keymap.c b/keyboards/mechwild/mercutio/keymaps/default/keymap.c index 9d5d174c60..bf6b96b8be 100644 --- a/keyboards/mechwild/mercutio/keymaps/default/keymap.c +++ b/keyboards/mechwild/mercutio/keymaps/default/keymap.c @@ -26,24 +26,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( KC_TRNS, - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_TRNS, KC_TRNS, KC_GRV, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_SCLN, KC_TRNS, KC_QUOT, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_SLSH, KC_UP, - KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT ), + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_TRNS, KC_TRNS, KC_GRV, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_SCLN, KC_TRNS, KC_QUOT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_SLSH, KC_UP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT ), [2] = LAYOUT_all( KC_TRNS, - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), - - [3] = LAYOUT_all( - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; #ifdef ENCODER_MAP_ENABLE @@ -51,6 +44,5 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, - [3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, }; #endif diff --git a/keyboards/mechwild/mercutio/keymaps/default_625u_space/keymap.c b/keyboards/mechwild/mercutio/keymaps/default_625u_space/keymap.c index a4cd13134c..b76479a5b9 100644 --- a/keyboards/mechwild/mercutio/keymaps/default_625u_space/keymap.c +++ b/keyboards/mechwild/mercutio/keymaps/default_625u_space/keymap.c @@ -36,13 +36,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______ ), - - [3] = LAYOUT_625u_space( - _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; @@ -50,7 +43,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } }; #endif From 6e55870a82e8cfecd379242fd58829b37fa8ffa4 Mon Sep 17 00:00:00 2001 From: Andrew Litt Date: Fri, 27 Jun 2025 14:11:43 -0500 Subject: [PATCH 452/592] `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 41a3ad8df7..07d8bdbdb4 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 453/592] [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 0000000000..5e5c1eb155 --- /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 0000000000..737b1927a3 --- /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 0000000000..132c1a4e97 --- /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 0000000000..ecddf112d2 --- /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 0000000000..03624a3d2f --- /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 0000000000..be888ece75 --- /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 0000000000..9a9df177b9 --- /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 0000000000..8bba6f5d5d --- /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 0000000000..4dc77604c4 --- /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 454/592] [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 d19b86cb46..0f5c4a5f96 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 5b0039aae60b97dad7a07f80e3ed2f60fe3bb45c Mon Sep 17 00:00:00 2001 From: Grigory Avdyushin Date: Fri, 27 Jun 2025 22:31:09 +0200 Subject: [PATCH 455/592] Update franky36 VID/PID (#25160) * Update franky36 pid and vid * Update keyboard.json --- keyboards/handwired/franky36/keyboard.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/handwired/franky36/keyboard.json b/keyboards/handwired/franky36/keyboard.json index 038fc1eb67..871e6abf9d 100644 --- a/keyboards/handwired/franky36/keyboard.json +++ b/keyboards/handwired/franky36/keyboard.json @@ -23,8 +23,8 @@ "url": "https://github.com/avdyushin/franky36", "usb": { "device_version": "0.2.0", - "pid": "0x0001", - "vid": "0xFEED" + "pid": "0x3336", + "vid": "0x1209" }, "community_layouts": ["split_3x5_3"], "layouts": { From 36636205ddc835a6bb6f630179cd9395ea8b0689 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 28 Jun 2025 12:44:24 +1000 Subject: [PATCH 456/592] 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 18740044f4..b21accd367 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 891a4f6f17..5d983e347e 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 8b420d30b6..ebf79adb7f 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 bcaf94af8b..a2a86e175c 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 21aec90675..55b0fc3596 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 48a421bb10537780c88c7dff3762def31e38d4bd Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 28 Jun 2025 03:57:32 +0100 Subject: [PATCH 457/592] Fix `keebio/quefrency/rev1:default60` (#25423) --- keyboards/keebio/quefrency/rev1/keyboard.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/keebio/quefrency/rev1/keyboard.json b/keyboards/keebio/quefrency/rev1/keyboard.json index 73f6d0d660..00eef3f661 100644 --- a/keyboards/keebio/quefrency/rev1/keyboard.json +++ b/keyboards/keebio/quefrency/rev1/keyboard.json @@ -63,8 +63,11 @@ "build": { "lto": true }, + "layout_aliases": { + "LAYOUT": "LAYOUT_60" + }, "layouts": { - "LAYOUT": { + "LAYOUT_60": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, {"matrix": [0, 1], "x": 1, "y": 0}, 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 458/592] [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 55cb64a498..164be229f6 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 459/592] [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 0000000000..f93346deb6 --- /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 0000000000..4c55f41e69 --- /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 0000000000..3c34876970 --- /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 0000000000..525f02feb0 --- /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 0000000000..ca5eabf902 --- /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 0000000000..3d1979b2e1 --- /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 0000000000..c1db5edfe6 --- /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 0000000000..99512f07e7 --- /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 d7b09ad5602888e94f75cb8ed3c3e0931df4234e Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 28 Jun 2025 22:34:50 +0100 Subject: [PATCH 460/592] Configure boards to use development_board - K (#25421) --- keyboards/kakunpc/angel17/info.json | 3 +-- keyboards/kakunpc/rabbit_capture_plan/keyboard.json | 3 +-- keyboards/kapl/rev1/keyboard.json | 3 +-- keyboards/keaboard/rev1/keyboard.json | 3 +-- keyboards/keebformom/keyboard.json | 3 +-- keyboards/keebio/bdn9/rev1/keyboard.json | 3 +-- keyboards/keebio/bfo9000/keyboard.json | 3 +-- keyboards/keebio/dilly/keyboard.json | 3 +-- keyboards/keebio/fourier/keyboard.json | 3 +-- keyboards/keebio/iris/rev1/keyboard.json | 3 +-- keyboards/keebio/iris/rev1_led/keyboard.json | 3 +-- keyboards/keebio/iris/rev2/keyboard.json | 3 +-- keyboards/keebio/laplace/keyboard.json | 3 +-- keyboards/keebio/levinson/info.json | 3 +-- keyboards/keebio/nyquist/rev1/keyboard.json | 3 +-- keyboards/keebio/nyquist/rev2/keyboard.json | 3 +-- keyboards/keebio/quefrency/rev1/keyboard.json | 3 +-- keyboards/keebio/rorschach/rev1/keyboard.json | 3 +-- keyboards/keebio/stick/keyboard.json | 3 +-- keyboards/keebio/tragicforce68/keyboard.json | 3 +-- keyboards/keebio/tukey/keyboard.json | 3 +-- keyboards/keebio/viterbi/info.json | 3 +-- keyboards/keebio/wavelet/keyboard.json | 3 +-- keyboards/keybage/radpad/keyboard.json | 3 +-- keyboards/keycapsss/o4l_5x12/keyboard.json | 3 +-- keyboards/keyhive/ergosaurus/keyboard.json | 3 +-- keyboards/keyhive/maypad/keyboard.json | 3 +-- keyboards/keyhive/navi10/rev0/keyboard.json | 3 +-- keyboards/keyhive/navi10/rev2/keyboard.json | 3 +-- keyboards/keyhive/navi10/rev3/keyboard.json | 3 +-- keyboards/keyhive/opus/keyboard.json | 3 +-- keyboards/keyprez/unicorn/keyboard.json | 3 +-- keyboards/keysofkings/twokey/keyboard.json | 3 +-- keyboards/kingly_keys/little_foot/keyboard.json | 3 +-- keyboards/kingly_keys/romac/keyboard.json | 3 +-- keyboards/kingly_keys/romac_plus/keyboard.json | 3 +-- keyboards/knobgoblin/keyboard.json | 3 +-- keyboards/ktec/ergodone/keyboard.json | 3 +-- keyboards/kumaokobo/kudox/columner/keyboard.json | 3 +-- keyboards/kumaokobo/kudox/rev1/keyboard.json | 3 +-- keyboards/kumaokobo/kudox/rev2/keyboard.json | 3 +-- keyboards/kumaokobo/kudox/rev3/keyboard.json | 3 +-- keyboards/kumaokobo/kudox_full/rev1/keyboard.json | 3 +-- keyboards/kumaokobo/kudox_game/info.json | 3 +-- keyboards/kumaokobo/pico/65keys/keyboard.json | 3 +-- keyboards/kumaokobo/pico/70keys/keyboard.json | 3 +-- 46 files changed, 46 insertions(+), 92 deletions(-) diff --git a/keyboards/kakunpc/angel17/info.json b/keyboards/kakunpc/angel17/info.json index a8a4f2c148..c0d7287052 100644 --- a/keyboards/kakunpc/angel17/info.json +++ b/keyboards/kakunpc/angel17/info.json @@ -8,7 +8,6 @@ "pid": "0x0000", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["numpad_5x4"] } diff --git a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json index dce62c64d8..357d1a1ed1 100644 --- a/keyboards/kakunpc/rabbit_capture_plan/keyboard.json +++ b/keyboards/kakunpc/rabbit_capture_plan/keyboard.json @@ -55,8 +55,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_all": "LAYOUT_ansi_split_rshift" }, diff --git a/keyboards/kapl/rev1/keyboard.json b/keyboards/kapl/rev1/keyboard.json index 820c647ccf..843847d8fe 100644 --- a/keyboards/kapl/rev1/keyboard.json +++ b/keyboards/kapl/rev1/keyboard.json @@ -72,8 +72,7 @@ } } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/keaboard/rev1/keyboard.json b/keyboards/keaboard/rev1/keyboard.json index 1b5b492075..c8dea471f6 100644 --- a/keyboards/keaboard/rev1/keyboard.json +++ b/keyboards/keaboard/rev1/keyboard.json @@ -13,8 +13,7 @@ "rows": ["D7", "E6", "B4", "B5"], "cols": ["F5", "F6", "F7", "B1", "B3", "B2", "B6"] }, - "bootloader": "caterina", - "processor": "atmega32u4", + "development_board": "promicro", "split": { "enabled": true, "serial": { diff --git a/keyboards/keebformom/keyboard.json b/keyboards/keebformom/keyboard.json index 7fbaa5737f..bcc3a7d8b2 100644 --- a/keyboards/keebformom/keyboard.json +++ b/keyboards/keebformom/keyboard.json @@ -28,8 +28,7 @@ "rows": ["F5", "F6", "F7", "B1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keebio/bdn9/rev1/keyboard.json b/keyboards/keebio/bdn9/rev1/keyboard.json index 1deecf0d5b..5c677db78d 100644 --- a/keyboards/keebio/bdn9/rev1/keyboard.json +++ b/keyboards/keebio/bdn9/rev1/keyboard.json @@ -36,8 +36,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keebio/bfo9000/keyboard.json b/keyboards/keebio/bfo9000/keyboard.json index 08d9997d43..159334cc07 100644 --- a/keyboards/keebio/bfo9000/keyboard.json +++ b/keyboards/keebio/bfo9000/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "B4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keebio/dilly/keyboard.json b/keyboards/keebio/dilly/keyboard.json index 82a565ae62..0f7bce7d3f 100644 --- a/keyboards/keebio/dilly/keyboard.json +++ b/keyboards/keebio/dilly/keyboard.json @@ -49,8 +49,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_3x10"], "layouts": { "LAYOUT_ortho_3x10": { diff --git a/keyboards/keebio/fourier/keyboard.json b/keyboards/keebio/fourier/keyboard.json index ae4985787d..74620068a2 100644 --- a/keyboards/keebio/fourier/keyboard.json +++ b/keyboards/keebio/fourier/keyboard.json @@ -61,8 +61,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keebio/iris/rev1/keyboard.json b/keyboards/keebio/iris/rev1/keyboard.json index fbccf0de84..74dc366413 100644 --- a/keyboards/keebio/iris/rev1/keyboard.json +++ b/keyboards/keebio/iris/rev1/keyboard.json @@ -53,8 +53,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keebio/iris/rev1_led/keyboard.json b/keyboards/keebio/iris/rev1_led/keyboard.json index cb171fcec3..4dc003f271 100644 --- a/keyboards/keebio/iris/rev1_led/keyboard.json +++ b/keyboards/keebio/iris/rev1_led/keyboard.json @@ -52,8 +52,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keebio/iris/rev2/keyboard.json b/keyboards/keebio/iris/rev2/keyboard.json index 37a4764c6b..9ea21851ee 100644 --- a/keyboards/keebio/iris/rev2/keyboard.json +++ b/keyboards/keebio/iris/rev2/keyboard.json @@ -38,8 +38,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keebio/laplace/keyboard.json b/keyboards/keebio/laplace/keyboard.json index 3a2ed70905..3ae9f6474b 100644 --- a/keyboards/keebio/laplace/keyboard.json +++ b/keyboards/keebio/laplace/keyboard.json @@ -38,8 +38,7 @@ "rows": ["D3", "F4", "D2", "F5", "D7", "B4", "C6", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keebio/levinson/info.json b/keyboards/keebio/levinson/info.json index 29ae8be8cb..1f4541a5e9 100644 --- a/keyboards/keebio/levinson/info.json +++ b/keyboards/keebio/levinson/info.json @@ -9,7 +9,6 @@ "split": { "enabled": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x12"] } diff --git a/keyboards/keebio/nyquist/rev1/keyboard.json b/keyboards/keebio/nyquist/rev1/keyboard.json index f684332bdb..b7cf0ae0d5 100644 --- a/keyboards/keebio/nyquist/rev1/keyboard.json +++ b/keyboards/keebio/nyquist/rev1/keyboard.json @@ -35,8 +35,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_ortho_5x12" }, diff --git a/keyboards/keebio/nyquist/rev2/keyboard.json b/keyboards/keebio/nyquist/rev2/keyboard.json index dede204981..69639db6bf 100644 --- a/keyboards/keebio/nyquist/rev2/keyboard.json +++ b/keyboards/keebio/nyquist/rev2/keyboard.json @@ -40,8 +40,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_ortho_5x12" }, diff --git a/keyboards/keebio/quefrency/rev1/keyboard.json b/keyboards/keebio/quefrency/rev1/keyboard.json index 00eef3f661..651e3f1362 100644 --- a/keyboards/keebio/quefrency/rev1/keyboard.json +++ b/keyboards/keebio/quefrency/rev1/keyboard.json @@ -46,8 +46,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/keebio/rorschach/rev1/keyboard.json b/keyboards/keebio/rorschach/rev1/keyboard.json index 63fe877246..6f07992f1e 100644 --- a/keyboards/keebio/rorschach/rev1/keyboard.json +++ b/keyboards/keebio/rorschach/rev1/keyboard.json @@ -43,8 +43,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/keebio/stick/keyboard.json b/keyboards/keebio/stick/keyboard.json index 93d78837eb..b8d1184ec1 100644 --- a/keyboards/keebio/stick/keyboard.json +++ b/keyboards/keebio/stick/keyboard.json @@ -83,8 +83,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "encoder": true, diff --git a/keyboards/keebio/tragicforce68/keyboard.json b/keyboards/keebio/tragicforce68/keyboard.json index 3173ed3f50..f257cc26a8 100644 --- a/keyboards/keebio/tragicforce68/keyboard.json +++ b/keyboards/keebio/tragicforce68/keyboard.json @@ -31,8 +31,7 @@ "levels": 7, "breathing": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["68_ansi"], "layout_aliases": { "LAYOUT": "LAYOUT_68_ansi" diff --git a/keyboards/keebio/tukey/keyboard.json b/keyboards/keebio/tukey/keyboard.json index a030f041b7..3f4e5e947a 100644 --- a/keyboards/keebio/tukey/keyboard.json +++ b/keyboards/keebio/tukey/keyboard.json @@ -28,8 +28,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "command": true, diff --git a/keyboards/keebio/viterbi/info.json b/keyboards/keebio/viterbi/info.json index 8b1063ea98..f547514cdb 100644 --- a/keyboards/keebio/viterbi/info.json +++ b/keyboards/keebio/viterbi/info.json @@ -8,7 +8,6 @@ "split": { "enabled": true }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x14"] } diff --git a/keyboards/keebio/wavelet/keyboard.json b/keyboards/keebio/wavelet/keyboard.json index 70430e0f4d..fa14bfd62c 100644 --- a/keyboards/keebio/wavelet/keyboard.json +++ b/keyboards/keebio/wavelet/keyboard.json @@ -23,8 +23,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/keybage/radpad/keyboard.json b/keyboards/keybage/radpad/keyboard.json index 24f84477a8..d8a3c827df 100644 --- a/keyboards/keybage/radpad/keyboard.json +++ b/keyboards/keybage/radpad/keyboard.json @@ -52,8 +52,7 @@ "ws2812": { "pin": "F4" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_4x4_encoders": { "layout": [ diff --git a/keyboards/keycapsss/o4l_5x12/keyboard.json b/keyboards/keycapsss/o4l_5x12/keyboard.json index 5a516adca0..7425dc7a0b 100644 --- a/keyboards/keycapsss/o4l_5x12/keyboard.json +++ b/keyboards/keycapsss/o4l_5x12/keyboard.json @@ -48,8 +48,7 @@ "rows": ["F7", "B1", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x12"], "layouts": { "LAYOUT_ortho_5x12": { diff --git a/keyboards/keyhive/ergosaurus/keyboard.json b/keyboards/keyhive/ergosaurus/keyboard.json index 9a4810a9a5..754201c2b1 100644 --- a/keyboards/keyhive/ergosaurus/keyboard.json +++ b/keyboards/keyhive/ergosaurus/keyboard.json @@ -42,8 +42,7 @@ "rows": ["B5", "B4", "E6", "D4", "F6", "D3", "D2", "F4", "F5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["alice_split_bs"], "layout_aliases": { "LAYOUT": "LAYOUT_alice_split_bs" diff --git a/keyboards/keyhive/maypad/keyboard.json b/keyboards/keyhive/maypad/keyboard.json index d0dad2b6cf..adc04dc386 100644 --- a/keyboards/keyhive/maypad/keyboard.json +++ b/keyboards/keyhive/maypad/keyboard.json @@ -27,8 +27,7 @@ "rows": ["C6", "D7", "E6", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_5x4", "numpad_5x4"], "layouts": { "LAYOUT_numpad_5x4": { diff --git a/keyboards/keyhive/navi10/rev0/keyboard.json b/keyboards/keyhive/navi10/rev0/keyboard.json index ab0e63ef1e..9e362651ef 100644 --- a/keyboards/keyhive/navi10/rev0/keyboard.json +++ b/keyboards/keyhive/navi10/rev0/keyboard.json @@ -7,8 +7,7 @@ "rows": ["B6", "B2", "B3", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keyhive/navi10/rev2/keyboard.json b/keyboards/keyhive/navi10/rev2/keyboard.json index ac5148b787..df4d11b6e3 100644 --- a/keyboards/keyhive/navi10/rev2/keyboard.json +++ b/keyboards/keyhive/navi10/rev2/keyboard.json @@ -7,8 +7,7 @@ "rows": ["B6", "B2", "B3", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keyhive/navi10/rev3/keyboard.json b/keyboards/keyhive/navi10/rev3/keyboard.json index 9f403a3513..8fa609c52f 100644 --- a/keyboards/keyhive/navi10/rev3/keyboard.json +++ b/keyboards/keyhive/navi10/rev3/keyboard.json @@ -7,8 +7,7 @@ "rows": ["B6", "B2", "B3", "B4"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": false, diff --git a/keyboards/keyhive/opus/keyboard.json b/keyboards/keyhive/opus/keyboard.json index 6072a59f5d..58bd2238db 100644 --- a/keyboards/keyhive/opus/keyboard.json +++ b/keyboards/keyhive/opus/keyboard.json @@ -24,8 +24,7 @@ "rows": ["B1", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keyprez/unicorn/keyboard.json b/keyboards/keyprez/unicorn/keyboard.json index 20aa2e3e73..9a8d39a416 100644 --- a/keyboards/keyprez/unicorn/keyboard.json +++ b/keyboards/keyprez/unicorn/keyboard.json @@ -42,8 +42,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/keysofkings/twokey/keyboard.json b/keyboards/keysofkings/twokey/keyboard.json index 2ec17f2b93..f0c46e34a6 100644 --- a/keyboards/keysofkings/twokey/keyboard.json +++ b/keyboards/keysofkings/twokey/keyboard.json @@ -53,8 +53,7 @@ {"pin_a": "D7", "pin_b": "E6", "resolution": 1} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/kingly_keys/little_foot/keyboard.json b/keyboards/kingly_keys/little_foot/keyboard.json index 2af4432d47..6188bed595 100644 --- a/keyboards/kingly_keys/little_foot/keyboard.json +++ b/keyboards/kingly_keys/little_foot/keyboard.json @@ -47,8 +47,7 @@ "rows": ["F6", "B6", "B2", "B3", "B1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_split_space_base": { "layout": [ diff --git a/keyboards/kingly_keys/romac/keyboard.json b/keyboards/kingly_keys/romac/keyboard.json index 40c8dea64f..d9993f9917 100644 --- a/keyboards/kingly_keys/romac/keyboard.json +++ b/keyboards/kingly_keys/romac/keyboard.json @@ -24,8 +24,7 @@ "rows": ["D4", "C6", "D7", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/kingly_keys/romac_plus/keyboard.json b/keyboards/kingly_keys/romac_plus/keyboard.json index b0b2f487cb..db34d4b465 100644 --- a/keyboards/kingly_keys/romac_plus/keyboard.json +++ b/keyboards/kingly_keys/romac_plus/keyboard.json @@ -53,8 +53,7 @@ "ws2812": { "pin": "F7" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/knobgoblin/keyboard.json b/keyboards/knobgoblin/keyboard.json index 4cc00e26cd..d20191c82d 100644 --- a/keyboards/knobgoblin/keyboard.json +++ b/keyboards/knobgoblin/keyboard.json @@ -30,8 +30,7 @@ "bootmagic": { "matrix": [0, 1] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "debounce": 2, "layouts": { "LAYOUT_ortho": { diff --git a/keyboards/ktec/ergodone/keyboard.json b/keyboards/ktec/ergodone/keyboard.json index 3c9b0208bb..d88d0f2090 100644 --- a/keyboards/ktec/ergodone/keyboard.json +++ b/keyboards/ktec/ergodone/keyboard.json @@ -2,8 +2,7 @@ "keyboard_name": "Ergodone", "manufacturer": "K.T.E.C.", "maintainer": "Yu He", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "usb": { "vid": "0x1209", "pid": "0x2328", diff --git a/keyboards/kumaokobo/kudox/columner/keyboard.json b/keyboards/kumaokobo/kudox/columner/keyboard.json index 4345866382..ac3125abc7 100644 --- a/keyboards/kumaokobo/kudox/columner/keyboard.json +++ b/keyboards/kumaokobo/kudox/columner/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/kumaokobo/kudox/rev1/keyboard.json b/keyboards/kumaokobo/kudox/rev1/keyboard.json index 65c01a798e..f056514c52 100644 --- a/keyboards/kumaokobo/kudox/rev1/keyboard.json +++ b/keyboards/kumaokobo/kudox/rev1/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/kumaokobo/kudox/rev2/keyboard.json b/keyboards/kumaokobo/kudox/rev2/keyboard.json index 9df232c641..64940bfcdd 100644 --- a/keyboards/kumaokobo/kudox/rev2/keyboard.json +++ b/keyboards/kumaokobo/kudox/rev2/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/kumaokobo/kudox/rev3/keyboard.json b/keyboards/kumaokobo/kudox/rev3/keyboard.json index cfd1511123..8c935a80da 100644 --- a/keyboards/kumaokobo/kudox/rev3/keyboard.json +++ b/keyboards/kumaokobo/kudox/rev3/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/kumaokobo/kudox_full/rev1/keyboard.json b/keyboards/kumaokobo/kudox_full/rev1/keyboard.json index b79deec7dc..81a3d5c4dd 100644 --- a/keyboards/kumaokobo/kudox_full/rev1/keyboard.json +++ b/keyboards/kumaokobo/kudox_full/rev1/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": true, "mousekey": true, diff --git a/keyboards/kumaokobo/kudox_game/info.json b/keyboards/kumaokobo/kudox_game/info.json index 8750facede..498f2c581d 100644 --- a/keyboards/kumaokobo/kudox_game/info.json +++ b/keyboards/kumaokobo/kudox_game/info.json @@ -6,6 +6,5 @@ "vid": "0xABBA", "pid": "0x9696" }, - "processor": "atmega32u4", - "bootloader": "caterina" + "development_board": "promicro" } diff --git a/keyboards/kumaokobo/pico/65keys/keyboard.json b/keyboards/kumaokobo/pico/65keys/keyboard.json index db2ca9fdca..2e8db34b38 100644 --- a/keyboards/kumaokobo/pico/65keys/keyboard.json +++ b/keyboards/kumaokobo/pico/65keys/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, diff --git a/keyboards/kumaokobo/pico/70keys/keyboard.json b/keyboards/kumaokobo/pico/70keys/keyboard.json index 00add13874..3a8e41ecba 100644 --- a/keyboards/kumaokobo/pico/70keys/keyboard.json +++ b/keyboards/kumaokobo/pico/70keys/keyboard.json @@ -39,8 +39,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "features": { "bootmagic": false, "mousekey": true, From 6347d18a2d4ffa041e175655e8669041e1f45d53 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 28 Jun 2025 22:34:59 +0100 Subject: [PATCH 461/592] Configure boards to use development_board - ABC (#25417) --- keyboards/adpenrose/akemipad/keyboard.json | 3 +-- keyboards/ai/keyboard.json | 3 +-- keyboards/aleblazer/zodiark/keyboard.json | 3 +-- keyboards/alpha/keyboard.json | 3 +-- keyboards/aplyard/aplx6/rev1/keyboard.json | 3 +-- keyboards/aplyard/aplx6/rev2/keyboard.json | 3 +-- keyboards/arabica37/rev1/keyboard.json | 3 +-- keyboards/atreus62/keyboard.json | 3 +-- keyboards/avalanche/v1/keyboard.json | 3 +-- keyboards/avalanche/v2/keyboard.json | 3 +-- keyboards/avalanche/v3/keyboard.json | 3 +-- keyboards/avalanche/v4/keyboard.json | 3 +-- keyboards/b_sides/rev41lp/keyboard.json | 3 +-- keyboards/balloondogcaps/tr90pm/keyboard.json | 3 +-- keyboards/bandominedoni/keyboard.json | 3 +-- keyboards/basekeys/slice/rev1/keyboard.json | 3 +-- keyboards/basekeys/slice/rev1_rgb/keyboard.json | 3 +-- keyboards/beatervan/keyboard.json | 3 +-- keyboards/biacco42/ergo42/rev1/keyboard.json | 3 +-- keyboards/biacco42/meishi/keyboard.json | 3 +-- keyboards/biacco42/meishi2/keyboard.json | 3 +-- keyboards/blockey/keyboard.json | 3 +-- keyboards/bluebell/swoop/keyboard.json | 3 +-- keyboards/bthlabs/geekpad/keyboard.json | 3 +-- keyboards/catch22/keyboard.json | 3 +-- keyboards/chocofly/v1/keyboard.json | 3 +-- keyboards/ckeys/handwire_101/keyboard.json | 3 +-- keyboards/clawsome/coupe/keyboard.json | 3 +-- keyboards/clawsome/doodle/keyboard.json | 3 +-- keyboards/clawsome/fightpad/keyboard.json | 3 +-- keyboards/clawsome/gamebuddy/v1_0/keyboard.json | 3 +-- keyboards/clawsome/gamebuddy/v1_m/keyboard.json | 3 +-- keyboards/clawsome/numeros/keyboard.json | 3 +-- keyboards/clawsome/roadster/keyboard.json | 3 +-- keyboards/contra/keyboard.json | 3 +-- keyboards/crbn/keyboard.json | 3 +-- keyboards/cybergear/macro25/keyboard.json | 3 +-- 37 files changed, 37 insertions(+), 74 deletions(-) diff --git a/keyboards/adpenrose/akemipad/keyboard.json b/keyboards/adpenrose/akemipad/keyboard.json index 2dcfed3b5a..085ca5e406 100644 --- a/keyboards/adpenrose/akemipad/keyboard.json +++ b/keyboards/adpenrose/akemipad/keyboard.json @@ -42,8 +42,7 @@ "qmk": { "tap_keycode_delay": 10 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT_all": { "layout": [ diff --git a/keyboards/ai/keyboard.json b/keyboards/ai/keyboard.json index bf594d306a..f8a5ba9925 100644 --- a/keyboards/ai/keyboard.json +++ b/keyboards/ai/keyboard.json @@ -2,7 +2,7 @@ "manufacturer": "Louis Dalibard", "keyboard_name": "ai", "maintainer": "make42", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "features": { "bootmagic": true, @@ -14,7 +14,6 @@ "cols": ["F5", "F6", "F7", "B1"], "rows": ["D0", "D4", "C6", "D7", "D1"] }, - "processor": "atmega32u4", "usb": { "device_version": "1.0.0", "pid": "0x0000", diff --git a/keyboards/aleblazer/zodiark/keyboard.json b/keyboards/aleblazer/zodiark/keyboard.json index fba239866e..6818797809 100644 --- a/keyboards/aleblazer/zodiark/keyboard.json +++ b/keyboards/aleblazer/zodiark/keyboard.json @@ -71,8 +71,7 @@ "pin": "D3" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/alpha/keyboard.json b/keyboards/alpha/keyboard.json index 84a25eb180..7c18d47045 100644 --- a/keyboards/alpha/keyboard.json +++ b/keyboards/alpha/keyboard.json @@ -45,8 +45,7 @@ "rows": ["D4", "B4", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/aplyard/aplx6/rev1/keyboard.json b/keyboards/aplyard/aplx6/rev1/keyboard.json index 667ebdba02..5e3c35b49b 100644 --- a/keyboards/aplyard/aplx6/rev1/keyboard.json +++ b/keyboards/aplyard/aplx6/rev1/keyboard.json @@ -15,8 +15,7 @@ "rows": ["E6", "B3"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/aplyard/aplx6/rev2/keyboard.json b/keyboards/aplyard/aplx6/rev2/keyboard.json index 4c881534f4..56ec03479f 100644 --- a/keyboards/aplyard/aplx6/rev2/keyboard.json +++ b/keyboards/aplyard/aplx6/rev2/keyboard.json @@ -25,8 +25,7 @@ "qmk": { "tap_keycode_delay": 50 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/arabica37/rev1/keyboard.json b/keyboards/arabica37/rev1/keyboard.json index d1db9a276c..1433875e29 100644 --- a/keyboards/arabica37/rev1/keyboard.json +++ b/keyboards/arabica37/rev1/keyboard.json @@ -31,8 +31,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/atreus62/keyboard.json b/keyboards/atreus62/keyboard.json index 5fb786fa98..34e19925e9 100644 --- a/keyboards/atreus62/keyboard.json +++ b/keyboards/atreus62/keyboard.json @@ -27,8 +27,7 @@ "rows": ["D2", "D3", "D1", "D0", "D4"] }, "diode_direction": "ROW2COL", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/avalanche/v1/keyboard.json b/keyboards/avalanche/v1/keyboard.json index 0e539bdefc..4a6e2fbcbb 100644 --- a/keyboards/avalanche/v1/keyboard.json +++ b/keyboards/avalanche/v1/keyboard.json @@ -25,8 +25,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/avalanche/v2/keyboard.json b/keyboards/avalanche/v2/keyboard.json index 2c38fd1056..f1fd8e1a53 100644 --- a/keyboards/avalanche/v2/keyboard.json +++ b/keyboards/avalanche/v2/keyboard.json @@ -39,8 +39,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/avalanche/v3/keyboard.json b/keyboards/avalanche/v3/keyboard.json index 84191a103f..fb15395524 100644 --- a/keyboards/avalanche/v3/keyboard.json +++ b/keyboards/avalanche/v3/keyboard.json @@ -38,8 +38,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/avalanche/v4/keyboard.json b/keyboards/avalanche/v4/keyboard.json index 2a548c5665..33abc8c96b 100644 --- a/keyboards/avalanche/v4/keyboard.json +++ b/keyboards/avalanche/v4/keyboard.json @@ -53,8 +53,7 @@ "alternating": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/b_sides/rev41lp/keyboard.json b/keyboards/b_sides/rev41lp/keyboard.json index 75c7affbf5..39f994eea1 100644 --- a/keyboards/b_sides/rev41lp/keyboard.json +++ b/keyboards/b_sides/rev41lp/keyboard.json @@ -27,8 +27,7 @@ "levels": 7, "max_brightness": 150 }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT_rev41lp": "LAYOUT" }, diff --git a/keyboards/balloondogcaps/tr90pm/keyboard.json b/keyboards/balloondogcaps/tr90pm/keyboard.json index da8f29e977..e103091bd7 100644 --- a/keyboards/balloondogcaps/tr90pm/keyboard.json +++ b/keyboards/balloondogcaps/tr90pm/keyboard.json @@ -2,7 +2,7 @@ "manufacturer": "Balloondog", "keyboard_name": "TR90PM", "maintainer": "balloondogcaps", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "features": { "bootmagic": true, @@ -14,7 +14,6 @@ "cols": ["D1", "D0", "D4"], "rows": ["C6", "D7", "E6"] }, - "processor": "atmega32u4", "usb": { "device_version": "1.0.0", "pid": "0x0002", diff --git a/keyboards/bandominedoni/keyboard.json b/keyboards/bandominedoni/keyboard.json index 41212aedef..f6ea0f43c3 100644 --- a/keyboards/bandominedoni/keyboard.json +++ b/keyboards/bandominedoni/keyboard.json @@ -47,8 +47,7 @@ "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/basekeys/slice/rev1/keyboard.json b/keyboards/basekeys/slice/rev1/keyboard.json index a6097e560a..209e4ef57a 100644 --- a/keyboards/basekeys/slice/rev1/keyboard.json +++ b/keyboards/basekeys/slice/rev1/keyboard.json @@ -30,8 +30,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/basekeys/slice/rev1_rgb/keyboard.json b/keyboards/basekeys/slice/rev1_rgb/keyboard.json index d6d7b8ad45..6747729363 100644 --- a/keyboards/basekeys/slice/rev1_rgb/keyboard.json +++ b/keyboards/basekeys/slice/rev1_rgb/keyboard.json @@ -56,8 +56,7 @@ "twinkle": true } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/beatervan/keyboard.json b/keyboards/beatervan/keyboard.json index f1a6380727..685f713501 100644 --- a/keyboards/beatervan/keyboard.json +++ b/keyboards/beatervan/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D1", "D0", "D4", "C6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/biacco42/ergo42/rev1/keyboard.json b/keyboards/biacco42/ergo42/rev1/keyboard.json index 4639bf9639..2ccf9887df 100644 --- a/keyboards/biacco42/ergo42/rev1/keyboard.json +++ b/keyboards/biacco42/ergo42/rev1/keyboard.json @@ -36,8 +36,7 @@ "pin": "D0" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_ortho_4x14" }, diff --git a/keyboards/biacco42/meishi/keyboard.json b/keyboards/biacco42/meishi/keyboard.json index 99f7c5debb..08f2edcb38 100644 --- a/keyboards/biacco42/meishi/keyboard.json +++ b/keyboards/biacco42/meishi/keyboard.json @@ -26,8 +26,7 @@ "rows": ["B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/biacco42/meishi2/keyboard.json b/keyboards/biacco42/meishi2/keyboard.json index 137c429ff1..9e630c7df8 100644 --- a/keyboards/biacco42/meishi2/keyboard.json +++ b/keyboards/biacco42/meishi2/keyboard.json @@ -26,8 +26,7 @@ "rows": ["D7", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/blockey/keyboard.json b/keyboards/blockey/keyboard.json index e9c5ceafa1..a8d7113846 100644 --- a/keyboards/blockey/keyboard.json +++ b/keyboards/blockey/keyboard.json @@ -46,8 +46,7 @@ "rows": ["D3", "D1", "D4", "E6", "B5", "D2", "F6", "B3", "B2", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/bluebell/swoop/keyboard.json b/keyboards/bluebell/swoop/keyboard.json index 08f61ac20d..1ab8cd090a 100644 --- a/keyboards/bluebell/swoop/keyboard.json +++ b/keyboards/bluebell/swoop/keyboard.json @@ -53,8 +53,7 @@ "pin": "D2" } }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["split_3x5_3"], "layouts": { "LAYOUT_split_3x5_3": { diff --git a/keyboards/bthlabs/geekpad/keyboard.json b/keyboards/bthlabs/geekpad/keyboard.json index 1ea302612a..2519925333 100644 --- a/keyboards/bthlabs/geekpad/keyboard.json +++ b/keyboards/bthlabs/geekpad/keyboard.json @@ -19,8 +19,7 @@ "rows": ["F4", "F5", "F6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/catch22/keyboard.json b/keyboards/catch22/keyboard.json index 3c1d9c5777..22aebe844a 100644 --- a/keyboards/catch22/keyboard.json +++ b/keyboards/catch22/keyboard.json @@ -38,8 +38,7 @@ "rows": ["B6", "B2", "B3", "B1", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/chocofly/v1/keyboard.json b/keyboards/chocofly/v1/keyboard.json index ae2a710070..7765d721f4 100644 --- a/keyboards/chocofly/v1/keyboard.json +++ b/keyboards/chocofly/v1/keyboard.json @@ -25,8 +25,7 @@ {"pin_a": "D3", "pin_b": "D2", "resolution": 2} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/ckeys/handwire_101/keyboard.json b/keyboards/ckeys/handwire_101/keyboard.json index 781cd25c83..088d3b5227 100644 --- a/keyboards/ckeys/handwire_101/keyboard.json +++ b/keyboards/ckeys/handwire_101/keyboard.json @@ -25,8 +25,7 @@ "rows": ["F4", "F5", "F6", "F7"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layout_aliases": { "LAYOUT": "LAYOUT_ortho_4x4" }, diff --git a/keyboards/clawsome/coupe/keyboard.json b/keyboards/clawsome/coupe/keyboard.json index 576b8e7164..8910221eb6 100644 --- a/keyboards/clawsome/coupe/keyboard.json +++ b/keyboards/clawsome/coupe/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D7", "D2", "C6", "B5", "D4", "B4", "D0", "D3", "D1", "E6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["60_ansi"], "layouts": { "LAYOUT_60_ansi": { diff --git a/keyboards/clawsome/doodle/keyboard.json b/keyboards/clawsome/doodle/keyboard.json index 0b3f4cc4e7..51eeacc02c 100644 --- a/keyboards/clawsome/doodle/keyboard.json +++ b/keyboards/clawsome/doodle/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D4", "C6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/clawsome/fightpad/keyboard.json b/keyboards/clawsome/fightpad/keyboard.json index ac5f83af23..2ac2fdff0d 100644 --- a/keyboards/clawsome/fightpad/keyboard.json +++ b/keyboards/clawsome/fightpad/keyboard.json @@ -19,8 +19,7 @@ "rows": ["B5", "B6"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/clawsome/gamebuddy/v1_0/keyboard.json b/keyboards/clawsome/gamebuddy/v1_0/keyboard.json index 978a3ad974..ebfd7970c4 100644 --- a/keyboards/clawsome/gamebuddy/v1_0/keyboard.json +++ b/keyboards/clawsome/gamebuddy/v1_0/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D1", "D0", "E6", "B3", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/clawsome/gamebuddy/v1_m/keyboard.json b/keyboards/clawsome/gamebuddy/v1_m/keyboard.json index dd9f39f97e..1a0014a1ac 100644 --- a/keyboards/clawsome/gamebuddy/v1_m/keyboard.json +++ b/keyboards/clawsome/gamebuddy/v1_m/keyboard.json @@ -21,8 +21,7 @@ "rows": ["C6", "D7", "B5", "B3", "B2"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/clawsome/numeros/keyboard.json b/keyboards/clawsome/numeros/keyboard.json index 728a1a1853..2b9e0331ab 100644 --- a/keyboards/clawsome/numeros/keyboard.json +++ b/keyboards/clawsome/numeros/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D0", "C6", "B2", "B6", "B5"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["numpad_5x4"], "layouts": { "LAYOUT_numpad_5x4": { diff --git a/keyboards/clawsome/roadster/keyboard.json b/keyboards/clawsome/roadster/keyboard.json index 895b97721b..1300a29623 100644 --- a/keyboards/clawsome/roadster/keyboard.json +++ b/keyboards/clawsome/roadster/keyboard.json @@ -21,8 +21,7 @@ "rows": ["D2", "D3", "D0", "D1"] }, "diode_direction": "COL2ROW", - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/contra/keyboard.json b/keyboards/contra/keyboard.json index b3179564fe..5c02afd061 100644 --- a/keyboards/contra/keyboard.json +++ b/keyboards/contra/keyboard.json @@ -13,8 +13,7 @@ "pid": "0x0001", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "matrix_pins": { "cols": ["F4", "F5", "B5", "B4", "E6", "D7", "C6", "D4", "D0", "D1", "D2", "D3"], diff --git a/keyboards/crbn/keyboard.json b/keyboards/crbn/keyboard.json index a2666c6c52..a0fd785111 100644 --- a/keyboards/crbn/keyboard.json +++ b/keyboards/crbn/keyboard.json @@ -31,8 +31,7 @@ {"pin_a": "F5", "pin_b": "F4", "resolution": 2} ] }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "community_layouts": ["ortho_4x12", "planck_mit"], "layout_aliases": { "LAYOUT_crbn_1x2u": "LAYOUT_planck_mit", diff --git a/keyboards/cybergear/macro25/keyboard.json b/keyboards/cybergear/macro25/keyboard.json index 14ea5cc77d..8b0bcc8ef4 100644 --- a/keyboards/cybergear/macro25/keyboard.json +++ b/keyboards/cybergear/macro25/keyboard.json @@ -8,8 +8,7 @@ "pid": "0x69A1", "device_version": "0.0.1" }, - "processor": "atmega32u4", - "bootloader": "caterina", + "development_board": "promicro", "diode_direction": "COL2ROW", "layouts": { "LAYOUT_ortho_2x5": { From 711b109246dc7d7e3881ccf70dce4adceefb4b02 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 29 Jun 2025 02:29:33 +0100 Subject: [PATCH 462/592] Mitigate VIA keylogger security issues (#25414) Co-authored-by: Nick Brassel --- builddefs/common_features.mk | 3 +++ docs/ChangeLog/20250831/PR25414.md | 5 +++++ quantum/via.c | 8 ++++++++ 3 files changed, 16 insertions(+) create mode 100644 docs/ChangeLog/20250831/PR25414.md diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index 90231c9a96..c122afcff9 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -635,6 +635,9 @@ ifeq ($(strip $(VIA_ENABLE)), yes) RAW_ENABLE := yes BOOTMAGIC_ENABLE := yes TRI_LAYER_ENABLE := yes + ifeq ($(strip $(VIA_INSECURE)), yes) + OPT_DEFS += -DVIA_INSECURE + endif endif ifeq ($(strip $(RAW_ENABLE)), yes) diff --git a/docs/ChangeLog/20250831/PR25414.md b/docs/ChangeLog/20250831/PR25414.md new file mode 100644 index 0000000000..bee901c6ca --- /dev/null +++ b/docs/ChangeLog/20250831/PR25414.md @@ -0,0 +1,5 @@ +# Mitigate VIA keylogger security issues [#25414](https://github.com/qmk/qmk_firmware/pull/25414) + +VIA's keyboard matrix testing functionality, which allows users to identify active key presses, has been identified as a potential security concern by community members and security researchers. This feature has been demonstrated to enable unauthorized keystroke capture, with documented examples showing how malicious scripts could exploit this capability to create keyloggers. A recent security assessment revealed that user credentials could be compromised by exploiting the matrix testing function combined with VIA's keycode assignment queries. In this attack scenario, a script could remain active during a locked session and capture password input when users authenticate upon return. + +The QMK team notified the VIA team of this security vulnerability on May 17, 2022, and made multiple subsequent attempts to coordinate a mitigation strategy. Despite repeated outreach, the VIA team has provided no acknowledgment or response to these security concerns. Given the severity of the potential security implications and the lack of engagement from the VIA team, the QMK team has unilaterally implemented a security enhancement that modifies the keyboard matrix testing functionality to prevent the reporting of key press events. This change prioritizes user security and data protection over potential feature compatibility concerns within VIA. diff --git a/quantum/via.c b/quantum/via.c index 3682b4ab2b..9446811af6 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -22,6 +22,10 @@ # error "DYNAMIC_KEYMAP_ENABLE is not enabled" #endif +#ifdef VIA_INSECURE +# pragma message "VIA_INSECURE is enabled - firmware is susceptible to keyloggers" +#endif + #include "via.h" #include "raw_hid.h" @@ -318,7 +322,11 @@ void raw_hid_receive(uint8_t *data, uint8_t length) { uint8_t rows = 28 / ((MATRIX_COLS + 7) / 8); uint8_t i = 2; for (uint8_t row = 0; row < rows && row + offset < MATRIX_ROWS; row++) { +#ifdef VIA_INSECURE matrix_row_t value = matrix_get_row(row + offset); +#else + matrix_row_t value = 0; +#endif #if (MATRIX_COLS > 24) command_data[i++] = (value >> 24) & 0xFF; #endif From 9e103614f8aa7420305f11b8b3fd3038d0656121 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 4 Jul 2025 20:09:27 +0100 Subject: [PATCH 463/592] 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 ca50fc5257..130c1c5a5e 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 464/592] 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 0000000000..b1aa92cb68 --- /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 0000000000..775d33ff15 --- /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 0000000000..4a4f4c80a6 --- /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 0000000000..3f15660c07 --- /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 0000000000..ee32568148 --- /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 0000000000..00d44fb935 --- /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 0000000000..ee32568148 --- /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 0000000000..f637df1c1b --- /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 0b33318a249eda0b0163e67a79db4a75bbc7fffd Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Sun, 6 Jul 2025 13:00:39 +0700 Subject: [PATCH 465/592] [Update] E8ghtyNeo caps indicator (#25009) --- keyboards/trnthsn/e8ghtyneo/e8ghtyneo.c | 24 ++++++++++++++++++++++++ keyboards/trnthsn/e8ghtyneo/info.json | 7 +++++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 keyboards/trnthsn/e8ghtyneo/e8ghtyneo.c diff --git a/keyboards/trnthsn/e8ghtyneo/e8ghtyneo.c b/keyboards/trnthsn/e8ghtyneo/e8ghtyneo.c new file mode 100644 index 0000000000..b1af2c63a8 --- /dev/null +++ b/keyboards/trnthsn/e8ghtyneo/e8ghtyneo.c @@ -0,0 +1,24 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_LAYERS) +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {0,4, HSV_GREEN} +); +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/e8ghtyneo/info.json b/keyboards/trnthsn/e8ghtyneo/info.json index e81c5fbb22..6bd6d5ca66 100644 --- a/keyboards/trnthsn/e8ghtyneo/info.json +++ b/keyboards/trnthsn/e8ghtyneo/info.json @@ -10,8 +10,8 @@ "nkro": true }, "matrix_pins": { - "cols": ["A9", "A8", "B14", "B12", "B11", "B10", "B0", "A7", "A6", "A4", "A3", "A2", "A1", "A0", "C13", "B9", "B7"], - "rows": ["B8", "A10", "B1", "A5", "C15", "C14"] + "cols": ["A9", "A8", "B14", "B12", "B11", "B10", "B0", "A7", "A6", "A5", "A3", "A2", "A1", "A0", "C13", "B9", "B7"], + "rows": ["B8", "A10", "B1", "A4", "C15", "C14"] }, "rgblight": { "animations": { @@ -28,6 +28,9 @@ "default": { "animation": "rainbow_mood" }, + "layers": { + "enabled": true, + }, "led_count": 4, "sleep": true }, 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 466/592] 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 f5e48edfda..84d027bf49 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 e92f1fb220e3556e707d51db44bf9dbec98ed65d Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 00:42:42 -0600 Subject: [PATCH 467/592] Refactor `helix/pico` (#25428) Refactor helix/pico - Updates keyboard aliases accordingly - Removes redundant back, base, sc, under, & qmk_conf revisions - Migrates legacy defines and configuration to keyboard.json - Tidy's keymap and migrates to JSON - Fixes RGB configuration to illuminate 25 LEDs per half - Enables standard features (bootmagic, extrakey, etc.) --- data/mappings/keyboard_aliases.hjson | 9 - keyboards/helix/pico/back/keyboard.json | 1 - keyboards/helix/pico/back/rules.mk | 1 - keyboards/helix/pico/base/keyboard.json | 1 - keyboards/helix/pico/config.h | 97 +----- .../helix/pico/{info.json => keyboard.json} | 61 ++-- keyboards/helix/pico/keymaps/default/config.h | 42 --- keyboards/helix/pico/keymaps/default/keymap.c | 329 ------------------ .../helix/pico/keymaps/default/keymap.json | 25 ++ .../helix/pico/keymaps/default/readme.md | 137 -------- .../helix/pico/keymaps/default/readme_jp.md | 138 -------- keyboards/helix/pico/keymaps/default/rules.mk | 11 - .../override_helix_options.mk-maintenance | 42 --- keyboards/helix/pico/pico.c | 37 -- keyboards/helix/pico/pico.h | 24 -- keyboards/helix/pico/post_config.h | 7 - keyboards/helix/pico/post_rules.mk | 77 ---- keyboards/helix/pico/qmk_conf/config.h | 28 -- keyboards/helix/pico/qmk_conf/keyboard.json | 6 - keyboards/helix/pico/rules.mk | 5 - keyboards/helix/pico/sc/keyboard.json | 1 - keyboards/helix/pico/sc/rules.mk | 1 - keyboards/helix/pico/under/keyboard.json | 1 - keyboards/helix/pico/under/rules.mk | 1 - 24 files changed, 60 insertions(+), 1022 deletions(-) delete mode 100644 keyboards/helix/pico/back/keyboard.json delete mode 100644 keyboards/helix/pico/back/rules.mk delete mode 100644 keyboards/helix/pico/base/keyboard.json rename keyboards/helix/pico/{info.json => keyboard.json} (84%) delete mode 100644 keyboards/helix/pico/keymaps/default/config.h delete mode 100644 keyboards/helix/pico/keymaps/default/keymap.c create mode 100644 keyboards/helix/pico/keymaps/default/keymap.json delete mode 100644 keyboards/helix/pico/keymaps/default/readme.md delete mode 100644 keyboards/helix/pico/keymaps/default/readme_jp.md delete mode 100644 keyboards/helix/pico/keymaps/default/rules.mk delete mode 100644 keyboards/helix/pico/override_helix_options.mk-maintenance delete mode 100644 keyboards/helix/pico/pico.c delete mode 100644 keyboards/helix/pico/pico.h delete mode 100644 keyboards/helix/pico/post_config.h delete mode 100644 keyboards/helix/pico/post_rules.mk delete mode 100644 keyboards/helix/pico/qmk_conf/config.h delete mode 100644 keyboards/helix/pico/qmk_conf/keyboard.json delete mode 100644 keyboards/helix/pico/rules.mk delete mode 100644 keyboards/helix/pico/sc/keyboard.json delete mode 100644 keyboards/helix/pico/sc/rules.mk delete mode 100644 keyboards/helix/pico/under/keyboard.json delete mode 100644 keyboards/helix/pico/under/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 13c3b81305..e976ff6cac 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -257,12 +257,6 @@ "handwired/jscotto/scottostarter": { "target": "handwired/scottokeebs/scottostarter" }, - "helix/pico/sc/back": { - "target": "helix/pico/sc" - }, - "helix/pico/sc/under": { - "target": "helix/pico/sc" - }, "helix/rev2/back/oled": { "target": "helix/rev2/back" }, @@ -2284,9 +2278,6 @@ "handwired/dygma/raise": { "target": "handwired/dygma/raise/ansi" }, - "helix/pico": { - "target": "helix/pico/base" - }, "helix": { "target": "helix/rev2/base" }, diff --git a/keyboards/helix/pico/back/keyboard.json b/keyboards/helix/pico/back/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/pico/back/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/pico/back/rules.mk b/keyboards/helix/pico/back/rules.mk deleted file mode 100644 index 066fffb74a..0000000000 --- a/keyboards/helix/pico/back/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/pico/base/keyboard.json b/keyboards/helix/pico/base/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/pico/base/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h index 6ba88a559c..13de9d5178 100644 --- a/keyboards/helix/pico/config.h +++ b/keyboards/helix/pico/config.h @@ -1,96 +1,5 @@ -/* -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert -Copyright 2018 MakotoKurauchi - -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 . -*/ - +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define QUICK_TAP_TERM 0 - -#define SERIAL_SLAVE_BUFFER_LENGTH ((MATRIX_ROWS)/2) -#define SERIAL_MASTER_BUFFER_LENGTH ((MATRIX_ROWS)/2) - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_ROW_PINS { D4, C6, D7, E6 } - -// wiring of each half -#define MATRIX_COLS 7 -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 } -// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order - -/* COL2ROW, ROW2COL*/ -#define DIODE_DIRECTION COL2ROW - -/* Audio */ -#ifdef AUDIO_ENABLE - #define AUDIO_PIN B5 -#endif - -// Helix keyboard RGB LED support -// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes -#ifdef RGBLED_BACK - #define RGBLIGHT_LED_COUNT 25 -#else - #define RGBLIGHT_LED_COUNT 6 -#endif - -#ifndef IOS_DEVICE_ENABLE - #if RGBLIGHT_LED_COUNT <= 6 - #define RGBLIGHT_LIMIT_VAL 255 - #else - #define RGBLIGHT_LIMIT_VAL 130 - #endif - #define RGBLIGHT_VAL_STEP 17 -#else - #if RGBLIGHT_LED_COUNT <= 6 - #define RGBLIGHT_LIMIT_VAL 90 - #else - #define RGBLIGHT_LIMIT_VAL 45 - #endif - #define RGBLIGHT_VAL_STEP 4 -#endif - -#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) -// USB_MAX_POWER_CONSUMPTION value for Helix keyboard -// 120 RGBoff -// 330 RGB 6 -// 300 RGB 32 -// 310 OLED & RGB 32 - #define USB_MAX_POWER_CONSUMPTION 400 -#else - // fix iPhone and iPad power adapter issue - // iOS device need lessthan 100 - #define USB_MAX_POWER_CONSUMPTION 100 -#endif - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT +#define AUDIO_PIN B5 diff --git a/keyboards/helix/pico/info.json b/keyboards/helix/pico/keyboard.json similarity index 84% rename from keyboards/helix/pico/info.json rename to keyboards/helix/pico/keyboard.json index 7909bb0b30..61ea537576 100644 --- a/keyboards/helix/pico/info.json +++ b/keyboards/helix/pico/keyboard.json @@ -1,12 +1,33 @@ { - "keyboard_name": "HelixPico", "manufacturer": "Yushakobo", - "url": "https://github.com/MakotoKurauchi/helix", + "keyboard_name": "Helix Pico", "maintainer": "MakotoKurauchi", - "usb": { - "vid": "0x3265", - "pid": "0x0001", - "device_version": "0.0.2" + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "audio": false, + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], + "rows": ["D4", "C6", "D7", "E6"] + }, + "rgblight": { + "animations": { + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true + }, + "led_count": 50, + "max_brightness": 45, + "split_count": [25, 25] }, "split": { "enabled": true, @@ -14,26 +35,15 @@ "pin": "D2" } }, - "tapping": { - "term": 100 - }, - "rgblight": { - "hue_steps": 10, - "animations": { - "breathing": true, - "rainbow_mood": true, - "rainbow_swirl": true, - "snake": true, - "knight": true, - "christmas": true, - "static_gradient": true - } + "url": "https://shop.yushakobo.jp/products/helixpico-pcb", + "usb": { + "device_version": "0.0.2", + "pid": "0x0001", + "vid": "0x3265" }, "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", "layouts": { "LAYOUT": { "layout": [ @@ -43,42 +53,36 @@ {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [4, 5], "x": 9, "y": 0}, {"matrix": [4, 4], "x": 10, "y": 0}, {"matrix": [4, 3], "x": 11, "y": 0}, {"matrix": [4, 2], "x": 12, "y": 0}, {"matrix": [4, 1], "x": 13, "y": 0}, {"matrix": [4, 0], "x": 14, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [5, 5], "x": 9, "y": 1}, {"matrix": [5, 4], "x": 10, "y": 1}, {"matrix": [5, 3], "x": 11, "y": 1}, {"matrix": [5, 2], "x": 12, "y": 1}, {"matrix": [5, 1], "x": 13, "y": 1}, {"matrix": [5, 0], "x": 14, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [6, 5], "x": 9, "y": 2}, {"matrix": [6, 4], "x": 10, "y": 2}, {"matrix": [6, 3], "x": 11, "y": 2}, {"matrix": [6, 2], "x": 12, "y": 2}, {"matrix": [6, 1], "x": 13, "y": 2}, {"matrix": [6, 0], "x": 14, "y": 2}, - {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, {"matrix": [3, 2], "x": 2, "y": 3}, @@ -86,7 +90,6 @@ {"matrix": [3, 4], "x": 4, "y": 3}, {"matrix": [3, 5], "x": 5, "y": 3}, {"matrix": [3, 6], "x": 6, "y": 3}, - {"matrix": [7, 6], "x": 8, "y": 3}, {"matrix": [7, 5], "x": 9, "y": 3}, {"matrix": [7, 4], "x": 10, "y": 3}, diff --git a/keyboards/helix/pico/keymaps/default/config.h b/keyboards/helix/pico/keymaps/default/config.h deleted file mode 100644 index 0bd76a18b4..0000000000 --- a/keyboards/helix/pico/keymaps/default/config.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 - -// place overrides here - -#ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(STARTUP_SOUND) - #define AUDIO_CLICKY -#endif - -// If you need more program area, try select and reduce rgblight modes to use. - -// Selection of RGBLIGHT MODE to use. -#if defined(LED_ANIMATIONS) - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - //#define RGBLIGHT_EFFECT_RGB_TEST - //#define RGBLIGHT_EFFECT_ALTERNATING -#endif diff --git a/keyboards/helix/pico/keymaps/default/keymap.c b/keyboards/helix/pico/keymaps/default/keymap.c deleted file mode 100644 index 28f6a20f9b..0000000000 --- a/keyboards/helix/pico/keymaps/default/keymap.c +++ /dev/null @@ -1,329 +0,0 @@ -/* Copyright 2018 MakotoKurauchi - * - * 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 - -#ifdef RGBLIGHT_ENABLE -//Following line allows macro to read current RGB settings -extern rgblight_config_t rgblight_config; -#endif - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _ADJUST -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - BACKLIT, - EISU, - KANA, - RGBRST -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - -//Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - -[_QWERTY] = LAYOUT( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - 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_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - /* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_COLEMAK] = LAYOUT( - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_DVORAK] = LAYOUT( - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc | Home | End | | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc |PageDn|PageUp| | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, KC_PGDN, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | | Reset|RGBRST| | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | |Aud on|Audoff|MU TOG|MU MOD| Mac | | Win |Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | |CK TOG|CK RST| CK UP|CK DWN| | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - _______, QK_BOOT, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, AU_ON, AU_OFF, MU_TOGG, MU_NEXT, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, - _______, CK_TOGG, CK_RST, CK_UP, CK_DOWN, _______, _______, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD - ) -}; - - - -#ifdef AUDIO_ENABLE - -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_plover[][2] = SONG(PLOVER_SOUND); -float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); -#endif - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); - #endif - layer_on(layer3); - } else { - layer_off(layer3); - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - set_single_persistent_default_layer(_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); - #endif - } - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - TOG_STATUS = false; - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE); - #endif - } - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - layer_off(_RAISE); - TOG_STATUS = false; - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case QK_UNDERGLOW_MODE_NEXT: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - #endif - return false; - break; - case EISU: - if (record->event.pressed) { - if(keymap_config.swap_lalt_lgui==false){ - register_code(KC_LNG2); - }else{ - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if(keymap_config.swap_lalt_lgui==false){ - register_code(KC_LNG1); - }else{ - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG1); - } - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - #endif - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif -} diff --git a/keyboards/helix/pico/keymaps/default/keymap.json b/keyboards/helix/pico/keymaps/default/keymap.json new file mode 100644 index 0000000000..031ca79677 --- /dev/null +++ b/keyboards/helix/pico/keymaps/default/keymap.json @@ -0,0 +1,25 @@ +{ + "keyboard": "helix/pico", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_ENT" , + "MO(3)", "KC_ESC", "KC_LALT", "KC_LGUI", "LALT(KC_GRV)", "MO(1)", "KC_SPC", "KC_SPC", "MO(2)", "LALT(KC_GRV)", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT" + ], + [ + "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_DEL", + "_______", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_BSLS", + "KC_CAPS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", "_______", "_______", "KC_PGDN", "KC_PGUP", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY" + ], + [ + "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "UG_TOGG", "UG_HUEU", "UG_SATU", "UG_VALU", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "UG_NEXT", "UG_HUED", "UG_SATD", "UG_VALD" + ] + ] +} diff --git a/keyboards/helix/pico/keymaps/default/readme.md b/keyboards/helix/pico/keymaps/default/readme.md deleted file mode 100644 index a6c81651a3..0000000000 --- a/keyboards/helix/pico/keymaps/default/readme.md +++ /dev/null @@ -1,137 +0,0 @@ -# The Default HelixPico Layout -## Layout - -### Qwerty -``` - ,-----------------------------------------. ,-----------------------------------------. - | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -### Colemak -``` - ,-----------------------------------------. ,-----------------------------------------. - | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -### Dvorak -``` - ,-----------------------------------------. ,-----------------------------------------. - | Tab | ' | , | . | P | Y | | F | G | C | R | L | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -## Layers - -|Priority|number|name|description| -| ---- | ---- | --- | --- | -|high|16|Adjust|Functions| -||4|Raise|Numeric charactors| -||3|Lower|Other charactors| -||2|Dvorak|Dvorak leyout| -||1|Colemak|Colemak leyout| -|low|0|Qwerty|QWERTY leyout(base)| - -### Lower -``` - ,-----------------------------------------. ,-----------------------------------------. - | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc | Home | End | | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Raise -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc |PageDn|PageUp| | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Adjust (Lower + Raise) -``` - ,-----------------------------------------. ,-----------------------------------------. - | | Reset| | | | | | | | | | | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |Aud on|Audoff|MU TOG|MU MOD| Mac | | Win |Qwerty|Colemk|Dvorak| | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |CK TOG|CK RST| CK UP|CK DWN| | | | |RGB ON| HUE+ | SAT+ | VAL+ | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - `-------------------------------------------------------------------------------------------------' -``` - -## Customize - -see `qmk_firmware/keyboards/helix/pico/keymaps/default/rules.mk` - -``` -# Helix Spacific Build Options -# you can uncomment and edit follows 4 Variables -# jp: 以下の4つの変数を必要に応じて編集し、コメントアウトをはずします。 -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` -## Compile - -go to qmk top directory. -``` -$ cd qmk_firmware -``` - -build -``` -$ make helix/pico:default -$ make helix/pico/back:default # with backlight -$ make HELIX=no-ani helix/pico/back:default # with backlight without animation -$ make helix/pico/under:default # with underglow -``` - -build (experimental use of split_common with backlight) -``` -$ make helix/pico/sc:default -``` - -flash to keyboard -``` -$ make helix/pico:default:flash -$ make helix/pico/back:default:flash # with backlight -$ make HELIX=no_ani helix/pico/back:default:flash # with backlight without animation -$ make helix/pico/under:default:flash # with underglow - -``` - -## Link -* more detail wrote in Japanese [helix/Doc/firmware_jp.md](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md) -* [Helix top](https://github.com/MakotoKurauchi/helix) diff --git a/keyboards/helix/pico/keymaps/default/readme_jp.md b/keyboards/helix/pico/keymaps/default/readme_jp.md deleted file mode 100644 index 73f97ad9a6..0000000000 --- a/keyboards/helix/pico/keymaps/default/readme_jp.md +++ /dev/null @@ -1,138 +0,0 @@ -# The Default HelixPico Layout -## 配列 - -### Qwerty配列 - -``` - ,-----------------------------------------. ,-----------------------------------------. - | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -### Lower -``` - ,-----------------------------------------. ,-----------------------------------------. - | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc | Home | End | | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Raise -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | | F12 | | PrSc |PageDn|PageUp| | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Adjust (Lower + Raise) -``` - ,-----------------------------------------. ,-----------------------------------------. - | | Reset| | | | | | | | | | | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |Aud on|Audoff|MU TOG|MU MOD| Mac | | Win |Qwerty|Colemk|Dvorak| | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |CK TOG|CK RST| CK UP|CK DWN| | | | |RGB ON| HUE+ | SAT+ | VAL+ | - |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - `-------------------------------------------------------------------------------------------------' -``` - -他の配列(Colemak,Dvorak)は、[readme.md](readme.md) を参照 - -## カスタマイズ - -RGB バックライトまたは、RGB Underglow をつけた場合は、 -`qmk_firmware/keyboards/helix/pico/keymaps/default/rules.mk` の以下の部分を編集して機能を有効化してください。 - -``` -# Helix Spacific Build Options -# you can uncomment and edit follows 4 Variables -# jp: 以下の4つの変数を必要に応じて編集し、コメントアウトをはずします。 -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` - -## RGB バックライトを有効にする - -rules.mk の下記の部分を編集して no を yes に変更してください。 - -``` -LED_BACK_ENABLE = yes # LED backlight (Enable WS2812 RGB underlight.) -``` - -## RGB Underglow を有効にする - -rules.mk の下記の部分を編集して no を yes に変更してください。 -``` -LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.) -``` - -## iPad/iPhoneサポートを有効にする。 - -rules.mk の下記の部分を編集して no を yes に変更してください。 -RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 - -``` -IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` - -## コンパイルの仕方 - -コンパイルは、qmk_firmware のトップディレクトリで行います。 - -``` -$ cd qmk_firmware -``` -qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 - -``` -$ make helix/pico:default -``` - -キーボードへの書き込みまで同時に行うには下記のように`:flash`を付けます。 - -``` -$ make helix/pico:default:flash -``` - -コンパイル結果と中間生成物を消去したい場合は以下のようにします。 - -``` -$ make helix/pico:default:clean -``` - -上記の、rules.mk によるカスタマイズ項目の一部は下記のようにコマンド上で直接指定することも可能です。 - -RGB バックライトを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/pico/back:default:flash -``` - -RGB Underglow を有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/pico/under:default:flash -``` - -## リンク - -* さらに詳細は、[こちら helix/Doc/firmware_jp.md](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md)をご覧ください。 -* [Helix top](https://github.com/MakotoKurauchi/helix) diff --git a/keyboards/helix/pico/keymaps/default/rules.mk b/keyboards/helix/pico/keymaps/default/rules.mk deleted file mode 100644 index 9a29406c17..0000000000 --- a/keyboards/helix/pico/keymaps/default/rules.mk +++ /dev/null @@ -1,11 +0,0 @@ -EXTRAKEY_ENABLE = yes # Audio control and System control -AUDIO_ENABLE = yes # Audio output -LTO_ENABLE = no # if firmware size over limit, try this option - -# Helix Spacific Build Options -# you can uncomment and edit follows 4 Variables -# jp: 以下の4つの変数を必要に応じて編集し、コメントアウトをはずします。 -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) diff --git a/keyboards/helix/pico/override_helix_options.mk-maintenance b/keyboards/helix/pico/override_helix_options.mk-maintenance deleted file mode 100644 index 0ff930957e..0000000000 --- a/keyboards/helix/pico/override_helix_options.mk-maintenance +++ /dev/null @@ -1,42 +0,0 @@ -# -# This file is not normally used. It is used for maintenance testing purposes. -# To use it, do the following: -# -# $ cp override_helix_options.mk-maintenance override_helix_options.mk -# -$(info -------------------------) -$(info override_helix_options.mk) -$(info -------------------------) - -define HELIX_OVERRIDE_PARSE - ifeq ($(strip $1),back) - LED_BACK_ENABLE = yes - LED_UNDERGLOW_ENABLE = no - endif - ifeq ($(strip $1),under) - LED_BACK_ENABLE = no - LED_UNDERGLOW_ENABLE = yes - endif - ifneq ($(filter noled led-off led_off,$(strip $1)),) - LED_BACK_ENABLE = no - LED_UNDERGLOW_ENABLE = no - endif - ifneq ($(filter noaudio audio-off audio_off,$(strip $1)),) - AUDIO_ENABLE = no - endif - ifneq ($(filter audio audio-on audio_on,$(strip $1)),) - AUDIO_ENABLE = yes - endif - ifneq ($(filter sc split-common split_common,$(strip $1)),) - SPLIT_KEYBOARD = yes - endif - ifneq ($(filter nosc no-sc no-split-common no-split_common,$(strip $1)),) - SPLIT_KEYBOARD = no - endif - ifeq ($(strip $1),scan) - DEBUG_MATRIX_SCAN_RATE_ENABLE = yes - endif - ifeq ($(strip $1),scan-api) - DEBUG_MATRIX_SCAN_RATE_ENABLE = api - endif -endef # end of HELIX_OVERRIDE_PARSE diff --git a/keyboards/helix/pico/pico.c b/keyboards/helix/pico/pico.c deleted file mode 100644 index cc98fe8f61..0000000000 --- a/keyboards/helix/pico/pico.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2018 MakotoKurauchi - * - * 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 "pico.h" - -// Each keymap.c should use is_keyboard_master() instead of 'is_master'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -uint8_t is_master = false; - -void matrix_init_kb(void) { - // Each keymap.c should use is_keyboard_master() instead of is_master. - // But keep is_master for a while for backwards compatibility - // for the old keymap.c. - is_master = is_keyboard_master(); - - matrix_init_user(); -}; - -void keyboard_post_init_kb(void) { -#if defined(DEBUG_MATRIX_SCAN_RATE) - debug_enable = true; -#endif - keyboard_post_init_user(); -} diff --git a/keyboards/helix/pico/pico.h b/keyboards/helix/pico/pico.h deleted file mode 100644 index 7f2d795ca8..0000000000 --- a/keyboards/helix/pico/pico.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright 2018 MakotoKurauchi - * - * 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 "quantum.h" - -// Each keymap.c should use is_keyboard_master() instead of 'is_master', 'has_usb()'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -extern uint8_t is_master; // 'is_master' will be obsolete, it is recommended to use 'is_keyboard_master ()' instead. -#define has_usb() is_keyboard_master() diff --git a/keyboards/helix/pico/post_config.h b/keyboards/helix/pico/post_config.h deleted file mode 100644 index dda73d5d22..0000000000 --- a/keyboards/helix/pico/post_config.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#if defined(SPLIT_KEYBOARD) /* if use split_common */ -# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_SPLIT) -# define RGBLIGHT_SPLIT /* helix hardware need this */ -# endif -#endif diff --git a/keyboards/helix/pico/post_rules.mk b/keyboards/helix/pico/post_rules.mk deleted file mode 100644 index 88bb5482ba..0000000000 --- a/keyboards/helix/pico/post_rules.mk +++ /dev/null @@ -1,77 +0,0 @@ -# -# post_rules.mk contains post-processing rules for the Helix keyboard. -# -# Post-processing rules convert keyboard-specific shortcuts (that represent -# combinations of standard options) into QMK standard options. -# --include $(strip $(HELIX_TOP_DIR)/pico/override_helix_options.mk) ## File dedicated to maintenance - -# Parse 'HELIX=xx,yy,zz' option -ifneq ($(strip $(HELIX)),) - # make HELIX=ios helix/pico:AKEYMAP - # make HELIX=no-ani helix/pico:AKEYMAP - # make HELIX=ios,no-ani helix/pico:AKEYMAP - define HELIX_OPTION_PARSE - # parce 'no-ani' 'ios' - $(if $(SHOW_PARCE),$(info parse .$1.)) #debug - $(if $(HELIX_OVERRIDE_PARSE),$(call HELIX_OVERRIDE_PARSE,$1)) - - ifeq ($(strip $1),ios) - IOS_DEVICE_ENABLE = yes - endif - ifneq ($(filter na no_ani no-ani,$(strip $1)),) - LED_ANIMATIONS = no - endif - endef # end of HELIX_OPTION_PARSE - - COMMA=, - $(eval $(foreach A_OPTION_NAME,$(subst $(COMMA), ,$(HELIX)), \ - $(call HELIX_OPTION_PARSE,$(A_OPTION_NAME)))) - SHOW_HELIX_OPTIONS = yes -endif - -######## -# convert Helix-specific options (that represent combinations of standard options) -# into QMK standard options. - -ifeq ($(strip $(LED_BACK_ENABLE)), yes) - RGBLIGHT_ENABLE = yes - OPT_DEFS += -DRGBLED_BACK - ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') - endif -else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - RGBLIGHT_ENABLE = yes -endif - -ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) - OPT_DEFS += -DIOS_DEVICE_ENABLE -endif - -ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DLED_ANIMATIONS -endif - -ifeq ($(strip $(AUDIO_ENABLE)),yes) - ifeq ($(strip $(RGBLIGHT_ENABLE)),yes) - LTO_ENABLE = yes - endif -endif - -ifneq ($(strip $(SHOW_HELIX_OPTIONS)),) - $(info Helix Spacific Build Options) - $(info - LED_BACK_ENABLE = $(LED_BACK_ENABLE)) - $(info - LED_UNDERGLOW_ENABLE = $(LED_UNDERGLOW_ENABLE)) - $(info - LED_ANIMATIONS = $(LED_ANIMATIONS)) - $(info - IOS_DEVICE_ENABLE = $(IOS_DEVICE_ENABLE)) - $(info ) - $(info QMK Build Options) - $(info -- SPLIT_KEYBOARD = $(SPLIT_KEYBOARD)) - $(info -- AUDIO_ENABLE = $(AUDIO_ENABLE)) - $(info -- RGBLIGHT_ENABLE = $(RGBLIGHT_ENABLE)) - $(info -- CONSOLE_ENABLE = $(CONSOLE_ENABLE)) - $(info -- OPT_DEFS = $(OPT_DEFS)) - $(info -- LTO_ENABLE = $(LTO_ENABLE)) - $(info -- DEBUG_MATRIX_SCAN_RATE_ENABLE = $(DEBUG_MATRIX_SCAN_RATE_ENABLE)) - $(info ) -endif diff --git a/keyboards/helix/pico/qmk_conf/config.h b/keyboards/helix/pico/qmk_conf/config.h deleted file mode 100644 index 15b3392895..0000000000 --- a/keyboards/helix/pico/qmk_conf/config.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 - -// place overrides here - -#ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(STARTUP_SOUND) - #define AUDIO_CLICKY -#endif diff --git a/keyboards/helix/pico/qmk_conf/keyboard.json b/keyboards/helix/pico/qmk_conf/keyboard.json deleted file mode 100644 index ddb7220342..0000000000 --- a/keyboards/helix/pico/qmk_conf/keyboard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "features": { - "audio": true, - "extrakey": true - } -} diff --git a/keyboards/helix/pico/rules.mk b/keyboards/helix/pico/rules.mk deleted file mode 100644 index e18b8fb0c4..0000000000 --- a/keyboards/helix/pico/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -# Helix Spacific Build Options default values -LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -LED_ANIMATIONS = yes # LED animations -IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) diff --git a/keyboards/helix/pico/sc/keyboard.json b/keyboards/helix/pico/sc/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/pico/sc/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/pico/sc/rules.mk b/keyboards/helix/pico/sc/rules.mk deleted file mode 100644 index 066fffb74a..0000000000 --- a/keyboards/helix/pico/sc/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/pico/under/keyboard.json b/keyboards/helix/pico/under/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/pico/under/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/pico/under/rules.mk b/keyboards/helix/pico/under/rules.mk deleted file mode 100644 index a37aa6fab3..0000000000 --- a/keyboards/helix/pico/under/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_UNDERGLOW_ENABLE = yes From 584ad807cc145dead82a727b49ddbb972ebe6e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Sun, 6 Jul 2025 14:44:44 +0800 Subject: [PATCH 468/592] Refactor Starlight Smooth matrix effect (#25442) --- quantum/rgb_matrix/animations/starlight_smooth_anim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/rgb_matrix/animations/starlight_smooth_anim.h b/quantum/rgb_matrix/animations/starlight_smooth_anim.h index a87c06f9df..5467ea0a59 100644 --- a/quantum/rgb_matrix/animations/starlight_smooth_anim.h +++ b/quantum/rgb_matrix/animations/starlight_smooth_anim.h @@ -9,7 +9,7 @@ static uint8_t phase_offsets[RGB_MATRIX_LED_COUNT]; hsv_t STARLIGHT_SMOOTH_math(hsv_t hsv, uint8_t i, uint8_t time) { if (phase_offsets[i] == 0) { - phase_offsets[i] = rand() % 255; + phase_offsets[i] = random8(); } hsv.v = scale8(abs8(sin8((time + phase_offsets[i]) / 2) - 128) * 2, hsv.v); return hsv; From 0842f54a272ab8324dcfda38d1b5645a3b97372f Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 00:50:37 -0600 Subject: [PATCH 469/592] Refactor `bastardkb/tbkmini` (#25438) --- data/mappings/keyboard_aliases.hjson | 12 +++ keyboards/bastardkb/readme.md | 19 +++++ .../bastardkb/tbkmini/blackpill/config.h | 33 +------- .../bastardkb/tbkmini/blackpill/halconf.h | 21 +---- .../bastardkb/tbkmini/blackpill/keyboard.json | 42 ++++------ .../bastardkb/tbkmini/blackpill/mcuconf.h | 23 +----- .../bastardkb/tbkmini/blackpill/rules.mk | 5 -- keyboards/bastardkb/tbkmini/info.json | 79 ++++++++++++++----- .../tbkmini/keymaps/default/keymap.c | 69 ---------------- .../tbkmini/keymaps/default/keymap.json | 25 ++++++ .../bastardkb/tbkmini/promicro/keyboard.json | 15 ++++ keyboards/bastardkb/tbkmini/readme.md | 36 ++++----- keyboards/bastardkb/tbkmini/tbkmini.c | 61 -------------- .../bastardkb/tbkmini/v1/elitec/config.h | 22 ------ .../bastardkb/tbkmini/v1/elitec/keyboard.json | 31 -------- .../bastardkb/tbkmini/v1/elitec/rules.mk | 1 - .../bastardkb/tbkmini/v2/elitec/config.h | 21 ----- .../bastardkb/tbkmini/v2/elitec/keyboard.json | 31 -------- .../bastardkb/tbkmini/v2/elitec/rules.mk | 1 - .../bastardkb/tbkmini/v2/splinky_2/config.h | 31 -------- .../tbkmini/v2/splinky_2/keyboard.json | 32 -------- .../bastardkb/tbkmini/v2/splinky_2/readme.md | 5 -- .../bastardkb/tbkmini/v2/splinky_2/rules.mk | 3 - .../bastardkb/tbkmini/v2/splinky_3/config.h | 31 -------- .../tbkmini/v2/splinky_3/keyboard.json | 32 -------- .../bastardkb/tbkmini/v2/splinky_3/readme.md | 5 -- .../bastardkb/tbkmini/v2/splinky_3/rules.mk | 3 - .../bastardkb/tbkmini/v2/stemcell/config.h | 38 --------- .../bastardkb/tbkmini/v2/stemcell/halconf.h | 23 ------ .../tbkmini/v2/stemcell/keyboard.json | 34 -------- .../bastardkb/tbkmini/v2/stemcell/mcuconf.h | 29 ------- .../bastardkb/tbkmini/v2/stemcell/rules.mk | 3 - 32 files changed, 172 insertions(+), 644 deletions(-) create mode 100644 keyboards/bastardkb/readme.md delete mode 100644 keyboards/bastardkb/tbkmini/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/tbkmini/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/tbkmini/keymaps/default/keymap.json create mode 100644 keyboards/bastardkb/tbkmini/promicro/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/tbkmini.c delete mode 100644 keyboards/bastardkb/tbkmini/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/tbkmini/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/tbkmini/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/tbkmini/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/tbkmini/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index e976ff6cac..fb4f782844 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -68,6 +68,18 @@ "bakeneko80": { "target": "kkatano/bakeneko80" }, + "bastardkb/tbkmini/v2/elitec": { + "target": "bastardkb/tbkmini/promicro" + }, + "bastardkb/tbkmini/v2/splinky_2": { + "target": "bastardkb/tbkmini/promicro" + }, + "bastardkb/tbkmini/v2/splinky_3": { + "target": "bastardkb/tbkmini/promicro" + }, + "bastardkb/tbkmini/v2/stemcell": { + "target": "bastardkb/tbkmini/promicro" + }, "bear_face": { "target": "bear_face/v1" }, diff --git a/keyboards/bastardkb/readme.md b/keyboards/bastardkb/readme.md new file mode 100644 index 0000000000..1b95e09946 --- /dev/null +++ b/keyboards/bastardkb/readme.md @@ -0,0 +1,19 @@ +# Information for Various BastardKB Hardware + +## Handedness Pin on Elite-C Holder +The [Elite-C Holder](https://github.com/Bastardkb/Elite-C-holder) supports setting [handedness by pin](https://docs.qmk.fm/features/split_keyboard#handedness-by-pin) on pin F1 of an Elite-C. + +To utilise this, you must be using an Elite-C compatible development board (with the bottom 5 pins broken out) and install the necessary resistor. The following firmware configuration can be made in your keymap directory: +```Makefile +# rules.mk + +PIN_COMPATIBLE = elite_c +``` + +```c +// config.h +#pragma once + +#define SPLIT_HAND_PIN F1 +#define SPLIT_HAND_PIN_LOW_IS_LEFT +``` diff --git a/keyboards/bastardkb/tbkmini/blackpill/config.h b/keyboards/bastardkb/tbkmini/blackpill/config.h index bf7879edbe..c6b40f3e5f 100644 --- a/keyboards/bastardkb/tbkmini/blackpill/config.h +++ b/keyboards/bastardkb/tbkmini/blackpill/config.h @@ -1,27 +1,9 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - /* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 @@ -30,13 +12,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - /* SPI config for EEPROM. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 diff --git a/keyboards/bastardkb/tbkmini/blackpill/halconf.h b/keyboards/bastardkb/tbkmini/blackpill/halconf.h index 5c5dff98d4..545fc20cb3 100644 --- a/keyboards/bastardkb/tbkmini/blackpill/halconf.h +++ b/keyboards/bastardkb/tbkmini/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/tbkmini/blackpill/keyboard.json b/keyboards/bastardkb/tbkmini/blackpill/keyboard.json index 61d0e741fe..df77023bd6 100644 --- a/keyboards/bastardkb/tbkmini/blackpill/keyboard.json +++ b/keyboards/bastardkb/tbkmini/blackpill/keyboard.json @@ -1,37 +1,23 @@ { - "keyboard_name": "TBK Mini Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B0", "B1", "B10", "B3", "B4", "B5"], "rows": ["A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/tbkmini/blackpill/mcuconf.h b/keyboards/bastardkb/tbkmini/blackpill/mcuconf.h index 2b3f30cbfe..cc77ec94ae 100644 --- a/keyboards/bastardkb/tbkmini/blackpill/mcuconf.h +++ b/keyboards/bastardkb/tbkmini/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next diff --git a/keyboards/bastardkb/tbkmini/blackpill/rules.mk b/keyboards/bastardkb/tbkmini/blackpill/rules.mk deleted file mode 100644 index 48c904dd64..0000000000 --- a/keyboards/bastardkb/tbkmini/blackpill/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/tbkmini/info.json b/keyboards/bastardkb/tbkmini/info.json index ff2df9cdd6..f37e092c2d 100644 --- a/keyboards/bastardkb/tbkmini/info.json +++ b/keyboards/bastardkb/tbkmini/info.json @@ -1,24 +1,70 @@ { - "url": "https://www.bastardkb.com/tbk-mini", + "url": "https://github.com/Bastardkb/TBK-Mini", + "keyboard_name": "TBK Mini", "usb": { - "pid": "0x1828" + "pid": "0x1828", + "device_version": "2.0.0" }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "rgb_matrix": true + }, + "split": { + "enabled": true + }, + "diode_direction": "ROW2COL", "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 2}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 2}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 2}, + {"matrix": [2, 1], "x": 20, "y": 42, "flags": 4}, + {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 41, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 41, "y": 21, "flags": 4}, + {"matrix": [2, 2], "x": 41, "y": 42, "flags": 4}, + {"matrix": [2, 3], "x": 61, "y": 42, "flags": 4}, + {"matrix": [1, 3], "x": 61, "y": 21, "flags": 4}, + {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 81, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 81, "y": 21, "flags": 4}, + {"matrix": [2, 4], "x": 81, "y": 42, "flags": 4}, + {"matrix": [0, 5], "x": 102, "y": 0, "flags": 4}, + {"matrix": [1, 5], "x": 102, "y": 21, "flags": 4}, + {"matrix": [2, 5], "x": 102, "y": 42, "flags": 4}, + {"matrix": [3, 1], "x": 61, "y": 64, "flags": 2}, + {"matrix": [3, 3], "x": 81, "y": 64, "flags": 2}, + {"matrix": [3, 4], "x": 102, "y": 64, "flags": 2}, + {"matrix": [4, 0], "x": 224, "y": 0, "flags": 2}, + {"matrix": [5, 0], "x": 224, "y": 21, "flags": 2}, + {"matrix": [6, 0], "x": 224, "y": 42, "flags": 2}, + {"matrix": [6, 1], "x": 204, "y": 42, "flags": 4}, + {"matrix": [5, 1], "x": 204, "y": 21, "flags": 4}, + {"matrix": [4, 1], "x": 204, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 183, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 183, "y": 21, "flags": 4}, + {"matrix": [6, 2], "x": 183, "y": 42, "flags": 4}, + {"matrix": [6, 3], "x": 163, "y": 42, "flags": 4}, + {"matrix": [5, 3], "x": 163, "y": 21, "flags": 4}, + {"matrix": [4, 3], "x": 163, "y": 0, "flags": 4}, + {"matrix": [4, 4], "x": 142, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 142, "y": 21, "flags": 4}, + {"matrix": [6, 4], "x": 142, "y": 42, "flags": 4}, + {"matrix": [4, 5], "x": 122, "y": 0, "flags": 4}, + {"matrix": [5, 5], "x": 122, "y": 21, "flags": 4}, + {"matrix": [6, 5], "x": 122, "y": 42, "flags": 4}, + {"matrix": [7, 1], "x": 163, "y": 64, "flags": 2}, + {"matrix": [7, 3], "x": 142, "y": 64, "flags": 2}, + {"matrix": [7, 4], "x": 122, "y": 64, "flags": 2} + ], "max_brightness": 50, "sleep": true, "split_count": [21, 21] }, - "rgblight": { - "led_count": 42, - "split_count": [21, 21] - }, - "split": { - "transport": { - "sync": { - "matrix_state": true - } - } - }, "community_layouts": ["split_3x6_3"], "layouts": { "LAYOUT_split_3x6_3": { @@ -29,46 +75,39 @@ {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [4, 5], "x": 11, "y": 0}, {"matrix": [4, 4], "x": 12, "y": 0}, {"matrix": [4, 3], "x": 13, "y": 0}, {"matrix": [4, 2], "x": 14, "y": 0}, {"matrix": [4, 1], "x": 15, "y": 0}, {"matrix": [4, 0], "x": 16, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [5, 5], "x": 11, "y": 1}, {"matrix": [5, 4], "x": 12, "y": 1}, {"matrix": [5, 3], "x": 13, "y": 1}, {"matrix": [5, 2], "x": 14, "y": 1}, {"matrix": [5, 1], "x": 15, "y": 1}, {"matrix": [5, 0], "x": 16, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [6, 5], "x": 11, "y": 2}, {"matrix": [6, 4], "x": 12, "y": 2}, {"matrix": [6, 3], "x": 13, "y": 2}, {"matrix": [6, 2], "x": 14, "y": 2}, {"matrix": [6, 1], "x": 15, "y": 2}, {"matrix": [6, 0], "x": 16, "y": 2}, - {"matrix": [3, 3], "x": 5, "y": 3}, {"matrix": [3, 4], "x": 6, "y": 3}, {"matrix": [3, 1], "x": 7, "y": 3}, - {"matrix": [7, 1], "x": 9, "y": 3}, {"matrix": [7, 4], "x": 10, "y": 3}, {"matrix": [7, 3], "x": 11, "y": 3} diff --git a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c deleted file mode 100644 index d87e9c2a44..0000000000 --- a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * - * 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 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [0] = LAYOUT_split_3x6_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - 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_ESC, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, MO(1), MO(2), KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - - ), - - [1] = LAYOUT_split_3x6_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, _______, MO(3), KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - ), - - [2] = LAYOUT_split_3x6_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_TAB, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_GRV, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, KC_TILD, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, MO(3), _______, KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - ), - - [3] = LAYOUT_split_3x6_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RM_TOGG, RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RM_NEXT, RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, _______, _______, KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - )}; diff --git a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json new file mode 100644 index 0000000000..58a02b797c --- /dev/null +++ b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json @@ -0,0 +1,25 @@ +{ + "keyboard": "bastardkb/tbkmini", + "keymap": "default", + "layout": "LAYOUT_split_3x6_3", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_ESC", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RALT" + ], + [ + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "CK_TOGG", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/bastardkb/tbkmini/promicro/keyboard.json b/keyboards/bastardkb/tbkmini/promicro/keyboard.json new file mode 100644 index 0000000000..c1e653ffc1 --- /dev/null +++ b/keyboards/bastardkb/tbkmini/promicro/keyboard.json @@ -0,0 +1,15 @@ +{ + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], + "rows": ["F7", "C6", "D4", "B5"] + }, + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/tbkmini/readme.md b/keyboards/bastardkb/tbkmini/readme.md index 74e24ff506..cc3e547ff4 100644 --- a/keyboards/bastardkb/tbkmini/readme.md +++ b/keyboards/bastardkb/tbkmini/readme.md @@ -1,29 +1,27 @@ # TBK Mini -A split, compact ergonomic keyboard. +* Keyboard Maintainer: [Quentin Lebastard](https://github.com/bastardkb) +* Hardware Supported: BastardKB Blackpill or Pro Micro adapter & compatible development boards +* Hardware Availability: [GitHub](https://github.com/Bastardkb/TBK-Mini) -* Keyboard Maintainer: [Bastard Keyboards](https://github.com/Bastardkb/) -* Hardware Supported: elite-C V4 -* Hardware Availability: [Bastardkb.com](https://bastardkb.com/) +Make example for this keyboard (after setting up your build environment): -## Building the firmware + make bastardkb/tbkmini/blackpill:default + make bastardkb/tbkmini/promicro:default -**You must specify the shield version when compiling/flashing the firmware.** +Flashing example for this keyboard: -The template is: + make bastardkb/tbkmini/blackpill:default:flash + make bastardkb/tbkmini/promicro:default:flash -```shell -qmk compile -kb bastardkb/tbkmini/{VERSION}/elitec -km {KEYMAP} -``` - -| Shield Version | default | via | -| --------------- | -------------------------------------------------------------- | ---------------------------------------------------------- | -| v1 (Elite-C) | `qmk compile -kb bastardkb/tbkmini/v1/elitec -km default` | `qmk compile -kb bastardkb/tbkmini/v1/elitec -km via` | -| v2 (Elite-C) | `qmk compile -kb bastardkb/tbkmini/v2/elitec -km default` | `qmk compile -kb bastardkb/tbkmini/v2/elitec -km via` | -| v2 (Splinky v2) | `qmk compile -kb bastardkb/tbkmini/v2/splinky/v2 -km default` | `qmk compile -kb bastardkb/tbkmini/v2/splinky/v2 -km via` | -| v2 (Splinky v3) | `qmk compile -kb bastardkb/tbkmini/v2/splinky/v3 -km default` | `qmk compile -kb bastardkb/tbkmini/v2/splinky/v3 -km via` | -| v2 (STeMCell) | `qmk compile -kb bastardkb/tbkmini/v2/stemcell -km default` | `qmk compile -kb bastardkb/tbkmini/v2/stemcell -km via` | +Note if using the `promicro` version: If you are using an Elite-C compatible development board, see [here](../readme.md#handedness-in-on-elite-c-holder) for setting handedness by pin. 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). -See the [keyboard build instructions](http://docs.bastardkb.com/) +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the adapter PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/bastardkb/tbkmini/tbkmini.c b/keyboards/bastardkb/tbkmini/tbkmini.c deleted file mode 100644 index 51baefb737..0000000000 --- a/keyboards/bastardkb/tbkmini/tbkmini.c +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright 2021 Quentin LEBASTARD - * - * 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" - -// clang-format off -#ifdef RGB_MATRIX_ENABLE -led_config_t g_led_config = { { - // left - { 0, 5, 6, 11, 12, 15 }, - { 1, 4, 7, 10, 13, 16 }, - { 2, 3, 8, 9, 14, 17 }, - { NO_LED, 18, NO_LED, 19, 20, NO_LED }, - // right - { 21, 26, 27, 32, 33, 36 }, - { 22, 25, 28, 31, 34, 37 }, - { 23, 24, 29, 30, 35, 38 }, - { NO_LED, 39, NO_LED, 40, 41, NO_LED } -}, { - // left - { 0, 0 }, { 0, 21 }, { 0, 42 }, // col 1 - { 20, 42 }, { 20, 21 }, { 20, 0 }, // col 2 - { 41, 0 }, { 41, 21 }, { 41, 42 }, - { 61, 42 }, { 61, 21 }, { 61, 0 }, - { 81, 0 }, { 81, 21 }, { 81, 42 }, - { 102, 0 }, { 102, 21 }, { 102, 42 }, - { 61, 64 }, { 81, 64 }, { 102, 64 }, // left thumb cluster - // right - { 224, 0 }, { 224, 21 }, { 224, 42 }, // col 12 - { 204, 42 }, { 204, 21 }, { 204, 0 }, // col 11 - { 183, 0 }, { 183, 21 }, { 183, 42 }, - { 163, 42 }, { 163, 21 }, { 163, 0 }, - { 142, 0 }, { 142, 21 }, { 142, 42 }, - { 122, 0 }, { 122, 21 }, { 122, 42 }, - { 163, 64 }, { 142, 64 }, { 122, 64 } // right thumb cluster -}, { - // left - 2, 2, 2, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 2, - // right - 2, 2, 2, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 2 -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/tbkmini/v1/elitec/config.h b/keyboards/bastardkb/tbkmini/v1/elitec/config.h deleted file mode 100644 index 41b5aa1c66..0000000000 --- a/keyboards/bastardkb/tbkmini/v1/elitec/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json deleted file mode 100644 index 5110ea0d74..0000000000 --- a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "TBK Mini Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D2" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["B4", "E6", "C6", "B1", "B3", "B2"], - "rows": ["B5", "F7", "F6", "B6"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D0" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/tbkmini/v1/elitec/rules.mk b/keyboards/bastardkb/tbkmini/v1/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/tbkmini/v1/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/tbkmini/v2/elitec/config.h b/keyboards/bastardkb/tbkmini/v2/elitec/config.h deleted file mode 100644 index e6b7fefa66..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/elitec/config.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json deleted file mode 100644 index 701ec6af28..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "TBK Mini Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], - "rows": ["F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/tbkmini/v2/elitec/rules.mk b/keyboards/bastardkb/tbkmini/v2/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/config.h b/keyboards/bastardkb/tbkmini/v2/splinky_2/config.h deleted file mode 100644 index 977fb0a6e8..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_2/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json deleted file mode 100644 index 15db3db6e8..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "TBK Mini Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/readme.md b/keyboards/bastardkb/tbkmini/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/rules.mk b/keyboards/bastardkb/tbkmini/v2/splinky_2/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_2/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/config.h b/keyboards/bastardkb/tbkmini/v2/splinky_3/config.h deleted file mode 100644 index e496023656..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_3/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json deleted file mode 100644 index 3936b9368a..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "TBK Mini Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/readme.md b/keyboards/bastardkb/tbkmini/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/rules.mk b/keyboards/bastardkb/tbkmini/v2/splinky_3/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/splinky_3/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/config.h b/keyboards/bastardkb/tbkmini/v2/stemcell/config.h deleted file mode 100644 index ca1cc0f719..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/halconf.h b/keyboards/bastardkb/tbkmini/v2/stemcell/halconf.h deleted file mode 100644 index dbeb6aeaa0..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/halconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE - -#include_next diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json b/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json deleted file mode 100644 index 2cbee7fe17..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "keyboard_name": "TBK Mini STeMCell", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B1", "B2", "A4", "B4", "B5", "B8"], - "rows": ["B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/mcuconf.h b/keyboards/bastardkb/tbkmini/v2/stemcell/mcuconf.h deleted file mode 100644 index 6afebade36..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk b/keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk deleted file mode 100644 index 3fe3e4ffbe..0000000000 --- a/keyboards/bastardkb/tbkmini/v2/stemcell/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = usart From ba63bac661c3c6154f3b42a85167b3552d29f0f8 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 6 Jul 2025 16:57:51 +1000 Subject: [PATCH 470/592] 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 5d983e347e..33014a54a5 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 140c8de475..c4d8e3a4bc 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 a2a86e175c..515386756d 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 471/592] 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 0000000000..040470b933 --- /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 0000000000..26a3384a6f --- /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 0000000000..8ebd851e77 --- /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 0000000000..8e69dc58b2 --- /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 0000000000..e2a62773e8 --- /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 036745e853b512db868b6e226753521f7975d40c Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 02:52:24 -0600 Subject: [PATCH 472/592] Refactor `helix/rev2` (#25429) * Refactor helix/rev2 - Rename rev2 -> beta & update keyboard aliases accordingly - Removes redundant back, base, sc, under, & qmk_conf revisions - Removes unnecessary keymaps - Migrates legacy defines and configuration to keyboard.json - Tidy's keymap and migrates to JSON - Fixes RGB configuration to illuminate 32 LEDs per half - Adds an alternate 4 row layout for snappable PCB - Tidy's up OLED code - Enables standard features (bootmagic, extrakey, etc.) --- data/mappings/keyboard_aliases.hjson | 41 +- keyboards/helix/beta/beta.c | 77 ++++ keyboards/helix/beta/config.h | 5 + .../{rev2/info.json => beta/keyboard.json} | 146 ++++--- .../helix/beta/keymaps/default/keymap.json | 28 ++ keyboards/helix/rev2/back/keyboard.json | 1 - keyboards/helix/rev2/back/rules.mk | 1 - keyboards/helix/rev2/base/keyboard.json | 1 - keyboards/helix/rev2/config.h | 78 ---- keyboards/helix/rev2/keymaps/default/config.h | 38 -- keyboards/helix/rev2/keymaps/default/keymap.c | 341 --------------- .../helix/rev2/keymaps/default/oled_display.c | 138 ------ .../helix/rev2/keymaps/default/readme.md | 154 ------- .../helix/rev2/keymaps/default/readme_jp.md | 127 ------ keyboards/helix/rev2/keymaps/default/rules.mk | 23 - .../helix/rev2/keymaps/five_rows_jis/config.h | 58 --- .../helix/rev2/keymaps/five_rows_jis/keymap.c | 410 ------------------ .../rev2/keymaps/five_rows_jis/readme.md | 150 ------- .../rev2/keymaps/five_rows_jis/readme_jp.md | 173 -------- .../helix/rev2/keymaps/five_rows_jis/rules.mk | 19 - .../helix/rev2/keymaps/led_test/README.md | 27 -- .../helix/rev2/keymaps/led_test/config.h | 41 -- .../helix/rev2/keymaps/led_test/keymap.c | 341 --------------- .../rev2/keymaps/led_test/led_test_init.c | 6 - .../rev2/keymaps/led_test/oled_display.c | 1 - .../helix/rev2/keymaps/led_test/rules.mk | 25 -- keyboards/helix/rev2/local_features.mk | 90 ---- .../override_helix_options.mk-maintenance | 46 -- keyboards/helix/rev2/post_config.h | 7 - keyboards/helix/rev2/post_rules.mk | 3 - keyboards/helix/rev2/qmk_conf/keyboard.json | 1 - keyboards/helix/rev2/qmk_conf/rules.mk | 4 - keyboards/helix/rev2/readme.md | 13 - keyboards/helix/rev2/rev2.c | 76 ---- keyboards/helix/rev2/rev2.h | 36 -- keyboards/helix/rev2/rules.mk | 9 - keyboards/helix/rev2/sc/keyboard.json | 1 - keyboards/helix/rev2/sc/rules.mk | 1 - .../helix/rev2/serial_config_simpleapi.h | 4 - keyboards/helix/rev2/under/keyboard.json | 1 - keyboards/helix/rev2/under/rules.mk | 1 - 41 files changed, 209 insertions(+), 2534 deletions(-) create mode 100644 keyboards/helix/beta/beta.c create mode 100644 keyboards/helix/beta/config.h rename keyboards/helix/{rev2/info.json => beta/keyboard.json} (57%) create mode 100644 keyboards/helix/beta/keymaps/default/keymap.json delete mode 100644 keyboards/helix/rev2/back/keyboard.json delete mode 100644 keyboards/helix/rev2/back/rules.mk delete mode 100644 keyboards/helix/rev2/base/keyboard.json delete mode 100644 keyboards/helix/rev2/config.h delete mode 100644 keyboards/helix/rev2/keymaps/default/config.h delete mode 100644 keyboards/helix/rev2/keymaps/default/keymap.c delete mode 100644 keyboards/helix/rev2/keymaps/default/oled_display.c delete mode 100644 keyboards/helix/rev2/keymaps/default/readme.md delete mode 100644 keyboards/helix/rev2/keymaps/default/readme_jp.md delete mode 100644 keyboards/helix/rev2/keymaps/default/rules.mk delete mode 100644 keyboards/helix/rev2/keymaps/five_rows_jis/config.h delete mode 100644 keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c delete mode 100644 keyboards/helix/rev2/keymaps/five_rows_jis/readme.md delete mode 100644 keyboards/helix/rev2/keymaps/five_rows_jis/readme_jp.md delete mode 100644 keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk delete mode 100644 keyboards/helix/rev2/keymaps/led_test/README.md delete mode 100644 keyboards/helix/rev2/keymaps/led_test/config.h delete mode 100644 keyboards/helix/rev2/keymaps/led_test/keymap.c delete mode 100644 keyboards/helix/rev2/keymaps/led_test/led_test_init.c delete mode 100644 keyboards/helix/rev2/keymaps/led_test/oled_display.c delete mode 100644 keyboards/helix/rev2/keymaps/led_test/rules.mk delete mode 100644 keyboards/helix/rev2/local_features.mk delete mode 100644 keyboards/helix/rev2/override_helix_options.mk-maintenance delete mode 100644 keyboards/helix/rev2/post_config.h delete mode 100644 keyboards/helix/rev2/post_rules.mk delete mode 100644 keyboards/helix/rev2/qmk_conf/keyboard.json delete mode 100644 keyboards/helix/rev2/qmk_conf/rules.mk delete mode 100644 keyboards/helix/rev2/readme.md delete mode 100644 keyboards/helix/rev2/rev2.c delete mode 100644 keyboards/helix/rev2/rev2.h delete mode 100644 keyboards/helix/rev2/rules.mk delete mode 100644 keyboards/helix/rev2/sc/keyboard.json delete mode 100644 keyboards/helix/rev2/sc/rules.mk delete mode 100644 keyboards/helix/rev2/serial_config_simpleapi.h delete mode 100644 keyboards/helix/rev2/under/keyboard.json delete mode 100644 keyboards/helix/rev2/under/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index fb4f782844..d50ad16498 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -269,38 +269,11 @@ "handwired/jscotto/scottostarter": { "target": "handwired/scottokeebs/scottostarter" }, - "helix/rev2/back/oled": { - "target": "helix/rev2/back" + "helix": { + "target": "helix/beta" }, - "helix/rev2/oled": { - "target": "helix/rev2" - }, - "helix/rev2/oled/back": { - "target": "helix/rev2/back" - }, - "helix/rev2/oled/under": { - "target": "helix/rev2/under" - }, - "helix/rev2/sc/back": { - "target": "helix/rev2/sc" - }, - "helix/rev2/sc/oled": { - "target": "helix/rev2/sc" - }, - "helix/rev2/sc/oledback": { - "target": "helix/rev2/sc" - }, - "helix/rev2/sc/oledunder": { - "target": "helix/rev2/sc" - }, - "helix/rev2/sc/under": { - "target": "helix/rev2/sc" - }, - "helix/rev2/under": { - "target": "helix/rev2/sc" - }, - "helix/rev2/under/oled": { - "target": "helix/rev2/under" + "helix/rev2": { + "target": "helix/beta" }, "honeycomb": { "target": "keyhive/honeycomb" @@ -2290,12 +2263,6 @@ "handwired/dygma/raise": { "target": "handwired/dygma/raise/ansi" }, - "helix": { - "target": "helix/rev2/base" - }, - "helix/rev2": { - "target": "helix/rev2/base" - }, "ibm/model_m/mschwingen": { "target": "ibm/model_m/mschwingen/led_wired" }, diff --git a/keyboards/helix/beta/beta.c b/keyboards/helix/beta/beta.c new file mode 100644 index 0000000000..8020772b96 --- /dev/null +++ b/keyboards/helix/beta/beta.c @@ -0,0 +1,77 @@ +// Copyright 2020 Yushakobo +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +#ifdef OLED_ENABLE +void render_status(void) { + static const char os_logo[][2][3] PROGMEM = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}}; + if (!keymap_config.swap_lalt_lgui) { + oled_write_P(os_logo[0][0], false); + oled_write_P(PSTR("\n"), false); + oled_write_P(os_logo[0][1], false); + } else { + oled_write_P(os_logo[1][0], false); + oled_write_P(PSTR("\n"), false); + oled_write_P(os_logo[1][1], false); + } + + oled_write_P(PSTR(" Layer: "), false); + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_ln_P(PSTR("Default"), false); + break; + case 1: + oled_write_ln_P(PSTR("Lower"), false); + break; + case 2: + oled_write_ln_P(PSTR("Raise"), false); + break; + case 3: + oled_write_ln_P(PSTR("Adjust"), false); + break; + default: + oled_write_ln_P(PSTR("Undefined"), false); + } + oled_write_P(PSTR("\n"), false); + + led_t led_state = host_keyboard_led_state(); + oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); + oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); + oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); +} + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + // clang-format off + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 + // clang-format on + }; + oled_write_P(qmk_logo, false); +} + +static void render_rgblight_status(void) { + oled_write_P(PSTR(" LED"), false); + oled_write(get_u8_str(rgblight_get_mode(), ' '), false); + oled_write_char(':', false); + oled_write(get_u8_str(rgblight_get_hue() / RGBLIGHT_HUE_STEP, ' '), false); + oled_write_char(',', false); + oled_write(get_u8_str(rgblight_get_sat() / RGBLIGHT_SAT_STEP, ' '), false); + oled_write_char(',', false); + oled_write(get_u8_str(rgblight_get_val() / RGBLIGHT_VAL_STEP, ' '), false); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (is_keyboard_master()) { + render_status(); + } else { + render_logo(); + render_rgblight_status(); + } + return false; +} +#endif diff --git a/keyboards/helix/beta/config.h b/keyboards/helix/beta/config.h new file mode 100644 index 0000000000..dac611de9a --- /dev/null +++ b/keyboards/helix/beta/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" diff --git a/keyboards/helix/rev2/info.json b/keyboards/helix/beta/keyboard.json similarity index 57% rename from keyboards/helix/rev2/info.json rename to keyboards/helix/beta/keyboard.json index a8bdb23e41..240a0a8869 100644 --- a/keyboards/helix/rev2/info.json +++ b/keyboards/helix/beta/keyboard.json @@ -1,52 +1,51 @@ { - "keyboard_name": "Helix Beta", "manufacturer": "Yushakobo", - "url": "https://github.com/MakotoKurauchi/helix", + "keyboard_name": "Helix Beta", "maintainer": "MakotoKurauchi", - "usb": { - "vid": "0x3265", - "pid": "0x0000", - "device_version": "0.0.1" + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "rgblight": true }, "matrix_pins": { "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], "rows": ["D4", "C6", "D7", "E6", "B4"] }, - "diode_direction": "COL2ROW", + "rgblight": { + "animations": { + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true + }, + "led_count": 64, + "max_brightness": 45, + "split_count": [32, 32] + }, "split": { "enabled": true, "serial": { "pin": "D2" - }, - "transport": { - "sync": { - "indicators": true, - "layer_state": true - } } }, - "tapping": { - "term": 100 - }, - "rgblight": { - "hue_steps": 10, - "animations": { - "breathing": true, - "rainbow_mood": true, - "rainbow_swirl": true, - "snake": true, - "knight": true, - "christmas": true, - "static_gradient": true - } + "url": "https://shop.yushakobo.jp/products/oss_pcb?variant=39452554231969", + "usb": { + "device_version": "0.0.1", + "pid": "0x0000", + "vid": "0x3265" }, "ws2812": { "pin": "D3" }, - "processor": "atmega32u4", - "bootloader": "caterina", "layouts": { - "LAYOUT": { + "LAYOUT_4row": { "layout": [ {"matrix": [0, 0], "x": 0, "y": 0}, {"matrix": [0, 1], "x": 1, "y": 0}, @@ -54,42 +53,90 @@ {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - - {"matrix": [5, 5], "x": 9, "y": 0}, - {"matrix": [5, 4], "x": 10, "y": 0}, - {"matrix": [5, 3], "x": 11, "y": 0}, - {"matrix": [5, 2], "x": 12, "y": 0}, - {"matrix": [5, 1], "x": 13, "y": 0}, - {"matrix": [5, 0], "x": 14, "y": 0}, - + {"matrix": [4, 5], "x": 9, "y": 0}, + {"matrix": [4, 4], "x": 10, "y": 0}, + {"matrix": [4, 3], "x": 11, "y": 0}, + {"matrix": [4, 2], "x": 12, "y": 0}, + {"matrix": [4, 1], "x": 13, "y": 0}, + {"matrix": [4, 0], "x": 14, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - - {"matrix": [6, 5], "x": 9, "y": 1}, - {"matrix": [6, 4], "x": 10, "y": 1}, - {"matrix": [6, 3], "x": 11, "y": 1}, - {"matrix": [6, 2], "x": 12, "y": 1}, - {"matrix": [6, 1], "x": 13, "y": 1}, - {"matrix": [6, 0], "x": 14, "y": 1}, - + {"matrix": [5, 5], "x": 9, "y": 1}, + {"matrix": [5, 4], "x": 10, "y": 1}, + {"matrix": [5, 3], "x": 11, "y": 1}, + {"matrix": [5, 2], "x": 12, "y": 1}, + {"matrix": [5, 1], "x": 13, "y": 1}, + {"matrix": [5, 0], "x": 14, "y": 1}, {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - + {"matrix": [6, 5], "x": 9, "y": 2}, + {"matrix": [6, 4], "x": 10, "y": 2}, + {"matrix": [6, 3], "x": 11, "y": 2}, + {"matrix": [6, 2], "x": 12, "y": 2}, + {"matrix": [6, 1], "x": 13, "y": 2}, + {"matrix": [6, 0], "x": 14, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [7, 6], "x": 8, "y": 3}, + {"matrix": [7, 5], "x": 9, "y": 3}, + {"matrix": [7, 4], "x": 10, "y": 3}, + {"matrix": [7, 3], "x": 11, "y": 3}, + {"matrix": [7, 2], "x": 12, "y": 3}, + {"matrix": [7, 1], "x": 13, "y": 3}, + {"matrix": [7, 0], "x": 14, "y": 3} + ] + }, + "LAYOUT_5row": { + "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": [5, 5], "x": 9, "y": 0}, + {"matrix": [5, 4], "x": 10, "y": 0}, + {"matrix": [5, 3], "x": 11, "y": 0}, + {"matrix": [5, 2], "x": 12, "y": 0}, + {"matrix": [5, 1], "x": 13, "y": 0}, + {"matrix": [5, 0], "x": 14, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [6, 5], "x": 9, "y": 1}, + {"matrix": [6, 4], "x": 10, "y": 1}, + {"matrix": [6, 3], "x": 11, "y": 1}, + {"matrix": [6, 2], "x": 12, "y": 1}, + {"matrix": [6, 1], "x": 13, "y": 1}, + {"matrix": [6, 0], "x": 14, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, {"matrix": [7, 5], "x": 9, "y": 2}, {"matrix": [7, 4], "x": 10, "y": 2}, {"matrix": [7, 3], "x": 11, "y": 2}, {"matrix": [7, 2], "x": 12, "y": 2}, {"matrix": [7, 1], "x": 13, "y": 2}, {"matrix": [7, 0], "x": 14, "y": 2}, - {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, {"matrix": [3, 2], "x": 2, "y": 3}, @@ -97,7 +144,6 @@ {"matrix": [3, 4], "x": 4, "y": 3}, {"matrix": [3, 5], "x": 5, "y": 3}, {"matrix": [3, 6], "x": 6, "y": 3}, - {"matrix": [8, 6], "x": 8, "y": 3}, {"matrix": [8, 5], "x": 9, "y": 3}, {"matrix": [8, 4], "x": 10, "y": 3}, @@ -105,7 +151,6 @@ {"matrix": [8, 2], "x": 12, "y": 3}, {"matrix": [8, 1], "x": 13, "y": 3}, {"matrix": [8, 0], "x": 14, "y": 3}, - {"matrix": [4, 0], "x": 0, "y": 4}, {"matrix": [4, 1], "x": 1, "y": 4}, {"matrix": [4, 2], "x": 2, "y": 4}, @@ -113,7 +158,6 @@ {"matrix": [4, 4], "x": 4, "y": 4}, {"matrix": [4, 5], "x": 5, "y": 4}, {"matrix": [4, 6], "x": 6, "y": 4}, - {"matrix": [9, 6], "x": 8, "y": 4}, {"matrix": [9, 5], "x": 9, "y": 4}, {"matrix": [9, 4], "x": 10, "y": 4}, diff --git a/keyboards/helix/beta/keymaps/default/keymap.json b/keyboards/helix/beta/keymaps/default/keymap.json new file mode 100644 index 0000000000..1719abca5b --- /dev/null +++ b/keyboards/helix/beta/keymaps/default/keymap.json @@ -0,0 +1,28 @@ +{ + "keyboard": "helix/beta", + "keymap": "default", + "layout": "LAYOUT_5row", + "layers": [ + [ + "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "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_BSPC", + "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_LBRC", "KC_RBRC", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ENT" , + "MO(3)", "KC_ESC", "KC_LALT", "KC_LGUI", "LALT(KC_GRV)", "MO(1)", "KC_SPC", "KC_SPC", "MO(2)", "LALT(KC_GRV)", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_DEL", + "_______", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_BSLS", + "KC_CAPS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "_______", "_______", "KC_F12", "_______", "_______", "KC_PGDN", "KC_PGUP", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "AG_NORM", "AG_SWAP", "_______", "_______", "UG_TOGG", "UG_HUEU", "UG_SATU", "UG_VALU", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "UG_NEXT", "UG_HUED", "UG_SATD", "UG_VALD" + ] + ] +} diff --git a/keyboards/helix/rev2/back/keyboard.json b/keyboards/helix/rev2/back/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/rev2/back/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/rev2/back/rules.mk b/keyboards/helix/rev2/back/rules.mk deleted file mode 100644 index 066fffb74a..0000000000 --- a/keyboards/helix/rev2/back/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/rev2/base/keyboard.json b/keyboards/helix/rev2/base/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/rev2/base/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h deleted file mode 100644 index 67af503882..0000000000 --- a/keyboards/helix/rev2/config.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert -Copyright 2018 MakotoKurauchi - -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 QUICK_TAP_TERM 0 - -#define OLED_UPDATE_INTERVAL 50 - -// Helix keyboard RGB LED support -// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes -#ifdef RGBLED_BACK - #define RGBLIGHT_LED_COUNT 32 -#else - #define RGBLIGHT_LED_COUNT 6 -#endif - -#ifndef IOS_DEVICE_ENABLE - #if RGBLIGHT_LED_COUNT <= 6 - #define RGBLIGHT_LIMIT_VAL 255 - #else - #define RGBLIGHT_LIMIT_VAL 120 - #endif - #define RGBLIGHT_VAL_STEP 17 -#else - #if RGBLIGHT_LED_COUNT <= 6 - #define RGBLIGHT_LIMIT_VAL 90 - #else - #define RGBLIGHT_LIMIT_VAL 35 - #endif - #define RGBLIGHT_VAL_STEP 4 -#endif - -#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) -// USB_MAX_POWER_CONSUMPTION value for Helix keyboard -// 120 RGBoff, OLEDoff -// 120 OLED -// 330 RGB 6 -// 300 RGB 32 -// 310 OLED & RGB 32 - #define USB_MAX_POWER_CONSUMPTION 400 -#else - // fix iPhone and iPad power adapter issue - // iOS device need lessthan 100 - #define USB_MAX_POWER_CONSUMPTION 100 -#endif - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT diff --git a/keyboards/helix/rev2/keymaps/default/config.h b/keyboards/helix/rev2/keymaps/default/config.h deleted file mode 100644 index b8c1041cdc..0000000000 --- a/keyboards/helix/rev2/keymaps/default/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 - -// place overrides here - -// If you need more program area, try select and reduce rgblight modes to use. - -// Selection of RGBLIGHT MODE to use. -#if defined(LED_ANIMATIONS) - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_CHRISTMAS - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - //#define RGBLIGHT_EFFECT_RGB_TEST - //#define RGBLIGHT_EFFECT_ALTERNATING -#endif diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c deleted file mode 100644 index a48a855e02..0000000000 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _ADJUST -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - BACKLIT, - EISU, - KANA, - RGBRST -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - -//Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC, - 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_COLEMAK] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_DVORAK] = LAYOUT( - KC_GRV, 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_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LBRC, KC_RBRC, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | Reset|RGBRST| | | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, QK_BOOT, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD - ) -}; - -#ifdef AUDIO_ENABLE - -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_plover[][2] = SONG(PLOVER_SOUND); -float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); -#endif - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); - #endif - layer_on(layer3); - } else { - layer_off(layer3); - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - set_single_persistent_default_layer(_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); - #endif - } - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - TOG_STATUS = false; - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE); - #endif - } - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - layer_off(_RAISE); - TOG_STATUS = false; - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case QK_UNDERGLOW_MODE_NEXT: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_get_mode(); - } - #endif - return false; - break; - case EISU: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG2); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG1); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG1); - } - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_get_mode(); - } - #endif - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_get_mode(); - #endif -} diff --git a/keyboards/helix/rev2/keymaps/default/oled_display.c b/keyboards/helix/rev2/keymaps/default/oled_display.c deleted file mode 100644 index 4eb815ce48..0000000000 --- a/keyboards/helix/rev2/keymaps/default/oled_display.c +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 -#include -#include QMK_KEYBOARD_H - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _ADJUST -}; - -//assign the right code to your layers for OLED display -#define L_BASE 0 -#define L_LOWER (1<<_LOWER) -#define L_RAISE (1<<_RAISE) -#define L_ADJUST (1<<_ADJUST) -#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) - -//OLED update loop -#ifdef OLED_ENABLE -oled_rotation_t oled_init_user(oled_rotation_t rotation) { - if (is_keyboard_master()) { - return OLED_ROTATION_0; - } else { - return OLED_ROTATION_180; - } -} - -static void render_rgbled_status(bool full) { -# ifdef RGBLIGHT_ENABLE - char buf[30]; - if (RGBLIGHT_MODES > 1 && rgblight_is_enabled()) { - if (full) { - snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ", - rgblight_get_mode(), - rgblight_get_hue()/RGBLIGHT_HUE_STEP, - rgblight_get_sat()/RGBLIGHT_SAT_STEP, - rgblight_get_val()/RGBLIGHT_VAL_STEP); - } else { - snprintf(buf, sizeof(buf), "[%2d] ", rgblight_get_mode()); - } - oled_write(buf, false); - } -# endif -} - -static void render_layer_status(void) { - // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below - char buf[10]; - oled_write_P(PSTR("Layer: "), false); - switch (layer_state) { - case L_BASE: - oled_write_P(PSTR("Default"), false); - break; - case L_RAISE: - oled_write_P(PSTR("Raise"), false); - break; - case L_LOWER: - oled_write_P(PSTR("Lower"), false); - break; - case L_ADJUST: - case L_ADJUST_TRI: - oled_write_P(PSTR("Adjust"), false); - break; - default: - oled_write_P(PSTR("Undef-"), false); - snprintf(buf,sizeof(buf), "%u", layer_state); - oled_write(buf, false); - } - oled_write_P(PSTR("\n"), false); -} - -void render_status(void) { - // Render to mode icon - static const char os_logo[][2][3] PROGMEM = {{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if (is_mac_mode()) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - } else { - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - - oled_write_P(PSTR(" "), false); - render_layer_status(); - - // Host Keyboard LED Status - led_t led_state = host_keyboard_led_state(); - oled_write_P(led_state.num_lock ? PSTR("NUMLOCK") : PSTR(" "), false); - oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false); - oled_write_P(led_state.scroll_lock ? PSTR("SCLK") : PSTR(" "), false); - oled_advance_page(true); - render_rgbled_status(true); - oled_write_P(PSTR("\n"), false); -} - -bool oled_task_user(void) { - -# if DEBUG_TO_SCREEN - if (debug_enable) { - return; - } -# endif - - if (is_keyboard_master()) { - render_status(); - } else { - render_helix_logo(); - render_rgbled_status(false); - render_layer_status(); - } - return false; -} -#endif // end of OLED_ENABLE diff --git a/keyboards/helix/rev2/keymaps/default/readme.md b/keyboards/helix/rev2/keymaps/default/readme.md deleted file mode 100644 index f1917a100a..0000000000 --- a/keyboards/helix/rev2/keymaps/default/readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# The Default Helix Layout -## Layout - -### Qwerty - -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -### Colemak -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -### Dvorak -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -## Layers - -|Priority|number|name|description| -| ---- | ---- | --- | --- | -|high|16|Adjust|Functions| -||4|Raise|Numeric charactors| -||3|Lower|Other charactors| -||2|Dvorak|Dvorak leyout| -||1|Colemak|Colemak leyout| -|low|0|Qwerty|QWERTY leyout(base)| - -### Lower -``` - ,-----------------------------------------. ,-----------------------------------------. - | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Raise -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | Next | Vol- | Vol+ | Play | - `-------------------------------------------------------------------------------------------------' -``` - -### Adjust (Lower + Raise) -``` - ,-----------------------------------------. ,-----------------------------------------. - | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | Reset|RGBRST| | | | | | | | | | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - `-------------------------------------------------------------------------------------------------' -``` - -## Customize - -see `qmk_firmware/keyboards/helix/rev2/keymaps/default/rules.mk` - -``` -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -# OLED_ENABLE = yes # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` -## Compile - -go to qmk top directory. -``` -$ cd qmk_firmware -``` - -build -``` -$ make helix:default # with oled -$ make helix/rev2/back:default # with oled and backlight -$ make HELIX=no-ani helix/rev2/back:default # with oled and backlight without animation -$ make helix/rev2/under:default # with oled and underglow -$ make HELIX=no-oled helix:default # without oled -``` - -build (experimental use of split_common with backlight and oled) -``` -$ make helix/rev2/sc:default -``` - -flash to keyboard -``` -$ make helix:default:flash # with oled -$ make helix/rev2/back:default:flash # with oled and backlight -$ make HELIX=no-ani helix/rev2/back:default:flash # with oled and backlight without animation -$ make helix/rev2/under:default:flash # with oled and underglow -$ make HELIX=no-oled helix:default:flash # without oled -``` - -## Link -* more detail wrote in Japanese [helix/Doc/firmware_jp.md](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md) -* [Helix top](https://github.com/MakotoKurauchi/helix) - diff --git a/keyboards/helix/rev2/keymaps/default/readme_jp.md b/keyboards/helix/rev2/keymaps/default/readme_jp.md deleted file mode 100644 index 6ecac8f25d..0000000000 --- a/keyboards/helix/rev2/keymaps/default/readme_jp.md +++ /dev/null @@ -1,127 +0,0 @@ -# The Default Helix Layout -## 配列 - -### Qwerty配列 - -``` - ,-----------------------------------------. ,-----------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - `-------------------------------------------------------------------------------------------------' -``` - -他の配列(Colemak,Dvorak)は、[readme.md](readme.md) を参照 - -## カスタマイズ - -Helix キーボードを4行版として製作したり、オプションの OLED をつけたり、 -RGB バックライトまたは、RGB Underglow をつけた場合は、 -`qmk_firmware/keyboards/helix/rev2/keymaps/default/rules.mk` の以下の部分を編集して機能を有効化してください。 - -``` -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -# OLED_ENABLE = yes # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` - -## RGB バックライトを有効にする - -rules.mk の下記の部分を編集して no を yes に変更してください。 - -``` -LED_BACK_ENABLE = yes # LED backlight (Enable WS2812 RGB underlight.) -``` - -## RGB Underglow を有効にする - -rules.mk の下記の部分を編集して no を yes に変更してください。 -``` -LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.) -``` - -## OLEDを無効にする - -OLED はデフォルトで有効になっています。 -無効にしたいときは rules.mk の下記の部分を編集して yes を no に変更してください。 -``` -OLED_ENABLE = no # OLED_ENABLE -``` - -## iPad/iPhoneサポートを有効にする。 - -rules.mk の下記の部分を編集して no を yes に変更してください。 -RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 - -``` -IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -``` - -## コンパイルの仕方 - -コンパイルは、qmk_firmware のトップディレクトリで行います。 - -``` -$ cd qmk_firmware -``` -qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 - -``` -$ make helix:default -``` - -キーボードへの書き込みまで同時に行うには下記のように`:flash`を付けます。 - -``` -$ make helix:default:flash -``` - -コンパイル結果と中間生成物を消去したい場合は以下のようにします。 - -``` -$ make helix:default:clean -``` - -上記の、rules.mk によるカスタマイズ項目の一部は下記のようにコマンド上で直接指定することも可能です。 - -OLED を無効にしてコンパイルしてキーボードへの書き込む。 -``` -$ make HELIX=no-oled helix/rev2:default:flash -``` - -RGB バックライトを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/back:default:flash -``` - -RGB Underglow を有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/under:default:flash -``` - -OLED を無効にして、RGB バックライトを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make HELIX=no-oled helix/rev2/back:default:flash -``` - -OLED を無効にして、RGB Underglowを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make HELIX=no-oled helix/rev2/under:default:flash -``` - -## リンク - -* さらに詳細は、[こちら helix/Doc/firmware_jp.md](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md)をご覧ください。 -* [Helix top](https://github.com/MakotoKurauchi/helix) diff --git a/keyboards/helix/rev2/keymaps/default/rules.mk b/keyboards/helix/rev2/keymaps/default/rules.mk deleted file mode 100644 index 83029d1e0b..0000000000 --- a/keyboards/helix/rev2/keymaps/default/rules.mk +++ /dev/null @@ -1,23 +0,0 @@ -LTO_ENABLE = yes # if firmware size over limit, try this option - -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -# OLED_ENABLE = no # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -# OLED_ENABLE が yes のとき -# OLED_SELECT が core ならば QMK 標準の oled_dirver.c を使用します。 -# OLED_SELECT が core 以外ならば従来どおり helix/local_drivers/ssd1306.c を使用します。 -# If OLED_ENABLE is 'yes' -# If OLED_SELECT is 'core', use QMK standard oled_dirver.c. -# If OLED_SELECT is other than 'core', use helix/local_drivers/ssd1306.c. -OLED_SELECT = core - -ifeq ($(strip $(OLED_ENABLE)), yes) - SRC += oled_display.c -endif diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h deleted file mode 100644 index 97494c937f..0000000000 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -// place overrides here - -#ifdef MOUSEKEY_ENABLE - #undef MOUSEKEY_INTERVAL - #define MOUSEKEY_INTERVAL 0 - - #undef MOUSEKEY_TIME_TO_MAX - #define MOUSEKEY_TIME_TO_MAX 150 - - #undef MOUSEKEY_MAX_SPEED - #define MOUSEKEY_MAX_SPEED 3 - - #undef MOUSEKEY_MOVE_DELTA - #define MOUSEKEY_MOVE_DELTA 5 - - #undef MOUSEKEY_DELAY - #define MOUSEKEY_DELAY 0 -#endif - -// If you need more program area, try select and reduce rgblight modes to use. - -// Selection of RGBLIGHT MODE to use. -#if defined(LED_ANIMATIONS) - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_CHRISTMAS - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - //#define RGBLIGHT_EFFECT_RGB_TEST - //#define RGBLIGHT_EFFECT_ALTERNATING -#endif - -#endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c deleted file mode 100644 index 70430894ef..0000000000 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c +++ /dev/null @@ -1,410 +0,0 @@ -#include QMK_KEYBOARD_H -#include "keymap_japanese.h" -#include -#include - -// * If you want to recognize that you pressed the Adjust key with the Lower / Raise key you can enable this comment out. However, the binary size may be over. * -// #define ADJUST_MACRO_ENABLE - -// * If you want to use the Kana key you can enable this comment out. However, the binary size may be over. * -// #define KANA_ENABLE - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _BASE = 0, - _BAS_E, - _LOWER, - _LOW_E, - _RAISE, - _RAI_E, - _ADJUST, -}; - -enum custom_keycodes { - RGBRST = SAFE_RANGE, - #ifdef KANA_ENABLE - EISU, - KANA, - #endif -}; - -// Layer Mode aliases -#define DL_BAS DF(_BASE) -#define DL_BASE DF(_BAS_E) -#define ML_LOW MO(_LOWER) -#define ML_LOWE MO(_LOW_E) -#define ML_RAI MO(_RAISE) -#define ML_RAIE MO(_RAI_E) -#define ML_ADJ MO(_ADJUST) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Qwerty JIS Normal - * ,-----------------------------------------. ,-----------------------------------------. - * | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_BASE] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - JP_ZKHK, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, - KC_LCTL, KC_LALT, KC_LGUI, ML_ADJ, ML_LOW, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, ML_RAI, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT - ), - - /* Qwerty JIS Exchange L and R - * ,-----------------------------------------. ,-----------------------------------------. - * | 6& | 7' | 8( | 9) | 0 | -= | | Esc | 1! | 2" | 3# | 4$ | 5% | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Y | U | I | O | P | @` | | Tab | Q | W | E | R | T | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | H | J | K | L | ;+ | :* | | | A | S | D | F | G | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | N | M | ,< | .> | /? | Up |Enter |KANJI | Shift| Z | X | C | V | B | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Space |Raise | }] | APP | Left | Down |Right |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp | - * `-------------------------------------------------------------------------------------------------' - */ - [_BAS_E] = LAYOUT( - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, - KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_ENT, JP_ZKHK, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, - KC_SPC, ML_RAIE, JP_RBRC, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, ML_ADJ, KC_LCTL, KC_LALT, KC_LGUI, JP_LBRC, ML_LOWE, KC_BSPC - ), - - /* Lower JIS Normal - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | -= | ^~ | \| | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | | | @` | [{ | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | | | ;+ | :* | ]} | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | ,< | .> | /? | \_ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | Del | | | | | | | | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, - _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC_DEL, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX - ), - - /* Lower JIS Exchange L and R - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | -= | ^~ | \| | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | @` | [{ | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | ;+ | :* | ]} | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | ,< | .> | /? | \_ |PageUp| | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | Home |PageDn| End | | | | | | | Del | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOW_E] = LAYOUT( - _______, XXXXXXX, XXXXXXX, KC_MINS, JP_CIRC, JP_YEN, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_AT, JP_LBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, KC_SCLN, JP_COLN, JP_RBRC, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, KC_PGUP, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, _______, XXXXXXX, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, XXXXXXX, _______, KC_DEL - ), - - /* Raise JIS Normal - * ,-----------------------------------------. ,-----------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | |MsWhL |MsWhU | Home |PageUp| F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | |MsWhR |MsWhD | End |PageDn| | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | |MsBtn1|MsBtn2| MsUp | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | |MsLeft|MsDown|MsRght| - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, KC_F12, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, - _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R - ), - - /* Raise JIS Exchange L and R - * ,-----------------------------------------. ,-----------------------------------------. - * | F6 | F7 | F8 | F9 | F10 | F11 | | | F1 | F2 | F3 | F4 | F5 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |MsWhL |MsWhU | F12 | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |MsWhR |MsWhD | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | |MsBtn1|MsBtn2| MsUp | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | |MsLeft|MsDown|MsRght| | | | | | | | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAI_E] = LAYOUT( - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F1 , KC_F2, KC_F3, KC_F4, KC_F5, - XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_F12, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, _______, XXXXXXX, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX - ), - - /* Adjust (Lower + Raise) Common map for Normal and Exchange - * ,-----------------------------------------. ,-----------------------------------------. - * | | Reset|RGBRST| | | | | | Reset|RGBRST| | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | | - * |------+------+------+------+------+------| |------+------+------+------+------|------+ - * | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------|------+ - * | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - XXXXXXX, QK_BOOT, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, QK_BOOT, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, - XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, - XXXXXXX, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - ), -}; - -#if defined(OLED_ENABLE) -char keylog[24] = {}; -const char code_to_name[60] = { - ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', - 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ', - ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '}; - -static inline void set_keylog(uint16_t keycode, keyrecord_t *record) -{ - char name = ' '; - led_t led_state = host_keyboard_led_state(); - - if (keycode < 60) - { - name = code_to_name[keycode]; - } - - // update keylog - snprintf(keylog, sizeof(keylog), "\n%dx%d %2x %c %c %c %c", - record->event.key.row, - record->event.key.col, - keycode, - name, - led_state.num_lock ? 'N' : ' ', - led_state.caps_lock ? 'C' : ' ', - led_state.scroll_lock ? 'S' : ' ' - ); -} -#endif - -#ifdef RGBLIGHT_ENABLE -#define RGBLIGHT(mode) rgblight_mode(mode) -#else -#define RGBLIGHT(mode) -#endif - -// define variables for reactive RGB -int RGB_current_mode; -#ifdef ADJUST_MACRO_ENABLE -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - RGBLIGHT(RGB_current_mode); - layer_on(layer3); - } else { - layer_off(layer3); - } -} -#define ADJUST_MACRO(layer1, layer2, layer3) update_tri_layer_RGB(layer1, layer2, layer3) -#else -#define ADJUST_MACRO(layer1, layer2, layer3) -#endif - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - #if defined(OLED_ENABLE) - if (record->event.pressed) { - set_keylog(keycode, record); - } - #endif - - switch (keycode) { - #ifdef RGBLIGHT_ENABLE - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case QK_UNDERGLOW_MODE_NEXT: - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_get_mode(); - } - break; - #endif - #ifdef KANA_ENABLE - case EISU: - if (record->event.pressed) { - if (keymap_config.swap_lalt_lgui==false) { - register_code(KC_LNG2); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG2); - } - break; - case KANA: - if (record->event.pressed) { - if(keymap_config.swap_lalt_lgui==false){ - register_code(KC_LNG1); - }else{ - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG1); - } - break; - #endif - #ifdef RGBLIGHT_ENABLE - case RGBRST: - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_get_mode(); - } - break; - #endif - default: - return true; - } - - return false; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_get_mode(); - #endif -} - -//OLED update loop -#ifdef OLED_ENABLE -oled_rotation_t oled_init_user(oled_rotation_t rotation) { - if (is_keyboard_master()) { - return OLED_ROTATION_0; - } else { - return OLED_ROTATION_180; - } -} - -//assign the right code to your layers for OLED display -#define L_BASE _BASE -#define L_LOWER (1<<_LOWER) -#define L_RAISE (1<<_RAISE) -#define L_ADJUST (1<<_ADJUST) -#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) -#define L_LOW_E (1<<_LOW_E) -#define L_RAI_E (1<<_RAI_E) -#define L_ADJUST_TRIE (L_ADJUST|L_RAI_E|L_LOW_E) - -const char helix_logo[]={ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, - 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, - 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, - 0}; - -static inline void render_logo(void) { - oled_write(helix_logo, false); -} - -const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - -static inline void render_status(void) { - char buf[20]; - // Render to mode icon - if(keymap_config.swap_lalt_lgui==false){ - oled_write(mac_win_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write(mac_win_logo[0][1], false); - } else { - oled_write(mac_win_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write(mac_win_logo[1][1], false); - } - - #ifdef RGBLIGHT_ENABLE - snprintf(buf, sizeof(buf), " LED mode:%d", (short)RGB_current_mode); - oled_write(buf, false); - #endif - - // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below - oled_write_P(PSTR("\nLayer: "), false); - switch (layer_state) { - case L_BASE: - oled_write_P(default_layer_state == (1UL<<_BAS_E) ? PSTR("BaseEx") : PSTR("Base"), false); - break; - case L_RAISE: - oled_write_P(PSTR("Raise"), false); - break; - case L_RAI_E: - oled_write_P(PSTR("RaiseEx"), false); - break; - case L_LOWER: - oled_write_P(PSTR("Lower"), false); - break; - case L_LOW_E: - oled_write_P(PSTR("LowerEx"), false); - break; - case L_ADJUST: - case L_ADJUST_TRI: - case L_ADJUST_TRIE: - oled_write_P(PSTR("Adjust"), false); - break; - default: - snprintf(buf, sizeof(buf), "%d", (short)layer_state); - oled_write(buf, false); - } - - oled_write(keylog, false); -} - -bool oled_task_user(void) { - -# if DEBUG_TO_SCREEN - if (debug_enable) { - return; - } -# endif - - if (is_keyboard_master()) { - render_status(); - } else { - render_logo(); - } - - return false; -} - -#endif // end of OLED_ENABLE diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/readme.md b/keyboards/helix/rev2/keymaps/five_rows_jis/readme.md deleted file mode 100644 index ca408e3913..0000000000 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/readme.md +++ /dev/null @@ -1,150 +0,0 @@ -# Helix 5 rows JIS layout - -This keymap was created with the concept that users using Japanese JIS keyboard layout can operate without difficulty. It has the following features. - -* We are considering to be able to input long Japanese notes without moving the layer -* We are arranging the relation of symbols that can not fit in the Lower layer keeping the positional relationship -* The four-way key is in a convex arrangement -* Ctrl, Shift, Tab, Kanji, Esc, GUI (Win), App keys are arranged keeping positional relationship -* Lower / Raise keymap is considering easy placement so that it can be used without memorizing - -This keymap also includes a "NORMAL" keymap that uses Helix's split keyboard as usual, and an "EXCHANGE" key that exchanges left and right sides of Helix's split keyboard for key position optimization I am trying to switch maps. These have the following additional features. - -## NORMAL Keymap - -* It is possible to press the N key with the left index finger and the B key with the right index finger - -## EXCHANGE Keymap - -* By using the 2 key under Pro micro effectively add `` `[{` `` `` `]]` ``, `` `/?` `` Keys to NORMAL's base keymap And make inputs other than the `` `\ _` `` key possible with the base map -* To avoid mistakes in pressing the Kanji key and the Enter key, we are moving to the 2 key. - -## 配列 - -### NORMAL Keymap - - Adjust + ModExc key switches to the NORMAL keymap. - -Base Layer - -``` - ,-----------------------------------------. ,-----------------------------------------. - | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right | - `-------------------------------------------------------------------------------------------------' -``` - -Lower Layer - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | | | | | | | | | | -= | ^~ | \| | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | | @` | [{ | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | ;+ | :* | ]} | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | ,< | .> | /? | \_ | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | Del | | | | | | | | - `-------------------------------------------------------------------------------------------------' -``` - -Raise Layer - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | F12 | | | | Home |PageUp| - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | | End |PageDn| - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | |MsBtn1|MsBtn2| | | | | | | | | | MsUp | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | |MsLeft|MsDown|MsRght| - `-------------------------------------------------------------------------------------------------' -``` - -### EXCHANGE Keymap - -Adjust + ModExc key switches to the EXCHANGE keymap. - -Base Layer - -``` - ,-----------------------------------------.,-----------------------------------------. - | Esc | 1! | 2" | 3# | 4$ | 5% || 6& | 7' | 8( | 9) | 0 | -= | - |------+------+------+------+------+------||------+------+------+------+------+------| - | Tab | Q | W | E | R | T || Y | U | I | O | P | @` | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | A | S | D | F | G || H | J | K | L | ;+ | :* | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - |KANJI | Shift| Z | X | C | V | B || N | M | ,< | .> | /? | Up |Enter | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp ||Space |Raise | }] | APP | Left | Down |Right | - `------------------------------------------------'`------------------------------------------------' -``` - -Lower Layer - -``` - ,-----------------------------------------.,-----------------------------------------. - | | | | | | || | | | -= | ^~ | \| | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | | @` | [{ | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | ;+ | :* | ]} | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - | | | | | | | || | ,< | .> | /? | \_ |PageUp| | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - | | | | | | | Del || | | | | Home |PageDn| End | - `------------------------------------------------'`------------------------------------------------' -``` - -Raise Layer - -``` - ,-----------------------------------------.,-----------------------------------------. - | | F1 | F2 | F3 | F4 | F5 || F6 | F7 | F8 | F9 | F10 | F11 | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || F12 | | | | | | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | | | | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - | | |MsBtn1|MsBtn2| | | || | | | | | MsUp | | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - | | | | | | | || | | | |MsLeft|MsDown|MsRght| - `------------------------------------------------'`------------------------------------------------' -``` - -### NORMAL/EXCHANGE common Layer - -Adjust Layer - - NORMAL / EXCHANGE This layer is used in common. The same items are arranged in the same row on both sides so that they can be used in common. - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | Reset|RGBRST|Aud on|Audoff| | | | Reset|RGBRST|Aud on|Audoff| | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | | - |------+------+------+------+------+------| |------+------+------+------+------|------+ - | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | | - |------+------+------+------+------+------+------+------+------+------+------+------+------|------+ - | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | | | | | - `-------------------------------------------------------------------------------------------------' -``` - -## How to compile these program - - See the readme of the Default keymap. diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/readme_jp.md b/keyboards/helix/rev2/keymaps/five_rows_jis/readme_jp.md deleted file mode 100644 index 442984f6ff..0000000000 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/readme_jp.md +++ /dev/null @@ -1,173 +0,0 @@ -# Helix 5 rows JIS layout - -## コンセプト - -このキーマップは日本語JISキーボード配列を利用しているユーザーが無理なく操作出来るというコンセプトで作成しました。以下の特徴があります。 - -* 日本語の長音記号をレイヤーを移動せずに入力可能なように考慮しています -* 入りきらない記号関連をLowerレイヤーに位置関係を維持して配置しています -* 十字キーを凸配置にしています -* Ctrl,Shift,Tab,漢字,Esc,GUI(Win),Appの各キーは位置関係を維持して配置しています -* Lower/Raiseキーマップは暗記しないでも使えるようにわかりやすい配置を考慮しています - - またこのキーマップにはHelixの分割されたキーボードを通常通りに使用する「NORMAL」キーマップと、キー位置の最適化のためにHelixの分割されたキーボードの左右を交換して使う「EXCHANGE」キーマップをバイナリの書き換えなしに切り替えられるようにしています。これらにはさらに以下の特徴があります。 - -### NORMALキーマップ - -* Nキーを左人差し指で、Bキーを右人差し指で押下することが可能 - -### EXCHANGEキーマップ - -* Pro micro下の2キーを有効に使うことにより、NORMALのベースキーマップに```[{```,```}]```,```/?```の各キーを追加し、```\_```キー以外の入力をベースマップで可能にしています -* 漢字キー,Enterキーの押し間違いを避けるためPro micro下の2キーに移動しています - -## カスタマイズ - -Normal/Exchangeにそれぞれ、Base,Lower,Raiseの各レイヤーを備え、2マップ3レイヤー、共通1レイヤー(Adjust)の全7種のレイヤーを備えています。 -ファームの書き換えなしにキーマップを別のものに切り替えられるので、片方は通常のキーマップ、もう片方は画像や動画編集用のキーマップや別の変態配置のキーマップにすれば、状況に応じて簡単に切り替えられます。 - -## 配列 - -### NORMAL - - Adjust + ModNrmキーでNORMALキーマップに切り替わります。 - -#### Baseレイヤー - -``` - ,-----------------------------------------. ,-----------------------------------------. - | Esc | 1! | 2" | 3# | 4$ | 5% | | 6& | 7' | 8( | 9) | 0 | -= | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | KANJI| Q | W | E | R | T | | Y | U | I | O | P | @` | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | Tab | A | S | D | F | G | | H | J | K | L | ;+ | :* | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Shift| Z | X | C | V | B | N | B | N | M | ,< | .> | Up |Enter | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | Ctrl | GUI | Alt |Adjust|Lower |Space |Bksp |Space |Space |Raise | APP | Left | Down |Right | - `-------------------------------------------------------------------------------------------------' -``` - -#### Lowerレイヤー - - 記号キーと、BackSpace位置にDeleteキーを配置しています。 - 例えば```|```キーを入力する場合、Lower + Shift + \キーで入力することが出来ます。 - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | | | | | | | | | | -= | ^~ | \| | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | | @` | [{ | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | ;+ | :* | ]} | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | ,< | .> | /? | \_ | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | Del | | | | | | | | - `-------------------------------------------------------------------------------------------------' -``` - -#### Raiseレイヤー - - rules.mkのMOUSEKEY_ENABLEをyesにした場合マウスキーを利用できます。ただしバイナリ容量を食いますのでmakeした時に確認できるバイナリサイズがオーバーしていないことに十分注意してください。 - また、F1-F12キーをHHKBライクに使えるように横並びにしました。 - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | F12 | | | | Home |PageUp| - |------+------+------+------+------+------| |------+------+------+------+------+------| - | | | | | | | | | | | | End |PageDn| - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | |MsBtn1|MsBtn2| | | | | | | | | | MsUp | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | |MsLeft|MsDown|MsRght| - `-------------------------------------------------------------------------------------------------' -``` - -### EXCHANGEキーマップ - - Adjust + ModExcキーでEXCHANGEキーマップに切り替わります。 - HelixのUSBやフォンケーブルの接続は変更せず、分割された左右のキーボードを入れ替えて使います。 - -#### Baseレイヤー - - ちょっと無理やりですが```[{```,```}]```キーを突っ込んでいます。 - -``` - ,-----------------------------------------.,-----------------------------------------. - | Esc | 1! | 2" | 3# | 4$ | 5% || 6& | 7' | 8( | 9) | 0 | -= | - |------+------+------+------+------+------||------+------+------+------+------+------| - | Tab | Q | W | E | R | T || Y | U | I | O | P | @` | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | A | S | D | F | G || H | J | K | L | ;+ | :* | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - |KANJI | Shift| Z | X | C | V | B || N | M | ,< | .> | /? | Up |Enter | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - |Adjust| Ctrl | GUI | Alt | [{ |Lower | Bksp ||Space |Raise | }] | APP | Left | Down |Right | - `------------------------------------------------'`------------------------------------------------' -``` - -#### Lowerレイヤー - - 記号キーと、BackSpace位置にDeleteキーを配置しています。 - PageDown/Up, Home/EndをCtrl+十字キーの延長線上で使用できるように配置しています。 - -``` - ,-----------------------------------------.,-----------------------------------------. - | | | | | | || | | | -= | ^~ | \| | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | | @` | [{ | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | ;+ | :* | ]} | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - | | | | | | | || | ,< | .> | /? | \_ |PageUp| | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - | | | | | | | Del || | | | | Home |PageDn| End | - `------------------------------------------------'`------------------------------------------------' -``` - -#### Raiseレイヤー - - rules.mkのMOUSEKEY_ENABLEをyesにした場合マウスキーを利用できます。ただしバイナリ容量を食いますのでmakeした時に確認できるバイナリサイズがオーバーしていないことに十分注意してください。 - また、F1-F12キーをHHKBライクに使えるように横並びにしました。 - マウスキーは十字キーの延長線上で使用できるように配置しています。 - -``` - ,-----------------------------------------.,-----------------------------------------. - | | F1 | F2 | F3 | F4 | F5 || F6 | F7 | F8 | F9 | F10 | F11 | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || F12 | | | | | | - |------+------+------+------+------+------||------+------+------+------+------+------| - | | | | | | || | | | | | | - ,------+------+------+------+------+------+------||------+------+------+------+------+------+------. - | | |MsBtn1|MsBtn2| | | || | | | | | MsUp | | - |------+------+------+------+------+------+------||------+------+------+------+------+------+------| - | | | | | | | || | | | |MsLeft|MsDown|MsRght| - `------------------------------------------------'`------------------------------------------------' -``` - -### NORMAL/EXCHANGE共通レイヤー - -Adjustレイヤー - - NORMAL/EXCHANGE共通で利用するレイヤーです。共通で使えるように両側同じ並びで同じものを配置しています。 - -``` - ,-----------------------------------------. ,-----------------------------------------. - | | Reset|RGBRST|Aud on|Audoff| | | | Reset|RGBRST|Aud on|Audoff| | - |------+------+------+------+------+------| |------+------+------+------+------+------| - | |ModNrm|ModExc| Mac | Win | | | |ModNrm|ModExc| Mac | Win | | - |------+------+------+------+------+------| |------+------+------+------+------|------+ - | |RGB ON| HUE+ | SAT+ | VAL+ | | | |RGB ON| HUE+ | SAT+ | VAL+ | | - |------+------+------+------+------+------+------+------+------+------+------+------+------|------+ - | | MODE | HUE- | SAT- | VAL- | | | | | MODE | HUE- | SAT- | VAL- | | - |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - | | | | | | | | | | | | | | | - `-------------------------------------------------------------------------------------------------' -``` - -## コンパイルの仕方 - - Defaultキーマップのreadmeを参照してください。 diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk deleted file mode 100644 index b4f8e27de4..0000000000 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk +++ /dev/null @@ -1,19 +0,0 @@ -LTO_ENABLE = no # if firmware size over limit, try this option - -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -# OLED_ENABLE = no # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -# OLED_ENABLE が yes のとき -# OLED_SELECT が core ならば QMK 標準の oled_dirver.c を使用します。 -# OLED_SELECT が core 以外ならば従来どおり helix/local_drivers/ssd1306.c を使用します。 -# If OLED_ENABLE is 'yes' -# If OLED_SELECT is 'core', use QMK standard oled_dirver.c. -# If OLED_SELECT is other than 'core', use helix/local_drivers/ssd1306.c. -OLED_SELECT = core diff --git a/keyboards/helix/rev2/keymaps/led_test/README.md b/keyboards/helix/rev2/keymaps/led_test/README.md deleted file mode 100644 index 2fe6706452..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# LED test Keymap - -## Layout - -The layout is the same as default. - -## Feature - -* OLED is enabled. -* LED backlight is enabled and always lit. -* The lighting color of LED changes periodically. Red, Green and Blue. - -The user can check whether the LED is lit or not. - -## Compile - -``` -$ cd qmk_firmware -$ make helix:led_test -``` - -## Flash QMK Firmware - -Execute the 'make' command and press the reset switch on the keyboard. -``` -$ make helix:led_test:flash -``` diff --git a/keyboards/helix/rev2/keymaps/led_test/config.h b/keyboards/helix/rev2/keymaps/led_test/config.h deleted file mode 100644 index e2bdf2f329..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/config.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -// place overrides here - -// If you need more program area, try select and reduce rgblight modes to use. - -// Selection of RGBLIGHT MODE to use. -#if defined(LED_ANIMATIONS) - //#define RGBLIGHT_EFFECT_BREATHING - //#define RGBLIGHT_EFFECT_RAINBOW_MOOD - //#define RGBLIGHT_EFFECT_RAINBOW_SWIRL - //#define RGBLIGHT_EFFECT_SNAKE - //#define RGBLIGHT_EFFECT_KNIGHT - //#define RGBLIGHT_EFFECT_CHRISTMAS - //#define RGBLIGHT_EFFECT_STATIC_GRADIENT - #define RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. - //#define RGBLIGHT_EFFECT_ALTERNATING -#endif - -#endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/led_test/keymap.c b/keyboards/helix/rev2/keymaps/led_test/keymap.c deleted file mode 100644 index a48a855e02..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/keymap.c +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _ADJUST -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - BACKLIT, - EISU, - KANA, - RGBRST -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - -//Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC, - 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_COLEMAK] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_DVORAK] = LAYOUT( - KC_GRV, 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_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LBRC, KC_RBRC, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | Reset|RGBRST| | | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, QK_BOOT, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD - ) -}; - -#ifdef AUDIO_ENABLE - -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_plover[][2] = SONG(PLOVER_SOUND); -float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); -#endif - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); - #endif - layer_on(layer3); - } else { - layer_off(layer3); - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - set_single_persistent_default_layer(_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); - #endif - } - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - TOG_STATUS = false; - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE); - #endif - } - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - layer_off(_RAISE); - TOG_STATUS = false; - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case QK_UNDERGLOW_MODE_NEXT: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_get_mode(); - } - #endif - return false; - break; - case EISU: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG2); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG1); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LNG1); - } - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_get_mode(); - } - #endif - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_get_mode(); - #endif -} diff --git a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c b/keyboards/helix/rev2/keymaps/led_test/led_test_init.c deleted file mode 100644 index 7f8813acdd..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c +++ /dev/null @@ -1,6 +0,0 @@ -#include QMK_KEYBOARD_H - -void keyboard_post_init_user(void) { - rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); -} diff --git a/keyboards/helix/rev2/keymaps/led_test/oled_display.c b/keyboards/helix/rev2/keymaps/led_test/oled_display.c deleted file mode 100644 index 3261b6c581..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/oled_display.c +++ /dev/null @@ -1 +0,0 @@ -#include "../default/oled_display.c" diff --git a/keyboards/helix/rev2/keymaps/led_test/rules.mk b/keyboards/helix/rev2/keymaps/led_test/rules.mk deleted file mode 100644 index 5aa9439f4c..0000000000 --- a/keyboards/helix/rev2/keymaps/led_test/rules.mk +++ /dev/null @@ -1,25 +0,0 @@ -# QMK Standard Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -# See TOP/keyboards/helix/rules.mk for a list of options that can be set. -# See TOP/docs/config_options.md for more information. -# - -LTO_ENABLE = no # if firmware size over limit, try this option - -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -OLED_ENABLE = yes # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -LED_BACK_ENABLE = yes # LED backlight (Enable WS2812 RGB underlight.) -LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -OLED_SELECT = core -ifeq ($(strip $(OLED_ENABLE)), yes) - SRC += oled_display.c -endif -SRC += led_test_init.c diff --git a/keyboards/helix/rev2/local_features.mk b/keyboards/helix/rev2/local_features.mk deleted file mode 100644 index 4bfee0411d..0000000000 --- a/keyboards/helix/rev2/local_features.mk +++ /dev/null @@ -1,90 +0,0 @@ -# -# local_features.mk contains post-processing rules for the Helix keyboard. -# -# Post-processing rules convert keyboard-specific shortcuts (that represent -# combinations of standard options) into QMK standard options. -# - -KEYBOARD_LOCAL_FEATURES_MK := --include $(strip $(HELIX_TOP_DIR)/rev2/override_helix_options.mk) ## File dedicated to maintenance - -# Parse 'HELIX=xx,yy,zz' option -ifneq ($(strip $(HELIX)),) - # make HELIX=ios helix/pico:AKEYMAP - # make HELIX=no-ani helix/pico:AKEYMAP - # make HELIX=no-oled helix/pico:AKEYMAP - # make HELIX=ios,no-ani,no-oled helix/pico:AKEYMAP - define HELIX_OPTION_PARSE - # parce 'no-ani' 'ios' 'no-oled' - $(if $(SHOW_PARCE),$(info parse .$1.)) #debug - $(if $(HELIX_OVERRIDE_PARSE),$(call HELIX_OVERRIDE_PARSE,$1)) - - ifeq ($(strip $1),ios) - IOS_DEVICE_ENABLE = yes - endif - ifneq ($(filter na no_ani no-ani,$(strip $1)),) - LED_ANIMATIONS = no - endif - ifneq ($(filter nooled no-oled,$(strip $1)),) - OLED_ENABLE = no - endif - ifeq ($(strip $1),oled) - OLED_ENABLE = yes - endif - endef # end of HELIX_OPTION_PARSE - - COMMA=, - $(eval $(foreach A_OPTION_NAME,$(subst $(COMMA), ,$(HELIX)), \ - $(call HELIX_OPTION_PARSE,$(A_OPTION_NAME)))) - - SHOW_HELIX_OPTIONS = yes -endif - -######## -# convert Helix-specific options (that represent combinations of standard options) -# into QMK standard options. - -ifeq ($(strip $(LED_BACK_ENABLE)), yes) - RGBLIGHT_ENABLE = yes - OPT_DEFS += -DRGBLED_BACK - ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') - endif -else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - RGBLIGHT_ENABLE = yes -endif - -ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) - OPT_DEFS += -DIOS_DEVICE_ENABLE -endif - -ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DLED_ANIMATIONS -endif - -ifeq ($(strip $(OLED_ENABLE)), yes) - ifeq ($(strip $(LOCAL_GLCDFONT)), yes) - OPT_DEFS += -DOLED_FONT_H=\ - else - OPT_DEFS += -DOLED_FONT_H=\"common/glcdfont.c\" - endif -endif - -ifneq ($(strip $(SHOW_HELIX_OPTIONS)),) - $(info Helix Spacific Build Options) - $(info - OLED_ENABLE = $(OLED_ENABLE)) - $(info - LED_BACK_ENABLE = $(LED_BACK_ENABLE)) - $(info - LED_UNDERGLOW_ENABLE = $(LED_UNDERGLOW_ENABLE)) - $(info - LED_ANIMATIONS = $(LED_ANIMATIONS)) - $(info - IOS_DEVICE_ENABLE = $(IOS_DEVICE_ENABLE)) - $(info ) - $(info QMK Build Options) - $(info -- SPLIT_KEYBOARD = $(SPLIT_KEYBOARD)) - $(info -- RGBLIGHT_ENABLE = $(RGBLIGHT_ENABLE)) - $(info -- OLED_DRIVER = $(OLED_DRIVER)) - $(info -- OLED_LOCAL_ENABLE = $(OLED_LOCAL_ENABLE)) - $(info -- CONSOLE_ENABLE = $(CONSOLE_ENABLE)) - $(info -- OPT_DEFS = $(OPT_DEFS)) - $(info -- LTO_ENABLE = $(LTO_ENABLE)) - $(info ) -endif diff --git a/keyboards/helix/rev2/override_helix_options.mk-maintenance b/keyboards/helix/rev2/override_helix_options.mk-maintenance deleted file mode 100644 index 56dee8ce78..0000000000 --- a/keyboards/helix/rev2/override_helix_options.mk-maintenance +++ /dev/null @@ -1,46 +0,0 @@ -ifneq ($(strip $(HELIX)),) - $(info -------------------------) - $(info override_helix_options.mk) - $(info -------------------------) -endif - -define HELIX_OVERRIDE_PARSE - ifeq ($(strip $1),back) - LED_BACK_ENABLE = yes - LED_UNDERGLOW_ENABLE = no - endif - ifeq ($(strip $1),under) - LED_BACK_ENABLE = no - LED_UNDERGLOW_ENABLE = yes - endif - ifneq ($(filter led-off led_off noback no-back nounder no-under,$(strip $1)),) - LED_BACK_ENABLE = no - LED_UNDERGLOW_ENABLE = no - endif - ifneq ($(filter core-oled core_oled newoled new-oled olednew oled-new,$(strip $1)),) - OLED_ENABLE = yes - OLED_SELECT = core - endif - ifneq ($(filter local-oled local_oled oldoled old-oled oledold oled-old,$(strip $1)),) - OLED_ENABLE = yes - OLED_SELECT = local - endif - ifneq ($(filter sc split-common split_common,$(strip $1)),) - SPLIT_KEYBOARD = yes - endif - ifneq ($(filter nosc no-sc no-split-common no-split_common,$(strip $1)),) - SPLIT_KEYBOARD = no - endif - ifeq ($(strip $1),scan) - DEBUG_MATRIX_SCAN_RATE_ENABLE = yes - endif - ifeq ($(strip $1),scan-api) - DEBUG_MATRIX_SCAN_RATE_ENABLE = api - endif - ifeq ($(strip $1),lto) - LTO_ENABLE = yes - endif - ifneq ($(filter nolto no-lto no_lto,$(strip $1)),) - LTO_ENABLE = no - endif -endef # end of HELIX_OVERRIDE_PARSE diff --git a/keyboards/helix/rev2/post_config.h b/keyboards/helix/rev2/post_config.h deleted file mode 100644 index dda73d5d22..0000000000 --- a/keyboards/helix/rev2/post_config.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#if defined(SPLIT_KEYBOARD) /* if use split_common */ -# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_SPLIT) -# define RGBLIGHT_SPLIT /* helix hardware need this */ -# endif -#endif diff --git a/keyboards/helix/rev2/post_rules.mk b/keyboards/helix/rev2/post_rules.mk deleted file mode 100644 index 4c671d4515..0000000000 --- a/keyboards/helix/rev2/post_rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -ifneq ($(strip $(KEYBOARD_LOCAL_FEATURES_MK)),) - include $(strip $(KEYBOARD_LOCAL_FEATURES_MK)) -endif diff --git a/keyboards/helix/rev2/qmk_conf/keyboard.json b/keyboards/helix/rev2/qmk_conf/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/rev2/qmk_conf/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/rev2/qmk_conf/rules.mk b/keyboards/helix/rev2/qmk_conf/rules.mk deleted file mode 100644 index 67caab1ce6..0000000000 --- a/keyboards/helix/rev2/qmk_conf/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -LED_BACK_ENABLE = yes # LED backlight (Enable WS2812 RGB underlight.) -LED_ANIMATIONS = yes # LED animations - -include $(strip $(KEYBOARD_LOCAL_FEATURES_MK)) diff --git a/keyboards/helix/rev2/readme.md b/keyboards/helix/rev2/readme.md deleted file mode 100644 index e6a6f2e952..0000000000 --- a/keyboards/helix/rev2/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -# Helix rev2 - -A compact split ortholinear keyboard. - -* Keyboard Maintainer: [yushakobo](https://github.com/yushakobo) -* Hardware Supported: Helix rev2 PCBs, Pro Micro -* Hardware Availability: [PCB & Case Data](https://github.com/MakotoKurauchi/helix) - -Make example for this keyboard (after setting up your build environment): - - make helix/rev2: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). diff --git a/keyboards/helix/rev2/rev2.c b/keyboards/helix/rev2/rev2.c deleted file mode 100644 index 7502ad0552..0000000000 --- a/keyboards/helix/rev2/rev2.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright 2018 MakotoKurauchi - * - * 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 "rev2.h" - -// Each keymap.c should use is_keyboard_master() instead of 'is_master'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -uint8_t is_master = false; - -bool is_mac_mode(void) { - // This is the opposite of the QMK standard, but we'll leave it for backwards compatibility. - return keymap_config.swap_lalt_lgui == false; -} - -void set_mac_mode_kb(bool macmode) { - /* The result is the same as pressing the AG_NORM(=MAGIC_UNSWAP_ALT_GUI)/AG_SWAP(=MAGIC_SWAP_ALT_GUI) keys. - * see - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L123-L124 - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 - */ - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(&keymap_config); -} - -void matrix_init_kb(void) { - // Each keymap.c should use is_keyboard_master() instead of is_master. - // But keep is_master for a while for backwards compatibility - // for the old keymap.c. - is_master = is_keyboard_master(); - - matrix_init_user(); -}; - -void keyboard_post_init_kb(void) { -#if defined(DEBUG_MATRIX_SCAN_RATE) - debug_enable = true; -#endif - keyboard_post_init_user(); -} - -#ifdef OLED_ENABLE -void render_helix_logo(void) { - static const char helix_logo[] PROGMEM ={ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, - 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, - 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, - 0}; - oled_write_P(helix_logo, false); -} - -bool oled_task_kb(void) { - if (oled_task_user()) { - /* keymap/user level oled_task_user() dose not exist */ - led_t led_state = host_keyboard_led_state(); - oled_write_P(led_state.num_lock ? PSTR("NUMLOCK") : PSTR(" "), false); - oled_write_P(led_state.caps_lock ? PSTR("CAPS") : PSTR(" "), false); - oled_write_P(led_state.scroll_lock ? PSTR("SCLK") : PSTR(" "), false); - oled_advance_page(true); - render_helix_logo(); - } - return false; -} -#endif /* end of OLED_ENABLE */ diff --git a/keyboards/helix/rev2/rev2.h b/keyboards/helix/rev2/rev2.h deleted file mode 100644 index dad08c267e..0000000000 --- a/keyboards/helix/rev2/rev2.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2018 MakotoKurauchi - * - * 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 "quantum.h" - -bool is_mac_mode(void); -void set_mac_mode_kb(bool macmode); - -#ifdef OLED_ENABLE -void render_helix_logo(void); -#endif - -#ifndef SPLIT_KEYBOARD - extern bool is_helix_master(void); - #define is_keyboard_master() is_helix_master() -#endif - -// Each keymap.c should use is_keyboard_master() instead of 'is_master', 'has_usb()'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -extern uint8_t is_master; // 'is_master' will be obsolete, it is recommended to use 'is_keyboard_master ()' instead. -#define has_usb() is_keyboard_master() diff --git a/keyboards/helix/rev2/rules.mk b/keyboards/helix/rev2/rules.mk deleted file mode 100644 index e827ae111f..0000000000 --- a/keyboards/helix/rev2/rules.mk +++ /dev/null @@ -1,9 +0,0 @@ -KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk - -# Helix Spacific Build Options default values -OLED_ENABLE = yes # OLED_ENABLE -LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -LED_ANIMATIONS = yes # LED animations -IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) diff --git a/keyboards/helix/rev2/sc/keyboard.json b/keyboards/helix/rev2/sc/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/rev2/sc/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/rev2/sc/rules.mk b/keyboards/helix/rev2/sc/rules.mk deleted file mode 100644 index 066fffb74a..0000000000 --- a/keyboards/helix/rev2/sc/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/rev2/serial_config_simpleapi.h b/keyboards/helix/rev2/serial_config_simpleapi.h deleted file mode 100644 index b51e6f281b..0000000000 --- a/keyboards/helix/rev2/serial_config_simpleapi.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 diff --git a/keyboards/helix/rev2/under/keyboard.json b/keyboards/helix/rev2/under/keyboard.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/keyboards/helix/rev2/under/keyboard.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/keyboards/helix/rev2/under/rules.mk b/keyboards/helix/rev2/under/rules.mk deleted file mode 100644 index a37aa6fab3..0000000000 --- a/keyboards/helix/rev2/under/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_UNDERGLOW_ENABLE = yes From baf0060761db4e0f1d631b00e6057c6763470e78 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 6 Jul 2025 20:30:47 +1000 Subject: [PATCH 473/592] Deprecate some nonstandard mod & mod-tap keycode aliases (#25437) --- docs/feature_advanced_keycodes.md | 60 ++++++++-------- docs/keycodes.md | 70 +++++++++---------- docs/mod_tap.md | 6 +- .../tf_longeboye/keymaps/default/keymap.c | 2 +- .../ergodox_ez/glow/keymaps/default/keymap.c | 2 +- keyboards/ergodox_ez/keymaps/default/keymap.c | 2 +- .../ergodox_ez/keymaps/default_osx/keymap.c | 2 +- .../ergodox_ez/keymaps/rgb_layer/keymap.c | 2 +- keyboards/ergodox_ez/keymaps/testing/keymap.c | 2 +- .../util/keymap_beautifier/README.md | 4 +- .../h0oni/deskpad/keymaps/default/keymap.c | 2 +- .../keymaps/default/keymap.c | 10 +-- .../space_oddity/keymaps/default/keymap.c | 2 +- keyboards/hotdox/keymaps/default/keymap.c | 2 +- .../ergodox_infinity/keymaps/default/keymap.c | 2 +- keyboards/k34/keymaps/default/keymap.c | 4 +- keyboards/keebformom/keymaps/default/keymap.c | 2 +- .../keyhive/opus/keymaps/default/keymap.c | 2 +- .../ktec/ergodone/keymaps/default/keymap.c | 2 +- .../littlealby/mute/keymaps/default/keymap.c | 2 +- .../littlealby/mute/keymaps/ms_teams/keymap.c | 2 +- .../palette1202/keymaps/default/keymap.c | 6 +- quantum/quantum_keycodes.h | 13 ---- quantum/quantum_keycodes_legacy.h | 11 +++ 24 files changed, 106 insertions(+), 108 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index b21accd367..a6f8bc8372 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -2,36 +2,36 @@ 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` | -|`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| +|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)` | |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)` | |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| 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/). diff --git a/docs/keycodes.md b/docs/keycodes.md index 33014a54a5..e569e87431 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -657,38 +657,38 @@ 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` | -|`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 | +|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)` | |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)` | |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} @@ -705,7 +705,7 @@ See also: [Mod-Tap](mod_tap) |`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 | +|`LSG_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 | @@ -717,14 +717,14 @@ See also: [Mod-Tap](mod_tap) |`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 | +|`RSA_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| +|`HYPR_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 ebf79adb7f..67922c0915 100644 --- a/docs/mod_tap.md +++ b/docs/mod_tap.md @@ -37,7 +37,7 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations |`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 | +|`LSG_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 | @@ -49,14 +49,14 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations |`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 | +|`RSA_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| +|`HYPR_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/). diff --git a/keyboards/ep/comsn/tf_longeboye/keymaps/default/keymap.c b/keyboards/ep/comsn/tf_longeboye/keymaps/default/keymap.c index 1fdcc9d4db..ef0570a6b3 100644 --- a/keyboards/ep/comsn/tf_longeboye/keymaps/default/keymap.c +++ b/keyboards/ep/comsn/tf_longeboye/keymaps/default/keymap.c @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, SGUI(KC_S), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, LSG(KC_S), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/ergodox_ez/glow/keymaps/default/keymap.c b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c index 13b2cee50a..b3f394bee8 100644 --- a/keyboards/ergodox_ez/glow/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT), - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB), ALT_T(KC_APP), KC_LGUI, KC_LALT, CTL_T(KC_ESC), KC_HOME, KC_PGUP, diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 555e203370..5197f140f0 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT), - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT, LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB), ALT_T(KC_APP), KC_LGUI, KC_LALT, CTL_T(KC_ESC), KC_HOME, KC_PGUP, diff --git a/keyboards/ergodox_ez/keymaps/default_osx/keymap.c b/keyboards/ergodox_ez/keymaps/default_osx/keymap.c index 3ab66078fe..97c8bea54c 100644 --- a/keyboards/ergodox_ez/keymaps/default_osx/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default_osx/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c index 47c2612e35..47be8ebb40 100644 --- a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c @@ -51,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, diff --git a/keyboards/ergodox_ez/keymaps/testing/keymap.c b/keyboards/ergodox_ez/keymaps/testing/keymap.c index 300c2457c4..70a4af45a4 100644 --- a/keyboards/ergodox_ez/keymaps/testing/keymap.c +++ b/keyboards/ergodox_ez/keymaps/testing/keymap.c @@ -20,7 +20,7 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRC,KC_BSPC,KC_A,KC_S,KC_D,KC_F,KC_G,SC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,ALL_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRC,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCLN),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SC_RSPC,KC_UP,KC_DOWN,KC_LBRC,KC_RBRC,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDN,LT(1,KC_TAB),KC_ENTER), + [0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRC,KC_BSPC,KC_A,KC_S,KC_D,KC_F,KC_G,SC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,HYPR_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRC,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCLN),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SC_RSPC,KC_UP,KC_DOWN,KC_LBRC,KC_RBRC,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDN,LT(1,KC_TAB),KC_ENTER), [1] = LAYOUT_ergodox(KC_TRANSPARENT,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,LCTL(KC_W),KC_LBRC,KC_RBRC,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,LCTL(KC_PGUP),LCTL(KC_PGDN),UG_NEXT,KC_TRANSPARENT,KC_TRANSPARENT,UG_VALD,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F12,KC_AMPR,KC_UNDS,KC_MINUS,KC_SCLN,KC_PLUS,KC_TRANSPARENT,KC_TRANSPARENT,KC_PIPE,KC_AT,KC_EQUAL,KC_PERC,KC_BSLS,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,UG_TOGG,RGB_SLD,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,UG_HUEU), diff --git a/keyboards/ergodox_ez/util/keymap_beautifier/README.md b/keyboards/ergodox_ez/util/keymap_beautifier/README.md index e7c7096f77..849e61fc9b 100644 --- a/keyboards/ergodox_ez/util/keymap_beautifier/README.md +++ b/keyboards/ergodox_ez/util/keymap_beautifier/README.md @@ -7,7 +7,7 @@ This Python 3 script, by [Tsan-Kuang Lee](https://github.com/tsankuanglee) takes For example, the original `keymap.c` looks like ``` -[0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRC,KC_BSPC,KC_A,KC_S,KC_D,KC_F,KC_G,SC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,ALL_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRC,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCLN),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SC_RSPC,KC_UP,KC_DOWN,KC_LBRC,KC_RBRC,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDN,LT(1,KC_TAB),KC_ENTER), +[0] = LAYOUT_ergodox(KC_EQUAL,KC_1,KC_2,KC_3,KC_4,KC_5,LCTL(KC_MINUS),KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_LBRC,KC_BSPC,KC_A,KC_S,KC_D,KC_F,KC_G,SC_LSPO,CTL_T(KC_Z),KC_X,KC_C,KC_V,KC_B,HYPR_T(KC_NO),LT(1,KC_GRAVE),KC_QUOTE,LALT(KC_LSFT),KC_LEFT,KC_RIGHT,ALT_T(KC_APPLICATION),KC_LGUI,KC_HOME,KC_SPACE,KC_UNDS,KC_END,LCTL(KC_EQUAL),KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINUS,KC_RBRC,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,KC_H,ALT_T(KC_J),KC_K,KC_L,LT(2,KC_SCLN),GUI_T(KC_QUOTE),MEH_T(KC_NO),KC_N,KC_M,KC_COMMA,KC_DOT,CTL_T(KC_SLASH),SC_RSPC,KC_UP,KC_DOWN,KC_LBRC,KC_RBRC,TT(1),KC_LALT,CTL_T(KC_ESCAPE),KC_PGUP,KC_PGDN,LT(1,KC_TAB),KC_ENTER), ``` The beautifier parses it and outputs: @@ -19,7 +19,7 @@ The beautifier parses it and outputs: KC_EQUAL , KC_1 , KC_2 , KC_3 , KC_4 , KC_5, LCTL(KC_MINUS), KC_DELETE , KC_Q , KC_W , KC_E , KC_R , KC_T, KC_LBRC , KC_BSPC , KC_A , KC_S , KC_D , KC_F , KC_G, -SC_LSPO , CTL_T(KC_Z), KC_X , KC_C , KC_V , KC_B, ALL_T(KC_NO) , +SC_LSPO , CTL_T(KC_Z), KC_X , KC_C , KC_V , KC_B, HYPR_T(KC_NO) , LT(1,KC_GRAVE), KC_QUOTE , LALT(KC_LSFT) , KC_LEFT, KC_RIGHT, // left thumb diff --git a/keyboards/h0oni/deskpad/keymaps/default/keymap.c b/keyboards/h0oni/deskpad/keymaps/default/keymap.c index eea54cf6b1..4ab51b657e 100644 --- a/keyboards/h0oni/deskpad/keymaps/default/keymap.c +++ b/keyboards/h0oni/deskpad/keymaps/default/keymap.c @@ -180,7 +180,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT( - A(KC_F4), SGUI(KC_S), KC_MYCM, LCA(KC_DEL), KC_CALC, TD(QUAD_LAYER_SWITCH) + A(KC_F4), LSG(KC_S), KC_MYCM, LCA(KC_DEL), KC_CALC, TD(QUAD_LAYER_SWITCH) ), [3] = LAYOUT( diff --git a/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c index cd78aef7a9..fed363a22d 100644 --- a/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_manuform_pi_pico/keymaps/default/keymap.c @@ -54,11 +54,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_WINMGR] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_F1, LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), KC_F4, KC_F7, SGUI(KC_7), SGUI(KC_8), SGUI(KC_9), KC_F10, KC_TRNS, - TO(_QWERTY), KC_F2, LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), KC_F5, KC_F8, SGUI(KC_4), SGUI(KC_5), SGUI(KC_6), KC_F11, KC_TRNS, - KC_TRNS, KC_F3, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), KC_F6, KC_F9, SGUI(KC_1), SGUI(KC_2), SGUI(KC_3), KC_F12, KC_TRNS, - KC_TRNS, LGUI(KC_0), SGUI(KC_0), KC_TRNS, - LGUI(KC_0), KC_TRNS, KC_TRNS, SGUI(KC_0), + KC_TRNS, KC_F1, LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), KC_F4, KC_F7, LSG(KC_7), LSG(KC_8), LSG(KC_9), KC_F10, KC_TRNS, + TO(_QWERTY), KC_F2, LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), KC_F5, KC_F8, LSG(KC_4), LSG(KC_5), LSG(KC_6), KC_F11, KC_TRNS, + KC_TRNS, KC_F3, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), KC_F6, KC_F9, LSG(KC_1), LSG(KC_2), LSG(KC_3), KC_F12, KC_TRNS, + KC_TRNS, LGUI(KC_0), LSG(KC_0), KC_TRNS, + LGUI(KC_0), KC_TRNS, KC_TRNS, LSG(KC_0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, LCTL(LGUI(KC_Q)), KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/handwired/space_oddity/keymaps/default/keymap.c b/keyboards/handwired/space_oddity/keymaps/default/keymap.c index c278953f46..4222307889 100644 --- a/keyboards/handwired/space_oddity/keymaps/default/keymap.c +++ b/keyboards/handwired/space_oddity/keymaps/default/keymap.c @@ -72,7 +72,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, TD(SFT_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), - MO(2), MO(1), KC_LGUI, KC_RALT, KC_LCTL, KC_SPC, ALT_T(KC_LEFT), ALL_T(KC_RGHT), LT(1, KC_UP), LT(2, KC_DOWN) + MO(2), MO(1), KC_LGUI, KC_RALT, KC_LCTL, KC_SPC, ALT_T(KC_LEFT), HYPR_T(KC_RGHT), LT(1, KC_UP), LT(2, KC_DOWN) ), /* Function layer. diff --git a/keyboards/hotdox/keymaps/default/keymap.c b/keyboards/hotdox/keymaps/default/keymap.c index 45e81b7fcf..436997ead7 100644 --- a/keyboards/hotdox/keymaps/default/keymap.c +++ b/keyboards/hotdox/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, diff --git a/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c b/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c index 8b3d110c88..2f337f9e89 100644 --- a/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c +++ b/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, diff --git a/keyboards/k34/keymaps/default/keymap.c b/keyboards/k34/keymaps/default/keymap.c index 4d09b121dd..cfadf90c6b 100644 --- a/keyboards/k34/keymaps/default/keymap.c +++ b/keyboards/k34/keymaps/default/keymap.c @@ -25,8 +25,8 @@ enum layer_names { #define S_SLSH SFT_T(KC_SLSH) // combos for application shortcuts -#define SG_LBRC SGUI(KC_LBRC) -#define SG_RBRC SGUI(KC_RBRC) +#define SG_LBRC LSG(KC_LBRC) +#define SG_RBRC LSG(KC_RBRC) #define G_LBRC G(KC_LBRC) #define G_RBRC G(KC_RBRC) #define A_SLSH A(KC_SLSH) diff --git a/keyboards/keebformom/keymaps/default/keymap.c b/keyboards/keebformom/keymaps/default/keymap.c index f1c4b29429..727e429d74 100644 --- a/keyboards/keebformom/keymaps/default/keymap.c +++ b/keyboards/keebformom/keymaps/default/keymap.c @@ -74,7 +74,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `---------------------------------------------------------------------' */ [_THIRD] = LAYOUT_ortho_4x10( - KC_INS, KC_HOME, KC_PGUP, KC_NO, SGUI(KC_S), LCTL(KC_A), KC_NO, KC_NO, KC_UP, KC_NO, + KC_INS, KC_HOME, KC_PGUP, KC_NO, LSG(KC_S), LCTL(KC_A), KC_NO, KC_NO, KC_UP, KC_NO, KC_DEL, KC_END, KC_PGDN, KC_NO, LCTL(KC_S), LCTL(KC_C), KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, LWIN(KC_E), LCTL(KC_V), KC_NO, KC_NO, KC_NO, KC_NO, TO(0), _______, _______, _______, _______, _______, _______, KC_VOLD, _______, KC_VOLU diff --git a/keyboards/keyhive/opus/keymaps/default/keymap.c b/keyboards/keyhive/opus/keymaps/default/keymap.c index aaa1a899a2..868b611a81 100644 --- a/keyboards/keyhive/opus/keymaps/default/keymap.c +++ b/keyboards/keyhive/opus/keymaps/default/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_BSPC ), [_NAV] = LAYOUT( - KC_NO, KC_NO, LALT(KC_RGHT), SGUI(KC_LBRC), SGUI(KC_RBRC), KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, LALT(KC_RGHT), LSG(KC_LBRC), LSG(KC_RBRC), KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LALT, KC_LSFT, KC_LGUI, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LALT(KC_LEFT), KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_SPC, KC_BSPC diff --git a/keyboards/ktec/ergodone/keymaps/default/keymap.c b/keyboards/ktec/ergodone/keymaps/default/keymap.c index 41d5da8dee..87fc621996 100644 --- a/keyboards/ktec/ergodone/keymaps/default/keymap.c +++ b/keyboards/ktec/ergodone/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, HYPR_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, diff --git a/keyboards/littlealby/mute/keymaps/default/keymap.c b/keyboards/littlealby/mute/keymaps/default/keymap.c index c6cf9836e3..729a6179a2 100644 --- a/keyboards/littlealby/mute/keymaps/default/keymap.c +++ b/keyboards/littlealby/mute/keymaps/default/keymap.c @@ -18,6 +18,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - SGUI(KC_A) + LSG(KC_A) ) }; diff --git a/keyboards/littlealby/mute/keymaps/ms_teams/keymap.c b/keyboards/littlealby/mute/keymaps/ms_teams/keymap.c index bb2cf1147c..223ccacaf0 100644 --- a/keyboards/littlealby/mute/keymaps/ms_teams/keymap.c +++ b/keyboards/littlealby/mute/keymaps/ms_teams/keymap.c @@ -18,6 +18,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - SGUI(KC_M) + LSG(KC_M) ) }; diff --git a/keyboards/palette1202/keymaps/default/keymap.c b/keyboards/palette1202/keymaps/default/keymap.c index 0f49e46661..905b800cd6 100644 --- a/keyboards/palette1202/keymaps/default/keymap.c +++ b/keyboards/palette1202/keymaps/default/keymap.c @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_CS_2] = LAYOUT( MO(SETTING), KC_ESC, KC_G, KC_R, LGUI(KC_GRV), _______, LGUI(KC_D), KC_K, KC_F, LGUI(KC_S), - KC_LALT, KC_I, SGUI(KC_Z), KC_H + KC_LALT, KC_I, LSG(KC_Z), KC_H ), // Photoshop [MAC_PS_1] = LAYOUT( @@ -61,7 +61,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_PS_2] = LAYOUT( MO(SETTING), KC_ESC, KC_G, KC_R, KC_ESC, _______, LGUI(KC_D), KC_V, LGUI(KC_T), LGUI(KC_S), - KC_LALT, KC_I, SGUI(KC_Z), KC_H + KC_LALT, KC_I, LSG(KC_Z), KC_H ), // Windows @@ -97,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [IOS_CS_2] = LAYOUT( MO(SETTING), KC_ESC, KC_G, KC_R, LGUI(KC_EQL), _______, LGUI(KC_D), KC_K, KC_F, LGUI(KC_S), - KC_LALT, KC_I, SGUI(KC_Z), KC_H + KC_LALT, KC_I, LSG(KC_Z), KC_H ), [SETTING] = LAYOUT( _______, IOS_CS, Win_CS, Mac_CS, KC_NO, diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 515386756d..a1ae7ed0be 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -66,10 +66,6 @@ #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)) @@ -90,8 +86,6 @@ #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) - #define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) #define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) @@ -206,10 +200,6 @@ #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 RCTL_T(kc) MT(MOD_RCTL, kc) #define RSFT_T(kc) MT(MOD_RSFT, kc) #define RALT_T(kc) MT(MOD_RALT, kc) @@ -230,11 +220,8 @@ #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 #define KC_HYPR HYPR(KC_NO) diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h index 55b0fc3596..58dc2fe6f6 100644 --- a/quantum/quantum_keycodes_legacy.h +++ b/quantum/quantum_keycodes_legacy.h @@ -59,3 +59,14 @@ #define QK_OUTPUT_AUTO OU_AUTO #define C_S_T(kc) LCS_T(kc) +#define ALL_T(kc) HYPR_T(kc) + +#define SGUI(kc) LSG(kc) +#define SCMD(kc) LSG(kc) +#define SWIN(kc) LSG(kc) +#define SGUI_T(kc) LSG_T(kc) +#define SCMD_T(kc) LSG_T(kc) +#define SWIN_T(kc) LSG_T(kc) + +#define SAGR(kc) RSA(kc) +#define SAGR_T(kc) RSA_T(kc) From d151b1bef5dcb939689b1ed74ba6dbd01b2bd637 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 7 Jul 2025 15:10:51 +0100 Subject: [PATCH 474/592] Convert moon to lite custom matrix (#25452) --- keyboards/moon/config.h | 22 +--- keyboards/moon/keyboard.json | 10 +- keyboards/moon/keymaps/default/keymap.c | 2 + .../moon/keymaps/default_tkl_ansi/keymap.c | 2 + .../keymaps/default_tkl_ansi_wkl/keymap.c | 2 + .../moon/keymaps/default_tkl_iso/keymap.c | 2 + .../moon/keymaps/default_tkl_iso_wkl/keymap.c | 2 + keyboards/moon/matrix.c | 107 ++---------------- keyboards/moon/rules.mk | 2 +- 9 files changed, 29 insertions(+), 122 deletions(-) diff --git a/keyboards/moon/config.h b/keyboards/moon/config.h index ca4c770a3b..1e95dc2b8f 100644 --- a/keyboards/moon/config.h +++ b/keyboards/moon/config.h @@ -1,23 +1,7 @@ -/* -Copyright 2019 Mathias Andersson - -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 . -*/ - +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once - -/* key matrix size */ +// key matrix size #define MATRIX_ROWS 8 #define MATRIX_COLS 11 diff --git a/keyboards/moon/keyboard.json b/keyboards/moon/keyboard.json index 76d2c08f7e..ea3d34b650 100644 --- a/keyboards/moon/keyboard.json +++ b/keyboards/moon/keyboard.json @@ -9,13 +9,11 @@ "device_version": "0.0.1" }, "features": { - "bootmagic": false, - "mousekey": true, + "backlight": true, + "bootmagic": true, "extrakey": true, - "console": true, - "command": true, - "nkro": true, - "backlight": true + "mousekey": true, + "nkro": true }, "qmk": { "locking": { diff --git a/keyboards/moon/keymaps/default/keymap.c b/keyboards/moon/keymaps/default/keymap.c index fd1956a4dc..73dc65dc9a 100644 --- a/keyboards/moon/keymaps/default/keymap.c +++ b/keyboards/moon/keymaps/default/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // clang-format off diff --git a/keyboards/moon/keymaps/default_tkl_ansi/keymap.c b/keyboards/moon/keymaps/default_tkl_ansi/keymap.c index b0244eccee..ee22951fcd 100644 --- a/keyboards/moon/keymaps/default_tkl_ansi/keymap.c +++ b/keyboards/moon/keymaps/default_tkl_ansi/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // clang-format off diff --git a/keyboards/moon/keymaps/default_tkl_ansi_wkl/keymap.c b/keyboards/moon/keymaps/default_tkl_ansi_wkl/keymap.c index 7fd641a93f..1b41519cc9 100644 --- a/keyboards/moon/keymaps/default_tkl_ansi_wkl/keymap.c +++ b/keyboards/moon/keymaps/default_tkl_ansi_wkl/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // clang-format off diff --git a/keyboards/moon/keymaps/default_tkl_iso/keymap.c b/keyboards/moon/keymaps/default_tkl_iso/keymap.c index b4d9a9b60c..316ed8d5ba 100644 --- a/keyboards/moon/keymaps/default_tkl_iso/keymap.c +++ b/keyboards/moon/keymaps/default_tkl_iso/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // clang-format off diff --git a/keyboards/moon/keymaps/default_tkl_iso_wkl/keymap.c b/keyboards/moon/keymaps/default_tkl_iso_wkl/keymap.c index 1224d9f02e..6637515e3e 100644 --- a/keyboards/moon/keymaps/default_tkl_iso_wkl/keymap.c +++ b/keyboards/moon/keymaps/default_tkl_iso_wkl/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H // clang-format off diff --git a/keyboards/moon/matrix.c b/keyboards/moon/matrix.c index 1cb9590e9f..0f72cf3740 100644 --- a/keyboards/moon/matrix.c +++ b/keyboards/moon/matrix.c @@ -1,26 +1,8 @@ -/* -Copyright 2012-2019 Jun Wako, Jack Humbert, Yiancar, Mathias Andersson - -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 "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" +// Copyright 2019 Mathias Andersson +// SPDX-License-Identifier: GPL-2.0-or-later #include "matrix.h" -#include "debounce.h" #include "pca9555.h" +#include "wait.h" /* * IC1 (PCA9555) IC2 (PCA9555) @@ -70,56 +52,6 @@ along with this program. If not, see . #define PORT1_COLS_MASK 0b00111111 #define COLS_MASK 0b0000011111111111 -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") -# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) -# define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") -# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) -# define ROW_SHIFTER ((uint32_t)1) -#endif - -/* matrix state(1:on, 0:off) */ -static matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values -static matrix_row_t matrix[MATRIX_ROWS]; // debounced values - -__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); } - -__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); } - -__attribute__((weak)) void matrix_init_user(void) {} - -__attribute__((weak)) void matrix_scan_user(void) {} - -inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } - -inline uint8_t matrix_cols(void) { return MATRIX_COLS; } - -inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); } - -inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } - -void matrix_print(void) { - print_matrix_header(); - - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - print_hex8(row); - print(": "); - print_matrix_row(row); - print("\n"); - } -} - -static void init_i2c(void) { - pca9555_init(IC1); - pca9555_init(IC2); -} - static void init_pins(void) { // init cols - IC2 port0 & IC2 port1 input pca9555_set_config(IC2, PCA9555_PORT0, ALL_INPUT); @@ -158,45 +90,28 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) // Clear data in matrix row current_matrix[current_row] = 0; - // Select row and wait for row selecton to stabilize + // Select row and wait for row selection to stabilize select_row(current_row); wait_us(30); - current_matrix[current_row] |= read_cols(); + current_matrix[current_row] = read_cols(); // No need to unselect as `select_row` sets all the pins. return (last_row_value != current_matrix[current_row]); } -void matrix_init(void) { - // initialize i2c - init_i2c(); +void matrix_init_custom(void) { + pca9555_init(IC1); + pca9555_init(IC2); - // initialize key pins init_pins(); - - // initialize matrix state: all keys off - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - raw_matrix[i] = 0; - matrix[i] = 0; - } - - debounce_init(MATRIX_ROWS); - - matrix_init_kb(); } -uint8_t matrix_scan(void) { +bool matrix_scan_custom(matrix_row_t current_matrix[]) { bool changed = false; - for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { - changed |= read_cols_on_row(raw_matrix, current_row); + changed |= read_cols_on_row(current_matrix, current_row); } - - debounce(raw_matrix, matrix, MATRIX_ROWS, changed); - - matrix_scan_kb(); - - return (uint8_t)changed; + return changed; } diff --git a/keyboards/moon/rules.mk b/keyboards/moon/rules.mk index aee52dfee1..e11c65db02 100644 --- a/keyboards/moon/rules.mk +++ b/keyboards/moon/rules.mk @@ -1,5 +1,5 @@ # custom matrix setup -CUSTOM_MATRIX = yes +CUSTOM_MATRIX = lite VPATH += drivers/gpio SRC += pca9555.c matrix.c From 058919923a093bfc61d50371725c08e92808f17e Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 7 Jul 2025 08:50:07 -0600 Subject: [PATCH 475/592] Fixup `bastardkb/tbkmini` keymap's build target (#25458) --- keyboards/bastardkb/tbkmini/keymaps/default/keymap.json | 2 +- keyboards/bastardkb/tbkmini/readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json index 58a02b797c..72ca022da9 100644 --- a/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json +++ b/keyboards/bastardkb/tbkmini/keymaps/default/keymap.json @@ -1,5 +1,5 @@ { - "keyboard": "bastardkb/tbkmini", + "keyboard": "bastardkb/tbkmini/promicro", "keymap": "default", "layout": "LAYOUT_split_3x6_3", "layers": [ diff --git a/keyboards/bastardkb/tbkmini/readme.md b/keyboards/bastardkb/tbkmini/readme.md index cc3e547ff4..87f6cdcf2f 100644 --- a/keyboards/bastardkb/tbkmini/readme.md +++ b/keyboards/bastardkb/tbkmini/readme.md @@ -14,7 +14,7 @@ Flashing example for this keyboard: make bastardkb/tbkmini/blackpill:default:flash make bastardkb/tbkmini/promicro:default:flash -Note if using the `promicro` version: If you are using an Elite-C compatible development board, see [here](../readme.md#handedness-in-on-elite-c-holder) for setting handedness by pin. +Note if using the `promicro` version: If you are using an Elite-C compatible development board, see [here](../readme.md#handedness-pin-on-elite-c-holder) for setting handedness by pin. 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). From d9f2d8d241be9ca96a5c7c7fde8de1308a7c5f14 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 7 Jul 2025 16:15:37 +0100 Subject: [PATCH 476/592] Convert `novelkeys/nk65` to use RGB Matrix (#25450) --- data/mappings/keyboard_aliases.hjson | 5 +- keyboards/novelkeys/nk65/config.h | 87 +----- keyboards/novelkeys/nk65/halconf.h | 32 +-- keyboards/novelkeys/nk65/info.json | 124 ++++++++- .../novelkeys/nk65/keymaps/default/keymap.c | 57 ++-- .../novelkeys/nk65/keymaps/default/readme.md | 6 - keyboards/novelkeys/nk65/mcuconf.h | 43 +-- keyboards/novelkeys/nk65/nk65.c | 261 +++++++----------- keyboards/novelkeys/nk65/nk65.h | 20 -- keyboards/novelkeys/nk65/readme.md | 42 ++- keyboards/novelkeys/nk65/rules.mk | 13 - .../novelkeys/nk65/{base => v1}/keyboard.json | 0 keyboards/novelkeys/nk65/v1_4/readme.md | 40 +-- 13 files changed, 278 insertions(+), 452 deletions(-) delete mode 100755 keyboards/novelkeys/nk65/keymaps/default/readme.md delete mode 100755 keyboards/novelkeys/nk65/nk65.h delete mode 100755 keyboards/novelkeys/nk65/rules.mk rename keyboards/novelkeys/nk65/{base => v1}/keyboard.json (100%) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index d50ad16498..f00be05254 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -2273,7 +2273,10 @@ "target": "mechwild/sugarglider/wide_oled/f401" }, "novelkeys/nk65": { - "target": "novelkeys/nk65/base" + "target": "novelkeys/nk65/v1" + }, + "novelkeys/nk65/base": { + "target": "novelkeys/nk65/v1" }, "sirius/uni660/rev2": { "target": "sirius/uni660/rev2/ansi" diff --git a/keyboards/novelkeys/nk65/config.h b/keyboards/novelkeys/nk65/config.h index 97350e34b4..75c5c8638c 100755 --- a/keyboards/novelkeys/nk65/config.h +++ b/keyboards/novelkeys/nk65/config.h @@ -1,89 +1,6 @@ -/* -Copyright 2019 Yiancar - -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 . -*/ - +// Copyright 2019 Yiancar +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Backlight options */ - -#define RGB_BACKLIGHT_ENABLED 1 - -#define RGB_BACKLIGHT_NK65 - -// they aren't really used if RGB_BACKLIGHT_HS60 defined -#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 -#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 -#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 -#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 -#define RGB_BACKLIGHT_USE_ISO_ENTER 0 -#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 - -// disable backlight when USB suspended (PC sleep/hibernate/shutdown) -#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 - -// disable backlight after timeout in minutes, 0 = no timeout -#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 - -// the default brightness -#define RGB_BACKLIGHT_BRIGHTNESS 255 - -// the default effect (RGB test) -#define RGB_BACKLIGHT_EFFECT 6 - -// the default effect speed (0-3) -#define RGB_BACKLIGHT_EFFECT_SPEED 0 - -// the default color1 and color2 -#define RGB_BACKLIGHT_COLOR_1 { .h = 0, .s = 255 } -#define RGB_BACKLIGHT_COLOR_2 { .h = 127, .s = 255 } - #define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND #define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_GND_SDA -#define IS31FL3733_LED_COUNT 128 - -// These define which keys in the matrix are alphas/mods -// Used for backlight effects so colors are different for -// alphas vs. mods -// Each value is for a row, bit 0 is column 0 -// Alpha=0 Mod=1 -#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0b0110000000000001 -#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0b0100000000000001 -#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0b0110000000000001 -#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0b0111000000000001 -#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0b0111111000000111 - -#define RGB_BACKLIGHT_CAPS_LOCK_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 } -#define RGB_BACKLIGHT_LAYER_1_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 } -#define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 } -#define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 } - -// Backlight config starts after VIA's EEPROM usage, -// dynamic keymaps start after this. -#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 32 - -/* Custom EEPROM start addressing. This is to support - * both 128kb and 256kb versions of F303. - * Register 0x1FFFF7CC holds the size of the flash memory. - */ -#ifndef FLASHSIZE_BASE -# define FLASHSIZE_BASE ((uint32_t)0x1FFFF7CCU) /*!< FLASH Size register base address */ -#endif -#define FEE_MCU_FLASH_SIZE_IGNORE_CHECK -#define FEE_MCU_FLASH_SIZE \ -({ \ - uint16_t (*flash_size) = (uint16_t*)FLASHSIZE_BASE; \ - *flash_size; \ -}) diff --git a/keyboards/novelkeys/nk65/halconf.h b/keyboards/novelkeys/nk65/halconf.h index e6d7e3c2ed..481d19c467 100644 --- a/keyboards/novelkeys/nk65/halconf.h +++ b/keyboards/novelkeys/nk65/halconf.h @@ -1,33 +1,7 @@ -/* Copyright 2020 QMK - * - * 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 . - */ - -/* - * This file was auto-generated by: - * `qmk chibios-confmigrate -i keyboards/nk65/halconf.h -r platforms/chibios/QMK_PROTON_C/configs/halconf.h` - */ - +// Copyright 2019 Yiancar +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define HAL_USE_PWM FALSE - -#define HAL_USE_SPI FALSE - -#define PAL_USE_CALLBACKS FALSE - -#define PAL_USE_WAIT FALSE +#define HAL_USE_I2C TRUE #include_next - diff --git a/keyboards/novelkeys/nk65/info.json b/keyboards/novelkeys/nk65/info.json index ae02d3ac05..63c8af9faf 100755 --- a/keyboards/novelkeys/nk65/info.json +++ b/keyboards/novelkeys/nk65/info.json @@ -11,11 +11,133 @@ "bootmagic": true, "extrakey": true, "mousekey": true, + "rgb_matrix": true, "nkro": true }, "processor": "STM32F303", "bootloader": "stm32-dfu", - "board": "QMK_PROTON_C", + "rgb_matrix": { + "driver": "is31fl3733", + "sleep": true, + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true + }, + "layout": [ + { "flags": 4, "matrix": [0, 0], "x": 8, "y": 7 }, + { "flags": 4, "matrix": [0, 1], "x": 22, "y": 7 }, + { "flags": 4, "matrix": [0, 2], "x": 35, "y": 7 }, + { "flags": 4, "matrix": [0, 3], "x": 49, "y": 7 }, + { "flags": 4, "matrix": [0, 4], "x": 63, "y": 7 }, + { "flags": 4, "matrix": [0, 5], "x": 77, "y": 7 }, + { "flags": 4, "matrix": [0, 6], "x": 91, "y": 7 }, + { "flags": 4, "matrix": [0, 7], "x": 105, "y": 7 }, + { "flags": 4, "matrix": [0, 8], "x": 118, "y": 7 }, + { "flags": 4, "matrix": [0, 9], "x": 132, "y": 7 }, + { "flags": 4, "matrix": [0, 10], "x": 146, "y": 7 }, + { "flags": 4, "matrix": [0, 11], "x": 160, "y": 7 }, + { "flags": 4, "matrix": [0, 12], "x": 174, "y": 7 }, + { "flags": 4, "matrix": [0, 13], "x": 195, "y": 7 }, + { "flags": 4, "matrix": [0, 14], "x": 215, "y": 7 }, + { "flags": 4, "matrix": [1, 0], "x": 11, "y": 19 }, + { "flags": 4, "matrix": [1, 1], "x": 28, "y": 19 }, + { "flags": 4, "matrix": [1, 2], "x": 42, "y": 19 }, + { "flags": 4, "matrix": [1, 3], "x": 56, "y": 19 }, + { "flags": 4, "matrix": [1, 4], "x": 70, "y": 19 }, + { "flags": 4, "matrix": [1, 5], "x": 84, "y": 19 }, + { "flags": 4, "matrix": [1, 6], "x": 98, "y": 19 }, + { "flags": 4, "matrix": [1, 7], "x": 112, "y": 19 }, + { "flags": 4, "matrix": [1, 8], "x": 125, "y": 19 }, + { "flags": 4, "matrix": [1, 9], "x": 139, "y": 19 }, + { "flags": 4, "matrix": [1, 10], "x": 153, "y": 19 }, + { "flags": 4, "matrix": [1, 11], "x": 167, "y": 19 }, + { "flags": 4, "matrix": [1, 12], "x": 181, "y": 19 }, + { "flags": 4, "matrix": [2, 12], "x": 198, "y": 19 }, + { "flags": 4, "matrix": [1, 14], "x": 215, "y": 19 }, + { "flags": 4, "matrix": [2, 0], "x": 13, "y": 32 }, + { "flags": 4, "matrix": [2, 1], "x": 32, "y": 32 }, + { "flags": 4, "matrix": [2, 2], "x": 46, "y": 32 }, + { "flags": 4, "matrix": [2, 3], "x": 60, "y": 32 }, + { "flags": 4, "matrix": [2, 4], "x": 73, "y": 32 }, + { "flags": 4, "matrix": [2, 5], "x": 87, "y": 32 }, + { "flags": 4, "matrix": [2, 6], "x": 101, "y": 32 }, + { "flags": 4, "matrix": [2, 7], "x": 115, "y": 32 }, + { "flags": 4, "matrix": [2, 8], "x": 129, "y": 32 }, + { "flags": 4, "matrix": [2, 9], "x": 143, "y": 32 }, + { "flags": 4, "matrix": [2, 10], "x": 156, "y": 32 }, + { "flags": 4, "matrix": [2, 11], "x": 170, "y": 32 }, + { "flags": 4, "matrix": [2, 13], "x": 193, "y": 32 }, + { "flags": 4, "matrix": [2, 14], "x": 215, "y": 32 }, + { "flags": 4, "matrix": [3, 0], "x": 16, "y": 44 }, + { "flags": 4, "matrix": [3, 2], "x": 39, "y": 44 }, + { "flags": 4, "matrix": [3, 3], "x": 53, "y": 44 }, + { "flags": 4, "matrix": [3, 4], "x": 67, "y": 44 }, + { "flags": 4, "matrix": [3, 5], "x": 80, "y": 44 }, + { "flags": 4, "matrix": [3, 6], "x": 94, "y": 44 }, + { "flags": 4, "matrix": [3, 7], "x": 108, "y": 44 }, + { "flags": 4, "matrix": [3, 8], "x": 122, "y": 44 }, + { "flags": 4, "matrix": [3, 9], "x": 136, "y": 44 }, + { "flags": 4, "matrix": [3, 10], "x": 150, "y": 44 }, + { "flags": 4, "matrix": [3, 11], "x": 163, "y": 44 }, + { "flags": 4, "matrix": [3, 12], "x": 182, "y": 44 }, + { "flags": 4, "matrix": [3, 13], "x": 201, "y": 44 }, + { "flags": 4, "matrix": [3, 14], "x": 215, "y": 44 }, + { "flags": 4, "matrix": [4, 0], "x": 9, "y": 56 }, + { "flags": 4, "matrix": [4, 1], "x": 27, "y": 56 }, + { "flags": 4, "matrix": [4, 2], "x": 44, "y": 56 }, + { "flags": 4, "matrix": [4, 6], "x": 96, "y": 56 }, + { "flags": 4, "matrix": [4, 9], "x": 146, "y": 56 }, + { "flags": 4, "matrix": [4, 10], "x": 160, "y": 56 }, + { "flags": 4, "matrix": [4, 11], "x": 174, "y": 56 }, + { "flags": 4, "matrix": [4, 12], "x": 188, "y": 56 }, + { "flags": 4, "matrix": [4, 13], "x": 201, "y": 56 }, + { "flags": 4, "matrix": [4, 14], "x": 215, "y": 56 }, + { "flags": 1, "x": 224, "y": 0 }, + { "flags": 1, "x": 224, "y": 5 }, + { "flags": 1, "x": 224, "y": 10 } + ] + }, "community_layouts": ["65_ansi"], "layouts": { "LAYOUT_65_ansi": { diff --git a/keyboards/novelkeys/nk65/keymaps/default/keymap.c b/keyboards/novelkeys/nk65/keymaps/default/keymap.c index 3a043cbfe7..95a1d7f367 100755 --- a/keyboards/novelkeys/nk65/keymaps/default/keymap.c +++ b/keyboards/novelkeys/nk65/keymaps/default/keymap.c @@ -1,46 +1,21 @@ -/* Copyright 2019 Yiancar - * - * 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 . - */ +// Copyright 2019 Yiancar +// 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( /* Base */ - 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_HOME, - 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_ENT, 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, KC_END, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + [0] = LAYOUT_65_ansi( /* Base */ + 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_HOME, + 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_ENT, 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, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), -[1] = LAYOUT_65_ansi( /* FN */ - 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_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, BR_DEC, BR_INC, ES_DEC, ES_INC, KC_TRNS, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - -[2] = LAYOUT_65_ansi( /* Empty for dynamic keymaps */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - -[3] = LAYOUT_65_ansi( /* Empty for dynamic keymaps */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [1] = LAYOUT_65_ansi( /* FN */ + 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, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, + _______, RM_TOGG, _______, _______, RM_SATD, RM_SATU, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RM_PREV, RM_NEXT, RM_HUED, RM_HUEU, _______, _______, RM_VALD, RM_VALU, RM_SPDD, RM_SPDU, _______, _______, _______, + KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, _______, _______, _______, _______, _______ + ) }; diff --git a/keyboards/novelkeys/nk65/keymaps/default/readme.md b/keyboards/novelkeys/nk65/keymaps/default/readme.md deleted file mode 100755 index 27bcd0501d..0000000000 --- a/keyboards/novelkeys/nk65/keymaps/default/readme.md +++ /dev/null @@ -1,6 +0,0 @@ -The default keymap for NK65. VIA support disabled. -========================================================= - -![Layout image](https://i.imgur.com/DL0CjJO.png) - -Default layer is normal ANSI 65% \ No newline at end of file diff --git a/keyboards/novelkeys/nk65/mcuconf.h b/keyboards/novelkeys/nk65/mcuconf.h index f37f37c179..9024dd88ab 100644 --- a/keyboards/novelkeys/nk65/mcuconf.h +++ b/keyboards/novelkeys/nk65/mcuconf.h @@ -1,43 +1,8 @@ -/* Copyright 2020 QMK - * - * 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 . - */ - -/* - * This file was auto-generated by: - * `qmk chibios-confmigrate -i keyboards/nk65/mcuconf.h -r platforms/chibios/QMK_PROTON_C/configs/mcuconf.h` - */ - +// Copyright 2019 Yiancar +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next -#undef STM32_GPT_USE_TIM4 -#define STM32_GPT_USE_TIM4 TRUE - -#undef STM32_GPT_USE_TIM15 -#define STM32_GPT_USE_TIM15 FALSE - -#undef STM32_PWM_USE_TIM3 -#define STM32_PWM_USE_TIM3 FALSE - -#undef STM32_PWM_USE_TIM4 -#define STM32_PWM_USE_TIM4 FALSE - -#undef STM32_SERIAL_USE_USART2 -#define STM32_SERIAL_USE_USART2 FALSE - -#undef STM32_SPI_USE_SPI2 -#define STM32_SPI_USE_SPI2 FALSE - +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/novelkeys/nk65/nk65.c b/keyboards/novelkeys/nk65/nk65.c index dd0a94a8e6..16750481cb 100755 --- a/keyboards/novelkeys/nk65/nk65.c +++ b/keyboards/novelkeys/nk65/nk65.c @@ -1,26 +1,8 @@ -/* Copyright 2019 Yiancar - * - * 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 . - */ -#ifndef RGB_BACKLIGHT_NK65 -#error RGB_BACKLIGHT_NK65 not defined, recheck config.h -#endif +// Copyright 2019 Yiancar +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" -#include "nk65.h" -#include "drivers/led/issi/is31fl3733.h" - -#if defined(RGB_MATRIX_ENABLE) || defined(RGB_BACKLIGHT_NK65) +#if defined(RGB_MATRIX_ENABLE) const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { /* Refer to IS31 manual for these locations * driver @@ -28,135 +10,79 @@ const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { * | | G location * | | | B location * | | | | */ - {0, SW2_CS1, SW1_CS1, SW3_CS1}, //LA1 - {0, SW5_CS1, SW4_CS1, SW6_CS1}, //LA2 - {0, SW8_CS1, SW7_CS1, SW9_CS1}, //LA3 - {0, SW11_CS1, SW10_CS1, SW12_CS1}, //LA4 - {0, SW2_CS2, SW1_CS2, SW3_CS2}, //LA5 - {0, SW5_CS2, SW4_CS2, SW6_CS2}, //LA6 - {0, SW8_CS2, SW7_CS2, SW9_CS2}, //LA7 - {0, SW11_CS2, SW10_CS2, SW12_CS2}, //LA8 - {0, SW2_CS3, SW1_CS3, SW3_CS3}, //LA9 - {0, SW5_CS3, SW4_CS3, SW6_CS3}, //LA10 - {0, SW8_CS3, SW7_CS3, SW9_CS3}, //LA11 - {0, SW11_CS3, SW10_CS3, SW12_CS3}, //LA12 - {0, SW2_CS4, SW1_CS4, SW3_CS4}, //LA13 - {0, SW5_CS4, SW4_CS4, SW6_CS4}, //LA14 - {0, SW8_CS4, SW7_CS4, SW9_CS4}, //LA15 - {0, SW11_CS4, SW10_CS4, SW12_CS4}, //LA16 - {0, SW2_CS5, SW1_CS5, SW3_CS5}, //LA17 - {0, SW5_CS5, SW4_CS5, SW6_CS5}, //LA18 - {0, SW8_CS5, SW7_CS5, SW9_CS5}, //LA19 - {0, SW11_CS5, SW10_CS5, SW12_CS5}, //LA20 - {0, SW2_CS6, SW1_CS6, SW3_CS6}, //LA21 - {0, SW5_CS6, SW4_CS6, SW6_CS6}, //LA22 - {0, SW8_CS6, SW7_CS6, SW9_CS6}, //LA23 - {0, SW11_CS6, SW10_CS6, SW12_CS6}, //LA24 - {0, SW2_CS7, SW1_CS7, SW3_CS7}, //LA25 - {0, SW5_CS7, SW4_CS7, SW6_CS7}, //LA26 - {0, SW8_CS7, SW7_CS7, SW9_CS7}, //LA27 - {0, SW11_CS7, SW10_CS7, SW12_CS7}, //LA28 - {0, SW2_CS8, SW1_CS8, SW3_CS8}, //LA29 - {0, SW5_CS8, SW4_CS8, SW6_CS8}, //LA30 - {0, SW8_CS8, SW7_CS8, SW9_CS8}, //LA31 - {0, SW11_CS8, SW10_CS8, SW12_CS8}, //LA32 - {0, SW2_CS9, SW1_CS9, SW3_CS9}, //LA33 - {0, SW5_CS9, SW4_CS9, SW6_CS9}, //LA34 - {0, SW8_CS9, SW7_CS9, SW9_CS9}, //LA35 - {0, SW11_CS9, SW10_CS9, SW12_CS9}, //LA36 - {0, SW2_CS10, SW1_CS10, SW3_CS10}, //LA37 - {0, SW5_CS10, SW4_CS10, SW6_CS10}, //LA38 - {0, SW8_CS10, SW7_CS10, SW9_CS10}, //LA39 - {0, SW11_CS10, SW10_CS10, SW12_CS10}, //LA40 - {0, SW2_CS11, SW1_CS11, SW3_CS11}, //LA41 - {0, SW5_CS11, SW4_CS11, SW6_CS11}, //LA42 - {0, SW8_CS11, SW7_CS11, SW9_CS11}, //LA43 - {0, SW11_CS11, SW10_CS11, SW12_CS11}, //LA44 - {0, SW2_CS12, SW1_CS12, SW3_CS12}, //LA45 - {0, SW5_CS12, SW4_CS12, SW6_CS12}, //LA46 - {0, SW8_CS12, SW7_CS12, SW9_CS12}, //LA47 - {0, SW11_CS12, SW10_CS12, SW12_CS12}, //LA48 - {0, SW2_CS13, SW1_CS13, SW3_CS13}, //LA49 - {0, SW5_CS13, SW4_CS13, SW6_CS13}, //LA50 - {0, SW8_CS13, SW7_CS13, SW9_CS13}, //LA51 - {0, SW11_CS13, SW10_CS13, SW12_CS13}, //LA52 - {0, SW2_CS14, SW1_CS14, SW3_CS14}, //LA53 - {0, SW5_CS14, SW4_CS14, SW6_CS14}, //LA54 - {0, SW8_CS14, SW7_CS14, SW9_CS14}, //LA55 - {0, SW11_CS14, SW10_CS14, SW12_CS14}, //LA56 - {0, SW2_CS15, SW1_CS15, SW3_CS15}, //LA57 - {0, SW5_CS15, SW4_CS15, SW6_CS15}, //LA58 - {0, SW8_CS15, SW7_CS15, SW9_CS15}, //LA59 - {0, SW11_CS15, SW10_CS15, SW12_CS15}, //LA60 - {0, SW2_CS16, SW1_CS16, SW3_CS16}, //LA61 - {0, SW5_CS16, SW4_CS16, SW6_CS16}, //LA62 - {0, SW8_CS16, SW7_CS16, SW9_CS16}, //LA63 - {0, SW11_CS16, SW10_CS16, SW12_CS16}, //LA64 + {0, SW2_CS1, SW1_CS1, SW3_CS1}, //LA1 - esc + {0, SW2_CS2, SW1_CS2, SW3_CS2}, //LA5 - 1 + {0, SW2_CS3, SW1_CS3, SW3_CS3}, //LA9 - 2 + {0, SW2_CS4, SW1_CS4, SW3_CS4}, //LA13 - 3 + {0, SW2_CS5, SW1_CS5, SW3_CS5}, //LA17 - 4 + {0, SW2_CS6, SW1_CS6, SW3_CS6}, //LA21 - 5 + {0, SW2_CS7, SW1_CS7, SW3_CS7}, //LA25 - 6 + {0, SW2_CS8, SW1_CS8, SW3_CS8}, //LA29 - 7 + {0, SW2_CS9, SW1_CS9, SW3_CS9}, //LA33 - 8 + {0, SW2_CS10, SW1_CS10, SW3_CS10}, //LA37 - 9 + {0, SW2_CS11, SW1_CS11, SW3_CS11}, //LA41 - 0 + {0, SW2_CS12, SW1_CS12, SW3_CS12}, //LA45 - - + {0, SW2_CS13, SW1_CS13, SW3_CS13}, //LA49 - = + {0, SW2_CS14, SW1_CS14, SW3_CS14}, //LA53 - bspace + {1, SW2_CS1, SW1_CS1, SW3_CS1}, //LB1 - home + {0, SW5_CS1, SW4_CS1, SW6_CS1}, //LA2 - tab + {0, SW5_CS2, SW4_CS2, SW6_CS2}, //LA6 - q + {0, SW5_CS3, SW4_CS3, SW6_CS3}, //LA10 - w + {0, SW5_CS4, SW4_CS4, SW6_CS4}, //LA14 - e + {0, SW5_CS5, SW4_CS5, SW6_CS5}, //LA18 - r + {0, SW5_CS6, SW4_CS6, SW6_CS6}, //LA22 - t + {0, SW5_CS7, SW4_CS7, SW6_CS7}, //LA26 - y + {0, SW5_CS8, SW4_CS8, SW6_CS8}, //LA30 - u + {0, SW5_CS9, SW4_CS9, SW6_CS9}, //LA34 - i + {0, SW5_CS10, SW4_CS10, SW6_CS10}, //LA38 - o + {0, SW5_CS11, SW4_CS11, SW6_CS11}, //LA42 - p + {0, SW5_CS12, SW4_CS12, SW6_CS12}, //LA46 - [ + {0, SW5_CS13, SW4_CS13, SW6_CS13}, //LA50 - ] + {0, SW5_CS14, SW4_CS14, SW6_CS14}, //LA54 - | + {1, SW5_CS1, SW4_CS1, SW6_CS1}, //LB2 - pgup + {0, SW8_CS1, SW7_CS1, SW9_CS1}, //LA3 - caps + {0, SW8_CS2, SW7_CS2, SW9_CS2}, //LA7 - a + {0, SW8_CS3, SW7_CS3, SW9_CS3}, //LA11 - s + {0, SW8_CS4, SW7_CS4, SW9_CS4}, //LA15 - d + {0, SW8_CS5, SW7_CS5, SW9_CS5}, //LA19 - f + {0, SW8_CS6, SW7_CS6, SW9_CS6}, //LA23 - g + {0, SW8_CS7, SW7_CS7, SW9_CS7}, //LA27 - h + {0, SW8_CS8, SW7_CS8, SW9_CS8}, //LA31 - j + {0, SW8_CS9, SW7_CS9, SW9_CS9}, //LA35 - k + {0, SW8_CS10, SW7_CS10, SW9_CS10}, //LA39 - l + {0, SW8_CS11, SW7_CS11, SW9_CS11}, //LA43 - ; + {0, SW8_CS12, SW7_CS12, SW9_CS12}, //LA47 - ' + {0, SW8_CS14, SW7_CS14, SW9_CS14}, //LA55 - ent + {1, SW2_CS2, SW1_CS2, SW3_CS2}, //LB5 - pgdn + {0, SW11_CS1, SW10_CS1, SW12_CS1}, //LA4 - lshft + {0, SW11_CS2, SW10_CS2, SW12_CS2}, //LA8 - z + {0, SW11_CS3, SW10_CS3, SW12_CS3}, //LA12 - x + {0, SW11_CS4, SW10_CS4, SW12_CS4}, //LA16 - c + {0, SW11_CS5, SW10_CS5, SW12_CS5}, //LA20 - v + {0, SW11_CS6, SW10_CS6, SW12_CS6}, //LA24 - b + {0, SW11_CS7, SW10_CS7, SW12_CS7}, //LA28 - n + {0, SW11_CS8, SW10_CS8, SW12_CS8}, //LA32 - m + {0, SW11_CS9, SW10_CS9, SW12_CS9}, //LA36 - < + {0, SW11_CS10, SW10_CS10, SW12_CS10}, //LA40 - > + {0, SW11_CS11, SW10_CS11, SW12_CS11}, //LA44 - ? + {0, SW8_CS13, SW7_CS13, SW9_CS13}, //LA51 - rshift + {0, SW11_CS13, SW10_CS13, SW12_CS13}, //LA52 - up + {1, SW8_CS1, SW7_CS1, SW9_CS1}, //LB3 - end + {0, SW2_CS15, SW1_CS15, SW3_CS15}, //LA57 - lctrl + {0, SW5_CS15, SW4_CS15, SW6_CS15}, //LA58 - lgui + {0, SW8_CS15, SW7_CS15, SW9_CS15}, //LA59 - lalt + {0, SW11_CS15, SW10_CS15, SW12_CS15}, //LA60 space + {0, SW11_CS12, SW10_CS12, SW12_CS12}, //LA48 - ralt + {0, SW5_CS16, SW4_CS16, SW6_CS16}, //LA62 - fn + {0, SW8_CS16, SW7_CS16, SW9_CS16}, //LA63 - rctrl + {0, SW11_CS16, SW10_CS16, SW12_CS16}, //LA64 - left + {0, SW11_CS14, SW10_CS14, SW12_CS14}, //LA56 - down + {1, SW11_CS1, SW10_CS1, SW12_CS1}, //LB4 - right - {1, SW2_CS1, SW1_CS1, SW3_CS1}, //LB1 - {1, SW5_CS1, SW4_CS1, SW6_CS1}, //LB2 - {1, SW8_CS1, SW7_CS1, SW9_CS1}, //LB3 - {1, SW11_CS1, SW10_CS1, SW12_CS1}, //LB4 - {1, SW2_CS2, SW1_CS2, SW3_CS2}, //LB5 - {1, SW5_CS2, SW4_CS2, SW6_CS2}, //LB6 - {1, SW8_CS2, SW7_CS2, SW9_CS2}, //LB7 - {1, SW11_CS2, SW10_CS2, SW12_CS2}, //LB8 - {1, SW2_CS3, SW1_CS3, SW3_CS3}, //LB9 - {1, SW5_CS3, SW4_CS3, SW6_CS3}, //LB10 - {1, SW8_CS3, SW7_CS3, SW9_CS3}, //LB11 - {1, SW11_CS3, SW10_CS3, SW12_CS3}, //LB12 - {1, SW2_CS4, SW1_CS4, SW3_CS4}, //LB13 - {1, SW5_CS4, SW4_CS4, SW6_CS4}, //LB14 - {1, SW8_CS4, SW7_CS4, SW9_CS4}, //LB15 - {1, SW11_CS4, SW10_CS4, SW12_CS4}, //LB16 - {1, SW2_CS5, SW1_CS5, SW3_CS5}, //LB17 - {1, SW5_CS5, SW4_CS5, SW6_CS5}, //LB18 - {1, SW8_CS5, SW7_CS5, SW9_CS5}, //LB19 - {1, SW11_CS5, SW10_CS5, SW12_CS5}, //LB20 - {1, SW2_CS6, SW1_CS6, SW3_CS6}, //LB21 - {1, SW5_CS6, SW4_CS6, SW6_CS6}, //LB22 - {1, SW8_CS6, SW7_CS6, SW9_CS6}, //LB23 - {1, SW11_CS6, SW10_CS6, SW12_CS6}, //LB24 - {1, SW2_CS7, SW1_CS7, SW3_CS7}, //LB25 - {1, SW5_CS7, SW4_CS7, SW6_CS7}, //LB26 - {1, SW8_CS7, SW7_CS7, SW9_CS7}, //LB27 - {1, SW11_CS7, SW10_CS7, SW12_CS7}, //LB28 - {1, SW2_CS8, SW1_CS8, SW3_CS8}, //LB29 - {1, SW5_CS8, SW4_CS8, SW6_CS8}, //LB30 - {1, SW8_CS8, SW7_CS8, SW9_CS8}, //LB31 - {1, SW11_CS8, SW10_CS8, SW12_CS8}, //LB32 - {1, SW2_CS9, SW1_CS9, SW3_CS9}, //LB33 - {1, SW5_CS9, SW4_CS9, SW6_CS9}, //LB34 - {1, SW8_CS9, SW7_CS9, SW9_CS9}, //LB35 - {1, SW11_CS9, SW10_CS9, SW12_CS9}, //LB36 - {1, SW2_CS10, SW1_CS10, SW3_CS10}, //LB37 - {1, SW5_CS10, SW4_CS10, SW6_CS10}, //LB38 - {1, SW8_CS10, SW7_CS10, SW9_CS10}, //LB39 - {1, SW11_CS10, SW10_CS10, SW12_CS10}, //LB40 - {1, SW2_CS11, SW1_CS11, SW3_CS11}, //LB41 - {1, SW5_CS11, SW4_CS11, SW6_CS11}, //LB42 - {1, SW8_CS11, SW7_CS11, SW9_CS11}, //LB43 - {1, SW11_CS11, SW10_CS11, SW12_CS11}, //LB44 - {1, SW2_CS12, SW1_CS12, SW3_CS12}, //LB45 - {1, SW5_CS12, SW4_CS12, SW6_CS12}, //LB46 - {1, SW8_CS12, SW7_CS12, SW9_CS12}, //LB47 - {1, SW11_CS12, SW10_CS12, SW12_CS12}, //LB48 - {1, SW2_CS13, SW1_CS13, SW3_CS13}, //LB49 - {1, SW5_CS13, SW4_CS13, SW6_CS13}, //LB50 - {1, SW8_CS13, SW7_CS13, SW9_CS13}, //LB51 - {1, SW11_CS13, SW10_CS13, SW12_CS13}, //LB52 - {1, SW2_CS14, SW1_CS14, SW3_CS14}, //LB53 - {1, SW5_CS14, SW4_CS14, SW6_CS14}, //LB54 - {1, SW8_CS14, SW7_CS14, SW9_CS14}, //LB55 - {1, SW11_CS14, SW10_CS14, SW12_CS14}, //LB56 - {1, SW2_CS15, SW1_CS15, SW3_CS15}, //LB57 - {1, SW5_CS15, SW4_CS15, SW6_CS15}, //LB58 - {1, SW8_CS15, SW7_CS15, SW9_CS15}, //LB59 - {1, SW11_CS15, SW10_CS15, SW12_CS15}, //LB60 - {1, SW2_CS16, SW1_CS16, SW3_CS16}, //LB61 - {1, SW5_CS16, SW4_CS16, SW6_CS16}, //LB62 - {1, SW8_CS16, SW7_CS16, SW9_CS16}, //LB63 - {1, SW11_CS16, SW10_CS16, SW12_CS16}, //LB64 + // Mapped with "dead" locations so each indicator is logically separate + {1, SW2_CS3, SW7_CS2, SW3_CS3}, //LB7 - top indi + {1, SW5_CS2, SW10_CS2, SW6_CS2}, //LB6 - mid indi + {1, SW11_CS2, SW4_CS2, SW12_CS2}, //LB6 - bot indi }; #endif @@ -165,26 +91,29 @@ const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { * Middle LED is blue and red. LED driver 2 RGB 6 Red and Blue channel * Bottom LED is red only LED driver 2 RGB 6 Green channel. */ -void led_update_ports(led_t led_state) { - if (led_state.caps_lock) { - is31fl3733_set_color( 7+64-1, 0, 255, 0 ); +bool rgb_matrix_indicators_kb(void) { + if (!rgb_matrix_indicators_user()) { + return false; + } + + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color(68, RGB_WHITE); //0, 0xFF, 0); } else { - is31fl3733_set_color( 7+64-1, 0, 0, 0 ); + rgb_matrix_set_color(68, RGB_OFF); } -} -__attribute__((weak)) layer_state_t layer_state_set_user(layer_state_t state) { - uint8_t R = 0; - uint8_t G = 0; - uint8_t B = 0; + layer_state_t state = layer_state|default_layer_state; if (state & (1UL << 1)) { - R = 255; - B = 255; - } - if (state & (1UL << 2)) { - G = 255; + rgb_matrix_set_color(69, RGB_WHITE); // 0xFF, 0, 0xFF); + } else { + rgb_matrix_set_color(69, RGB_OFF); } - is31fl3733_set_color( 6+64-1, R, G, B ); - return state; + if (state & (1UL << 2)) { + rgb_matrix_set_color(70, RGB_WHITE); //0, 0xFF, 0); + } else { + rgb_matrix_set_color(70, RGB_OFF); + } + + return true; } diff --git a/keyboards/novelkeys/nk65/nk65.h b/keyboards/novelkeys/nk65/nk65.h deleted file mode 100755 index c75541be93..0000000000 --- a/keyboards/novelkeys/nk65/nk65.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright 2019 Yiancar - * - * 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 "quantum.h" -#include "../wilba_tech/wt_rgb_backlight_keycodes.h" -#include "via.h" diff --git a/keyboards/novelkeys/nk65/readme.md b/keyboards/novelkeys/nk65/readme.md index 38f66500b9..5e30f54b31 100755 --- a/keyboards/novelkeys/nk65/readme.md +++ b/keyboards/novelkeys/nk65/readme.md @@ -1,39 +1,29 @@ -NK65 -========= +# NK65 ![NK65](https://i.imgur.com/EXNbVpL.jpg) +> NOTE: For PCBs with revision v1.4 or later please use nk65/v1_4 in the make command. + This is a standard fixed layout 65% PCB. It supports VIA and full per-key RGB. -Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) -Hardware Supported: A 65% keyboard with STM32F303CC -Hardware Availability: https://novelkeys.xyz/ - -Due to the RGB implementation, the NK65 is currently not compatible with community layouts. - -NOTE: For PCBs with revision v1.4 or later please use nk65/v1_4 in the make command. - -## Instructions - -### Build +* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) +* Hardware Supported: A 65% keyboard with STM32F303CC +* Hardware Availability: https://novelkeys.xyz/ Make example for this keyboard (after setting up your build environment): - make novelkeys/nk65:via + make novelkeys/nk65/v1:default + +Flashing example for this keyboard: + + make novelkeys/nk65/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). -### Reset +## Bootloader -- Unplug -- Hold Escape -- Plug In -- Unplug -- Release Escape +Enter the bootloader in 3 ways: -### Flash - -- Unplug -- Hold Escape -- Plug In -- Flash using QMK Toolbox or dfu-util (`make nk65::dfu-util`) +* **Bootmagic reset**: Hold down the top left key and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/novelkeys/nk65/rules.mk b/keyboards/novelkeys/nk65/rules.mk deleted file mode 100755 index 3b7a32713c..0000000000 --- a/keyboards/novelkeys/nk65/rules.mk +++ /dev/null @@ -1,13 +0,0 @@ -# Do not put the microcontroller into power saving mode -# when we get USB suspend event. We want it to keep updating -# backlight effects. -NO_SUSPEND_POWER_DOWN = yes - -CIE1931_CURVE = yes -I2C_DRIVER_REQUIRED = yes - -# project specific files -SRC = keyboards/wilba_tech/wt_main.c \ - keyboards/wilba_tech/wt_rgb_backlight.c \ - drivers/led/issi/is31fl3733.c \ - quantum/color.c diff --git a/keyboards/novelkeys/nk65/base/keyboard.json b/keyboards/novelkeys/nk65/v1/keyboard.json similarity index 100% rename from keyboards/novelkeys/nk65/base/keyboard.json rename to keyboards/novelkeys/nk65/v1/keyboard.json diff --git a/keyboards/novelkeys/nk65/v1_4/readme.md b/keyboards/novelkeys/nk65/v1_4/readme.md index 399919a8be..11f581ff31 100755 --- a/keyboards/novelkeys/nk65/v1_4/readme.md +++ b/keyboards/novelkeys/nk65/v1_4/readme.md @@ -1,39 +1,29 @@ -NK65 V1.4 -========= +# NK65 V1.4 ![NK65](https://i.imgur.com/EXNbVpL.jpg) -NOTE: Please use this directory only if you have revision 1.4 PCB or later. +> NOTE: Please use this directory only if you have revision 1.4 PCB or later. This is a standard fixed layout 65% PCB. It supports VIA and full per-key RGB. -Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) -Hardware Supported: A 65% keyboard with STM32F303CC -Hardware Availability: https://novelkeys.xyz/ - -Due to the RGB implementation, the NK65 is currently not compatible with community layouts. - -## Instructions - -### Build +* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar) +* Hardware Supported: A 65% keyboard with STM32F303CC +* Hardware Availability: https://novelkeys.xyz/ Make example for this keyboard (after setting up your build environment): - make nk65/v1_4:via + make novelkeys/nk65/v1_4:default + +Flashing example for this keyboard: + + make novelkeys/nk65/v1_4: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). -### Reset +## Bootloader -- Unplug -- Hold Escape -- Plug In -- Unplug -- Release Escape +Enter the bootloader in 3 ways: -### Flash - -- Unplug -- Hold Escape -- Plug In -- Flash using QMK Toolbox or dfu-util (`make nk65/v1_4::dfu-util`) +* **Bootmagic reset**: Hold down the top left key and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 7827f9fbe369bd9ad6c30c88f36ab53dafbb719d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 7 Jul 2025 16:15:50 +0100 Subject: [PATCH 477/592] Compilation fixes for `-fno-common` (#25436) --- drivers/sensors/adns5050.h | 2 +- drivers/sensors/adns9800.h | 2 +- drivers/sensors/analog_joystick.h | 2 +- drivers/sensors/azoteq_iqs5xx.h | 2 +- drivers/sensors/cirque_pinnacle.h | 2 +- drivers/sensors/paw3204.h | 2 +- drivers/sensors/pimoroni_trackball.h | 2 +- drivers/sensors/pmw3320.h | 2 +- drivers/sensors/pmw33xx_common.h | 2 +- keyboards/bajjak/bajjak.c | 4 ++++ keyboards/bajjak/bajjak.h | 6 +++--- keyboards/hardwareabstraction/handwire/handwire.c | 2 +- keyboards/sekigon/grs_70ec/matrix.c | 2 +- keyboards/system76/launch_1/launch_1.c | 2 +- keyboards/system76/launch_1/rgb_matrix_kb.inc | 2 +- keyboards/system76/system76_ec.c | 2 +- keyboards/work_louder/rgb_functions.c | 1 + quantum/audio/audio.c | 5 +++-- 18 files changed, 25 insertions(+), 19 deletions(-) diff --git a/drivers/sensors/adns5050.h b/drivers/sensors/adns5050.h index 004c54f560..648b49e387 100644 --- a/drivers/sensors/adns5050.h +++ b/drivers/sensors/adns5050.h @@ -70,7 +70,7 @@ typedef struct { int8_t dy; } report_adns5050_t; -const pointing_device_driver_t adns5050_pointing_device_driver; +extern const pointing_device_driver_t adns5050_pointing_device_driver; // A bunch of functions to implement the ADNS5050-specific serial protocol. // Note that the "serial.h" driver is insufficient, because it does not diff --git a/drivers/sensors/adns9800.h b/drivers/sensors/adns9800.h index 797aaf3cd0..ea854e8675 100644 --- a/drivers/sensors/adns9800.h +++ b/drivers/sensors/adns9800.h @@ -61,7 +61,7 @@ typedef struct { int16_t y; } report_adns9800_t; -const pointing_device_driver_t adns9800_pointing_device_driver; +extern const pointing_device_driver_t adns9800_pointing_device_driver; bool adns9800_init(void); config_adns9800_t adns9800_get_config(void); diff --git a/drivers/sensors/analog_joystick.h b/drivers/sensors/analog_joystick.h index 4838f502f1..f8cc315533 100644 --- a/drivers/sensors/analog_joystick.h +++ b/drivers/sensors/analog_joystick.h @@ -43,7 +43,7 @@ # define ANALOG_JOYSTICK_SPEED_MAX 2 #endif -const pointing_device_driver_t analog_joystick_pointing_device_driver; +extern const pointing_device_driver_t analog_joystick_pointing_device_driver; typedef struct { int8_t x; diff --git a/drivers/sensors/azoteq_iqs5xx.h b/drivers/sensors/azoteq_iqs5xx.h index 1a70ac6149..a5866b3d85 100644 --- a/drivers/sensors/azoteq_iqs5xx.h +++ b/drivers/sensors/azoteq_iqs5xx.h @@ -178,7 +178,7 @@ typedef struct { # define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE + 1 #endif -const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver; +extern const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver; bool azoteq_iqs5xx_init(void); i2c_status_t azoteq_iqs5xx_wake(void); diff --git a/drivers/sensors/cirque_pinnacle.h b/drivers/sensors/cirque_pinnacle.h index 3541d62463..f71ee8da1f 100644 --- a/drivers/sensors/cirque_pinnacle.h +++ b/drivers/sensors/cirque_pinnacle.h @@ -112,7 +112,7 @@ typedef struct { #define cirque_pinnacle_i2c_pointing_device_driver cirque_pinnacle_pointing_device_driver #define cirque_pinnacle_spi_pointing_device_driver cirque_pinnacle_pointing_device_driver -const pointing_device_driver_t cirque_pinnacle_pointing_device_driver; +extern const pointing_device_driver_t cirque_pinnacle_pointing_device_driver; bool cirque_pinnacle_init(void); void cirque_pinnacle_calibrate(void); diff --git a/drivers/sensors/paw3204.h b/drivers/sensors/paw3204.h index 11759d64c3..0bf5713548 100644 --- a/drivers/sensors/paw3204.h +++ b/drivers/sensors/paw3204.h @@ -41,7 +41,7 @@ typedef struct { bool isMotion; } report_paw3204_t; -const pointing_device_driver_t paw3204_pointing_device_driver; +extern const pointing_device_driver_t paw3204_pointing_device_driver; /** * @brief Initializes the sensor so it is in a working state and ready to diff --git a/drivers/sensors/pimoroni_trackball.h b/drivers/sensors/pimoroni_trackball.h index 4b8a2548ae..74ae6d7228 100644 --- a/drivers/sensors/pimoroni_trackball.h +++ b/drivers/sensors/pimoroni_trackball.h @@ -50,7 +50,7 @@ typedef struct { uint8_t click; } pimoroni_data_t; -const pointing_device_driver_t pimoroni_trackball_pointing_device_driver; +extern const pointing_device_driver_t pimoroni_trackball_pointing_device_driver; bool pimoroni_trackball_device_init(void); void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white); diff --git a/drivers/sensors/pmw3320.h b/drivers/sensors/pmw3320.h index 42fd72a52c..c80eb8e145 100644 --- a/drivers/sensors/pmw3320.h +++ b/drivers/sensors/pmw3320.h @@ -55,7 +55,7 @@ typedef struct { int8_t dy; } report_pmw3320_t; -const pointing_device_driver_t pmw3320_pointing_device_driver; +extern const pointing_device_driver_t pmw3320_pointing_device_driver; // A bunch of functions to implement the PMW3320-specific serial protocol. // Mostly taken from ADNS5050 driver. diff --git a/drivers/sensors/pmw33xx_common.h b/drivers/sensors/pmw33xx_common.h index 8fb10b1b2f..ff890f49a9 100644 --- a/drivers/sensors/pmw33xx_common.h +++ b/drivers/sensors/pmw33xx_common.h @@ -106,7 +106,7 @@ STATIC_ASSERT(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.motio #define pmw3360_pointing_device_driver pmw33xx_pointing_device_driver; #define pmw3389_pointing_device_driver pmw33xx_pointing_device_driver; -const pointing_device_driver_t pmw33xx_pointing_device_driver; +extern const pointing_device_driver_t pmw33xx_pointing_device_driver; /** * @brief Initializes the given sensor so it is in a working state and ready to diff --git a/keyboards/bajjak/bajjak.c b/keyboards/bajjak/bajjak.c index aadeb0415a..17d9165232 100644 --- a/keyboards/bajjak/bajjak.c +++ b/keyboards/bajjak/bajjak.c @@ -21,6 +21,10 @@ along with this program. If not, see . #include "bajjak.h" +bool bajjak_left_led_1 = 0; +bool bajjak_left_led_2 = 0; +bool bajjak_left_led_3 = 0; + extern inline void bajjak_board_led_on(void); extern inline void bajjak_right_led_1_on(void); extern inline void bajjak_right_led_2_on(void); diff --git a/keyboards/bajjak/bajjak.h b/keyboards/bajjak/bajjak.h index cd4ae50053..f3acb54f59 100644 --- a/keyboards/bajjak/bajjak.h +++ b/keyboards/bajjak/bajjak.h @@ -66,9 +66,9 @@ inline void bajjak_right_led_3_off(void) { gpio_set_pin_input(B7); gpio_write_ inline void bajjak_right_led_off(uint8_t led) { gpio_set_pin_input(led+4); gpio_write_pin_low(led+4); } #ifdef LEFT_LEDS -bool bajjak_left_led_1; -bool bajjak_left_led_2; -bool bajjak_left_led_3; +extern bool bajjak_left_led_1; +extern bool bajjak_left_led_2; +extern bool bajjak_left_led_3; inline void bajjak_left_led_1_on(void) { bajjak_left_led_1 = 1; } inline void bajjak_left_led_2_on(void) { bajjak_left_led_2 = 1; } diff --git a/keyboards/hardwareabstraction/handwire/handwire.c b/keyboards/hardwareabstraction/handwire/handwire.c index b31c0a7091..758cfd8885 100644 --- a/keyboards/hardwareabstraction/handwire/handwire.c +++ b/keyboards/hardwareabstraction/handwire/handwire.c @@ -132,7 +132,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { // Variables for display layer and haptic status on OLED static uint8_t layer = 0; -haptic_config_t haptic_config; +extern haptic_config_t haptic_config; // Variables for frames, timer, and sleep uint32_t anim_timer = 0; diff --git a/keyboards/sekigon/grs_70ec/matrix.c b/keyboards/sekigon/grs_70ec/matrix.c index 926ed6f813..718423e57b 100644 --- a/keyboards/sekigon/grs_70ec/matrix.c +++ b/keyboards/sekigon/grs_70ec/matrix.c @@ -40,7 +40,7 @@ extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values // row offsets for each hand -uint8_t thisHand, thatHand; +static uint8_t thisHand, thatHand; // user-defined overridable functions __attribute__((weak)) void matrix_slave_scan_user(void) {} diff --git a/keyboards/system76/launch_1/launch_1.c b/keyboards/system76/launch_1/launch_1.c index c01fb7b01d..2cff70076e 100644 --- a/keyboards/system76/launch_1/launch_1.c +++ b/keyboards/system76/launch_1/launch_1.c @@ -124,7 +124,7 @@ void system76_ec_rgb_layer(layer_state_t layer_state); void system76_ec_unlock(void); bool system76_ec_is_unlocked(void); -rgb_config_t layer_rgb[DYNAMIC_KEYMAP_LAYER_COUNT]; +extern rgb_config_t layer_rgb[DYNAMIC_KEYMAP_LAYER_COUNT]; void matrix_init_kb(void) { usb_mux_init(); diff --git a/keyboards/system76/launch_1/rgb_matrix_kb.inc b/keyboards/system76/launch_1/rgb_matrix_kb.inc index abde7aae19..6ac7970ccd 100644 --- a/keyboards/system76/launch_1/rgb_matrix_kb.inc +++ b/keyboards/system76/launch_1/rgb_matrix_kb.inc @@ -69,7 +69,7 @@ static bool active_keys(effect_params_t* params) { return led_max < RGB_MATRIX_LED_COUNT; } -rgb_t raw_rgb_data[RGB_MATRIX_LED_COUNT] = {0}; +extern rgb_t raw_rgb_data[RGB_MATRIX_LED_COUNT]; static uint8_t normalize_component(uint8_t component) { uint16_t x = (uint16_t)component; diff --git a/keyboards/system76/system76_ec.c b/keyboards/system76/system76_ec.c index cce60a5dea..db0401a7d4 100644 --- a/keyboards/system76/system76_ec.c +++ b/keyboards/system76/system76_ec.c @@ -135,7 +135,7 @@ static enum rgb_matrix_effects mode_map[] = { _Static_assert(sizeof(mode_map) == MODE_LAST, "mode_map_length"); -rgb_t raw_rgb_data[RGB_MATRIX_LED_COUNT]; +rgb_t raw_rgb_data[RGB_MATRIX_LED_COUNT] = {0}; // clang-format off rgb_config_t layer_rgb[DYNAMIC_KEYMAP_LAYER_COUNT] = { diff --git a/keyboards/work_louder/rgb_functions.c b/keyboards/work_louder/rgb_functions.c index b0d89d8511..1ea9afc42a 100644 --- a/keyboards/work_louder/rgb_functions.c +++ b/keyboards/work_louder/rgb_functions.c @@ -25,6 +25,7 @@ #define ws2812_set_color ws2812_rgb_set_color #define ws2812_set_color_all ws2812_rgb_set_color_all #define ws2812_flush ws2812_rgb_flush +#define ws2812_leds ws2812_rgb_leds #include "ws2812_bitbang.c" diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 4e223f0c9a..247b737331 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -371,8 +371,9 @@ void audio_play_melody(float (*np)[][2], uint16_t n_count, bool n_repeat) { melody_current_note_duration = audio_duration_to_ms((*notes_pointer)[current_note][1]); } -float click[2][2]; -void audio_play_click(uint16_t delay, float pitch, uint16_t duration) { +void audio_play_click(uint16_t delay, float pitch, uint16_t duration) { + static float click[2][2]; + uint16_t duration_tone = audio_ms_to_duration(duration); uint16_t duration_delay = audio_ms_to_duration(delay); From 8ff7b1de11dc9c095f3eb37f1ace24af136df144 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 8 Jul 2025 05:12:11 +1000 Subject: [PATCH 478/592] [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 4d1e727928..0c26ec6248 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 e19991ec461406da102a83f99bd518122e5cba3c Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Mon, 7 Jul 2025 15:14:12 -0400 Subject: [PATCH 479/592] [Keyboard] Add CSTC40 rev3 (#25285) * refactor cstc40, add rev3 fxtwink variant * cleanup readmes * readme nitpick * add cstc40 aliases * format-json * add communty_layouts per code review * touch copied legacy files for newline * fix LED flags * update readme files per code review --- data/mappings/keyboard_aliases.hjson | 6 + .../cstc40/daughterboard/keyboard.json | 6 - keyboards/kprepublic/cstc40/info.json | 170 +++++++----------- keyboards/kprepublic/cstc40/readme.md | 31 ++-- .../kprepublic/cstc40/{ => rev1}/config.h | 0 .../kprepublic/cstc40/{ => rev1}/halconf.h | 2 +- .../kprepublic/cstc40/rev1/keyboard.json | 63 +++++++ .../kprepublic/cstc40/{ => rev1}/mcuconf.h | 2 +- keyboards/kprepublic/cstc40/rev1/readme.md | 27 +++ .../daughterboard.c => rev1/rev1.c} | 2 +- keyboards/kprepublic/cstc40/rev2/config.h | 9 + keyboards/kprepublic/cstc40/rev2/halconf.h | 20 +++ .../kprepublic/cstc40/rev2/keyboard.json | 63 +++++++ keyboards/kprepublic/cstc40/rev2/mcuconf.h | 21 +++ keyboards/kprepublic/cstc40/rev2/readme.md | 29 +++ .../{single_pcb/single_pcb.c => rev2/rev2.c} | 2 +- .../kprepublic/cstc40/rev3/keyboard.json | 67 +++++++ keyboards/kprepublic/cstc40/rev3/readme.md | 27 +++ .../cstc40/single_pcb/keyboard.json | 6 - 19 files changed, 412 insertions(+), 141 deletions(-) delete mode 100644 keyboards/kprepublic/cstc40/daughterboard/keyboard.json rename keyboards/kprepublic/cstc40/{ => rev1}/config.h (100%) rename keyboards/kprepublic/cstc40/{ => rev1}/halconf.h (96%) create mode 100644 keyboards/kprepublic/cstc40/rev1/keyboard.json rename keyboards/kprepublic/cstc40/{ => rev1}/mcuconf.h (96%) create mode 100644 keyboards/kprepublic/cstc40/rev1/readme.md rename keyboards/kprepublic/cstc40/{daughterboard/daughterboard.c => rev1/rev1.c} (99%) create mode 100644 keyboards/kprepublic/cstc40/rev2/config.h create mode 100644 keyboards/kprepublic/cstc40/rev2/halconf.h create mode 100644 keyboards/kprepublic/cstc40/rev2/keyboard.json create mode 100644 keyboards/kprepublic/cstc40/rev2/mcuconf.h create mode 100644 keyboards/kprepublic/cstc40/rev2/readme.md rename keyboards/kprepublic/cstc40/{single_pcb/single_pcb.c => rev2/rev2.c} (99%) create mode 100644 keyboards/kprepublic/cstc40/rev3/keyboard.json create mode 100644 keyboards/kprepublic/cstc40/rev3/readme.md delete mode 100644 keyboards/kprepublic/cstc40/single_pcb/keyboard.json diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index f00be05254..b7722092ba 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -1860,6 +1860,12 @@ "kin80": { "target": "kin80/blackpill401" }, + "kprepublic/cstc40/daughterboard": { + "target": "kprepublic/cstc40/rev1" + }, + "kprepublic/cstc40/single_pcb": { + "target": "kprepublic/cstc40/rev2" + }, "kumaokobo/kudox_full": { "target": "kumaokobo/kudox_full/rev1" }, diff --git a/keyboards/kprepublic/cstc40/daughterboard/keyboard.json b/keyboards/kprepublic/cstc40/daughterboard/keyboard.json deleted file mode 100644 index cdba7942df..0000000000 --- a/keyboards/kprepublic/cstc40/daughterboard/keyboard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "matrix_pins": { - "cols": ["B15", "B14", "B13", "B10", "B12", "A5", "C4", "A7", "A15", "C10", "C11", "C0"], - "rows": ["B1", "B0", "C5", "A6"] - } -} \ No newline at end of file diff --git a/keyboards/kprepublic/cstc40/info.json b/keyboards/kprepublic/cstc40/info.json index 8e4e640b7e..83a653cc1c 100644 --- a/keyboards/kprepublic/cstc40/info.json +++ b/keyboards/kprepublic/cstc40/info.json @@ -2,9 +2,7 @@ "manufacturer": "kprepublic", "keyboard_name": "cstc40", "maintainer": "itsvar8", - "bootloader": "stm32-dfu", "diode_direction": "ROW2COL", - "debounce": 2, "features": { "bootmagic": true, "extrakey": true, @@ -14,63 +12,9 @@ }, "processor": "STM32F401", "usb": { - "device_version": "1.0.0", "pid": "0x0040", "vid": "0x586A" }, - "layouts": { - "LAYOUT_planck_mit": { - "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": [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 }, - { "matrix": [1, 4], "x": 4, "y": 1 }, - { "matrix": [1, 5], "x": 5, "y": 1 }, - { "matrix": [1, 6], "x": 6, "y": 1 }, - { "matrix": [1, 7], "x": 7, "y": 1 }, - { "matrix": [1, 8], "x": 8, "y": 1 }, - { "matrix": [1, 9], "x": 9, "y": 1 }, - { "matrix": [1, 10], "x": 10, "y": 1 }, - { "matrix": [1, 11], "x": 11, "y": 1 }, - { "matrix": [2, 0], "x": 0, "y": 2 }, - { "matrix": [2, 1], "x": 1, "y": 2 }, - { "matrix": [2, 2], "x": 2, "y": 2 }, - { "matrix": [2, 3], "x": 3, "y": 2 }, - { "matrix": [2, 4], "x": 4, "y": 2 }, - { "matrix": [2, 5], "x": 5, "y": 2 }, - { "matrix": [2, 6], "x": 6, "y": 2 }, - { "matrix": [2, 7], "x": 7, "y": 2 }, - { "matrix": [2, 8], "x": 8, "y": 2 }, - { "matrix": [2, 9], "x": 9, "y": 2 }, - { "matrix": [2, 10], "x": 10, "y": 2 }, - { "matrix": [2, 11], "x": 11, "y": 2 }, - { "matrix": [3, 0], "x": 0, "y": 3 }, - { "matrix": [3, 1], "x": 1, "y": 3 }, - { "matrix": [3, 2], "x": 2, "y": 3 }, - { "matrix": [3, 3], "x": 3, "y": 3 }, - { "matrix": [3, 4], "x": 4, "y": 3 }, - { "matrix": [3, 5], "w": 2, "x": 5, "y": 3 }, - { "matrix": [3, 7], "x": 7, "y": 3 }, - { "matrix": [3, 8], "x": 8, "y": 3 }, - { "matrix": [3, 9], "x": 9, "y": 3 }, - { "matrix": [3, 10], "x": 10, "y": 3 }, - { "matrix": [3, 11], "x": 11, "y": 3 } - ] - } - }, "rgb_matrix": { "animations": { "alphas_mods": true, @@ -94,6 +38,7 @@ "dual_beacon": true, "rainbow_beacon": true, "rainbow_pinwheels": true, + "flower_blooming": true, "raindrops": true, "jellybean_raindrops": true, "hue_breathing": true, @@ -115,59 +60,66 @@ "splash": true, "multisplash": true, "solid_splash": true, - "solid_multisplash": true + "solid_multisplash": true, + "starlight": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "riverflow": true }, - "driver": "is31fl3733", - "layout": [ - {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, - {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, - {"matrix": [0, 2], "x": 40, "y": 0, "flags": 4}, - {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, - {"matrix": [0, 4], "x": 81, "y": 0, "flags": 4}, - {"matrix": [0, 5], "x": 101, "y": 0, "flags": 4}, - {"matrix": [0, 6], "x": 122, "y": 0, "flags": 4}, - {"matrix": [0, 7], "x": 142, "y": 0, "flags": 4}, - {"matrix": [0, 8], "x": 162, "y": 0, "flags": 4}, - {"matrix": [0, 9], "x": 183, "y": 0, "flags": 4}, - {"matrix": [0, 10], "x": 203, "y": 0, "flags": 4}, - {"matrix": [0, 11], "x": 224, "y": 0, "flags": 1}, - {"matrix": [1, 0], "x": 0, "y": 21, "flags": 1}, - {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, - {"matrix": [1, 2], "x": 40, "y": 21, "flags": 4}, - {"matrix": [1, 3], "x": 61, "y": 21, "flags": 4}, - {"matrix": [1, 4], "x": 81, "y": 21, "flags": 4}, - {"matrix": [1, 5], "x": 101, "y": 21, "flags": 4}, - {"matrix": [1, 6], "x": 122, "y": 21, "flags": 4}, - {"matrix": [1, 7], "x": 142, "y": 21, "flags": 4}, - {"matrix": [1, 8], "x": 162, "y": 21, "flags": 4}, - {"matrix": [1, 9], "x": 183, "y": 21, "flags": 4}, - {"matrix": [1, 10], "x": 203, "y": 21, "flags": 4}, - {"matrix": [1, 11], "x": 224, "y": 21, "flags": 1}, - {"matrix": [2, 0], "x": 0, "y": 42, "flags": 1}, - {"matrix": [2, 1], "x": 20, "y": 42, "flags": 4}, - {"matrix": [2, 2], "x": 40, "y": 42, "flags": 4}, - {"matrix": [2, 3], "x": 61, "y": 42, "flags": 4}, - {"matrix": [2, 4], "x": 81, "y": 42, "flags": 4}, - {"matrix": [2, 5], "x": 101, "y": 42, "flags": 4}, - {"matrix": [2, 6], "x": 122, "y": 42, "flags": 4}, - {"matrix": [2, 7], "x": 142, "y": 42, "flags": 4}, - {"matrix": [2, 8], "x": 162, "y": 42, "flags": 4}, - {"matrix": [2, 9], "x": 183, "y": 42, "flags": 4}, - {"matrix": [2, 10], "x": 203, "y": 42, "flags": 4}, - {"matrix": [2, 11], "x": 224, "y": 42, "flags": 1}, - {"matrix": [3, 0], "x": 0, "y": 64, "flags": 1}, - {"matrix": [3, 1], "x": 20, "y": 64, "flags": 1}, - {"matrix": [3, 2], "x": 40, "y": 64, "flags": 1}, - {"matrix": [3, 3], "x": 61, "y": 64, "flags": 1}, - {"matrix": [3, 4], "x": 81, "y": 64, "flags": 1}, - {"matrix": [3, 5], "x": 111, "y": 64, "flags": 1}, - {"matrix": [3, 7], "x": 142, "y": 64, "flags": 1}, - {"matrix": [3, 8], "x": 162, "y": 64, "flags": 1}, - {"matrix": [3, 9], "x": 183, "y": 64, "flags": 1}, - {"matrix": [3, 10], "x": 203, "y": 64, "flags": 1}, - {"matrix": [3, 11], "x": 224, "y": 64, "flags": 1} - ], - "max_brightness": 200, "sleep": true + }, + "community_layouts": ["planck_mit"], + "layouts": { + "LAYOUT_planck_mit": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2}, + {"matrix": [2, 11], "x": 11, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3, "w": 2}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3}, + {"matrix": [3, 9], "x": 9, "y": 3}, + {"matrix": [3, 10], "x": 10, "y": 3}, + {"matrix": [3, 11], "x": 11, "y": 3} + ] + } } -} \ No newline at end of file +} diff --git a/keyboards/kprepublic/cstc40/readme.md b/keyboards/kprepublic/cstc40/readme.md index 211c078cc2..e6493b28a0 100644 --- a/keyboards/kprepublic/cstc40/readme.md +++ b/keyboards/kprepublic/cstc40/readme.md @@ -1,26 +1,25 @@ -# cstc40 +# CSTC40 -A 40% hotswap ortholinear RGB keyboard from KP Republic. +## This keyboard has 3 known hardware revisions, please be sure to flash the correct firmware for your PCB -* Keyboard Maintainer: [Var](https://github.com/itsvar8) -* Hardware Supported: CSTC40 -* Hardware Availability: kprepublic.com +A 40% hotswap ortholinear RGB keyboard from KP Republic -The differences between the two versions are just the rows and columns pins and the additional small pcb for the daughterboard version. +### Revision 1: "daughterboard" -Make example for this keyboard (after setting up your build environment): +* STM32F402RCT6 MCU with IS31FL3733 LED driver, using `stm32-dfu` bootloader. Uses a separate daughterboard for USB connection. - for daughterboard version: make kprepublic/cstc40/daughterboard:default - for single pcb version: make kprepublic/cstc40/single_pcb:default +* Upon entering bootloader mode QMK Toolbox will display this message: +`STM32 DFU device connected (WinUSB): STMicroelectronics STM32 BOOTLOADER (0483:DF11:2200)` -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). +### Revision 2: "single pcb" -## Bootloader +* STM32F402RCT6 MCU with IS31FL3733 LED driver, using `stm32-dfu` bootloader. Integrated USB connection. -Enter the bootloader in 3 ways: +* Upon entering bootloader mode QMK Toolbox will display this message: +`STM32 DFU device connected (WinUSB): STMicroelectronics STM32 BOOTLOADER (0483:DF11:2200)` -* **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 +### Revision 3: "FXTwink single pcb" -The single_pcb uses pin A10, which apparently is a design flaw that prevent the bootloader to start every time - https://docs.qmk.fm/#/platformdev_blackpill_f4x1?id=pins-to-be-avoided. There is a simple workaround that works most of the time - press the pin key (generally the letter R) during the boot. +* STM32F402RCT6 MCU without separate LED driver, using `tinyuf2` bootloader. Integrated USB connection. + +* Upon entering bootloader mode the board will appear in your computer's file system as a new USB mass storage device. diff --git a/keyboards/kprepublic/cstc40/config.h b/keyboards/kprepublic/cstc40/rev1/config.h similarity index 100% rename from keyboards/kprepublic/cstc40/config.h rename to keyboards/kprepublic/cstc40/rev1/config.h diff --git a/keyboards/kprepublic/cstc40/halconf.h b/keyboards/kprepublic/cstc40/rev1/halconf.h similarity index 96% rename from keyboards/kprepublic/cstc40/halconf.h rename to keyboards/kprepublic/cstc40/rev1/halconf.h index 0f279040aa..049b29a046 100644 --- a/keyboards/kprepublic/cstc40/halconf.h +++ b/keyboards/kprepublic/cstc40/rev1/halconf.h @@ -17,4 +17,4 @@ #define HAL_USE_I2C TRUE -#include_next \ No newline at end of file +#include_next diff --git a/keyboards/kprepublic/cstc40/rev1/keyboard.json b/keyboards/kprepublic/cstc40/rev1/keyboard.json new file mode 100644 index 0000000000..9574e0bd22 --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev1/keyboard.json @@ -0,0 +1,63 @@ +{ + "bootloader": "stm32-dfu", + "matrix_pins": { + "cols": ["B15", "B14", "B13", "B10", "B12", "A5", "C4", "A7", "A15", "C10", "C11", "C0"], + "rows": ["B1", "B0", "C5", "A6"] + }, + "rgb_matrix": { + "driver": "is31fl3733", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 40, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 81, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 101, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 122, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 142, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 162, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 183, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 203, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 224, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 1}, + {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 40, "y": 21, "flags": 4}, + {"matrix": [1, 3], "x": 61, "y": 21, "flags": 4}, + {"matrix": [1, 4], "x": 81, "y": 21, "flags": 4}, + {"matrix": [1, 5], "x": 101, "y": 21, "flags": 4}, + {"matrix": [1, 6], "x": 122, "y": 21, "flags": 4}, + {"matrix": [1, 7], "x": 142, "y": 21, "flags": 4}, + {"matrix": [1, 8], "x": 162, "y": 21, "flags": 4}, + {"matrix": [1, 9], "x": 183, "y": 21, "flags": 4}, + {"matrix": [1, 10], "x": 203, "y": 21, "flags": 4}, + {"matrix": [1, 11], "x": 224, "y": 21, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 1}, + {"matrix": [2, 1], "x": 20, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 40, "y": 42, "flags": 4}, + {"matrix": [2, 3], "x": 61, "y": 42, "flags": 4}, + {"matrix": [2, 4], "x": 81, "y": 42, "flags": 4}, + {"matrix": [2, 5], "x": 101, "y": 42, "flags": 4}, + {"matrix": [2, 6], "x": 122, "y": 42, "flags": 4}, + {"matrix": [2, 7], "x": 142, "y": 42, "flags": 4}, + {"matrix": [2, 8], "x": 162, "y": 42, "flags": 4}, + {"matrix": [2, 9], "x": 183, "y": 42, "flags": 4}, + {"matrix": [2, 10], "x": 203, "y": 42, "flags": 4}, + {"matrix": [2, 11], "x": 224, "y": 42, "flags": 1}, + {"matrix": [3, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [3, 1], "x": 20, "y": 64, "flags": 1}, + {"matrix": [3, 2], "x": 40, "y": 64, "flags": 1}, + {"matrix": [3, 3], "x": 61, "y": 64, "flags": 1}, + {"matrix": [3, 4], "x": 81, "y": 64, "flags": 1}, + {"matrix": [3, 5], "x": 111, "y": 64, "flags": 1}, + {"matrix": [3, 7], "x": 142, "y": 64, "flags": 1}, + {"matrix": [3, 8], "x": 162, "y": 64, "flags": 1}, + {"matrix": [3, 9], "x": 183, "y": 64, "flags": 1}, + {"matrix": [3, 10], "x": 203, "y": 64, "flags": 1}, + {"matrix": [3, 11], "x": 224, "y": 64, "flags": 1} + ], + "max_brightness": 200 + }, + "usb": { + "device_version": "1.0.0" + } +} diff --git a/keyboards/kprepublic/cstc40/mcuconf.h b/keyboards/kprepublic/cstc40/rev1/mcuconf.h similarity index 96% rename from keyboards/kprepublic/cstc40/mcuconf.h rename to keyboards/kprepublic/cstc40/rev1/mcuconf.h index a56e52fb8d..563b86d26d 100644 --- a/keyboards/kprepublic/cstc40/mcuconf.h +++ b/keyboards/kprepublic/cstc40/rev1/mcuconf.h @@ -18,4 +18,4 @@ #include_next #undef STM32_I2C_USE_I2C1 -#define STM32_I2C_USE_I2C1 TRUE \ No newline at end of file +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/kprepublic/cstc40/rev1/readme.md b/keyboards/kprepublic/cstc40/rev1/readme.md new file mode 100644 index 0000000000..1d688bc977 --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev1/readme.md @@ -0,0 +1,27 @@ +# Rev 1 + +A 40% hotswap ortholinear RGB keyboard from KP Republic. + +* **Revision 1: "daughterboard"** +* Keyboard Maintainer: [Var](https://github.com/itsvar8) +* Hardware Supported: CSTC40 rev1 +* STM32F402RCT6 MCU with IS31FL3733 LED driver and using `stm32-dfu` bootloader. Uses a separate daughterboard for USB connection. +* Hardware Availability: kprepublic.com + +Make example for this keyboard (after setting up your build environment): + + make kprepublic/cstc40/rev1:default + +Flashing example for this keyboard: + + make kprepublic/cstc40/rev1: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/kprepublic/cstc40/daughterboard/daughterboard.c b/keyboards/kprepublic/cstc40/rev1/rev1.c similarity index 99% rename from keyboards/kprepublic/cstc40/daughterboard/daughterboard.c rename to keyboards/kprepublic/cstc40/rev1/rev1.c index 38fac99155..db063d3eba 100644 --- a/keyboards/kprepublic/cstc40/daughterboard/daughterboard.c +++ b/keyboards/kprepublic/cstc40/rev1/rev1.c @@ -68,4 +68,4 @@ const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { { 0, SW3_CS11, SW2_CS11, SW1_CS11 }, { 0, SW3_CS12, SW2_CS12, SW1_CS12 } }; -#endif \ No newline at end of file +#endif diff --git a/keyboards/kprepublic/cstc40/rev2/config.h b/keyboards/kprepublic/cstc40/rev2/config.h new file mode 100644 index 0000000000..4f845a84af --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev2/config.h @@ -0,0 +1,9 @@ +// Copyright 2022 Var (@itsvar8) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define I2C1_SDA_PIN B9 +#define I2C1_SCL_PIN B8 + +#define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND diff --git a/keyboards/kprepublic/cstc40/rev2/halconf.h b/keyboards/kprepublic/cstc40/rev2/halconf.h new file mode 100644 index 0000000000..049b29a046 --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev2/halconf.h @@ -0,0 +1,20 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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_I2C TRUE + +#include_next diff --git a/keyboards/kprepublic/cstc40/rev2/keyboard.json b/keyboards/kprepublic/cstc40/rev2/keyboard.json new file mode 100644 index 0000000000..7516bfc205 --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev2/keyboard.json @@ -0,0 +1,63 @@ +{ + "bootloader": "stm32-dfu", + "matrix_pins": { + "cols": ["C7", "C8", "C9", "A8", "A10", "B10", "A15", "C13", "B6", "B5", "B4", "B3"], + "rows": ["C12", "C10", "C11", "B0"] + }, + "rgb_matrix": { + "driver": "is31fl3733", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 40, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 81, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 101, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 122, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 142, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 162, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 183, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 203, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 224, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 1}, + {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 40, "y": 21, "flags": 4}, + {"matrix": [1, 3], "x": 61, "y": 21, "flags": 4}, + {"matrix": [1, 4], "x": 81, "y": 21, "flags": 4}, + {"matrix": [1, 5], "x": 101, "y": 21, "flags": 4}, + {"matrix": [1, 6], "x": 122, "y": 21, "flags": 4}, + {"matrix": [1, 7], "x": 142, "y": 21, "flags": 4}, + {"matrix": [1, 8], "x": 162, "y": 21, "flags": 4}, + {"matrix": [1, 9], "x": 183, "y": 21, "flags": 4}, + {"matrix": [1, 10], "x": 203, "y": 21, "flags": 4}, + {"matrix": [1, 11], "x": 224, "y": 21, "flags": 1}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 1}, + {"matrix": [2, 1], "x": 20, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 40, "y": 42, "flags": 4}, + {"matrix": [2, 3], "x": 61, "y": 42, "flags": 4}, + {"matrix": [2, 4], "x": 81, "y": 42, "flags": 4}, + {"matrix": [2, 5], "x": 101, "y": 42, "flags": 4}, + {"matrix": [2, 6], "x": 122, "y": 42, "flags": 4}, + {"matrix": [2, 7], "x": 142, "y": 42, "flags": 4}, + {"matrix": [2, 8], "x": 162, "y": 42, "flags": 4}, + {"matrix": [2, 9], "x": 183, "y": 42, "flags": 4}, + {"matrix": [2, 10], "x": 203, "y": 42, "flags": 4}, + {"matrix": [2, 11], "x": 224, "y": 42, "flags": 1}, + {"matrix": [3, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [3, 1], "x": 20, "y": 64, "flags": 1}, + {"matrix": [3, 2], "x": 40, "y": 64, "flags": 1}, + {"matrix": [3, 3], "x": 61, "y": 64, "flags": 1}, + {"matrix": [3, 4], "x": 81, "y": 64, "flags": 1}, + {"matrix": [3, 5], "x": 111, "y": 64, "flags": 1}, + {"matrix": [3, 7], "x": 142, "y": 64, "flags": 1}, + {"matrix": [3, 8], "x": 162, "y": 64, "flags": 1}, + {"matrix": [3, 9], "x": 183, "y": 64, "flags": 1}, + {"matrix": [3, 10], "x": 203, "y": 64, "flags": 1}, + {"matrix": [3, 11], "x": 224, "y": 64, "flags": 1} + ], + "max_brightness": 200 + }, + "usb": { + "device_version": "2.0.0" + } +} diff --git a/keyboards/kprepublic/cstc40/rev2/mcuconf.h b/keyboards/kprepublic/cstc40/rev2/mcuconf.h new file mode 100644 index 0000000000..563b86d26d --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev2/mcuconf.h @@ -0,0 +1,21 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/kprepublic/cstc40/rev2/readme.md b/keyboards/kprepublic/cstc40/rev2/readme.md new file mode 100644 index 0000000000..8f6b27ed8e --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev2/readme.md @@ -0,0 +1,29 @@ +# Rev 2 + +A 40% hotswap ortholinear RGB keyboard from KP Republic. + +* **Revision 2: "single pcb"** +* Keyboard Maintainer: [Var](https://github.com/itsvar8) +* Hardware Supported: CSTC40 rev2 +* STM32F402RCT6 MCU with IS31FL3733 LED driver and using `stm32-dfu` bootloader. Integrated USB connection. +* Hardware Availability: kprepublic.com + +Make example for this keyboard (after setting up your build environment): + + make kprepublic/cstc40/rev2:default + +Flashing example for this keyboard: + + make kprepublic/cstc40/rev2: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 + +The rev 2 uses pin `A10` in the key matrix, which apparently is a design flaw that may prevent the bootloader from entering the proper mode for DFU flashing - . There is a simple workaround that works most of the time - press the pin key (generally the letter R) during the boot. diff --git a/keyboards/kprepublic/cstc40/single_pcb/single_pcb.c b/keyboards/kprepublic/cstc40/rev2/rev2.c similarity index 99% rename from keyboards/kprepublic/cstc40/single_pcb/single_pcb.c rename to keyboards/kprepublic/cstc40/rev2/rev2.c index 38fac99155..db063d3eba 100644 --- a/keyboards/kprepublic/cstc40/single_pcb/single_pcb.c +++ b/keyboards/kprepublic/cstc40/rev2/rev2.c @@ -68,4 +68,4 @@ const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { { 0, SW3_CS11, SW2_CS11, SW1_CS11 }, { 0, SW3_CS12, SW2_CS12, SW1_CS12 } }; -#endif \ No newline at end of file +#endif diff --git a/keyboards/kprepublic/cstc40/rev3/keyboard.json b/keyboards/kprepublic/cstc40/rev3/keyboard.json new file mode 100644 index 0000000000..2748a6f1fc --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev3/keyboard.json @@ -0,0 +1,67 @@ +{ + "maintainer": "ClownFish", + "bootloader": "tinyuf2", + "matrix_pins": { + "cols": ["A4", "A5", "A6", "A7", "C4", "C5", "A8", "A15", "C10", "C11", "C12", "D2"], + "rows": ["B12", "B1", "B0", "C13"] + }, + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [3, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [3, 1], "x": 20, "y": 64, "flags": 1}, + {"matrix": [3, 2], "x": 41, "y": 64, "flags": 1}, + {"matrix": [3, 3], "x": 61, "y": 64, "flags": 1}, + {"matrix": [3, 4], "x": 82, "y": 64, "flags": 1}, + {"matrix": [3, 5], "x": 112, "y": 64, "flags": 1}, + {"matrix": [3, 7], "x": 142, "y": 64, "flags": 1}, + {"matrix": [3, 8], "x": 163, "y": 64, "flags": 1}, + {"matrix": [3, 9], "x": 183, "y": 64, "flags": 1}, + {"matrix": [3, 10], "x": 204, "y": 64, "flags": 1}, + {"matrix": [3, 11], "x": 224, "y": 64, "flags": 1}, + {"matrix": [2, 11], "x": 224, "y": 43, "flags": 1}, + {"matrix": [2, 10], "x": 204, "y": 43, "flags": 4}, + {"matrix": [2, 9], "x": 183, "y": 43, "flags": 4}, + {"matrix": [2, 8], "x": 163, "y": 43, "flags": 4}, + {"matrix": [2, 7], "x": 142, "y": 43, "flags": 4}, + {"matrix": [2, 6], "x": 122, "y": 43, "flags": 4}, + {"matrix": [2, 5], "x": 102, "y": 43, "flags": 4}, + {"matrix": [2, 4], "x": 82, "y": 43, "flags": 4}, + {"matrix": [2, 3], "x": 61, "y": 43, "flags": 4}, + {"matrix": [2, 2], "x": 41, "y": 43, "flags": 4}, + {"matrix": [2, 1], "x": 20, "y": 43, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 43, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 1}, + {"matrix": [1, 1], "x": 20, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 41, "y": 21, "flags": 4}, + {"matrix": [1, 3], "x": 61, "y": 21, "flags": 4}, + {"matrix": [1, 4], "x": 82, "y": 21, "flags": 4}, + {"matrix": [1, 5], "x": 102, "y": 21, "flags": 4}, + {"matrix": [1, 6], "x": 122, "y": 21, "flags": 4}, + {"matrix": [1, 7], "x": 142, "y": 21, "flags": 4}, + {"matrix": [1, 8], "x": 163, "y": 21, "flags": 4}, + {"matrix": [1, 9], "x": 183, "y": 21, "flags": 4}, + {"matrix": [1, 10], "x": 204, "y": 21, "flags": 4}, + {"matrix": [1, 11], "x": 224, "y": 21, "flags": 1}, + {"matrix": [0, 11], "x": 224, "y": 0, "flags": 1}, + {"matrix": [0, 10], "x": 204, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 183, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 163, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 142, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 122, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 102, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 82, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 41, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1} + ], + "max_brightness": 180 + }, + "usb": { + "device_version": "3.0.0" + }, + "ws2812": { + "pin": "B13" + } +} diff --git a/keyboards/kprepublic/cstc40/rev3/readme.md b/keyboards/kprepublic/cstc40/rev3/readme.md new file mode 100644 index 0000000000..b372c63579 --- /dev/null +++ b/keyboards/kprepublic/cstc40/rev3/readme.md @@ -0,0 +1,27 @@ +# Rev 3 + +A 40% hotswap ortholinear RGB keyboard from KP Republic. + +* **Revision 3: "FXTwink single pcb"** +* Keyboard Maintainer: [ClownFish](https://github.com/clownfish-og) +* Hardware Supported: CSTC40 rev3 +* STM32F402RCT6 MCU without separate LED driver and using `tinyuf2` bootloader. Integrated USB connection. +* Hardware Availability: kprepublic.com + +Make example for this keyboard (after setting up your build environment): + + make kprepublic/cstc40/rev3:default + +Flashing example for this keyboard: + + make kprepublic/cstc40/rev3: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/kprepublic/cstc40/single_pcb/keyboard.json b/keyboards/kprepublic/cstc40/single_pcb/keyboard.json deleted file mode 100644 index 330ada7bac..0000000000 --- a/keyboards/kprepublic/cstc40/single_pcb/keyboard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "matrix_pins": { - "cols": ["C7", "C8", "C9", "A8", "A10", "B10", "A15", "C13", "B6", "B5", "B4", "B3"], - "rows": ["C12", "C10", "C11", "B0"] - } -} \ No newline at end of file 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 480/592] [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 0000000000..2461485e69 --- /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 0000000000..d9c5133b1e --- /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 0000000000..91aaf1d11d --- /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 0000000000..622864bf91 --- /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 0000000000..9be7724be3 --- /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 481/592] [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 4501c4daeb..9e99ef879a 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 bf28a303c6cc66ce06fb30c6de01c0986c808311 Mon Sep 17 00:00:00 2001 From: adophoxia <100170946+adophoxia@users.noreply.github.com> Date: Mon, 7 Jul 2025 22:52:55 -0700 Subject: [PATCH 482/592] Keychron C3 Pro `c3_pro.c` corrections (#25049) * Update `c3_pro.c` * Redo layer switching logic; will default back to 0 if EEPROM reset * Update keyboards/keychron/c3_pro/c3_pro.c Co-authored-by: Joel Challis * Re-re-did layer switching logic * Update GPIO control functions * Apply suggestions from code review Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- keyboards/keychron/c3_pro/c3_pro.c | 71 +++++++++++++----------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/keyboards/keychron/c3_pro/c3_pro.c b/keyboards/keychron/c3_pro/c3_pro.c index 905eb86f5a..0c584b0938 100644 --- a/keyboards/keychron/c3_pro/c3_pro.c +++ b/keyboards/keychron/c3_pro/c3_pro.c @@ -16,6 +16,26 @@ #include "c3_pro.h" +void keyboard_post_init_kb(void) { + gpio_set_pin_output_push_pull(LED_MAC_OS_PIN); + gpio_set_pin_output_push_pull(LED_WIN_OS_PIN); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + + keyboard_post_init_user(); +} + +void housekeeping_task_kb(void) { + if (get_highest_layer(default_layer_state) == 0) { + gpio_write_pin(LED_MAC_OS_PIN, LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + } + if (get_highest_layer(default_layer_state) == 2) { + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_WIN_OS_PIN, LED_OS_PIN_ON_STATE); + } +} + bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (!process_record_user(keycode, record)) { return false; @@ -61,9 +81,12 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { #endif case KC_OSSW: if (record->event.pressed) { - default_layer_xor(1U << 0); - default_layer_xor(1U << 2); - eeconfig_update_default_layer(default_layer_state); + // Switches default layer between `MAC_BASE` and `WIN_BASE` (0 and 2) + if (get_highest_layer(default_layer_state) == 2 ) { + set_single_persistent_default_layer(0); + } else { + set_single_persistent_default_layer(2); + } } return false; default: @@ -71,42 +94,8 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { } } -#if defined(RGB_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) - -bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { - if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { - return false; - } - // RGB_MATRIX_INDICATOR_SET_COLOR(index, red, green, blue); - - if (host_keyboard_led_state().caps_lock) { - RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 255, 255, 255); - } else { - if (!rgb_matrix_get_flags()) { - RGB_MATRIX_INDICATOR_SET_COLOR(CAPS_LOCK_LED_INDEX, 0, 0, 0); - } - } - return true; +void suspend_power_down_kb(void) { + gpio_write_pin(LED_WIN_OS_PIN, !LED_OS_PIN_ON_STATE); + gpio_write_pin(LED_MAC_OS_PIN, !LED_OS_PIN_ON_STATE); + suspend_power_down_user(); } - -#endif // RGB_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX - -#if defined(LED_MATRIX_ENABLE) && defined(CAPS_LOCK_LED_INDEX) - -bool led_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { - if (!led_matrix_indicators_advanced_user(led_min, led_max)) { - return false; - } - - if (host_keyboard_led_state().caps_lock) { - led_matrix_set_value(CAPS_LOCK_LED_INDEX, 255); - - } else { - if (!led_matrix_get_flags()) { - led_matrix_set_value(CAPS_LOCK_LED_INDEX, 0); - } - } - return true; -} - -#endif // LED_MATRIX_ENABLE && CAPS_LOCK_LED_INDEX 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 483/592] [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 0000000000..5f4cc71911 --- /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 0000000000..d220b03aa3 --- /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 0000000000..bba641aa0b --- /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 0000000000..0ab54aaaf7 --- /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 0000000000..8de5c0d544 --- /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 0000000000..804fb20521 --- /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 0000000000..ee32568148 --- /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 0000000000..84d7ad06be --- /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 0000000000..ee32568148 --- /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 0000000000..9e7016bfb6 --- /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 0000000000..ee32568148 --- /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 0000000000..a18cc4fe4e --- /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 0000000000..ee32568148 --- /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 0000000000..e0f5ea12cb --- /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 0000000000..ee32568148 --- /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 0000000000..b939e65395 --- /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 0000000000..e6b07fc03b --- /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 0000000000..119397bef0 --- /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 0000000000..0ab54aaaf7 --- /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 484/592] [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 0000000000..ecf3078f4e --- /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 0000000000..44b10cc3c8 --- /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 0000000000..b6ae191db0 --- /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 485/592] [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 0000000000..402c3e016e --- /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 0000000000..b8ebdb3369 --- /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 0000000000..be2fc7358a --- /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 0000000000..5515c3e6d3 --- /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 0000000000..289c4b4e65 --- /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 0000000000..e2884f3828 --- /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 0000000000..886103316f --- /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 486/592] [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 7f17c46748..7e88ff231d 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 8d29bd07c25a6a42e47ddbf918db3773027168f1 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 8 Jul 2025 14:08:49 -0600 Subject: [PATCH 487/592] Refactor `bastardkb/scylla` (#25459) * Refactor bastardkb/scylla - Update keyboard aliases accordingly - Migrate keymap to JSON and better represent physical layout - scylla/blackpill - Migrate common configuration to keyboard level - Remove unnecessary or user-specific configuration - Migrate some configuration to data-driven - Use short SPDX license headers - Remove unnecessary rules.mk file - Formatting pass on keyboard.json - scylla/v1 - Remove likely unneeded version, per qmk#23814 - scylla/v2 - Remove splinky_2 revision, per qmk#23814 - Remove splinky_3, stemcell revisions; converter feature should be used here - Rename scylla/v2/elitec -> scylla/promicro, as a converter can be used for any pin-compatible microcontrollers * Small keymap fix --- data/mappings/keyboard_aliases.hjson | 12 +++ keyboards/bastardkb/scylla/blackpill/config.h | 33 +------ .../bastardkb/scylla/blackpill/halconf.h | 21 +--- .../bastardkb/scylla/blackpill/keyboard.json | 42 +++----- .../bastardkb/scylla/blackpill/mcuconf.h | 23 +---- keyboards/bastardkb/scylla/blackpill/rules.mk | 5 - keyboards/bastardkb/scylla/info.json | 97 ++++++++++++++----- .../bastardkb/scylla/keymaps/default/keymap.c | 51 ---------- .../scylla/keymaps/default/keymap.json | 31 ++++++ .../bastardkb/scylla/promicro/keyboard.json | 15 +++ keyboards/bastardkb/scylla/readme.md | 36 ++++--- keyboards/bastardkb/scylla/scylla.c | 63 ------------ keyboards/bastardkb/scylla/v1/elitec/config.h | 22 ----- .../bastardkb/scylla/v1/elitec/keyboard.json | 31 ------ keyboards/bastardkb/scylla/v1/elitec/rules.mk | 1 - keyboards/bastardkb/scylla/v2/elitec/config.h | 21 ---- .../bastardkb/scylla/v2/elitec/keyboard.json | 31 ------ keyboards/bastardkb/scylla/v2/elitec/rules.mk | 1 - .../bastardkb/scylla/v2/splinky_2/config.h | 31 ------ .../scylla/v2/splinky_2/keyboard.json | 32 ------ .../bastardkb/scylla/v2/splinky_2/readme.md | 5 - .../bastardkb/scylla/v2/splinky_2/rules.mk | 3 - .../bastardkb/scylla/v2/splinky_3/config.h | 31 ------ .../scylla/v2/splinky_3/keyboard.json | 32 ------ .../bastardkb/scylla/v2/splinky_3/readme.md | 5 - .../bastardkb/scylla/v2/splinky_3/rules.mk | 3 - .../bastardkb/scylla/v2/stemcell/config.h | 38 -------- .../bastardkb/scylla/v2/stemcell/halconf.h | 23 ----- .../scylla/v2/stemcell/keyboard.json | 34 ------- .../bastardkb/scylla/v2/stemcell/mcuconf.h | 29 ------ .../bastardkb/scylla/v2/stemcell/rules.mk | 3 - 31 files changed, 174 insertions(+), 631 deletions(-) delete mode 100644 keyboards/bastardkb/scylla/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/scylla/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/scylla/keymaps/default/keymap.json create mode 100644 keyboards/bastardkb/scylla/promicro/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/scylla.c delete mode 100644 keyboards/bastardkb/scylla/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/scylla/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/scylla/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/scylla/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/scylla/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/scylla/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/scylla/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/scylla/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/scylla/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/scylla/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index b7722092ba..42ff5a9912 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -68,6 +68,18 @@ "bakeneko80": { "target": "kkatano/bakeneko80" }, + "bastardkb/scylla/v2/elitec": { + "target": "bastardkb/scylla/promicro" + }, + "bastardkb/scylla/v2/splinky_2": { + "target": "bastardkb/scylla/promicro" + }, + "bastardkb/scylla/v2/splinky_3": { + "target": "bastardkb/scylla/promicro" + }, + "bastardkb/scylla/v2/stemcell": { + "target": "bastardkb/scylla/promicro" + }, "bastardkb/tbkmini/v2/elitec": { "target": "bastardkb/tbkmini/promicro" }, diff --git a/keyboards/bastardkb/scylla/blackpill/config.h b/keyboards/bastardkb/scylla/blackpill/config.h index bf7879edbe..c6b40f3e5f 100644 --- a/keyboards/bastardkb/scylla/blackpill/config.h +++ b/keyboards/bastardkb/scylla/blackpill/config.h @@ -1,27 +1,9 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - /* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 @@ -30,13 +12,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - /* SPI config for EEPROM. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 diff --git a/keyboards/bastardkb/scylla/blackpill/halconf.h b/keyboards/bastardkb/scylla/blackpill/halconf.h index 5c5dff98d4..545fc20cb3 100644 --- a/keyboards/bastardkb/scylla/blackpill/halconf.h +++ b/keyboards/bastardkb/scylla/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/scylla/blackpill/keyboard.json b/keyboards/bastardkb/scylla/blackpill/keyboard.json index 5294976fd3..4bef461b6b 100644 --- a/keyboards/bastardkb/scylla/blackpill/keyboard.json +++ b/keyboards/bastardkb/scylla/blackpill/keyboard.json @@ -1,37 +1,23 @@ { - "keyboard_name": "Scylla Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B0", "B1", "B10", "B3", "B4", "B5"], "rows": ["B15", "A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/scylla/blackpill/mcuconf.h b/keyboards/bastardkb/scylla/blackpill/mcuconf.h index 2b3f30cbfe..cc77ec94ae 100644 --- a/keyboards/bastardkb/scylla/blackpill/mcuconf.h +++ b/keyboards/bastardkb/scylla/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next diff --git a/keyboards/bastardkb/scylla/blackpill/rules.mk b/keyboards/bastardkb/scylla/blackpill/rules.mk deleted file mode 100644 index 48c904dd64..0000000000 --- a/keyboards/bastardkb/scylla/blackpill/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/scylla/info.json b/keyboards/bastardkb/scylla/info.json index 6508c15b5a..7f3619c6d0 100644 --- a/keyboards/bastardkb/scylla/info.json +++ b/keyboards/bastardkb/scylla/info.json @@ -1,23 +1,85 @@ { - "url": "https://bastardkb.com/scylla", - "usb": { - "pid": "0x1829" + "keyboard_name": "Scylla", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true }, "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 2}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 2}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 2}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 2}, + {"matrix": [3, 1], "x": 20, "y": 48, "flags": 4}, + {"matrix": [2, 1], "x": 20, "y": 32, "flags": 4}, + {"matrix": [1, 1], "x": 20, "y": 16, "flags": 4}, + {"matrix": [0, 1], "x": 20, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 41, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 41, "y": 16, "flags": 4}, + {"matrix": [2, 2], "x": 41, "y": 32, "flags": 4}, + {"matrix": [3, 2], "x": 41, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 61, "y": 48, "flags": 4}, + {"matrix": [2, 3], "x": 61, "y": 32, "flags": 4}, + {"matrix": [1, 3], "x": 61, "y": 16, "flags": 4}, + {"matrix": [0, 3], "x": 61, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 81, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 81, "y": 16, "flags": 4}, + {"matrix": [2, 4], "x": 81, "y": 32, "flags": 4}, + {"matrix": [3, 4], "x": 81, "y": 48, "flags": 4}, + {"matrix": [0, 5], "x": 102, "y": 0, "flags": 4}, + {"matrix": [1, 5], "x": 102, "y": 16, "flags": 4}, + {"matrix": [2, 5], "x": 102, "y": 32, "flags": 4}, + {"matrix": [3, 5], "x": 102, "y": 48, "flags": 4}, + {"matrix": [4, 2], "x": 102, "y": 64, "flags": 2}, + {"matrix": [4, 5], "x": 81, "y": 64, "flags": 2}, + {"matrix": [4, 3], "x": 61, "y": 56, "flags": 2}, + {"matrix": [4, 4], "x": 81, "y": 56, "flags": 2}, + {"matrix": [4, 1], "x": 102, "y": 56, "flags": 2}, + {"matrix": [5, 0], "x": 224, "y": 0, "flags": 2}, + {"matrix": [6, 0], "x": 224, "y": 16, "flags": 2}, + {"matrix": [7, 0], "x": 224, "y": 32, "flags": 2}, + {"matrix": [8, 0], "x": 224, "y": 48, "flags": 2}, + {"matrix": [8, 1], "x": 204, "y": 48, "flags": 4}, + {"matrix": [7, 1], "x": 204, "y": 32, "flags": 4}, + {"matrix": [6, 1], "x": 204, "y": 16, "flags": 4}, + {"matrix": [5, 1], "x": 204, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 183, "y": 0, "flags": 4}, + {"matrix": [6, 2], "x": 183, "y": 16, "flags": 4}, + {"matrix": [7, 2], "x": 183, "y": 32, "flags": 4}, + {"matrix": [8, 2], "x": 183, "y": 48, "flags": 4}, + {"matrix": [8, 3], "x": 163, "y": 48, "flags": 4}, + {"matrix": [7, 3], "x": 163, "y": 32, "flags": 4}, + {"matrix": [6, 3], "x": 163, "y": 16, "flags": 4}, + {"matrix": [5, 3], "x": 163, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 142, "y": 0, "flags": 4}, + {"matrix": [6, 4], "x": 142, "y": 16, "flags": 4}, + {"matrix": [7, 4], "x": 142, "y": 32, "flags": 4}, + {"matrix": [8, 4], "x": 142, "y": 48, "flags": 4}, + {"matrix": [5, 5], "x": 122, "y": 0, "flags": 4}, + {"matrix": [6, 5], "x": 122, "y": 16, "flags": 4}, + {"matrix": [7, 5], "x": 122, "y": 32, "flags": 4}, + {"matrix": [8, 5], "x": 122, "y": 48, "flags": 4}, + {"matrix": [9, 2], "x": 122, "y": 64, "flags": 2}, + {"matrix": [9, 5], "x": 142, "y": 64, "flags": 2}, + {"matrix": [9, 3], "x": 163, "y": 56, "flags": 2}, + {"matrix": [9, 4], "x": 142, "y": 56, "flags": 2}, + {"matrix": [9, 1], "x": 122, "y": 56, "flags": 2} + ], "max_brightness": 50, "sleep": true, "split_count": [29, 29] }, - "rgblight": { - "led_count": 58, - "split_count": [29, 29] - }, "split": { - "transport": { - "sync": { - "matrix_state": true - } - } + "enabled": true + }, + "url": "https://github.com/Bastardkb/Scylla", + "usb": { + "device_version": "2.0.0", + "pid": "0x1829" }, "layouts": { "LAYOUT_split_4x6_5": { @@ -28,67 +90,56 @@ {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [5, 5], "x": 11, "y": 0}, {"matrix": [5, 4], "x": 12, "y": 0}, {"matrix": [5, 3], "x": 13, "y": 0}, {"matrix": [5, 2], "x": 14, "y": 0}, {"matrix": [5, 1], "x": 15, "y": 0}, {"matrix": [5, 0], "x": 16, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [6, 5], "x": 11, "y": 1}, {"matrix": [6, 4], "x": 12, "y": 1}, {"matrix": [6, 3], "x": 13, "y": 1}, {"matrix": [6, 2], "x": 14, "y": 1}, {"matrix": [6, 1], "x": 15, "y": 1}, {"matrix": [6, 0], "x": 16, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [7, 5], "x": 11, "y": 2}, {"matrix": [7, 4], "x": 12, "y": 2}, {"matrix": [7, 3], "x": 13, "y": 2}, {"matrix": [7, 2], "x": 14, "y": 2}, {"matrix": [7, 1], "x": 15, "y": 2}, {"matrix": [7, 0], "x": 16, "y": 2}, - {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, {"matrix": [3, 2], "x": 2, "y": 3}, {"matrix": [3, 3], "x": 3, "y": 3}, {"matrix": [3, 4], "x": 4, "y": 3}, {"matrix": [3, 5], "x": 5, "y": 3}, - {"matrix": [8, 5], "x": 11, "y": 3}, {"matrix": [8, 4], "x": 12, "y": 3}, {"matrix": [8, 3], "x": 13, "y": 3}, {"matrix": [8, 2], "x": 14, "y": 3}, {"matrix": [8, 1], "x": 15, "y": 3}, {"matrix": [8, 0], "x": 16, "y": 3}, - {"matrix": [4, 3], "x": 5, "y": 4}, {"matrix": [4, 4], "x": 6, "y": 4}, {"matrix": [4, 1], "x": 7, "y": 4}, - {"matrix": [9, 1], "x": 9, "y": 4}, {"matrix": [9, 4], "x": 10, "y": 4}, {"matrix": [9, 3], "x": 11, "y": 4}, - {"matrix": [4, 5], "x": 6, "y": 5}, {"matrix": [4, 2], "x": 7, "y": 5}, - {"matrix": [9, 2], "x": 9, "y": 5}, {"matrix": [9, 5], "x": 10, "y": 5} ] diff --git a/keyboards/bastardkb/scylla/keymaps/default/keymap.c b/keyboards/bastardkb/scylla/keymaps/default/keymap.c deleted file mode 100644 index 8e9b0190d4..0000000000 --- a/keyboards/bastardkb/scylla/keymaps/default/keymap.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * - * 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 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [0] = LAYOUT_split_4x6_5(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_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - //-------------------------------------------------//-----------------------------------------------------------// - KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, - //-------------------------------------------------//-----------------------------------------------------------// - KC_LCTL, KC_SPC, MO(1), MO(2), KC_ENT, KC_RGUI, KC_HOME, KC_BSPC, KC_DEL, KC_RALT), - - [1] = LAYOUT_split_4x6_5(KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, - //---------------------------------------------------------//-----------------------------------------------------------// - QK_BOOT, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, _______, KC_PLUS, - //---------------------------------------------------------//-----------------------------------------------------------// - _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS, KC_PIPE, - //---------------------------------------------------------//-----------------------------------------------------------// - _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS, - //---------------------------------------------------------//-----------------------------------------------------------// - KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, KC_RGUI, KC_SPC, KC_BSPC, KC_RCTL, KC_ENT), - - [2] = LAYOUT_split_4x6_5(KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - //---------------------------------------------------------//--------------------------------------------------------------// - _______, _______, RM_PREV, RM_TOGG, RM_NEXT, KC_LBRC, KC_RBRC, _______, KC_NUM, KC_INS, KC_SCRL, KC_MUTE, - //---------------------------------------------------------//--------------------------------------------------------------// - _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, KC_LPRN, KC_RPRN, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_VOLU, - //---------------------------------------------------------//--------------------------------------------------------------// - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, - //---------------------------------------------------------//--------------------------------------------------------------// - KC_LCTL, KC_HOME, KC_TRNS, KC_TRNS, KC_RALT, QK_BOOT, KC_SPC, KC_BSPC, KC_RCTL, KC_ENT), -}; diff --git a/keyboards/bastardkb/scylla/keymaps/default/keymap.json b/keyboards/bastardkb/scylla/keymaps/default/keymap.json new file mode 100644 index 0000000000..d06e183517 --- /dev/null +++ b/keyboards/bastardkb/scylla/keymaps/default/keymap.json @@ -0,0 +1,31 @@ +{ + "keyboard": "bastardkb/scylla/promicro", + "keymap": "default", + "layout": "LAYOUT_split_4x6_5", + "layers": [ + [ + "KC_ESC" , "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_GRV" , + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_CAPS", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RGUI", + "KC_LALT", "KC_SPC", "KC_BSPC", "KC_RALT" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/bastardkb/scylla/promicro/keyboard.json b/keyboards/bastardkb/scylla/promicro/keyboard.json new file mode 100644 index 0000000000..89116f7dcd --- /dev/null +++ b/keyboards/bastardkb/scylla/promicro/keyboard.json @@ -0,0 +1,15 @@ +{ + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], + "rows": ["F4", "F7", "C6", "D4", "B5"] + }, + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/scylla/readme.md b/keyboards/bastardkb/scylla/readme.md index 830b8eacda..fd40c418c7 100644 --- a/keyboards/bastardkb/scylla/readme.md +++ b/keyboards/bastardkb/scylla/readme.md @@ -1,29 +1,27 @@ # Scylla -A modern, low-profile split ergonomic keyboard +* Keyboard Maintainer: [Quentin Lebastard](https://github.com/bastardkb) +* Hardware Supported: BastardKB Blackpill or Pro Micro adapter & compatible development boards +* Hardware Availability: [GitHub](https://github.com/Bastardkb/Scylla) -* Keyboard Maintainer: [Bastard Keyboards](https://github.com/Bastardkb/) -* Hardware Supported: elite-C V4 -* Hardware Availability: [Bastard Keyboards](https://bastardkb.com/) +Make example for this keyboard (after setting up your build environment): -## Building the firmware + make bastardkb/scylla/blackpill:default + make bastardkb/scylla/promicro:default -**You must specify the shield version when compiling/flashing the firmware.** +Flashing example for this keyboard: -The template is: + make bastardkb/scylla/blackpill:default:flash + make bastardkb/scylla/promicro:default:flash -```shell -qmk compile -kb bastardkb/scylla/{VERSION}/elitec -km {KEYMAP} -``` - -| Shield Version | default | via | -| --------------- | ------------------------------------------------------------- | --------------------------------------------------------- | -| v1 (Elite-C) | `qmk compile -kb bastardkb/scylla/v1/elitec -km default` | `qmk compile -kb bastardkb/scylla/v1/elitec -km via` | -| v2 (Elite-C) | `qmk compile -kb bastardkb/scylla/v2/elitec -km default` | `qmk compile -kb bastardkb/scylla/v2/elitec -km via` | -| v2 (Splinky v2) | `qmk compile -kb bastardkb/scylla/v2/splinky/v2 -km default` | `qmk compile -kb bastardkb/scylla/v2/splinky/v2 -km via` | -| v2 (Splinky v3) | `qmk compile -kb bastardkb/scylla/v2/splinky/v3 -km default` | `qmk compile -kb bastardkb/scylla/v2/splinky/v3 -km via` | -| v2 (STeMCell) | `qmk compile -kb bastardkb/scylla/v2/stemcell -km default` | `qmk compile -kb bastardkb/scylla/v2/stemcell -km via` | +Note if using the `promicro` version: If you are using an Elite-C compatible development board, see [here](../readme.md#handedness-pin-on-elite-c-holder) for setting handedness by pin. 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). -See the [keyboard build instructions](https://docs.bastardkb.com) +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the adapter PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/bastardkb/scylla/scylla.c b/keyboards/bastardkb/scylla/scylla.c deleted file mode 100644 index 7aaa0fc1ce..0000000000 --- a/keyboards/bastardkb/scylla/scylla.c +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright 2021 Quentin LEBASTARD - * - * 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" - -// clang-format off -#ifdef RGB_MATRIX_ENABLE -led_config_t g_led_config = { { - // left - { 0, 7, 8, 15, 16, 20 }, - { 1, 6, 9, 14, 17, 21 }, - { 2, 5, 10, 13, 18, 22 }, - { 3, 4, 11, 12, 19, 23 }, - { NO_LED, 28, 24, 26, 27, 25 }, - // right - { 29, 36, 37, 44, 45, 49 }, - { 30, 35, 38, 43, 46, 50 }, - { 31, 34, 39, 42, 47, 51 }, - { 32, 33, 40, 41, 48, 52 }, - { NO_LED, 57, 53, 55, 56, 54 } -}, { - // left - { 0, 0 }, { 0, 16 }, { 0, 32 }, { 0, 48 }, // col 1 - { 20, 48 }, { 20, 32 }, { 20, 16 }, { 20, 0 }, // col 2 - { 41, 0 }, { 41, 16 }, { 41, 32 }, { 41, 48 }, - { 61, 48 }, { 61, 32 }, { 61, 16 }, { 61, 0 }, - { 81, 0 }, { 81, 16 }, { 81, 32 }, { 81, 48 }, - { 102, 0 }, { 102, 16 }, { 102, 32 }, { 102, 48 }, - { 102, 64 }, { 81, 64 }, { 61, 56 }, { 81, 56 }, { 102, 56 }, // left thumb cluster - // right - { 224, 0 }, { 224, 16 }, { 224, 32 }, { 224, 48 }, // col 12 - { 204, 48 }, { 204, 32 }, { 204, 16 }, { 204, 0 }, // col 11 - { 183, 0 }, { 183, 16 }, { 183, 32 }, { 183, 48 }, - { 163, 48 }, { 163, 32 }, { 163, 16 }, { 163, 0 }, - { 142, 0 }, { 142, 16 }, { 142, 32 }, { 142, 48 }, - { 122, 0 }, { 122, 16 }, { 122, 32 }, { 122, 48 }, - { 122, 64 }, { 142, 64 }, { 163, 56 }, { 142, 56 }, { 122, 56 } // right thumb cluster -}, { - // left - 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 2, 2, 2, - // right - 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 2, 2, 2 -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/scylla/v1/elitec/config.h b/keyboards/bastardkb/scylla/v1/elitec/config.h deleted file mode 100644 index 41b5aa1c66..0000000000 --- a/keyboards/bastardkb/scylla/v1/elitec/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json b/keyboards/bastardkb/scylla/v1/elitec/keyboard.json deleted file mode 100644 index 25963f006c..0000000000 --- a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "Scylla Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D2" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["B4", "E6", "C6", "B1", "B3", "B2"], - "rows": ["D7", "B5", "F7", "F6", "B6"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D0" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/scylla/v1/elitec/rules.mk b/keyboards/bastardkb/scylla/v1/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/scylla/v1/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/scylla/v2/elitec/config.h b/keyboards/bastardkb/scylla/v2/elitec/config.h deleted file mode 100644 index e6b7fefa66..0000000000 --- a/keyboards/bastardkb/scylla/v2/elitec/config.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json b/keyboards/bastardkb/scylla/v2/elitec/keyboard.json deleted file mode 100644 index 316606b17b..0000000000 --- a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "Scylla Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], - "rows": ["F4", "F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/scylla/v2/elitec/rules.mk b/keyboards/bastardkb/scylla/v2/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/scylla/v2/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/config.h b/keyboards/bastardkb/scylla/v2/splinky_2/config.h deleted file mode 100644 index 977fb0a6e8..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_2/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json deleted file mode 100644 index 2c0beb5c1d..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "Scylla Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP29", "GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/readme.md b/keyboards/bastardkb/scylla/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/rules.mk b/keyboards/bastardkb/scylla/v2/splinky_2/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_2/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/config.h b/keyboards/bastardkb/scylla/v2/splinky_3/config.h deleted file mode 100644 index e496023656..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_3/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json deleted file mode 100644 index ed92be5a45..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "Scylla Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP29", "GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/readme.md b/keyboards/bastardkb/scylla/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/rules.mk b/keyboards/bastardkb/scylla/v2/splinky_3/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/scylla/v2/splinky_3/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/scylla/v2/stemcell/config.h b/keyboards/bastardkb/scylla/v2/stemcell/config.h deleted file mode 100644 index ca1cc0f719..0000000000 --- a/keyboards/bastardkb/scylla/v2/stemcell/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED diff --git a/keyboards/bastardkb/scylla/v2/stemcell/halconf.h b/keyboards/bastardkb/scylla/v2/stemcell/halconf.h deleted file mode 100644 index dbeb6aeaa0..0000000000 --- a/keyboards/bastardkb/scylla/v2/stemcell/halconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE - -#include_next diff --git a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json b/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json deleted file mode 100644 index 80325bfea3..0000000000 --- a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "keyboard_name": "Scylla STeMCell", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B1", "B2", "A4", "B4", "B5", "B8"], - "rows": ["B10", "B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/scylla/v2/stemcell/mcuconf.h b/keyboards/bastardkb/scylla/v2/stemcell/mcuconf.h deleted file mode 100644 index 6afebade36..0000000000 --- a/keyboards/bastardkb/scylla/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/scylla/v2/stemcell/rules.mk b/keyboards/bastardkb/scylla/v2/stemcell/rules.mk deleted file mode 100644 index 3fe3e4ffbe..0000000000 --- a/keyboards/bastardkb/scylla/v2/stemcell/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = usart From 15e7c8f37a6fe017b61f7a355a89fdc83e965deb Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 8 Jul 2025 14:23:05 -0600 Subject: [PATCH 488/592] Refactor `bastardkb/skeletyl` (#25456) * Refactor bastardkb/skeletyl - Update keyboard aliases accordingly - Migrate keymap to JSON - skeletyl/blackpill - Migrate common configuration to keyboard level - Remove unnecessary or user-specific configuration - Migrate some configuration to data-driven - Use short SPDX license headers - Remove unnecessary rules.mk file - Formatting pass on keyboard.json - skeletyl/v1 - Remove likely unneeded version, per qmk#23812 - skeletyl/v2 - Remove splinky_2 revision, per qmk#23812 - Remove splinky_3, stemcell revisions; converter feature should be used here - Rename skeletyl/v2/elitec -> skeletyl/promicro, as a converter can be used for any pin-compatible microcontrollers * Update keyboards/bastardkb/skeletyl/keymaps/default/keymap.json Co-authored-by: Ryan --------- Co-authored-by: Ryan --- data/mappings/keyboard_aliases.hjson | 12 +++ .../bastardkb/skeletyl/blackpill/config.h | 33 +------- .../bastardkb/skeletyl/blackpill/halconf.h | 21 +---- .../skeletyl/blackpill/keyboard.json | 42 ++++------ .../bastardkb/skeletyl/blackpill/mcuconf.h | 23 +----- .../bastardkb/skeletyl/blackpill/rules.mk | 5 -- keyboards/bastardkb/skeletyl/info.json | 71 +++++++++++----- .../skeletyl/keymaps/default/keymap.c | 70 ---------------- .../skeletyl/keymaps/default/keymap.json | 26 ++++++ .../bastardkb/skeletyl/promicro/keyboard.json | 15 ++++ keyboards/bastardkb/skeletyl/readme.md | 38 ++++----- keyboards/bastardkb/skeletyl/skeletyl.c | 81 ------------------- .../bastardkb/skeletyl/v1/elitec/config.h | 22 ----- .../skeletyl/v1/elitec/keyboard.json | 31 ------- .../bastardkb/skeletyl/v1/elitec/rules.mk | 1 - .../bastardkb/skeletyl/v2/elitec/config.h | 21 ----- .../skeletyl/v2/elitec/keyboard.json | 31 ------- .../bastardkb/skeletyl/v2/elitec/rules.mk | 1 - .../bastardkb/skeletyl/v2/splinky_2/config.h | 31 ------- .../skeletyl/v2/splinky_2/keyboard.json | 32 -------- .../bastardkb/skeletyl/v2/splinky_2/readme.md | 5 -- .../bastardkb/skeletyl/v2/splinky_2/rules.mk | 3 - .../bastardkb/skeletyl/v2/splinky_3/config.h | 31 ------- .../skeletyl/v2/splinky_3/keyboard.json | 32 -------- .../bastardkb/skeletyl/v2/splinky_3/readme.md | 5 -- .../bastardkb/skeletyl/v2/splinky_3/rules.mk | 3 - .../bastardkb/skeletyl/v2/stemcell/config.h | 38 --------- .../bastardkb/skeletyl/v2/stemcell/halconf.h | 23 ------ .../skeletyl/v2/stemcell/keyboard.json | 34 -------- .../bastardkb/skeletyl/v2/stemcell/mcuconf.h | 29 ------- .../bastardkb/skeletyl/v2/stemcell/rules.mk | 3 - 31 files changed, 147 insertions(+), 666 deletions(-) delete mode 100644 keyboards/bastardkb/skeletyl/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/skeletyl/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/skeletyl/keymaps/default/keymap.json create mode 100644 keyboards/bastardkb/skeletyl/promicro/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/skeletyl.c delete mode 100644 keyboards/bastardkb/skeletyl/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/skeletyl/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/skeletyl/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/skeletyl/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/skeletyl/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 42ff5a9912..942a60946d 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -80,6 +80,18 @@ "bastardkb/scylla/v2/stemcell": { "target": "bastardkb/scylla/promicro" }, + "bastardkb/skeletyl/v2/elitec": { + "target": "bastardkb/skeletyl/promicro" + }, + "bastardkb/skeletyl/v2/splinky_2": { + "target": "bastardkb/skeletyl/promicro" + }, + "bastardkb/skeletyl/v2/splinky_3": { + "target": "bastardkb/skeletyl/promicro" + }, + "bastardkb/skeletyl/v2/stemcell": { + "target": "bastardkb/skeletyl/promicro" + }, "bastardkb/tbkmini/v2/elitec": { "target": "bastardkb/tbkmini/promicro" }, diff --git a/keyboards/bastardkb/skeletyl/blackpill/config.h b/keyboards/bastardkb/skeletyl/blackpill/config.h index bf7879edbe..c6b40f3e5f 100644 --- a/keyboards/bastardkb/skeletyl/blackpill/config.h +++ b/keyboards/bastardkb/skeletyl/blackpill/config.h @@ -1,27 +1,9 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - /* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 @@ -30,13 +12,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - /* SPI config for EEPROM. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 diff --git a/keyboards/bastardkb/skeletyl/blackpill/halconf.h b/keyboards/bastardkb/skeletyl/blackpill/halconf.h index 5c5dff98d4..545fc20cb3 100644 --- a/keyboards/bastardkb/skeletyl/blackpill/halconf.h +++ b/keyboards/bastardkb/skeletyl/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/skeletyl/blackpill/keyboard.json b/keyboards/bastardkb/skeletyl/blackpill/keyboard.json index 16fa2b2412..15edbf74b8 100644 --- a/keyboards/bastardkb/skeletyl/blackpill/keyboard.json +++ b/keyboards/bastardkb/skeletyl/blackpill/keyboard.json @@ -1,37 +1,23 @@ { - "keyboard_name": "Skeletyl Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B1", "B10", "B3", "B4", "B5"], "rows": ["A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/skeletyl/blackpill/mcuconf.h b/keyboards/bastardkb/skeletyl/blackpill/mcuconf.h index 2b3f30cbfe..cc77ec94ae 100644 --- a/keyboards/bastardkb/skeletyl/blackpill/mcuconf.h +++ b/keyboards/bastardkb/skeletyl/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next diff --git a/keyboards/bastardkb/skeletyl/blackpill/rules.mk b/keyboards/bastardkb/skeletyl/blackpill/rules.mk deleted file mode 100644 index 48c904dd64..0000000000 --- a/keyboards/bastardkb/skeletyl/blackpill/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/skeletyl/info.json b/keyboards/bastardkb/skeletyl/info.json index e4ac29207d..470197edb9 100644 --- a/keyboards/bastardkb/skeletyl/info.json +++ b/keyboards/bastardkb/skeletyl/info.json @@ -1,23 +1,63 @@ { - "url": "https://www.bastardkb.com/skeletyl", - "usb": { - "pid": "0x1830" + "keyboard_name": "Skeletyl", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true }, "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 18, "y": 0, "flags": 4}, + {"matrix": [1, 1], "x": 18, "y": 21, "flags": 4}, + {"matrix": [2, 1], "x": 18, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 36, "y": 42, "flags": 4}, + {"matrix": [1, 2], "x": 36, "y": 21, "flags": 4}, + {"matrix": [0, 2], "x": 36, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 54, "y": 0, "flags": 4}, + {"matrix": [1, 3], "x": 54, "y": 21, "flags": 4}, + {"matrix": [2, 3], "x": 54, "y": 42, "flags": 4}, + {"matrix": [0, 4], "x": 72, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 72, "y": 21, "flags": 4}, + {"matrix": [2, 4], "x": 72, "y": 42, "flags": 4}, + {"matrix": [3, 2], "x": 72, "y": 64, "flags": 1}, + {"matrix": [3, 3], "x": 90, "y": 64, "flags": 1}, + {"matrix": [3, 0], "x": 108, "y": 64, "flags": 1}, + {"matrix": [6, 0], "x": 224, "y": 42, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 21, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [4, 1], "x": 206, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 206, "y": 21, "flags": 4}, + {"matrix": [6, 1], "x": 206, "y": 42, "flags": 4}, + {"matrix": [6, 2], "x": 188, "y": 42, "flags": 4}, + {"matrix": [5, 2], "x": 188, "y": 21, "flags": 4}, + {"matrix": [4, 2], "x": 188, "y": 0, "flags": 4}, + {"matrix": [4, 3], "x": 170, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 170, "y": 21, "flags": 4}, + {"matrix": [6, 3], "x": 170, "y": 42, "flags": 4}, + {"matrix": [4, 4], "x": 152, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 152, "y": 21, "flags": 4}, + {"matrix": [6, 4], "x": 152, "y": 42, "flags": 4}, + {"matrix": [7, 2], "x": 152, "y": 64, "flags": 1}, + {"matrix": [7, 3], "x": 134, "y": 64, "flags": 1}, + {"matrix": [7, 0], "x": 116, "y": 64, "flags": 1} + ], "max_brightness": 50, "sleep": true, "split_count": [18, 18] }, - "rgblight": { - "led_count": 36, - "split_count": [18, 18] - }, "split": { - "transport": { - "sync": { - "matrix_state": true - } - } + "enabled": true + }, + "url": "https://github.com/Bastardkb/Skeletyl", + "usb": { + "device_version": "2.0.0", + "pid": "0x1830" }, "community_layouts": ["split_3x5_3"], "layouts": { @@ -28,41 +68,34 @@ {"matrix": [0, 2], "x": 2, "y": 0}, {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, - {"matrix": [4, 4], "x": 11, "y": 0}, {"matrix": [4, 3], "x": 12, "y": 0}, {"matrix": [4, 2], "x": 13, "y": 0}, {"matrix": [4, 1], "x": 14, "y": 0}, {"matrix": [4, 0], "x": 15, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [5, 4], "x": 11, "y": 1}, {"matrix": [5, 3], "x": 12, "y": 1}, {"matrix": [5, 2], "x": 13, "y": 1}, {"matrix": [5, 1], "x": 14, "y": 1}, {"matrix": [5, 0], "x": 15, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [6, 4], "x": 11, "y": 2}, {"matrix": [6, 3], "x": 12, "y": 2}, {"matrix": [6, 2], "x": 13, "y": 2}, {"matrix": [6, 1], "x": 14, "y": 2}, {"matrix": [6, 0], "x": 15, "y": 2}, - {"matrix": [3, 2], "x": 4, "y": 3}, {"matrix": [3, 3], "x": 5, "y": 3}, {"matrix": [3, 0], "x": 6, "y": 3}, - {"matrix": [7, 0], "x": 9, "y": 3}, {"matrix": [7, 3], "x": 10, "y": 3}, {"matrix": [7, 2], "x": 11, "y": 3} diff --git a/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c b/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c deleted file mode 100644 index 1f49629c88..0000000000 --- a/keyboards/bastardkb/skeletyl/keymaps/default/keymap.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * - * 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 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [0] = LAYOUT_split_3x5_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC , MO(1), MO(2), KC_ENT , KC_RALT - //`--------------------------' `--------------------------' - - ), - - [1] = LAYOUT_split_3x5_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, _______, MO(3), KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - ), - - [2] = LAYOUT_split_3x5_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, MO(3), _______, KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - ), - - [3] = LAYOUT_split_3x5_3( - //,-----------------------------------------------------. ,-----------------------------------------------------. - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RM_HUEU, RM_SATU, RM_VALU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - RM_HUED, RM_SATD, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_LGUI, KC_SPC, _______, _______, KC_ENT, KC_RALT - //`--------------------------' `--------------------------' - ) -}; diff --git a/keyboards/bastardkb/skeletyl/keymaps/default/keymap.json b/keyboards/bastardkb/skeletyl/keymaps/default/keymap.json new file mode 100644 index 0000000000..5253ca2a12 --- /dev/null +++ b/keyboards/bastardkb/skeletyl/keymaps/default/keymap.json @@ -0,0 +1,26 @@ +{ + "keyboard": "bastardkb/skeletyl/promicro", + "keymap": "default", + "layout": "LAYOUT_split_3x5_3", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", + "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", "KC_RALT" + ], + [ + "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", + "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", + "EE_CLR", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______" + ] + ] +} + diff --git a/keyboards/bastardkb/skeletyl/promicro/keyboard.json b/keyboards/bastardkb/skeletyl/promicro/keyboard.json new file mode 100644 index 0000000000..d9c399865b --- /dev/null +++ b/keyboards/bastardkb/skeletyl/promicro/keyboard.json @@ -0,0 +1,15 @@ +{ + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F5", "B6", "D7", "E6", "B4"], + "rows": ["F7", "C6", "D4", "B5"] + }, + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/skeletyl/readme.md b/keyboards/bastardkb/skeletyl/readme.md index bd05820d35..7299964968 100644 --- a/keyboards/bastardkb/skeletyl/readme.md +++ b/keyboards/bastardkb/skeletyl/readme.md @@ -1,31 +1,27 @@ # Skeletyl -A very small keyboard made for ergonomic enthusiasts. +* Keyboard Maintainer: [Quentin Lebastard](https://github.com/bastardkb) +* Hardware Supported: BastardKB Blackpill or Pro Micro adapter & compatible development boards +* Hardware Availability: [GitHub](https://github.com/Bastardkb/Skeletyl) -* Keyboard Maintainer: [Bastard Keyboards](https://github.com/Bastardkb/) -* Hardware Supported: elite-C V4 -* Hardware Availability: [Bastardkb.com](https://bastardkb.com/) +Make example for this keyboard (after setting up your build environment): -## Building the firmware + make bastardkb/skeletyl/blackpill:default + make bastardkb/skeletyl/promicro:default -**You must specify the shield version when compiling/flashing the firmware.** +Flashing example for this keyboard: -The template is: + make bastardkb/skeletyl/blackpill:default:flash + make bastardkb/skeletyl/promicro:default:flash -```shell -qmk compile -kb bastardkb/skeletyl/{VERSION}/elitec -km {KEYMAP} -``` - -| Shield Version | default | via | -| --------------- | --------------------------------------------------------------- | ----------------------------------------------------------- | -| v1 (Elite-C) | `qmk compile -kb bastardkb/skeletyl/v1/elitec -km default` | `qmk compile -kb bastardkb/skeletyl/v1/elitec -km via` | -| v2 (Elite-C) | `qmk compile -kb bastardkb/skeletyl/v2/elitec -km default` | `qmk compile -kb bastardkb/skeletyl/v2/elitec -km via` | -| v2 (Splinky v2) | `qmk compile -kb bastardkb/skeletyl/v2/splinky_2 -km default` | `qmk compile -kb bastardkb/skeletyl/v2/splinky_2 -km via` | -| v2 (Splinky v3) | `qmk compile -kb bastardkb/skeletyl/v2/splinky_3 -km default` | `qmk compile -kb bastardkb/skeletyl/v2/splinky_3 -km via` | -| v2 (STeMCell) | `qmk compile -kb bastardkb/skeletyl/v2/stemcell -km default` | `qmk compile -kb bastardkb/skeletyl/v2/stemcell -km via` | - -This keyboard is made to be used with the Miryoku layout, do not use the default keymap. +Note if using the `promicro` version: If you are using an Elite-C compatible development board, see [here](../readme.md#handedness-pin-on-elite-c-holder) for setting handedness by pin. 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). -See the [keyboard build instructions](http://docs.bastardkb.com/) +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the adapter PCB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/bastardkb/skeletyl/skeletyl.c b/keyboards/bastardkb/skeletyl/skeletyl.c deleted file mode 100644 index 6c65c3fa87..0000000000 --- a/keyboards/bastardkb/skeletyl/skeletyl.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * - * 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" - -/** - * LEDs index. - * - * ╭────────────────────╮ ╭────────────────────╮ - * 2 3 8 9 12 30 27 26 21 20 - * ├────────────────────┤ ├────────────────────┤ - * 1 4 7 10 13 31 28 25 22 19 - * ├────────────────────┤ ├────────────────────┤ - * 0 5 6 11 14 32 29 24 23 18 - * ╰────────────────────╯ ╰────────────────────╯ - * 15 16 17 35 34 33 - * ╰────────────╯ ╰────────────╯ - */ -// clang-format off -#ifdef RGB_MATRIX_ENABLE -led_config_t g_led_config = { { - /* Key Matrix to LED index. */ - // Left split. - { 2, 3, 8, 9, 12 }, // Top row - { 1, 4, 7, 10, 13 }, // Middle row - { 0, 5, 6, 11, 14 }, // Bottom row - { 17, NO_LED, 15, 16, NO_LED }, // Thumb cluster - // Right split. - { 20, 21, 26, 27, 30 }, // Top row - { 19, 22, 25, 28, 31 }, // Middle row - { 18, 23, 24, 29, 32 }, // Bottom row - { 35, NO_LED, 33, 34, NO_LED }, // Thumb cluster -}, { - /* LED index to physical position. */ - // Left split. - /* index=0 */ { 0, 42 }, { 0, 21 }, { 0, 0 }, // col 1 (left most) - /* index=3 */ { 18, 0 }, { 18, 21 }, { 18, 42 }, // col 2 - /* index=6 */ { 36, 42 }, { 36, 21 }, { 36, 0 }, - /* index=9 */ { 54, 0 }, { 54, 21 }, { 54, 42 }, - /* index=12 */ { 72, 0 }, { 72, 21 }, { 72, 42 }, - /* index=15 */ { 72, 64 }, { 90, 64 }, { 108, 64 }, // Thumb cluster - // Right split. - /* index=18 */ { 224, 42 }, { 224, 21 }, { 224, 0 }, // col 10 (right most) - /* index=21 */ { 206, 0 }, { 206, 21 }, { 206, 42 }, // col 9 - /* index=24 */ { 188, 42 }, { 188, 21 }, { 188, 0 }, - /* index=27 */ { 170, 0 }, { 170, 21 }, { 170, 42 }, - /* index=30 */ { 152, 0 }, { 152, 21 }, { 152, 42 }, - /* index=33 */ { 152, 64 }, { 134, 64 }, { 116, 64 }, // Thumb cluster -}, { - /* LED index to flag. */ - // Left split. - /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1 - /* index=3 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2 - /* index=6 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=9 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=15 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster - // Right split. - /* index=18 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 10 - /* index=21 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 9 - /* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=33 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/skeletyl/v1/elitec/config.h b/keyboards/bastardkb/skeletyl/v1/elitec/config.h deleted file mode 100644 index 41b5aa1c66..0000000000 --- a/keyboards/bastardkb/skeletyl/v1/elitec/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json deleted file mode 100644 index 3bbba6d310..0000000000 --- a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "Skeletyl Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D2" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["E6", "C6", "B1", "B3", "B2"], - "rows": ["B5", "F7", "F6", "B6"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D0" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/skeletyl/v1/elitec/rules.mk b/keyboards/bastardkb/skeletyl/v1/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/skeletyl/v1/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/skeletyl/v2/elitec/config.h b/keyboards/bastardkb/skeletyl/v2/elitec/config.h deleted file mode 100644 index e6b7fefa66..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/elitec/config.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT diff --git a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json deleted file mode 100644 index 43675db36d..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "keyboard_name": "Skeletyl Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F5", "B6", "D7", "E6", "B4"], - "rows": ["F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/skeletyl/v2/elitec/rules.mk b/keyboards/bastardkb/skeletyl/v2/elitec/rules.mk deleted file mode 100644 index 1868c4bb02..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/elitec/rules.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/config.h b/keyboards/bastardkb/skeletyl/v2/splinky_2/config.h deleted file mode 100644 index 977fb0a6e8..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_2/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json deleted file mode 100644 index 32030dbd00..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "Skeletyl Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/readme.md b/keyboards/bastardkb/skeletyl/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/rules.mk b/keyboards/bastardkb/skeletyl/v2/splinky_2/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_2/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/config.h b/keyboards/bastardkb/skeletyl/v2/splinky_3/config.h deleted file mode 100644 index e496023656..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_3/config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json deleted file mode 100644 index 51227f5065..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "keyboard_name": "Skeletyl Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/readme.md b/keyboards/bastardkb/skeletyl/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/rules.mk b/keyboards/bastardkb/skeletyl/v2/splinky_3/rules.mk deleted file mode 100644 index 077573eb76..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/splinky_3/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/config.h b/keyboards/bastardkb/skeletyl/v2/stemcell/config.h deleted file mode 100644 index ca1cc0f719..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/halconf.h b/keyboards/bastardkb/skeletyl/v2/stemcell/halconf.h deleted file mode 100644 index dbeb6aeaa0..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/halconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE - -#include_next diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json b/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json deleted file mode 100644 index 2e9745b7f2..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "keyboard_name": "Skeletyl STeMCell", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B2", "A4", "B4", "B5", "B8"], - "rows": ["B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/mcuconf.h b/keyboards/bastardkb/skeletyl/v2/stemcell/mcuconf.h deleted file mode 100644 index 6afebade36..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk b/keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk deleted file mode 100644 index 3fe3e4ffbe..0000000000 --- a/keyboards/bastardkb/skeletyl/v2/stemcell/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -SERIAL_DRIVER = usart From 3d6113956707f9e90a6cca2025e5fa5db35013b3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 9 Jul 2025 20:54:43 +0100 Subject: [PATCH 489/592] Miscellaneous fixes for lint warnings (#25469) --- keyboards/handwired/pytest/basic/keymaps/default/keymap.c | 2 ++ .../pytest/has_community/keymaps/default/default/keymap.c | 7 +++++++ keyboards/kinesis/kint32/keyboard.json | 2 -- keyboards/trnthsn/s6xtyfs/info.json | 1 - 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c diff --git a/keyboards/handwired/pytest/basic/keymaps/default/keymap.c b/keyboards/handwired/pytest/basic/keymaps/default/keymap.c index a5782f7a13..264de943c9 100644 --- a/keyboards/handwired/pytest/basic/keymaps/default/keymap.c +++ b/keyboards/handwired/pytest/basic/keymaps/default/keymap.c @@ -1,3 +1,5 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c b/keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c new file mode 100644 index 0000000000..264de943c9 --- /dev/null +++ b/keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c @@ -0,0 +1,7 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(KC_A) +}; diff --git a/keyboards/kinesis/kint32/keyboard.json b/keyboards/kinesis/kint32/keyboard.json index 4f403c2ffa..2a46bbe12b 100644 --- a/keyboards/kinesis/kint32/keyboard.json +++ b/keyboards/kinesis/kint32/keyboard.json @@ -9,8 +9,6 @@ "diode_direction": "COL2ROW", "features": { "bootmagic": true, - "command": false, - "console": false, "extrakey": true, "mousekey": true, "nkro": true diff --git a/keyboards/trnthsn/s6xtyfs/info.json b/keyboards/trnthsn/s6xtyfs/info.json index 132c1a4e97..2599ff2504 100644 --- a/keyboards/trnthsn/s6xtyfs/info.json +++ b/keyboards/trnthsn/s6xtyfs/info.json @@ -39,7 +39,6 @@ "led_count": 28, "sleep": true }, - "url": "", "usb": { "device_version": "1.0.0", "pid": "0x3666", From 4b295009ae9595e5bc07e6f4445abe91629458ea Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 10 Jul 2025 10:41:58 +0100 Subject: [PATCH 490/592] Migrate `usb.force_nkro` to `host.default.nkro` (#25468) --- keyboards/akko/5087/keyboard.json | 8 ++++++-- keyboards/akko/5108/keyboard.json | 8 ++++++-- keyboards/akko/acr87/keyboard.json | 8 ++++++-- keyboards/akko/top40/keyboard.json | 8 ++++++-- keyboards/amjkeyboard/amj84/keyboard.json | 8 ++++++-- keyboards/atlantis/ak81_ve/keyboard.json | 8 ++++++-- keyboards/bt66tech/bt66tech60/keyboard.json | 8 ++++++-- keyboards/bubble75/hotswap/keyboard.json | 6 +++++- keyboards/cest73/tkm/keyboard.json | 8 ++++++-- keyboards/chaos65/keyboard.json | 8 ++++++-- keyboards/chosfox/cf81/keyboard.json | 6 +++++- keyboards/custommk/elysian/keyboard.json | 8 ++++++-- keyboards/doio/kb16/info.json | 8 ++++++-- keyboards/dotmod/dymium65/keyboard.json | 8 ++++++-- keyboards/ducky/one2mini/1861st/keyboard.json | 8 ++++++-- keyboards/ducky/one2sf/1967st/keyboard.json | 8 ++++++-- keyboards/eason/aeroboard/keyboard.json | 8 ++++++-- keyboards/eason/meow65/keyboard.json | 8 ++++++-- keyboards/eason/void65h/keyboard.json | 8 ++++++-- keyboards/epomaker/tide65/keyboard.json | 6 +++++- keyboards/fancytech/fancyalice66/keyboard.json | 6 +++++- keyboards/gboards/butterstick/keyboard.json | 8 ++++++-- keyboards/gboards/georgi/keyboard.json | 8 ++++++-- keyboards/gopolar/gg86/keyboard.json | 6 +++++- keyboards/handwired/arrow_pad/keyboard.json | 8 ++++++-- keyboards/handwired/datahand/keyboard.json | 8 ++++++-- keyboards/handwired/mutepad/keyboard.json | 8 ++++++-- keyboards/handwired/retro_refit/keyboard.json | 8 ++++++-- keyboards/handwired/split_cloud/keyboard.json | 8 ++++++-- keyboards/handwired/twig/twig50/keyboard.json | 8 ++++++-- keyboards/handwired/wulkan/keyboard.json | 8 ++++++-- keyboards/handwired/xealous/rev1/keyboard.json | 8 ++++++-- keyboards/hfdkb/ac001/keyboard.json | 8 ++++++-- keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json | 8 ++++++-- .../horrortroll/chinese_pcb/devil68_pro/keyboard.json | 8 ++++++-- keyboards/horrortroll/handwired_k552/keyboard.json | 8 ++++++-- keyboards/horrortroll/lemon40/keyboard.json | 8 ++++++-- keyboards/horrortroll/paws60/keyboard.json | 8 ++++++-- keyboards/idobao/id42/keyboard.json | 8 ++++++-- keyboards/inland/kb83/keyboard.json | 8 ++++++-- keyboards/inland/mk47/keyboard.json | 6 +++++- keyboards/inland/v83p/keyboard.json | 6 +++++- keyboards/kabedon/kabedon98e/keyboard.json | 8 ++++++-- keyboards/kb_elmo/gamehand/keyboard.json | 8 ++++++-- keyboards/kbdfans/kbd75hs/keyboard.json | 8 ++++++-- keyboards/keychron/q0/info.json | 6 +++++- keyboards/keychron/q1v1/info.json | 6 +++++- keyboards/keyspensory/kp60/keyboard.json | 8 ++++++-- keyboards/kingly_keys/little_foot/keyboard.json | 8 ++++++-- keyboards/kingly_keys/smd_milk/keyboard.json | 8 ++++++-- keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json | 8 ++++++-- keyboards/lendunistus/rpneko65/rev1/keyboard.json | 6 +++++- keyboards/linworks/dolice/keyboard.json | 8 ++++++-- keyboards/linworks/fave87/keyboard.json | 8 ++++++-- keyboards/linworks/whale75/keyboard.json | 8 ++++++-- keyboards/magic_force/mf17/keyboard.json | 6 +++++- keyboards/magic_force/mf34/keyboard.json | 8 ++++++-- keyboards/mechllama/g35/info.json | 8 ++++++-- keyboards/mechwild/bbs/keyboard.json | 6 +++++- keyboards/mechwild/sugarglider/info.json | 6 +++++- keyboards/miiiw/blackio83/rev_0100/keyboard.json | 6 +++++- keyboards/millipad/keyboard.json | 8 ++++++-- keyboards/misonoworks/chocolatebar/keyboard.json | 8 ++++++-- keyboards/misonoworks/karina/keyboard.json | 8 ++++++-- keyboards/ml/gas75/keyboard.json | 8 ++++++-- keyboards/mmkeyboard/class60/soldered/keyboard.json | 6 +++++- keyboards/mmkzoo65/keyboard.json | 6 +++++- keyboards/monsgeek/m1/keyboard.json | 6 +++++- keyboards/monsgeek/m3/keyboard.json | 8 ++++++-- keyboards/monsgeek/m5/keyboard.json | 8 ++++++-- keyboards/monsgeek/m6/keyboard.json | 6 +++++- keyboards/mss_studio/m63_rgb/keyboard.json | 8 ++++++-- keyboards/mss_studio/m64_rgb/keyboard.json | 8 ++++++-- keyboards/mwstudio/alicekk/keyboard.json | 8 ++++++-- keyboards/mwstudio/mw660/keyboard.json | 8 ++++++-- keyboards/omnikeyish/keyboard.json | 8 ++++++-- keyboards/opendeck/32/info.json | 8 ++++++-- keyboards/owlab/jelly_epoch/hotswap/keyboard.json | 8 ++++++-- keyboards/owlab/jelly_epoch/soldered/keyboard.json | 8 ++++++-- keyboards/owlab/spring/keyboard.json | 8 ++++++-- keyboards/owlab/suit80/ansi/keyboard.json | 8 ++++++-- keyboards/owlab/suit80/iso/keyboard.json | 8 ++++++-- keyboards/owlab/voice65/hotswap/keyboard.json | 8 ++++++-- keyboards/owlab/voice65/soldered/keyboard.json | 8 ++++++-- keyboards/phentech/rpk_001/keyboard.json | 6 +++++- keyboards/polycarbdiet/s20/keyboard.json | 8 ++++++-- keyboards/qwertykeys/qk65/hotswap/keyboard.json | 8 ++++++-- keyboards/qwertykeys/qk65/solder/keyboard.json | 8 ++++++-- keyboards/rate/pistachio/info.json | 8 ++++++-- keyboards/rate/pistachio_mp/keyboard.json | 8 ++++++-- keyboards/rose75/keyboard.json | 6 +++++- keyboards/runes/skjoldr/keyboard.json | 8 ++++++-- keyboards/runes/vaengr/keyboard.json | 8 ++++++-- keyboards/ryanskidmore/rskeys100/keyboard.json | 8 ++++++-- keyboards/sawnsprojects/bunnygirl65/keyboard.json | 6 +++++- keyboards/sawnsprojects/okayu/info.json | 8 ++++++-- keyboards/sixkeyboard/keyboard.json | 8 ++++++-- keyboards/skmt/15k/keyboard.json | 8 ++++++-- keyboards/skyloong/gk61/v1/keyboard.json | 8 ++++++-- keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json | 8 ++++++-- keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json | 8 ++++++-- keyboards/stenokeyboards/the_uni/usb_c/keyboard.json | 8 ++++++-- keyboards/synthlabs/060/keyboard.json | 8 ++++++-- keyboards/synthlabs/065/keyboard.json | 6 +++++- keyboards/synthlabs/solo/keyboard.json | 8 ++++++-- keyboards/tacworks/tac_k1/keyboard.json | 6 +++++- keyboards/teleport/native/info.json | 8 ++++++-- keyboards/tweetydabird/lotus58/info.json | 6 +++++- keyboards/vertex/angle65/keyboard.json | 8 ++++++-- keyboards/vertex/arc60/keyboard.json | 8 ++++++-- keyboards/vertex/arc60h/keyboard.json | 8 ++++++-- keyboards/vertex/cycle8/keyboard.json | 8 ++++++-- keyboards/vertex/t75/keyboard.json | 6 +++++- keyboards/viktus/at101_bh/keyboard.json | 8 ++++++-- keyboards/viktus/omnikey_bh/keyboard.json | 8 ++++++-- keyboards/viktus/z150_bh/keyboard.json | 8 ++++++-- keyboards/willoucom/keypad/keyboard.json | 6 +++++- keyboards/wuque/tata80/wk/keyboard.json | 8 ++++++-- keyboards/wuque/tata80/wkl/keyboard.json | 8 ++++++-- keyboards/xelus/dharma/keyboard.json | 8 ++++++-- keyboards/xelus/pachi/rgb/rev1/keyboard.json | 8 ++++++-- keyboards/xelus/rs108/keyboard.json | 6 +++++- keyboards/xelus/rs60/rev1/keyboard.json | 8 ++++++-- keyboards/xelus/rs60/rev2_0/keyboard.json | 6 +++++- keyboards/xelus/rs60/rev2_1/keyboard.json | 6 +++++- keyboards/yandrstudio/zhou65/keyboard.json | 8 ++++++-- 126 files changed, 727 insertions(+), 223 deletions(-) diff --git a/keyboards/akko/5087/keyboard.json b/keyboards/akko/5087/keyboard.json index 0561817b69..564a5519a9 100644 --- a/keyboards/akko/5087/keyboard.json +++ b/keyboards/akko/5087/keyboard.json @@ -7,8 +7,12 @@ "vid": "0xFFFE", "pid": "0x000C", "device_version": "1.0.4", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/akko/5108/keyboard.json b/keyboards/akko/5108/keyboard.json index b62dbbf17c..a393f952d8 100644 --- a/keyboards/akko/5108/keyboard.json +++ b/keyboards/akko/5108/keyboard.json @@ -7,8 +7,12 @@ "vid": "0xFFFE", "pid": "0x000D", "device_version": "1.0.3", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/akko/acr87/keyboard.json b/keyboards/akko/acr87/keyboard.json index 17981b609a..bf72c511b5 100644 --- a/keyboards/akko/acr87/keyboard.json +++ b/keyboards/akko/acr87/keyboard.json @@ -7,8 +7,12 @@ "vid": "0xFFFE", "pid": "0x0010", "device_version": "1.0.1", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/akko/top40/keyboard.json b/keyboards/akko/top40/keyboard.json index 3cb7086608..857ffda276 100644 --- a/keyboards/akko/top40/keyboard.json +++ b/keyboards/akko/top40/keyboard.json @@ -7,8 +7,12 @@ "vid": "0xFFFE", "pid": "0x000E", "device_version": "1.0.2", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/amjkeyboard/amj84/keyboard.json b/keyboards/amjkeyboard/amj84/keyboard.json index a6108ab9a7..4ef3bfb776 100644 --- a/keyboards/amjkeyboard/amj84/keyboard.json +++ b/keyboards/amjkeyboard/amj84/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x00D8", "pid": "0x6068", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/atlantis/ak81_ve/keyboard.json b/keyboards/atlantis/ak81_ve/keyboard.json index 7c01714201..3868625d93 100644 --- a/keyboards/atlantis/ak81_ve/keyboard.json +++ b/keyboards/atlantis/ak81_ve/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x416B", "pid": "0x0081", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/bt66tech/bt66tech60/keyboard.json b/keyboards/bt66tech/bt66tech60/keyboard.json index 9f747397c3..2b476a6eea 100644 --- a/keyboards/bt66tech/bt66tech60/keyboard.json +++ b/keyboards/bt66tech/bt66tech60/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4254", "pid": "0x7070", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/bubble75/hotswap/keyboard.json b/keyboards/bubble75/hotswap/keyboard.json index 92f57144ce..47f658349f 100644 --- a/keyboards/bubble75/hotswap/keyboard.json +++ b/keyboards/bubble75/hotswap/keyboard.json @@ -6,9 +6,13 @@ "vid": "0x4242", "pid": "0x5A4C", "device_version": "0.0.1", - "force_nkro": true, "no_startup_check": true }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "mousekey": false, diff --git a/keyboards/cest73/tkm/keyboard.json b/keyboards/cest73/tkm/keyboard.json index 5fc85d0e75..31e592ec05 100644 --- a/keyboards/cest73/tkm/keyboard.json +++ b/keyboards/cest73/tkm/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xBADD", "pid": "0xAA55", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/chaos65/keyboard.json b/keyboards/chaos65/keyboard.json index c2a3d4b1a5..87f03b3a75 100644 --- a/keyboards/chaos65/keyboard.json +++ b/keyboards/chaos65/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xB23B", "pid": "0x1688", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/chosfox/cf81/keyboard.json b/keyboards/chosfox/cf81/keyboard.json index 9ff5e35fbd..333841fdf1 100644 --- a/keyboards/chosfox/cf81/keyboard.json +++ b/keyboards/chosfox/cf81/keyboard.json @@ -3,12 +3,16 @@ "manufacturer": "CHOSFOX", "maintainer": "jonylee@hfd", "usb": { - "force_nkro": true, "vid": "0xFFFE", "pid": "0x0012", "device_version": "1.0.0", "suspend_wakeup_delay": 400 }, + "host": { + "default": { + "nkro": true + } + }, "eeprom": { "driver": "wear_leveling", "wear_leveling": { diff --git a/keyboards/custommk/elysian/keyboard.json b/keyboards/custommk/elysian/keyboard.json index 4fc842149d..9055b70025 100644 --- a/keyboards/custommk/elysian/keyboard.json +++ b/keyboards/custommk/elysian/keyboard.json @@ -30,8 +30,12 @@ "usb": { "device_version": "1.0.0", "pid": "0xFABB", - "vid": "0xF35B", - "force_nkro": true + "vid": "0xF35B" + }, + "host": { + "default": { + "nkro": true + } }, "encoder": { "rotary": [ diff --git a/keyboards/doio/kb16/info.json b/keyboards/doio/kb16/info.json index 08c19819bb..7b27370707 100644 --- a/keyboards/doio/kb16/info.json +++ b/keyboards/doio/kb16/info.json @@ -4,8 +4,12 @@ "maintainer": "HorrorTroll", "usb": { "vid": "0xD010", - "pid": "0x1601", - "force_nkro": true + "pid": "0x1601" + }, + "host": { + "default": { + "nkro": true + } }, "diode_direction": "COL2ROW", "build": { diff --git a/keyboards/dotmod/dymium65/keyboard.json b/keyboards/dotmod/dymium65/keyboard.json index 301b69edc5..a76bc91cd6 100644 --- a/keyboards/dotmod/dymium65/keyboard.json +++ b/keyboards/dotmod/dymium65/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x5678", "pid": "0x5058", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "diode_direction": "ROW2COL", "matrix_pins": { diff --git a/keyboards/ducky/one2mini/1861st/keyboard.json b/keyboards/ducky/one2mini/1861st/keyboard.json index e1ab218846..9f0010e6a7 100644 --- a/keyboards/ducky/one2mini/1861st/keyboard.json +++ b/keyboards/ducky/one2mini/1861st/keyboard.json @@ -4,8 +4,12 @@ "usb": { "vid": "0x0416", "pid": "0x0123", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "matrix_pins": { "cols": ["B10", "B9", "C13", "C12", "C11", "C10", "C9", "C8", "A15", "A14", "A13", "D0", "D1", "D2", "B8"], diff --git a/keyboards/ducky/one2sf/1967st/keyboard.json b/keyboards/ducky/one2sf/1967st/keyboard.json index 3bb58fd48f..093793d4c8 100644 --- a/keyboards/ducky/one2sf/1967st/keyboard.json +++ b/keyboards/ducky/one2sf/1967st/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x445B", "pid": "0x07AF", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "matrix_pins": { "cols": ["B10", "B9", "C13", "C12", "C11", "C10", "C9", "C8", "A15", "A14", "A13", "D0", "D1", "D2", "B15", "B8"], diff --git a/keyboards/eason/aeroboard/keyboard.json b/keyboards/eason/aeroboard/keyboard.json index 1c15e600c4..d48b9819d0 100644 --- a/keyboards/eason/aeroboard/keyboard.json +++ b/keyboards/eason/aeroboard/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x8954", "pid": "0x8870", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 20, diff --git a/keyboards/eason/meow65/keyboard.json b/keyboards/eason/meow65/keyboard.json index 013e7daf4b..20285b66c6 100644 --- a/keyboards/eason/meow65/keyboard.json +++ b/keyboards/eason/meow65/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x68F4", "pid": "0x70A0", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/eason/void65h/keyboard.json b/keyboards/eason/void65h/keyboard.json index 006cdb28b8..484b939871 100644 --- a/keyboards/eason/void65h/keyboard.json +++ b/keyboards/eason/void65h/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x51D7", "pid": "0x5517", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/epomaker/tide65/keyboard.json b/keyboards/epomaker/tide65/keyboard.json index 7a384f180f..47561f8af0 100644 --- a/keyboards/epomaker/tide65/keyboard.json +++ b/keyboards/epomaker/tide65/keyboard.json @@ -143,11 +143,15 @@ }, "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0xE463", "suspend_wakeup_delay": 1000, "vid": "0x342D" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "pin": "B15" }, diff --git a/keyboards/fancytech/fancyalice66/keyboard.json b/keyboards/fancytech/fancyalice66/keyboard.json index 869ebe7465..c1f0a93f26 100644 --- a/keyboards/fancytech/fancyalice66/keyboard.json +++ b/keyboards/fancytech/fancyalice66/keyboard.json @@ -162,10 +162,14 @@ "url": "https://www.aliexpress.com/item/1005004272392611.html", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x3663", "vid": "0xECED" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "pin": "B0" }, diff --git a/keyboards/gboards/butterstick/keyboard.json b/keyboards/gboards/butterstick/keyboard.json index b1401eb87c..5b5cf773c8 100644 --- a/keyboards/gboards/butterstick/keyboard.json +++ b/keyboards/gboards/butterstick/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x1337", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "build": { "lto": true diff --git a/keyboards/gboards/georgi/keyboard.json b/keyboards/gboards/georgi/keyboard.json index 0b403a5a44..1262201f88 100644 --- a/keyboards/gboards/georgi/keyboard.json +++ b/keyboards/gboards/georgi/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0x1337", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "processor": "atmega32u4", "bootloader": "atmel-dfu", diff --git a/keyboards/gopolar/gg86/keyboard.json b/keyboards/gopolar/gg86/keyboard.json index a9944beea9..3412a7c63c 100644 --- a/keyboards/gopolar/gg86/keyboard.json +++ b/keyboards/gopolar/gg86/keyboard.json @@ -6,9 +6,13 @@ "vid": "0x0007", "pid": "0x0007", "device_version": "0.0.1", - "force_nkro": true, "no_startup_check": true }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "pin": "E2" }, diff --git a/keyboards/handwired/arrow_pad/keyboard.json b/keyboards/handwired/arrow_pad/keyboard.json index f70645fe2a..a9d0c0d818 100644 --- a/keyboards/handwired/arrow_pad/keyboard.json +++ b/keyboards/handwired/arrow_pad/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x4096", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/handwired/datahand/keyboard.json b/keyboards/handwired/datahand/keyboard.json index 1f1ebc07ee..3684dcc706 100644 --- a/keyboards/handwired/datahand/keyboard.json +++ b/keyboards/handwired/datahand/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x13BA", "pid": "0x0017", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "processor": "at90usb1286", "bootloader": "halfkay", diff --git a/keyboards/handwired/mutepad/keyboard.json b/keyboards/handwired/mutepad/keyboard.json index fd16cd7447..fdbfa025df 100644 --- a/keyboards/handwired/mutepad/keyboard.json +++ b/keyboards/handwired/mutepad/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0x0000", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/handwired/retro_refit/keyboard.json b/keyboards/handwired/retro_refit/keyboard.json index 73e747fffa..cc1904cb0c 100644 --- a/keyboards/handwired/retro_refit/keyboard.json +++ b/keyboards/handwired/retro_refit/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/handwired/split_cloud/keyboard.json b/keyboards/handwired/split_cloud/keyboard.json index fc1d2498df..b1e716ecde 100644 --- a/keyboards/handwired/split_cloud/keyboard.json +++ b/keyboards/handwired/split_cloud/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xCC43", "pid": "0x0001", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "diode_direction": "ROW2COL", "matrix_pins": { diff --git a/keyboards/handwired/twig/twig50/keyboard.json b/keyboards/handwired/twig/twig50/keyboard.json index 836caf3ebc..6fc90a97c1 100644 --- a/keyboards/handwired/twig/twig50/keyboard.json +++ b/keyboards/handwired/twig/twig50/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.2.1", - "force_nkro": true + "device_version": "0.2.1" + }, + "host": { + "default": { + "nkro": true + } }, "tapping": { "term": 150 diff --git a/keyboards/handwired/wulkan/keyboard.json b/keyboards/handwired/wulkan/keyboard.json index c804409b7d..c79b71ce49 100644 --- a/keyboards/handwired/wulkan/keyboard.json +++ b/keyboards/handwired/wulkan/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "matrix_pins": { "cols": ["B13", "B14", "B15", "B9", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0"], diff --git a/keyboards/handwired/xealous/rev1/keyboard.json b/keyboards/handwired/xealous/rev1/keyboard.json index 55e99eeb54..ac7b27208f 100644 --- a/keyboards/handwired/xealous/rev1/keyboard.json +++ b/keyboards/handwired/xealous/rev1/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4131", "pid": "0x5141", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "build": { "debounce_type": "sym_eager_pk" diff --git a/keyboards/hfdkb/ac001/keyboard.json b/keyboards/hfdkb/ac001/keyboard.json index 8d96cad375..ee9aab074b 100644 --- a/keyboards/hfdkb/ac001/keyboard.json +++ b/keyboards/hfdkb/ac001/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFFFE", "pid": "0x0001", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json index c0946cf3a6..fd655f0c0d 100644 --- a/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/black_e65/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x7516", "pid": "0x7000", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json index f10703ab5a..250cceb3e7 100644 --- a/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json +++ b/keyboards/horrortroll/chinese_pcb/devil68_pro/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x7516", "pid": "0x7001", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/horrortroll/handwired_k552/keyboard.json b/keyboards/horrortroll/handwired_k552/keyboard.json index 97f8ec822c..ecbcb4b779 100644 --- a/keyboards/horrortroll/handwired_k552/keyboard.json +++ b/keyboards/horrortroll/handwired_k552/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x7516", "pid": "0x5104", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "ws2812": { "pin": "C14" diff --git a/keyboards/horrortroll/lemon40/keyboard.json b/keyboards/horrortroll/lemon40/keyboard.json index 1c9993ca77..f2ff5be067 100644 --- a/keyboards/horrortroll/lemon40/keyboard.json +++ b/keyboards/horrortroll/lemon40/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x7516", "pid": "0x2434", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 15, diff --git a/keyboards/horrortroll/paws60/keyboard.json b/keyboards/horrortroll/paws60/keyboard.json index da03d362f9..da6e3a4fa2 100644 --- a/keyboards/horrortroll/paws60/keyboard.json +++ b/keyboards/horrortroll/paws60/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x7516", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/idobao/id42/keyboard.json b/keyboards/idobao/id42/keyboard.json index 2b075a7ba1..0f1cecd16a 100644 --- a/keyboards/idobao/id42/keyboard.json +++ b/keyboards/idobao/id42/keyboard.json @@ -69,9 +69,13 @@ "vid": "0x6964", "pid": "0x0042", "device_version": "1.0.0", - "force_nkro": true, "polling_interval": 2 - }, + }, + "host": { + "default": { + "nkro": true + } + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/inland/kb83/keyboard.json b/keyboards/inland/kb83/keyboard.json index 2920da52e1..cd454cb93d 100644 --- a/keyboards/inland/kb83/keyboard.json +++ b/keyboards/inland/kb83/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFFFE", "pid": "0x0007", - "device_version": "1.0.0", - "force_nkro": true + "device_version": "1.0.0" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/inland/mk47/keyboard.json b/keyboards/inland/mk47/keyboard.json index a69ec2ac4a..c777f54d52 100644 --- a/keyboards/inland/mk47/keyboard.json +++ b/keyboards/inland/mk47/keyboard.json @@ -6,9 +6,13 @@ "vid": "0xFFFE", "pid": "0x0002", "device_version": "0.0.1", - "force_nkro": true, "suspend_wakeup_delay": 1000 }, + "host": { + "default": { + "nkro": true + } + }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", "features": { diff --git a/keyboards/inland/v83p/keyboard.json b/keyboards/inland/v83p/keyboard.json index 5fad1a96d4..de93c5f372 100644 --- a/keyboards/inland/v83p/keyboard.json +++ b/keyboards/inland/v83p/keyboard.json @@ -8,9 +8,13 @@ "vid": "0xFFFE", "pid": "0x001B", "device_version": "1.0.3", - "force_nkro": true, "suspend_wakeup_delay": 1000 }, + "host": { + "default": { + "nkro": true + } + }, "diode_direction": "ROW2COL", "eeprom": { "driver": "wear_leveling", diff --git a/keyboards/kabedon/kabedon98e/keyboard.json b/keyboards/kabedon/kabedon98e/keyboard.json index 731c03dd74..70d0bb8ca4 100644 --- a/keyboards/kabedon/kabedon98e/keyboard.json +++ b/keyboards/kabedon/kabedon98e/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4B44", "pid": "0x3935", - "device_version": "0.0.2", - "force_nkro": true + "device_version": "0.0.2" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 24, diff --git a/keyboards/kb_elmo/gamehand/keyboard.json b/keyboards/kb_elmo/gamehand/keyboard.json index 39795bf250..9c2b847c1a 100644 --- a/keyboards/kb_elmo/gamehand/keyboard.json +++ b/keyboards/kb_elmo/gamehand/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xA68C", "pid": "0x4D90", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "processor": "atmega32u2", "bootloader": "atmel-dfu", diff --git a/keyboards/kbdfans/kbd75hs/keyboard.json b/keyboards/kbdfans/kbd75hs/keyboard.json index cba3e17e9a..45773d07aa 100644 --- a/keyboards/kbdfans/kbd75hs/keyboard.json +++ b/keyboards/kbdfans/kbd75hs/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4B42", "pid": "0x6062", - "device_version": "0.0.3", - "force_nkro": true + "device_version": "0.0.3" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/keychron/q0/info.json b/keyboards/keychron/q0/info.json index 666a797411..d7a7317e3f 100644 --- a/keyboards/keychron/q0/info.json +++ b/keyboards/keychron/q0/info.json @@ -45,7 +45,11 @@ }, "url": "https://github.com/Keychron", "usb": { - "force_nkro": true, "vid": "0x3434" + }, + "host": { + "default": { + "nkro": true + } } } \ No newline at end of file diff --git a/keyboards/keychron/q1v1/info.json b/keyboards/keychron/q1v1/info.json index b8ab503b07..034bb4357f 100644 --- a/keyboards/keychron/q1v1/info.json +++ b/keyboards/keychron/q1v1/info.json @@ -52,7 +52,11 @@ }, "url": "https://github.com/Keychron", "usb": { - "force_nkro": true, "vid": "0x3434" + }, + "host": { + "default": { + "nkro": true + } } } \ No newline at end of file diff --git a/keyboards/keyspensory/kp60/keyboard.json b/keyboards/keyspensory/kp60/keyboard.json index 2072186e9d..6634b522bb 100644 --- a/keyboards/keyspensory/kp60/keyboard.json +++ b/keyboards/keyspensory/kp60/keyboard.json @@ -7,8 +7,12 @@ "vid": "0x4B50", "pid": "0x0060", "device_version": "0.0.1", - "no_startup_check": true, - "force_nkro": true + "no_startup_check": true + }, + "host": { + "default": { + "nkro": true + } }, "diode_direction": "COL2ROW", "matrix_pins": { diff --git a/keyboards/kingly_keys/little_foot/keyboard.json b/keyboards/kingly_keys/little_foot/keyboard.json index 6188bed595..2ff3fd89cd 100644 --- a/keyboards/kingly_keys/little_foot/keyboard.json +++ b/keyboards/kingly_keys/little_foot/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "hue_steps": 6, diff --git a/keyboards/kingly_keys/smd_milk/keyboard.json b/keyboards/kingly_keys/smd_milk/keyboard.json index 943599dad1..2da20bf978 100644 --- a/keyboards/kingly_keys/smd_milk/keyboard.json +++ b/keyboards/kingly_keys/smd_milk/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0xB195", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "hue_steps": 6, diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json index e9e330b160..187816b660 100644 --- a/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json +++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4B50", "pid": "0x0653", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "saturation_steps": 8, diff --git a/keyboards/lendunistus/rpneko65/rev1/keyboard.json b/keyboards/lendunistus/rpneko65/rev1/keyboard.json index d0bb593996..20fed0a14b 100644 --- a/keyboards/lendunistus/rpneko65/rev1/keyboard.json +++ b/keyboards/lendunistus/rpneko65/rev1/keyboard.json @@ -22,10 +22,14 @@ "url": "https://github.com/lendunistus/rpneko65", "usb": { "device_version": "1.0.0", - "force_nkro": true, "pid": "0x0001", "vid": "0x6C75" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "driver": "vendor", "pin": "GP18" diff --git a/keyboards/linworks/dolice/keyboard.json b/keyboards/linworks/dolice/keyboard.json index bcdfda561f..ade3b37d0a 100644 --- a/keyboards/linworks/dolice/keyboard.json +++ b/keyboards/linworks/dolice/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4C58", "pid": "0x0005", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/linworks/fave87/keyboard.json b/keyboards/linworks/fave87/keyboard.json index 6dce6f39fe..132d3b5cbf 100644 --- a/keyboards/linworks/fave87/keyboard.json +++ b/keyboards/linworks/fave87/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4C58", "pid": "0x0002", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/linworks/whale75/keyboard.json b/keyboards/linworks/whale75/keyboard.json index 4298382471..19a6ce320d 100644 --- a/keyboards/linworks/whale75/keyboard.json +++ b/keyboards/linworks/whale75/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4C58", "pid": "0x0001", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 18, diff --git a/keyboards/magic_force/mf17/keyboard.json b/keyboards/magic_force/mf17/keyboard.json index 10469f63c6..c0f0e6bd57 100644 --- a/keyboards/magic_force/mf17/keyboard.json +++ b/keyboards/magic_force/mf17/keyboard.json @@ -12,10 +12,14 @@ }, "usb": { "device_version": "1.0.0", - "force_nkro": true, "vid": "0x3A54", "pid": "0x4F5D" }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "extrakey": true, diff --git a/keyboards/magic_force/mf34/keyboard.json b/keyboards/magic_force/mf34/keyboard.json index 44d1a4ec92..9acae04b27 100644 --- a/keyboards/magic_force/mf34/keyboard.json +++ b/keyboards/magic_force/mf34/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x1A53", "pid": "0x4F51", - "device_version": "1.0.2", - "force_nkro": true + "device_version": "1.0.2" + }, + "host": { + "default": { + "nkro": true + } }, "indicators": { "num_lock": "B15" diff --git a/keyboards/mechllama/g35/info.json b/keyboards/mechllama/g35/info.json index fab11db131..8c6489409e 100644 --- a/keyboards/mechllama/g35/info.json +++ b/keyboards/mechllama/g35/info.json @@ -13,8 +13,12 @@ }, "usb": { "vid": "0xCEEB", - "pid": "0x0035", - "force_nkro": true + "pid": "0x0035" + }, + "host": { + "default": { + "nkro": true + } }, "ws2812": { "pin": "F7" diff --git a/keyboards/mechwild/bbs/keyboard.json b/keyboards/mechwild/bbs/keyboard.json index 8985c4526a..c8a57c8bc5 100644 --- a/keyboards/mechwild/bbs/keyboard.json +++ b/keyboards/mechwild/bbs/keyboard.json @@ -44,13 +44,17 @@ "url": "https://mechwild.com/product/bb-steno/", "usb": { "device_version": "1.1.0", - "force_nkro": true, "pid": "0x170E", "shared_endpoint": { "keyboard": true }, "vid": "0x6D77" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "driver": "pwm", "pin": "B9" diff --git a/keyboards/mechwild/sugarglider/info.json b/keyboards/mechwild/sugarglider/info.json index 0b796f7c21..514c90b6ce 100644 --- a/keyboards/mechwild/sugarglider/info.json +++ b/keyboards/mechwild/sugarglider/info.json @@ -7,11 +7,15 @@ "vid": "0x6D77", "pid": "0x1710", "device_version": "0.2.0", - "force_nkro": true, "shared_endpoint": { "keyboard": true } }, + "host": { + "default": { + "nkro": true + } + }, "diode_direction": "COL2ROW", "dynamic_keymap": { "layer_count": 5 diff --git a/keyboards/miiiw/blackio83/rev_0100/keyboard.json b/keyboards/miiiw/blackio83/rev_0100/keyboard.json index e5cf747537..bc94408419 100644 --- a/keyboards/miiiw/blackio83/rev_0100/keyboard.json +++ b/keyboards/miiiw/blackio83/rev_0100/keyboard.json @@ -166,10 +166,14 @@ "url": "https://github.com/ArthurCyy", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x83A1", "vid": "0x3044" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "pin": "B15" }, diff --git a/keyboards/millipad/keyboard.json b/keyboards/millipad/keyboard.json index d2761b8b1b..e4e107c5a6 100644 --- a/keyboards/millipad/keyboard.json +++ b/keyboards/millipad/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0x1A1B", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/misonoworks/chocolatebar/keyboard.json b/keyboards/misonoworks/chocolatebar/keyboard.json index 75b10ae561..13bc64f16f 100644 --- a/keyboards/misonoworks/chocolatebar/keyboard.json +++ b/keyboards/misonoworks/chocolatebar/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x6D77", "pid": "0xC456", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 12, diff --git a/keyboards/misonoworks/karina/keyboard.json b/keyboards/misonoworks/karina/keyboard.json index 1266c07cea..ef2b7f7e6e 100644 --- a/keyboards/misonoworks/karina/keyboard.json +++ b/keyboards/misonoworks/karina/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0xC456", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "led_count": 19, diff --git a/keyboards/ml/gas75/keyboard.json b/keyboards/ml/gas75/keyboard.json index b7736884fc..280735eb14 100644 --- a/keyboards/ml/gas75/keyboard.json +++ b/keyboards/ml/gas75/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xC0B0", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/mmkeyboard/class60/soldered/keyboard.json b/keyboards/mmkeyboard/class60/soldered/keyboard.json index cb28da366c..8615129e83 100644 --- a/keyboards/mmkeyboard/class60/soldered/keyboard.json +++ b/keyboards/mmkeyboard/class60/soldered/keyboard.json @@ -36,10 +36,14 @@ "url": "https://www.mmkeyboard.com/products/mm-class60-retro-custom-mechanical-keyboard", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x3876", "vid": "0x4F66" }, + "host": { + "default": { + "nkro": true + } + }, "community_layouts": [ "60_ansi", "60_ansi_split_bs_rshift", diff --git a/keyboards/mmkzoo65/keyboard.json b/keyboards/mmkzoo65/keyboard.json index fdd5f50b60..3d752d6d5d 100644 --- a/keyboards/mmkzoo65/keyboard.json +++ b/keyboards/mmkzoo65/keyboard.json @@ -6,9 +6,13 @@ "vid": "0x7BA1", "pid": "0x6505", "device_version": "0.0.1", - "force_nkro": true, "polling_interval": 2 }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "extrakey": true, diff --git a/keyboards/monsgeek/m1/keyboard.json b/keyboards/monsgeek/m1/keyboard.json index 4cca5c8686..7a7d1308ce 100644 --- a/keyboards/monsgeek/m1/keyboard.json +++ b/keyboards/monsgeek/m1/keyboard.json @@ -3,12 +3,16 @@ "manufacturer": "MonsGeek", "maintainer": "jonylee@hfd", "usb": { - "force_nkro": true, "vid": "0xFFFE", "pid": "0x0005", "device_version": "1.1.0", "suspend_wakeup_delay": 400 }, + "host": { + "default": { + "nkro": true + } + }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", "features": { diff --git a/keyboards/monsgeek/m3/keyboard.json b/keyboards/monsgeek/m3/keyboard.json index 9d2ea18c9d..f3d318176b 100644 --- a/keyboards/monsgeek/m3/keyboard.json +++ b/keyboards/monsgeek/m3/keyboard.json @@ -6,8 +6,12 @@ "vid": "0xFFFE", "pid": "0x0009", "device_version": "1.0.5", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/monsgeek/m5/keyboard.json b/keyboards/monsgeek/m5/keyboard.json index 92d6add3fe..f439830f8a 100644 --- a/keyboards/monsgeek/m5/keyboard.json +++ b/keyboards/monsgeek/m5/keyboard.json @@ -6,8 +6,12 @@ "vid": "0xFFFE", "pid": "0x000A", "device_version": "1.0.4", - "suspend_wakeup_delay": 400, - "force_nkro": true + "suspend_wakeup_delay": 400 + }, + "host": { + "default": { + "nkro": true + } }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", diff --git a/keyboards/monsgeek/m6/keyboard.json b/keyboards/monsgeek/m6/keyboard.json index afe38eb0da..bcc14da2e4 100644 --- a/keyboards/monsgeek/m6/keyboard.json +++ b/keyboards/monsgeek/m6/keyboard.json @@ -3,12 +3,16 @@ "manufacturer": "MonsGeek", "maintainer": "jonylee@hfd", "usb": { - "force_nkro": true, "vid": "0xFFFE", "pid": "0x0011", "device_version": "1.0.0", "suspend_wakeup_delay": 400 }, + "host": { + "default": { + "nkro": true + } + }, "processor": "WB32FQ95", "bootloader": "wb32-dfu", "features": { diff --git a/keyboards/mss_studio/m63_rgb/keyboard.json b/keyboards/mss_studio/m63_rgb/keyboard.json index 16a4c5295f..b798df21dd 100644 --- a/keyboards/mss_studio/m63_rgb/keyboard.json +++ b/keyboards/mss_studio/m63_rgb/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4D4B", "pid": "0x6063", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "ws2812": { "pin": "B15" diff --git a/keyboards/mss_studio/m64_rgb/keyboard.json b/keyboards/mss_studio/m64_rgb/keyboard.json index 5b53cd58c7..083afec8c7 100644 --- a/keyboards/mss_studio/m64_rgb/keyboard.json +++ b/keyboards/mss_studio/m64_rgb/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4D4B", "pid": "0x6064", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "ws2812": { "pin": "B15" diff --git a/keyboards/mwstudio/alicekk/keyboard.json b/keyboards/mwstudio/alicekk/keyboard.json index 355437f953..fe76ec123d 100644 --- a/keyboards/mwstudio/alicekk/keyboard.json +++ b/keyboards/mwstudio/alicekk/keyboard.json @@ -4,8 +4,12 @@ "usb": { "vid": "0x7BA1", "pid": "0x3201", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/mwstudio/mw660/keyboard.json b/keyboards/mwstudio/mw660/keyboard.json index bf0cd6781c..385abb1828 100644 --- a/keyboards/mwstudio/mw660/keyboard.json +++ b/keyboards/mwstudio/mw660/keyboard.json @@ -25,8 +25,12 @@ "usb": { "device_version": "1.0.0", "pid": "0x6601", - "vid": "0x7BA1", - "force_nkro": true + "vid": "0x7BA1" + }, + "host": { + "default": { + "nkro": true + } }, "layouts": { "LAYOUT": { diff --git a/keyboards/omnikeyish/keyboard.json b/keyboards/omnikeyish/keyboard.json index 82363b10bf..2a607dc852 100644 --- a/keyboards/omnikeyish/keyboard.json +++ b/keyboards/omnikeyish/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0x0666", - "device_version": "13.3.7", - "force_nkro": true + "device_version": "13.3.7" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/opendeck/32/info.json b/keyboards/opendeck/32/info.json index 4d340985d3..3a75fd163b 100644 --- a/keyboards/opendeck/32/info.json +++ b/keyboards/opendeck/32/info.json @@ -4,7 +4,11 @@ "usb": { "vid": "0x4345", "pid": "0x2EC0", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } } } diff --git a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json index 8fcea8034d..b6a519f686 100644 --- a/keyboards/owlab/jelly_epoch/hotswap/keyboard.json +++ b/keyboards/owlab/jelly_epoch/hotswap/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x4F53", "pid": "0x4A4C", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/owlab/jelly_epoch/soldered/keyboard.json b/keyboards/owlab/jelly_epoch/soldered/keyboard.json index 2d807c58a9..b8c83b8c41 100644 --- a/keyboards/owlab/jelly_epoch/soldered/keyboard.json +++ b/keyboards/owlab/jelly_epoch/soldered/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x4F53", "pid": "0x4A53", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/owlab/spring/keyboard.json b/keyboards/owlab/spring/keyboard.json index 1789f4ebb1..2a8d1e2d9b 100644 --- a/keyboards/owlab/spring/keyboard.json +++ b/keyboards/owlab/spring/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4F53", "pid": "0x5350", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/owlab/suit80/ansi/keyboard.json b/keyboards/owlab/suit80/ansi/keyboard.json index fe0f1b6e4b..b01ec347d3 100644 --- a/keyboards/owlab/suit80/ansi/keyboard.json +++ b/keyboards/owlab/suit80/ansi/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4F53", "pid": "0x5355", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/owlab/suit80/iso/keyboard.json b/keyboards/owlab/suit80/iso/keyboard.json index 2d9fcde472..a2814b0942 100644 --- a/keyboards/owlab/suit80/iso/keyboard.json +++ b/keyboards/owlab/suit80/iso/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4F53", "pid": "0x5349", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/owlab/voice65/hotswap/keyboard.json b/keyboards/owlab/voice65/hotswap/keyboard.json index f153efbde2..79ca2a57ed 100644 --- a/keyboards/owlab/voice65/hotswap/keyboard.json +++ b/keyboards/owlab/voice65/hotswap/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x4F53", "pid": "0x564F", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/owlab/voice65/soldered/keyboard.json b/keyboards/owlab/voice65/soldered/keyboard.json index 932c32d2fd..edd79a064f 100644 --- a/keyboards/owlab/voice65/soldered/keyboard.json +++ b/keyboards/owlab/voice65/soldered/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x4F53", "pid": "0x5657", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/phentech/rpk_001/keyboard.json b/keyboards/phentech/rpk_001/keyboard.json index ce822295b2..df92139874 100644 --- a/keyboards/phentech/rpk_001/keyboard.json +++ b/keyboards/phentech/rpk_001/keyboard.json @@ -8,9 +8,13 @@ "device_version": "1.0.0", "vid": "0xAC12", "pid": "0x2236", - "force_nkro": true, "suspend_wakeup_delay": 1000 }, + "host": { + "default": { + "nkro": true + } + }, "diode_direction": "ROW2COL", "eeprom": { "driver": "wear_leveling", diff --git a/keyboards/polycarbdiet/s20/keyboard.json b/keyboards/polycarbdiet/s20/keyboard.json index e8b180b860..327debdb7d 100644 --- a/keyboards/polycarbdiet/s20/keyboard.json +++ b/keyboards/polycarbdiet/s20/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5040", "pid": "0x7320", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "backlight": true, diff --git a/keyboards/qwertykeys/qk65/hotswap/keyboard.json b/keyboards/qwertykeys/qk65/hotswap/keyboard.json index 3aa8597626..2cdfe33ba3 100644 --- a/keyboards/qwertykeys/qk65/hotswap/keyboard.json +++ b/keyboards/qwertykeys/qk65/hotswap/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4F53", "pid": "0x514B", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/qwertykeys/qk65/solder/keyboard.json b/keyboards/qwertykeys/qk65/solder/keyboard.json index 0d02ba7a91..63afc40994 100644 --- a/keyboards/qwertykeys/qk65/solder/keyboard.json +++ b/keyboards/qwertykeys/qk65/solder/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x4F53", "pid": "0x5153", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/rate/pistachio/info.json b/keyboards/rate/pistachio/info.json index 7136860260..0e65b68f98 100644 --- a/keyboards/rate/pistachio/info.json +++ b/keyboards/rate/pistachio/info.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5255", "pid": "0xD0C2", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "processor": "atmega32u4", "bootloader": "caterina" diff --git a/keyboards/rate/pistachio_mp/keyboard.json b/keyboards/rate/pistachio_mp/keyboard.json index cea6190b84..299dc5c3a8 100644 --- a/keyboards/rate/pistachio_mp/keyboard.json +++ b/keyboards/rate/pistachio_mp/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5255", "pid": "0xE212", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "hue_steps": 10, diff --git a/keyboards/rose75/keyboard.json b/keyboards/rose75/keyboard.json index 1c756d3fdd..09d0b7af19 100644 --- a/keyboards/rose75/keyboard.json +++ b/keyboards/rose75/keyboard.json @@ -28,10 +28,14 @@ "url": "https://github.com/Smollchungus", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x7503", "vid": "0x5363" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "driver": "vendor", "pin": "GP29" diff --git a/keyboards/runes/skjoldr/keyboard.json b/keyboards/runes/skjoldr/keyboard.json index ff3476697e..b48cb2a1d9 100644 --- a/keyboards/runes/skjoldr/keyboard.json +++ b/keyboards/runes/skjoldr/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x726E", "pid": "0x736B", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/runes/vaengr/keyboard.json b/keyboards/runes/vaengr/keyboard.json index dce2c7a228..1910f37f0d 100644 --- a/keyboards/runes/vaengr/keyboard.json +++ b/keyboards/runes/vaengr/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x726E", "pid": "0x7661", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgblight": { "hue_steps": 10, diff --git a/keyboards/ryanskidmore/rskeys100/keyboard.json b/keyboards/ryanskidmore/rskeys100/keyboard.json index 27eae84a6e..b62d870aba 100644 --- a/keyboards/ryanskidmore/rskeys100/keyboard.json +++ b/keyboards/ryanskidmore/rskeys100/keyboard.json @@ -4,8 +4,12 @@ "usb": { "vid": "0x7273", "pid": "0x0064", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/sawnsprojects/bunnygirl65/keyboard.json b/keyboards/sawnsprojects/bunnygirl65/keyboard.json index 3fab84c557..b23f41e7d7 100644 --- a/keyboards/sawnsprojects/bunnygirl65/keyboard.json +++ b/keyboards/sawnsprojects/bunnygirl65/keyboard.json @@ -17,10 +17,14 @@ "processor": "STM32F072", "usb": { "device_version": "1.0.0", - "force_nkro": true, "pid": "0x00A2", "vid": "0x5350" }, + "host": { + "default": { + "nkro": true + } + }, "community_layouts": ["65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs"], "layouts": { "LAYOUT_65_ansi_blocker_tsangan": { diff --git a/keyboards/sawnsprojects/okayu/info.json b/keyboards/sawnsprojects/okayu/info.json index 14c8f20c35..21c5e899ce 100644 --- a/keyboards/sawnsprojects/okayu/info.json +++ b/keyboards/sawnsprojects/okayu/info.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5350", "pid": "0x00A1", - "device_version": "1.0.0", - "force_nkro": true + "device_version": "1.0.0" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/sixkeyboard/keyboard.json b/keyboards/sixkeyboard/keyboard.json index 5c29dee16f..ca846affb3 100644 --- a/keyboards/sixkeyboard/keyboard.json +++ b/keyboards/sixkeyboard/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x746B", "pid": "0x736B", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": false, diff --git a/keyboards/skmt/15k/keyboard.json b/keyboards/skmt/15k/keyboard.json index d09f3fb989..2cfb05bae6 100644 --- a/keyboards/skmt/15k/keyboard.json +++ b/keyboards/skmt/15k/keyboard.json @@ -23,8 +23,12 @@ "usb": { "device_version": "1.1.0", "pid": "0x3488", - "vid": "0xFEFE", - "force_nkro": true + "vid": "0xFEFE" + }, + "host": { + "default": { + "nkro": true + } }, "layouts": { "LAYOUT_default": { diff --git a/keyboards/skyloong/gk61/v1/keyboard.json b/keyboards/skyloong/gk61/v1/keyboard.json index 68fda1220f..e6ce09ae7f 100644 --- a/keyboards/skyloong/gk61/v1/keyboard.json +++ b/keyboards/skyloong/gk61/v1/keyboard.json @@ -119,8 +119,12 @@ "vid": "0x1EA7", "device_version": "1.0.0", "pid": "0x6061", - "max_power": 380, - "force_nkro": true + "max_power": 380 + }, + "host": { + "default": { + "nkro": true + } }, "community_layouts": ["60_ansi"], "layouts": { diff --git a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json index 9cbed0feb9..770fbbb0e9 100644 --- a/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/pro_micro/keyboard.json @@ -1,7 +1,11 @@ { "usb": { - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json index e1753f2b84..6ec92ce422 100644 --- a/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/rp_2040/keyboard.json @@ -1,7 +1,11 @@ { "usb": { - "device_version": "0.0.4", - "force_nkro": true + "device_version": "0.0.4" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json index 81639fe32b..2cf1e4e324 100644 --- a/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json +++ b/keyboards/stenokeyboards/the_uni/usb_c/keyboard.json @@ -1,7 +1,11 @@ { "usb": { - "device_version": "0.0.3", - "force_nkro": true + "device_version": "0.0.3" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/synthlabs/060/keyboard.json b/keyboards/synthlabs/060/keyboard.json index e251201a51..4183232dd1 100644 --- a/keyboards/synthlabs/060/keyboard.json +++ b/keyboards/synthlabs/060/keyboard.json @@ -23,8 +23,12 @@ "usb": { "vid": "0x534E", "pid": "0x3630", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/synthlabs/065/keyboard.json b/keyboards/synthlabs/065/keyboard.json index ea862c6f01..1cd9e03a6a 100644 --- a/keyboards/synthlabs/065/keyboard.json +++ b/keyboards/synthlabs/065/keyboard.json @@ -152,10 +152,14 @@ "url": "http://065.synthlabs.io", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x3635", "vid": "0x534E" }, + "host": { + "default": { + "nkro": true + } + }, "ws2812": { "driver": "vendor", "pin": "GP18" diff --git a/keyboards/synthlabs/solo/keyboard.json b/keyboards/synthlabs/solo/keyboard.json index 6640202474..09c83cec76 100644 --- a/keyboards/synthlabs/solo/keyboard.json +++ b/keyboards/synthlabs/solo/keyboard.json @@ -22,8 +22,12 @@ "usb": { "vid": "0x534E", "pid": "0x3031", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "encoder": { "rotary": [ diff --git a/keyboards/tacworks/tac_k1/keyboard.json b/keyboards/tacworks/tac_k1/keyboard.json index f1875ec180..63cde4777f 100644 --- a/keyboards/tacworks/tac_k1/keyboard.json +++ b/keyboards/tacworks/tac_k1/keyboard.json @@ -29,11 +29,15 @@ "url": "https://tacworks.store", "usb": { "device_version": "1.0.0", - "force_nkro": true, "pid": "0xE431", "suspend_wakeup_delay": 1000, "vid": "0x342D" }, + "host": { + "default": { + "nkro": true + } + }, "community_layouts": [ "65_ansi_blocker", "65_ansi_blocker_split_bs", diff --git a/keyboards/teleport/native/info.json b/keyboards/teleport/native/info.json index 08432fbf14..b1cb06c942 100644 --- a/keyboards/teleport/native/info.json +++ b/keyboards/teleport/native/info.json @@ -7,8 +7,12 @@ "processor": "STM32F411", "usb": { "vid": "0x7470", - "device_version": "1.0.0", - "force_nkro": true + "device_version": "1.0.0" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/tweetydabird/lotus58/info.json b/keyboards/tweetydabird/lotus58/info.json index 7becd3ae26..3c47e3fdc2 100644 --- a/keyboards/tweetydabird/lotus58/info.json +++ b/keyboards/tweetydabird/lotus58/info.json @@ -45,10 +45,14 @@ "url": "https://lectronz.com/stores/tweetys-wild-thinking", "usb": { "device_version": "1.2.3", - "force_nkro": true, "pid": "0x23B0", "vid": "0xFEED" }, + "host": { + "default": { + "nkro": true + } + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/vertex/angle65/keyboard.json b/keyboards/vertex/angle65/keyboard.json index 3047d82dfa..6e0a6525ba 100644 --- a/keyboards/vertex/angle65/keyboard.json +++ b/keyboards/vertex/angle65/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x9954", "pid": "0x9970", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": false, diff --git a/keyboards/vertex/arc60/keyboard.json b/keyboards/vertex/arc60/keyboard.json index 7bca331f44..b370e699ec 100644 --- a/keyboards/vertex/arc60/keyboard.json +++ b/keyboards/vertex/arc60/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x8354", "pid": "0x8370", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": false, diff --git a/keyboards/vertex/arc60h/keyboard.json b/keyboards/vertex/arc60h/keyboard.json index 684bbb9538..0fc6f642a3 100644 --- a/keyboards/vertex/arc60h/keyboard.json +++ b/keyboards/vertex/arc60h/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x7374", "pid": "0x9770", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "indicators": { "caps_lock": "C13", diff --git a/keyboards/vertex/cycle8/keyboard.json b/keyboards/vertex/cycle8/keyboard.json index d00ef3eb49..d1a341df20 100644 --- a/keyboards/vertex/cycle8/keyboard.json +++ b/keyboards/vertex/cycle8/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x8A94", "pid": "0x8F70", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/vertex/t75/keyboard.json b/keyboards/vertex/t75/keyboard.json index 32e85cf8b4..f67326afb8 100644 --- a/keyboards/vertex/t75/keyboard.json +++ b/keyboards/vertex/t75/keyboard.json @@ -20,10 +20,14 @@ "processor": "STM32F103", "usb": { "device_version": "0.0.1", - "force_nkro": true, "pid": "0x3006", "vid": "0x28E9" }, + "host": { + "default": { + "nkro": true + } + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/viktus/at101_bh/keyboard.json b/keyboards/viktus/at101_bh/keyboard.json index de7498964e..ca37ecedeb 100644 --- a/keyboards/viktus/at101_bh/keyboard.json +++ b/keyboards/viktus/at101_bh/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/viktus/omnikey_bh/keyboard.json b/keyboards/viktus/omnikey_bh/keyboard.json index 8128a30b25..6bceb1e0db 100644 --- a/keyboards/viktus/omnikey_bh/keyboard.json +++ b/keyboards/viktus/omnikey_bh/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/viktus/z150_bh/keyboard.json b/keyboards/viktus/z150_bh/keyboard.json index 29bba7b8ab..912ee03bab 100644 --- a/keyboards/viktus/z150_bh/keyboard.json +++ b/keyboards/viktus/z150_bh/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0xFEED", "pid": "0x6060", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/willoucom/keypad/keyboard.json b/keyboards/willoucom/keypad/keyboard.json index 1d070ea4e2..9b4717e63f 100644 --- a/keyboards/willoucom/keypad/keyboard.json +++ b/keyboards/willoucom/keypad/keyboard.json @@ -22,10 +22,14 @@ }, "usb": { "device_version": "1.0.0", - "force_nkro": true, "pid": "0x4B50", "vid": "0x574A" }, + "host": { + "default": { + "nkro": true + } + }, "layouts": { "LAYOUT": { "layout": [ diff --git a/keyboards/wuque/tata80/wk/keyboard.json b/keyboards/wuque/tata80/wk/keyboard.json index 5b5b1fe50e..a5ae56720b 100644 --- a/keyboards/wuque/tata80/wk/keyboard.json +++ b/keyboards/wuque/tata80/wk/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x2365", "pid": "0x0168", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/wuque/tata80/wkl/keyboard.json b/keyboards/wuque/tata80/wkl/keyboard.json index d8633e99f9..3eee37ef19 100644 --- a/keyboards/wuque/tata80/wkl/keyboard.json +++ b/keyboards/wuque/tata80/wkl/keyboard.json @@ -6,8 +6,12 @@ "usb": { "vid": "0x2365", "pid": "0x0169", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/xelus/dharma/keyboard.json b/keyboards/xelus/dharma/keyboard.json index adedaedba4..373db3f84e 100644 --- a/keyboards/xelus/dharma/keyboard.json +++ b/keyboards/xelus/dharma/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5845", "pid": "0xDAAA", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/xelus/pachi/rgb/rev1/keyboard.json b/keyboards/xelus/pachi/rgb/rev1/keyboard.json index a27bcae0fc..59d335d6e7 100644 --- a/keyboards/xelus/pachi/rgb/rev1/keyboard.json +++ b/keyboards/xelus/pachi/rgb/rev1/keyboard.json @@ -5,8 +5,12 @@ "usb": { "vid": "0x5845", "pid": "0x5052", - "device_version": "0.0.1", - "force_nkro": true + "device_version": "0.0.1" + }, + "host": { + "default": { + "nkro": true + } }, "rgb_matrix": { "animations": { diff --git a/keyboards/xelus/rs108/keyboard.json b/keyboards/xelus/rs108/keyboard.json index c524ae09ed..b1964e0577 100644 --- a/keyboards/xelus/rs108/keyboard.json +++ b/keyboards/xelus/rs108/keyboard.json @@ -6,11 +6,15 @@ "vid": "0x5845", "pid": "0x5208", "device_version": "0.0.2", - "force_nkro": true, "shared_endpoint": { "keyboard": true } }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "console": true, diff --git a/keyboards/xelus/rs60/rev1/keyboard.json b/keyboards/xelus/rs60/rev1/keyboard.json index 4f894056f6..c8a1afa790 100644 --- a/keyboards/xelus/rs60/rev1/keyboard.json +++ b/keyboards/xelus/rs60/rev1/keyboard.json @@ -1,7 +1,11 @@ { "usb": { - "device_version": "0.1.0", - "force_nkro": true + "device_version": "0.1.0" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, diff --git a/keyboards/xelus/rs60/rev2_0/keyboard.json b/keyboards/xelus/rs60/rev2_0/keyboard.json index e5506e0040..1ec1e71d42 100644 --- a/keyboards/xelus/rs60/rev2_0/keyboard.json +++ b/keyboards/xelus/rs60/rev2_0/keyboard.json @@ -1,11 +1,15 @@ { "usb": { "device_version": "0.2.0", - "force_nkro": true, "shared_endpoint": { "keyboard": true } }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "console": true, diff --git a/keyboards/xelus/rs60/rev2_1/keyboard.json b/keyboards/xelus/rs60/rev2_1/keyboard.json index c116abc30b..86f3c2fa3d 100644 --- a/keyboards/xelus/rs60/rev2_1/keyboard.json +++ b/keyboards/xelus/rs60/rev2_1/keyboard.json @@ -1,11 +1,15 @@ { "usb": { "device_version": "0.2.1", - "force_nkro": true, "shared_endpoint": { "keyboard": true } }, + "host": { + "default": { + "nkro": true + } + }, "features": { "bootmagic": true, "console": true, diff --git a/keyboards/yandrstudio/zhou65/keyboard.json b/keyboards/yandrstudio/zhou65/keyboard.json index 6e65bacea2..0766bd3eca 100644 --- a/keyboards/yandrstudio/zhou65/keyboard.json +++ b/keyboards/yandrstudio/zhou65/keyboard.json @@ -2,8 +2,12 @@ "keyboard_name": "zhou65", "usb": { "pid": "0xAAAD", - "device_version": "1.0.0", - "force_nkro": true + "device_version": "1.0.0" + }, + "host": { + "default": { + "nkro": true + } }, "features": { "bootmagic": true, From 87e5df1b9ef59440787d065a126b9368fae32c44 Mon Sep 17 00:00:00 2001 From: Andrew Cooney Date: Thu, 10 Jul 2025 07:02:08 -0400 Subject: [PATCH 491/592] 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 7fd245d59a..4176344b5a 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 e1b42d525279189b1bd9c40e96565c6ebc76c438 Mon Sep 17 00:00:00 2001 From: jack Date: Thu, 10 Jul 2025 05:42:36 -0600 Subject: [PATCH 492/592] Refactor `bastardkb/dilemma/3x5_2` (#25462) * Refactor bastardkb/dilemma/3x5_2 - Rename splinky -> promicro as the DIY PCB supports a Pro Micro compatible development board - Update keyboard aliases accordingly - Migrated shared configuration to top level 3x5_2 directory - Migrate keymap to JSON - Migrate miscellaneous configuration to JSON - Remove configuration that trends towards user-specific (CRC Table) - Use short SPDX license headers - Tidy up readme and make note of differences between PCBs In short, the only difference between these two revisions (assembled vs. promicro) is SPI vs. I2C (respectively) is used for the Cirque Trackpad. * Migrate promicro configuration to AVR The code in dilemma.c that reinitialises the ADC capable pins on RP2040 as digital inputs is not needed. Per section RP2040-E6 (p.630) of RP2040 datasheet, it appears digital inputs are *not* disabled, and this should be handled internally anyway in matrix initialisation --- data/mappings/keyboard_aliases.hjson | 3 + .../dilemma/3x5_2/assembled/config.h | 29 +------ .../dilemma/3x5_2/assembled/halconf.h | 19 +---- .../dilemma/3x5_2/assembled/keyboard.json | 19 ++--- .../dilemma/3x5_2/assembled/mcuconf.h | 19 +---- .../dilemma/3x5_2/assembled/rules.mk | 8 +- keyboards/bastardkb/dilemma/3x5_2/config.h | 5 ++ keyboards/bastardkb/dilemma/3x5_2/info.json | 18 ++-- .../dilemma/3x5_2/keymaps/default/keymap.c | 84 ------------------- .../dilemma/3x5_2/keymaps/default/keymap.json | 26 ++++++ .../dilemma/3x5_2/promicro/keyboard.json | 15 ++++ .../bastardkb/dilemma/3x5_2/promicro/rules.mk | 1 + .../bastardkb/dilemma/3x5_2/splinky/config.h | 37 -------- .../bastardkb/dilemma/3x5_2/splinky/halconf.h | 21 ----- .../dilemma/3x5_2/splinky/keyboard.json | 22 ----- .../bastardkb/dilemma/3x5_2/splinky/mcuconf.h | 23 ----- .../bastardkb/dilemma/3x5_2/splinky/rules.mk | 7 -- keyboards/bastardkb/dilemma/dilemma.c | 16 ---- keyboards/bastardkb/dilemma/readme.md | 26 ++++-- 19 files changed, 93 insertions(+), 305 deletions(-) create mode 100644 keyboards/bastardkb/dilemma/3x5_2/config.h delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.json create mode 100644 keyboards/bastardkb/dilemma/3x5_2/promicro/keyboard.json create mode 100644 keyboards/bastardkb/dilemma/3x5_2/promicro/rules.mk delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/splinky/config.h delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h delete mode 100644 keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 942a60946d..cf0cfe52f1 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -68,6 +68,9 @@ "bakeneko80": { "target": "kkatano/bakeneko80" }, + "bastardkb/dilemma/3x5_2/splinky": { + "target": "bastardkb/dilemma/3x5_2/promicro" + }, "bastardkb/scylla/v2/elitec": { "target": "bastardkb/scylla/promicro" }, diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h index 4366a8a3e9..18ce680709 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/config.h @@ -1,37 +1,12 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN GP29 -#define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* Cirque trackpad. */ #define SPI_SCK_PIN GP22 #define SPI_MOSI_PIN GP23 #define SPI_MISO_PIN GP20 #define POINTING_DEVICE_CS_PIN GP21 -/* Reset. */ #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h index 57d15376d6..7f198be26b 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/halconf.h @@ -1,20 +1,5 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_SPI TRUE diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json index 366deac293..c388855691 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json @@ -1,22 +1,17 @@ { - "keyboard_name": "Dilemma (3x5+2) Assembled", - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "pointing_device": true - }, + "bootloader": "rp2040", "matrix_pins": { "cols": ["GP8", "GP9", "GP7", "GP6", "GP27"], "rows": ["GP4", "GP5", "GP28", "GP26"] }, - "diode_direction": "ROW2COL", + "processor": "RP2040", "split": { - "enabled": true, + "handedness": { + "pin": "GP29" + }, "serial": { + "driver": "vendor", "pin": "GP1" } - }, - "processor": "RP2040", - "bootloader": "rp2040" + } } diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h index 81821c159d..43d849d2a2 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h @@ -1,20 +1,5 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk index 48216ee8b7..fb5d649735 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/rules.mk @@ -1,7 +1 @@ -AUDIO_SUPPORTED = no # Audio is not supported -RGB_MATRIX_SUPPORTED = no # RGB matrix is supported and enabled by default -RGBLIGHT_SUPPORTED = no # RGB underglow is supported, but not enabled by default - -SERIAL_DRIVER = vendor - -POINTING_DEVICE_DRIVER = cirque_pinnacle_spi # Assembled version uses SPI. +POINTING_DEVICE_DRIVER = cirque_pinnacle_spi diff --git a/keyboards/bastardkb/dilemma/3x5_2/config.h b/keyboards/bastardkb/dilemma/3x5_2/config.h new file mode 100644 index 0000000000..cd7f368bd3 --- /dev/null +++ b/keyboards/bastardkb/dilemma/3x5_2/config.h @@ -0,0 +1,5 @@ +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define SPLIT_HAND_PIN_LOW_IS_LEFT diff --git a/keyboards/bastardkb/dilemma/3x5_2/info.json b/keyboards/bastardkb/dilemma/3x5_2/info.json index bfd12e81d0..9e34cac13e 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/info.json +++ b/keyboards/bastardkb/dilemma/3x5_2/info.json @@ -1,4 +1,15 @@ { + "keyboard_name": "Dilemma 3x5+2", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "pointing_device": true + }, + "split": { + "enabled": true + }, "usb": { "device_version": "1.0.0", "pid": "0x1835" @@ -12,40 +23,33 @@ {"matrix": [0, 2], "x": 2, "y": 0}, {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, - {"matrix": [4, 4], "x": 11, "y": 0}, {"matrix": [4, 3], "x": 12, "y": 0}, {"matrix": [4, 2], "x": 13, "y": 0}, {"matrix": [4, 1], "x": 14, "y": 0}, {"matrix": [4, 0], "x": 15, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [5, 4], "x": 11, "y": 1}, {"matrix": [5, 3], "x": 12, "y": 1}, {"matrix": [5, 2], "x": 13, "y": 1}, {"matrix": [5, 1], "x": 14, "y": 1}, {"matrix": [5, 0], "x": 15, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [6, 4], "x": 11, "y": 2}, {"matrix": [6, 3], "x": 12, "y": 2}, {"matrix": [6, 2], "x": 13, "y": 2}, {"matrix": [6, 1], "x": 14, "y": 2}, {"matrix": [6, 0], "x": 15, "y": 2}, - {"matrix": [3, 0], "x": 4, "y": 3}, {"matrix": [3, 2], "x": 5, "y": 3}, - {"matrix": [7, 2], "x": 10, "y": 3}, {"matrix": [7, 0], "x": 11, "y": 3} ] diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c b/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c deleted file mode 100644 index 0f9aff0a85..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.c +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -enum charybdis_keymap_layers { - LAYER_BASE = 0, - LAYER_NAV, - LAYER_SYM, - LAYER_NUM, -}; - -#define NAV MO(LAYER_NAV) -#define SYM MO(LAYER_SYM) - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [LAYER_BASE] = LAYOUT_split_3x5_2( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - NAV, CW_TOGG, KC_SPC, SYM - // ╰──────────────────╯ ╰──────────────────╯ - ), - - [LAYER_NAV] = LAYOUT_split_3x5_2( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_DEL, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_LSFT, KC_LCTL, KC_LALT, KC_RGUI, KC_VOLD, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - QK_BOOT, EE_CLR, KC_MPRV, KC_MNXT, KC_MPLY, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, KC_ENT, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - _______, KC_LSFT, KC_SPC, _______ - // ╰──────────────────╯ ╰──────────────────╯ - ), - - [LAYER_SYM] = LAYOUT_split_3x5_2( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - KC_ESC, KC_LBRC, KC_LCBR, KC_LPRN, KC_TILD, KC_CIRC, KC_RPRN, KC_RCBR, KC_RBRC, KC_GRV, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_MINS, KC_ASTR, KC_EQL, KC_UNDS, KC_DLR, KC_HASH, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_PLUS, KC_PIPE, KC_AT, KC_SLSH, KC_PERC, _______, KC_BSLS, KC_AMPR, KC_QUES, KC_EXLM, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - _______, KC_LSFT, KC_SPC, _______ - // ╰──────────────────╯ ╰──────────────────╯ - ), - - [LAYER_NUM] = LAYOUT_split_3x5_2( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, KC_F11, KC_F12, KC_RGUI, KC_RALT, KC_RCTL, KC_RSFT, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - _______, KC_LSFT, KC_SPC, _______ - // ╰──────────────────╯ ╰──────────────────╯ - ), -}; -// clang-format on - -layer_state_t layer_state_set_user(layer_state_t state) { - return update_tri_layer_state(state, LAYER_NAV, LAYER_SYM, LAYER_NUM); -} diff --git a/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.json b/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.json new file mode 100644 index 0000000000..e2387d879f --- /dev/null +++ b/keyboards/bastardkb/dilemma/3x5_2/keymaps/default/keymap.json @@ -0,0 +1,26 @@ +{ + "keyboard": "bastardkb/dilemma/3x5_2/promicro", + "keymap": "default", + "layout": "LAYOUT_split_3x5_2", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", + "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", + "MO(1)", "KC_SPC", "KC_ENT", "MO(2)" + ], + [ + "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", + "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______" + ] + ] +} + diff --git a/keyboards/bastardkb/dilemma/3x5_2/promicro/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/promicro/keyboard.json new file mode 100644 index 0000000000..55ce3cdbf1 --- /dev/null +++ b/keyboards/bastardkb/dilemma/3x5_2/promicro/keyboard.json @@ -0,0 +1,15 @@ +{ + "development_board": "elite_c", + "matrix_pins": { + "cols": ["B4", "B5", "E6", "D7", "F6"], + "rows": ["D4", "C6", "F5", "F7"] + }, + "split": { + "handedness": { + "pin": "F4" + }, + "serial": { + "pin": "D2" + } + } +} diff --git a/keyboards/bastardkb/dilemma/3x5_2/promicro/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/promicro/rules.mk new file mode 100644 index 0000000000..fedac72e2e --- /dev/null +++ b/keyboards/bastardkb/dilemma/3x5_2/promicro/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h deleted file mode 100644 index fd7bb0f107..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -//#define SPLIT_HAND_PIN GP29 -// If you've soldered the handedness pull-up on the upper side instead of the -// left one, uncomment the following line. -//#define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h deleted file mode 100644 index 2e098f5113..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/halconf.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2022 QMK - * - * 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 - -#include_next diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json deleted file mode 100644 index e954f4f657..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "keyboard_name": "Dilemma (3x5+2) Splinky", - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "pointing_device": true - }, - "matrix_pins": { - "cols": ["GP8", "GP9", "GP7", "GP6", "GP27"], - "rows": ["GP4", "GP5", "GP28", "GP26"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h deleted file mode 100644 index c748d941e9..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_I2C_USE_I2C1 -#define RP_I2C_USE_I2C1 TRUE diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk b/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk deleted file mode 100644 index 942028da2c..0000000000 --- a/keyboards/bastardkb/dilemma/3x5_2/splinky/rules.mk +++ /dev/null @@ -1,7 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported -RGB_MATRIX_SUPPORTED = no # RGB matrix is supported and enabled by default -RGBLIGHT_SUPPORTED = no # RGB underglow is supported, but not enabled by default - -SERIAL_DRIVER = vendor - -POINTING_DEVICE_DRIVER = cirque_pinnacle_i2c # DIY version uses I2C. diff --git a/keyboards/bastardkb/dilemma/dilemma.c b/keyboards/bastardkb/dilemma/dilemma.c index b406e26526..c14345d075 100644 --- a/keyboards/bastardkb/dilemma/dilemma.c +++ b/keyboards/bastardkb/dilemma/dilemma.c @@ -328,22 +328,6 @@ void matrix_init_kb(void) { } #endif // POINTING_DEVICE_ENABLE -// Forward declare RP2040 SDK declaration. -void gpio_init(uint gpio); - -void keyboard_pre_init_kb(void) { - // Ensures that GP26 through GP29 are initialized as digital inputs (as - // opposed to analog inputs). These GPIOs are shared with A0 through A3, - // respectively. On RP2040-B2 and later, the digital inputs are disabled by - // default (see RP2040-E6). - gpio_init(GP26); - gpio_init(GP27); - gpio_init(GP28); - gpio_init(GP29); - - keyboard_pre_init_user(); -} - bool shutdown_kb(bool jump_to_bootloader) { if (!shutdown_user(jump_to_bootloader)) { return false; diff --git a/keyboards/bastardkb/dilemma/readme.md b/keyboards/bastardkb/dilemma/readme.md index 876400ae52..a149853015 100644 --- a/keyboards/bastardkb/dilemma/readme.md +++ b/keyboards/bastardkb/dilemma/readme.md @@ -1,21 +1,31 @@ # Dilemma -A family of split keyboards with embedded RP2040 controllers, support for Cirque GlidePoint circle trackpads, and SPI + I2C breakouts for other peripherals - -- Keyboard Maintainer: [Bastard Keyboards](https://github.com/Bastardkb/) -- Hardware Supported: [Bastardkb Dilemma](https://github.com/Bastardkb/Dilemma) -- Hardware Availability: [Bastardkb.com](https://bastardkb.com/) - -A DIY version of the 3x5_2 PCB with promicro compatible footprint is also available. +* Keyboard Maintainer: [BastardKB](https://github.com/BastardKB) +* Hardware Supported: Dilemma PCBs with integrated or devlopment board* microcontrollers +* Hardware Availability: [GitHub](https://github.com/Bastardkb/Dilemma) Make example for this keyboard (after setting up your build environment): + make bastardkb/dilemma/3x5_2/assembled:default + make bastardkb/dilemma/3x5_2/promicro:default make bastardkb/dilemma/3x5_3:default make bastardkb/dilemma/4x6_4:default Flashing example for this keyboard: + make bastardkb/dilemma/3x5_2/assembled:default:flash + make bastardkb/dilemma/3x5_2/promicro:default:flash make bastardkb/dilemma/3x5_3:default:flash make bastardkb/dilemma/4x6_4:default:flash -See the [keyboard build instructions](http://docs.bastardkb.com/) +Note*: the `dilemma/3x5_2/promicro` revision is the only DIY Dilemma PCB. It is footprint and pin compatible with a Pro Micro development board, and the firmware is written as such it can be used with the Converter Feature. This PCB uses I2C communication for the Cirque Trackpad, opposed to SPI for the variants with an integrated microcontroller. + +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 and plug in the keyboard +* **Physical reset button**: Double-tap the reset button under/near the microcontroller. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available 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 493/592] [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 0000000000..1fe45a20a3 --- /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 0000000000..866c98f972 --- /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 0000000000..4f45227160 --- /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 71b88b333d0bf000201ef588101e501f2d386575 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 11 Jul 2025 18:03:17 +0100 Subject: [PATCH 494/592] Fix pytest/has_community default keymap location (#25471) --- .../pytest/has_community/keymaps/default/{default => }/keymap.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboards/handwired/pytest/has_community/keymaps/default/{default => }/keymap.c (100%) diff --git a/keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c b/keyboards/handwired/pytest/has_community/keymaps/default/keymap.c similarity index 100% rename from keyboards/handwired/pytest/has_community/keymaps/default/default/keymap.c rename to keyboards/handwired/pytest/has_community/keymaps/default/keymap.c From 6b38dc17cd12b740b45b56c67ad04bb428f3bddb Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 12 Jul 2025 03:05:41 +1000 Subject: [PATCH 495/592] Remove deprecated `RGB_` and Mouse keycodes (#25444) * Remove deprecated `RGB_` and Mouse keycodes * Update old mouse keycodes, 0-9/A-M * Update old mouse keycodes, N-Z & layouts * Missed some stuff --- .../default_pimoroni/pimoroni_trackball.c | 4 +- .../ut47/keymaps/default/keymap.c | 2 +- .../40percentclub/ut47/keymaps/rgb/keymap.c | 2 +- .../summer_breeze/keymaps/default/keymap.c | 10 ++-- keyboards/ai03/orbit/keymaps/default/keymap.c | 6 +-- .../fine40/keymaps/default/keymap.c | 2 +- .../1x4p1/keymaps/default/keymap.c | 4 +- .../wings/keymaps/default/keymap.c | 4 +- keyboards/ashwing66/keymaps/default/keymap.c | 4 +- keyboards/atomic/keymaps/default/keymap.c | 6 +-- keyboards/atreyu/rev1/rev1.c | 4 +- keyboards/atreyu/rev2/rev2.c | 4 +- keyboards/aya/keymaps/default/keymap.c | 10 ++-- keyboards/bajjak/keymaps/5x6/keymap.c | 6 +-- keyboards/bajjak/keymaps/default/keymap.c | 6 +-- keyboards/bastardkb/dilemma/3x5_3/3x5_3.c | 2 +- keyboards/bastardkb/dilemma/4x6_4/4x6_4.c | 2 +- keyboards/bbrfkr/dynamis/dynamis.c | 4 +- .../bbrfkr/dynamis/keymaps/default/keymap.c | 2 +- keyboards/bbrfkr/dynamis/keymaps/iso/keymap.c | 2 +- .../binepad/bnr1/keymaps/default/keymap.c | 2 +- .../binepad/kn01/keymaps/default/keymap.json | 4 +- .../binepad/pixie/keymaps/default/keymap.c | 2 +- .../bt66tech60/keymaps/default/keymap.c | 6 +-- keyboards/buzzard/keymaps/default/keymap.c | 10 ++-- .../ortho48v2/keymaps/default/keymap.c | 4 +- .../sagittarius/keymaps/default/keymap.c | 4 +- .../checkerboards/quark_plus/quark_plus.c | 4 +- keyboards/checkerboards/snop60/snop60.c | 4 +- .../curiosity/keymaps/default/keymap.c | 4 +- .../handwire_101/keymaps/default/keymap.c | 8 +-- .../ckeys/thedora/keymaps/default/keymap.c | 8 +-- keyboards/clueboard/2x1800/2019/2019.c | 32 +++++------ .../2019/keymaps/default_1u_ansi/keymap.c | 2 +- .../2019/keymaps/default_1u_iso/keymap.c | 2 +- .../2019/keymaps/default_2u_ansi/keymap.c | 2 +- .../2019/keymaps/default_2u_iso/keymap.c | 2 +- .../2019/keymaps/default_4u_iso/keymap.c | 2 +- .../2019/keymaps/default_7u_ansi/keymap.c | 2 +- .../2019/keymaps/default_7u_iso/keymap.c | 2 +- keyboards/clueboard/2x1800/2021/2021.c | 8 +-- .../coban/pad9a/keymaps/default/keymap.c | 2 +- keyboards/cornia/keymaps/fire/keymap.c | 6 +-- keyboards/cradio/keymaps/default/keymap.c | 6 +-- keyboards/craftwalk/keymaps/default/keymap.c | 2 +- .../custommk/elysian/keymaps/default/keymap.c | 2 +- keyboards/custommk/evo70/evo70.c | 4 +- keyboards/doio/kb38/kb38.c | 4 +- keyboards/doio/kb3x/keymaps/default/keymap.c | 6 +-- keyboards/draculad/keymaps/default/keymap.c | 6 +-- .../ducky/one2mini/keymaps/ansi/keymap.c | 4 +- .../one2mini/keymaps/ansi_tsangan/keymap.c | 4 +- .../ducky/one2mini/keymaps/default/keymap.c | 4 +- keyboards/ducky/one2mini/keymaps/iso/keymap.c | 4 +- .../ducky/one2sf/keymaps/default/keymap.c | 4 +- .../one2sf/keymaps/default_ansi/keymap.c | 4 +- .../ducky/one2sf/keymaps/default_iso/keymap.c | 4 +- .../dumbpad/v0x/keymaps/default/keymap.c | 6 +-- keyboards/dumbpad/v0x/v0x.c | 4 +- .../v0x_dualencoder/keymaps/default/keymap.c | 4 +- .../dumbpad/v0x_dualencoder/v0x_dualencoder.c | 4 +- .../v0x_right/keymaps/default/keymap.c | 6 +-- keyboards/dumbpad/v0x_right/v0x_right.c | 4 +- .../dumbpad/v1x/keymaps/default/keymap.c | 6 +-- keyboards/dumbpad/v1x/v1x.c | 4 +- .../v1x_dualencoder/keymaps/default/keymap.c | 6 +-- .../dumbpad/v1x_dualencoder/v1x_dualencoder.c | 4 +- .../v1x_right/keymaps/default/keymap.c | 6 +-- keyboards/dumbpad/v1x_right/v1x_right.c | 4 +- .../dz60/keymaps/iso_split-spacebar/keymap.c | 4 +- .../ergodox_ez/glow/keymaps/default/keymap.c | 6 +-- keyboards/ergodox_ez/keymaps/default/keymap.c | 6 +-- .../ergodox_ez/keymaps/default_osx/keymap.c | 6 +-- .../ergodox_ez/keymaps/rgb_layer/keymap.c | 6 +-- keyboards/ergodox_ez/keymaps/testing/keymap.c | 2 +- keyboards/ergoslab/keymaps/default/keymap.c | 6 +-- .../wave/keymaps/default/keymap.c | 8 +-- .../evyd13/ta65/keymaps/default/keymap.c | 4 +- keyboards/ferris/keymaps/default/keymap.json | 8 +-- .../blackbowl/keymaps/default/keymap.c | 6 +-- .../blackflat/keymaps/default/keymap.c | 6 +-- .../hypernano/keymaps/default/keymap.c | 6 +-- .../frobiac/redtilt/keymaps/default/keymap.c | 6 +-- keyboards/fungo/keymaps/default/keymap.c | 6 +-- .../butterstick/keymaps/default/keymap.c | 4 +- keyboards/gboards/combos/germ-mouse-keys.def | 4 +- .../georgi/keymaps/colemak-dh/keymap.c | 4 +- .../georgi/keymaps/default-flipped/keymap.c | 4 +- .../gboards/georgi/keymaps/default/keymap.c | 4 +- .../gboards/georgi/keymaps/minimal/keymap.c | 4 +- .../gboards/georgi/keymaps/norman/keymap.c | 4 +- .../gboards/gergo/keymaps/colemak/keymap.c | 6 +-- .../gboards/gergo/keymaps/default/keymap.c | 6 +-- keyboards/gboards/gergo/keymaps/germ/keymap.c | 6 +-- keyboards/gboards/gergo/keymaps/oled/keymap.c | 6 +-- .../keymaps/colemak-dhm/gergoplex.def | 4 +- .../gergoplex/keymaps/colemak-dhm/keymap.c | 6 +-- .../gergoplex/keymaps/default/keymap.c | 6 +-- .../gravity_45/keymaps/default/keymap.c | 2 +- .../teaqueen/keymaps/default/keymap.c | 4 +- keyboards/h0oni/deskpad/deskpad.c | 8 +-- .../hadron/ver2/keymaps/default/keymap.c | 10 ++-- .../hadron/ver2/keymaps/side_numpad/keymap.c | 10 ++-- .../hadron/ver3/keymaps/default/keymap.c | 10 ++-- keyboards/halfcliff/halfcliff.c | 8 +-- .../keymaps/default/keymap.c | 2 +- .../108key_trackpoint/keymaps/dvorak/keymap.c | 2 +- .../keymaps/dvorak_media/keymap.c | 2 +- .../handwired/42/keymaps/default/keymap.c | 4 +- .../handwired/acacia/keymaps/default/keymap.c | 2 +- .../handwired/chiron/keymaps/default/keymap.c | 8 +-- .../handwired/cmd60/keymaps/default/keymap.c | 6 +-- .../concertina/64key/keymaps/default/keymap.c | 8 +-- .../handwired/dactyl/keymaps/default/keymap.c | 6 +-- .../handwired/dactyl/keymaps/dvorak/keymap.c | 6 +-- .../dactyl_cc/keymaps/default/keymap.c | 6 +-- .../4x5/keymaps/default/keymap.c | 12 ++--- .../4x5/keymaps/dvorak/keymap.c | 12 ++--- .../4x6/keymaps/default/keymap.c | 12 ++--- .../5x6_2_5/keymaps/default/keymap.json | 34 ++++++------ .../5x6_5/keymaps/default/keymap.json | 34 ++++++------ .../dactyl_maximus/keymaps/default/keymap.c | 8 +-- .../dactyl_promicro/keymaps/default/keymap.c | 6 +-- .../dactyl_rah/keymaps/default/keymap.c | 6 +-- .../dactyl_rah/keymaps/right/keymap.c | 6 +-- .../dactylmacropad/keymaps/default/keymap.c | 6 +-- .../datahand/keymaps/default/keymap.c | 6 +-- .../handwired/dmote/keymaps/default/keymap.c | 6 +-- .../dqz11n1g/keymaps/default/keymap.c | 8 +-- .../elrgo_s/keymaps/default/keymap.c | 2 +- .../ergocheap/keymaps/default/keymap.c | 4 +- .../fivethirteen/keymaps/default/keymap.c | 6 +-- .../floorboard/keymaps/default/keymap.c | 2 +- .../frenchdev/keymaps/default/keymap.c | 22 ++++---- .../handwired/k8split/keymaps/left/keymap.c | 4 +- .../handwired/kbod/keymaps/default/keymap.c | 8 +-- .../spaget/keymaps/default/keymap.c | 8 +-- .../handwired/ortho5x14/keymaps/2u/keymap.c | 8 +-- .../ortho5x14/keymaps/default/keymap.c | 2 +- .../ortho5x14/keymaps/split1/keymap.c | 6 +-- .../petruziamini/keymaps/default/keymap.c | 4 +- .../pilcrow/keymaps/default/keymap.c | 6 +-- .../pterodactyl/keymaps/default/keymap.c | 6 +-- .../riblee_f401/keymaps/default/keymap.c | 2 +- .../riblee_f411/keymaps/default/keymap.c | 2 +- .../scottomouse/keymaps/default/keymap.c | 2 +- .../handwired/sick68/keymaps/default/keymap.c | 4 +- .../snatchpad/keymaps/default/keymap.c | 2 +- keyboards/handwired/snatchpad/snatchpad.c | 8 +-- .../handwired/sono1/keymaps/default/keymap.c | 4 +- .../space_oddity/keymaps/default/keymap.c | 4 +- .../handwired/t111/keymaps/oleg/keymap.c | 6 +-- .../terminus_mini/keymaps/default/keymap.c | 6 +-- .../handwired/tkk/keymaps/default/keymap.c | 2 +- .../trackpoint/keymaps/default/keymap.c | 2 +- .../traveller/keymaps/default/keymap.c | 40 +++++++------- .../tsubasa/keymaps/default/keymap.c | 8 +-- .../twadlee/tp69/keymaps/default/keymap.c | 2 +- .../twig/twig50/keymaps/default/keymap.c | 8 +-- .../videowriter/keymaps/default/keymap.c | 4 +- .../videowriter/keymaps/oleg/keymap.c | 4 +- .../handwired/wulkan/keymaps/default/keymap.c | 6 +-- .../helix/rev3_5rows/keymaps/default/keymap.c | 6 +-- keyboards/hhkb/yang/keymaps/kanru/keymap.c | 6 +-- .../hnahkb/vn66/keymaps/default/keymap.c | 4 +- .../nyx/rev1/keymaps/default/keymap.c | 4 +- keyboards/hotdox/keymaps/default/keymap.c | 6 +-- .../mschwingen/keymaps/default/keymap.c | 8 +-- .../idank/spankbd/keymaps/default/keymap.json | 12 ++--- .../idank/sweeq/keymaps/default/keymap.json | 8 +-- .../ergodox_infinity/keymaps/default/keymap.c | 6 +-- .../keymaps/halfkeyboard/keymap.c | 8 +-- .../infinity60/keymaps/hasu/keymap.c | 14 ++--- .../neopad/rev1/keymaps/default/keymap.c | 12 ++--- .../piggy60/keymaps/default/keymap.c | 4 +- keyboards/junco/keymaps/default/keymap.c | 2 +- .../paladin64/keymaps/default/keymap.c | 4 +- .../kaishi65/keymaps/default/keymap.c | 4 +- .../kbdfans/kbd67/rev2/keymaps/iso/keymap.c | 4 +- .../model01/keymaps/default/keymap.c | 6 +-- .../keycapsss/plaid_pad/keymaps/oled/keymap.c | 6 +-- .../ansi/rgb/keymaps/default/keymap.c | 2 +- .../keyhive/ut472/keymaps/default/keymap.c | 2 +- .../kikoslab/kl90/keymaps/default/keymap.c | 4 +- keyboards/kin80/keymaps/default/keymap.c | 8 +-- keyboards/kinesis/keymaps/dvorak/keymap.c | 6 +-- .../ropro/keymaps/default/keymap.c | 4 +- .../kingly_keys/soap/keymaps/default/keymap.c | 4 +- .../madeline/keymaps/default/keymap.c | 2 +- .../kousa/keymaps/default/keymap.c | 2 +- .../krado66/keymaps/default/keymap.c | 6 +-- .../promenade_rp24s/keymaps/default/keymap.c | 2 +- .../pteron56/keymaps/default/keymap.c | 4 +- .../ktec/ergodone/keymaps/default/keymap.c | 6 +-- .../ktec/staryu/keymaps/default/keymap.c | 4 +- keyboards/kv/revt/keymaps/default/keymap.c | 4 +- .../keymaps/default/keymap.c | 2 +- keyboards/makeymakey/keymaps/default/keymap.c | 4 +- .../minidox/keymaps/bepo/keymap.c | 4 +- keyboards/marcopad/keymaps/backlit/keymap.c | 20 +++---- .../leftover30/keymaps/default/keymap.c | 6 +-- .../keymaps/default_isoenter/keymap.c | 6 +-- .../rhymestone/keymaps/default/keymap.c | 4 +- .../treadstone32/keymaps/default/keymap.c | 4 +- .../treadstone48/keymaps/default/keymap.c | 8 +-- .../rev1/keymaps/like_jis_rs/keymap.c | 8 +-- .../maxr1998/phoebe/keymaps/default/keymap.c | 4 +- keyboards/mechanickeys/undead60m/undead60m.c | 4 +- .../chapter1/keymaps/default/keymap.c | 2 +- .../puckbuddy/keymaps/default/keymap.c | 4 +- .../sugarglider/keymaps/default/keymap.c | 4 +- keyboards/mechwild/sugarglider/sugarglider.c | 4 +- keyboards/mlego/m65/keymaps/default/keymap.c | 12 ++--- keyboards/mlego/m65/keymaps/uk/keymap.c | 12 ++--- keyboards/molecule/keymaps/default/keymap.c | 4 +- keyboards/mt/mt40/keymaps/default/keymap.c | 6 +-- keyboards/numatreus/keymaps/like_jis/keymap.c | 8 +-- .../keymaps/default/keymap.c | 6 +-- keyboards/oddball/keymaps/default/keymap.c | 6 +-- keyboards/oddball/keymaps/pmw3360/keymap.c | 6 +-- keyboards/oddball/oddball.c | 10 ++-- keyboards/org60/keymaps/default/keymap.c | 2 +- .../voice65/hotswap/keymaps/default/keymap.c | 4 +- .../voice65/soldered/keymaps/default/keymap.c | 4 +- keyboards/p3d/spacey/keymaps/default/keymap.c | 4 +- keyboards/p3d/synapse/synapse.c | 4 +- keyboards/pabile/p18/keymaps/default/keymap.c | 4 +- .../pabile/p20/ver1/keymaps/default/keymap.c | 10 ++-- keyboards/pabile/p40/keymaps/default/keymap.c | 6 +-- .../pabile/p40_ortho/keymaps/default/keymap.c | 6 +-- keyboards/pabile/p42/keymaps/default/keymap.c | 6 +-- keyboards/phoenix/keymaps/default/keymap.c | 6 +-- .../paddino02/rev1/keymaps/default/keymap.c | 2 +- .../rev2/left/keymaps/default/keymap.c | 2 +- .../rev2/right/keymaps/default/keymap.c | 2 +- keyboards/planck/keymaps/default/keymap.c | 4 +- .../madromys/keymaps/default/keymap.c | 2 +- .../ploopyco/mouse/keymaps/default/keymap.c | 2 +- keyboards/ploopyco/ploopyco.c | 2 +- .../trackball/keymaps/default/keymap.c | 4 +- .../trackball_mini/keymaps/default/keymap.c | 4 +- .../trackball_thumb/keymaps/default/keymap.c | 2 +- keyboards/pluckey/keymaps/default/keymap.c | 6 +-- .../pluckey/keymaps/default_ergo/keymap.c | 6 +-- keyboards/pluckey/pluckey.c | 4 +- keyboards/proteus67/keymaps/default/keymap.c | 4 +- .../oceanographer/keymaps/default/keymap.c | 2 +- .../keymaps/default_625/keymap.c | 2 +- .../keymaps/split_225_2/keymap.c | 2 +- keyboards/qck75/v1/v1.c | 8 +-- .../qpockets/eggman/keymaps/default/keymap.c | 4 +- .../rev1/keymaps/big_space/keymap.c | 4 +- .../space_space/rev1/keymaps/default/keymap.c | 4 +- keyboards/qpockets/space_space/rev2/rev2.c | 4 +- .../qpockets/wanten/keymaps/2u_bars/keymap.c | 4 +- .../qpockets/wanten/keymaps/625_bar/keymap.c | 4 +- .../qpockets/wanten/keymaps/default/keymap.c | 4 +- .../qvex/lynepad/keymaps/default/keymap.c | 14 ++--- keyboards/qwertyydox/keymaps/default/keymap.c | 6 +-- .../rainkeeb/keymaps/default/keymap.c | 8 +-- .../trailmix/keymaps/default/keymap.c | 6 +-- keyboards/rainkeebs/trailmix/trailmix.c | 16 +++--- .../rart/rart4x4/keymaps/default/keymap.c | 4 +- .../rart/rartpad/keymaps/default/keymap.c | 4 +- .../rate/pistachio/keymaps/default/keymap.c | 2 +- .../nomu30/keymaps/center_sprit/keymap.c | 4 +- .../nomu30/keymaps/center_sprit/readme.md | 4 +- keyboards/redox/keymaps/default/keymap.c | 6 +-- keyboards/redox_media/redox_media.c | 4 +- .../reviung5/keymaps/default_lre/keymap.c | 2 +- .../reviung5/keymaps/default_rre/keymap.c | 2 +- keyboards/rocketboard_16/keycode_lookup.c | 32 +++++------ .../katana60/rev1/keymaps/colemak/keymap.c | 12 ++--- .../katana60/rev1/keymaps/default/keymap.c | 12 ++--- .../katana60/rev2/keymaps/default/keymap.c | 6 +-- .../nafuda/keymaps/default/keymap.c | 8 +-- .../keymaps/default_with_nafuda/keymap.c | 8 +-- .../naked60/keymaps/default/keymap.c | 4 +- .../keymaps/default_with_nafuda/keymap.c | 12 ++--- .../keymaps/default_with_setta21/keymap.c | 4 +- .../creator_pro/keymaps/default/keymap.c | 4 +- .../shuguet/shu89/keymaps/default/keymap.json | 4 +- keyboards/signum/3_0/keymaps/default/keymap.c | 6 +-- .../signum/3_0/keymaps/default/layout.py | 12 ++--- .../aurora/sweep/keymaps/default/keymap.json | 6 +-- .../ferris/keymaps/default/keymap.json | 6 +-- keyboards/tada68/keymaps/default/keymap.c | 4 +- keyboards/tada68/keymaps/rgb/keymap.c | 4 +- .../takashicompany/baumkuchen/baumkuchen.c | 4 +- .../center_enter/keymaps/default/keymap.c | 4 +- keyboards/takashicompany/compacx/compacx.c | 4 +- .../dogtag/keymaps/default/keymap.c | 2 +- .../goat51/keymaps/default/keymap.c | 4 +- .../jourkey/keymaps/default/keymap.c | 2 +- .../qoolee/keymaps/default/keymap.c | 4 +- .../spreadwriter/keymaps/default/keymap.c | 4 +- keyboards/thumbsup/keymaps/default/keymap.c | 12 ++--- .../blueberry/keymaps/default/keymap.c | 6 +-- .../le_chiffre/keymaps/default/keymap.c | 2 +- .../tunks/ergo33/keymaps/default/keymap.c | 4 +- .../tzarc/djinn/keymaps/default/keymap.c | 8 +-- keyboards/varanidae/keymaps/ansi/keymap.c | 4 +- .../keymaps/ansi_split_bs_rshift/keymap.c | 4 +- keyboards/varanidae/keymaps/default/keymap.c | 4 +- keyboards/varanidae/keymaps/iso/keymap.c | 4 +- .../keymaps/iso_split_bs_rshift/keymap.c | 4 +- keyboards/waterfowl/waterfowl.c | 8 +-- .../wolf/frogpad/keymaps/default/keymap.c | 4 +- keyboards/work_louder/micro/micro.c | 4 +- keyboards/xdboards/recon/recon.c | 4 +- .../ansi_split_bs_rshift_space/keymap.c | 2 +- keyboards/xiudi/xd60/keymaps/default/keymap.c | 2 +- .../yanghu/unicorne/keymaps/default/keymap.c | 4 +- keyboards/ydkb/grape/keymaps/default/keymap.c | 2 +- keyboards/ymdk/yd60mq/keymaps/iso/keymap.c | 4 +- .../navpad/10/keymaps/default/keymap.c | 4 +- .../navpad/10/keymaps/default/readme.md | 4 +- .../10_helix_r/keymaps/default/keymap.c | 4 +- .../10_helix_r/keymaps/default/readme.md | 4 +- .../quick17/keymaps/default/keymap.c | 6 +-- .../zsa/moonlander/keymaps/default/keymap.c | 6 +-- .../ortho_5x13/default_ortho_5x13/keymap.c | 12 ++--- .../ortho_6x13/default_ortho_6x13/keymap.c | 12 ++--- quantum/quantum_keycodes_legacy.h | 53 ------------------- tests/pointing/test_pointing.cpp | 2 +- 325 files changed, 911 insertions(+), 964 deletions(-) diff --git a/keyboards/3w6/rev2/keymaps/default_pimoroni/pimoroni_trackball.c b/keyboards/3w6/rev2/keymaps/default_pimoroni/pimoroni_trackball.c index c32f2a04d2..0fe7cdc247 100644 --- a/keyboards/3w6/rev2/keymaps/default_pimoroni/pimoroni_trackball.c +++ b/keyboards/3w6/rev2/keymaps/default_pimoroni/pimoroni_trackball.c @@ -89,9 +89,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) { if (IS_MOUSEKEY_BUTTON(keycode)) { report_mouse_t currentReport = pointing_device_get_report(); if (record->event.pressed) { - currentReport.buttons |= 1 << (keycode - KC_MS_BTN1); + currentReport.buttons |= 1 << (keycode - QK_MOUSE_BUTTON_1); } else { - currentReport.buttons &= ~(1 << (keycode - KC_MS_BTN1)); + currentReport.buttons &= ~(1 << (keycode - QK_MOUSE_BUTTON_1)); } pointing_device_set_report(currentReport); pointing_device_send(); diff --git a/keyboards/40percentclub/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c index 4eb2c190c1..4a9de82492 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/default/keymap.c @@ -101,7 +101,7 @@ LAYOUT( /* Tab */ KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LED_TOG, LED_CHG, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT ), }; diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c index 86ceefaafb..17c0be7772 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c @@ -53,7 +53,7 @@ LAYOUT( /* Tab */ KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_TOGG, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_VALU, UG_VALD, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT ), }; diff --git a/keyboards/afternoonlabs/summer_breeze/keymaps/default/keymap.c b/keyboards/afternoonlabs/summer_breeze/keymaps/default/keymap.c index d65d119338..e545bdb1da 100644 --- a/keyboards/afternoonlabs/summer_breeze/keymaps/default/keymap.c +++ b/keyboards/afternoonlabs/summer_breeze/keymaps/default/keymap.c @@ -29,13 +29,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MAIN] = LAYOUT( //┌────────┬────────┬────────┐┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐┌────────┬────────┬────────┐ - _______, KC_WH_U, _______, 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_MINS, KC_EQL, KC_GRV, + _______, MS_WHLU, _______, 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_MINS, KC_EQL, KC_GRV, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ - KC_BTN1, KC_WH_D, KC_BTN2, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_LBRC, KC_RBRC, KC_BSLS, + MS_BTN1, MS_WHLD, MS_BTN2, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_LBRC, KC_RBRC, KC_BSLS, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ - KC_MS_U, 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_UP, + MS_UP, 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_UP, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ - KC_MS_L, KC_MS_D, KC_MS_R, 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_LEFT, KC_DOWN, KC_RIGHT, + MS_LEFT, MS_DOWN, MS_RGHT, 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_LEFT, KC_DOWN, KC_RIGHT, //└────────┴────────┴────────┘└────────┴────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┴────────┴────────┴────────┘└────────┴────────┴────────┘ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_ENT, RAISE, LOWER, XXXXXXX // └────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┘ @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┐┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐┌────────┬────────┬────────┐ _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ - _______, KC_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, MS_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //├────────┼────────┼────────┤├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤├────────┼────────┼────────┤ diff --git a/keyboards/ai03/orbit/keymaps/default/keymap.c b/keyboards/ai03/orbit/keymaps/default/keymap.c index de737d4b9a..d777fafef1 100644 --- a/keyboards/ai03/orbit/keymaps/default/keymap.c +++ b/keyboards/ai03/orbit/keymaps/default/keymap.c @@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [2] = LAYOUT( /* Mousekeys and Numpad */ KC_NO, _______, _______, _______, _______, _______, _______, KC_NUM, KC_P7, KC_P8, KC_P9, KC_PSLS, _______, _______, - KC_NO, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, _______, KC_P4, KC_P5, KC_P6, KC_PAST, _______, _______, - TO(1), _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______, _______, - TO(1), _______, KC_ACL0, KC_ACL1, KC_ACL2, KC_BTN3, _______, DBLZERO, KC_P0, KC_PDOT, KC_PENT, KC_PPLS, _______, MANUAL, + KC_NO, _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, _______, KC_P4, KC_P5, KC_P6, KC_PAST, _______, _______, + TO(1), _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, _______, KC_P1, KC_P2, KC_P3, KC_PMNS, _______, _______, + TO(1), _______, MS_ACL0, MS_ACL1, MS_ACL2, MS_BTN3, _______, DBLZERO, KC_P0, KC_PDOT, KC_PENT, KC_PPLS, _______, MANUAL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/aidansmithdotdev/fine40/keymaps/default/keymap.c b/keyboards/aidansmithdotdev/fine40/keymaps/default/keymap.c index 0010c9f97b..e541c14d01 100644 --- a/keyboards/aidansmithdotdev/fine40/keymaps/default/keymap.c +++ b/keyboards/aidansmithdotdev/fine40/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC , QK_BOOT, _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , KC_F11 , KC_F12 , KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_F17 , KC_F18 , KC_F19 , KC_F20 , _______ , _______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , _______ , - _______ , _______ , _______ , _______ , _______ , _______ , _______ , KC_MS_L , KC_MS_D , KC_MS_U , KC_MS_R , _______ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , MS_LEFT , MS_DOWN , MS_UP , MS_RGHT , _______ ), }; diff --git a/keyboards/arrayperipherals/1x4p1/keymaps/default/keymap.c b/keyboards/arrayperipherals/1x4p1/keymaps/default/keymap.c index 5318b16df5..dc4e21127a 100644 --- a/keyboards/arrayperipherals/1x4p1/keymaps/default/keymap.c +++ b/keyboards/arrayperipherals/1x4p1/keymaps/default/keymap.c @@ -20,9 +20,9 @@ along with this program. If not, see . bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { /* First encoder */ if (clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/arrowmechanics/wings/keymaps/default/keymap.c b/keyboards/arrowmechanics/wings/keymaps/default/keymap.c index 6e0a6a18dc..97f465de35 100644 --- a/keyboards/arrowmechanics/wings/keymaps/default/keymap.c +++ b/keyboards/arrowmechanics/wings/keymaps/default/keymap.c @@ -10,7 +10,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [BASE] = LAYOUT( KC_VOLU, 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_EQL, KC_PSCR, KC_DEL, - KC_VOLD, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RM_NEXT, KC_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC, + KC_VOLD, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, RM_NEXT, MS_BTN1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_BSPC, KC_MPLY, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, C(KC_C), C(KC_V), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MNXT, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, C(KC_Z), C(KC_Y), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_MPRV, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_HOME, @@ -20,6 +20,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [BASE] = { ENCODER_CCW_CW(RM_HUEU, RM_HUED), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [BASE] = { ENCODER_CCW_CW(RM_HUEU, RM_HUED), ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, }; #endif diff --git a/keyboards/ashwing66/keymaps/default/keymap.c b/keyboards/ashwing66/keymaps/default/keymap.c index 304f888742..416fe0261e 100644 --- a/keyboards/ashwing66/keymaps/default/keymap.c +++ b/keyboards/ashwing66/keymaps/default/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LAYERB] = LAYOUT_5x16( KC_ESC ,RM_TOGG,RM_PREV ,RM_NEXT ,RM_VALD ,RM_VALU ,RM_SPDD ,RM_SPDU ,RM_HUED ,RM_HUEU ,RM_SATD ,RM_SATU , - KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,KC_BTN1 ,KC_MS_U ,KC_BTN2 ,KC_P ,KC_EQL , - KC_LCTL,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_SCLN ,KC_QUOT , + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_Y ,MS_BTN1 ,MS_UP ,MS_BTN2 ,KC_P ,KC_EQL , + KC_LCTL,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,MS_LEFT ,MS_DOWN ,MS_RGHT ,KC_SCLN ,KC_QUOT , KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_LBRC ,KC_MUTE ,KC_RBRC ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , KC_LBRC,KC_PSCR,KC_CAPS ,_______ ,KC_LGUI ,KC_LALT ,KC_SPC ,KC_END ,KC_HOME ,KC_ENT ,KC_BSPC ,_______ ,KC_INS ,KC_DEL ,KC_BSLS ,KC_RBRC ), diff --git a/keyboards/atomic/keymaps/default/keymap.c b/keyboards/atomic/keymaps/default/keymap.c index 70feec1038..4afcf6c053 100644 --- a/keyboards/atomic/keymaps/default/keymap.c +++ b/keyboards/atomic/keymaps/default/keymap.c @@ -203,8 +203,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ KC_NUM, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___, KC_SCRL, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR, - KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U, - _______, _______, DF(_QW), DF(_CM), DF(_DV), _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D, - _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + KC_CAPS, MS_BTN5, MS_BTN4, MS_BTN3, MS_BTN2, MS_ACL0, MS_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, MS_WHLU, + _______, _______, DF(_QW), DF(_CM), DF(_DV), _______, _______, _______, _______, _______, _______, ___T___, ___T___, MS_UP, MS_WHLD, + _______, _______, _______, _______, _______, MS_BTN1, MS_BTN1, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), }; diff --git a/keyboards/atreyu/rev1/rev1.c b/keyboards/atreyu/rev1/rev1.c index 026eba4b8a..495d6e85f5 100644 --- a/keyboards/atreyu/rev1/rev1.c +++ b/keyboards/atreyu/rev1/rev1.c @@ -31,9 +31,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } if (index == 0) { if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/atreyu/rev2/rev2.c b/keyboards/atreyu/rev2/rev2.c index 78c70631a3..37c9e489c1 100644 --- a/keyboards/atreyu/rev2/rev2.c +++ b/keyboards/atreyu/rev2/rev2.c @@ -31,9 +31,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } if (index == 0) { if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/aya/keymaps/default/keymap.c b/keyboards/aya/keymaps/default/keymap.c index 255e13d7b7..ec429cf375 100644 --- a/keyboards/aya/keymaps/default/keymap.c +++ b/keyboards/aya/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [0] = LAYOUT( _______, 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_BTN2, 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_BTN1, KC_A , KC_S , KC_D , KC_F , KC_G, _______, _______, KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_NUHS, + _______, MS_BTN2, KC_Q , KC_W , KC_E , KC_R , KC_T, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_LBRC, KC_RBRC, + _______, MS_BTN1, 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_NUBS, KC_Z , KC_X , KC_C , KC_V , KC_B, KC_LALT, MO(2) , _______, KC_DEL , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, _______, _______, KC_LSFT, _LG_ESC, KC_TAB , MO(1) , _______, KC_ENT, _RC_SPC, _RS_BSP ), @@ -79,9 +79,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLU, MS_WHLR, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2 + _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2 ), }; diff --git a/keyboards/bajjak/keymaps/5x6/keymap.c b/keyboards/bajjak/keymaps/5x6/keymap.c index b700976dc9..65061a398a 100644 --- a/keyboards/bajjak/keymaps/5x6/keymap.c +++ b/keyboards/bajjak/keymaps/5x6/keymap.c @@ -122,9 +122,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left hand Right hand XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SLEP, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, KC_EJCT, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, - XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - QK_BOOT, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, KC_WH_L, XXXXXXX, KC_WH_R, XXXXXXX, DF(SYMB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + QK_BOOT, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, MS_WHLL, XXXXXXX, MS_WHLR, XXXXXXX, DF(SYMB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, DF(BASE), _______, _______, _______, _______, _______, _______, diff --git a/keyboards/bajjak/keymaps/default/keymap.c b/keyboards/bajjak/keymaps/default/keymap.c index 4e2a7e055c..39919c628c 100644 --- a/keyboards/bajjak/keymaps/default/keymap.c +++ b/keyboards/bajjak/keymaps/default/keymap.c @@ -128,9 +128,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left hand Right hand KC_SLEP, KC_BRID, KC_BRIU, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_EJCT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_TAB, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, - KC_CAPS, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, _______, _______, _______, _______, _______, _______, - KC_LSFT, _______, KC_WH_L, _______, KC_WH_R, _______, _______, _______, _______, _______, _______, _______, + KC_TAB, _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, MS_WHLL, _______, MS_WHLR, _______, _______, _______, _______, _______, _______, _______, KC_LCTL, KC_LGUI, ALT_T(KC_INSERT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, _______, _______, QK_BOOT, CTL_T(KC_ESC), KC_LALT, KC_RGUI, CTL_T(KC_RALT), KC_HOME, KC_PGUP, diff --git a/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c index a186139835..444e479d1a 100644 --- a/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c +++ b/keyboards/bastardkb/dilemma/3x5_3/3x5_3.c @@ -27,7 +27,7 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } switch (index) { case 0: // Left-half encoder, mouse scroll. - tap_code(clockwise ? KC_MS_WH_UP : KC_MS_WH_DOWN); + tap_code(clockwise ? MS_WHLU : MS_WHLD); break; case 1: // Right-half encoder, volume control. tap_code(clockwise ? KC_AUDIO_VOL_UP : KC_AUDIO_VOL_DOWN); diff --git a/keyboards/bastardkb/dilemma/4x6_4/4x6_4.c b/keyboards/bastardkb/dilemma/4x6_4/4x6_4.c index 49b24fbd04..3545e60503 100644 --- a/keyboards/bastardkb/dilemma/4x6_4/4x6_4.c +++ b/keyboards/bastardkb/dilemma/4x6_4/4x6_4.c @@ -48,7 +48,7 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } switch (index) { case 0: // Left-half encoder, mouse scroll. - tap_code(clockwise ? KC_MS_WH_DOWN : KC_MS_WH_UP); + tap_code(clockwise ? MS_WHLD : MS_WHLU); break; case 1: // Right-half encoder, volume control. tap_code(clockwise ? KC_AUDIO_VOL_UP : KC_AUDIO_VOL_DOWN); diff --git a/keyboards/bbrfkr/dynamis/dynamis.c b/keyboards/bbrfkr/dynamis/dynamis.c index f21bf24900..9bf7fb6ae1 100644 --- a/keyboards/bbrfkr/dynamis/dynamis.c +++ b/keyboards/bbrfkr/dynamis/dynamis.c @@ -20,9 +20,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (clockwise) { - tap_code(layer_state == 0 ? KC_WH_D : KC_VOLD); + tap_code(layer_state == 0 ? MS_WHLD : KC_VOLD); } else { - tap_code(layer_state == 0 ? KC_WH_U : KC_VOLU); + tap_code(layer_state == 0 ? MS_WHLU : KC_VOLU); } return true; } diff --git a/keyboards/bbrfkr/dynamis/keymaps/default/keymap.c b/keyboards/bbrfkr/dynamis/keymaps/default/keymap.c index e27d17827c..301a9003c8 100644 --- a/keyboards/bbrfkr/dynamis/keymaps/default/keymap.c +++ b/keyboards/bbrfkr/dynamis/keymaps/default/keymap.c @@ -37,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_BTN3, KC_BTN2, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_BTN3, MS_BTN2, MS_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE ), diff --git a/keyboards/bbrfkr/dynamis/keymaps/iso/keymap.c b/keyboards/bbrfkr/dynamis/keymaps/iso/keymap.c index 38a56f56f4..ecd1d69c11 100644 --- a/keyboards/bbrfkr/dynamis/keymaps/iso/keymap.c +++ b/keyboards/bbrfkr/dynamis/keymaps/iso/keymap.c @@ -37,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_BTN3, KC_BTN2, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_BTN3, MS_BTN2, MS_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE ), diff --git a/keyboards/binepad/bnr1/keymaps/default/keymap.c b/keyboards/binepad/bnr1/keymaps/default/keymap.c index 4e7b0cf6eb..3ba547b2af 100644 --- a/keyboards/binepad/bnr1/keymaps/default/keymap.c +++ b/keyboards/binepad/bnr1/keymaps/default/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_L0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_L1] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP) } + [_L1] = { ENCODER_CCW_CW(MS_WHLD, MS_WHLU) } }; #endif diff --git a/keyboards/binepad/kn01/keymaps/default/keymap.json b/keyboards/binepad/kn01/keymaps/default/keymap.json index d6a3835f6c..f4e436cbc6 100644 --- a/keyboards/binepad/kn01/keymaps/default/keymap.json +++ b/keyboards/binepad/kn01/keymaps/default/keymap.json @@ -13,8 +13,8 @@ ], [ { - "ccw": "KC_MS_WH_DOWN", - "cw": "KC_MS_WH_UP" + "ccw": "MS_WHLD", + "cw": "MS_WHLU" } ] ], diff --git a/keyboards/binepad/pixie/keymaps/default/keymap.c b/keyboards/binepad/pixie/keymaps/default/keymap.c index b49c4db6de..a8e2a12303 100644 --- a/keyboards/binepad/pixie/keymaps/default/keymap.c +++ b/keyboards/binepad/pixie/keymaps/default/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), - ENCODER_CCW_CW(KC_WH_U, KC_WH_D) + ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; diff --git a/keyboards/bt66tech/bt66tech60/keymaps/default/keymap.c b/keyboards/bt66tech/bt66tech60/keymaps/default/keymap.c index 5f4acc1b9d..c8bc919a86 100644 --- a/keyboards/bt66tech/bt66tech60/keymaps/default/keymap.c +++ b/keyboards/bt66tech/bt66tech60/keymaps/default/keymap.c @@ -34,9 +34,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT_60_ansi( 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_MS_ACCEL0, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, - KC_MS_ACCEL1, KC_MS_LEFT, KC_MS_DOWN,KC_MS_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_MS_ACCEL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, MO(_FN1), + MS_ACL0, MS_BTN1, MS_UP, MS_BTN2, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, + MS_ACL1, MS_LEFT, MS_DOWN,MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + MS_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, MO(_FN1), _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ ), diff --git a/keyboards/buzzard/keymaps/default/keymap.c b/keyboards/buzzard/keymaps/default/keymap.c index 7ca3ddc7de..9e9fe20577 100644 --- a/keyboards/buzzard/keymaps/default/keymap.c +++ b/keyboards/buzzard/keymaps/default/keymap.c @@ -52,13 +52,13 @@ enum layers { #define SFT_TAB MT(MOD_LSFT, KC_TAB) // Thumbcluster -#define UC_TL1 KC_BTN1 +#define UC_TL1 MS_BTN1 #define UC_TL2 LT(NAVR, KC_SPC) #define UC_TL3 LT(NUMR, KC_TAB) #define UC_TR3 LT(FUNL, KC_BSPC) #define UC_TR2 LT(SYMB, KC_ENT) -#define UC_TR1 KC_BTN2 +#define UC_TR1 MS_BTN2 // Shortcuts #define UC_COPY LCTL(KC_C) @@ -90,7 +90,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , UC_OSFT, GUI_A , ALT_S , CTL_D , SFT_F , KC_G , KC_H , SFT_J , CTL_K , ALT_L , GUI_SCL, KC_DEL, CTL_ESC, KC_Z , RALT_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, RALT_DT, KC_SLSH, ADJL , - KC_BTN1, UC_TL2 , UC_TL3 , UC_TR3 , UC_TR2 , UC_TR1 + MS_BTN1, UC_TL2 , UC_TL3 , UC_TR3 , UC_TR2 , UC_TR1 ), // /* @@ -113,7 +113,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAVR] = LAYOUT( _______, _______, _______, _______, _______, KC_INS , UC_CUT , KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, UC_COPY, KC_LEFT, KC_UP , KC_DOWN, KC_RGHT, _______, - _______, _______, _______, _______, _______, _______, UC_PSTE, KC_HOME, KC_WH_U, KC_WH_D, KC_END , _______, + _______, _______, _______, _______, _______, _______, UC_PSTE, KC_HOME, MS_WHLU, MS_WHLD, KC_END , _______, _______, _______, _______, KC_BSPC, KC_ENT , _______ ), // -------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -264,7 +264,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { bool get_haptic_enabled_key(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case KC_BTN1 ... KC_BTN5: + case MS_BTN1 ... MS_BTN5: return true; break; } diff --git a/keyboards/cannonkeys/ortho48v2/keymaps/default/keymap.c b/keyboards/cannonkeys/ortho48v2/keymaps/default/keymap.c index 7bfc7a5cf0..b961c50e36 100644 --- a/keyboards/cannonkeys/ortho48v2/keymaps/default/keymap.c +++ b/keyboards/cannonkeys/ortho48v2/keymaps/default/keymap.c @@ -86,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LOWER] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, - [_RAISE] = { ENCODER_CCW_CW(KC_MS_WH_LEFT, KC_MS_WH_RIGHT) }, + [_LOWER] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, + [_RAISE] = { ENCODER_CCW_CW(MS_WHLL, MS_WHLR) }, }; #endif diff --git a/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c b/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c index a97574c774..5dbb6b8b87 100644 --- a/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c +++ b/keyboards/cannonkeys/sagittarius/keymaps/default/keymap.c @@ -47,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_HUED, UG_HUEU), ENCODER_CCW_CW(UG_SATD, UG_SATU) }, - [1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU), ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_HUED, UG_HUEU), ENCODER_CCW_CW(UG_SATD, UG_SATU) }, + [1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU), ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, }; #endif diff --git a/keyboards/checkerboards/quark_plus/quark_plus.c b/keyboards/checkerboards/quark_plus/quark_plus.c index 84e2375a74..66b210ad7a 100644 --- a/keyboards/checkerboards/quark_plus/quark_plus.c +++ b/keyboards/checkerboards/quark_plus/quark_plus.c @@ -20,9 +20,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 1) { /* left encoder*/ if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 0) { /* right encoder */ if (clockwise){ diff --git a/keyboards/checkerboards/snop60/snop60.c b/keyboards/checkerboards/snop60/snop60.c index 641815f919..18445174f3 100644 --- a/keyboards/checkerboards/snop60/snop60.c +++ b/keyboards/checkerboards/snop60/snop60.c @@ -22,9 +22,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 1) { /* left encoder*/ if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 0) { /* right encoder */ if (clockwise){ diff --git a/keyboards/cheshire/curiosity/keymaps/default/keymap.c b/keyboards/cheshire/curiosity/keymaps/default/keymap.c index 18d371c58a..85bb51b7fd 100644 --- a/keyboards/cheshire/curiosity/keymaps/default/keymap.c +++ b/keyboards/cheshire/curiosity/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FNMS] = LAYOUT_default( UG_TOGG, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, - UG_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_U, _______, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN2, _______, _______, + UG_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, MS_UP, _______, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, UG_SATU, UG_HUEU, UG_VALU, UG_SATD, UG_HUED, UG_VALD, _______, _______, AG_TOGG, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/ckeys/handwire_101/keymaps/default/keymap.c b/keyboards/ckeys/handwire_101/keymaps/default/keymap.c index 0b26d61322..74f7cf6f2c 100755 --- a/keyboards/ckeys/handwire_101/keymaps/default/keymap.c +++ b/keyboards/ckeys/handwire_101/keymaps/default/keymap.c @@ -117,10 +117,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------' */ [_MOUSE] = LAYOUT_ortho_4x4( - KC_BTN5, _______, KC_WH_U, _______, - _______, KC_BTN1, KC_MS_U, KC_BTN2, - KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, - KC_BTN3, KC_WH_L, KC_WH_D, KC_WH_R + MS_BTN5, _______, MS_WHLU, _______, + _______, MS_BTN1, MS_UP, MS_BTN2, + MS_BTN4, MS_LEFT, MS_DOWN, MS_RGHT, + MS_BTN3, MS_WHLL, MS_WHLD, MS_WHLR ), /* TERMINAL * ,---------------------------------------. diff --git a/keyboards/ckeys/thedora/keymaps/default/keymap.c b/keyboards/ckeys/thedora/keymaps/default/keymap.c index 9c0d756562..dd856ea23e 100755 --- a/keyboards/ckeys/thedora/keymaps/default/keymap.c +++ b/keyboards/ckeys/thedora/keymaps/default/keymap.c @@ -123,10 +123,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // └─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ [_MOUSE] = LAYOUT( - KC_BTN5, _______, KC_WH_U, _______, _______, - _______, KC_BTN1, KC_MS_U, KC_BTN2, TG(_MOUSE), - KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, _______, - _______, KC_BTN3, KC_WH_L, KC_WH_D, KC_WH_R, _______ + MS_BTN5, _______, MS_WHLU, _______, _______, + _______, MS_BTN1, MS_UP, MS_BTN2, TG(_MOUSE), + MS_BTN4, MS_LEFT, MS_DOWN, MS_RGHT, _______, + _______, MS_BTN3, MS_WHLL, MS_WHLD, MS_WHLR, _______ ), // ADMIN LAYER diff --git a/keyboards/clueboard/2x1800/2019/2019.c b/keyboards/clueboard/2x1800/2019/2019.c index b7fb799ecb..c192f64175 100644 --- a/keyboards/clueboard/2x1800/2019/2019.c +++ b/keyboards/clueboard/2x1800/2019/2019.c @@ -41,12 +41,12 @@ void check_encoder_buttons(void) { dprintf("Turning drawing mode off.\n"); drawing_mode = false; gpio_write_pin_low(D6); - unregister_code(KC_BTN1); + unregister_code(MS_BTN1); } else { dprintf("Turning drawing mode on.\n"); drawing_mode = true; gpio_write_pin_high(D6); - register_code(KC_BTN1); + register_code(MS_BTN1); } } } @@ -88,37 +88,37 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (keycode == ENC_BTN1) { if (record->event.pressed) { btn1_pressed = true; - register_code(KC_BTN1); + register_code(MS_BTN1); } else { btn1_pressed = false; - unregister_code(KC_BTN1); + unregister_code(MS_BTN1); } } if (keycode == ENC_BTN2) { if (record->event.pressed) { btn2_pressed = true; - register_code(KC_BTN2); + register_code(MS_BTN2); } else { btn2_pressed = false; - unregister_code(KC_BTN2); + unregister_code(MS_BTN2); } } if (keycode == ENC_BTN3) { if (record->event.pressed) { btn3_pressed = true; - register_code(KC_BTN3); + register_code(MS_BTN3); } else { btn3_pressed = false; - unregister_code(KC_BTN3); + unregister_code(MS_BTN3); } } if (keycode == ENC_BTN4) { if (record->event.pressed) { btn4_pressed = true; - register_code(KC_BTN4); + register_code(MS_BTN4); } else { btn4_pressed = false; - unregister_code(KC_BTN4); + unregister_code(MS_BTN4); } } @@ -132,16 +132,16 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (encoder_update_user(index, clockwise)) { // Encoder 1, outside left if (index == 0 && clockwise) { - tap_code(KC_MS_U); // turned right + tap_code(MS_UP); // turned right } else if (index == 0) { - tap_code(KC_MS_D); // turned left + tap_code(MS_DOWN); // turned left } // Encoder 2, inside left else if (index == 1 && clockwise) { - tap_code(KC_WH_D); // turned right + tap_code(MS_WHLD); // turned right } else if (index == 1) { - tap_code(KC_WH_U); // turned left + tap_code(MS_WHLU); // turned left } // Encoder 3, inside right @@ -153,9 +153,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { // Encoder 4, outside right else if (index == 3 && clockwise) { - tap_code(KC_MS_R); // turned right + tap_code(MS_RGHT); // turned right } else if (index == 3) { - tap_code(KC_MS_L); // turned left + tap_code(MS_LEFT); // turned left } } return true; diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c index b2456225f1..b14b6f1878 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_1u_ansi( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c index 70e38efcba..37dabfb7e3 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_1u_iso( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_P7, KC_P8, KC_P9, KC_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c index cb41bf9a7d..d7ebfb029b 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_2u_ansi( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c index af3e7f96c7..e1f0c97c94 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_2u_iso( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_P7, KC_P8, KC_P9, KC_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c index fd7723d3de..79a32c74bb 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_4u_iso( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_INS, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_P7, KC_P8, KC_P9, KC_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c index 761423bfc4..9d056dac26 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_7u_ansi( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_DEL, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_PSLS, diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c index b499999954..738c4792a5 100644 --- a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c +++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_7u_iso( - KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, + MS_BTN1, MS_BTN2, MS_BTN3, MS_BTN4, KC_HOME, KC_END, KC_PGUP, KC_PGDN, 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_PSCR, KC_SCRL, KC_PAUS, KC_DEL, KC_PMNS, KC_NUM, KC_PSLS, KC_PAST, 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_PPLS, KC_P7, KC_P8, KC_P9, 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_P7, KC_P8, KC_P9, KC_PSLS, diff --git a/keyboards/clueboard/2x1800/2021/2021.c b/keyboards/clueboard/2x1800/2021/2021.c index 511c40a699..bd072c14b2 100644 --- a/keyboards/clueboard/2x1800/2021/2021.c +++ b/keyboards/clueboard/2x1800/2021/2021.c @@ -134,16 +134,16 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { #else // Encoder 1, left if (index == 0 && clockwise) { - tap_code(KC_MS_R); // turned right + tap_code(MS_RGHT); // turned right } else if (index == 0) { - tap_code(KC_MS_L); // turned left + tap_code(MS_LEFT); // turned left } // Encoder 2, right else if (index == 1 && clockwise) { - tap_code(KC_MS_U); // turned right + tap_code(MS_UP); // turned right } else if (index == 1) { - tap_code(KC_MS_D); // turned left + tap_code(MS_DOWN); // turned left } #endif } diff --git a/keyboards/coban/pad9a/keymaps/default/keymap.c b/keyboards/coban/pad9a/keymaps/default/keymap.c index 9ef5fc54d7..2638b2c2e7 100644 --- a/keyboards/coban/pad9a/keymaps/default/keymap.c +++ b/keyboards/coban/pad9a/keymaps/default/keymap.c @@ -26,6 +26,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, }; #endif diff --git a/keyboards/cornia/keymaps/fire/keymap.c b/keyboards/cornia/keymaps/fire/keymap.c index 9215c61f9c..ff63df801a 100644 --- a/keyboards/cornia/keymaps/fire/keymap.c +++ b/keyboards/cornia/keymaps/fire/keymap.c @@ -41,11 +41,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAV] = LAYOUT_split_3x6_3( //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, G(KC_L), XXXXXXX, CK_SCRL, C(KC_A), XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN3, XXXXXXX, XXXXXXX, KC_DEL, + _______, G(KC_L), XXXXXXX, CK_SCRL, C(KC_A), XXXXXXX, MS_BTN1, MS_BTN2, MS_BTN3, XXXXXXX, XXXXXXX, KC_DEL, //|--------+--------+ GUI V +--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, C(KC_X), G(KC_V), C(KC_V), C(KC_C), C(KC_Z), KC_WH_U, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, + _______, C(KC_X), G(KC_V), C(KC_V), C(KC_C), C(KC_Z), MS_WHLU, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, _______, //|ALT LEFT+--------+ ALT SFT+scrnshot+--------+--------| |--------+--------+--------+--------+--------+--------| - A(KC_LEFT),C(KC_S),S(KC_LALT), CK_SSHT,C(KC_F), C(KC_Y), KC_WH_D, KC_HOME, CK_SELL, CK_SELR, KC_END, _______, + A(KC_LEFT),C(KC_S),S(KC_LALT), CK_SSHT,C(KC_F), C(KC_Y), MS_WHLD, KC_HOME, CK_SELL, CK_SELR, KC_END, _______, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_LGUI, _______, _______, _______,MO(_ADJUST),_______ //`--------------------------' `--------------------------' diff --git a/keyboards/cradio/keymaps/default/keymap.c b/keyboards/cradio/keymaps/default/keymap.c index e6cbe763ba..3d624cd009 100644 --- a/keyboards/cradio/keymaps/default/keymap.c +++ b/keyboards/cradio/keymaps/default/keymap.c @@ -30,9 +30,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, KC_DEL, MO(3) ), [3] = LAYOUT_split_3x5_2( - _______, KC_F1, KC_F2, KC_F3, KC_F10, _______, KC_WH_U, KC_WH_D, _______, QK_BOOT, - _______, KC_F4, KC_F5, KC_F6, KC_F11, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_INS, - _______, KC_F7, KC_F8, KC_F9, KC_F12, _______, KC_BTN1, KC_BTN2, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F10, _______, MS_WHLU, MS_WHLD, _______, QK_BOOT, + _______, KC_F4, KC_F5, KC_F6, KC_F11, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_INS, + _______, KC_F7, KC_F8, KC_F9, KC_F12, _______, MS_BTN1, MS_BTN2, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/craftwalk/keymaps/default/keymap.c b/keyboards/craftwalk/keymaps/default/keymap.c index b212425bcf..019e99faf9 100644 --- a/keyboards/craftwalk/keymaps/default/keymap.c +++ b/keyboards/craftwalk/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT( KC_Q, KC_W, KC_E, KC_LCTL, KC_A, KC_S, KC_D, - KC_LSFT, MO_ADJ, KC_WH_U, KC_WH_D, KC_F, MO_NUM, KC_SPC + KC_LSFT, MO_ADJ, MS_WHLU, MS_WHLD, KC_F, MO_NUM, KC_SPC ), /* Number */ [_NUM] = LAYOUT( diff --git a/keyboards/custommk/elysian/keymaps/default/keymap.c b/keyboards/custommk/elysian/keymaps/default/keymap.c index fcb617ad9e..f7cb4924c9 100644 --- a/keyboards/custommk/elysian/keymaps/default/keymap.c +++ b/keyboards/custommk/elysian/keymaps/default/keymap.c @@ -14,6 +14,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_WH_D, KC_WH_U) } + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(MS_WHLD, MS_WHLU) } }; #endif \ No newline at end of file diff --git a/keyboards/custommk/evo70/evo70.c b/keyboards/custommk/evo70/evo70.c index a8df4a7d1d..c20c25d3f0 100644 --- a/keyboards/custommk/evo70/evo70.c +++ b/keyboards/custommk/evo70/evo70.c @@ -93,8 +93,8 @@ uint16_t enc_ccw[] = { KC_VOLD, KC_VOLD, KC_MEDIA_PREV_TRACK, KC_VOLD, 0, 0, 0, "Scroll Wheel" }; -uint16_t enc_cw[] = { KC_VOLU, KC_VOLU, KC_MEDIA_NEXT_TRACK, KC_VOLU, 0, 0, 0, 0, 0, KC_WH_U }; -uint16_t enc_ccw[] = { KC_VOLD, KC_VOLD, KC_MEDIA_PREV_TRACK, KC_VOLD, 0, 0, 0, 0, 0, KC_WH_D }; +uint16_t enc_cw[] = { KC_VOLU, KC_VOLU, KC_MEDIA_NEXT_TRACK, KC_VOLU, 0, 0, 0, 0, 0, MS_WHLU }; +uint16_t enc_ccw[] = { KC_VOLD, KC_VOLD, KC_MEDIA_PREV_TRACK, KC_VOLD, 0, 0, 0, 0, 0, MS_WHLD }; #endif //bongocat uint8_t num_enc_modes = 10; diff --git a/keyboards/doio/kb38/kb38.c b/keyboards/doio/kb38/kb38.c index 55a88a068b..2eaf62fa73 100644 --- a/keyboards/doio/kb38/kb38.c +++ b/keyboards/doio/kb38/kb38.c @@ -52,9 +52,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } else if (index == 1) { // Mouse Wheel Up/Down if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } } else if (index == 2) { // Volume Up/Down diff --git a/keyboards/doio/kb3x/keymaps/default/keymap.c b/keyboards/doio/kb3x/keymaps/default/keymap.c index 02dddfe517..7791a19f95 100644 --- a/keyboards/doio/kb3x/keymaps/default/keymap.c +++ b/keyboards/doio/kb3x/keymaps/default/keymap.c @@ -32,9 +32,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPLY, KC_DOWN, KC_DOWN), [_LAY1] = LAYOUT( TO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_WH_U, S(KC_RBRC), C(KC_L), - C(KC_WH_D), KC_TRNS, C(KC_WH_U), KC_DOT, KC_TRNS, KC_COMM, C(KC_B), KC_TRNS, C(KC_U), - KC_WH_D, S(KC_LBRC), C(KC_M)), + MS_WHLU, S(KC_RBRC), C(KC_L), + C(MS_WHLD), KC_TRNS, C(MS_WHLU), KC_DOT, KC_TRNS, KC_COMM, C(KC_B), KC_TRNS, C(KC_U), + MS_WHLD, S(KC_LBRC), C(KC_M)), [_LAY2] = LAYOUT( TO(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_B, KC_UP, S(KC_I), diff --git a/keyboards/draculad/keymaps/default/keymap.c b/keyboards/draculad/keymaps/default/keymap.c index a7b5261904..16df3ebac3 100644 --- a/keyboards/draculad/keymaps/default/keymap.c +++ b/keyboards/draculad/keymaps/default/keymap.c @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_MUS] = LAYOUT( KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_LALT, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LALT, MS_BTN3, MS_BTN2, MS_BTN1, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX @@ -218,9 +218,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { else if (index == 3 ) { // Page up/Page down if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/ducky/one2mini/keymaps/ansi/keymap.c b/keyboards/ducky/one2mini/keymaps/ansi/keymap.c index 2b42eb6e95..a80da0b114 100644 --- a/keyboards/ducky/one2mini/keymaps/ansi/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/ansi/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_60_ansi( // 2 3 4 5 6 7 8 9 10 11 12 13 14 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_ENT, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_ENT, _______, _______, KC_APP, _______, _______, _______, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_APP, MO(_CLR), _______, _______, KC_APP, _______, _______ ), diff --git a/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c b/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c index 259df16ab1..e28b4b7df0 100644 --- a/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/ansi_tsangan/keymap.c @@ -53,8 +53,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_60_ansi_tsangan( // 2 3 4 5 6 7 8 9 10 11 12 13 14 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_ENT, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_ENT, _______, _______, KC_APP, _______, _______, _______, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, KC_APP, MO(_CLR), _______, KC_APP, _______, _______ ), diff --git a/keyboards/ducky/one2mini/keymaps/default/keymap.c b/keyboards/ducky/one2mini/keymaps/default/keymap.c index d8941bacdc..69fcc295ad 100644 --- a/keyboards/ducky/one2mini/keymaps/default/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/default/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_all( // 2 3 4 5 6 7 8 9 10 11 12 13 14 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_ENT, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_ENT, _______, _______, _______, KC_APP, _______, _______, _______, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, MO(_CLR), KC_MPLY, _______, KC_APP, _______, _______ ), diff --git a/keyboards/ducky/one2mini/keymaps/iso/keymap.c b/keyboards/ducky/one2mini/keymaps/iso/keymap.c index 585655d554..4f45273b8b 100644 --- a/keyboards/ducky/one2mini/keymaps/iso/keymap.c +++ b/keyboards/ducky/one2mini/keymaps/iso/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_60_iso( // 2 3 4 5 6 7 8 9 10 11 12 13 14 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_ENT, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_ENT, _______, _______, _______, KC_APP, _______, _______, _______, KC_CALC, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_APP, MO(_CLR), _______, _______, KC_APP, _______, _______ ), diff --git a/keyboards/ducky/one2sf/keymaps/default/keymap.c b/keyboards/ducky/one2sf/keymaps/default/keymap.c index bfa354f508..91a644d972 100644 --- a/keyboards/ducky/one2sf/keymaps/default/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default/keymap.c @@ -38,8 +38,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUSE, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, KC_END, _______, _______, KC_END, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUSE, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, KC_END, _______, _______, KC_END, _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), diff --git a/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c b/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c index fd65bd543a..d353f005ed 100644 --- a/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default_ansi/keymap.c @@ -38,8 +38,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_ansi( 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_END, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, _______, KC_HOME, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, KC_END, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), diff --git a/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c b/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c index 94963fcab5..3ec27fa54f 100644 --- a/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c +++ b/keyboards/ducky/one2sf/keymaps/default_iso/keymap.c @@ -38,8 +38,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FUNCTION] = LAYOUT_iso( 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, KC_HOME, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, _______, KC_END, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, KC_INS, _______, KC_UP, KC_PAUS, KC_PGUP, KC_HOME, KC_PSCR, KC_HOME, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, KC_SCRL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, _______, _______, KC_END, _______, _______, RM_TOGG, RM_NEXT, RM_HUEU, RM_HUED, RM_SATU, RM_SATD, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______, _______, _______ ), diff --git a/keyboards/dumbpad/v0x/keymaps/default/keymap.c b/keyboards/dumbpad/v0x/keymaps/default/keymap.c index 9787c24f0f..13c8777274 100644 --- a/keyboards/dumbpad/v0x/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v0x/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_7, KC_8, KC_9, KC_BSPC, KC_4, KC_5, KC_6, KC_ESC, KC_1, KC_2, KC_3, KC_TAB, - KC_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER + MS_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER ), /* SUB LAYER @@ -87,9 +87,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v0x/v0x.c b/keyboards/dumbpad/v0x/v0x.c index 5a61096606..ba68a75eaa 100644 --- a/keyboards/dumbpad/v0x/v0x.c +++ b/keyboards/dumbpad/v0x/v0x.c @@ -69,9 +69,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v0x_dualencoder/keymaps/default/keymap.c b/keyboards/dumbpad/v0x_dualencoder/keymaps/default/keymap.c index 28b71cd8e7..c7f7d6fcee 100644 --- a/keyboards/dumbpad/v0x_dualencoder/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v0x_dualencoder/keymaps/default/keymap.c @@ -95,9 +95,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v0x_dualencoder/v0x_dualencoder.c b/keyboards/dumbpad/v0x_dualencoder/v0x_dualencoder.c index 1c622f7bf4..26ebb70acd 100644 --- a/keyboards/dumbpad/v0x_dualencoder/v0x_dualencoder.c +++ b/keyboards/dumbpad/v0x_dualencoder/v0x_dualencoder.c @@ -69,9 +69,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v0x_right/keymaps/default/keymap.c b/keyboards/dumbpad/v0x_right/keymaps/default/keymap.c index a0f4e3a669..cb916b7edc 100644 --- a/keyboards/dumbpad/v0x_right/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v0x_right/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_7, KC_8, KC_9, KC_BSPC, KC_4, KC_5, KC_6, KC_ESC, KC_1, KC_2, KC_3, KC_TAB, - TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER, KC_BTN1 + TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER, MS_BTN1 ), /* SUB LAYER @@ -87,9 +87,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v0x_right/v0x_right.c b/keyboards/dumbpad/v0x_right/v0x_right.c index 5a61096606..ba68a75eaa 100644 --- a/keyboards/dumbpad/v0x_right/v0x_right.c +++ b/keyboards/dumbpad/v0x_right/v0x_right.c @@ -69,9 +69,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x/keymaps/default/keymap.c b/keyboards/dumbpad/v1x/keymaps/default/keymap.c index 9787c24f0f..13c8777274 100644 --- a/keyboards/dumbpad/v1x/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v1x/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_7, KC_8, KC_9, KC_BSPC, KC_4, KC_5, KC_6, KC_ESC, KC_1, KC_2, KC_3, KC_TAB, - KC_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER + MS_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER ), /* SUB LAYER @@ -87,9 +87,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x/v1x.c b/keyboards/dumbpad/v1x/v1x.c index 3fec6cb7e6..650f9230cf 100644 --- a/keyboards/dumbpad/v1x/v1x.c +++ b/keyboards/dumbpad/v1x/v1x.c @@ -81,9 +81,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x_dualencoder/keymaps/default/keymap.c b/keyboards/dumbpad/v1x_dualencoder/keymaps/default/keymap.c index 805815253a..d144278f8b 100644 --- a/keyboards/dumbpad/v1x_dualencoder/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v1x_dualencoder/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_7, KC_8, KC_9, KC_BSPC, KC_4, KC_5, KC_6, KC_ESC, KC_1, KC_2, KC_3, KC_TAB, - KC_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER + MS_BTN1, TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER ), /* SUB LAYER @@ -95,9 +95,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x_dualencoder/v1x_dualencoder.c b/keyboards/dumbpad/v1x_dualencoder/v1x_dualencoder.c index 31137ce775..f4aef72f46 100644 --- a/keyboards/dumbpad/v1x_dualencoder/v1x_dualencoder.c +++ b/keyboards/dumbpad/v1x_dualencoder/v1x_dualencoder.c @@ -81,9 +81,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x_right/keymaps/default/keymap.c b/keyboards/dumbpad/v1x_right/keymaps/default/keymap.c index a0f4e3a669..cb916b7edc 100644 --- a/keyboards/dumbpad/v1x_right/keymaps/default/keymap.c +++ b/keyboards/dumbpad/v1x_right/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_7, KC_8, KC_9, KC_BSPC, KC_4, KC_5, KC_6, KC_ESC, KC_1, KC_2, KC_3, KC_TAB, - TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER, KC_BTN1 + TT(1), KC_0, LSFT_T(KC_DOT), KC_ENTER, MS_BTN1 ), /* SUB LAYER @@ -87,9 +87,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 0: // main layer - move mouse right (CW) and left (CCW) if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dumbpad/v1x_right/v1x_right.c b/keyboards/dumbpad/v1x_right/v1x_right.c index 3fec6cb7e6..650f9230cf 100644 --- a/keyboards/dumbpad/v1x_right/v1x_right.c +++ b/keyboards/dumbpad/v1x_right/v1x_right.c @@ -81,9 +81,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { switch (get_highest_layer(layer_state)) { case 0: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; diff --git a/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c index 1479d14398..4d1815eea8 100644 --- a/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c +++ b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c @@ -93,8 +93,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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_PSCR, _______, _______, - _______, KC_MS_LEFT,KC_MS_DOWN,KC_MS_UP, KC_MS_RIGHT,_______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, - _______, _______, _______, _______, _______, KC_MS_BTN1,KC_MS_BTN2,_______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, + _______, MS_LEFT,MS_DOWN,MS_UP, MS_RGHT,_______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, + _______, _______, _______, _______, _______, MS_BTN1,MS_BTN2,_______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), /* Keymap NL: Numpad Layer diff --git a/keyboards/ergodox_ez/glow/keymaps/default/keymap.c b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c index b3f394bee8..edcb75dc1c 100644 --- a/keyboards/ergodox_ez/glow/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/glow/keymaps/default/keymap.c @@ -101,10 +101,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MDIA] = LAYOUT_ergodox_pretty( // left hand KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 5197f140f0..2ec7a02920 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -101,10 +101,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MDIA] = LAYOUT_ergodox_pretty( // left hand KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ergodox_ez/keymaps/default_osx/keymap.c b/keyboards/ergodox_ez/keymaps/default_osx/keymap.c index 97c8bea54c..3008726acd 100644 --- a/keyboards/ergodox_ez/keymaps/default_osx/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default_osx/keymap.c @@ -119,10 +119,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c index 47be8ebb40..6072fbb5f0 100644 --- a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c @@ -132,10 +132,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ergodox_ez/keymaps/testing/keymap.c b/keyboards/ergodox_ez/keymaps/testing/keymap.c index 70a4af45a4..3f724fc2df 100644 --- a/keyboards/ergodox_ez/keymaps/testing/keymap.c +++ b/keyboards/ergodox_ez/keymaps/testing/keymap.c @@ -24,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_ergodox(KC_TRANSPARENT,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,LCTL(KC_W),KC_LBRC,KC_RBRC,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,LCTL(KC_PGUP),LCTL(KC_PGDN),UG_NEXT,KC_TRANSPARENT,KC_TRANSPARENT,UG_VALD,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_F11,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F12,KC_AMPR,KC_UNDS,KC_MINUS,KC_SCLN,KC_PLUS,KC_TRANSPARENT,KC_TRANSPARENT,KC_PIPE,KC_AT,KC_EQUAL,KC_PERC,KC_BSLS,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,UG_TOGG,RGB_SLD,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,UG_HUEU), - [2] = LAYOUT_ergodox(KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MS_UP,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MS_LEFT,KC_MS_DOWN,KC_MS_RIGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MS_BTN1,KC_MS_BTN2,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PLAY_PAUSE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT,KC_TRANSPARENT,KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_WWW_BACK), + [2] = LAYOUT_ergodox(KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,MS_UP,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,MS_LEFT,MS_DOWN,MS_RGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,MS_BTN1,MS_BTN2,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PLAY_PAUSE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT,KC_TRANSPARENT,KC_AUDIO_VOL_UP,KC_AUDIO_VOL_DOWN,KC_AUDIO_MUTE,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_WWW_BACK), }; diff --git a/keyboards/ergoslab/keymaps/default/keymap.c b/keyboards/ergoslab/keymaps/default/keymap.c index 01ea4ba36c..019a6fc17c 100644 --- a/keyboards/ergoslab/keymaps/default/keymap.c +++ b/keyboards/ergoslab/keymaps/default/keymap.c @@ -41,10 +41,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [MOUS] = LAYOUT( - _______, _______, KC_MS_U, _______, _______, _______, _______, KC_WH_U, _______, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_BTN3, KC_WH_D, _______, _______, + _______, _______, MS_UP, _______, _______, _______, _______, MS_WHLU, _______, _______, + _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, MS_BTN3, MS_WHLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, KC_ACL0, _______, KC_BTN2, KC_BTN1, _______, _______, _______, _______, + _______, _______, _______, _______, MS_ACL0, _______, MS_BTN2, MS_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), }; diff --git a/keyboards/etiennecollin/wave/keymaps/default/keymap.c b/keyboards/etiennecollin/wave/keymaps/default/keymap.c index 24bc85d5b4..8de48fb016 100644 --- a/keyboards/etiennecollin/wave/keymaps/default/keymap.c +++ b/keyboards/etiennecollin/wave/keymaps/default/keymap.c @@ -115,10 +115,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // --------+-------+-------+-------+-------| |-------+-------+-------+-------+-------| // | | | ___ | | left | right | mid | // --------+-------+-------- --------+-------+-------- - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, - XXXXXXX, XXXXXXX, _______, KC_BTN1, KC_BTN2, KC_BTN3 + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_ACL0, MS_ACL1, MS_ACL2, XXXXXXX, + KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_WHLL, MS_WHLD, MS_WHLU, MS_WHLR, + XXXXXXX, XXXXXXX, _______, MS_BTN1, MS_BTN2, MS_BTN3 ), [SYM] = LAYOUT_split_3x5_3( // ----------------------------------------- ----------------------------------------- diff --git a/keyboards/evyd13/ta65/keymaps/default/keymap.c b/keyboards/evyd13/ta65/keymaps/default/keymap.c index 697215510b..bde9290afb 100644 --- a/keyboards/evyd13/ta65/keymaps/default/keymap.c +++ b/keyboards/evyd13/ta65/keymaps/default/keymap.c @@ -22,9 +22,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { switch(get_highest_layer(layer_state)){ case 1: //Layer 1 if (!clockwise) { // Remove ! to reverse direction - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; default: //Layer 0 diff --git a/keyboards/ferris/keymaps/default/keymap.json b/keyboards/ferris/keymaps/default/keymap.json index 3f927ae5b1..0d081e4d8f 100644 --- a/keyboards/ferris/keymaps/default/keymap.json +++ b/keyboards/ferris/keymaps/default/keymap.json @@ -18,13 +18,13 @@ "LT(7,KC_SPC)", "KC_P1" ], ["KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", - "KC_TRNS" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", + "KC_TRNS" , "MS_BTN1" , "MS_WHLU" , "MS_BTN2" , "KC_TRNS", - "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS", - "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", + "KC_TRNS" , "MS_BTN2" , "KC_NO" , "MS_BTN1" , "KC_TRNS", + "KC_TRNS" , "MS_LEFT" , "MS_DOWN" , "MS_UP" , "MS_RGHT", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", - "KC_TRNS" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "KC_TRNS" , "MS_WHLL" , "MS_WHLD" , "MS_WHLR" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS" diff --git a/keyboards/frobiac/blackbowl/keymaps/default/keymap.c b/keyboards/frobiac/blackbowl/keymaps/default/keymap.c index d85215ea04..c895ceb53c 100644 --- a/keyboards/frobiac/blackbowl/keymaps/default/keymap.c +++ b/keyboards/frobiac/blackbowl/keymaps/default/keymap.c @@ -74,9 +74,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_MOUSE] = LAYOUT( - KC_WH_L, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, KC_ACL0, XXXXXXX, KC_BTN3, XXXXXXX, KC_BTN5, - KC_WH_R, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, KC_ACL1, XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN4, - MOUSE_X, KC_BTN1, KC_BTN3, KC_BTN2, KC_WH_D, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MS_WHLL, XXXXXXX, MS_UP, XXXXXXX, XXXXXXX, MS_ACL0, XXXXXXX, MS_BTN3, XXXXXXX, MS_BTN5, + MS_WHLR, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLU, MS_ACL1, XXXXXXX, MS_BTN1, MS_BTN2, MS_BTN4, + MOUSE_X, MS_BTN1, MS_BTN3, MS_BTN2, MS_WHLD, MS_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/frobiac/blackflat/keymaps/default/keymap.c b/keyboards/frobiac/blackflat/keymaps/default/keymap.c index 8cf73b9316..f5591d6934 100644 --- a/keyboards/frobiac/blackflat/keymaps/default/keymap.c +++ b/keyboards/frobiac/blackflat/keymaps/default/keymap.c @@ -74,9 +74,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_MOUSE] = LAYOUT( - KC_WH_L, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, KC_ACL0, XXXXXXX, KC_BTN3, XXXXXXX, KC_BTN5, - KC_WH_R, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, KC_ACL1, XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN4, - MOUSE_X, KC_BTN1, KC_BTN3, KC_BTN2, KC_WH_D, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MS_WHLL, XXXXXXX, MS_UP, XXXXXXX, XXXXXXX, MS_ACL0, XXXXXXX, MS_BTN3, XXXXXXX, MS_BTN5, + MS_WHLR, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLU, MS_ACL1, XXXXXXX, MS_BTN1, MS_BTN2, MS_BTN4, + MOUSE_X, MS_BTN1, MS_BTN3, MS_BTN2, MS_WHLD, MS_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/frobiac/hypernano/keymaps/default/keymap.c b/keyboards/frobiac/hypernano/keymaps/default/keymap.c index 5e5277805f..5af1391461 100644 --- a/keyboards/frobiac/hypernano/keymaps/default/keymap.c +++ b/keyboards/frobiac/hypernano/keymaps/default/keymap.c @@ -74,9 +74,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_MOUSE] = LAYOUT( - KC_WH_L, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, KC_ACL0, XXXXXXX, KC_BTN3, XXXXXXX, KC_BTN5, - KC_WH_R, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, KC_ACL1, XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN4, - MOUSE_X, KC_BTN1, KC_BTN3, KC_BTN2, KC_WH_D, XXXXXXX, XXXXXXX, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + MS_WHLL, XXXXXXX, MS_UP, XXXXXXX, XXXXXXX, MS_ACL0, XXXXXXX, MS_BTN3, XXXXXXX, MS_BTN5, + MS_WHLR, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLU, MS_ACL1, XXXXXXX, MS_BTN1, MS_BTN2, MS_BTN4, + MOUSE_X, MS_BTN1, MS_BTN3, MS_BTN2, MS_WHLD, XXXXXXX, XXXXXXX, MS_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______ ), diff --git a/keyboards/frobiac/redtilt/keymaps/default/keymap.c b/keyboards/frobiac/redtilt/keymaps/default/keymap.c index d6df7a9db3..71c7dd49c8 100644 --- a/keyboards/frobiac/redtilt/keymaps/default/keymap.c +++ b/keyboards/frobiac/redtilt/keymaps/default/keymap.c @@ -76,9 +76,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_MOUSE] = LAYOUT( - XXXXXXX, KC_WH_L, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, KC_ACL0, XXXXXXX, KC_BTN3, XXXXXXX, KC_BTN5, XXXXXXX, - XXXXXXX, KC_WH_R, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, KC_ACL1, XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN4, XXXXXXX, - XXXXXXX, MOUSE_X, KC_BTN1, KC_BTN3, KC_BTN2, KC_WH_D, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, MS_WHLL, XXXXXXX, MS_UP, XXXXXXX, XXXXXXX, MS_ACL0, XXXXXXX, MS_BTN3, XXXXXXX, MS_BTN5, XXXXXXX, + XXXXXXX, MS_WHLR, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLU, MS_ACL1, XXXXXXX, MS_BTN1, MS_BTN2, MS_BTN4, XXXXXXX, + XXXXXXX, MOUSE_X, MS_BTN1, MS_BTN3, MS_BTN2, MS_WHLD, MS_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX ), diff --git a/keyboards/fungo/keymaps/default/keymap.c b/keyboards/fungo/keymaps/default/keymap.c index 6dc4e97f1b..9225514452 100644 --- a/keyboards/fungo/keymaps/default/keymap.c +++ b/keyboards/fungo/keymaps/default/keymap.c @@ -145,9 +145,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [SAM4] = LAYOUT( KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ESC, KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_BSPC, KC_ACL0, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, KC_NO, - KC_TAB, KC_F6, MTC_F7, MTC_F8, MTC_F9, KC_F10, KC_F12, KC_CAPS, KC_ACL1, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_TAB, - KC_NO, KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, KC_NO, KC_NO, TT(SAM3), KC_NO, KC_NO, TT(SAM2), KC_NO, KC_ACL2, KC_WH_L, KC_WH_U, KC_WH_D, KC_WH_R, KC_RCTL, + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_BSPC, MS_ACL0, MS_BTN1, MS_UP, MS_BTN2, KC_NO, KC_NO, + KC_TAB, KC_F6, MTC_F7, MTC_F8, MTC_F9, KC_F10, KC_F12, KC_CAPS, MS_ACL1, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, KC_TAB, + KC_NO, KC_NO, MS_ACL0, MS_ACL1, MS_ACL2, KC_NO, KC_NO, TT(SAM3), KC_NO, KC_NO, TT(SAM2), KC_NO, MS_ACL2, MS_WHLL, MS_WHLU, MS_WHLD, MS_WHLR, KC_RCTL, KC_NO, TT(SAM1), KC_NO, KC_LALT, KC_SPC, TT(SAM2), KC_ENT, MO(SAM4), KC_NO, KC_ENT, TT(SAM3), KC_SPC, KC_RALT, KC_NO, TT(SAM1), KC_NO ), }; diff --git a/keyboards/gboards/butterstick/keymaps/default/keymap.c b/keyboards/gboards/butterstick/keymaps/default/keymap.c index d0c6af65df..d80169a2b8 100644 --- a/keyboards/gboards/butterstick/keymaps/default/keymap.c +++ b/keyboards/gboards/butterstick/keymaps/default/keymap.c @@ -49,8 +49,8 @@ uint32_t processQwerty(bool lookup) { P( LSD | RZ, SEND(KC_SPC)); // Dual chords - P( LP | LH, CLICK_MOUSE(KC_MS_BTN2)); - P( ST1 | RF, CLICK_MOUSE(KC_MS_BTN1)); + P( LP | LH, CLICK_MOUSE(MS_BTN2)); + P( ST1 | RF, CLICK_MOUSE(MS_BTN1)); P( LSU | LFT, SEND(KC_ESC)); P( LSD | LK, SEND(KC_LSFT)); P( RZ | RS, SEND(KC_LSFT)); diff --git a/keyboards/gboards/combos/germ-mouse-keys.def b/keyboards/gboards/combos/germ-mouse-keys.def index c0aff412e5..55d3afc4ff 100644 --- a/keyboards/gboards/combos/germ-mouse-keys.def +++ b/keyboards/gboards/combos/germ-mouse-keys.def @@ -1,2 +1,2 @@ -COMB(gbClick, KC_BTN1, KC_G, KC_B) -COMB(fvClick, KC_BTN2, KC_F, KC_V) +COMB(gbClick, MS_BTN1, KC_G, KC_B) +COMB(fvClick, MS_BTN2, KC_F, KC_V) diff --git a/keyboards/gboards/georgi/keymaps/colemak-dh/keymap.c b/keyboards/gboards/georgi/keymaps/colemak-dh/keymap.c index 932d48959c..339622aa9c 100644 --- a/keyboards/gboards/georgi/keymaps/colemak-dh/keymap.c +++ b/keyboards/gboards/georgi/keymaps/colemak-dh/keymap.c @@ -55,8 +55,8 @@ uint32_t processQwerty(bool lookup) { P( LFT | LK | LP | LW, REPEAT()); // Mouse Keys - /* P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2)); */ - /* P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1)); */ + /* P( LO | LSD | LK, CLICK_MOUSE(MS_BTN2)); */ + /* P( LO | LR | LW, CLICK_MOUSE(MS_BTN1)); */ /* Function layer diff --git a/keyboards/gboards/georgi/keymaps/default-flipped/keymap.c b/keyboards/gboards/georgi/keymaps/default-flipped/keymap.c index 19683179f3..f22fac75d8 100644 --- a/keyboards/gboards/georgi/keymaps/default-flipped/keymap.c +++ b/keyboards/gboards/georgi/keymaps/default-flipped/keymap.c @@ -46,8 +46,8 @@ uint32_t processQwerty(bool lookup) { P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC)); // Mouse Keys - P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2)); - P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1)); + P( LO | LSD | LK, CLICK_MOUSE(MS_BTN2)); + P( LO | LR | LW, CLICK_MOUSE(MS_BTN1)); // Thumb Chords P( LA | LO | RE | RU, SEND(KC_CAPS)); diff --git a/keyboards/gboards/georgi/keymaps/default/keymap.c b/keyboards/gboards/georgi/keymaps/default/keymap.c index 955ec0e406..32f144914c 100644 --- a/keyboards/gboards/georgi/keymaps/default/keymap.c +++ b/keyboards/gboards/georgi/keymaps/default/keymap.c @@ -52,8 +52,8 @@ uint32_t processQwerty(bool lookup) { P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC)); // Mouse Keys - P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2)); - P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1)); + P( LO | LSD | LK, CLICK_MOUSE(MS_BTN2)); + P( LO | LR | LW, CLICK_MOUSE(MS_BTN1)); // Thumb Chords P( LA | LO | RE | RU, SEND(KC_CAPS)); diff --git a/keyboards/gboards/georgi/keymaps/minimal/keymap.c b/keyboards/gboards/georgi/keymaps/minimal/keymap.c index 2f089866b2..3827089532 100644 --- a/keyboards/gboards/georgi/keymaps/minimal/keymap.c +++ b/keyboards/gboards/georgi/keymaps/minimal/keymap.c @@ -44,8 +44,8 @@ uint32_t processQwerty(bool lookup) { P( ST1 | ST2 | LW | ST4, SEND(KC_BSPC)); // Mouse Keys - P( LO | LSD | LK, CLICK_MOUSE(KC_MS_BTN2)); - P( LO | LR | LW, CLICK_MOUSE(KC_MS_BTN1)); + P( LO | LSD | LK, CLICK_MOUSE(MS_BTN2)); + P( LO | LR | LW, CLICK_MOUSE(MS_BTN1)); // Thumb Chords P( LA | LO | RE | RU, SEND(KC_CAPS)); diff --git a/keyboards/gboards/georgi/keymaps/norman/keymap.c b/keyboards/gboards/georgi/keymaps/norman/keymap.c index 1b53cddd8b..8f607bca1c 100644 --- a/keyboards/gboards/georgi/keymaps/norman/keymap.c +++ b/keyboards/gboards/georgi/keymaps/norman/keymap.c @@ -111,8 +111,8 @@ uint32_t processQwerty(bool lookup) { P( MEDIA | RU, SEND(KC_RALT); SEND(KC_T); SEND(KC_A); SEND(KC_D)); // Mouse Keys and Printscreen - P( LFT | LH, CLICK_MOUSE(KC_MS_BTN1)); - P( LK | LR, CLICK_MOUSE(KC_MS_BTN2)); + P( LFT | LH, CLICK_MOUSE(MS_BTN1)); + P( LK | LR, CLICK_MOUSE(MS_BTN2)); P( RF | RT, SEND(KC_PSCR);); // Number Row Left diff --git a/keyboards/gboards/gergo/keymaps/colemak/keymap.c b/keyboards/gboards/gergo/keymaps/colemak/keymap.c index 0783578804..5aa7a4a1e8 100644 --- a/keyboards/gboards/gergo/keymaps/colemak/keymap.c +++ b/keyboards/gboards/gergo/keymaps/colemak/keymap.c @@ -47,7 +47,7 @@ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, OSM(MOD_LALT), KC ALT_T(KC_DEL), KC_BSPC, KC_SPC, CMD_T(KC_DEL), - KC_BTN3, KC_COLON, + MS_BTN3, KC_COLON, LT(SYMB, KC_ESC), LT(NUMB, KC_F13), LT(NUMB, KC_F14), LT(SYMB, KC_ENT)), /* Keymap 1: Symbols layer * @@ -100,8 +100,8 @@ KC_TRNS, KC_GRV, KC_TILD,KC_TRNS,KC_TRNS, KC_EQL, M2_URL, KC_TRN */ [NUMB] = LAYOUT_gergo( KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PGUP, -KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_BTN1, KC_HOME, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_PGDN, -KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BTN2, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS, +KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, MS_BTN1, KC_HOME, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_PGDN, +KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MS_BTN2, KC_TRNS, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, KC_TRNS, diff --git a/keyboards/gboards/gergo/keymaps/default/keymap.c b/keyboards/gboards/gergo/keymaps/default/keymap.c index da6486c97a..6335b51df8 100644 --- a/keyboards/gboards/gergo/keymaps/default/keymap.c +++ b/keyboards/gboards/gergo/keymaps/default/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [BASE] = LAYOUT( LT(NUMB, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PIPE, - MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BTN1, KC_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, + MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, MS_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MS_BTN1, MS_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, MT(MOD_LGUI, KC_DEL), MT(MOD_LALT, KC_ENT), LT(SYMB, KC_SPC), LT(NUMB, KC_ESC), LT(SYMB, KC_ENT), LT(NUMB, KC_SPC), KC_TAB, KC_BSPC ), /* Keymap 1: Symbols layer @@ -95,7 +95,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [NUMB] = LAYOUT( KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLD, KC_VOLU, - KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_MPLY, KC_MNXT, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), }; diff --git a/keyboards/gboards/gergo/keymaps/germ/keymap.c b/keyboards/gboards/gergo/keymaps/germ/keymap.c index 8e26223f17..066b8674bc 100644 --- a/keyboards/gboards/gergo/keymaps/germ/keymap.c +++ b/keyboards/gboards/gergo/keymaps/germ/keymap.c @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [BASE] = LAYOUT_gergo( LT(NUMB, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PIPE, - MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BTN1, KC_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, + MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, MS_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MS_BTN1, MS_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, MT(MOD_LGUI, KC_DEL), MT(MOD_LALT, KC_ENT), LT(SYMB, KC_SPC), LT(NUMB, KC_ESC), LT(SYMB, KC_ENT), LT(NUMB, KC_SPC), KC_TAB, KC_BSPC ), /* Keymap 1: Symbols layer @@ -95,7 +95,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [NUMB] = LAYOUT_gergo( KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLD, KC_VOLU, - KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_MPLY, KC_MNXT, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), }; diff --git a/keyboards/gboards/gergo/keymaps/oled/keymap.c b/keyboards/gboards/gergo/keymaps/oled/keymap.c index ab374b9332..3e8fce15ef 100644 --- a/keyboards/gboards/gergo/keymaps/oled/keymap.c +++ b/keyboards/gboards/gergo/keymaps/oled/keymap.c @@ -40,8 +40,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [BASE] = LAYOUT_gergo( LT(NUMB, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PIPE, - MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BTN1, KC_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, + MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, MS_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MS_BTN1, MS_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, MT(MOD_LGUI, KC_DEL), MT(MOD_LALT, KC_ENT), LT(SYMB, KC_SPC), LT(NUMB, KC_ESC), LT(SYMB, KC_ENT), LT(NUMB, KC_SPC), KC_TAB, KC_BSPC ), /* Keymap 1: Symbols layer @@ -93,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [NUMB] = LAYOUT_gergo( KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLD, KC_VOLU, - KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_MPLY, KC_MNXT, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), }; diff --git a/keyboards/gboards/gergoplex/keymaps/colemak-dhm/gergoplex.def b/keyboards/gboards/gergoplex/keymaps/colemak-dhm/gergoplex.def index 7ed0122c4b..2aada19b75 100644 --- a/keyboards/gboards/gergoplex/keymaps/colemak-dhm/gergoplex.def +++ b/keyboards/gboards/gergoplex/keymaps/colemak-dhm/gergoplex.def @@ -5,7 +5,7 @@ COMB(eiGreat, KC_GT, KC_E, KC_I) COMB(xcDash, KC_MINS, KC_X, KC_C) COMB(hcUnds, KC_UNDS, KC_H, KC_COMM) COMB(khQuot, KC_QUOT, KC_K, KC_H) -COMB(gvClic, KC_BTN1, KC_G, KC_V) -COMB(tdClic, KC_BTN2, KC_T, KC_D) +COMB(gvClic, MS_BTN1, KC_G, KC_V) +COMB(tdClic, MS_BTN2, KC_T, KC_D) SUBS(pasta, "I would just like to interject for a moment.", KC_H, KC_J, KC_K, KC_L) diff --git a/keyboards/gboards/gergoplex/keymaps/colemak-dhm/keymap.c b/keyboards/gboards/gergoplex/keymaps/colemak-dhm/keymap.c index 4303ef4165..0c25914540 100644 --- a/keyboards/gboards/gergoplex/keymaps/colemak-dhm/keymap.c +++ b/keyboards/gboards/gergoplex/keymaps/colemak-dhm/keymap.c @@ -74,8 +74,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_SPECIAL] = LAYOUT_split_3x5_3( KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_GRV, KC_TILD, KC_TRNS, KC_TRNS, KC_BSLS, - KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_BTN2, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_QUOT, - KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_BTN1, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_MINS, + KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, MS_BTN2, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_QUOT, + KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, MS_BTN1, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_MINS, CM_TOGG, KC_SCLN, KC_EQL, KC_EQL, KC_SCLN, KC_DEL), /* Keymap 2: Numbers/Function/Motion layer @@ -94,6 +94,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NUMBERS] = LAYOUT_split_3x5_3( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_VOLD, + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_VOLD, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT) }; diff --git a/keyboards/gboards/gergoplex/keymaps/default/keymap.c b/keyboards/gboards/gergoplex/keymaps/default/keymap.c index 7728304a9a..e3b762485d 100644 --- a/keyboards/gboards/gergoplex/keymaps/default/keymap.c +++ b/keyboards/gboards/gergoplex/keymaps/default/keymap.c @@ -88,8 +88,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_SPECIAL] = LAYOUT_split_3x5_3( KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_GRV, KC_TILD, KC_TRNS, KC_TRNS, KC_BSLS, - KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_BTN2, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_QUOT, - KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_BTN1, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_MINS, + KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, MS_BTN2, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_QUOT, + KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, MS_BTN1, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_MINS, CM_TOGG, KC_SCLN, KC_EQL, KC_EQL, KC_SCLN, KC_DEL), /* Keymap 2: Numbers/Function/Motion layer @@ -108,6 +108,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NUMBERS] = LAYOUT_split_3x5_3( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_VOLD, + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_VOLD, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT) }; diff --git a/keyboards/green_keys/gravity_45/keymaps/default/keymap.c b/keyboards/green_keys/gravity_45/keymaps/default/keymap.c index b1031461d5..d7ef16b0e6 100644 --- a/keyboards/green_keys/gravity_45/keymaps/default/keymap.c +++ b/keyboards/green_keys/gravity_45/keymaps/default/keymap.c @@ -7,7 +7,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_ESC, LT(7, KC_Q), KC_W, KC_E, LT(6, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_LCTL, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, RGB_TOG, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_ENT, + KC_LCTL, KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, UG_TOGG, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, KC_ENT, KC_LSFT, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_DEL, KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RALT, KC_RGUI ), diff --git a/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c b/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c index adc3d89f39..c2cdf55d3c 100644 --- a/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c +++ b/keyboards/gregandcin/teaqueen/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAV] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_BTN2, MS_UP, MS_BTN1, MS_WHLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/h0oni/deskpad/deskpad.c b/keyboards/h0oni/deskpad/deskpad.c index 0f22eda152..8f9c97c97d 100644 --- a/keyboards/h0oni/deskpad/deskpad.c +++ b/keyboards/h0oni/deskpad/deskpad.c @@ -29,16 +29,16 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } else if(curr_layer == 1) { if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } else if(curr_layer == 2) { if (clockwise) { - tap_code16(C(KC_WH_U)); + tap_code16(C(MS_WHLU)); } else { - tap_code16(C(KC_WH_D)); + tap_code16(C(MS_WHLD)); } } else { diff --git a/keyboards/hadron/ver2/keymaps/default/keymap.c b/keyboards/hadron/ver2/keymaps/default/keymap.c index 951cacb423..825ec698b2 100644 --- a/keyboards/hadron/ver2/keymaps/default/keymap.c +++ b/keyboards/hadron/ver2/keymaps/default/keymap.c @@ -165,11 +165,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_MOUSECURSOR] = LAYOUT( - KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R,DEMOMACRO,_______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, - _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______ + MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, MS_WHLL, MS_UP, MS_WHLR,DEMOMACRO,_______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_END , KC_PGDN, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN2, MS_BTN3, MS_BTN4, MS_BTN5, _______, _______, + _______, _______, _______, _______, _______, MS_BTN1, _______, _______, _______, MS_BTN1, _______, _______, _______, _______, _______ ), /* Adjust (Lower + Raise) diff --git a/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c b/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c index 1e8523d94c..884ca0ed62 100644 --- a/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c +++ b/keyboards/hadron/ver2/keymaps/side_numpad/keymap.c @@ -164,11 +164,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_MOUSECURSOR] = LAYOUT( - _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R, DEMOMACRO, _______, _______, _______, _______, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, _______, _______, _______ + _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, MS_WHLL, MS_UP, MS_WHLR, DEMOMACRO, _______, _______, _______, _______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_END , KC_PGDN, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, MS_BTN2, MS_BTN3, MS_BTN4, MS_BTN5, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MS_BTN1, MS_BTN1, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Adjust (Lower + Raise) diff --git a/keyboards/hadron/ver3/keymaps/default/keymap.c b/keyboards/hadron/ver3/keymaps/default/keymap.c index 1e3f3191c2..df835454d3 100644 --- a/keyboards/hadron/ver3/keymaps/default/keymap.c +++ b/keyboards/hadron/ver3/keymaps/default/keymap.c @@ -162,11 +162,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_MOUSECURSOR] = LAYOUT( - KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_WH_L, KC_MS_U, KC_WH_R,DEMOMACRO,_______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_END , KC_PGDN, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5, _______, _______, - _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______ + MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, MS_WHLL, MS_UP, MS_WHLR,DEMOMACRO,_______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_END , KC_PGDN, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN2, MS_BTN3, MS_BTN4, MS_BTN5, _______, _______, + _______, _______, _______, _______, _______, MS_BTN1, _______, _______, _______, MS_BTN1, _______, _______, _______, _______, _______ ), /* Adjust (Lower + Raise) diff --git a/keyboards/halfcliff/halfcliff.c b/keyboards/halfcliff/halfcliff.c index de636f22fe..30d1ef36e6 100644 --- a/keyboards/halfcliff/halfcliff.c +++ b/keyboards/halfcliff/halfcliff.c @@ -81,15 +81,15 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 0) { /* Left side encoder */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 1) { /* Right side encoder */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c index 3dcd4b3f6c..47e9d1d120 100644 --- a/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c +++ b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c @@ -9,6 +9,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_PPLS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, - KC_BTN1, KC_BTN3, KC_BTN2 + MS_BTN1, MS_BTN3, MS_BTN2 ) }; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c index b22f797273..da85321a33 100644 --- a/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c @@ -9,6 +9,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, - KC_BTN1, KC_BTN3, KC_BTN2 + MS_BTN1, MS_BTN3, MS_BTN2 ) }; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c index 89e36d9fdc..bfb7a151d9 100644 --- a/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c @@ -9,6 +9,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPLY, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, - KC_BTN1, KC_BTN3, KC_BTN2 + MS_BTN1, MS_BTN3, MS_BTN2 ) }; diff --git a/keyboards/handwired/42/keymaps/default/keymap.c b/keyboards/handwired/42/keymaps/default/keymap.c index 3c31ef89d1..457d599b4f 100644 --- a/keyboards/handwired/42/keymaps/default/keymap.c +++ b/keyboards/handwired/42/keymaps/default/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), // Mouse Layer LAYOUT( - _______, _______, KC_WREF, KC_WH_U, KC_WSCH, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, - _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, + _______, _______, KC_WREF, MS_WHLU, KC_WSCH, _______, _______, MS_BTN1, MS_UP, MS_BTN2, _______, _______, + _______, _______, MS_WHLL, MS_WHLD, MS_WHLR, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/handwired/acacia/keymaps/default/keymap.c b/keyboards/handwired/acacia/keymaps/default/keymap.c index a33a3880a6..0b19c698de 100644 --- a/keyboards/handwired/acacia/keymaps/default/keymap.c +++ b/keyboards/handwired/acacia/keymaps/default/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAVI_FN] = LAYOUT( 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_TAB, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_TILD, KC_GRV, KC_LEFT, KC_UP, KC_RGHT, KC_WREF, KC_ENT, - KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, KC_BTN1, KC_DOWN, KC_BTN2, KC_WBAK, + KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, MS_BTN1, KC_DOWN, MS_BTN2, KC_WBAK, KC_MPRV, _______, BS_GUI, _______, _______, _______, _______, _______, _______, KC_PWR, _______ ), [_SYM_NUM] = LAYOUT( diff --git a/keyboards/handwired/chiron/keymaps/default/keymap.c b/keyboards/handwired/chiron/keymaps/default/keymap.c index 2889bd8b05..dead617e31 100644 --- a/keyboards/handwired/chiron/keymaps/default/keymap.c +++ b/keyboards/handwired/chiron/keymaps/default/keymap.c @@ -24,10 +24,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_INS, KC_LCTL, /*, */KC_LALT, LGUI_T(KC_SPC), KC_HYPR, KC_HYPR, RGUI_T(KC_SPC), KC_RALT, /*, */KC_LBRC, KC_RBRC, KC_SLSH ), [1] = LAYOUT( - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U, XXXXXXX, XXXXXXX, QK_BOOT, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_WH_L, KC_MS_U, KC_WH_R, XXXXXXX, EE_CLR, - XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, _______, KC_MUTE, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, KC_BTN2, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_VOLD, XXXXXXX, KC_WH_D, XXXXXXX, KC_BTN3, KC_BTN4, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_WHLU, XXXXXXX, XXXXXXX, QK_BOOT, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, MS_WHLL, MS_UP, MS_WHLR, XXXXXXX, EE_CLR, + XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, _______, KC_MUTE, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN1, MS_BTN2, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_VOLD, XXXXXXX, MS_WHLD, XXXXXXX, MS_BTN3, MS_BTN4, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX ), [2] = LAYOUT( diff --git a/keyboards/handwired/cmd60/keymaps/default/keymap.c b/keyboards/handwired/cmd60/keymaps/default/keymap.c index 15084365fe..5fe199247e 100644 --- a/keyboards/handwired/cmd60/keymaps/default/keymap.c +++ b/keyboards/handwired/cmd60/keymaps/default/keymap.c @@ -31,9 +31,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [4] = LAYOUT( /* CMD60 - Mouse */ KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, KC_BTN3, KC_WH_D, _______, + _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_UP, MS_BTN2, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLU, MS_BTN3, MS_WHLD, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), [5] = LAYOUT( /* CMD60 - Media */ diff --git a/keyboards/handwired/concertina/64key/keymaps/default/keymap.c b/keyboards/handwired/concertina/64key/keymaps/default/keymap.c index c9f6384440..968e2168b5 100644 --- a/keyboards/handwired/concertina/64key/keymaps/default/keymap.c +++ b/keyboards/handwired/concertina/64key/keymaps/default/keymap.c @@ -80,14 +80,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_NUMERIC] = LAYOUT( - _______, _______, _______, KC_ACL1, KC_ACL2, _______, - _______, _______, LAYER_C, _______, KC_ACL0, _______, _______, _______, + _______, _______, _______, MS_ACL1, MS_ACL2, _______, + _______, _______, LAYER_C, _______, MS_ACL0, _______, _______, _______, _______, _______, _______, KC_SLEP, _______, _______, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F12, KC_F1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_F10, KC_F11, _______, KC_1, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_APP, KC_0, PASTE, - KC_INS, KC_EXLM, KC_BTN1, KC_BTN3, KC_BTN2, KC_MS_L, KC_MS_U, KC_MS_R, KC_PSCR, QK_BOOT, - LAYER_G, KC_MS_D + KC_INS, KC_EXLM, MS_BTN1, MS_BTN3, MS_BTN2, MS_LEFT, MS_UP, MS_RGHT, KC_PSCR, QK_BOOT, + LAYER_G, MS_DOWN ) }; diff --git a/keyboards/handwired/dactyl/keymaps/default/keymap.c b/keyboards/handwired/dactyl/keymaps/default/keymap.c index 669f358530..fd21b7e1e8 100644 --- a/keyboards/handwired/dactyl/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl/keymaps/default/keymap.c @@ -118,10 +118,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/handwired/dactyl/keymaps/dvorak/keymap.c b/keyboards/handwired/dactyl/keymaps/dvorak/keymap.c index 59cb7b34f8..6d90b6825f 100644 --- a/keyboards/handwired/dactyl/keymaps/dvorak/keymap.c +++ b/keyboards/handwired/dactyl/keymaps/dvorak/keymap.c @@ -118,10 +118,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/handwired/dactyl_cc/keymaps/default/keymap.c b/keyboards/handwired/dactyl_cc/keymaps/default/keymap.c index 6422699684..bc882bca4a 100644 --- a/keyboards/handwired/dactyl_cc/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_cc/keymaps/default/keymap.c @@ -26,12 +26,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NAV] = LAYOUT( QK_BOOT, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_BRIU, KC_P7, KC_P8, KC_P9, KC_NO, QK_BOOT, - _______, KC_VOLU, KC_WBAK, KC_MS_U, KC_WFWD, KC_WH_U, KC_BRID, KC_P4, KC_P5, KC_P6, KC_PMNS, _______, - _______, KC_VOLD, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_PSLS, _______, + _______, KC_VOLU, KC_WBAK, MS_UP, KC_WFWD, MS_WHLU, KC_BRID, KC_P4, KC_P5, KC_P6, KC_PMNS, _______, + _______, KC_VOLD, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, KC_PPLS, KC_P1, KC_P2, KC_P3, KC_PSLS, _______, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_NO, KC_PAST, KC_PCMM, KC_P0, KC_PDOT, KC_PENT, _______, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, _______, - KC_BTN1, KC_BTN2, _______, KC_END, _______, _______, + MS_BTN1, MS_BTN2, _______, KC_END, _______, _______, _______, ALT_BSP ) }; diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/keymap.c index 630b106ca7..47c344eb14 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/keymap.c @@ -29,12 +29,12 @@ along with this program. If not, see . #define ALT_SPC ALT_T(KC_SPC) #define SFT_ENT SFT_T(KC_ENT) -#define KC_ML KC_MS_LEFT -#define KC_MR KC_MS_RIGHT -#define KC_MU KC_MS_UP -#define KC_MD KC_MS_DOWN -#define KC_MB1 KC_MS_BTN1 -#define KC_MB2 KC_MS_BTN2 +#define KC_ML MS_LEFT +#define KC_MR MS_RGHT +#define KC_MU MS_UP +#define KC_MD MS_DOWN +#define KC_MB1 MS_BTN1 +#define KC_MB2 MS_BTN2 #define RAISE MO(_RAISE) #define LOWER MO(_LOWER) diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/keymap.c b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/keymap.c index d0136c4c51..c8c087f267 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/keymap.c +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/keymap.c @@ -15,12 +15,12 @@ extern keymap_config_t keymap_config; #define ALT_SPC ALT_T(KC_SPC) #define SFT_ENT SFT_T(KC_ENT) -#define KC_ML KC_MS_LEFT -#define KC_MR KC_MS_RIGHT -#define KC_MU KC_MS_UP -#define KC_MD KC_MS_DOWN -#define KC_MB1 KC_MS_BTN1 -#define KC_MB2 KC_MS_BTN1 +#define KC_ML MS_LEFT +#define KC_MR MS_RGHT +#define KC_MU MS_UP +#define KC_MD MS_DOWN +#define KC_MB1 MS_BTN1 +#define KC_MB2 MS_BTN1 #define RAISE MO(_RAISE) #define LOWER MO(_LOWER) diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c index 942128d3f2..043f118ecc 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c @@ -9,12 +9,12 @@ #define ALT_SPC ALT_T(KC_SPC) #define SFT_ENT SFT_T(KC_ENT) -#define KC_ML KC_MS_LEFT -#define KC_MR KC_MS_RIGHT -#define KC_MU KC_MS_UP -#define KC_MD KC_MS_DOWN -#define KC_MB1 KC_MS_BTN1 -#define KC_MB2 KC_MS_BTN1 +#define KC_ML MS_LEFT +#define KC_MR MS_RGHT +#define KC_MU MS_UP +#define KC_MD MS_DOWN +#define KC_MB1 MS_BTN1 +#define KC_MB2 MS_BTN1 #define RAISE MO(_RAISE) #define LOWER MO(_LOWER) diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keymaps/default/keymap.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keymaps/default/keymap.json index a2760f42bb..24f5be6010 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keymaps/default/keymap.json +++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keymaps/default/keymap.json @@ -461,40 +461,40 @@ "KC_NO", "KC_TRNS", - "KC_ACL1", + "MS_ACL1", "KC_NO", "KC_NO", "KC_NO", "KC_NO", - "KC_WH_U", - "KC_WH_L", - "KC_MS_U", - "KC_WH_R", + "MS_WHLU", + "MS_WHLL", + "MS_UP", + "MS_WHLR", "KC_NO", "KC_NO", "KC_TRNS", - "KC_ACL2", - "KC_BTN2", - "KC_BTN3", - "KC_BTN1", - "KC_BTN1", - "KC_MS_L", - "KC_MS_L", - "KC_MS_D", - "KC_MS_R", + "MS_ACL2", + "MS_BTN2", + "MS_BTN3", + "MS_BTN1", + "MS_BTN1", + "MS_LEFT", + "MS_LEFT", + "MS_DOWN", + "MS_RGHT", "KC_NO", "KC_NO", "KC_TRNS", - "KC_ACL0", + "MS_ACL0", "KC_NO", "KC_NO", "KC_NO", "KC_NO", - "KC_WH_D", + "MS_WHLD", "KC_NO", - "KC_MS_D", + "MS_DOWN", "KC_NO", "KC_NO", "KC_TRNS", diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keymaps/default/keymap.json b/keyboards/handwired/dactyl_manuform/5x6_5/keymaps/default/keymap.json index 3cb115ffd5..bd58984eef 100644 --- a/keyboards/handwired/dactyl_manuform/5x6_5/keymaps/default/keymap.json +++ b/keyboards/handwired/dactyl_manuform/5x6_5/keymaps/default/keymap.json @@ -447,40 +447,40 @@ "KC_NO", "KC_TRNS", - "KC_ACL1", + "MS_ACL1", "KC_NO", "KC_NO", "KC_NO", "KC_NO", - "KC_WH_U", - "KC_WH_L", - "KC_MS_U", - "KC_WH_R", + "MS_WHLU", + "MS_WHLL", + "MS_UP", + "MS_WHLR", "KC_NO", "KC_NO", "KC_TRNS", - "KC_ACL2", - "KC_BTN2", - "KC_BTN3", - "KC_BTN1", - "KC_BTN1", - "KC_MS_L", - "KC_MS_L", - "KC_MS_D", - "KC_MS_R", + "MS_ACL2", + "MS_BTN2", + "MS_BTN3", + "MS_BTN1", + "MS_BTN1", + "MS_LEFT", + "MS_LEFT", + "MS_DOWN", + "MS_RGHT", "KC_NO", "KC_NO", "KC_TRNS", - "KC_ACL0", + "MS_ACL0", "KC_NO", "KC_NO", "KC_NO", "KC_NO", - "KC_WH_D", + "MS_WHLD", "KC_NO", - "KC_MS_D", + "MS_DOWN", "KC_NO", "KC_NO", "KC_TRNS", diff --git a/keyboards/handwired/dactyl_maximus/keymaps/default/keymap.c b/keyboards/handwired/dactyl_maximus/keymaps/default/keymap.c index cfd95db563..efd5f1a058 100644 --- a/keyboards/handwired/dactyl_maximus/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_maximus/keymaps/default/keymap.c @@ -41,12 +41,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = LAYOUT( KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, - KC_TRNS, KC_NO, KC_NO, KC_ACL2, KC_ACL1, KC_ACL0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, - KC_TRNS, KC_NO, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NO, KC_NO, KC_SLEP, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_TRNS, - KC_TRNS, KC_NO, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, MS_ACL2, MS_ACL1, MS_ACL0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NO, KC_NO, KC_SLEP, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, MS_WHLL, MS_WHLD, MS_WHLU, MS_WHLR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_BTN1, KC_BTN2, KC_NO, KC_NO, KC_TRNS, + KC_NO, MS_BTN1, MS_BTN2, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO ) }; diff --git a/keyboards/handwired/dactyl_promicro/keymaps/default/keymap.c b/keyboards/handwired/dactyl_promicro/keymaps/default/keymap.c index 1dd2f47841..2e5545c700 100644 --- a/keyboards/handwired/dactyl_promicro/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_promicro/keymaps/default/keymap.c @@ -57,10 +57,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_RAISE] = LAYOUT_6x6( _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______, - _______,_______,_______,KC_MS_U,_______,_______, _______,_______,_______,_______,_______,_______, - _______,_______,KC_MS_L,KC_MS_D,KC_MS_R,_______, _______,_______,_______,_______,_______,KC_MPLY, + _______,_______,_______,MS_UP, _______,_______, _______,_______,_______,_______,_______,_______, + _______,_______,MS_LEFT,MS_DOWN,MS_RGHT,_______, _______,_______,_______,_______,_______,KC_MPLY, _______,_______,_______,_______,_______,_______, _______,_______,KC_MPRV,KC_MNXT,_______,_______, - QK_BOOT ,_______,_______,KC_BTN1,KC_BTN2,_______, KC_WBAK,KC_VOLU,KC_VOLD,KC_MUTE,_______,_______, + QK_BOOT ,_______,_______,MS_BTN1,MS_BTN2,_______, KC_WBAK,KC_VOLU,KC_VOLD,KC_MUTE,_______,_______, _______,_______,_______, _______,_______,_______, _______, _______, _______, _______ diff --git a/keyboards/handwired/dactyl_rah/keymaps/default/keymap.c b/keyboards/handwired/dactyl_rah/keymaps/default/keymap.c index 6f0c25a4dd..447ff3c0a7 100644 --- a/keyboards/handwired/dactyl_rah/keymaps/default/keymap.c +++ b/keyboards/handwired/dactyl_rah/keymaps/default/keymap.c @@ -36,12 +36,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NAV] = LAYOUT_6x6( QK_BOOT , KC_NO ,KC_MPRV,KC_MPLY,KC_MNXT, KC_NO , KC_BRIU, KC_7 , KC_8 , KC_9 , KC_NO , QK_BOOT , - _______,KC_VOLU,KC_WBAK,KC_MS_U,KC_WFWD,KC_WH_U, KC_BRID, KC_4 , KC_5 , KC_6 , KC_NO , KC_F9 , - _______,KC_VOLD,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_D, KC_PPLS, KC_1 , KC_2 , KC_3 ,KC_PMNS, KC_F10, + _______,KC_VOLU,KC_WBAK,MS_UP, KC_WFWD,MS_WHLU, KC_BRID, KC_4 , KC_5 , KC_6 , KC_NO , KC_F9 , + _______,KC_VOLD,MS_LEFT,MS_DOWN,MS_RGHT,MS_WHLD, KC_PPLS, KC_1 , KC_2 , KC_3 ,KC_PMNS, KC_F10, KC_NO , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_NO , KC_PAST, KC_0 , KC_NO ,_______,KC_PSLS, KC_F11, _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______,_______,_______,_______, KC_F12, _______,_______, KC_HOME,_______, _______, KC_END , - KC_BTN1,KC_BTN2,_______, ALT_BSP,_______,_______ + MS_BTN1,MS_BTN2,_______, ALT_BSP,_______,_______ ) }; diff --git a/keyboards/handwired/dactyl_rah/keymaps/right/keymap.c b/keyboards/handwired/dactyl_rah/keymaps/right/keymap.c index 6f0c25a4dd..447ff3c0a7 100644 --- a/keyboards/handwired/dactyl_rah/keymaps/right/keymap.c +++ b/keyboards/handwired/dactyl_rah/keymaps/right/keymap.c @@ -36,12 +36,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NAV] = LAYOUT_6x6( QK_BOOT , KC_NO ,KC_MPRV,KC_MPLY,KC_MNXT, KC_NO , KC_BRIU, KC_7 , KC_8 , KC_9 , KC_NO , QK_BOOT , - _______,KC_VOLU,KC_WBAK,KC_MS_U,KC_WFWD,KC_WH_U, KC_BRID, KC_4 , KC_5 , KC_6 , KC_NO , KC_F9 , - _______,KC_VOLD,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_D, KC_PPLS, KC_1 , KC_2 , KC_3 ,KC_PMNS, KC_F10, + _______,KC_VOLU,KC_WBAK,MS_UP, KC_WFWD,MS_WHLU, KC_BRID, KC_4 , KC_5 , KC_6 , KC_NO , KC_F9 , + _______,KC_VOLD,MS_LEFT,MS_DOWN,MS_RGHT,MS_WHLD, KC_PPLS, KC_1 , KC_2 , KC_3 ,KC_PMNS, KC_F10, KC_NO , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_NO , KC_PAST, KC_0 , KC_NO ,_______,KC_PSLS, KC_F11, _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______,_______,_______,_______, KC_F12, _______,_______, KC_HOME,_______, _______, KC_END , - KC_BTN1,KC_BTN2,_______, ALT_BSP,_______,_______ + MS_BTN1,MS_BTN2,_______, ALT_BSP,_______,_______ ) }; diff --git a/keyboards/handwired/dactylmacropad/keymaps/default/keymap.c b/keyboards/handwired/dactylmacropad/keymaps/default/keymap.c index 65c7f445b7..bcb4e2016a 100644 --- a/keyboards/handwired/dactylmacropad/keymaps/default/keymap.c +++ b/keyboards/handwired/dactylmacropad/keymaps/default/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT (pvt, LCTL(KC_V), KC_UP, LCTL(KC_C), LSFT_T(KC_ESC), KC_LEFT, KC_DOWN, KC_RGHT, - TO(1), KC_LCTL, ALT_TAB, KC_APP, KC_BTN3), + TO(1), KC_LCTL, ALT_TAB, KC_APP, MS_BTN3), /* * ┌────┬────┬────┬────┐ * │mte │ BI │ up │pgu │ @@ -71,9 +71,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else { if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } return false; diff --git a/keyboards/handwired/datahand/keymaps/default/keymap.c b/keyboards/handwired/datahand/keymaps/default/keymap.c index 608c45dea3..828aed1d2e 100644 --- a/keyboards/handwired/datahand/keymaps/default/keymap.c +++ b/keyboards/handwired/datahand/keymaps/default/keymap.c @@ -85,9 +85,9 @@ _______, _______, _______, _______, _______, _______, _______, _______, ______ #endif [FUNCTION_MOUSE] = LAYOUT( - KC_F2, KC_F4, KC_F6, KC_MS_U, KC_MS_U, KC_F8, KC_F10, KC_PGUP, -_______, KC_NO, KC_SCRL, _______, KC_BTN3, NLK, KC_BTN1, MS, KC_BTN2, KC_MS_L, KC_BTN1, KC_MS_R, KC_MS_L, KC_BTN2, KC_MS_R, KC_END, AR, KC_LSFT, KC_INS, KC_9, KC_ENT, KC_F11, KC_0, KC_F12, - KC_F1, KC_F3, KC_F5, KC_MS_D, KC_MS_D, KC_F7, KC_F9, KC_PGDN, + KC_F2, KC_F4, KC_F6, MS_UP, MS_UP, KC_F8, KC_F10, KC_PGUP, +_______, KC_NO, KC_SCRL, _______, MS_BTN3, NLK, MS_BTN1, MS, MS_BTN2, MS_LEFT, MS_BTN1, MS_RGHT, MS_LEFT, MS_BTN2, MS_RGHT, KC_END, AR, KC_LSFT, KC_INS, KC_9, KC_ENT, KC_F11, KC_0, KC_F12, + KC_F1, KC_F3, KC_F5, MS_DOWN, MS_DOWN, KC_F7, KC_F9, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/handwired/dmote/keymaps/default/keymap.c b/keyboards/handwired/dmote/keymaps/default/keymap.c index 0c9ceb8722..632ccb87dc 100644 --- a/keyboards/handwired/dmote/keymaps/default/keymap.c +++ b/keyboards/handwired/dmote/keymaps/default/keymap.c @@ -65,9 +65,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYER_C, KC_INS, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, QK_BOOT, KC_WAKE, // * KC_F12, KC_F1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_F10, KC_F11, _______, KC_1, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_APP, KC_0, PASTE, - KC_GRV, KC_EXLM, KC_BTN1, KC_WH_U, KC_BTN2, KC_MS_L, KC_MS_U, KC_MS_R, KC_PSCR, UG_TOGG, - KC_WH_D, UG_NEXT, _______, KC_ACL1, KC_ACL2, KC_MS_D, - _______, _______, EMDASH, KC_ACL0, _______, _______, + KC_GRV, KC_EXLM, MS_BTN1, MS_WHLU, MS_BTN2, MS_LEFT, MS_UP, MS_RGHT, KC_PSCR, UG_TOGG, + MS_WHLD, UG_NEXT, _______, MS_ACL1, MS_ACL2, MS_DOWN, + _______, _______, EMDASH, MS_ACL0, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/handwired/dqz11n1g/keymaps/default/keymap.c b/keyboards/handwired/dqz11n1g/keymaps/default/keymap.c index 2a4ca0c703..9488bbfde6 100644 --- a/keyboards/handwired/dqz11n1g/keymaps/default/keymap.c +++ b/keyboards/handwired/dqz11n1g/keymaps/default/keymap.c @@ -37,11 +37,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * Maltron, so just putting some "Quantum" keycodes here for testing that * the layer exists and Fun Lock LED works. */ [_FUNCTION] = LAYOUT( - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,KC_TRNS,KC_BTN3,KC_MS_U,KC_WH_U,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,KC_TRNS,MS_BTN3,MS_UP, MS_WHLU,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_UP, AU_ON, KC_MS_L,KC_BTN1,KC_MS_R,KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_DOWN,AU_OFF, KC_BTN2,KC_MS_D,KC_WH_D,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_TOGG,KC_NO, KC_ACL0,KC_ACL1,KC_ACL2,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_UP, AU_ON, MS_LEFT,MS_BTN1,MS_RGHT,KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_DOWN,AU_OFF, MS_BTN2,MS_DOWN,MS_WHLD,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_TOGG,KC_NO, MS_ACL0,MS_ACL1,MS_ACL2,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, /* */ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, /* */ diff --git a/keyboards/handwired/elrgo_s/keymaps/default/keymap.c b/keyboards/handwired/elrgo_s/keymaps/default/keymap.c index b43c75cf2d..d43f390586 100644 --- a/keyboards/handwired/elrgo_s/keymaps/default/keymap.c +++ b/keyboards/handwired/elrgo_s/keymaps/default/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_RAISE] = LAYOUT_split_3x6_5( - KC_ESC , KC_PDOT , M_BBSLS , KC_BSLS , LSFT(KC_MINS), LSFT(KC_EQL), KC_HOME , KC_WH_L , KC_UP , KC_WH_R , KC_PGUP , KC_BSPC , + KC_ESC , KC_PDOT , M_BBSLS , KC_BSLS , LSFT(KC_MINS), LSFT(KC_EQL), KC_HOME , MS_WHLL , KC_UP , MS_WHLR , KC_PGUP , KC_BSPC , KC_TAB , LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4) , LSFT(KC_5) , M_FLEFT , KC_LEFT , KC_DOWN , KC_RIGHT, M_FRIGHT, KC_DEL , LSFT(KC_TAB), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9) , LSFT(KC_0) , KC_END , KC_F22 , KC_F23 , KC_CAPS , KC_PGDN , MO(_ADJUST), KC_LGUI , KC_LCTL , KC_LSFT , KC_LALT , M_SHLL , M_SHLA , KC_TRNS , KC_SPC , KC_RALT , KC_ENT diff --git a/keyboards/handwired/ergocheap/keymaps/default/keymap.c b/keyboards/handwired/ergocheap/keymaps/default/keymap.c index 15753dabd7..efb7955c09 100644 --- a/keyboards/handwired/ergocheap/keymaps/default/keymap.c +++ b/keyboards/handwired/ergocheap/keymaps/default/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_MPRV, KC_MPLY, KC_MNXT, _______, KC_UP, _______, _______, _______, KC_LCTL, _______, KC_S, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, KC_LEFT, KC_RGHT, _______, _______, - KC_LSFT, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_DOWN, TO(_BASE), KC_WH_U, _______, - _______, KC_LGUI, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R + KC_LSFT, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_DOWN, TO(_BASE), MS_WHLU, _______, + _______, KC_LGUI, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR ) }; diff --git a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c index b68e81e81c..63e5798e81 100644 --- a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c +++ b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c @@ -30,9 +30,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [MOS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_WH_D, KC_WH_U, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_WHLD, MS_WHLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/handwired/floorboard/keymaps/default/keymap.c b/keyboards/handwired/floorboard/keymaps/default/keymap.c index 161dbea030..2d519bee03 100644 --- a/keyboards/handwired/floorboard/keymaps/default/keymap.c +++ b/keyboards/handwired/floorboard/keymaps/default/keymap.c @@ -18,6 +18,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ortho_4x12(KC_TAB, KC_SCLN, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT, KC_LSFT, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, LT(2,KC_CAPS), MO(3), KC_LGUI, KC_LALT, KC_SPC, MO(1), MO(2), KC_BSPC, KC_RALT, KC_VOLD, KC_VOLU, LT(2,KC_MPLY)), [1] = LAYOUT_ortho_4x12(KC_PERC, KC_LBRC, KC_LCBR, KC_RCBR, KC_LPRN, KC_PEQL, KC_ASTR, KC_RPRN, KC_PLUS, KC_EXLM, KC_RBRC, KC_GRV, KC_LCTL, KC_7, KC_5, KC_3, KC_1, KC_9, KC_0, KC_2, KC_4, KC_6, KC_8, KC_MINS, KC_LSFT, KC_LBRC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SLSH, KC_NO, KC_TRNS, KC_NO, KC_LGUI, KC_LALT, KC_SPC, KC_TRNS, KC_NO, KC_DEL, KC_RALT, KC_PSCR, KC_APP, KC_NO), - [2] = LAYOUT_ortho_4x12(KC_WAKE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_SLEP, KC_LCTL, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_LGUI, KC_LALT, KC_BTN1, KC_BTN2, KC_TRNS, KC_NO, KC_RALT, KC_NO, KC_APP, KC_NO), + [2] = LAYOUT_ortho_4x12(KC_WAKE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_SLEP, KC_LCTL, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_LGUI, KC_LALT, MS_BTN1, MS_BTN2, KC_TRNS, KC_NO, KC_RALT, KC_NO, KC_APP, KC_NO), [3] = LAYOUT_ortho_4x12(KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_F7, KC_F5, KC_F3, KC_F1, KC_F9, KC_F10, KC_F2, KC_F4, KC_F6, KC_F8, KC_NO, KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_SPC, KC_NO, KC_NO, KC_DEL, KC_RALT, KC_BRID, KC_BRIU, KC_NO) }; diff --git a/keyboards/handwired/frenchdev/keymaps/default/keymap.c b/keyboards/handwired/frenchdev/keymaps/default/keymap.c index 67c0072a08..aa622c5ddb 100644 --- a/keyboards/handwired/frenchdev/keymaps/default/keymap.c +++ b/keyboards/handwired/frenchdev/keymaps/default/keymap.c @@ -103,9 +103,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, M_UN, M_CUT, M_CP, M_PS, M_SE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BP_DLR, BP_EQL, KC_PGUP, BP_PIPE, BP_SLSH, KC_TRNS, KC_TRNS, KC_TRNS, BP_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, //left pedals - KC_TRNS, KC_BTN1, KC_TRNS, + KC_TRNS, MS_BTN1, KC_TRNS, //right pedals - KC_TRNS, KC_BTN1, KC_TRNS + KC_TRNS, MS_BTN1, KC_TRNS ), /* MEDIA, mouse and numpad. @@ -130,14 +130,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MEDIA] = LAYOUT( QK_BOOT, KC_SCRL, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CALC, KC_NUM, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MPRV, KC_MNXT, KC_MPLY, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_PMNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_BTN4, KC_BTN5, KC_BTN4, KC_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_D, KC_BTN3, KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2, KC_KP_4, KC_KP_5, KC_KP_6, KC_PAST, KC_TRNS, - KC_TRNS, M_UN, M_CUT, M_CP, M_PS, KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLU, KC_TRNS, MS_BTN4, MS_BTN5, MS_BTN4, MS_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_WHLD, MS_BTN3, MS_BTN2, MS_BTN1, MS_BTN1, MS_BTN2, KC_KP_4, KC_KP_5, KC_KP_6, KC_PAST, KC_TRNS, + KC_TRNS, M_UN, M_CUT, M_CP, M_PS, MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN3, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_PDOT, BP_DOT, BP_COMM, KC_TRNS, //left pedals - KC_BTN3, M_RP, KC_TRNS, + MS_BTN3, M_RP, KC_TRNS, //right pedals - KC_BTN3, M_RP, KC_TRNS + MS_BTN3, M_RP, KC_TRNS ), /* TRNS - skeleton for laters @@ -167,9 +167,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, //left pedals - KC_BTN3, M_RP, KC_TRNS, + MS_BTN3, M_RP, KC_TRNS, //right pedals - KC_BTN3, M_RP, KC_TRNS + MS_BTN3, M_RP, KC_TRNS ), }; @@ -239,7 +239,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { key_timer_left_pedal = timer_read(); // if the key is being pressed, we start the timer. } else { if (timer_elapsed(key_timer_left_pedal) < KEY_DELAY) { - tap_code (KC_BTN2); + tap_code (MS_BTN2); } unregister_code (KC_SCRL); layer_off(1); @@ -251,7 +251,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { key_timer_right_pedal = timer_read(); // if the key is being pressed, we start the timer. } else { if (timer_elapsed(key_timer_right_pedal) < PEDAL_DELAY) { - tap_code (KC_BTN1); + tap_code (MS_BTN1); } layer_off(2); } diff --git a/keyboards/handwired/k8split/keymaps/left/keymap.c b/keyboards/handwired/k8split/keymaps/left/keymap.c index 8d7559065a..c40b1c7b4f 100644 --- a/keyboards/handwired/k8split/keymaps/left/keymap.c +++ b/keyboards/handwired/k8split/keymaps/left/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_AUDIO_MUTE, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_AUDIO_MMUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_INT5, KC_MS_WH_UP, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_COMP, KC_MS_WH_DOWN, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_INT5, MS_WHLU, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_COMP, MS_WHLD, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F13, KC_F14, KC_LCTL, KC_CAPS, KC_LWIN, KC_LALT, KC_SPC, KC_F15, KC_F16, KC_F17 ) diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 24fc4c20af..1976769052 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -46,15 +46,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TO(0), KC_1, KC_2, KC_3, ALT_F4, KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_BTN1, KC_MS_U, KC_BTN2, - _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN3 + _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, MS_BTN1, MS_UP, MS_BTN2, + _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN3 ), LAYOUT( /* Multimedia layer */ TO(0), _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, KC_WAKE, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPRV, KC_MNXT, _______, _______, _______, KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, KC_PWR, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_WH_U, KC_BTN2, - _______, _______, _______, KC_MPLY, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3 + _______, _______, KC_PWR, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_WHLU, MS_BTN2, + _______, _______, _______, KC_MPLY, MS_WHLL, MS_WHLD, MS_WHLR, MS_BTN3 ), }; diff --git a/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c index ccc445be42..8a8cda6ea2 100644 --- a/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c +++ b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c @@ -391,15 +391,15 @@ bool encoder_update_user(uint8_t index, bool clockwise) { else if(IS_LAYER_ON(ONE)) { if (index == 0) { /* First encoder */ if (clockwise) { - tap_code(KC_WH_R); + tap_code(MS_WHLR); } else { - tap_code(KC_WH_L); + tap_code(MS_WHLL); } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } } diff --git a/keyboards/handwired/ortho5x14/keymaps/2u/keymap.c b/keyboards/handwired/ortho5x14/keymaps/2u/keymap.c index 752eda0fde..d0c8c610b1 100644 --- a/keyboards/handwired/ortho5x14/keymaps/2u/keymap.c +++ b/keyboards/handwired/ortho5x14/keymaps/2u/keymap.c @@ -539,10 +539,10 @@ KC_PAUS */ [_MOUSE] = LAYOUT( _______ , XXXXXXX , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12, - _______ , XXXXXXX , XXXXXXX , XXXXXXX , KC_MS_UP , XXXXXXX , KC_MS_ACCEL0 , XXXXXXX, XXXXXXX , KC_MS_WH_UP , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, - _______ , XXXXXXX , XXXXXXX , KC_MS_LEFT , KC_MS_DOWN , KC_MS_RIGHT, KC_MS_ACCEL1 , XXXXXXX, KC_MS_WH_LEFT , KC_MS_WH_DOWN, KC_MS_WH_RIGHT, XXXXXXX , XXXXXXX , XXXXXXX, - XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , KC_MS_ACCEL2 , XXXXXXX, KC_MS_BTN1 , KC_MS_BTN2 , KC_MS_BTN3 , XXXXXXX , XXXXXXX , XXXXXXX, - TD(CTL_OSL1), OSM(MOD_LGUI), TD(ALT_OSL1), TD(TD_LayerDn) ,TD(TD_LayerUp), TD(TD_SPC_ENT) , KC_MS_BTN1 , KC_LEFT , KC_DOWN , KC_UP , KC_RIGHT, TD(TD_ESC_GRAVE) + _______ , XXXXXXX , XXXXXXX , XXXXXXX , MS_UP , XXXXXXX , MS_ACL0 , XXXXXXX, XXXXXXX , MS_WHLU , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, + _______ , XXXXXXX , XXXXXXX , MS_LEFT , MS_DOWN , MS_RGHT , MS_ACL1 , XXXXXXX, MS_WHLL , MS_WHLD , MS_WHLR , XXXXXXX , XXXXXXX , XXXXXXX, + XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , MS_ACL2 , XXXXXXX, MS_BTN1 , MS_BTN2 , MS_BTN3 , XXXXXXX , XXXXXXX , XXXXXXX, + TD(CTL_OSL1), OSM(MOD_LGUI), TD(ALT_OSL1), TD(TD_LayerDn) ,TD(TD_LayerUp), TD(TD_SPC_ENT) , MS_BTN1 , KC_LEFT , KC_DOWN , KC_UP , KC_RIGHT, TD(TD_ESC_GRAVE) ) }; diff --git a/keyboards/handwired/ortho5x14/keymaps/default/keymap.c b/keyboards/handwired/ortho5x14/keymaps/default/keymap.c index a2f7befd9f..30e107f336 100644 --- a/keyboards/handwired/ortho5x14/keymaps/default/keymap.c +++ b/keyboards/handwired/ortho5x14/keymaps/default/keymap.c @@ -130,7 +130,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|---------------+-----------------+-------+-------+----------+------+----+----+------+----------------+---------------+----------------+----------------+----------------| KC_PGDN ,TD(TD_SHIFT_CAPS),KC_Z ,KC_X ,KC_C ,KC_V ,KC_B,KC_N,KC_M ,TD(TD_COMM_LABK),TD(TD_DOT_RABK),TD(TD_SLSH_QUES),TD(TD_BSLS_PIPE),KC_RSFT , //|---------------+-----------------+-------+-------+----------+------+----+----+------+----------------+---------------+----------------+----------------+----------------| - KC_END , KC_LCTL ,KC_LGUI,KC_LALT, KC_L1 , KC_SPACE , KC_SPACE , KC_L2 ,KC_RALT ,KC_BTN2 ,KC_RCTL ,TD(TD_ESC_GRAVE) + KC_END , KC_LCTL ,KC_LGUI,KC_LALT, KC_L1 , KC_SPACE , KC_SPACE , KC_L2 ,KC_RALT ,MS_BTN2 ,KC_RCTL ,TD(TD_ESC_GRAVE) //`---------------+-----------------+-------+-------+----------+------+----+-----------+----------------+---------------+----------------+----------------+----------------' ), diff --git a/keyboards/handwired/ortho5x14/keymaps/split1/keymap.c b/keyboards/handwired/ortho5x14/keymaps/split1/keymap.c index a5222eecfa..be7940bcfd 100644 --- a/keyboards/handwired/ortho5x14/keymaps/split1/keymap.c +++ b/keyboards/handwired/ortho5x14/keymaps/split1/keymap.c @@ -474,9 +474,9 @@ KC_PAUS */ [_MOUSE] = LAYOUT( _______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , XXXXXXX, XXXXXXX, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11, - KC_MS_ACCEL0, XXXXXXX , KC_MS_UP , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , KC_MS_WH_UP , XXXXXXX , XXXXXXX , KC_F12, - KC_MS_ACCEL1, KC_MS_LEFT, KC_MS_DOWN , KC_MS_RIGHT , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, XXXXXXX , XXXXXXX, - KC_MS_ACCEL2, XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_BTN1 , KC_MS_BTN2 , KC_MS_BTN3 , XXXXXXX , XXXXXXX, + MS_ACL0 , XXXXXXX , MS_UP , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX , MS_WHLU , XXXXXXX , XXXXXXX , KC_F12, + MS_ACL1 , MS_LEFT , MS_DOWN , MS_RGHT , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_WHLL , MS_WHLD , MS_WHLR , XXXXXXX , XXXXXXX, + MS_ACL2 , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1 , MS_BTN2 , MS_BTN3 , XXXXXXX , XXXXXXX, TD(CTL_OSL1), KC_LGUI , TD(ALT_OSL1), TD(TD_LayerDn) , KC_L2 , TD(TD_SPC_ENT) , KC_SPACE , KC_LEFT , KC_DOWN , KC_UP , KC_RIGHT, TD(TD_ESC_GRAVE) ) diff --git a/keyboards/handwired/petruziamini/keymaps/default/keymap.c b/keyboards/handwired/petruziamini/keymaps/default/keymap.c index 5265bb218e..5a49827379 100644 --- a/keyboards/handwired/petruziamini/keymaps/default/keymap.c +++ b/keyboards/handwired/petruziamini/keymaps/default/keymap.c @@ -35,8 +35,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [3] = LAYOUT( KC_NO, KC_NO, KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_MUTE, KC_VOLU, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_BTN1, KC_UP, KC_BTN2, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_LEFT, KC_DOWN, KC_RGHT, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLU, MS_BTN1, KC_UP, MS_BTN2, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_LGUI, KC_NO, KC_NO ), [4] = LAYOUT( diff --git a/keyboards/handwired/pilcrow/keymaps/default/keymap.c b/keyboards/handwired/pilcrow/keymaps/default/keymap.c index 8882fdb3ea..f287754478 100644 --- a/keyboards/handwired/pilcrow/keymaps/default/keymap.c +++ b/keyboards/handwired/pilcrow/keymaps/default/keymap.c @@ -46,9 +46,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [3] = LAYOUT( - QK_BOOT, KC_UP, _______, _______, _______, _______, _______, KC_WH_D, KC_MS_U, KC_WH_U, - KC_LEFT, KC_DOWN, KC_RGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L, KC_MS_D, KC_MS_R, + QK_BOOT, KC_UP, _______, _______, _______, _______, _______, MS_WHLD, MS_UP, MS_WHLU, + KC_LEFT, KC_DOWN, KC_RGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______ + _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, _______ ) }; diff --git a/keyboards/handwired/pterodactyl/keymaps/default/keymap.c b/keyboards/handwired/pterodactyl/keymaps/default/keymap.c index c53f6841ce..a8204aa1bf 100644 --- a/keyboards/handwired/pterodactyl/keymaps/default/keymap.c +++ b/keyboards/handwired/pterodactyl/keymaps/default/keymap.c @@ -101,10 +101,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [_MDIA] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WBAK diff --git a/keyboards/handwired/riblee_f401/keymaps/default/keymap.c b/keyboards/handwired/riblee_f401/keymaps/default/keymap.c index 7c8bd5b8b4..bdb3180152 100644 --- a/keyboards/handwired/riblee_f401/keymaps/default/keymap.c +++ b/keyboards/handwired/riblee_f401/keymaps/default/keymap.c @@ -120,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R + _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT ), /* Raise diff --git a/keyboards/handwired/riblee_f411/keymaps/default/keymap.c b/keyboards/handwired/riblee_f411/keymaps/default/keymap.c index 15c706089d..98268da221 100644 --- a/keyboards/handwired/riblee_f411/keymaps/default/keymap.c +++ b/keyboards/handwired/riblee_f411/keymaps/default/keymap.c @@ -120,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R + _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT ), /* Raise diff --git a/keyboards/handwired/scottokeebs/scottomouse/keymaps/default/keymap.c b/keyboards/handwired/scottokeebs/scottomouse/keymaps/default/keymap.c index 6cc4d90144..967526afa6 100644 --- a/keyboards/handwired/scottokeebs/scottomouse/keymaps/default/keymap.c +++ b/keyboards/handwired/scottokeebs/scottomouse/keymaps/default/keymap.c @@ -19,6 +19,6 @@ along with this program. If not, see . const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - KC_MS_BTN1, KC_MS_BTN2, KC_MS_LEFT, KC_MS_UP, KC_MS_DOWN, KC_MS_RIGHT + MS_BTN1, MS_BTN2, MS_LEFT, MS_UP, MS_DOWN, MS_RGHT ) }; \ No newline at end of file diff --git a/keyboards/handwired/sick68/keymaps/default/keymap.c b/keyboards/handwired/sick68/keymaps/default/keymap.c index 121fc3956e..faa2a67d46 100644 --- a/keyboards/handwired/sick68/keymaps/default/keymap.c +++ b/keyboards/handwired/sick68/keymaps/default/keymap.c @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, 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, _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, - _______, _______, _______, BL_DOWN, BL_TOGG, BL_UP, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + _______, _______, _______, BL_DOWN, BL_TOGG, BL_UP, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, MS_BTN1, MS_UP, MS_BTN2, + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), }; diff --git a/keyboards/handwired/snatchpad/keymaps/default/keymap.c b/keyboards/handwired/snatchpad/keymaps/default/keymap.c index db8305129d..923b0d29f1 100644 --- a/keyboards/handwired/snatchpad/keymaps/default/keymap.c +++ b/keyboards/handwired/snatchpad/keymaps/default/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( QK_LOCK, KC_UP , _______, KC_LEFT, KC_DOWN, KC_RGHT, - KC_BTN1, KC_BTN2 + MS_BTN1, MS_BTN2 ), [2] = LAYOUT( _______, _______, _______, diff --git a/keyboards/handwired/snatchpad/snatchpad.c b/keyboards/handwired/snatchpad/snatchpad.c index 89d32c036b..cedc0357a5 100644 --- a/keyboards/handwired/snatchpad/snatchpad.c +++ b/keyboards/handwired/snatchpad/snatchpad.c @@ -29,9 +29,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; default: if (clockwise) { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } else { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } break; } @@ -54,9 +54,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; default: if (clockwise) { - tap_code(KC_MS_D); + tap_code(MS_DOWN); } else { - tap_code(KC_MS_U); + tap_code(MS_UP); } break; } diff --git a/keyboards/handwired/sono1/keymaps/default/keymap.c b/keyboards/handwired/sono1/keymaps/default/keymap.c index cd9f9bcdb6..e12a1c44d0 100644 --- a/keyboards/handwired/sono1/keymaps/default/keymap.c +++ b/keyboards/handwired/sono1/keymaps/default/keymap.c @@ -100,8 +100,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MUS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, KC_WH_U, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, MS_WHLU, MS_BTN1, MS_UP, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, MS_WHLD, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/handwired/space_oddity/keymaps/default/keymap.c b/keyboards/handwired/space_oddity/keymaps/default/keymap.c index 4222307889..d41eb871e4 100644 --- a/keyboards/handwired/space_oddity/keymaps/default/keymap.c +++ b/keyboards/handwired/space_oddity/keymaps/default/keymap.c @@ -135,8 +135,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, KC_MS_U, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_BTN1, KC_BTN3, KC_BTN2, _______, _______, + _______, _______, _______, MS_UP, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, MS_BTN1, MS_BTN3, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TG(2) diff --git a/keyboards/handwired/t111/keymaps/oleg/keymap.c b/keyboards/handwired/t111/keymaps/oleg/keymap.c index b372de027b..2a75376ff2 100644 --- a/keyboards/handwired/t111/keymaps/oleg/keymap.c +++ b/keyboards/handwired/t111/keymaps/oleg/keymap.c @@ -118,9 +118,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( VRSN, KC_SLEP, _______, UC_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UM(UAT), UM(UHSH), UM(UDLR), UM(USCT), UM(UCFX), UM(UAMP), UM(UAST), _______, _______, _______, _______, _______, _______, _______, _______, KC_CALC, _______, _______, _______, - _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, _______, _______, _______, KC_SYRQ, KC_SCRL, KC_PAUS, UP(ULSB, ULCB), UP(URSB, URCB), _______, _______, _______, _______, _______, _______, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, _______, _______, _______, _______, _______, UP(USCO, UCLN), UP(UAPO, UQOT), _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, KC_BTN4, _______, _______, _______, _______, UP(UCOM, ULTH), UP(UDOT, UGTH), UP(USLS, UQUE), KC_APP, _______, _______, _______, _______, _______, _______, _______, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_BTN3, _______, _______, _______, KC_SYRQ, KC_SCRL, KC_PAUS, UP(ULSB, ULCB), UP(URSB, URCB), _______, _______, _______, _______, _______, _______, _______, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN5, _______, _______, _______, _______, _______, UP(USCO, UCLN), UP(UAPO, UQOT), _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, MS_BTN4, _______, _______, _______, _______, UP(UCOM, ULTH), UP(UDOT, UGTH), UP(USLS, UQUE), KC_APP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/handwired/terminus_mini/keymaps/default/keymap.c b/keyboards/handwired/terminus_mini/keymaps/default/keymap.c index 8659b49544..90fdf8796d 100644 --- a/keyboards/handwired/terminus_mini/keymaps/default/keymap.c +++ b/keyboards/handwired/terminus_mini/keymaps/default/keymap.c @@ -175,10 +175,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_MOUSE] = LAYOUT( - KC_ESC, KC_WH_U, KC_WH_L, KC_MS_U, KC_WH_R, XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN4, KC_BTN5, XXXXXXX, XXXXXXX, - KC_BSPC, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, + KC_ESC, MS_WHLU, MS_WHLL, MS_UP, MS_WHLR, XXXXXXX, XXXXXXX, MS_BTN3, MS_BTN4, MS_BTN5, XXXXXXX, XXXXXXX, + KC_BSPC, MS_WHLD, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, SC_RSPC, - _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_ACL2, KC_ACL0, XXXXXXX, MO(6), XXXXXXX, KC_RCTL + _______, XXXXXXX, XXXXXXX, XXXXXXX, MS_ACL2, MS_ACL0, XXXXXXX, MO(6), XXXXXXX, KC_RCTL ), /* Adjust (Lower + Raise) diff --git a/keyboards/handwired/tkk/keymaps/default/keymap.c b/keyboards/handwired/tkk/keymaps/default/keymap.c index 220daab627..94c1c771fe 100644 --- a/keyboards/handwired/tkk/keymaps/default/keymap.c +++ b/keyboards/handwired/tkk/keymaps/default/keymap.c @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_PGDN, KC_PGUP, KC_HOME, KC_END, KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0 ), [11] = LAYOUT( - KC_WH_D, KC_WH_U, KC_WH_L, KC_WH_R, KC_BTN2, KC_BTN1, KC_MS_L, KC_MS_R, KC_MS_U, KC_MS_D + MS_WHLD, MS_WHLU, MS_WHLL, MS_WHLR, MS_BTN2, MS_BTN1, MS_LEFT, MS_RGHT, MS_UP, MS_DOWN ) }; diff --git a/keyboards/handwired/trackpoint/keymaps/default/keymap.c b/keyboards/handwired/trackpoint/keymaps/default/keymap.c index 1792cb4271..f23c9b7608 100644 --- a/keyboards/handwired/trackpoint/keymaps/default/keymap.c +++ b/keyboards/handwired/trackpoint/keymaps/default/keymap.c @@ -2,6 +2,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - KC_BTN1, KC_BTN3, KC_BTN2 + MS_BTN1, MS_BTN3, MS_BTN2 ) }; diff --git a/keyboards/handwired/traveller/keymaps/default/keymap.c b/keyboards/handwired/traveller/keymaps/default/keymap.c index 86ffee985d..fe571c4a53 100644 --- a/keyboards/handwired/traveller/keymaps/default/keymap.c +++ b/keyboards/handwired/traveller/keymaps/default/keymap.c @@ -90,10 +90,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT( - TG(_NAV), XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, RGUI(KC_RGHT), KC_WH_U, M_MUL, KC_MS_U, M_MUR, XXXXXXX, KC_ACL2, - _______, RGUI(KC_LEFT), KC_LEFT, KC_DOWN, KC_RGHT, LCTL(KC_E), KC_BTN3, KC_MS_L, KC_MS_U, KC_MS_R, XXXXXXX, KC_ACL1, - _______, LCTL(KC_A), LGUI(KC_X), RGUI(KC_C), RGUI(KC_V), XXXXXXX, KC_WH_D, M_MDL, KC_MS_D, M_MDR, KC_UP, KC_ACL0, - _______, RGUI(KC_Z), _______, _______, _______, _______, KC_ENT, KC_BTN2, KC_BTN1, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT + TG(_NAV), XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, RGUI(KC_RGHT), MS_WHLU, M_MUL, MS_UP, M_MUR, XXXXXXX, MS_ACL2, + _______, RGUI(KC_LEFT), KC_LEFT, KC_DOWN, KC_RGHT, LCTL(KC_E), MS_BTN3, MS_LEFT, MS_UP, MS_RGHT, XXXXXXX, MS_ACL1, + _______, LCTL(KC_A), LGUI(KC_X), RGUI(KC_C), RGUI(KC_V), XXXXXXX, MS_WHLD, M_MDL, MS_DOWN, M_MDR, KC_UP, MS_ACL0, + _______, RGUI(KC_Z), _______, _______, _______, _______, KC_ENT, MS_BTN2, MS_BTN1, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT ), /* FKEYS - Funtion keys & mac stuff @@ -138,41 +138,41 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // from algernon's ErgoDox EZ layout, case M_MUL: if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_LEFT); + mousekey_on(MS_UP); + mousekey_on(MS_LEFT); } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_LEFT); + mousekey_off(MS_UP); + mousekey_off(MS_LEFT); } mousekey_send(); return false; case M_MUR: if (record->event.pressed) { - mousekey_on(KC_MS_UP); - mousekey_on(KC_MS_RIGHT); + mousekey_on(MS_UP); + mousekey_on(MS_RGHT); } else { - mousekey_off(KC_MS_UP); - mousekey_off(KC_MS_RIGHT); + mousekey_off(MS_UP); + mousekey_off(MS_RGHT); } mousekey_send(); return false; case M_MDL: if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_LEFT); + mousekey_on(MS_DOWN); + mousekey_on(MS_LEFT); } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_LEFT); + mousekey_off(MS_DOWN); + mousekey_off(MS_LEFT); } mousekey_send(); return false; case M_MDR: if (record->event.pressed) { - mousekey_on(KC_MS_DOWN); - mousekey_on(KC_MS_RIGHT); + mousekey_on(MS_DOWN); + mousekey_on(MS_RGHT); } else { - mousekey_off(KC_MS_DOWN); - mousekey_off(KC_MS_RIGHT); + mousekey_off(MS_DOWN); + mousekey_off(MS_RGHT); } mousekey_send(); return false; diff --git a/keyboards/handwired/tsubasa/keymaps/default/keymap.c b/keyboards/handwired/tsubasa/keymaps/default/keymap.c index 96b66d2a3f..6d641a2b52 100644 --- a/keyboards/handwired/tsubasa/keymaps/default/keymap.c +++ b/keyboards/handwired/tsubasa/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_FN] = LAYOUT( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, UG_TOGG, KC_PGUP, XXXXXXX, KC_UP, XXXXXXX, KC_PSCR, XXXXXXX, XXXXXXX, - _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, UG_NEXT, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, + _______, XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, UG_TOGG, KC_PGUP, XXXXXXX, KC_UP, XXXXXXX, KC_PSCR, XXXXXXX, XXXXXXX, + _______, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, UG_NEXT, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, UG_VALU, UG_HUEU, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______ ) @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, - [_FN] = { ENCODER_CCW_CW( KC_VOLU, KC_VOLD)} + [_BASE] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, + [_FN] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD)} }; #endif diff --git a/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c b/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c index f250c3fc62..63bd0697fa 100644 --- a/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c +++ b/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c @@ -23,6 +23,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LALT, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_ESC, 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_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, MS_BTN1, MS_BTN3, MS_BTN2, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ) }; diff --git a/keyboards/handwired/twig/twig50/keymaps/default/keymap.c b/keyboards/handwired/twig/twig50/keymaps/default/keymap.c index 954c8e5637..25af2b6caa 100644 --- a/keyboards/handwired/twig/twig50/keymaps/default/keymap.c +++ b/keyboards/handwired/twig/twig50/keymaps/default/keymap.c @@ -42,12 +42,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_BSPC, KC_LCTL, KC_A, KC_S, KC_D, LT2_F, KC_G, KC_H, KC_J, KC_K, KC_L, RSF_SCL, LT3_QOT, KC_ENT, KC_LSFT, TG4, KC_Z, KC_X, KC_C, LT3_V, KC_B, LT2_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_BTN1, KC_BTN2, KC_LALT, LGU_NCV, LT1_SPC, RCT_ESC, RGU_ENT, RAL_CNV, KC_INT1, KC_DEL, MU_TOGG + MS_BTN1, MS_BTN2, KC_LALT, LGU_NCV, LT1_SPC, RCT_ESC, RGU_ENT, RAL_CNV, KC_INT1, KC_DEL, MU_TOGG ), // Layer 1, Space-modifiers: Basic keys LAYOUT_diag_4x14( - QK_BOOT, KC_EXEC, KC_HELP, KC_MENU, KC_SLCT, KC_STOP, KC_BTN2, KC_INT1, KC_MINS, KC_EQL, KC_INT3, SFT_LBR, KC_TRNS, + QK_BOOT, KC_EXEC, KC_HELP, KC_MENU, KC_SLCT, KC_STOP, MS_BTN2, KC_INT1, KC_MINS, KC_EQL, KC_INT3, SFT_LBR, KC_TRNS, KC_TRNS, KC_AGIN, KC_FIND, KC_PGUP, KC_PGDN, KC_F19, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, SFT_7, SFT_2, KC_TRNS, KC_TRNS, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, KC_APP, KC_BSPC, KC_DEL, KC_RBRC, KC_BSLS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RCT_IN7, RGU_IN8, KC_TRNS, KC_INT2, KC_INT4, MU_NEXT @@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Layer 3, V,:-modifiers: Functions and mouse keys LAYOUT_diag_4x14( 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_TRNS, - KC_MPLY, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_BTN3, KC_TRNS, KC_TRNS, + KC_MPLY, KC_MRWD, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN1, KC_WH_D, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN2, MS_BTN1, MS_WHLD, MS_WHLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), // Layer 4, Toggles: One handed mode diff --git a/keyboards/handwired/videowriter/keymaps/default/keymap.c b/keyboards/handwired/videowriter/keymaps/default/keymap.c index d1c9e26655..09cc4f6bac 100644 --- a/keyboards/handwired/videowriter/keymaps/default/keymap.c +++ b/keyboards/handwired/videowriter/keymaps/default/keymap.c @@ -65,8 +65,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, 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_WH_U, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, - _______, KC_WH_D, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, + _______, MS_WHLU, MS_BTN1, MS_UP, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + _______, MS_WHLD, MS_LEFT, MS_DOWN, MS_RGHT, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/handwired/videowriter/keymaps/oleg/keymap.c b/keyboards/handwired/videowriter/keymaps/oleg/keymap.c index e9adc11ad7..b30ac967ea 100644 --- a/keyboards/handwired/videowriter/keymaps/oleg/keymap.c +++ b/keyboards/handwired/videowriter/keymaps/oleg/keymap.c @@ -70,8 +70,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN1] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, KC_PAUS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, 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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U ,_______, _______, _______, KC_UP, _______, _______, _______, _______, KC_RCTL, - _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, + _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU ,_______, _______, _______, KC_UP, _______, _______, _______, _______, KC_RCTL, + _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/handwired/wulkan/keymaps/default/keymap.c b/keyboards/handwired/wulkan/keymaps/default/keymap.c index e38c0322c9..a065a94acf 100644 --- a/keyboards/handwired/wulkan/keymaps/default/keymap.c +++ b/keyboards/handwired/wulkan/keymaps/default/keymap.c @@ -95,9 +95,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_ortho_4x12( - _______, QK_BOOT, _______, _______, KC_WH_U, _______, _______, KC_MS_U, _______, _______, UP(SE_ARNG_LOW, SE_ARNG_HIGH), KC_DEL, - _______, _______, _______, _______, KC_WH_D, _______, KC_MS_L, KC_MS_D, KC_MS_R, UP(SE_ODIA_LOW, SE_ODIA_HIGH), UP(SE_ADIA_LOW, SE_ADIA_HIGH), _______, - _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, KC_BTN1, _______, KC_BTN2, _______, _______, _______, + _______, QK_BOOT, _______, _______, MS_WHLU, _______, _______, MS_UP, _______, _______, UP(SE_ARNG_LOW, SE_ARNG_HIGH), KC_DEL, + _______, _______, _______, _______, MS_WHLD, _______, MS_LEFT, MS_DOWN, MS_RGHT, UP(SE_ODIA_LOW, SE_ODIA_HIGH), UP(SE_ADIA_LOW, SE_ADIA_HIGH), _______, + _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, MS_BTN1, _______, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) }; diff --git a/keyboards/helix/rev3_5rows/keymaps/default/keymap.c b/keyboards/helix/rev3_5rows/keymaps/default/keymap.c index 0537235c4e..342ee77e99 100644 --- a/keyboards/helix/rev3_5rows/keymaps/default/keymap.c +++ b/keyboards/helix/rev3_5rows/keymaps/default/keymap.c @@ -123,9 +123,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LOWER] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_HOME, KC_END) }, - [_RAISE] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU) }, + [_QWERTY] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_LOWER] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_HOME, KC_END) }, + [_RAISE] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU) }, [_ADJUST] = { ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, }; #endif diff --git a/keyboards/hhkb/yang/keymaps/kanru/keymap.c b/keyboards/hhkb/yang/keymaps/kanru/keymap.c index ea020de126..85aad22962 100644 --- a/keyboards/hhkb/yang/keymaps/kanru/keymap.c +++ b/keyboards/hhkb/yang/keymaps/kanru/keymap.c @@ -118,9 +118,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MOUSE] = LAYOUT_60_hhkb( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_BTN1, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_BTN2, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_BTN1, MS_WHLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_BTN2, MS_WHLD, KC_TRNS, KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; // clang-format on diff --git a/keyboards/hnahkb/vn66/keymaps/default/keymap.c b/keyboards/hnahkb/vn66/keymaps/default/keymap.c index 3af2332c19..f50050bdc5 100644 --- a/keyboards/hnahkb/vn66/keymaps/default/keymap.c +++ b/keyboards/hnahkb/vn66/keymaps/default/keymap.c @@ -43,13 +43,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (clockwise == 0) { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); #else tap_code(KC_VOLD); #endif } else { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); #else tap_code(KC_VOLU); #endif diff --git a/keyboards/horrortroll/nyx/rev1/keymaps/default/keymap.c b/keyboards/horrortroll/nyx/rev1/keymaps/default/keymap.c index a723f77452..920584caf6 100644 --- a/keyboards/horrortroll/nyx/rev1/keymaps/default/keymap.c +++ b/keyboards/horrortroll/nyx/rev1/keymaps/default/keymap.c @@ -77,8 +77,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Row: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ [_FN] = LAYOUT_65_ansi_blocker( 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, _______, RM_TOGG, - QK_BOOT, _______, KC_MS_U, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_SPDD, RM_SPDU, _______, RM_NEXT, - _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + QK_BOOT, _______, MS_UP, _______, _______, _______, _______, _______, _______, RM_SATD, RM_SATU, RM_SPDD, RM_SPDU, _______, RM_NEXT, + _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CALC, _______, _______, NK_TOGG, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, RM_HUED, RM_VALD, RM_HUEU ) diff --git a/keyboards/hotdox/keymaps/default/keymap.c b/keyboards/hotdox/keymaps/default/keymap.c index 436997ead7..7de954e9ed 100644 --- a/keyboards/hotdox/keymaps/default/keymap.c +++ b/keyboards/hotdox/keymaps/default/keymap.c @@ -119,10 +119,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ibm/model_m/mschwingen/keymaps/default/keymap.c b/keyboards/ibm/model_m/mschwingen/keymaps/default/keymap.c index 8e28b4e449..66db19400f 100644 --- a/keyboards/ibm/model_m/mschwingen/keymaps/default/keymap.c +++ b/keyboards/ibm/model_m/mschwingen/keymaps/default/keymap.c @@ -63,11 +63,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MS] = LAYOUT( /* mouse key layer */ // Cursor: mouse, INS/HOME/PgUp: Mouse Accel, Del, End, PageDn: mouse buttons TG(_MS), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN3, KC_BTN2, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN3, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_U, _______, _______, _______, _______, - _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_UP, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______ ) }; diff --git a/keyboards/idank/spankbd/keymaps/default/keymap.json b/keyboards/idank/spankbd/keymaps/default/keymap.json index 10bb42e108..a07be80076 100644 --- a/keyboards/idank/spankbd/keymaps/default/keymap.json +++ b/keyboards/idank/spankbd/keymaps/default/keymap.json @@ -59,7 +59,7 @@ "KC_DLR", "KC_LPRN", "KC_RPRN", - "KC_BTN2", + "MS_BTN2", "KC_PPLS", "KC_MINS", "KC_SLSH", @@ -69,7 +69,7 @@ "KC_CIRC", "KC_LBRC", "KC_RBRC", - "KC_BTN1", + "MS_BTN1", "KC_AMPR", "KC_EQL", "KC_COMM", @@ -108,10 +108,10 @@ "KC_F8", "KC_F9", "KC_F10", - "KC_MS_L", - "KC_MS_D", - "KC_MS_U", - "KC_MS_R", + "MS_LEFT", + "MS_DOWN", + "MS_UP", + "MS_RGHT", "KC_VOLD", "KC_F11", "KC_F12", diff --git a/keyboards/idank/sweeq/keymaps/default/keymap.json b/keyboards/idank/sweeq/keymaps/default/keymap.json index efd87277c7..d869668fdc 100644 --- a/keyboards/idank/sweeq/keymaps/default/keymap.json +++ b/keyboards/idank/sweeq/keymaps/default/keymap.json @@ -19,13 +19,13 @@ "LT(7,KC_SPC)", "KC_P1" ], ["KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", - "KC_TRNS" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", + "KC_TRNS" , "MS_BTN1" , "MS_WHLU" , "MS_BTN2" , "KC_TRNS", - "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS", - "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", + "KC_TRNS" , "MS_BTN2" , "KC_NO" , "MS_BTN1" , "KC_TRNS", + "KC_TRNS" , "MS_LEFT" , "MS_DOWN" , "MS_UP" , "MS_RGHT", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS", - "KC_TRNS" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "KC_TRNS" , "MS_WHLL" , "MS_WHLD" , "MS_WHLR" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS" diff --git a/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c b/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c index 2f337f9e89..f6def2c8e8 100644 --- a/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c +++ b/keyboards/input_club/ergodox_infinity/keymaps/default/keymap.c @@ -123,10 +123,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/input_club/ergodox_infinity/keymaps/halfkeyboard/keymap.c b/keyboards/input_club/ergodox_infinity/keymaps/halfkeyboard/keymap.c index 550eea0d31..69f831c2f2 100644 --- a/keyboards/input_club/ergodox_infinity/keymaps/halfkeyboard/keymap.c +++ b/keyboards/input_club/ergodox_infinity/keymaps/halfkeyboard/keymap.c @@ -48,21 +48,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [QWERTY] = LAYOUT_ergodox( // layer 0 : default // left hand - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_BTN2, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, MS_BTN2, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_EQL, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MINUS, KC_LCTL, KC_LALT, LCTL(LSFT(KC_TAB)),LCTL(KC_TAB), MO(SHORTCUTS), - KC_LGUI, KC_BTN1, + KC_LGUI, MS_BTN1, MU_ON, KC_SPACE,KC_DEL,KC_END, // right hand - KC_BTN2, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + MS_BTN2, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_SLASH, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_EQL,KC_N, KC_M, KC_COMM,KC_DOT, KC_SLASH, KC_RSFT, MO(SHORTCUTS), KC_UP,KC_DOWN,KC_RALT, KC_RCTL, - KC_BTN1, KC_RGUI, + MS_BTN1, KC_RGUI, MU_OFF, KC_PGDN,KC_TAB, LT(HALFQWERTY, KC_ENT) ), diff --git a/keyboards/input_club/infinity60/keymaps/hasu/keymap.c b/keyboards/input_club/infinity60/keymaps/hasu/keymap.c index 4200eaf1c2..7837a0cd5d 100644 --- a/keyboards/input_club/infinity60/keymaps/hasu/keymap.c +++ b/keyboards/input_club/infinity60/keymaps/hasu/keymap.c @@ -80,10 +80,10 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [3] = LAYOUT_60_ansi_split_bs_rshift( 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, - LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L,KC_WH_D,KC_MS_U, KC_WH_U, KC_WH_R, ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), - KC_LCTL, KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO, KC_NO, KC_MS_L,KC_MS_D, KC_MS_R, LT(3, KC_SCLN), KC_NO, KC_ENT, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_TRNS, - KC_TRNS, KC_LGUI,KC_LALT, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLL,MS_WHLD,MS_UP, MS_WHLU, MS_WHLR, ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), + KC_LCTL, MS_ACL0,MS_ACL1,MS_ACL2,MS_ACL2,KC_NO, KC_NO, MS_LEFT,MS_DOWN, MS_RGHT, LT(3, KC_SCLN), KC_NO, KC_ENT, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, MS_BTN3,MS_BTN2,MS_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_TRNS, + KC_TRNS, KC_LGUI,KC_LALT, MS_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), /* Layer 4: Mouse mode(IJKL)[Space] @@ -102,9 +102,9 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [4] = LAYOUT_60_ansi_split_bs_rshift( 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, - LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L, KC_WH_D, KC_MS_U, KC_WH_U, KC_WH_R, KC_BTN4, KC_BTN5, LALT(KC_TAB), - KC_LCTL, KC_VOLD, KC_VOLU, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, KC_NO, KC_ENT, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN3, KC_BTN2, KC_BTN1, ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_NO, + LALT(KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLL, MS_WHLD, MS_UP, MS_WHLU, MS_WHLR, MS_BTN4, MS_BTN5, LALT(KC_TAB), + KC_LCTL, KC_VOLD, KC_VOLU, KC_MUTE, KC_NO, KC_NO, KC_NO, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN1, KC_NO, KC_ENT, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, MS_BTN3, MS_BTN2, MS_BTN1, ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO, KC_RSFT, KC_NO, KC_NO, KC_LGUI, KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c b/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c index 721c21ef3c..17c9d9db9b 100755 --- a/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c +++ b/keyboards/ivndbt/neopad/rev1/keymaps/default/keymap.c @@ -104,9 +104,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 3: // layer 3 - pan right (CW) and left (CCW) if (clockwise) { - tap_code(KC_WH_R); + tap_code(MS_WHLR); } else { - tap_code(KC_WH_L); + tap_code(MS_WHLL); } break; } @@ -134,18 +134,18 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case 2: // layer 2 - wheel up (CW) and down (CCW) if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; case 3: // layer 3 - wheel up (CW) and down (CCW) if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; } diff --git a/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c b/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c index 2330caf6ff..95a9e1e555 100644 --- a/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c +++ b/keyboards/jacky_studio/piggy60/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi_tsangan_split_bs_rshift( 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_PSCR, - KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_PGUP, KC_HOME, KC_TRNS, KC_VOLU, KC_BRIU, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_DEL, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_TRNS, KC_VOLD, KC_BRID, KC_TRNS, KC_WH_D, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_PGUP, KC_HOME, KC_TRNS, KC_VOLU, KC_BRIU, KC_TRNS, MS_WHLU, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, KC_TRNS, KC_VOLD, KC_BRID, KC_TRNS, MS_WHLD, KC_TRNS, KC_TRNS, RM_TOGG, RM_NEXT, RM_HUEU, RM_SATU, RM_VALU, RM_SPDU, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) diff --git a/keyboards/junco/keymaps/default/keymap.c b/keyboards/junco/keymaps/default/keymap.c index 8fe73e035a..f1726791e3 100644 --- a/keyboards/junco/keymaps/default/keymap.c +++ b/keyboards/junco/keymaps/default/keymap.c @@ -146,7 +146,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { // Base layer encoder mappings: // index 0: mouse wheel up (CCW)/down (CW) index 1: volume down/up index 2: mouse wheel up/down index 3: mouse wheel left/right - [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_WH_L, KC_WH_R) }, + [_QWERTY] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(MS_WHLL, MS_WHLR) }, [_COLEMAK_DH] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // Passes through to base layers diff --git a/keyboards/kapcave/paladin64/keymaps/default/keymap.c b/keyboards/kapcave/paladin64/keymaps/default/keymap.c index f4f1873919..e69ef22288 100644 --- a/keyboards/kapcave/paladin64/keymaps/default/keymap.c +++ b/keyboards/kapcave/paladin64/keymaps/default/keymap.c @@ -53,9 +53,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* AutoMouse */ LAYOUT_all( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) }; diff --git a/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c b/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c index 46d68182f4..e1674d43ff 100644 --- a/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c +++ b/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c @@ -32,8 +32,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = LAYOUT_65_ansi( _______, 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_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, - _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, MS_BTN1, MS_UP, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, + _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, KC_VOLU, KC_END, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT) }; diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/iso/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/iso/keymap.c index d4a3cad12f..f34c94523f 100644 --- a/keyboards/kbdfans/kbd67/rev2/keymaps/iso/keymap.c +++ b/keyboards/kbdfans/kbd67/rev2/keymaps/iso/keymap.c @@ -54,8 +54,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_PSCR, KC_CAPS, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, BL_UP, BL_DOWN, BL_TOGG, KC_INS, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, KC_HOME, - _______, UG_TOGG, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_END, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + _______, UG_TOGG, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, _______, _______, _______, _______, _______, MS_BTN1, MS_UP, KC_END, + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), }; diff --git a/keyboards/keyboardio/model01/keymaps/default/keymap.c b/keyboards/keyboardio/model01/keymaps/default/keymap.c index 756cffcf23..9540d76513 100644 --- a/keyboards/keyboardio/model01/keymaps/default/keymap.c +++ b/keyboards/keyboardio/model01/keymaps/default/keymap.c @@ -48,9 +48,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [FUN] = LAYOUT( _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , - KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RM_TOGG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , - KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, - KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, + KC_TAB , _______, MS_UP, _______, MS_BTN3, _______, RM_TOGG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_HOME, MS_LEFT, MS_DOWN, MS_RGHT, MS_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, + KC_END , KC_PSCR, KC_INS , _______, MS_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, _______, _______, KC_DEL , KC_ENT , _______, _______, diff --git a/keyboards/keycapsss/plaid_pad/keymaps/oled/keymap.c b/keyboards/keycapsss/plaid_pad/keymaps/oled/keymap.c index 944f822fb3..3b28233ab7 100644 --- a/keyboards/keycapsss/plaid_pad/keymaps/oled/keymap.c +++ b/keyboards/keycapsss/plaid_pad/keymaps/oled/keymap.c @@ -51,8 +51,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation layer */ [_NAVIGATION] = LAYOUT_ortho_4x4( - KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX, - KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, + MS_BTN1, MS_UP, MS_BTN2, XXXXXXX, + MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX ), @@ -144,7 +144,7 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_MEDIA] = { ENCODER_CCW_CW(KC_F18, KC_F17), ENCODER_CCW_CW(KC_F20, KC_F19) } #else [_NUMPAD] = { ENCODER_CCW_CW(KC_F18, KC_F17), ENCODER_CCW_CW(KC_F20, KC_F19), ENCODER_CCW_CW(KC_F22, KC_F21), ENCODER_CCW_CW(KC_F24, KC_F23) }, - [_NAVIGATION] = { ENCODER_CCW_CW(C(S(KC_TAB)), C(KC_TAB)), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_NAVIGATION] = { ENCODER_CCW_CW(C(S(KC_TAB)), C(KC_TAB)), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [_MEDIA] = { ENCODER_CCW_CW(KC_F18, KC_F17), ENCODER_CCW_CW(KC_F20, KC_F19), ENCODER_CCW_CW(KC_BRID, KC_BRIU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) } #endif }; diff --git a/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c b/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c index 7e09d028f7..4d18d2fc6e 100644 --- a/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c +++ b/keyboards/keychron/c2_pro_v2/ansi/rgb/keymaps/default/keymap.c @@ -29,7 +29,7 @@ enum layers{ // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_BASE] = LAYOUT_104_ansi( - KC_ESC, KC_BRID, KC_BRIU, _______, _______, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, RM_NEXT, + KC_ESC, KC_BRID, KC_BRIU, _______, _______, RM_VALD, RM_VALU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, RM_NEXT, 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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, diff --git a/keyboards/keyhive/ut472/keymaps/default/keymap.c b/keyboards/keyhive/ut472/keymaps/default/keymap.c index c31b2b7d61..37bd3b37b3 100644 --- a/keyboards/keyhive/ut472/keymaps/default/keymap.c +++ b/keyboards/keyhive/ut472/keymaps/default/keymap.c @@ -95,6 +95,6 @@ LAYOUT( /* Tab */ KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT ), }; diff --git a/keyboards/kikoslab/kl90/keymaps/default/keymap.c b/keyboards/kikoslab/kl90/keymaps/default/keymap.c index 5cf7c75503..b84022f583 100644 --- a/keyboards/kikoslab/kl90/keymaps/default/keymap.c +++ b/keyboards/kikoslab/kl90/keymaps/default/keymap.c @@ -47,9 +47,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { /* First encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } else if (index == 1) { /* Second encoder */ if (clockwise) { diff --git a/keyboards/kin80/keymaps/default/keymap.c b/keyboards/kin80/keymaps/default/keymap.c index 50bad2a974..2e4077e60c 100644 --- a/keyboards/kin80/keymaps/default/keymap.c +++ b/keyboards/kin80/keymaps/default/keymap.c @@ -85,13 +85,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NM] = LAYOUT( KC_F1, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F12, _______, _______, _______, _______, _______, _______, KC_SCRL, KC_NUM, KC_PEQL, KC_PSLS, KC_PAST, _______, - _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, KC_CAPS, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, - _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, + _______, _______, MS_BTN1, MS_UP, MS_BTN2, _______, KC_CAPS, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, + _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, KC_PDOT, KC_P1, KC_P2, KC_P3, KC_PENT, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RALT, _______, - KC_WH_U, _______, - _______, _______, KC_WH_D, _______, _______, KC_P0 + MS_WHLU, _______, + _______, _______, MS_WHLD, _______, _______, KC_P0 ) }; diff --git a/keyboards/kinesis/keymaps/dvorak/keymap.c b/keyboards/kinesis/keymaps/dvorak/keymap.c index f8a5b4ed4f..af68841b1c 100644 --- a/keyboards/kinesis/keymaps/dvorak/keymap.c +++ b/keyboards/kinesis/keymaps/dvorak/keymap.c @@ -25,10 +25,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PWR, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLU, KC_MS_U, KC_VOLD, KC_NO, KC_NO, - KC_NO, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLU, MS_UP, KC_VOLD, KC_NO, KC_NO, + KC_NO, MS_BTN4, MS_BTN3, MS_BTN2, MS_BTN1, KC_NO, KC_NO, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, - KC_NO, KC_NO, KC_MS_D, KC_MS_U, KC_MS_L, KC_MS_R, KC_NO, KC_NO, + KC_NO, KC_NO, MS_DOWN, MS_UP, MS_LEFT, MS_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, diff --git a/keyboards/kingly_keys/ropro/keymaps/default/keymap.c b/keyboards/kingly_keys/ropro/keymaps/default/keymap.c index 3ee0b5646b..9a3c6a0115 100644 --- a/keyboards/kingly_keys/ropro/keymaps/default/keymap.c +++ b/keyboards/kingly_keys/ropro/keymaps/default/keymap.c @@ -77,9 +77,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (clockwise) { - tap_code(KC_WH_L); + tap_code(MS_WHLL); } else { - tap_code(KC_WH_R); + tap_code(MS_WHLR); } } return true; diff --git a/keyboards/kingly_keys/soap/keymaps/default/keymap.c b/keyboards/kingly_keys/soap/keymaps/default/keymap.c index d8fa6a963c..309c6686f3 100644 --- a/keyboards/kingly_keys/soap/keymaps/default/keymap.c +++ b/keyboards/kingly_keys/soap/keymaps/default/keymap.c @@ -53,9 +53,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (clockwise) { - tap_code(KC_WH_L); + tap_code(MS_WHLL); } else { - tap_code(KC_WH_R); + tap_code(MS_WHLR); } } return true; diff --git a/keyboards/kiserdesigns/madeline/keymaps/default/keymap.c b/keyboards/kiserdesigns/madeline/keymaps/default/keymap.c index 09c9d3a2ff..984fd9e9b9 100644 --- a/keyboards/kiserdesigns/madeline/keymaps/default/keymap.c +++ b/keyboards/kiserdesigns/madeline/keymaps/default/keymap.c @@ -48,6 +48,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #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(KC_MS_WH_UP, KC_MS_WH_DOWN) } + [1] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/kradoindustries/kousa/keymaps/default/keymap.c b/keyboards/kradoindustries/kousa/keymaps/default/keymap.c index 68cbcea1e2..0262113397 100644 --- a/keyboards/kradoindustries/kousa/keymaps/default/keymap.c +++ b/keyboards/kradoindustries/kousa/keymaps/default/keymap.c @@ -103,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, [3] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD) } diff --git a/keyboards/kradoindustries/krado66/keymaps/default/keymap.c b/keyboards/kradoindustries/krado66/keymaps/default/keymap.c index 51306a2111..4048c6743c 100644 --- a/keyboards/kradoindustries/krado66/keymaps/default/keymap.c +++ b/keyboards/kradoindustries/krado66/keymaps/default/keymap.c @@ -148,10 +148,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] = { - [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_QWERTYX] = { ENCODER_CCW_CW(C(KC_TAB), C(S(KC_TAB))), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(UG_SATD, UG_SATU) }, + [_QWERTY] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_QWERTYX] = { ENCODER_CCW_CW(C(KC_TAB), C(S(KC_TAB))), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(UG_SATD, UG_SATU) }, [_FUNCTION] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT), ENCODER_CCW_CW(UG_SPDD, UG_SPDU) }, - [_EXTRA] = { ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, + [_EXTRA] = { ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, }; #endif diff --git a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c index ed36cc85fb..f08f27216a 100644 --- a/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c +++ b/keyboards/kradoindustries/promenade_rp24s/keymaps/default/keymap.c @@ -93,7 +93,7 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(UG_NEXT, UG_PREV), ENCODER_CCW_CW(KC_LBRC, KC_RBRC), ENCODER_CCW_CW(C(KC_MINS), C(KC_EQL)), ENCODER_CCW_CW(C(KC_Z), C(S(KC_Z))), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), - ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_UP, KC_DOWN)}, + ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_UP, KC_DOWN)}, [1 ... 3] = { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______), diff --git a/keyboards/kraken_jones/pteron56/keymaps/default/keymap.c b/keyboards/kraken_jones/pteron56/keymaps/default/keymap.c index e9e7e0dd90..0f57f316bd 100644 --- a/keyboards/kraken_jones/pteron56/keymaps/default/keymap.c +++ b/keyboards/kraken_jones/pteron56/keymaps/default/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, 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_VOLU, KC_HOME, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_PGUP, KC_UP, KC_PGDN, KC_MENU, KC_RBRC, KC_TRNS, - KC_VOLD, KC_END, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, KC_LEFT, KC_DOWN, KC_RGHT, KC_LBRC, KC_BSLS, KC_TRNS, + KC_VOLU, KC_HOME, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, KC_PGUP, KC_UP, KC_PGDN, KC_MENU, KC_RBRC, KC_TRNS, + KC_VOLD, KC_END, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, KC_LEFT, KC_DOWN, KC_RGHT, KC_LBRC, KC_BSLS, KC_TRNS, KC_TRNS, KC_LCTL, KC_LSFT, KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/ktec/ergodone/keymaps/default/keymap.c b/keyboards/ktec/ergodone/keymaps/default/keymap.c index 87fc621996..1ee2041501 100644 --- a/keyboards/ktec/ergodone/keymaps/default/keymap.c +++ b/keyboards/ktec/ergodone/keymaps/default/keymap.c @@ -119,10 +119,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE [MDIA] = LAYOUT_ergodox( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, KC_TRNS, MS_BTN1, MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ktec/staryu/keymaps/default/keymap.c b/keyboards/ktec/staryu/keymaps/default/keymap.c index 68c1b85b19..3fa481e86d 100755 --- a/keyboards/ktec/staryu/keymaps/default/keymap.c +++ b/keyboards/ktec/staryu/keymaps/default/keymap.c @@ -52,9 +52,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LAYER3] = LAYOUT( /* ┌─────────┬─────────┬─────────┐ */ - KC_MS_U, TO(_LAYER4), + MS_UP, TO(_LAYER4), /* ├─────────┼─────────┼─────────┤ */ - KC_MS_L, KC_MS_D, KC_MS_R + MS_LEFT, MS_DOWN, MS_RGHT /* └─────────┴─────────┴─────────┘ */ ), diff --git a/keyboards/kv/revt/keymaps/default/keymap.c b/keyboards/kv/revt/keymaps/default/keymap.c index 2b4867add5..56921c9821 100644 --- a/keyboards/kv/revt/keymaps/default/keymap.c +++ b/keyboards/kv/revt/keymaps/default/keymap.c @@ -56,8 +56,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_default( _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_VOLU, -_______, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_U, KC_MS_BTN2, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPRV, KC_VOLD, -_______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, +_______, _______, _______, _______, _______, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPRV, KC_VOLD, +_______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), diff --git a/keyboards/macroflow_original/keymaps/default/keymap.c b/keyboards/macroflow_original/keymaps/default/keymap.c index 76ef39bf5a..22ea8c0ce9 100644 --- a/keyboards/macroflow_original/keymaps/default/keymap.c +++ b/keyboards/macroflow_original/keymaps/default/keymap.c @@ -89,7 +89,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [1] = { ENCODER_CCW_CW(_______, _______) }, [2] = { ENCODER_CCW_CW(_______, _______) }, [3] = { ENCODER_CCW_CW(_______, _______) }, diff --git a/keyboards/makeymakey/keymaps/default/keymap.c b/keyboards/makeymakey/keymaps/default/keymap.c index 1c3e6399fb..0216e2cd14 100644 --- a/keyboards/makeymakey/keymaps/default/keymap.c +++ b/keyboards/makeymakey/keymaps/default/keymap.c @@ -33,9 +33,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - KC_UP, KC_DOWN, KC_LEFT, KC_RGHT, KC_SPC, KC_BTN1, + KC_UP, KC_DOWN, KC_LEFT, KC_RGHT, KC_SPC, MS_BTN1, KC_W, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R, KC_BTN1, KC_BTN2 + MS_UP, MS_DOWN, MS_LEFT, MS_RGHT, MS_BTN1, MS_BTN2 ) }; diff --git a/keyboards/maple_computing/minidox/keymaps/bepo/keymap.c b/keyboards/maple_computing/minidox/keymaps/bepo/keymap.c index 699822ffc0..587cd02c35 100644 --- a/keyboards/maple_computing/minidox/keymaps/bepo/keymap.c +++ b/keyboards/maple_computing/minidox/keymaps/bepo/keymap.c @@ -52,8 +52,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `------' `------' */ [_LOWER] = LAYOUT( - ALGR(BP_B), BP_EACU, ALGR(BP_P), ALGR(BP_O), BP_EGRV, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_MS_WH_UP, - ALGR(BP_A), ALGR(BP_U), ALGR(BP_I), ALGR(BP_E), BP_DLR, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_DOWN, + ALGR(BP_B), BP_EACU, ALGR(BP_P), ALGR(BP_O), BP_EGRV, KC_PGUP, KC_HOME, KC_UP, KC_END, MS_WHLU, + ALGR(BP_A), ALGR(BP_U), ALGR(BP_I), ALGR(BP_E), BP_DLR, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, MS_WHLD, BP_AGRV, KC_LALT, KC_LCTL, KC_LSFT, BP_CCED, _______, KC_LSFT, KC_LCTL, KC_LALT, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/marcopad/keymaps/backlit/keymap.c b/keyboards/marcopad/keymaps/backlit/keymap.c index d70df8e6f7..8166cf67b6 100644 --- a/keyboards/marcopad/keymaps/backlit/keymap.c +++ b/keyboards/marcopad/keymaps/backlit/keymap.c @@ -31,14 +31,14 @@ const uint16_t PROGMEM value_down[] = {KC_P7, KC_P3, COMBO_END}; const uint16_t PROGMEM speed_up[] = {KC_P8, KC_P4, COMBO_END}; const uint16_t PROGMEM speed_down[] = {KC_P8, KC_P1, COMBO_END}; combo_t key_combos[] = { - COMBO(backlight_next, RGB_MODE_FORWARD), - COMBO(backlight_toggle, RGB_TOG), - COMBO(hue_up, RGB_HUI), - COMBO(hue_down, RGB_HUD), - COMBO(sat_up, RGB_SAI), - COMBO(sat_down, RGB_SAD), - COMBO(value_up, RGB_VAI), - COMBO(value_down, RGB_VAD), - COMBO(speed_up, RGB_SPI), - COMBO(speed_down, RGB_SPD) + COMBO(backlight_next, RM_NEXT), + COMBO(backlight_toggle, RM_TOGG), + COMBO(hue_up, RM_HUEU), + COMBO(hue_down, RM_HUED), + COMBO(sat_up, RM_SATU), + COMBO(sat_down, RM_SATD), + COMBO(value_up, RM_VALU), + COMBO(value_down, RM_VALD), + COMBO(speed_up, RM_SPDU), + COMBO(speed_down, RM_SPDD) }; diff --git a/keyboards/marksard/leftover30/keymaps/default/keymap.c b/keyboards/marksard/leftover30/keymaps/default/keymap.c index dcad144ebb..08ee136e81 100644 --- a/keyboards/marksard/leftover30/keymaps/default/keymap.c +++ b/keyboards/marksard/leftover30/keymaps/default/keymap.c @@ -90,9 +90,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_INS, KC_PSCR, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| - UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NUM, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NUM, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, KC_CAPS, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, KC_CAPS, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| _______, _______, _______, _______, KC_CAPS //`-----------------------------------------------------------------------------------------------------------' @@ -148,7 +148,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } else if (IS_LAYER_ON(_RAISE)) { tap_code16((clockwise == true) ? S(KC_DOWN) : S(KC_UP)); } else { - tap_code((clockwise == true) ? KC_WH_D : KC_WH_U); + tap_code((clockwise == true) ? MS_WHLD : MS_WHLU); } } return true; diff --git a/keyboards/marksard/leftover30/keymaps/default_isoenter/keymap.c b/keyboards/marksard/leftover30/keymaps/default_isoenter/keymap.c index e340ba5e3e..2c15b3664f 100644 --- a/keyboards/marksard/leftover30/keymaps/default_isoenter/keymap.c +++ b/keyboards/marksard/leftover30/keymaps/default_isoenter/keymap.c @@ -90,9 +90,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_INS, KC_PSCR, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| - UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NUM, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NUM, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------| _______, _______, _______, _______, KC_CAPS //`-----------------------------------------------------------------------------------------------------------' @@ -148,7 +148,7 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } else if (IS_LAYER_ON(_RAISE)) { tap_code16((clockwise == true) ? S(KC_DOWN) : S(KC_UP)); } else { - tap_code((clockwise == true) ? KC_WH_D : KC_WH_U); + tap_code((clockwise == true) ? MS_WHLD : MS_WHLU); } } return true; diff --git a/keyboards/marksard/rhymestone/keymaps/default/keymap.c b/keyboards/marksard/rhymestone/keymaps/default/keymap.c index f566ab99eb..fb78a5049d 100644 --- a/keyboards/marksard/rhymestone/keymaps/default/keymap.c +++ b/keyboards/marksard/rhymestone/keymaps/default/keymap.c @@ -80,9 +80,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,---------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NUM, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NUM, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ //,---------------------------------------------------------------------------------------------------. diff --git a/keyboards/marksard/treadstone32/keymaps/default/keymap.c b/keyboards/marksard/treadstone32/keymaps/default/keymap.c index 1373e819f8..93f2eaa91d 100644 --- a/keyboards/marksard/treadstone32/keymaps/default/keymap.c +++ b/keyboards/marksard/treadstone32/keymaps/default/keymap.c @@ -101,9 +101,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,---------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NUM, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_NUM, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, //`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------' _______, _______ // `---------|---------' diff --git a/keyboards/marksard/treadstone48/keymaps/default/keymap.c b/keyboards/marksard/treadstone48/keymaps/default/keymap.c index 276c8446cb..625894203e 100644 --- a/keyboards/marksard/treadstone48/keymaps/default/keymap.c +++ b/keyboards/marksard/treadstone48/keymaps/default/keymap.c @@ -84,13 +84,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_base( //,--------------------------------------------------------------------------------------------------------------------. - XXXXXXX, QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX, + XXXXXXX, QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, MS_WHLL, MS_WHLU, KC_HOME, KC_PGUP, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| - XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, + XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, XXXXXXX, MS_WHLR, MS_WHLD, KC_END, KC_PGDN, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| - _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U, + _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, MS_UP, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| - _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, + _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, //`-------------------------------------------------------------------------------------------------------------------' _______ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key. diff --git a/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c index f7e5a068b5..469cb94ee9 100644 --- a/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c +++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c @@ -132,13 +132,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_rs( // Treadstone48 Rhymestone //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------. - XXXXXXX, QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, MS_WHLL, MS_WHLU, KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------| - XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, XXXXXXX, MS_WHLR, MS_WHLD, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------| - _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1, MS_BTN2, XXXXXXX, MS_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------| - _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------' _______ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key. diff --git a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c index de5fe3a67c..3346f02ecd 100644 --- a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c +++ b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, DE_PLUS, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, SC_RSPC, - KC_LCTL, KC_LGUI, KC_LALT, KC_BTN1, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, KC_LGUI, KC_LALT, MS_BTN1, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT ), /* Special characters @@ -92,7 +92,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, DE_UDIA, KC_F9, DE_ODIA, KC_PSCR, KC_DEL, QK_LOCK, DE_ADIA, DE_SS, _______, _______, G_1, _______, RGB_M_P, RGB_M_SW,RGB_M_SN,_______, _______, _______, _______, _______, _______, _______, _______, _______, UG_HUED, UG_TOGG, UG_HUEU, KC_PGUP, _______, - XXXXXXX, _______, XXXXXXX, KC_BTN2, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END + XXXXXXX, _______, XXXXXXX, MS_BTN2, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END ), /* Gaming diff --git a/keyboards/mechanickeys/undead60m/undead60m.c b/keyboards/mechanickeys/undead60m/undead60m.c index 995b56e544..8aad8342d3 100644 --- a/keyboards/mechanickeys/undead60m/undead60m.c +++ b/keyboards/mechanickeys/undead60m/undead60m.c @@ -28,9 +28,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; case 1: /* Layer 2: Scroll */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; case 2: /* Layer 3: Change Track */ diff --git a/keyboards/mechstudio/chapter1/keymaps/default/keymap.c b/keyboards/mechstudio/chapter1/keymaps/default/keymap.c index 38508b2b03..79fb45f3db 100644 --- a/keyboards/mechstudio/chapter1/keymaps/default/keymap.c +++ b/keyboards/mechstudio/chapter1/keymaps/default/keymap.c @@ -27,6 +27,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = {ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN)} + [0] = {ENCODER_CCW_CW(MS_WHLU, MS_WHLD)} }; #endif diff --git a/keyboards/mechwild/puckbuddy/keymaps/default/keymap.c b/keyboards/mechwild/puckbuddy/keymaps/default/keymap.c index 2ef70b652a..0ad534e256 100644 --- a/keyboards/mechwild/puckbuddy/keymaps/default/keymap.c +++ b/keyboards/mechwild/puckbuddy/keymaps/default/keymap.c @@ -37,8 +37,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MUTE, MO(_FN3), MO(_FN2), MO(_FN1), LGUI(KC_D), MO(_FN2), KC_HOME, MO(_FN3), KC_END, - KC_BTN3, DPI_FINE, - KC_BTN1, KC_BTN2, KC_BTN2, KC_BTN1 + MS_BTN3, DPI_FINE, + MS_BTN1, MS_BTN2, MS_BTN2, MS_BTN1 ), [_FN1] = LAYOUT( UG_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, TAP_TOG, diff --git a/keyboards/mechwild/sugarglider/keymaps/default/keymap.c b/keyboards/mechwild/sugarglider/keymaps/default/keymap.c index d723ba10a6..46818cf209 100644 --- a/keyboards/mechwild/sugarglider/keymaps/default/keymap.c +++ b/keyboards/mechwild/sugarglider/keymaps/default/keymap.c @@ -18,7 +18,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, TAP_UP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_MUTE, TAP_DN, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, TG(_STENO), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, - KC_MUTE, KC_LGUI, KC_LALT, TL_LOWR, KC_MS_BTN1, TAP_TOG, KC_MS_BTN2, TL_UPPR, KC_SPC, KC_RSFT, KC_MUTE + KC_MUTE, KC_LGUI, KC_LALT, TL_LOWR, MS_BTN1, TAP_TOG, MS_BTN2, TL_UPPR, KC_SPC, KC_RSFT, KC_MUTE ), [_LOWER] = LAYOUT( KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, DPI_UP, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, @@ -54,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [_LOWER] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_HOME, KC_END), ENCODER_CCW_CW(DPI_UP, DPI_DN) }, [_RAISE] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_HOME, KC_END), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT), ENCODER_CCW_CW(KC_HOME, KC_END) }, [_ADJUST] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_BRID, KC_BRIU), ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_BRID, KC_BRIU) }, diff --git a/keyboards/mechwild/sugarglider/sugarglider.c b/keyboards/mechwild/sugarglider/sugarglider.c index 086294470e..d2a199bb7c 100644 --- a/keyboards/mechwild/sugarglider/sugarglider.c +++ b/keyboards/mechwild/sugarglider/sugarglider.c @@ -97,9 +97,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; case 3: if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; } diff --git a/keyboards/mlego/m65/keymaps/default/keymap.c b/keyboards/mlego/m65/keymaps/default/keymap.c index 6ff4b5dc70..52ead0ab36 100644 --- a/keyboards/mlego/m65/keymaps/default/keymap.c +++ b/keyboards/mlego/m65/keymaps/default/keymap.c @@ -15,17 +15,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LWR] = LAYOUT_ortho_5x13( KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , KC_EQL , - KC_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, KC_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_U, _______ , - _______, KC_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R), + MS_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + _______, MS_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_UP , _______ , + _______, MS_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT), [_RSE] = LAYOUT_ortho_5x13( 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_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLU, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR), [_ADJ] = LAYOUT_ortho_5x13( UG_NEXT, UG_PREV , A(KC_F2), _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_T , RGB_M_SW, diff --git a/keyboards/mlego/m65/keymaps/uk/keymap.c b/keyboards/mlego/m65/keymaps/uk/keymap.c index f708346239..06d5dd5bf2 100644 --- a/keyboards/mlego/m65/keymaps/uk/keymap.c +++ b/keyboards/mlego/m65/keymaps/uk/keymap.c @@ -185,10 +185,10 @@ MS - mouse directions */ [_LWR] = LAYOUT_ortho_5x13( KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL, UK_EQL, - KC_BTN3,UP(lq,lQ),UP(lw,lW),UP(le,lE),UP(lr,lR),UP(lt,lT),UP(ly,lY),UP(lu,lU),UP(li,lI), UP(lo,lO), UP(lp,lP), _______, _______, - KC_BTN2,UP(la,lA),UP(ls,lS),UP(ld,lD),UP(lf,lF),UP(lg,lG),UP(lh,lH),UP(lj,lJ),UP(lk,lK), UP(ll,lL),UP(ll1,lL1), UP(lk1,lK1), _______, - _______, KC_BTN1,UP(lz,lZ),UP(lx,lX),UP(lc,lC),UP(lv,lV),UP(lb,lB),UP(ln,lN),UP(lm,lM),UP(lc1,lC1),UP(lp1,lP1), KC_MS_U, UP(lq1,lQ1), - _______, KC_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R), + MS_BTN3,UP(lq,lQ),UP(lw,lW),UP(le,lE),UP(lr,lR),UP(lt,lT),UP(ly,lY),UP(lu,lU),UP(li,lI), UP(lo,lO), UP(lp,lP), _______, _______, + MS_BTN2,UP(la,lA),UP(ls,lS),UP(ld,lD),UP(lf,lF),UP(lg,lG),UP(lh,lH),UP(lj,lJ),UP(lk,lK), UP(ll,lL),UP(ll1,lL1), UP(lk1,lK1), _______, + _______, MS_BTN1,UP(lz,lZ),UP(lx,lX),UP(lc,lC),UP(lv,lV),UP(lb,lB),UP(ln,lN),UP(lm,lM),UP(lc1,lC1),UP(lp1,lP1), MS_UP, UP(lq1,lQ1), + _______, MS_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT), /* lower layer @@ -221,8 +221,8 @@ raise layer shifted 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 , _______,UP(ra1,rA1), _______, _______, _______,UP(rt,rT), _______, _______,UP(ri,rI), _______, _______, _______, _______ , KC_CAPS, UP(ra,rA), UP(rs,rS), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, KC_F20 , _______, _______,UP(rc,rC), _______, _______, _______, _______, _______, _______, KC_WH_U, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R), + _______, KC_F20 , _______, _______,UP(rc,rC), _______, _______, _______, _______, _______, _______, MS_WHLU, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR), /* adj layer * ┌───┬────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┬────┐ diff --git a/keyboards/molecule/keymaps/default/keymap.c b/keyboards/molecule/keymaps/default/keymap.c index 9030ba98d1..4b4fbd4eca 100755 --- a/keyboards/molecule/keymaps/default/keymap.c +++ b/keyboards/molecule/keymaps/default/keymap.c @@ -41,8 +41,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LOWER] = LAYOUT( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, - KC_F2, KC_F3, KC_WH_U, KC_F4, KC_F5, KC_F6, KC_F7, KC_UP, KC_F8, KC_F9, - KC_F1, KC_BTN2, KC_WH_D, KC_BTN1, KC_F11, KC_F12, KC_LEFT, KC_DOWN, KC_RGHT, KC_F10, + KC_F2, KC_F3, MS_WHLU, KC_F4, KC_F5, KC_F6, KC_F7, KC_UP, KC_F8, KC_F9, + KC_F1, MS_BTN2, MS_WHLD, MS_BTN1, KC_F11, KC_F12, KC_LEFT, KC_DOWN, KC_RGHT, KC_F10, KC_LCTL, KC_LSFT, KC_LALT, KC_SPC, KC_ENT, KC_RGUI, KC_RSFT, KC_RCTL, KC_TRNS, MO(4) ), diff --git a/keyboards/mt/mt40/keymaps/default/keymap.c b/keyboards/mt/mt40/keymaps/default/keymap.c index 22e13e662a..0880037a9b 100644 --- a/keyboards/mt/mt40/keymaps/default/keymap.c +++ b/keyboards/mt/mt40/keymaps/default/keymap.c @@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, OOOOOOO, _______, _______, _______, _______, _______, _______, _______), [4] = LAYOUT_planck_mit( - _______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, - KC_PSCR, KC_INS, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, - KC_CAPS, _______, KC_MPLY, KC_MRWD, KC_MFFD, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, + KC_PSCR, KC_INS, KC_MUTE, KC_VOLD, KC_VOLU, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, _______, _______, + KC_CAPS, _______, KC_MPLY, KC_MRWD, KC_MFFD, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, OOOOOOO, _______, _______, _______), diff --git a/keyboards/numatreus/keymaps/like_jis/keymap.c b/keyboards/numatreus/keymaps/like_jis/keymap.c index 6fc526610a..1b3838bf6b 100644 --- a/keyboards/numatreus/keymaps/like_jis/keymap.c +++ b/keyboards/numatreus/keymaps/like_jis/keymap.c @@ -112,13 +112,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT( //,----------------------------------. ,----------------------------------. - QK_BOOT, RGBRST, AG_NORM, AG_SWAP, KC_CAPS, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, + QK_BOOT, RGBRST, AG_NORM, AG_SWAP, KC_CAPS, XXXXXXX, MS_WHLL, MS_WHLU, KC_HOME, KC_PGUP, //|------+------+------+------+------| |------+------+------+------+------| - UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, KC_SCRL, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, + UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, KC_SCRL, XXXXXXX, MS_WHLR, MS_WHLD, KC_END, KC_PGDN, //|------+------+------+------+------| |------+------+------+------+------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, KC_NUM, XXXXXXX, KC_BTN1, KC_BTN2, KC_MS_U, XXXXXXX, + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, KC_NUM, XXXXXXX, MS_BTN1, MS_BTN2, MS_UP, XXXXXXX, //|------+------+------+------+------|------+------+------+------+------+------+------| - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT //|------+------+------+------+-------------+------+------+------+------+------+------| ) }; diff --git a/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c b/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c index 2d20fafe30..2a8f615201 100644 --- a/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c +++ b/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c @@ -43,9 +43,9 @@ KC_Z, MT_X, MT_C, KC_V, KC_B, KC_N, KC_M, MT_COMM, MT_DOT, KC_P0, KC_BSPC, MT_SPC, KC_P1 ), [1] = LAYOUT_split_3x5_2( -_______, _______, _______, _______, _______, _______, KC_BTN1, KC_WH_U, KC_BTN2, _______, -_______, KC_BTN2, XXXXXXX, KC_BTN1, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, -_______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, +_______, _______, _______, _______, _______, _______, MS_BTN1, MS_WHLU, MS_BTN2, _______, +_______, MS_BTN2, XXXXXXX, MS_BTN1, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, +_______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR, _______, _______, _______, _______, _______ ), [2] = LAYOUT_split_3x5_2( diff --git a/keyboards/oddball/keymaps/default/keymap.c b/keyboards/oddball/keymaps/default/keymap.c index 2d1c7ee049..7df7f9c152 100644 --- a/keyboards/oddball/keymaps/default/keymap.c +++ b/keyboards/oddball/keymaps/default/keymap.c @@ -32,9 +32,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LOWER] = LAYOUT( - KC_DEL, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_BTN3, KC_DQUO, KC_7, KC_8, KC_9, KC_ASTR, KC_UNDS, - KC_SCROLL, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_BTN2, KC_QUOT, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, - _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_BTN1, KC_0, KC_1, KC_2, KC_3, KC_MINS, _______, + KC_DEL, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, MS_BTN3, KC_DQUO, KC_7, KC_8, KC_9, KC_ASTR, KC_UNDS, + KC_SCROLL, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, MS_BTN2, KC_QUOT, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, + _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, MS_BTN1, KC_0, KC_1, KC_2, KC_3, KC_MINS, _______, _______, _______, _______, _______ ), diff --git a/keyboards/oddball/keymaps/pmw3360/keymap.c b/keyboards/oddball/keymaps/pmw3360/keymap.c index 2d1c7ee049..7df7f9c152 100644 --- a/keyboards/oddball/keymaps/pmw3360/keymap.c +++ b/keyboards/oddball/keymaps/pmw3360/keymap.c @@ -32,9 +32,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LOWER] = LAYOUT( - KC_DEL, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_BTN3, KC_DQUO, KC_7, KC_8, KC_9, KC_ASTR, KC_UNDS, - KC_SCROLL, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_BTN2, KC_QUOT, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, - _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_BTN1, KC_0, KC_1, KC_2, KC_3, KC_MINS, _______, + KC_DEL, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, MS_BTN3, KC_DQUO, KC_7, KC_8, KC_9, KC_ASTR, KC_UNDS, + KC_SCROLL, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, MS_BTN2, KC_QUOT, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, + _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, MS_BTN1, KC_0, KC_1, KC_2, KC_3, KC_MINS, _______, _______, _______, _______, _______ ), diff --git a/keyboards/oddball/oddball.c b/keyboards/oddball/oddball.c index bbc3b3f2e4..aa74b07475 100644 --- a/keyboards/oddball/oddball.c +++ b/keyboards/oddball/oddball.c @@ -107,23 +107,23 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { // handle mouse drag and scroll switch (keycode) { - case KC_BTN1: + case MS_BTN1: on_mouse_button(MOUSE_BTN1, record); return false; - case KC_BTN2: + case MS_BTN2: on_mouse_button(MOUSE_BTN2, record); return false; - case KC_BTN3: + case MS_BTN3: on_mouse_button(MOUSE_BTN3, record); return false; - case KC_BTN4: + case MS_BTN4: on_mouse_button(MOUSE_BTN4, record); return false; - case KC_BTN5: + case MS_BTN5: on_mouse_button(MOUSE_BTN5, record); return false; diff --git a/keyboards/org60/keymaps/default/keymap.c b/keyboards/org60/keymaps/default/keymap.c index 666f61ca83..0cd34ec9d5 100644 --- a/keyboards/org60/keymaps/default/keymap.c +++ b/keyboards/org60/keymaps/default/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // 1: Function Layer LAYOUT( QK_BOOT, 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_NO, KC_NO, - KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, + KC_NO, MS_WHLU, KC_UP, MS_WHLD, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP,KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_RSFT, KC_NO ,KC_PGUP, KC_INS, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, MO(1), KC_HOME, KC_PGDN,KC_END), diff --git a/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c b/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c index d189bc66f6..de2738e648 100644 --- a/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c +++ b/keyboards/owlab/voice65/hotswap/keymaps/default/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [3] = LAYOUT_65_ansi_blocker( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_WH_U, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_WHLU, MS_WHLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [1] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, - [2] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [2] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [3] = { ENCODER_CCW_CW(_______, _______) }, }; #endif diff --git a/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c b/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c index fc92357cf5..70d22ceba9 100644 --- a/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c +++ b/keyboards/owlab/voice65/soldered/keymaps/default/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [3] = LAYOUT_65_ansi_blocker( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_WH_U, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, MS_WHLU, MS_WHLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, [1] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN) }, - [2] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) }, + [2] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [3] = { ENCODER_CCW_CW(_______, _______) }, }; #endif diff --git a/keyboards/p3d/spacey/keymaps/default/keymap.c b/keyboards/p3d/spacey/keymaps/default/keymap.c index 19bc5323b8..031728b37d 100644 --- a/keyboards/p3d/spacey/keymaps/default/keymap.c +++ b/keyboards/p3d/spacey/keymaps/default/keymap.c @@ -33,8 +33,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN] = 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_BSPC, KC_ESC, KC_TAB, 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_DEL, - 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_ENT, KC_MS_U, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_MS_L, KC_MS_D, KC_MS_R, + 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_ENT, MS_UP, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MS_LEFT, MS_DOWN, MS_RGHT, KC_LCTL, KC_LGUI, KC_NO, KC_LALT, KC_SPC, KC_BSPC, KC_RALT, KC_APP, KC_RGUI, KC_RCTL ) }; diff --git a/keyboards/p3d/synapse/synapse.c b/keyboards/p3d/synapse/synapse.c index 0b532eaab6..c851e47f6b 100644 --- a/keyboards/p3d/synapse/synapse.c +++ b/keyboards/p3d/synapse/synapse.c @@ -20,9 +20,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 1) { /* left encoder*/ if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 0) { /* right encoder */ if (clockwise){ diff --git a/keyboards/pabile/p18/keymaps/default/keymap.c b/keyboards/pabile/p18/keymaps/default/keymap.c index 0223a450cd..8d93db1097 100644 --- a/keyboards/pabile/p18/keymaps/default/keymap.c +++ b/keyboards/pabile/p18/keymaps/default/keymap.c @@ -19,9 +19,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_WH_U); /*mouse wheel up*/ + tap_code(MS_WHLU); /*mouse wheel up*/ } else { - tap_code(KC_WH_D); /*mouse wheel down*/ + tap_code(MS_WHLD); /*mouse wheel down*/ } } return true; diff --git a/keyboards/pabile/p20/ver1/keymaps/default/keymap.c b/keyboards/pabile/p20/ver1/keymaps/default/keymap.c index a844e2c8a1..03b32323a4 100644 --- a/keyboards/pabile/p20/ver1/keymaps/default/keymap.c +++ b/keyboards/pabile/p20/ver1/keymaps/default/keymap.c @@ -15,18 +15,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RPRN, KC_NO, KC_PSLS, KC_NO), [2] = LAYOUT_ortho_5x4( KC_NUM, KC_NO, KC_NO, KC_NO, - KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, - KC_MS_L, KC_MS_D, KC_MS_R, KC_TAB, - KC_WH_U, KC_NO, KC_WH_D, KC_NO, + MS_BTN1, MS_UP, MS_BTN2, KC_NO, + MS_LEFT, MS_DOWN, MS_RGHT, KC_TAB, + MS_WHLU, KC_NO, MS_WHLD, KC_NO, KC_NO, KC_NO, KC_DEL, KC_ESC) }; bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { /* First encoder */ if (clockwise) { - tap_code(KC_WH_U); /*mouse wheel up*/ + tap_code(MS_WHLU); /*mouse wheel up*/ } else { - tap_code(KC_WH_D); /*mouse wheel down */ + tap_code(MS_WHLD); /*mouse wheel down */ } } else if (index == 1) { /* Second encoder */ if (clockwise) { diff --git a/keyboards/pabile/p40/keymaps/default/keymap.c b/keyboards/pabile/p40/keymaps/default/keymap.c index d607deb73c..f0f25eef0c 100644 --- a/keyboards/pabile/p40/keymaps/default/keymap.c +++ b/keyboards/pabile/p40/keymaps/default/keymap.c @@ -22,8 +22,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), [4] = LAYOUT_ortho_4x10( - KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_DEL, - KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_NO, KC_NO, + KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_BTN1, MS_UP, MS_BTN2, KC_DEL, + KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLU, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLD, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; diff --git a/keyboards/pabile/p40_ortho/keymaps/default/keymap.c b/keyboards/pabile/p40_ortho/keymaps/default/keymap.c index 891d2b5735..74614bbb34 100644 --- a/keyboards/pabile/p40_ortho/keymaps/default/keymap.c +++ b/keyboards/pabile/p40_ortho/keymaps/default/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), [4] = LAYOUT_ortho_4x10( - KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_DEL, - KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_NO, KC_NO, + KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_BTN1, MS_UP, MS_BTN2, KC_DEL, + KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLU, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLD, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; diff --git a/keyboards/pabile/p42/keymaps/default/keymap.c b/keyboards/pabile/p42/keymaps/default/keymap.c index ef4bad015b..b69f8719b4 100644 --- a/keyboards/pabile/p42/keymaps/default/keymap.c +++ b/keyboards/pabile/p42/keymaps/default/keymap.c @@ -22,8 +22,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS), [4] = LAYOUT( - KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_DEL, - KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_BTN1, MS_UP, MS_BTN2, KC_DEL, + KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLU, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLD, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS) }; diff --git a/keyboards/phoenix/keymaps/default/keymap.c b/keyboards/phoenix/keymaps/default/keymap.c index 909e1dbb60..8191c0af26 100644 --- a/keyboards/phoenix/keymaps/default/keymap.c +++ b/keyboards/phoenix/keymaps/default/keymap.c @@ -116,13 +116,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_BTN1, KC_TRNS, KC_TRNS, + MS_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, + MS_LEFT, MS_DOWN, MS_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), diff --git a/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c index 343ae043b4..364224b77b 100755 --- a/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c +++ b/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c @@ -3,7 +3,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - KC_ESC, KC_BTN1, KC_UP, KC_BTN2, + KC_ESC, MS_BTN1, KC_UP, MS_BTN2, KC_LSFT, KC_LEFT, KC_DOWN, KC_RGHT, MO(1), KC_SPC), diff --git a/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c index 343ae043b4..364224b77b 100755 --- a/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c +++ b/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c @@ -3,7 +3,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - KC_ESC, KC_BTN1, KC_UP, KC_BTN2, + KC_ESC, MS_BTN1, KC_UP, MS_BTN2, KC_LSFT, KC_LEFT, KC_DOWN, KC_RGHT, MO(1), KC_SPC), diff --git a/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c index 0cc38837d3..7e624fcf66 100755 --- a/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c +++ b/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c @@ -3,7 +3,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - KC_ESC, KC_BTN2, KC_UP, KC_BTN1, + KC_ESC, MS_BTN2, KC_UP, MS_BTN1, KC_LSFT, KC_RGHT, KC_DOWN, KC_LEFT, MO(1), KC_SPC), diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index c08e58653a..a56cee0549 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -258,13 +258,13 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } else { if (clockwise) { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); #else tap_code(KC_PGDN); #endif } else { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); #else tap_code(KC_PGUP); #endif diff --git a/keyboards/ploopyco/madromys/keymaps/default/keymap.c b/keyboards/ploopyco/madromys/keymaps/default/keymap.c index bc8265b39d..a4e46efc87 100644 --- a/keyboards/ploopyco/madromys/keymaps/default/keymap.c +++ b/keyboards/ploopyco/madromys/keymaps/default/keymap.c @@ -18,5 +18,5 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( KC_BTN4, KC_BTN5, DRAG_SCROLL, KC_BTN2, KC_BTN1, KC_BTN3 ) + [0] = LAYOUT( MS_BTN4, MS_BTN5, DRAG_SCROLL, MS_BTN2, MS_BTN1, MS_BTN3 ) }; diff --git a/keyboards/ploopyco/mouse/keymaps/default/keymap.c b/keyboards/ploopyco/mouse/keymaps/default/keymap.c index 29d81b8061..d2ed79a774 100644 --- a/keyboards/ploopyco/mouse/keymaps/default/keymap.c +++ b/keyboards/ploopyco/mouse/keymaps/default/keymap.c @@ -19,5 +19,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT(/* Base */ - C(KC_C), KC_BTN1, KC_BTN3, KC_BTN2, C(KC_V), KC_BTN4, KC_BTN5, DPI_CONFIG) + C(KC_C), MS_BTN1, MS_BTN3, MS_BTN2, C(KC_V), MS_BTN4, MS_BTN5, DPI_CONFIG) }; diff --git a/keyboards/ploopyco/ploopyco.c b/keyboards/ploopyco/ploopyco.c index 57f2a26b8c..f094f784cb 100644 --- a/keyboards/ploopyco/ploopyco.c +++ b/keyboards/ploopyco/ploopyco.c @@ -80,7 +80,7 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { return false; } # ifdef MOUSEKEY_ENABLE - tap_code(clockwise ? KC_WH_U : KC_WH_D); + tap_code(clockwise ? MS_WHLU : MS_WHLD); # else report_mouse_t mouse_report = pointing_device_get_report(); mouse_report.v = clockwise ? 1 : -1; diff --git a/keyboards/ploopyco/trackball/keymaps/default/keymap.c b/keyboards/ploopyco/trackball/keymaps/default/keymap.c index 83a4a16847..e330a2efff 100644 --- a/keyboards/ploopyco/trackball/keymaps/default/keymap.c +++ b/keyboards/ploopyco/trackball/keymaps/default/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - KC_BTN1, KC_BTN3, KC_BTN2, - KC_BTN4, KC_BTN5 + MS_BTN1, MS_BTN3, MS_BTN2, + MS_BTN4, MS_BTN5 ), }; diff --git a/keyboards/ploopyco/trackball_mini/keymaps/default/keymap.c b/keyboards/ploopyco/trackball_mini/keymaps/default/keymap.c index 3659076bec..ac51e8b89a 100644 --- a/keyboards/ploopyco/trackball_mini/keymaps/default/keymap.c +++ b/keyboards/ploopyco/trackball_mini/keymaps/default/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - KC_BTN1, KC_BTN3, KC_BTN2, - KC_BTN4, KC_BTN5 + MS_BTN1, MS_BTN3, MS_BTN2, + MS_BTN4, MS_BTN5 ), }; diff --git a/keyboards/ploopyco/trackball_thumb/keymaps/default/keymap.c b/keyboards/ploopyco/trackball_thumb/keymaps/default/keymap.c index 8729deabc1..eb50542ce4 100644 --- a/keyboards/ploopyco/trackball_thumb/keymaps/default/keymap.c +++ b/keyboards/ploopyco/trackball_thumb/keymaps/default/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - KC_BTN4, KC_BTN1, KC_BTN3, KC_BTN2, KC_BTN5, + MS_BTN4, MS_BTN1, MS_BTN3, MS_BTN2, MS_BTN5, DPI_CONFIG ), }; diff --git a/keyboards/pluckey/keymaps/default/keymap.c b/keyboards/pluckey/keymaps/default/keymap.c index 787bb192b2..604215b3c6 100644 --- a/keyboards/pluckey/keymaps/default/keymap.c +++ b/keyboards/pluckey/keymaps/default/keymap.c @@ -51,15 +51,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_RAISE] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, - _______, _______, _______, KC_VOLU, _______, _______, KC_LPRN, KC_RPRN, _______, KC_BTN4, KC_UP, KC_BTN5, _______, _______, + _______, _______, _______, KC_VOLU, _______, _______, KC_LPRN, KC_RPRN, _______, MS_BTN4, KC_UP, MS_BTN5, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_LPRN, KC_RPRN, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, _______, _______, _______, KC_VOLD, _______, _______, M_ARROW, KC_PGUP, KC_PGDN, _______, _______, _______, KC_PGDN, _______, _______, _______, _______, _______, MO_ADJU, _______, KC_DEL, _______, _______, MO_CURR, _______, _______ ), [_ADJUST] = LAYOUT_all( KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CLR, _______, _______, _______, _______, _______ ) diff --git a/keyboards/pluckey/keymaps/default_ergo/keymap.c b/keyboards/pluckey/keymaps/default_ergo/keymap.c index 313b118b8a..5fe90e9fbb 100644 --- a/keyboards/pluckey/keymaps/default_ergo/keymap.c +++ b/keyboards/pluckey/keymaps/default_ergo/keymap.c @@ -51,15 +51,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_RAISE] = LAYOUT_ergo( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, - _______, _______, _______, KC_VOLU, _______, _______, KC_LPRN, KC_RPRN, _______, KC_BTN4, KC_UP, KC_BTN5, _______, _______, + _______, _______, _______, KC_VOLU, _______, _______, KC_LPRN, KC_RPRN, _______, MS_BTN4, KC_UP, MS_BTN5, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, _______, _______, _______, KC_VOLD, _______, _______, M_ARROW, KC_PGUP, KC_PGDN, _______, _______, _______, KC_PGDN, _______, _______, _______, _______, _______, MO_ADJU, _______, KC_DEL, _______, _______, MO_CURR, _______, _______ ), [_ADJUST] = LAYOUT_ergo( KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CLR, _______, _______, _______, _______, _______ ) diff --git a/keyboards/pluckey/pluckey.c b/keyboards/pluckey/pluckey.c index d9215b9339..db801c8b81 100644 --- a/keyboards/pluckey/pluckey.c +++ b/keyboards/pluckey/pluckey.c @@ -28,9 +28,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } else if (index == 1) { if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/proteus67/keymaps/default/keymap.c b/keyboards/proteus67/keymaps/default/keymap.c index 225476b40c..710ae56a90 100644 --- a/keyboards/proteus67/keymaps/default/keymap.c +++ b/keyboards/proteus67/keymaps/default/keymap.c @@ -18,8 +18,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LAYERB] = LAYOUT_ortho_5x14( UG_TOGG , UG_HUEU ,UG_HUED ,UG_SATU , UG_SATD , UG_VALU , UG_VALD , RGB_M_P , RGB_M_B , RGB_M_R , RGB_M_SW , RGB_M_K , RGB_M_X , RGB_M_G , - KC_TRNS , KC_TRNS, KC_TRNS ,KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_TRNS ,KC_TRNS, - KC_TRNS, KC_TRNS ,KC_TRNS ,KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_MS_L , KC_MS_D , KC_MS_R , KC_SCLN,KC_QUOT , + KC_TRNS , KC_TRNS, KC_TRNS ,KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , MS_BTN1 , MS_UP , MS_BTN2 , KC_TRNS ,KC_TRNS, + KC_TRNS, KC_TRNS ,KC_TRNS ,KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , MS_LEFT , MS_DOWN , MS_RGHT , KC_SCLN,KC_QUOT , KC_TRNS, KC_TRNS ,KC_TRNS ,KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_NUBS, KC_TRNS, KC_TRNS , KC_TRNS ,KC_TRNS,KC_TRNS, KC_TRNS , UG_PREV, KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS , KC_TRNS ), diff --git a/keyboards/prototypist/oceanographer/keymaps/default/keymap.c b/keyboards/prototypist/oceanographer/keymaps/default/keymap.c index 83b907f9a4..ceeb224927 100644 --- a/keyboards/prototypist/oceanographer/keymaps/default/keymap.c +++ b/keyboards/prototypist/oceanographer/keymaps/default/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, [_FN1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU)}, - [_FN2] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP)}, + [_FN2] = { ENCODER_CCW_CW(MS_WHLD, MS_WHLU)}, [_FN3] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT)} }; #endif diff --git a/keyboards/prototypist/oceanographer/keymaps/default_625/keymap.c b/keyboards/prototypist/oceanographer/keymaps/default_625/keymap.c index 94e8e936f8..185ce52c9b 100644 --- a/keyboards/prototypist/oceanographer/keymaps/default_625/keymap.c +++ b/keyboards/prototypist/oceanographer/keymaps/default_625/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, [_FN1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU)}, - [_FN2] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP)}, + [_FN2] = { ENCODER_CCW_CW(MS_WHLD, MS_WHLU)}, [_FN3] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT)} }; #endif diff --git a/keyboards/prototypist/oceanographer/keymaps/split_225_2/keymap.c b/keyboards/prototypist/oceanographer/keymaps/split_225_2/keymap.c index cc7c155752..0a1d1558dd 100644 --- a/keyboards/prototypist/oceanographer/keymaps/split_225_2/keymap.c +++ b/keyboards/prototypist/oceanographer/keymaps/split_225_2/keymap.c @@ -43,7 +43,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_QWERTY] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, [_FN1] = { ENCODER_CCW_CW(UG_VALD, UG_VALU)}, - [_FN2] = { ENCODER_CCW_CW(KC_MS_WH_DOWN, KC_MS_WH_UP)}, + [_FN2] = { ENCODER_CCW_CW(MS_WHLD, MS_WHLU)}, [_FN3] = { ENCODER_CCW_CW(KC_LEFT, KC_RIGHT)} }; #endif diff --git a/keyboards/qck75/v1/v1.c b/keyboards/qck75/v1/v1.c index 5e512b292c..d7756fe06d 100644 --- a/keyboards/qck75/v1/v1.c +++ b/keyboards/qck75/v1/v1.c @@ -26,16 +26,16 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { break; case THIRD: if (clockwise) { - tap_code(KC_MS_R); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_L); + tap_code(MS_LEFT); } break; case FOURTH: if (clockwise) { - tap_code(KC_MS_U); + tap_code(MS_UP); } else { - tap_code(KC_MS_D); + tap_code(MS_DOWN); } break; } diff --git a/keyboards/qpockets/eggman/keymaps/default/keymap.c b/keyboards/qpockets/eggman/keymaps/default/keymap.c index 079272d918..60b70837fb 100644 --- a/keyboards/qpockets/eggman/keymaps/default/keymap.c +++ b/keyboards/qpockets/eggman/keymaps/default/keymap.c @@ -63,9 +63,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { /* left encoder */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 1) { /* right encoder */ if (clockwise) { diff --git a/keyboards/qpockets/space_space/rev1/keymaps/big_space/keymap.c b/keyboards/qpockets/space_space/rev1/keymaps/big_space/keymap.c index 1bbdd632e8..1b88459606 100644 --- a/keyboards/qpockets/space_space/rev1/keymaps/big_space/keymap.c +++ b/keyboards/qpockets/space_space/rev1/keymaps/big_space/keymap.c @@ -85,9 +85,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { default: if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else{ - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; } diff --git a/keyboards/qpockets/space_space/rev1/keymaps/default/keymap.c b/keyboards/qpockets/space_space/rev1/keymaps/default/keymap.c index 19390f665c..f872606d07 100644 --- a/keyboards/qpockets/space_space/rev1/keymaps/default/keymap.c +++ b/keyboards/qpockets/space_space/rev1/keymaps/default/keymap.c @@ -87,9 +87,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { default: if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else{ - tap_code(KC_WH_D); + tap_code(MS_WHLD); } break; } diff --git a/keyboards/qpockets/space_space/rev2/rev2.c b/keyboards/qpockets/space_space/rev2/rev2.c index e6053afb75..04581833ff 100644 --- a/keyboards/qpockets/space_space/rev2/rev2.c +++ b/keyboards/qpockets/space_space/rev2/rev2.c @@ -20,9 +20,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (index == 1) { /* left encoder*/ if (clockwise){ - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } else if (index == 0) { /* right encoder */ if (clockwise){ diff --git a/keyboards/qpockets/wanten/keymaps/2u_bars/keymap.c b/keyboards/qpockets/wanten/keymaps/2u_bars/keymap.c index 3322fc8923..de67171c2e 100644 --- a/keyboards/qpockets/wanten/keymaps/2u_bars/keymap.c +++ b/keyboards/qpockets/wanten/keymaps/2u_bars/keymap.c @@ -78,9 +78,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* center encoder */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/qpockets/wanten/keymaps/625_bar/keymap.c b/keyboards/qpockets/wanten/keymaps/625_bar/keymap.c index 1bd1be2f66..fc5dab3b77 100644 --- a/keyboards/qpockets/wanten/keymaps/625_bar/keymap.c +++ b/keyboards/qpockets/wanten/keymaps/625_bar/keymap.c @@ -78,9 +78,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* center encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } return true; diff --git a/keyboards/qpockets/wanten/keymaps/default/keymap.c b/keyboards/qpockets/wanten/keymaps/default/keymap.c index 248974a7eb..386a8d982d 100644 --- a/keyboards/qpockets/wanten/keymaps/default/keymap.c +++ b/keyboards/qpockets/wanten/keymaps/default/keymap.c @@ -78,9 +78,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* center encoder */ if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } return true; diff --git a/keyboards/qvex/lynepad/keymaps/default/keymap.c b/keyboards/qvex/lynepad/keymaps/default/keymap.c index 142f295de6..a4c3030f22 100644 --- a/keyboards/qvex/lynepad/keymaps/default/keymap.c +++ b/keyboards/qvex/lynepad/keymaps/default/keymap.c @@ -24,9 +24,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |----------------------------| */ [0] = LAYOUT( - KC_MS_BTN4, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, - KC_MS_BTN5, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, - KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2 + MS_BTN4, MS_BTN2, MS_UP, MS_BTN1, + MS_BTN5, MS_LEFT, MS_DOWN, MS_RGHT, + MS_ACL0, MS_ACL1, MS_ACL2 ) }; @@ -41,9 +41,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } } return true; @@ -76,10 +76,10 @@ void matrix_scan_user(void) { } if (enc2Center != enc2CenterPrev) { if (enc2Center < ENC_TILT_THRESHOLD) { - register_code16(KC_MS_BTN3); + register_code16(MS_BTN3); } else { - unregister_code16(KC_MS_BTN3); + unregister_code16(MS_BTN3); } /* * Encoder sets ALL values when center is pressed so bail out at this point diff --git a/keyboards/qwertyydox/keymaps/default/keymap.c b/keyboards/qwertyydox/keymaps/default/keymap.c index 49d45b9c5f..69e1d5c31c 100644 --- a/keyboards/qwertyydox/keymaps/default/keymap.c +++ b/keyboards/qwertyydox/keymaps/default/keymap.c @@ -42,11 +42,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NAV] = LAYOUT( //,--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------. - KC_ESC, KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, KC_WH_L, KC_WH_R, KC_ESC, KC_NO, KC_UP, KC_PSLS, KC_PAST, KC_PMNS, KC_PPLS, + KC_ESC, KC_NO, MS_ACL0, MS_ACL1, MS_ACL2, MS_WHLL, MS_WHLR, KC_ESC, KC_NO, KC_UP, KC_PSLS, KC_PAST, KC_PMNS, KC_PPLS, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_WH_U, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, + KC_NO, KC_Z, KC_X, KC_C, KC_V, MS_WHLU, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| - KC_INS, KC_HOME, KC_PGUP, KC_BTN1, KC_BTN2, KC_WH_D, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, KC_NO, KC_NO, + KC_INS, KC_HOME, KC_PGUP, MS_BTN1, MS_BTN2, MS_WHLD, MS_LEFT, MS_UP, MS_DOWN, MS_RGHT, KC_NO, KC_NO, //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_DEL, KC_END, KC_PGDN, nav, KC_LCTL, KC_SPC, TO(0), TO(1), KC_LSFT, KC_BSPC, KC_NO, KC_NO, KC_NO, QK_BOOT //`--------+--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------+--------' diff --git a/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c b/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c index 914d1113b1..bcc7ea0f88 100644 --- a/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c +++ b/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c @@ -62,16 +62,16 @@ bool encoder_update_user(uint8_t index, bool clockwise) { break; case _RAISE: if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } break; case _ADJUST: if (clockwise) { - tap_code(KC_MS_WH_RIGHT); + tap_code(MS_WHLR); } else { - tap_code(KC_MS_WH_LEFT); + tap_code(MS_WHLL); } break; case _GAME: diff --git a/keyboards/rainkeebs/trailmix/keymaps/default/keymap.c b/keyboards/rainkeebs/trailmix/keymaps/default/keymap.c index 77418f9cd6..7c3fcb3ce0 100644 --- a/keyboards/rainkeebs/trailmix/keymaps/default/keymap.c +++ b/keyboards/rainkeebs/trailmix/keymaps/default/keymap.c @@ -58,9 +58,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN)}, + [_BASE] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(MS_WHLU, MS_WHLD)}, [_LOWER] = {ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_HOME, KC_END)}, - [_RAISE] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(KC_WH_L, KC_WH_R)}, - [_ADJUST] = {ENCODER_CCW_CW(KC_MS_LEFT, KC_MS_RIGHT), ENCODER_CCW_CW(KC_MS_UP, KC_MS_DOWN)}, + [_RAISE] = {ENCODER_CCW_CW(KC_MPRV, KC_MNXT), ENCODER_CCW_CW(MS_WHLL, MS_WHLR)}, + [_ADJUST] = {ENCODER_CCW_CW(MS_LEFT, MS_RGHT), ENCODER_CCW_CW(MS_UP, MS_DOWN)}, }; #endif diff --git a/keyboards/rainkeebs/trailmix/trailmix.c b/keyboards/rainkeebs/trailmix/trailmix.c index 105d988dad..954c72f2c8 100644 --- a/keyboards/rainkeebs/trailmix/trailmix.c +++ b/keyboards/rainkeebs/trailmix/trailmix.c @@ -34,9 +34,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } } else if (index == 1) { if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } } break; @@ -49,9 +49,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } } else if (index == 1) { if (clockwise) { - tap_code(KC_WH_R); + tap_code(MS_WHLR); } else { - tap_code(KC_WH_L); + tap_code(MS_WHLL); } } break; @@ -73,15 +73,15 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { case _ADJUST: if (index == 0) { if (clockwise) { - tap_code(KC_MS_RIGHT); + tap_code(MS_RGHT); } else { - tap_code(KC_MS_LEFT); + tap_code(MS_LEFT); } } else if (index == 1) { if (clockwise) { - tap_code(KC_MS_DOWN); + tap_code(MS_DOWN); } else { - tap_code(KC_MS_UP); + tap_code(MS_UP); } } break; diff --git a/keyboards/rart/rart4x4/keymaps/default/keymap.c b/keyboards/rart/rart4x4/keymaps/default/keymap.c index e57b87a35f..9f16aff6ed 100644 --- a/keyboards/rart/rart4x4/keymaps/default/keymap.c +++ b/keyboards/rart/rart4x4/keymaps/default/keymap.c @@ -43,9 +43,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } return true; diff --git a/keyboards/rart/rartpad/keymaps/default/keymap.c b/keyboards/rart/rartpad/keymaps/default/keymap.c index 342b280c57..8b177bba5c 100644 --- a/keyboards/rart/rartpad/keymaps/default/keymap.c +++ b/keyboards/rart/rartpad/keymaps/default/keymap.c @@ -45,9 +45,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } return true; diff --git a/keyboards/rate/pistachio/keymaps/default/keymap.c b/keyboards/rate/pistachio/keymaps/default/keymap.c index a8cd297ce8..3d7d8fb636 100644 --- a/keyboards/rate/pistachio/keymaps/default/keymap.c +++ b/keyboards/rate/pistachio/keymaps/default/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPLY, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, JP_LBRC, KC_HOME, KC_MUTE, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_SCLN, JP_COLN, JP_RBRC, KC_ENT, KC_END, KC_VOLU, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, JP_COMM, JP_DOT, JP_SLSH, JP_BSLS, KC_RSFT, KC_PGUP, - KC_VOLD, KC_LCTL, KC_LGUI, KC_LALT, KC_ENT, JP_MHEN, LT(_FN,KC_SPC), LT(_FN,KC_SPC), JP_HENK, KC_BTN1, KC_INS, KC_RALT, KC_APP, KC_RCTL, KC_PGDN + KC_VOLD, KC_LCTL, KC_LGUI, KC_LALT, KC_ENT, JP_MHEN, LT(_FN,KC_SPC), LT(_FN,KC_SPC), JP_HENK, MS_BTN1, KC_INS, KC_RALT, KC_APP, KC_RCTL, KC_PGDN ), [_FN] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/recompile_keys/nomu30/keymaps/center_sprit/keymap.c b/keyboards/recompile_keys/nomu30/keymaps/center_sprit/keymap.c index 16d320f045..98167fa2d3 100644 --- a/keyboards/recompile_keys/nomu30/keymaps/center_sprit/keymap.c +++ b/keyboards/recompile_keys/nomu30/keymaps/center_sprit/keymap.c @@ -93,9 +93,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-------------------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, + _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, XXXXXXX, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, _______, KC_BTN1, KC_BTN2, XXXXXXX + UG_NEXT, UG_HUED, UG_SATD, UG_VALD, XXXXXXX, _______, MS_BTN1, MS_BTN2, XXXXXXX //`---------+---------+---------+---------+---------+---------+---------+---------+---------' ) }; diff --git a/keyboards/recompile_keys/nomu30/keymaps/center_sprit/readme.md b/keyboards/recompile_keys/nomu30/keymaps/center_sprit/readme.md index 34a3ec1fbe..bc468beb37 100644 --- a/keyboards/recompile_keys/nomu30/keymaps/center_sprit/readme.md +++ b/keyboards/recompile_keys/nomu30/keymaps/center_sprit/readme.md @@ -59,9 +59,9 @@ At first, Move to Lower layer with long push. After that Adjust key with long pu //,-------------------------------------------------------------------------------------------------------------. QK_BOOT, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, XXXXXXX, //|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| - RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, _______, KC_BTN1, KC_BTN2, XXXXXXX + RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, _______, MS_BTN1, MS_BTN2, XXXXXXX //`---------+---------+---------+---------+---------+---------+---------+---------+---------' ) diff --git a/keyboards/redox/keymaps/default/keymap.c b/keyboards/redox/keymaps/default/keymap.c index d69a5d5cdd..2636144025 100644 --- a/keyboards/redox/keymaps/default/keymap.c +++ b/keyboards/redox/keymaps/default/keymap.c @@ -70,13 +70,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + XXXXXXX ,XXXXXXX ,MS_UP ,XXXXXXX ,MS_WHLU ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + XXXXXXX ,MS_LEFT ,MS_DOWN ,MS_RGHT ,MS_WHLD ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , MS_BTN1 , MS_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), diff --git a/keyboards/redox_media/redox_media.c b/keyboards/redox_media/redox_media.c index e3a83c6c2d..ffc2f11a6c 100644 --- a/keyboards/redox_media/redox_media.c +++ b/keyboards/redox_media/redox_media.c @@ -29,9 +29,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } } else if (index == 1) { /* Second encoder */ if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } } return true; diff --git a/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c b/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c index 4a73d57a6a..e53eccf645 100644 --- a/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c +++ b/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (IS_LAYER_ON(_LOWER)) { - tap_code16((clockwise == true) ? KC_WH_D : KC_WH_U); + tap_code16((clockwise == true) ? MS_WHLD : MS_WHLU); } else { tap_code((clockwise == true) ? KC_VOLD : KC_VOLU); } diff --git a/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c b/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c index ec684c6a2f..4d7f666952 100644 --- a/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c +++ b/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c @@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (IS_LAYER_ON(_LOWER)) { - tap_code16((clockwise == true) ? KC_WH_D : KC_WH_U); + tap_code16((clockwise == true) ? MS_WHLD : MS_WHLU); } else { tap_code((clockwise == true) ? KC_VOLD : KC_VOLU); } diff --git a/keyboards/rocketboard_16/keycode_lookup.c b/keyboards/rocketboard_16/keycode_lookup.c index a29808d04d..a765968bc3 100644 --- a/keyboards/rocketboard_16/keycode_lookup.c +++ b/keyboards/rocketboard_16/keycode_lookup.c @@ -254,22 +254,22 @@ lookup_table_t lookup_table[333] = {"KC_RSFT", KC_RSFT}, {"KC_RALT", KC_RALT}, {"KC_RGUI", KC_RGUI}, - {"KC_MS_UP", KC_MS_UP}, - {"KC_MS_DOWN", KC_MS_DOWN}, - {"KC_MS_LEFT", KC_MS_LEFT}, - {"KC_MS_RIGHT", KC_MS_RIGHT}, - {"KC_MS_BTN1", KC_MS_BTN1}, - {"KC_MS_BTN2", KC_MS_BTN2}, - {"KC_MS_BTN3", KC_MS_BTN3}, - {"KC_MS_BTN4", KC_MS_BTN4}, - {"KC_MS_BTN5", KC_MS_BTN5}, - {"KC_MS_WH_UP", KC_MS_WH_UP}, - {"KC_MS_WH_DOWN", KC_MS_WH_DOWN}, - {"KC_MS_WH_LEFT", KC_MS_WH_LEFT}, - {"KC_MS_WH_RIGHT", KC_MS_WH_RIGHT}, - {"KC_MS_ACCEL0", KC_MS_ACCEL0}, - {"KC_MS_ACCEL1", KC_MS_ACCEL1}, - {"KC_MS_ACCEL2", KC_MS_ACCEL2}, + {"MS_UP", MS_UP}, + {"MS_DOWN", MS_DOWN}, + {"MS_LEFT", MS_LEFT}, + {"MS_RGHT", MS_RGHT}, + {"MS_BTN1", MS_BTN1}, + {"MS_BTN2", MS_BTN2}, + {"MS_BTN3", MS_BTN3}, + {"MS_BTN4", MS_BTN4}, + {"MS_BTN5", MS_BTN5}, + {"MS_WHLU", MS_WHLU}, + {"MS_WHLD", MS_WHLD}, + {"MS_WHLL", MS_WHLL}, + {"MS_WHLR", MS_WHLR}, + {"MS_ACL0", MS_ACL0}, + {"MS_ACL1", MS_ACL1}, + {"MS_ACL2", MS_ACL2}, {"KC_EXLM", KC_EXLM}, {"KC_AT", KC_AT}, {"KC_HASH", KC_HASH}, diff --git a/keyboards/rominronin/katana60/rev1/keymaps/colemak/keymap.c b/keyboards/rominronin/katana60/rev1/keymaps/colemak/keymap.c index 29e9ddf825..34607fd5ed 100644 --- a/keyboards/rominronin/katana60/rev1/keymaps/colemak/keymap.c +++ b/keyboards/rominronin/katana60/rev1/keymaps/colemak/keymap.c @@ -42,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NUMB] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, DF(0), KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, _______, - _______, _______, _______, KC_MS_U, _______, _______, _______, KC_7, KC_8, KC_9, KC_PPLS, _______, _______, _______, - _______, KC_BTN2, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_4, KC_5, KC_6, KC_PPLS, _______, _______, _______, - _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, KC_1, KC_2, KC_3, KC_PENT, _______, _______, _______, - _______, _______, _______, _______, KC_BTN1, _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______ + _______, _______, _______, MS_UP, _______, _______, _______, KC_7, KC_8, KC_9, KC_PPLS, _______, _______, _______, + _______, MS_BTN2, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, KC_4, KC_5, KC_6, KC_PPLS, _______, _______, _______, + _______, _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, KC_1, KC_2, KC_3, KC_PENT, _______, _______, _______, + _______, _______, _______, _______, MS_BTN1, _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______ ), [SYMB] = LAYOUT( QK_BOOT, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -56,8 +56,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [CURS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, KC_WH_U, _______, _______, _______, _______, _______, _______, K_PRVWD, KC_UP, K_NXTWD, _______, _______, - _______, KC_LCTL, KC_WH_D, KC_LSFT, _______, _______, _______, _______, KC_BSPC, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, _______, + _______, _______, MS_WHLU, _______, _______, _______, _______, _______, _______, K_PRVWD, KC_UP, K_NXTWD, _______, _______, + _______, KC_LCTL, MS_WHLD, KC_LSFT, _______, _______, _______, _______, KC_BSPC, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, _______, _______, UNDO, CUT, COPY, PASTE, _______, _______, _______, _______, _______, K_LSTRT, _______, K_LEND, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/rominronin/katana60/rev1/keymaps/default/keymap.c b/keyboards/rominronin/katana60/rev1/keymaps/default/keymap.c index 20ed993ade..1da40aa611 100644 --- a/keyboards/rominronin/katana60/rev1/keymaps/default/keymap.c +++ b/keyboards/rominronin/katana60/rev1/keymaps/default/keymap.c @@ -42,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NUMB] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, DF(0), KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, _______, - _______, _______, _______, KC_MS_U, _______, _______, _______, KC_7, KC_8, KC_9, KC_PPLS, _______, _______, _______, - _______, KC_BTN2, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_4, KC_5, KC_6, KC_PPLS, _______, _______, _______, - _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, KC_1, KC_2, KC_3, KC_PENT, _______, _______, _______, - _______, _______, _______, _______, KC_BTN1, _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______ + _______, _______, _______, MS_UP, _______, _______, _______, KC_7, KC_8, KC_9, KC_PPLS, _______, _______, _______, + _______, MS_BTN2, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, KC_4, KC_5, KC_6, KC_PPLS, _______, _______, _______, + _______, _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, KC_1, KC_2, KC_3, KC_PENT, _______, _______, _______, + _______, _______, _______, _______, MS_BTN1, _______, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______ ), [SYMB] = LAYOUT( QK_BOOT, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -56,8 +56,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [CURS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, KC_WH_U, _______, _______, _______, _______, _______, _______, K_PRVWD, KC_UP, K_NXTWD, _______, _______, - _______, KC_LCTL, KC_WH_D, KC_LSFT, _______, _______, _______, _______, KC_BSPC, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, _______, + _______, _______, MS_WHLU, _______, _______, _______, _______, _______, _______, K_PRVWD, KC_UP, K_NXTWD, _______, _______, + _______, KC_LCTL, MS_WHLD, KC_LSFT, _______, _______, _______, _______, KC_BSPC, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, _______, _______, UNDO, CUT, COPY, PASTE, _______, _______, _______, _______, _______, K_LSTRT, _______, K_LEND, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) diff --git a/keyboards/rominronin/katana60/rev2/keymaps/default/keymap.c b/keyboards/rominronin/katana60/rev2/keymaps/default/keymap.c index ee057c5c11..0964f0ebab 100644 --- a/keyboards/rominronin/katana60/rev2/keymaps/default/keymap.c +++ b/keyboards/rominronin/katana60/rev2/keymaps/default/keymap.c @@ -43,9 +43,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [NUMB] = LAYOUT_1_a( _______, _______, _______, _______, _______, _______, _______, DF(0), _______, _______, KC_PEQL, KC_PSLS, KC_PAST, _______, _______, - _______, _______, _______, KC_MS_U, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, - _______, KC_BTN2, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, - _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, + _______, _______, _______, MS_UP, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, + _______, MS_BTN2, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, + _______, _______, MS_ACL0, MS_ACL1, MS_ACL2, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, _______, KC_P0, _______, _______, KC_PDOT, KC_PENT, _______, _______ ), [SYMB] = LAYOUT_1_a( diff --git a/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c b/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c index 21889f2fe6..9c2917fac1 100644 --- a/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c +++ b/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c @@ -33,9 +33,9 @@ LT(_ADJUST, KC_BSPC), KC_UP,TG(_BROWSER), //|-------------------------------------------| TG(_MOUSE), //|---------------+---------------+-----------| - KC_BTN1, KC_MS_U, KC_BTN2, + MS_BTN1, MS_UP, MS_BTN2, //|---------------+---------------+-----------| - KC_MS_L, KC_MS_D, KC_MS_R + MS_LEFT, MS_DOWN, MS_RGHT //|-------------------------------------------| ), @@ -43,9 +43,9 @@ LT(_ADJUST, KC_BSPC), KC_UP,TG(_BROWSER), //|-------------------------------------------| LCTL(KC_W), //|---------------+---------------+-----------| - LCTL(LSFT(KC_T)), KC_WH_U,TG(_BROWSER), + LCTL(LSFT(KC_T)), MS_WHLU,TG(_BROWSER), //|---------------+---------------+-----------| - LCTL(LSFT(KC_TAB)), KC_WH_D,LCTL(KC_TAB) + LCTL(LSFT(KC_TAB)), MS_WHLD,LCTL(KC_TAB) //|-------------------------------------------| ), diff --git a/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c index 6dd300f9db..4c5b7656d1 100644 --- a/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c +++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c @@ -43,9 +43,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------| KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, TG(_MOUSE), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BTN1, KC_MS_U, KC_BTN2, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, MS_BTN1, MS_UP, MS_BTN2, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_MS_L, KC_MS_D, KC_MS_R, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, MS_LEFT, MS_DOWN, MS_RGHT, //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------------------------| MO(_ADJUST),KC_LCTL, KC_LALT, KC_LGUI,MO(_LOWER),KC_SPC,KC_SPC,MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT //`------------------------------------------------------------------------------------------------------------' @@ -55,9 +55,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------| KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, LCTL(KC_W), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,LCTL(LSFT(KC_T)),KC_WH_U,TG(_BROWSER), + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,LCTL(LSFT(KC_T)),MS_WHLU,TG(_BROWSER), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,LCTL(LSFT(KC_TAB)), KC_WH_D,LCTL(KC_TAB), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,LCTL(LSFT(KC_TAB)), MS_WHLD,LCTL(KC_TAB), //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |--------------------------| MO(_ADJUST),KC_LCTL, KC_LALT, KC_LGUI,MO(_LOWER),KC_SPC,KC_SPC,MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT //`------------------------------------------------------------------------------------------------------------' diff --git a/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c index ffc5a0ad62..7c0f96a076 100644 --- a/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c +++ b/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c @@ -80,9 +80,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. TG(_FLOCK), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, XXXXXXX,LALT(KC_PSCR), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, KC_PSCR, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL), //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| diff --git a/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c index 89c44f87a6..0db21f9bdc 100644 --- a/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c +++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c @@ -55,9 +55,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------| KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, TG(_MOUSE), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_UP, MS_BTN2, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------| _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -69,9 +69,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------| _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LCTL(KC_W), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,LCTL(LSFT(KC_T)),KC_WH_U,TG(_BROWSER), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,LCTL(LSFT(KC_T)),MS_WHLU,TG(_BROWSER), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,LCTL(LSFT(KC_TAB)), KC_WH_D,LCTL(KC_TAB), + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,LCTL(LSFT(KC_TAB)), MS_WHLD,LCTL(KC_TAB), //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------| _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -111,9 +111,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |--------------------------| TG(_FLOCK), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, UG_VALD, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), _ADJUST, UG_SATD, UG_VALU, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, XXXXXXX,LALT(KC_PSCR), _ADJUST, UG_SATD, UG_VALU, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, UG_NEXT, UG_TOGG, UG_SATU, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, KC_PSCR, UG_NEXT, UG_TOGG, UG_SATU, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |--------------------------| _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL), //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| diff --git a/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c index 81c1c63541..07d2111b88 100644 --- a/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c +++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c @@ -86,9 +86,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,-----------------------------------------------------| |-----------------------------------------------------. |-----------------------------------------------| TG(_FLOCK), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,UG_VALD,UG_HUED,UG_SATD,XXXXXXX,_______, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX,LALT(KC_PSCR), UG_VALU,UG_HUEU,UG_SATU,XXXXXXX,_______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, XXXXXXX,LALT(KC_PSCR), UG_VALU,UG_HUEU,UG_SATU,XXXXXXX,_______, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |-------+-------+-------+-------+-------+-------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PSCR, _______,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, KC_PSCR, _______,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| |---------------+---------------+-------+-------| _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,LCA(KC_DEL), UG_NEXT, UG_TOGG,_______,_______, //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| |-----------------------------------------------| diff --git a/keyboards/sergiopoverony/creator_pro/keymaps/default/keymap.c b/keyboards/sergiopoverony/creator_pro/keymaps/default/keymap.c index d29621929b..11ee5a85d7 100644 --- a/keyboards/sergiopoverony/creator_pro/keymaps/default/keymap.c +++ b/keyboards/sergiopoverony/creator_pro/keymaps/default/keymap.c @@ -39,9 +39,9 @@ bool encoder_update_user(uint8_t index, bool clockwise) { case _RED: if (clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } break; diff --git a/keyboards/shuguet/shu89/keymaps/default/keymap.json b/keyboards/shuguet/shu89/keymaps/default/keymap.json index 1725f3438e..12cdccf3db 100644 --- a/keyboards/shuguet/shu89/keymaps/default/keymap.json +++ b/keyboards/shuguet/shu89/keymaps/default/keymap.json @@ -13,8 +13,8 @@ ], [ "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "RGB_VAI", "RGB_VAD", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", - "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "RM_VALU", "RM_VALD", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", + "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RM_TOGG" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS" , "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_VOLU", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MPLY", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPRV", "KC_VOLD", "KC_MNXT" diff --git a/keyboards/signum/3_0/keymaps/default/keymap.c b/keyboards/signum/3_0/keymaps/default/keymap.c index 27f79e7692..76a349f713 100644 --- a/keyboards/signum/3_0/keymaps/default/keymap.c +++ b/keyboards/signum/3_0/keymaps/default/keymap.c @@ -750,9 +750,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ------------------------------------------------- */ LAYOUT_ortho_4x12( - KC_TRNS, KC_ACL1, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_WH_L, KC_MS_U, KC_WH_R, KC_NO, KC_NO, - KC_TRNS, KC_ACL2, KC_BTN2, KC_BTN3, KC_BTN1, KC_BTN1, KC_MS_L, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_NO, - KC_TRNS, KC_ACL0, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_MS_D, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, MS_ACL1, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLU, MS_WHLL, MS_UP, MS_WHLR, KC_NO, KC_NO, + KC_TRNS, MS_ACL2, MS_BTN2, MS_BTN3, MS_BTN1, MS_BTN1, MS_LEFT, MS_LEFT, MS_DOWN, MS_RGHT, KC_NO, KC_NO, + KC_TRNS, MS_ACL0, KC_NO, KC_NO, KC_NO, KC_NO, MS_WHLD, KC_NO, MS_DOWN, KC_NO, KC_NO, KC_TRNS, TG(6), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) }; diff --git a/keyboards/signum/3_0/keymaps/default/layout.py b/keyboards/signum/3_0/keymaps/default/layout.py index 4691985d29..b7c07eb6a4 100644 --- a/keyboards/signum/3_0/keymaps/default/layout.py +++ b/keyboards/signum/3_0/keymaps/default/layout.py @@ -380,12 +380,12 @@ qmk_dict = { # Layer Switching missing, Lx -> MO(x), Tx -> TG(x) "qwertz": "DF(0)", "neo": "DF(2)", # Mouse Keys - "^ Mouse": "KC_MS_U", "v Mouse": "KC_MS_D", "< Mouse": "KC_MS_L", - "> Mouse": "KC_MS_R", "Mouse 1": "KC_BTN1", "Mouse 2": "KC_BTN2", - "Mouse 3": "KC_BTN3", "Mouse 4": "KC_BTN4", "Mouse 5": "KC_BTN5", - "^ Wheel": "KC_WH_U", "v Wheel": "KC_WH_D", "< Wheel": "KC_WH_L", - "> Wheel": "KC_WH_R", "acc0": "KC_ACL0", "acc1": "KC_ACL1", - "acc2": "KC_ACL2", + "^ Mouse": "MS_UP", "v Mouse": "MS_DOWN", "< Mouse": "MS_LEFT", + "> Mouse": "MS_RGHT", "Mouse 1": "MS_BTN1", "Mouse 2": "MS_BTN2", + "Mouse 3": "MS_BTN3", "Mouse 4": "MS_BTN4", "Mouse 5": "MS_BTN5", + "^ Wheel": "MS_WHLU", "v Wheel": "MS_WHLD", "< Wheel": "MS_WHLL", + "> Wheel": "MS_WHLR", "acc0": "MS_ACL0", "acc1": "MS_ACL1", + "acc2": "MS_ACL2", # Modifiers missinng, add entry for each specific application # Mod-Tap Keys missing, add entry for each specific application "_Sh_swp": "LSFT_T(SH_TOGG)", diff --git a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json index 885faaf858..12ec8170fc 100644 --- a/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json +++ b/keyboards/splitkb/aurora/sweep/keymaps/default/keymap.json @@ -11,9 +11,9 @@ "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1" ], [ - "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", - "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", - "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "MS_BTN1" , "MS_WHLU" , "MS_BTN2" , "KC_TRNS", + "KC_TRNS" , "MS_BTN2" , "KC_NO" , "MS_BTN1" , "KC_TRNS" , "KC_TRNS" , "MS_LEFT" , "MS_DOWN" , "MS_UP" , "MS_RGHT", + "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "MS_WHLL" , "MS_WHLD" , "MS_WHLR" , "KC_TRNS", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" ], [ diff --git a/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json index 95748c743f..df28d96b42 100644 --- a/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json +++ b/keyboards/splitkb/halcyon/ferris/keymaps/default/keymap.json @@ -11,9 +11,9 @@ "KC_P0" , "KC_BSPC" , "LT(7,KC_SPC)" , "KC_P1" ], [ - "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "KC_BTN1" , "KC_WH_U" , "KC_BTN2" , "KC_TRNS", - "KC_TRNS" , "KC_BTN2" , "KC_NO" , "KC_BTN1" , "KC_TRNS" , "KC_TRNS" , "KC_MS_L" , "KC_MS_D" , "KC_MS_U" , "KC_MS_R", - "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "KC_WH_L" , "KC_WH_D" , "KC_WH_R" , "KC_TRNS", + "RM_TOGG" , "RM_NEXT" , "RM_HUEU" , "RM_SATU" , "RM_VALU" , "RM_SPDU" , "MS_BTN1" , "MS_WHLU" , "MS_BTN2" , "KC_TRNS", + "KC_TRNS" , "MS_BTN2" , "KC_NO" , "MS_BTN1" , "KC_TRNS" , "KC_TRNS" , "MS_LEFT" , "MS_DOWN" , "MS_UP" , "MS_RGHT", + "KC_TRNS" , "RM_PREV" , "RM_HUED" , "RM_SATD" , "RM_VALD" , "RM_SPDD" , "MS_WHLL" , "MS_WHLD" , "MS_WHLR" , "KC_TRNS", "KC_TRNS" , "KC_TRNS" , "KC_TRNS" , "KC_TRNS" ], [ diff --git a/keyboards/tada68/keymaps/default/keymap.c b/keyboards/tada68/keymaps/default/keymap.c index fcc37aff6c..f4fa3a95d3 100755 --- a/keyboards/tada68/keymaps/default/keymap.c +++ b/keyboards/tada68/keymaps/default/keymap.c @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, 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, _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, - _______, _______, _______, BL_DOWN, BL_TOGG, BL_UP, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2, - _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + _______, _______, _______, BL_DOWN, BL_TOGG, BL_UP, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, MS_BTN1, MS_UP, MS_BTN2, + _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), }; diff --git a/keyboards/tada68/keymaps/rgb/keymap.c b/keyboards/tada68/keymaps/rgb/keymap.c index 0f2186b0b3..7f57c9ddfb 100755 --- a/keyboards/tada68/keymaps/rgb/keymap.c +++ b/keyboards/tada68/keymaps/rgb/keymap.c @@ -45,6 +45,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, 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 , _______,_______,KC_UP,_______,_______, UG_TOGG,UG_NEXT,UG_HUEU,UG_HUED,UG_SATU,UG_SATD,UG_VALU,UG_VALD, _______,KC_HOME, _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, - _______,_______,_______,BL_DOWN,BL_TOGG,BL_UP, _______,KC_VOLD,KC_VOLU,KC_MUTE,_______,KC_BTN1, KC_MS_U, KC_BTN2, - _______,_______,_______, _______, _______,_______,_______,KC_MS_L,KC_MS_D, KC_MS_R), + _______,_______,_______,BL_DOWN,BL_TOGG,BL_UP, _______,KC_VOLD,KC_VOLU,KC_MUTE,_______,MS_BTN1, MS_UP, MS_BTN2, + _______,_______,_______, _______, _______,_______,_______,MS_LEFT,MS_DOWN, MS_RGHT), }; diff --git a/keyboards/takashicompany/baumkuchen/baumkuchen.c b/keyboards/takashicompany/baumkuchen/baumkuchen.c index 7d4f26b73e..e7cc85f091 100644 --- a/keyboards/takashicompany/baumkuchen/baumkuchen.c +++ b/keyboards/takashicompany/baumkuchen/baumkuchen.c @@ -10,9 +10,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } if (clockwise) { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } else { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } return true; diff --git a/keyboards/takashicompany/center_enter/keymaps/default/keymap.c b/keyboards/takashicompany/center_enter/keymaps/default/keymap.c index 82fafc41c7..a6d9ab43a6 100644 --- a/keyboards/takashicompany/center_enter/keymaps/default/keymap.c +++ b/keyboards/takashicompany/center_enter/keymaps/default/keymap.c @@ -88,9 +88,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool encoder_update_user(uint8_t index, bool clockwise) { if (clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } return true; diff --git a/keyboards/takashicompany/compacx/compacx.c b/keyboards/takashicompany/compacx/compacx.c index 5a63210c5b..5f4a262273 100644 --- a/keyboards/takashicompany/compacx/compacx.c +++ b/keyboards/takashicompany/compacx/compacx.c @@ -19,9 +19,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { if (!encoder_update_user(index, clockwise)) { return false; } if (!clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } return true; diff --git a/keyboards/takashicompany/dogtag/keymaps/default/keymap.c b/keyboards/takashicompany/dogtag/keymaps/default/keymap.c index c109ee4093..9c966137e7 100644 --- a/keyboards/takashicompany/dogtag/keymaps/default/keymap.c +++ b/keyboards/takashicompany/dogtag/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) }, + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(MS_WHLU, MS_WHLD) }, [1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, }; #endif diff --git a/keyboards/takashicompany/goat51/keymaps/default/keymap.c b/keyboards/takashicompany/goat51/keymaps/default/keymap.c index 39267f596c..71d623c91f 100644 --- a/keyboards/takashicompany/goat51/keymaps/default/keymap.c +++ b/keyboards/takashicompany/goat51/keymaps/default/keymap.c @@ -114,9 +114,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool encoder_update_user(uint8_t index, bool clockwise) { if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } return true; diff --git a/keyboards/takashicompany/jourkey/keymaps/default/keymap.c b/keyboards/takashicompany/jourkey/keymaps/default/keymap.c index fa642bc6e2..62650eb777 100644 --- a/keyboards/takashicompany/jourkey/keymaps/default/keymap.c +++ b/keyboards/takashicompany/jourkey/keymaps/default/keymap.c @@ -13,6 +13,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/takashicompany/qoolee/keymaps/default/keymap.c b/keyboards/takashicompany/qoolee/keymaps/default/keymap.c index 04595e49c1..7c6f68ee5e 100644 --- a/keyboards/takashicompany/qoolee/keymaps/default/keymap.c +++ b/keyboards/takashicompany/qoolee/keymaps/default/keymap.c @@ -69,9 +69,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (clockwise) { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } else { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } return true; diff --git a/keyboards/takashicompany/spreadwriter/keymaps/default/keymap.c b/keyboards/takashicompany/spreadwriter/keymaps/default/keymap.c index 83572b124b..5858e9d8b1 100644 --- a/keyboards/takashicompany/spreadwriter/keymaps/default/keymap.c +++ b/keyboards/takashicompany/spreadwriter/keymaps/default/keymap.c @@ -81,9 +81,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { bool encoder_update_user(uint8_t index, bool clockwise) { if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } return false; } diff --git a/keyboards/thumbsup/keymaps/default/keymap.c b/keyboards/thumbsup/keymaps/default/keymap.c index 04a16a5081..e9fb913248 100644 --- a/keyboards/thumbsup/keymaps/default/keymap.c +++ b/keyboards/thumbsup/keymaps/default/keymap.c @@ -98,9 +98,9 @@ without separate thumbcluster. * `-------------------------------------------------------' */ [_CURSORRGHT] = LAYOUT( - _______, KC_BRK, KC_WH_D, KC_MS_U, KC_WH_U, KC_DEL, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_GRV, KC_DEL, - KC_ENT, LCTL(KC_A), KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, _______, - _______, LCTL(KC_Z), LSFT(KC_DEL), LCTL(KC_INS), LSFT(KC_INS), XXXXXXX, KC_INS, KC_BTN1, KC_BTN3, KC_BTN2, XXXXXXX, _______, + _______, KC_BRK, MS_WHLD, MS_UP, MS_WHLU, KC_DEL, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_GRV, KC_DEL, + KC_ENT, LCTL(KC_A), MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, _______, + _______, LCTL(KC_Z), LSFT(KC_DEL), LCTL(KC_INS), LSFT(KC_INS), XXXXXXX, KC_INS, MS_BTN1, MS_BTN3, MS_BTN2, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -118,9 +118,9 @@ without separate thumbcluster. * `-------------------------------------------------------' */ [_CURSORLEFT] = LAYOUT( - _______, KC_BRK, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_DEL, KC_WH_U, KC_MS_U, KC_WH_D, KC_GRV, KC_DEL, - KC_ENT, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, _______, - _______, XXXXXXX, KC_BTN2, KC_BTN3, KC_BTN1, KC_INS, XXXXXXX, LCTL(KC_DEL), LCTL(KC_INS), LSFT(KC_INS), XXXXXXX, _______, + _______, KC_BRK, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_DEL, MS_WHLU, MS_UP, MS_WHLD, KC_GRV, KC_DEL, + KC_ENT, LCTL(KC_A), KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX, MS_LEFT, MS_DOWN, MS_RGHT, XXXXXXX, _______, + _______, XXXXXXX, MS_BTN2, MS_BTN3, MS_BTN1, KC_INS, XXXXXXX, LCTL(KC_DEL), LCTL(KC_INS), LSFT(KC_INS), XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/toffee_studio/blueberry/keymaps/default/keymap.c b/keyboards/toffee_studio/blueberry/keymaps/default/keymap.c index ee26853885..11bc271ea1 100644 --- a/keyboards/toffee_studio/blueberry/keymaps/default/keymap.c +++ b/keyboards/toffee_studio/blueberry/keymaps/default/keymap.c @@ -28,9 +28,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT( 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_BSPC, KC_DEL, - _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, UG_SPDU, - KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, UG_SPDD, - KC_WH_D, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, UG_VALU, UG_TOGG, + _______, MS_BTN1, MS_UP, MS_BTN2, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, UG_SPDU, + MS_WHLU, MS_LEFT, MS_DOWN, MS_RGHT, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, UG_SPDD, + MS_WHLD, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, UG_VALU, UG_TOGG, _______, _______, _______, KC_SPC, MO(2), _______, UG_PREV, UG_VALD, UG_NEXT ), diff --git a/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c b/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c index 291f98a60e..756eb06506 100644 --- a/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c +++ b/keyboards/tominabox1/le_chiffre/keymaps/default/keymap.c @@ -59,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [_BASE] = {ENCODER_CCW_CW(KC_MNXT, KC_MPRV) }, - [_NUM_SYM] = { ENCODER_CCW_CW(KC_WH_D, KC_WH_U) }, + [_NUM_SYM] = { ENCODER_CCW_CW(MS_WHLD, MS_WHLU) }, [_NAV] = { ENCODER_CCW_CW(KC_PGDN, KC_PGUP) } }; #endif diff --git a/keyboards/tunks/ergo33/keymaps/default/keymap.c b/keyboards/tunks/ergo33/keymaps/default/keymap.c index 8f646f08ca..58e7b8ec27 100644 --- a/keyboards/tunks/ergo33/keymaps/default/keymap.c +++ b/keyboards/tunks/ergo33/keymaps/default/keymap.c @@ -49,9 +49,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } } return true; diff --git a/keyboards/tzarc/djinn/keymaps/default/keymap.c b/keyboards/tzarc/djinn/keymaps/default/keymap.c index b63e1624c7..2c6fb9e1db 100644 --- a/keyboards/tzarc/djinn/keymaps/default/keymap.c +++ b/keyboards/tzarc/djinn/keymaps/default/keymap.c @@ -63,10 +63,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // clang-format off const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LOWER] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU), ENCODER_CCW_CW(RM_SATD, RM_SATU) }, - [_RAISE] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, - [_ADJUST] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, + [_QWERTY] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_LOWER] = { ENCODER_CCW_CW(RM_HUED, RM_HUEU), ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [_RAISE] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(RM_SPDD, RM_SPDU) }, + [_ADJUST] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_LEFT, KC_RIGHT) }, }; // clang-format on diff --git a/keyboards/varanidae/keymaps/ansi/keymap.c b/keyboards/varanidae/keymaps/ansi/keymap.c index c020bd6718..94ebf62048 100644 --- a/keyboards/varanidae/keymaps/ansi/keymap.c +++ b/keyboards/varanidae/keymaps/ansi/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ansi( - KC_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, + MS_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, 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_PSLS, KC_P7, KC_P8, KC_P9, KC_HOME, 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_PAST, KC_P4, KC_P5, KC_P6, KC_END, KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/varanidae/keymaps/ansi_split_bs_rshift/keymap.c b/keyboards/varanidae/keymaps/ansi_split_bs_rshift/keymap.c index becb812071..fdc0d4c526 100644 --- a/keyboards/varanidae/keymaps/ansi_split_bs_rshift/keymap.c +++ b/keyboards/varanidae/keymaps/ansi_split_bs_rshift/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ansi_split_bs_rshift( - KC_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, + MS_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, 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_DEL, KC_BSPC, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_HOME, 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_PAST, KC_P4, KC_P5, KC_P6, KC_END, KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/varanidae/keymaps/default/keymap.c b/keyboards/varanidae/keymaps/default/keymap.c index 4c43532108..fff5411754 100644 --- a/keyboards/varanidae/keymaps/default/keymap.c +++ b/keyboards/varanidae/keymaps/default/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_all( - KC_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, + MS_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, 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_DEL, KC_BSPC, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_HOME, 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_PAST, KC_P4, KC_P5, KC_P6, KC_END, KC_LALT, 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, @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/varanidae/keymaps/iso/keymap.c b/keyboards/varanidae/keymaps/iso/keymap.c index b1f1b0c9a4..0de8eb6c23 100644 --- a/keyboards/varanidae/keymaps/iso/keymap.c +++ b/keyboards/varanidae/keymaps/iso/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_iso( - KC_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, + MS_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, 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_PSLS, KC_P7, KC_P8, KC_P9, KC_HOME, 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_PAST, KC_P4, KC_P5, KC_P6, KC_END, KC_LALT, 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, @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/varanidae/keymaps/iso_split_bs_rshift/keymap.c b/keyboards/varanidae/keymaps/iso_split_bs_rshift/keymap.c index 7324f62877..5d53eccab9 100644 --- a/keyboards/varanidae/keymaps/iso_split_bs_rshift/keymap.c +++ b/keyboards/varanidae/keymaps/iso_split_bs_rshift/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_iso_split_bs_rshift( - KC_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, + MS_BTN3, KC_F16, KC_F17, KC_F18, KC_F19, 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_F13, KC_F14, KC_F15, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, 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_DEL, KC_BSPC, KC_PSLS, KC_P7, KC_P8, KC_P9, KC_HOME, 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_PAST, KC_P4, KC_P5, KC_P6, KC_END, KC_LALT, 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, @@ -30,6 +30,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D) } + [0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD) } }; #endif diff --git a/keyboards/waterfowl/waterfowl.c b/keyboards/waterfowl/waterfowl.c index fb30fd0078..9d9b0bf467 100644 --- a/keyboards/waterfowl/waterfowl.c +++ b/keyboards/waterfowl/waterfowl.c @@ -23,9 +23,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } if (index == 0) { // Left roller if (clockwise) { - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); } else { - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); } } else if (index == 1) { // Left encoder if (clockwise) { @@ -35,9 +35,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } } else if (index == 2) { // Right roller if (clockwise) { - tap_code16(S(KC_MS_WH_DOWN)); + tap_code16(S(MS_WHLD)); } else { - tap_code16(S(KC_MS_WH_UP)); + tap_code16(S(MS_WHLU)); } } else if (index == 3) { // Right encoder if (clockwise) { diff --git a/keyboards/wolf/frogpad/keymaps/default/keymap.c b/keyboards/wolf/frogpad/keymaps/default/keymap.c index adc4cf77e8..236afeab06 100644 --- a/keyboards/wolf/frogpad/keymaps/default/keymap.c +++ b/keyboards/wolf/frogpad/keymaps/default/keymap.c @@ -42,7 +42,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_LAYER0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LAYER1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) } + [_LAYER0] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_LAYER1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS), ENCODER_CCW_CW(KC_TRNS, KC_TRNS) } }; #endif \ No newline at end of file diff --git a/keyboards/work_louder/micro/micro.c b/keyboards/work_louder/micro/micro.c index 07ab92f7a7..f88ac8bb45 100644 --- a/keyboards/work_louder/micro/micro.c +++ b/keyboards/work_louder/micro/micro.c @@ -39,9 +39,9 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { } } else if (index == 1) { if (clockwise) { - tap_code_delay(KC_WH_U, 10); + tap_code_delay(MS_WHLU, 10); } else { - tap_code_delay(KC_WH_D, 10); + tap_code_delay(MS_WHLD, 10); } } return true; diff --git a/keyboards/xdboards/recon/recon.c b/keyboards/xdboards/recon/recon.c index 708c9d894c..823f3df7bf 100644 --- a/keyboards/xdboards/recon/recon.c +++ b/keyboards/xdboards/recon/recon.c @@ -101,13 +101,13 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { // Page up/Page down if (clockwise) { #ifdef MOUSEKEY_ENABLE - tap_code(KC_WH_U); + tap_code(MS_WHLU); #else tap_code(KC_PGUP); #endif } else { #ifdef MOUSEKEY_ENABLE - tap_code(KC_WH_D); + tap_code(MS_WHLD); #else tap_code(KC_PGDN); #endif diff --git a/keyboards/xiudi/xd60/keymaps/ansi_split_bs_rshift_space/keymap.c b/keyboards/xiudi/xd60/keymaps/ansi_split_bs_rshift_space/keymap.c index ad54ef0c86..e3a54e714e 100644 --- a/keyboards/xiudi/xd60/keymaps/ansi_split_bs_rshift_space/keymap.c +++ b/keyboards/xiudi/xd60/keymaps/ansi_split_bs_rshift_space/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_60_ansi_split_bs_rshift_space( QK_BOOT, 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_F13, KC_F14, - KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, + KC_NO, MS_WHLU, KC_UP, MS_WHLD, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP,KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_PGDN, KC_RSFT, KC_PGUP, KC_INS, KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, KC_SPC, KC_ESC, KC_RGUI, MO(1), KC_HOME, KC_PGDN, KC_END diff --git a/keyboards/xiudi/xd60/keymaps/default/keymap.c b/keyboards/xiudi/xd60/keymaps/default/keymap.c index af133d9b3a..f6dce2c5c7 100644 --- a/keyboards/xiudi/xd60/keymaps/default/keymap.c +++ b/keyboards/xiudi/xd60/keymaps/default/keymap.c @@ -13,7 +13,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // 1: Function Layer LAYOUT_all( QK_BOOT, 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_F13, KC_F14, - KC_NO, KC_WH_U, KC_UP, KC_WH_D, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, + KC_NO, MS_WHLU, KC_UP, MS_WHLD, KC_BSPC,KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SCRL, KC_PAUS, KC_DEL, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT,KC_DEL, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP,KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_PGDN, KC_RSFT, KC_PGUP, KC_INS, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, MO(1), KC_HOME, KC_PGDN, KC_END), diff --git a/keyboards/yanghu/unicorne/keymaps/default/keymap.c b/keyboards/yanghu/unicorne/keymaps/default/keymap.c index 48e3b9a343..590f4a16ba 100644 --- a/keyboards/yanghu/unicorne/keymaps/default/keymap.c +++ b/keyboards/yanghu/unicorne/keymaps/default/keymap.c @@ -59,13 +59,13 @@ bool encoder_update_user(uint8_t index, bool clockwise) { if (index == 0) { if (clockwise) { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_DOWN); + tap_code(MS_WHLD); #else tap_code(KC_PGDN); #endif } else { #ifdef MOUSEKEY_ENABLE - tap_code(KC_MS_WH_UP); + tap_code(MS_WHLU); #else tap_code(KC_PGUP); #endif diff --git a/keyboards/ydkb/grape/keymaps/default/keymap.c b/keyboards/ydkb/grape/keymaps/default/keymap.c index 62a9e55433..d468c44028 100644 --- a/keyboards/ydkb/grape/keymaps/default/keymap.c +++ b/keyboards/ydkb/grape/keymaps/default/keymap.c @@ -24,6 +24,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_P0, KC_P0, KC_PDOT, KC_PENT, 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_F13, KC_F14, KC_F15, 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, KC_RSFT, KC_UP, KC_F16, KC_F17, KC_F18, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_BTN1, KC_BTN2 + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, MS_BTN1, MS_BTN2 ) }; diff --git a/keyboards/ymdk/yd60mq/keymaps/iso/keymap.c b/keyboards/ymdk/yd60mq/keymaps/iso/keymap.c index 9c437680df..310549c07d 100644 --- a/keyboards/ymdk/yd60mq/keymaps/iso/keymap.c +++ b/keyboards/ymdk/yd60mq/keymaps/iso/keymap.c @@ -19,8 +19,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,: Function Layer [1] = LAYOUT_60_iso( 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, - XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_HOME, KC_PSCR, - KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, UG_HUEU, UG_SATU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, XXXXXXX, KC_MNXT, + XXXXXXX, MS_BTN1, MS_UP, MS_BTN2, MS_WHLU, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_HOME, KC_PSCR, + KC_TRNS, MS_LEFT, MS_DOWN, MS_RGHT, MS_WHLD, UG_HUEU, UG_SATU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, XXXXXXX, KC_MNXT, KC_TRNS, UG_NEXT, UG_PREV, UG_VALU, UG_VALD, UG_HUED, UG_SATD, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MPRV, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_SPDU, UG_SPDD, XXXXXXX, KC_TRNS ) diff --git a/keyboards/yushakobo/navpad/10/keymaps/default/keymap.c b/keyboards/yushakobo/navpad/10/keymaps/default/keymap.c index a0c62cc4ce..c0e194aeda 100644 --- a/keyboards/yushakobo/navpad/10/keymaps/default/keymap.c +++ b/keyboards/yushakobo/navpad/10/keymaps/default/keymap.c @@ -29,9 +29,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, EE_CLR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NUM, KC_QUOT, KC_PEQL, KC_NO, KC_CAPS, KC_NUM, KC_SCRL, S(KC_9), KC_UP, S(KC_0), S(KC_SPC), - KC_LEFT, KC_BTN3, KC_RGHT, S(KC_SPC), + KC_LEFT, MS_BTN3, KC_RGHT, S(KC_SPC), KC_TRNS, S(KC_ENT), KC_TRNS, KC_BSPC, KC_DOWN, KC_DEL, KC_TRNS, - KC_BTN1, KC_ENT, S(KC_SPC),LT(2,KC_SPC),KC_SPC, KC_COMM, KC_TRNS + MS_BTN1, KC_ENT, S(KC_SPC),LT(2,KC_SPC),KC_SPC, KC_COMM, KC_TRNS ), [_FN2] =LAYOUT ( diff --git a/keyboards/yushakobo/navpad/10/keymaps/default/readme.md b/keyboards/yushakobo/navpad/10/keymaps/default/readme.md index b9cf727e24..42e3df9506 100644 --- a/keyboards/yushakobo/navpad/10/keymaps/default/readme.md +++ b/keyboards/yushakobo/navpad/10/keymaps/default/readme.md @@ -25,11 +25,11 @@ |----------+----------+----------+----------+-----------+----------+---------------| | KC_CAPS | KC_NUM | KC_SCRL | S(KC_9) | KC_UP | S(KC_0) | S(KC_SPC) | `--------------------------------+----------+-----------+----------+---------------| - | KC_LEFT | KC_BTN3 | KC_RGHT | S(KC_SPC) | + | KC_LEFT | MS_BTN3 | KC_RGHT | S(KC_SPC) | ,--------------------------------+----------+-----------+----------+---------------| | KC_TRNS | S(KC_ENT)| KC_TRNS | KC_BSPC | KC_DOWN | KC_DEL | KC_TRNS | |----------+----------+----------+----------+-----------+----------+---------------| - | KC_BTN1 | KC_ENT |S(KC_SPC)|LT(2,KC_SPC)|KC_SPC | KC_COMM | KC_TRNS | + | MS_BTN1 | KC_ENT |S(KC_SPC)|LT(2,KC_SPC)|KC_SPC | KC_COMM | KC_TRNS | '----------------------------------------------------------------------------------` ``` ### FN2 layer diff --git a/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/keymap.c b/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/keymap.c index 5c5d1110a1..18c34677d0 100644 --- a/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/keymap.c +++ b/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/keymap.c @@ -31,9 +31,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { QK_BOOT, EE_CLR, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NUM, KC_QUOT, KC_PEQL, KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL, KC_CAPS, KC_NUM, KC_SCRL, S(KC_9), KC_UP, S(KC_0), S(KC_SPC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, - KC_LEFT, KC_BTN3, KC_RGHT, S(KC_SPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_QUOT, + KC_LEFT, MS_BTN3, KC_RGHT, S(KC_SPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_QUOT, KC_TRNS, S(KC_ENT), KC_TRNS, KC_BSPC, KC_DOWN, KC_DEL, KC_TRNS, KC_RBRC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_BTN1, KC_ENT, S(KC_SPC),LT(2,KC_SPC),KC_SPC, KC_COMM, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + MS_BTN1, KC_ENT, S(KC_SPC),LT(2,KC_SPC),KC_SPC, KC_COMM, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), [_FN2] =LAYOUT ( diff --git a/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/readme.md b/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/readme.md index 48eeee421f..f18c01d8ef 100644 --- a/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/readme.md +++ b/keyboards/yushakobo/navpad/10_helix_r/keymaps/default/readme.md @@ -25,11 +25,11 @@ `--------------------------------+----------+-----------+----------+---------------| |------------+----------+-----------+-----------+-----------+-----------| | KC_CAPS | KC_NUM | KC_SCRL | S(KC_9) | KC_UP | S(KC_0) | S(KC_SPC) | | KC_Q | KC_W | KC_E | KC_R | KC_T | KC_BSPC | `--------------------------------+----------+-----------+----------+---------------| |------------+----------+-----------+-----------+-----------+-----------| - | KC_LEFT | KC_BTN3 | KC_RGHT | S(KC_SPC) | | KC_A | KC_S | KC_D | KC_F | KC_G | KC_QUOT | + | KC_LEFT | MS_BTN3 | KC_RGHT | S(KC_SPC) | | KC_A | KC_S | KC_D | KC_F | KC_G | KC_QUOT | ,--------------------------------+----------+-----------+----------+---------------| ,-------------+------------+----------+-----------+-----------+-----------+-----------| | KC_TRNS | S(KC_ENT)| KC_TRNS | KC_BSPC | KC_DOWN | KC_DEL | KC_TRNS | | KC_RBRC | KC_Z | KC_X | KC_C | KC_V | KC_B | KC_ENT | |----------+----------+----------+----------+-----------+----------+---------------| |-------------+------------+----------+-----------+-----------+-----------+-----------| - | KC_BTN1 | KC_ENT |S(KC_SPC)|LT(2,KC_SPC)|KC_SPC | KC_COMM | KC_TRNS | | KC_TRNS | KC_TRNS | KC_NO | KC_LEFT | KC_DOWN | KC_UP | KC_RGHT | + | MS_BTN1 | KC_ENT |S(KC_SPC)|LT(2,KC_SPC)|KC_SPC | KC_COMM | KC_TRNS | | KC_TRNS | KC_TRNS | KC_NO | KC_LEFT | KC_DOWN | KC_UP | KC_RGHT | '----------------------------------------------------------------------------------` '-------------------------------------------------------------------------------------` ``` ### FN2 layer diff --git a/keyboards/yushakobo/quick17/keymaps/default/keymap.c b/keyboards/yushakobo/quick17/keymaps/default/keymap.c index 80e1b04ca5..8b3cd6fff1 100644 --- a/keyboards/yushakobo/quick17/keymaps/default/keymap.c +++ b/keyboards/yushakobo/quick17/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT,KC_X, KC_V, KC_B, LT(2,KC_SPC),LCTL(KC_S) ), [_EDIT2] = LAYOUT( - KC_ESC, KC_Q, KC_BTN3,KC_INS, KC_ENT, KC_DEL, + KC_ESC, KC_Q, MS_BTN3,KC_INS, KC_ENT, KC_DEL, KC_LCTL,KC_LBRC,KC_RBRC,KC_PGDN,KC_PGUP,LCTL(KC_Y), KC_LSFT,TO(3), RM_TOGG,TO(0), _______,KC_NO ), @@ -92,9 +92,9 @@ bool encoder_update_user(uint8_t index, bool clockwise){ } } else { // IS_LAYER_ON(_CONTROL) if (clockwise) { - tap_code(KC_WH_U); + tap_code(MS_WHLU); } else { - tap_code(KC_WH_D); + tap_code(MS_WHLD); } } } diff --git a/keyboards/zsa/moonlander/keymaps/default/keymap.c b/keyboards/zsa/moonlander/keymaps/default/keymap.c index 338e8e4f97..899b2d559b 100644 --- a/keyboards/zsa/moonlander/keymaps/default/keymap.c +++ b/keyboards/zsa/moonlander/keymaps/default/keymap.c @@ -53,10 +53,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MDIA] = LAYOUT( LED_LEVEL,_______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, - _______, _______, _______, KC_MS_U, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, + _______, _______, _______, MS_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, MS_LEFT, MS_DOWN, MS_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, _______, _______, - _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, + _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______ ), }; diff --git a/layouts/default/ortho_5x13/default_ortho_5x13/keymap.c b/layouts/default/ortho_5x13/default_ortho_5x13/keymap.c index 11958f3700..1ab20cdc25 100644 --- a/layouts/default/ortho_5x13/default_ortho_5x13/keymap.c +++ b/layouts/default/ortho_5x13/default_ortho_5x13/keymap.c @@ -26,16 +26,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [1] = LAYOUT_ortho_5x13( KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , KC_EQL , - KC_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, KC_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_U, _______ , - _______, KC_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + MS_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + _______, MS_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_UP, _______ , + _______, MS_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), [2] = LAYOUT_ortho_5x13( 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 , _______, _______, _______, _______, QK_RBT, _______, _______, _______, _______, _______, _______, _______, _______ , KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, KC_WH_U, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R + _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, MS_WHLU, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR ), }; diff --git a/layouts/default/ortho_6x13/default_ortho_6x13/keymap.c b/layouts/default/ortho_6x13/default_ortho_6x13/keymap.c index 2fa8f2acce..013b3ba987 100644 --- a/layouts/default/ortho_6x13/default_ortho_6x13/keymap.c +++ b/layouts/default/ortho_6x13/default_ortho_6x13/keymap.c @@ -30,17 +30,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_ortho_6x13( KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - KC_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, KC_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_U, _______ , - _______, KC_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + MS_BTN3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + MS_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , + _______, MS_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_UP, _______ , + _______, MS_BTN4, _______, _______, _______, _______, _______, _______, _______, _______, MS_LEFT, MS_DOWN, MS_RGHT ), [2] = LAYOUT_ortho_6x13( 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 , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, QK_RBT, _______, _______, _______, _______, _______, _______, _______, _______ , KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , - _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, KC_WH_U, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R + _______, _______, _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, MS_WHLU, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MS_WHLL, MS_WHLD, MS_WHLR ), }; diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h index 58dc2fe6f6..e417591fe2 100644 --- a/quantum/quantum_keycodes_legacy.h +++ b/quantum/quantum_keycodes_legacy.h @@ -3,59 +3,6 @@ // clang-format off // Deprecated Quantum keycodes -#define RGB_TOG QK_UNDERGLOW_TOGGLE -#define RGB_MOD QK_UNDERGLOW_MODE_NEXT -#define RGB_MODE_FORWARD QK_UNDERGLOW_MODE_NEXT -#define RGB_RMOD QK_UNDERGLOW_MODE_PREVIOUS -#define RGB_MODE_REVERSE QK_UNDERGLOW_MODE_PREVIOUS -#define RGB_HUI QK_UNDERGLOW_HUE_UP -#define RGB_HUD QK_UNDERGLOW_HUE_DOWN -#define RGB_SAI QK_UNDERGLOW_SATURATION_UP -#define RGB_SAD QK_UNDERGLOW_SATURATION_DOWN -#define RGB_VAI QK_UNDERGLOW_VALUE_UP -#define RGB_VAD QK_UNDERGLOW_VALUE_DOWN -#define RGB_SPI QK_UNDERGLOW_SPEED_UP -#define RGB_SPD QK_UNDERGLOW_SPEED_DOWN - -#define KC_MS_UP QK_MOUSE_CURSOR_UP -#define KC_MS_U QK_MOUSE_CURSOR_UP -#define KC_MS_DOWN QK_MOUSE_CURSOR_DOWN -#define KC_MS_D QK_MOUSE_CURSOR_DOWN -#define KC_MS_LEFT QK_MOUSE_CURSOR_LEFT -#define KC_MS_L QK_MOUSE_CURSOR_LEFT -#define KC_MS_RIGHT QK_MOUSE_CURSOR_RIGHT -#define KC_MS_R QK_MOUSE_CURSOR_RIGHT -#define KC_MS_BTN1 QK_MOUSE_BUTTON_1 -#define KC_BTN1 QK_MOUSE_BUTTON_1 -#define KC_MS_BTN2 QK_MOUSE_BUTTON_2 -#define KC_BTN2 QK_MOUSE_BUTTON_2 -#define KC_MS_BTN3 QK_MOUSE_BUTTON_3 -#define KC_BTN3 QK_MOUSE_BUTTON_3 -#define KC_MS_BTN4 QK_MOUSE_BUTTON_4 -#define KC_BTN4 QK_MOUSE_BUTTON_4 -#define KC_MS_BTN5 QK_MOUSE_BUTTON_5 -#define KC_BTN5 QK_MOUSE_BUTTON_5 -#define KC_MS_BTN6 QK_MOUSE_BUTTON_6 -#define KC_BTN6 QK_MOUSE_BUTTON_6 -#define KC_MS_BTN7 QK_MOUSE_BUTTON_7 -#define KC_BTN7 QK_MOUSE_BUTTON_7 -#define KC_MS_BTN8 QK_MOUSE_BUTTON_8 -#define KC_BTN8 QK_MOUSE_BUTTON_8 -#define KC_MS_WH_UP QK_MOUSE_WHEEL_UP -#define KC_WH_U QK_MOUSE_WHEEL_UP -#define KC_MS_WH_DOWN QK_MOUSE_WHEEL_DOWN -#define KC_WH_D QK_MOUSE_WHEEL_DOWN -#define KC_MS_WH_LEFT QK_MOUSE_WHEEL_LEFT -#define KC_WH_L QK_MOUSE_WHEEL_LEFT -#define KC_MS_WH_RIGHT QK_MOUSE_WHEEL_RIGHT -#define KC_WH_R QK_MOUSE_WHEEL_RIGHT -#define KC_MS_ACCEL0 QK_MOUSE_ACCELERATION_0 -#define KC_ACL0 QK_MOUSE_ACCELERATION_0 -#define KC_MS_ACCEL1 QK_MOUSE_ACCELERATION_1 -#define KC_ACL1 QK_MOUSE_ACCELERATION_1 -#define KC_MS_ACCEL2 QK_MOUSE_ACCELERATION_2 -#define KC_ACL2 QK_MOUSE_ACCELERATION_2 - #define QK_OUTPUT_AUTO OU_AUTO #define C_S_T(kc) LCS_T(kc) diff --git a/tests/pointing/test_pointing.cpp b/tests/pointing/test_pointing.cpp index bd886b18a2..6de6ad30f0 100644 --- a/tests/pointing/test_pointing.cpp +++ b/tests/pointing/test_pointing.cpp @@ -131,7 +131,7 @@ TEST_F(Pointing, CorrectButtonIsReportedWhenPressed) { TEST_F(Pointing, CorrectButtonIsReportedWhenKeyPressed) { TestDriver driver; - auto key = KeymapKey(0, 0, 0, KC_MS_BTN1); + auto key = KeymapKey(0, 0, 0, QK_MOUSE_BUTTON_1); set_keymap({key}); EXPECT_MOUSE_REPORT(driver, (0, 0, 0, 0, 1)); From 5ef791902201111feb3f976cfbce8755b0be66b0 Mon Sep 17 00:00:00 2001 From: obosob Date: Fri, 11 Jul 2025 23:55:21 +0100 Subject: [PATCH 496/592] Give mouse report to pointing_device_task_user first in ploopyco devices (#25475) --- keyboards/ploopyco/ploopyco.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/ploopyco/ploopyco.c b/keyboards/ploopyco/ploopyco.c index f094f784cb..642696be0f 100644 --- a/keyboards/ploopyco/ploopyco.c +++ b/keyboards/ploopyco/ploopyco.c @@ -139,6 +139,7 @@ void cycle_dpi(void) { } report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) { + mouse_report = pointing_device_task_user(mouse_report); if (is_drag_scroll) { scroll_accumulated_h += (float)mouse_report.x / PLOOPY_DRAGSCROLL_DIVISOR_H; scroll_accumulated_v += (float)mouse_report.y / PLOOPY_DRAGSCROLL_DIVISOR_V; @@ -163,7 +164,7 @@ report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) { mouse_report.y = 0; } - return pointing_device_task_user(mouse_report); + return mouse_report; } bool process_record_kb(uint16_t keycode, keyrecord_t* record) { From 9e757bc2ecc09a48dcde351e8d3e31f02c05e4e7 Mon Sep 17 00:00:00 2001 From: Jon Henry Fernandez Date: Fri, 11 Jul 2025 22:29:16 -0500 Subject: [PATCH 497/592] [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 0000000000..9f9d5a3aea --- /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 0000000000..500597eb08 --- /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 0000000000..7981fd23ac --- /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 0000000000..160d698ad6 --- /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 498/592] Add zip to .gitignore (#25483) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 20e706a2b5..5886640d68 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 499/592] 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 81821c159d..52b726a56d 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 ad4233d07849ad96096fb84d01b0ed3200030b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Sun, 13 Jul 2025 23:38:32 +0800 Subject: [PATCH 500/592] Clamp reactive offset value (#25489) * Avoids underflow of the unsigned 8-bit --- quantum/rgb_matrix/animations/solid_reactive_anim.h | 1 + quantum/rgb_matrix/animations/solid_reactive_simple_anim.h | 1 + 2 files changed, 2 insertions(+) diff --git a/quantum/rgb_matrix/animations/solid_reactive_anim.h b/quantum/rgb_matrix/animations/solid_reactive_anim.h index 67f568ca38..d11dda50c3 100644 --- a/quantum/rgb_matrix/animations/solid_reactive_anim.h +++ b/quantum/rgb_matrix/animations/solid_reactive_anim.h @@ -4,6 +4,7 @@ RGB_MATRIX_EFFECT(SOLID_REACTIVE) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS static hsv_t SOLID_REACTIVE_math(hsv_t hsv, uint16_t offset) { + if (offset > 255) offset = 255; # ifdef RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE hsv.h = scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 8) >> 4); # endif diff --git a/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h b/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h index f20f1b1fb6..22ba42296f 100644 --- a/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h +++ b/quantum/rgb_matrix/animations/solid_reactive_simple_anim.h @@ -4,6 +4,7 @@ RGB_MATRIX_EFFECT(SOLID_REACTIVE_SIMPLE) # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS static hsv_t SOLID_REACTIVE_SIMPLE_math(hsv_t hsv, uint16_t offset) { + if (offset > 255) offset = 255; # ifdef RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE hsv.h = scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 8) >> 4); # endif From f797d4f49d38d9538f6072048b1dfd2f981696f0 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 13 Jul 2025 09:59:44 -0600 Subject: [PATCH 501/592] Configure SPI for `QMK_BLOK` board (#25487) --- .../chibios/boards/QMK_BLOK/configs/config.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/platforms/chibios/boards/QMK_BLOK/configs/config.h b/platforms/chibios/boards/QMK_BLOK/configs/config.h index 834dc497d3..26fe7cddc7 100644 --- a/platforms/chibios/boards/QMK_BLOK/configs/config.h +++ b/platforms/chibios/boards/QMK_BLOK/configs/config.h @@ -17,6 +17,23 @@ # define I2C1_SCL_PIN D0 #endif +/**====================== + ** SPI Driver + *========================**/ + +#ifndef SPI_DRIVER +# define SPI_DRIVER SPID0 +#endif +#ifndef SPI_SCK_PIN +# define SPI_SCK_PIN B1 +#endif +#ifndef SPI_MISO_PIN +# define SPI_MISO_PIN B3 +#endif +#ifndef SPI_MOSI_PIN +# define SPI_MOSI_PIN B2 +#endif + /**====================== ** UART Driver *========================**/ From d67e94fb1b3f4e6d57b211983f8527571bdcb816 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 13 Jul 2025 09:59:59 -0600 Subject: [PATCH 502/592] Configure SPI for `STEMCELL` board (#25486) --- .../chibios/boards/STEMCELL/configs/config.h | 15 +++++++++++++++ .../chibios/boards/STEMCELL/configs/mcuconf.h | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/platforms/chibios/boards/STEMCELL/configs/config.h b/platforms/chibios/boards/STEMCELL/configs/config.h index 82f6c63636..ab10432e4e 100644 --- a/platforms/chibios/boards/STEMCELL/configs/config.h +++ b/platforms/chibios/boards/STEMCELL/configs/config.h @@ -27,3 +27,18 @@ # define SERIAL_USART_DRIVER SD2 #endif +/**====================== + ** SPI Driver + *========================**/ +#ifndef SPI_DRIVER +# define SPI_DRIVER SPID1 +#endif +#ifndef SPI_SCK_PIN +# define SPI_SCK_PIN B1 +#endif +#ifndef SPI_MISO_PIN +# define SPI_MISO_PIN B3 +#endif +#ifndef SPI_MOSI_PIN +# define SPI_MOSI_PIN B2 +#endif diff --git a/platforms/chibios/boards/STEMCELL/configs/mcuconf.h b/platforms/chibios/boards/STEMCELL/configs/mcuconf.h index db239854aa..d4b870f8e4 100644 --- a/platforms/chibios/boards/STEMCELL/configs/mcuconf.h +++ b/platforms/chibios/boards/STEMCELL/configs/mcuconf.h @@ -196,7 +196,7 @@ /* * SPI driver system settings. */ -#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI1 TRUE #define STM32_SPI_USE_SPI2 FALSE #define STM32_SPI_USE_SPI3 FALSE #define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) From 5ef94415aabb88d53596483134f91036555ba082 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 13 Jul 2025 10:00:10 -0600 Subject: [PATCH 503/592] Configure SPI for `QMK_PM2040` board (#25481) --- .../chibios/boards/QMK_PM2040/configs/config.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/platforms/chibios/boards/QMK_PM2040/configs/config.h b/platforms/chibios/boards/QMK_PM2040/configs/config.h index f8b46b7fe4..5ba030a556 100644 --- a/platforms/chibios/boards/QMK_PM2040/configs/config.h +++ b/platforms/chibios/boards/QMK_PM2040/configs/config.h @@ -17,6 +17,22 @@ # define I2C1_SCL_PIN D0 #endif +/**====================== + ** SPI Driver + *========================**/ +#ifndef SPI_DRIVER +# define SPI_DRIVER SPID0 +#endif +#ifndef SPI_SCK_PIN +# define SPI_SCK_PIN B1 +#endif +#ifndef SPI_MISO_PIN +# define SPI_MISO_PIN B3 +#endif +#ifndef SPI_MOSI_PIN +# define SPI_MOSI_PIN B2 +#endif + /**====================== ** UART Driver *========================**/ From 56ad3a5f435b57605388ad986e85ca6e4d607eb2 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 13 Jul 2025 21:26:04 -0600 Subject: [PATCH 504/592] Refactor `bastardkb/charybdis/3x5` (#25488) * Refactor bastardkb/charybdis/3x5 - Migrate various configuration to data-driven - Use short SPDX license headers - Remove configuration that trends towards user-specific (CRC Table) - Migrate common configuration upwards - Migrate keymap to JSON - Remove likely unneeded v1 revision per #23638 - Remove revisions splinky_2, splinky_3, and stemcell where a converter should be used - Rename v2/elitec -> elitec. Specifically named elitec, as this board requires pin compatibility with an Elite-C (bottom 5 pins) * Aliases --- data/mappings/keyboard_aliases.hjson | 12 +++ keyboards/bastardkb/charybdis/3x5/3x5.c | 87 ------------------- .../charybdis/3x5/blackpill/config.h | 37 +------- .../charybdis/3x5/blackpill/halconf.h | 21 +---- .../charybdis/3x5/blackpill/keyboard.json | 43 +++------ .../charybdis/3x5/blackpill/mcuconf.h | 28 +----- .../charybdis/3x5/blackpill/readme.md | 3 - .../charybdis/3x5/blackpill/rules.mk | 5 -- keyboards/bastardkb/charybdis/3x5/config.h | 22 ----- .../bastardkb/charybdis/3x5/elitec/config.h | 5 ++ .../charybdis/3x5/elitec/keyboard.json | 19 ++++ keyboards/bastardkb/charybdis/3x5/info.json | 64 +++++++++++--- .../charybdis/3x5/keymaps/default/keymap.c | 71 --------------- .../charybdis/3x5/keymaps/default/keymap.json | 26 ++++++ .../charybdis/3x5/keymaps/default/readme.md | 7 -- keyboards/bastardkb/charybdis/3x5/readme.md | 15 ---- keyboards/bastardkb/charybdis/3x5/rules.mk | 1 + .../charybdis/3x5/v1/elitec/config.h | 25 ------ .../charybdis/3x5/v1/elitec/keyboard.json | 41 --------- .../charybdis/3x5/v1/elitec/rules.mk | 4 - .../charybdis/3x5/v2/elitec/config.h | 24 ----- .../charybdis/3x5/v2/elitec/keyboard.json | 35 -------- .../charybdis/3x5/v2/elitec/rules.mk | 4 - .../charybdis/3x5/v2/splinky_2/config.h | 38 -------- .../charybdis/3x5/v2/splinky_2/keyboard.json | 33 ------- .../charybdis/3x5/v2/splinky_2/mcuconf.h | 23 ----- .../charybdis/3x5/v2/splinky_2/readme.md | 5 -- .../charybdis/3x5/v2/splinky_2/rules.mk | 5 -- .../charybdis/3x5/v2/splinky_3/config.h | 38 -------- .../charybdis/3x5/v2/splinky_3/keyboard.json | 33 ------- .../charybdis/3x5/v2/splinky_3/mcuconf.h | 23 ----- .../charybdis/3x5/v2/splinky_3/readme.md | 5 -- .../charybdis/3x5/v2/splinky_3/rules.mk | 5 -- .../charybdis/3x5/v2/stemcell/config.h | 52 ----------- .../charybdis/3x5/v2/stemcell/halconf.h | 24 ----- .../charybdis/3x5/v2/stemcell/keyboard.json | 38 -------- .../charybdis/3x5/v2/stemcell/mcuconf.h | 32 ------- .../charybdis/3x5/v2/stemcell/rules.mk | 6 -- keyboards/bastardkb/charybdis/charybdis.c | 23 +---- keyboards/bastardkb/charybdis/charybdis.h | 21 +---- keyboards/bastardkb/charybdis/config.h | 68 ++------------- keyboards/bastardkb/charybdis/info.json | 48 +++++++++- keyboards/bastardkb/charybdis/post_config.h | 25 ++---- 43 files changed, 201 insertions(+), 943 deletions(-) delete mode 100644 keyboards/bastardkb/charybdis/3x5/3x5.c delete mode 100644 keyboards/bastardkb/charybdis/3x5/blackpill/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/config.h create mode 100644 keyboards/bastardkb/charybdis/3x5/elitec/config.h create mode 100644 keyboards/bastardkb/charybdis/3x5/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/keymaps/default/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x5/readme.md create mode 100644 keyboards/bastardkb/charybdis/3x5/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_2/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_3/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index cf0cfe52f1..db62bce419 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -68,6 +68,18 @@ "bakeneko80": { "target": "kkatano/bakeneko80" }, + "bastardkb/charybdis/3x5/v2/elitec": { + "target": "bastardkb/charybdis/3x5/elitec" + }, + "bastardkb/charybdis/3x5/v2/splinky_2": { + "target": "bastardkb/charybdis/3x5/elitec" + }, + "bastardkb/charybdis/3x5/v2/splinky_3": { + "target": "bastardkb/charybdis/3x5/elitec" + }, + "bastardkb/charybdis/3x5/v2/stemcell": { + "target": "bastardkb/charybdis/3x5/elitec" + }, "bastardkb/dilemma/3x5_2/splinky": { "target": "bastardkb/dilemma/3x5_2/promicro" }, diff --git a/keyboards/bastardkb/charybdis/3x5/3x5.c b/keyboards/bastardkb/charybdis/3x5/3x5.c deleted file mode 100644 index 6e8e3bef10..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/3x5.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 "charybdis.h" - -// clang-format off -#ifdef RGB_MATRIX_ENABLE -/** - * \brief LEDs index. - * - * ╭────────────────────╮ ╭────────────────────╮ - * 2 3 8 9 12 30 27 26 21 20 - * ├────────────────────┤ ├────────────────────┤ - * 1 4 7 10 13 31 28 25 22 19 - * ├────────────────────┤ ├────────────────────┤ - * 0 5 6 11 14 32 29 24 23 18 - * ╰────────────────────╯ ╰────────────────────╯ - * 15 16 17 33 34 XX - * ╰────────────╯ ╰────────────╯ - * - * Note: the LED config simulates 36 LEDs instead of the actual 35 to prevent - * confusion when testing LEDs during assembly when handedness is not set - * correctly. Those fake LEDs are bound to the physical top-left corner. - */ -led_config_t g_led_config = { { - /* Key Matrix to LED index. */ - // Left split. - { 2, 3, 8, 9, 12 }, // Top row - { 1, 4, 7, 10, 13 }, // Middle row - { 0, 5, 6, 11, 14 }, // Bottom row - { 17, NO_LED, 15, 16, NO_LED }, // Thumb cluster - // Right split. - { 20, 21, 26, 27, 30 }, // Top row - { 19, 22, 25, 28, 31 }, // Middle row - { 18, 23, 24, 29, 32 }, // Bottom row - { 33, NO_LED, 34, NO_LED, NO_LED }, // Thumb cluster -}, { - /* LED index to physical position. */ - // Left split. - /* index=0 */ { 0, 42 }, { 0, 21 }, { 0, 0 }, // col 1 (left most) - /* index=3 */ { 18, 0 }, { 18, 21 }, { 18, 42 }, // col 2 - /* index=6 */ { 36, 42 }, { 36, 21 }, { 36, 0 }, - /* index=9 */ { 54, 0 }, { 54, 21 }, { 54, 42 }, - /* index=12 */ { 72, 0 }, { 72, 21 }, { 72, 42 }, - /* index=15 */ { 72, 64 }, { 90, 64 }, { 108, 64 }, // Thumb cluster - // Right split. - /* index=18 */ { 224, 42 }, { 224, 21 }, { 224, 0 }, // col 10 (right most) - /* index=21 */ { 206, 0 }, { 206, 21 }, { 206, 42 }, // col 9 - /* index=24 */ { 188, 42 }, { 188, 21 }, { 188, 0 }, - /* index=27 */ { 170, 0 }, { 170, 21 }, { 170, 42 }, - /* index=30 */ { 152, 0 }, { 152, 21 }, { 152, 42 }, - /* index=33 */ { 134, 64 }, { 152, 64 }, { 0, 0 }, -}, { - /* LED index to flag. */ - // Left split. - /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1 - /* index=3 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2 - /* index=6 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=9 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=15 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster - // Right split. - /* index=18 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 10 - /* index=21 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 9 - /* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/config.h b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h index bd1e0fe31e..9c01986583 100644 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/config.h +++ b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h @@ -1,28 +1,9 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2021 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - -/* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 #define WS2812_PWM_PAL_MODE 1 @@ -30,14 +11,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for EEPROM and pmw3360 sensor. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 #define SPI_SCK_PAL_MODE 5 @@ -46,9 +19,7 @@ #define SPI_MISO_PIN A6 #define SPI_MISO_PAL_MODE 5 -/* EEPROM config. */ #define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4 -/* PMW3360 settings. */ #define POINTING_DEVICE_CS_PIN B14 #define PMW33XX_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h index 300b0eeaed..6876cc3e00 100644 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/3x5/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/keyboard.json b/keyboards/bastardkb/charybdis/3x5/blackpill/keyboard.json index bcc57981b5..15edbf74b8 100644 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x5/blackpill/keyboard.json @@ -1,38 +1,23 @@ { - "keyboard_name": "Charybdis Nano (3x5) Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B1", "B10", "B3", "B4", "B5"], "rows": ["A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h index 46b3b42f8b..be641fb899 100644 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h +++ b/keyboards/bastardkb/charybdis/3x5/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next @@ -30,11 +15,6 @@ #undef STM32_SPI_USE_SPI1 #define STM32_SPI_USE_SPI1 TRUE -#undef STM32_SPI_SPI1_RX_DMA_STREAM -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#undef STM32_SPI_SPI1_TX_DMA_STREAM -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - #undef STM32_SERIAL_USE_USART1 #define STM32_SERIAL_USE_USART1 TRUE diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md b/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md deleted file mode 100644 index 7ef08798b8..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Charybdis Nano (3x5) BlackPill - -An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod. diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk b/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk deleted file mode 100644 index c8d355efb7..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/blackpill/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/charybdis/3x5/config.h b/keyboards/bastardkb/charybdis/3x5/config.h deleted file mode 100644 index 1c952759a7..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -/* Trackball angle adjustment. */ -#define ROTATIONAL_TRANSFORM_ANGLE -25 diff --git a/keyboards/bastardkb/charybdis/3x5/elitec/config.h b/keyboards/bastardkb/charybdis/3x5/elitec/config.h new file mode 100644 index 0000000000..411ddaf6b9 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x5/elitec/config.h @@ -0,0 +1,5 @@ +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/3x5/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/elitec/keyboard.json new file mode 100644 index 0000000000..22064f13aa --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x5/elitec/keyboard.json @@ -0,0 +1,19 @@ +{ + "build": { + "lto": true + }, + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F5", "B6", "D7", "E6", "B4"], + "rows": ["F7", "C6", "D4", "B5"] + }, + "pin_compatible": "elite_c", + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/charybdis/3x5/info.json b/keyboards/bastardkb/charybdis/3x5/info.json index 9627b9852f..3953cb43e2 100644 --- a/keyboards/bastardkb/charybdis/3x5/info.json +++ b/keyboards/bastardkb/charybdis/3x5/info.json @@ -1,15 +1,58 @@ { - "manufacturer": "Bastard Keyboards", - "url": "https://bastardkb.com/charybdis-nano", - "usb": { - "pid": "0x1832", - "vid": "0xA8F8" + "keyboard_name": "Charybdis Nano (3x5)", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": false, + "pointing_device": true, + "rgb_matrix": true }, "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 18, "y": 0, "flags": 4}, + {"matrix": [1, 1], "x": 18, "y": 21, "flags": 4}, + {"matrix": [2, 1], "x": 18, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 36, "y": 42, "flags": 4}, + {"matrix": [1, 2], "x": 36, "y": 21, "flags": 4}, + {"matrix": [0, 2], "x": 36, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 54, "y": 0, "flags": 4}, + {"matrix": [1, 3], "x": 54, "y": 21, "flags": 4}, + {"matrix": [2, 3], "x": 54, "y": 42, "flags": 4}, + {"matrix": [0, 4], "x": 72, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 72, "y": 21, "flags": 4}, + {"matrix": [2, 4], "x": 72, "y": 42, "flags": 4}, + {"matrix": [3, 2], "x": 72, "y": 64, "flags": 1}, + {"matrix": [3, 3], "x": 90, "y": 64, "flags": 1}, + {"matrix": [3, 0], "x": 108, "y": 64, "flags": 1}, + {"matrix": [6, 0], "x": 224, "y": 42, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 21, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [4, 1], "x": 206, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 206, "y": 21, "flags": 4}, + {"matrix": [6, 1], "x": 206, "y": 42, "flags": 4}, + {"matrix": [6, 2], "x": 188, "y": 42, "flags": 4}, + {"matrix": [5, 2], "x": 188, "y": 21, "flags": 4}, + {"matrix": [4, 2], "x": 188, "y": 0, "flags": 4}, + {"matrix": [4, 3], "x": 170, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 170, "y": 21, "flags": 4}, + {"matrix": [6, 3], "x": 170, "y": 42, "flags": 4}, + {"matrix": [4, 4], "x": 152, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 152, "y": 21, "flags": 4}, + {"matrix": [6, 4], "x": 152, "y": 42, "flags": 4}, + {"matrix": [7, 0], "x": 134, "y": 64, "flags": 4}, + {"matrix": [7, 2], "x": 152, "y": 64, "flags": 4}, + {"x": 170, "y": 64, "flags": 4} + ], "split_count": [18, 18] }, - "layout_aliases": { - "LAYOUT_charybdis_3x5": "LAYOUT" + "usb": { + "device_version": "2.0.0", + "pid": "0x1832" }, "layouts": { "LAYOUT": { @@ -19,41 +62,34 @@ {"matrix": [0, 2], "x": 2, "y": 0}, {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, - {"matrix": [4, 4], "x": 11, "y": 0}, {"matrix": [4, 3], "x": 12, "y": 0}, {"matrix": [4, 2], "x": 13, "y": 0}, {"matrix": [4, 1], "x": 14, "y": 0}, {"matrix": [4, 0], "x": 15, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [5, 4], "x": 11, "y": 1}, {"matrix": [5, 3], "x": 12, "y": 1}, {"matrix": [5, 2], "x": 13, "y": 1}, {"matrix": [5, 1], "x": 14, "y": 1}, {"matrix": [5, 0], "x": 15, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [6, 4], "x": 11, "y": 2}, {"matrix": [6, 3], "x": 12, "y": 2}, {"matrix": [6, 2], "x": 13, "y": 2}, {"matrix": [6, 1], "x": 14, "y": 2}, {"matrix": [6, 0], "x": 15, "y": 2}, - {"matrix": [3, 2], "x": 4, "y": 3}, {"matrix": [3, 3], "x": 5, "y": 3}, {"matrix": [3, 0], "x": 6, "y": 3}, - {"matrix": [7, 0], "x": 9, "y": 3}, {"matrix": [7, 2], "x": 10, "y": 3} ] diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c deleted file mode 100644 index e5e0ba1207..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.c +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -enum charybdis_keymap_layers { - LAYER_BASE = 0, - LAYER_LOWER, - LAYER_RAISE, -}; - -#define LOWER MO(LAYER_LOWER) -#define RAISE MO(LAYER_RAISE) - -#define CTL_BSP CTL_T(KC_BSPC) -#define SFT_SPC SFT_T(KC_SPC) -#define GUI_ENT GUI_T(KC_ENT) - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [LAYER_BASE] = LAYOUT( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - CTL_BSP, SFT_SPC, LOWER, RAISE, GUI_ENT - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_LOWER] = LAYOUT( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - RM_TOGG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - XXXXXXX, XXXXXXX, _______, XXXXXXX, _______ - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_RAISE] = LAYOUT( - // ╭─────────────────────────────────────────────╮ ╭─────────────────────────────────────────────╮ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, - // ├─────────────────────────────────────────────┤ ├─────────────────────────────────────────────┤ - KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, - // ╰─────────────────────────────────────────────┤ ├─────────────────────────────────────────────╯ - _______, _______, XXXXXXX, _______, XXXXXXX - // ╰───────────────────────────╯ ╰──────────────────╯ - ), -}; -// clang-format on diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.json b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.json new file mode 100644 index 0000000000..f92366cd4d --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x5/keymaps/default/keymap.json @@ -0,0 +1,26 @@ +{ + "keyboard": "bastardkb/charybdis/3x5/elitec", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", + "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", + "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)" + ], + [ + "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", + "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", + "EE_CLR", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______" + ] + ] +} + diff --git a/keyboards/bastardkb/charybdis/3x5/keymaps/default/readme.md b/keyboards/bastardkb/charybdis/3x5/keymaps/default/readme.md deleted file mode 100644 index 3908656820..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/keymaps/default/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Charybdis (3x5) default keymap - -> :bulb: Have a look at the [`via` keymap](../via) for a more feature-rich layout. - -The Charydbis (3x5) default keymap is inspired from the original [Dactyl Manuform](../../../../../handwired/dactyl_manuform) default keymap. - -This layout supports RGB matrix. However, due to space constraints on the MCU, only a limited number of effect can be enabled at once. Look at the `config.h` file and enable your favorite effect. diff --git a/keyboards/bastardkb/charybdis/3x5/readme.md b/keyboards/bastardkb/charybdis/3x5/readme.md deleted file mode 100644 index 7a91035bea..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# Charybdis Nano (3x5) - -An ergonomic keyboard with integrated trackball. - -The Charybdis is available in 4x6 and 3x5 form factor at [bastardkb.com](https://bastardkb.com). - -## Keymaps - -### [`default`](keymaps/default) - -A simple QWERTY layout with 4 layers. - -### [`via`](keymaps/via) - -A [Miryoku-inspired](https://github.com/manna-harbour/miryoku), feature-rich, keymap with VIA support. diff --git a/keyboards/bastardkb/charybdis/3x5/rules.mk b/keyboards/bastardkb/charybdis/3x5/rules.mk new file mode 100644 index 0000000000..fab9162dc6 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x5/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h b/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h deleted file mode 100644 index dc0c6e4e03..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v1/elitec/config.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN B0 diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json deleted file mode 100644 index 2fd99fb5ab..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "keyboard_name": "Charybdis Nano (3x5) Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["C7", "F0", "D7", "E6", "B4"], - "rows": ["B7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - }, - "matrix_pins": { - "right": { - "cols": ["C7", "B7", "D7", "E6", "B4"], - "rows": ["F0", "C6", "D4", "B5"] - } - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk deleted file mode 100644 index 17dae28bd1..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v1/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h b/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h deleted file mode 100644 index 3b91322247..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/elitec/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json deleted file mode 100644 index 51f6cedf51..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "keyboard_name": "Charybdis Nano (3x5) Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F5", "B6", "D7", "E6", "B4"], - "rows": ["F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk deleted file mode 100644 index 17dae28bd1..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/config.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/config.h deleted file mode 100644 index e6e2a4f216..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP18 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP19 -#define POINTING_DEVICE_CS_PIN GP14 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json deleted file mode 100644 index cf800062b3..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis Nano (3x5) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/readme.md b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/config.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/config.h deleted file mode 100644 index ee7745d41e..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP22 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP23 -#define POINTING_DEVICE_CS_PIN GP16 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json deleted file mode 100644 index d9039f7591..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis Nano (3x5) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/readme.md b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h deleted file mode 100644 index 3efb323302..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for pmw3360 sensor. */ -#define SPI_DRIVER SPID1 -#define SPI_SCK_PIN A5 -#define SPI_SCK_PAL_MODE 5 -#define SPI_MOSI_PIN A7 -#define SPI_MOSI_PAL_MODE 5 -#define SPI_MISO_PIN A6 -#define SPI_MISO_PAL_MODE 5 - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN A1 -#define PMW3360_CS_MODE 3 -#define PMW3360_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h deleted file mode 100644 index 0397de50b7..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/halconf.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE -#define HAL_USE_SPI TRUE - -#include_next diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json deleted file mode 100644 index ca48cc0f3c..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "keyboard_name": "Charybdis Nano (3x5) STeMCell", - "usb": { - "device_version": "2.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B2", "A4", "B4", "B5", "B8"], - "rows": ["B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h deleted file mode 100644 index 17a46d8f95..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_SPI1 -#define STM32_SPI_USE_SPI1 TRUE - -#undef STM32_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk deleted file mode 100644 index 4373b9c33d..0000000000 --- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/charybdis/charybdis.c b/keyboards/bastardkb/charybdis/charybdis.c index 2251b24758..bd916844b8 100644 --- a/keyboards/bastardkb/charybdis/charybdis.c +++ b/keyboards/bastardkb/charybdis/charybdis.c @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Quentin LEBASTARD +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #include "charybdis.h" #include "transactions.h" #include diff --git a/keyboards/bastardkb/charybdis/charybdis.h b/keyboards/bastardkb/charybdis/charybdis.h index a8ee639d9a..afa75e981f 100644 --- a/keyboards/bastardkb/charybdis/charybdis.h +++ b/keyboards/bastardkb/charybdis/charybdis.h @@ -1,21 +1,6 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2021 Quentin LEBASTARD +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "quantum.h" diff --git a/keyboards/bastardkb/charybdis/config.h b/keyboards/bastardkb/charybdis/config.h index ebbddecf57..f4c017875b 100644 --- a/keyboards/bastardkb/charybdis/config.h +++ b/keyboards/bastardkb/charybdis/config.h @@ -1,25 +1,8 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2021 Quentin LEBASTARD +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Pointing device configuration. */ - // Enable use of pointing device on slave split. #define SPLIT_POINTING_ENABLE @@ -32,46 +15,5 @@ // Invert X axis on mouse reports. #define POINTING_DEVICE_INVERT_X -/* RGB matrix support. */ -#ifdef RGB_MATRIX_ENABLE -# define ENABLE_RGB_MATRIX_ALPHAS_MODS -# define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN -# define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT -# define ENABLE_RGB_MATRIX_BREATHING -# define ENABLE_RGB_MATRIX_BAND_SAT -# define ENABLE_RGB_MATRIX_BAND_VAL -# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT -# define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL -# define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT -# define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL -# define ENABLE_RGB_MATRIX_CYCLE_ALL -# define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT -# define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN -# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON -# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN -# define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL -# define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL -# define ENABLE_RGB_MATRIX_CYCLE_SPIRAL -# define ENABLE_RGB_MATRIX_DUAL_BEACON -# define ENABLE_RGB_MATRIX_RAINBOW_BEACON -# define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS -# define ENABLE_RGB_MATRIX_RAINDROPS -# define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS -# define ENABLE_RGB_MATRIX_HUE_BREATHING -# define ENABLE_RGB_MATRIX_HUE_PENDULUM -# define ENABLE_RGB_MATRIX_HUE_WAVE -# define ENABLE_RGB_MATRIX_TYPING_HEATMAP -# define ENABLE_RGB_MATRIX_DIGITAL_RAIN -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS -# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS -# define ENABLE_RGB_MATRIX_SPLASH -# define ENABLE_RGB_MATRIX_MULTISPLASH -# define ENABLE_RGB_MATRIX_SOLID_SPLASH -# define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH -#endif +/* Trackball angle adjustment. */ +#define ROTATIONAL_TRANSFORM_ANGLE -25 diff --git a/keyboards/bastardkb/charybdis/info.json b/keyboards/bastardkb/charybdis/info.json index 6a4ed7c9f7..4d7545d40a 100644 --- a/keyboards/bastardkb/charybdis/info.json +++ b/keyboards/bastardkb/charybdis/info.json @@ -1,7 +1,50 @@ { + "url": "https://github.com/Bastardkb/Charybdis", "rgb_matrix": { "animations": { - "cycle_left_right": true + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "rainbow_moving_chevron": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_rain": true, + "pixel_flow": true, + "pixel_fractal": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true }, "default": { "speed": 32, @@ -10,10 +53,11 @@ "sleep": true }, "split": { + "enabled": true, "transport": { "sync": { "matrix_state": true } } } -} \ No newline at end of file +} diff --git a/keyboards/bastardkb/charybdis/post_config.h b/keyboards/bastardkb/charybdis/post_config.h index 4cfd24c4b6..5f5045f04e 100644 --- a/keyboards/bastardkb/charybdis/post_config.h +++ b/keyboards/bastardkb/charybdis/post_config.h @@ -1,23 +1,8 @@ -/* - * Copyright 2012 Jun Wako - * Copyright 2015 Jack Humbert - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2012 Jun Wako +// Copyright 2015 Jack Humbert +// Copyright 2021 Quentin LEBASTARD +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once // Enable syncing of charybdis config From 20555f9a3366abf9d4246e00ad032590ff16236a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 14 Jul 2025 13:53:57 +0100 Subject: [PATCH 505/592] Relocate `AUDIO_INIT_DELAY` implementation (#25491) --- quantum/audio/audio.c | 19 +++++++++++++++++++ quantum/audio/audio.h | 6 +++++- quantum/keyboard.c | 20 ++------------------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 247b737331..461ec89544 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -183,6 +183,25 @@ void audio_init(void) { #endif } +void audio_task(void) { +#ifdef AUDIO_INIT_DELAY + // startup song potentially needs to be run a little bit + // after keyboard startup, or else they will not work correctly + // because of interaction with the USB device state, which + // may still be in flux... + static bool delayed_tasks_run = false; + static uint16_t delayed_task_timer = 0; + if (!delayed_tasks_run) { + if (!delayed_task_timer) { + delayed_task_timer = timer_read(); + } else if (timer_elapsed(delayed_task_timer) > 300) { + audio_startup(); + delayed_tasks_run = true; + } + } +#endif +} + void audio_startup(void) { if (audio_config.enable) { PLAY_SONG(startup_song); diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 647744a686..a41814d0f8 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -69,7 +69,11 @@ void eeconfig_update_audio_current(void); * @post audio system (and hardware) initialized and ready to play tones */ void audio_init(void); -void audio_startup(void); + +/** + * \brief Handle various subsystem background tasks. + */ +void audio_task(void); /** * @brief en-/disable audio output, save this choice to the eeprom diff --git a/quantum/keyboard.c b/quantum/keyboard.c index c1a6d444a5..bf4890a51d 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -648,24 +648,8 @@ void quantum_task(void) { if (!is_keyboard_master()) return; #endif -#if defined(AUDIO_ENABLE) && defined(AUDIO_INIT_DELAY) - // There are some tasks that need to be run a little bit - // after keyboard startup, or else they will not work correctly - // because of interaction with the USB device state, which - // may still be in flux... - // - // At the moment the only feature that needs this is the - // startup song. - static bool delayed_tasks_run = false; - static uint16_t delayed_task_timer = 0; - if (!delayed_tasks_run) { - if (!delayed_task_timer) { - delayed_task_timer = timer_read(); - } else if (timer_elapsed(delayed_task_timer) > 300) { - audio_startup(); - delayed_tasks_run = true; - } - } +#ifdef AUDIO_ENABLE + audio_task(); #endif #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE) From f0b04b2a3a3b21cbb833a26de6f68fac100b1b94 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 14 Jul 2025 14:47:21 +0100 Subject: [PATCH 506/592] Only userspace should be searched for keyboard aliases when locating keymaps (#25477) --- lib/python/qmk/keymap.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index b7138aa4a1..4cf07f59d6 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py @@ -343,24 +343,21 @@ def locate_keymap(keyboard, keymap, force_layout=None): # Check the keyboard folder first, last match wins keymap_path = '' - search_dirs = [QMK_FIRMWARE] - keyboard_dirs = [keyboard_folder(keyboard)] + search_conf = {QMK_FIRMWARE: [keyboard_folder(keyboard)]} if HAS_QMK_USERSPACE: # When we've got userspace, check there _last_ as we want them to override anything in the main repo. - search_dirs.append(QMK_USERSPACE) # We also want to search for any aliases as QMK's folder structure may have changed, with an alias, but the user # hasn't updated their keymap location yet. - keyboard_dirs.extend(keyboard_aliases(keyboard)) - keyboard_dirs = list(set(keyboard_dirs)) + search_conf[QMK_USERSPACE] = list(set([keyboard_folder(keyboard), *keyboard_aliases(keyboard)])) - for search_dir in search_dirs: + for search_dir, keyboard_dirs in search_conf.items(): for keyboard_dir in keyboard_dirs: checked_dirs = '' - for dir in keyboard_dir.split('/'): + for folder_name in keyboard_dir.split('/'): if checked_dirs: - checked_dirs = '/'.join((checked_dirs, dir)) + checked_dirs = '/'.join((checked_dirs, folder_name)) else: - checked_dirs = dir + checked_dirs = folder_name keymap_dir = Path(search_dir) / Path('keyboards') / checked_dirs / 'keymaps' From 507c948ed8bb927096c6951ef75d8398fae040f9 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 16 Jul 2025 14:56:29 +0100 Subject: [PATCH 507/592] Allow `qmk flash ` to flash AT32 boards (#25497) --- lib/python/qmk/flashers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/python/qmk/flashers.py b/lib/python/qmk/flashers.py index 2cca4941d3..22d9133d65 100644 --- a/lib/python/qmk/flashers.py +++ b/lib/python/qmk/flashers.py @@ -96,7 +96,7 @@ def _find_bootloader(): details = 'halfkay' else: details = 'qmk-hid' - elif bl in {'apm32-dfu', 'gd32v-dfu', 'kiibohd', 'stm32-dfu'}: + elif bl in {'apm32-dfu', 'at32-dfu', 'gd32v-dfu', 'kiibohd', 'stm32-dfu'}: details = (vid, pid) else: details = None @@ -176,7 +176,7 @@ def _flash_dfu_util(details, file): # kiibohd elif details[0] == '1c11' and details[1] == 'b007': cli.run(['dfu-util', '-a', '0', '-d', f'{details[0]}:{details[1]}', '-D', file], capture_output=False) - # STM32, APM32, or GD32V DFU + # STM32, APM32, AT32, or GD32V DFU else: cli.run(['dfu-util', '-a', '0', '-d', f'{details[0]}:{details[1]}', '-s', '0x08000000:leave', '-D', file], capture_output=False) @@ -226,7 +226,7 @@ def flasher(mcu, file): return (True, "Please make sure 'teensy_loader_cli' or 'hid_bootloader_cli' is available on your system.") else: return (True, "Specifying the MCU with '-m' is necessary for HalfKay/HID bootloaders!") - elif bl in {'apm32-dfu', 'gd32v-dfu', 'kiibohd', 'stm32-dfu'}: + elif bl in {'apm32-dfu', 'at32-dfu', 'gd32v-dfu', 'kiibohd', 'stm32-dfu'}: _flash_dfu_util(details, file) elif bl == 'wb32-dfu': if _flash_wb32_dfu_updater(file): From 865c29f4dec268da53ccc290217c957307275a93 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 17 Jul 2025 13:36:04 +0100 Subject: [PATCH 508/592] Ensure keyboard aliases do not point to themselves (#25500) --- lib/python/qmk/cli/ci/validate_aliases.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/ci/validate_aliases.py b/lib/python/qmk/cli/ci/validate_aliases.py index 8b062dbe56..4f2fe6c941 100644 --- a/lib/python/qmk/cli/ci/validate_aliases.py +++ b/lib/python/qmk/cli/ci/validate_aliases.py @@ -25,6 +25,21 @@ def _target_keyboard_exists(target): return True +def _alias_not_self(alias): + """Check if alias points to itself, either directly or within a circular reference + """ + aliases = keyboard_alias_definitions() + + found = set() + while alias in aliases: + found.add(alias) + alias = aliases[alias].get('target', alias) + if alias in found: + return False + + return True + + @cli.subcommand('Validates the list of keyboard aliases.', hidden=True) def ci_validate_aliases(cli): aliases = keyboard_alias_definitions() @@ -32,7 +47,11 @@ def ci_validate_aliases(cli): success = True for alias in aliases.keys(): target = aliases[alias].get('target', None) - if not _target_keyboard_exists(target): + if not _alias_not_self(alias): + cli.log.error(f'Keyboard alias {alias} should not point to itself') + success = False + + elif not _target_keyboard_exists(target): cli.log.error(f'Keyboard alias {alias} has a target that doesn\'t exist: {target}') success = False From 16ffaa6482e741380f5001f9a2cbb2b81520cebe Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 17 Jul 2025 11:09:01 -0600 Subject: [PATCH 509/592] 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 0000000000..6b40b2e0d1 --- /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 0000000000..c360ef0e8a --- /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 0000000000..f7fdeac131 --- /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 510/592] 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 0000000000..8fb0393494 --- /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 0000000000..7a921cf608 --- /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 0000000000..308d4120e3 --- /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 From 43853b337bbccacf9e0e78bc5fcd7b9e09de4a4b Mon Sep 17 00:00:00 2001 From: Bailey <69098787+Ll3ma@users.noreply.github.com> Date: Fri, 18 Jul 2025 01:49:52 +0800 Subject: [PATCH 511/592] [Keyboard] Rename ll3macorn -> ll3ma (#25498) * rebrand for Ll3ma * rebrand for Ll3ma * Update keyboard_aliases.hjson * Update keyboard_aliases.hjson * Update keyboard_aliases.hjson * Update keyboard_aliases.hjson * Update keyboard_aliases.hjson Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- data/mappings/keyboard_aliases.hjson | 3 +++ keyboards/{ll3macorn => ll3ma}/bongopad/bongopad.c | 2 +- keyboards/{ll3macorn => ll3ma}/bongopad/config.h | 2 +- keyboards/{ll3macorn => ll3ma}/bongopad/keyboard.json | 6 +++--- .../{ll3macorn => ll3ma}/bongopad/keymaps/default/keymap.c | 2 +- .../{ll3macorn => ll3ma}/bongopad/keymaps/default/rules.mk | 0 keyboards/{ll3macorn => ll3ma}/bongopad/readme.md | 4 ++-- 7 files changed, 11 insertions(+), 8 deletions(-) rename keyboards/{ll3macorn => ll3ma}/bongopad/bongopad.c (99%) rename keyboards/{ll3macorn => ll3ma}/bongopad/config.h (74%) rename keyboards/{ll3macorn => ll3ma}/bongopad/keyboard.json (94%) rename keyboards/{ll3macorn => ll3ma}/bongopad/keymaps/default/keymap.c (94%) rename keyboards/{ll3macorn => ll3ma}/bongopad/keymaps/default/rules.mk (100%) rename keyboards/{ll3macorn => ll3ma}/bongopad/readme.md (79%) diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index db62bce419..42fb5e2139 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -425,6 +425,9 @@ "lfkeyboards/smk65": { "target": "lfkeyboards/smk65/revb" }, + "ll3macorn/bongopad": { + "target": "ll3ma/bongopad" + }, "m3v3van": { "target": "matthewdias/m3n3van" }, diff --git a/keyboards/ll3macorn/bongopad/bongopad.c b/keyboards/ll3ma/bongopad/bongopad.c similarity index 99% rename from keyboards/ll3macorn/bongopad/bongopad.c rename to keyboards/ll3ma/bongopad/bongopad.c index f6d03ded6c..910e5a4d70 100644 --- a/keyboards/ll3macorn/bongopad/bongopad.c +++ b/keyboards/ll3ma/bongopad/bongopad.c @@ -1,4 +1,4 @@ -// Copyright 2021 Ll3macorn (@ll3macorn) +// Copyright 2025 Ll3ma (@ll3ma) // SPDX-License-Identifier: GPL-2.0-or-later #include "quantum.h" diff --git a/keyboards/ll3macorn/bongopad/config.h b/keyboards/ll3ma/bongopad/config.h similarity index 74% rename from keyboards/ll3macorn/bongopad/config.h rename to keyboards/ll3ma/bongopad/config.h index 4ee4b5a997..c9f7f102de 100644 --- a/keyboards/ll3macorn/bongopad/config.h +++ b/keyboards/ll3ma/bongopad/config.h @@ -1,4 +1,4 @@ -// Copyright 2021 Ll3macorn (@ll3macorn) +// Copyright 2025 Ll3ma (@ll3ma) // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/keyboards/ll3macorn/bongopad/keyboard.json b/keyboards/ll3ma/bongopad/keyboard.json similarity index 94% rename from keyboards/ll3macorn/bongopad/keyboard.json rename to keyboards/ll3ma/bongopad/keyboard.json index a47529ed28..c3abc03fc9 100644 --- a/keyboards/ll3macorn/bongopad/keyboard.json +++ b/keyboards/ll3ma/bongopad/keyboard.json @@ -1,8 +1,8 @@ { "keyboard_name": "BongoPad", - "manufacturer": "Ll3macorn", - "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/ll3macorn/bongopad", - "maintainer": "Ll3macorn", + "manufacturer": "Ll3ma", + "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/ll3ma/bongopad", + "maintainer": "Ll3ma", "usb": { "vid": "0x3728", "pid": "0x2949", diff --git a/keyboards/ll3macorn/bongopad/keymaps/default/keymap.c b/keyboards/ll3ma/bongopad/keymaps/default/keymap.c similarity index 94% rename from keyboards/ll3macorn/bongopad/keymaps/default/keymap.c rename to keyboards/ll3ma/bongopad/keymaps/default/keymap.c index d91a949dee..1afcc87cfe 100644 --- a/keyboards/ll3macorn/bongopad/keymaps/default/keymap.c +++ b/keyboards/ll3ma/bongopad/keymaps/default/keymap.c @@ -1,4 +1,4 @@ -// Copyright 2021 Ll3macorn (@ll3macorn) +// Copyright 2025 Ll3ma (@ll3ma) // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H diff --git a/keyboards/ll3macorn/bongopad/keymaps/default/rules.mk b/keyboards/ll3ma/bongopad/keymaps/default/rules.mk similarity index 100% rename from keyboards/ll3macorn/bongopad/keymaps/default/rules.mk rename to keyboards/ll3ma/bongopad/keymaps/default/rules.mk diff --git a/keyboards/ll3macorn/bongopad/readme.md b/keyboards/ll3ma/bongopad/readme.md similarity index 79% rename from keyboards/ll3macorn/bongopad/readme.md rename to keyboards/ll3ma/bongopad/readme.md index d2902aae6a..0751ac4fc8 100644 --- a/keyboards/ll3macorn/bongopad/readme.md +++ b/keyboards/ll3ma/bongopad/readme.md @@ -1,10 +1,10 @@ # BongoPad -* Keyboard Maintainer: [Ll3macorn](https://github.com/Ll3macorn) +* Keyboard Maintainer: [Ll3ma](https://github.com/Ll3ma) * Hardware Supported: Pro micro Make example for this keyboard (after setting up your build environment): - make ll3macorn/bongopad:default + make ll3ma/bongopad:default 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). From 65cce9105d4880b47052c0af57e86480784d1013 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sat, 19 Jul 2025 23:23:28 -0600 Subject: [PATCH 512/592] Refactor `helix/rev3_{4,5}rows` (#25430) * Refactor helix/rev3_{4,5}rows rev3_4rows and rev3_5rows are identical, except for the extra row users can snap off of their PCBs. - Add alias for rev3_4rows - Migrates legacy defines and configuration to keyboard.json - Tidy's keymap and migrates to JSON - Removes RGB Light configuration, enables RGB Matrix - Removes DIP switch configuration, as they do not appear to be present on PCBs - Adds an alternate 4 row layout for snappable PCB - Tidy's up OLED code - Enables standard features (bootmagic, extrakey, etc.) * Alias for rev3_5rows -> rev3 * Add product URL * Replace mistakenly removed DIP switch configuration * Remove rebase artifact --- data/mappings/keyboard_aliases.hjson | 6 + keyboards/helix/rev3/config.h | 5 + keyboards/helix/rev3/keyboard.json | 250 ++++++++++++++++++ .../helix/rev3/keymaps/default/keymap.json | 38 +++ keyboards/helix/rev3/rev3.c | 77 ++++++ keyboards/helix/rev3_4rows/config.h | 60 ----- keyboards/helix/rev3_4rows/keyboard.json | 118 --------- .../helix/rev3_4rows/keymaps/default/keymap.c | 180 ------------- .../rev3_4rows/keymaps/default/oled_display.c | 120 --------- .../rev3_4rows/keymaps/default/readme.md | 66 ----- keyboards/helix/rev3_4rows/oled_display.c | 9 - keyboards/helix/rev3_4rows/readme.md | 13 - keyboards/helix/rev3_4rows/rev3_4rows.c | 114 -------- keyboards/helix/rev3_4rows/rev3_4rows.h | 22 -- keyboards/helix/rev3_4rows/rules.mk | 9 - keyboards/helix/rev3_5rows/config.h | 60 ----- keyboards/helix/rev3_5rows/keyboard.json | 198 -------------- .../helix/rev3_5rows/keymaps/default/keymap.c | 182 ------------- .../rev3_5rows/keymaps/default/oled_display.c | 120 --------- .../rev3_5rows/keymaps/default/readme.md | 81 ------ .../helix/rev3_5rows/keymaps/default/rules.mk | 1 - keyboards/helix/rev3_5rows/oled_display.c | 9 - keyboards/helix/rev3_5rows/readme.md | 13 - keyboards/helix/rev3_5rows/rev3_5rows.c | 114 -------- keyboards/helix/rev3_5rows/rev3_5rows.h | 22 -- keyboards/helix/rev3_5rows/rules.mk | 10 - 26 files changed, 376 insertions(+), 1521 deletions(-) create mode 100644 keyboards/helix/rev3/config.h create mode 100644 keyboards/helix/rev3/keyboard.json create mode 100644 keyboards/helix/rev3/keymaps/default/keymap.json create mode 100644 keyboards/helix/rev3/rev3.c delete mode 100644 keyboards/helix/rev3_4rows/config.h delete mode 100644 keyboards/helix/rev3_4rows/keyboard.json delete mode 100644 keyboards/helix/rev3_4rows/keymaps/default/keymap.c delete mode 100644 keyboards/helix/rev3_4rows/keymaps/default/oled_display.c delete mode 100644 keyboards/helix/rev3_4rows/keymaps/default/readme.md delete mode 100644 keyboards/helix/rev3_4rows/oled_display.c delete mode 100644 keyboards/helix/rev3_4rows/readme.md delete mode 100644 keyboards/helix/rev3_4rows/rev3_4rows.c delete mode 100644 keyboards/helix/rev3_4rows/rev3_4rows.h delete mode 100644 keyboards/helix/rev3_4rows/rules.mk delete mode 100644 keyboards/helix/rev3_5rows/config.h delete mode 100644 keyboards/helix/rev3_5rows/keyboard.json delete mode 100644 keyboards/helix/rev3_5rows/keymaps/default/keymap.c delete mode 100644 keyboards/helix/rev3_5rows/keymaps/default/oled_display.c delete mode 100644 keyboards/helix/rev3_5rows/keymaps/default/readme.md delete mode 100644 keyboards/helix/rev3_5rows/keymaps/default/rules.mk delete mode 100644 keyboards/helix/rev3_5rows/oled_display.c delete mode 100644 keyboards/helix/rev3_5rows/readme.md delete mode 100644 keyboards/helix/rev3_5rows/rev3_5rows.c delete mode 100644 keyboards/helix/rev3_5rows/rev3_5rows.h delete mode 100644 keyboards/helix/rev3_5rows/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 42fb5e2139..73339a2c56 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -2311,6 +2311,12 @@ "handwired/dygma/raise": { "target": "handwired/dygma/raise/ansi" }, + "helix/rev3_4rows": { + "target": "helix/rev3" + }, + "helix/rev3_5rows": { + "target": "helix/rev3" + }, "ibm/model_m/mschwingen": { "target": "ibm/model_m/mschwingen/led_wired" }, diff --git a/keyboards/helix/rev3/config.h b/keyboards/helix/rev3/config.h new file mode 100644 index 0000000000..dac611de9a --- /dev/null +++ b/keyboards/helix/rev3/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" diff --git a/keyboards/helix/rev3/keyboard.json b/keyboards/helix/rev3/keyboard.json new file mode 100644 index 0000000000..7122afdd64 --- /dev/null +++ b/keyboards/helix/rev3/keyboard.json @@ -0,0 +1,250 @@ +{ + "manufacturer": "Yushakobo", + "keyboard_name": "Helix rev3", + "maintainer": "MakotoKurauchi", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "dip_switch": { + "matrix_grid": [ + [0, 6], + [1, 6], + [5, 6], + [6, 6] + ] + }, + "encoder": { + "rotary": [ + {"pin_a": "B6", "pin_b": "B5"} + ] + }, + "features": { + "bootmagic": true, + "dip_switch": false, + "encoder": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], + "rows": ["D4", "C6", "D7", "E6", "B4"] + }, + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 16, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 96, "y": 48, "flags": 4}, + {"matrix": [4, 6], "x": 96, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 80, "y": 64, "flags": 4}, + {"matrix": [4, 4], "x": 64, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 48, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 32, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 16, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [5, 5], "x": 144, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 160, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 176, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 192, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 16, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 16, "flags": 4}, + {"matrix": [6, 2], "x": 192, "y": 16, "flags": 4}, + {"matrix": [6, 3], "x": 176, "y": 16, "flags": 4}, + {"matrix": [6, 4], "x": 160, "y": 16, "flags": 4}, + {"matrix": [6, 5], "x": 144, "y": 16, "flags": 4}, + {"matrix": [7, 5], "x": 144, "y": 32, "flags": 4}, + {"matrix": [7, 4], "x": 160, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 176, "y": 32, "flags": 4}, + {"matrix": [7, 2], "x": 192, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 32, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 32, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 48, "flags": 4}, + {"matrix": [8, 1], "x": 208, "y": 48, "flags": 4}, + {"matrix": [8, 2], "x": 192, "y": 48, "flags": 4}, + {"matrix": [8, 3], "x": 176, "y": 48, "flags": 4}, + {"matrix": [8, 4], "x": 160, "y": 48, "flags": 4}, + {"matrix": [8, 5], "x": 144, "y": 48, "flags": 4}, + {"matrix": [8, 6], "x": 128, "y": 48, "flags": 4}, + {"matrix": [9, 6], "x": 128, "y": 64, "flags": 4}, + {"matrix": [9, 5], "x": 144, "y": 64, "flags": 4}, + {"matrix": [9, 4], "x": 160, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 176, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 192, "y": 64, "flags": 4}, + {"matrix": [9, 1], "x": 208, "y": 64, "flags": 4}, + {"matrix": [9, 0], "x": 224, "y": 64, "flags": 4} + ], + "max_brightness": 150, + "sleep": true, + "split_count": [32, 32] + }, + "split": { + "enabled": true, + "handedness": { + "matrix_grid": ["D7", "B2"] + }, + "serial": { + "pin": "D2" + } + }, + "url": "https://shop.yushakobo.jp/products/2143", + "usb": { + "device_version": "0.0.1", + "pid": "0x0003", + "vid": "0x3265" + }, + "ws2812": { + "pin": "D3" + }, + "layouts": { + "LAYOUT_4row": { + "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": [4, 5], "x": 9, "y": 0}, + {"matrix": [4, 4], "x": 10, "y": 0}, + {"matrix": [4, 3], "x": 11, "y": 0}, + {"matrix": [4, 2], "x": 12, "y": 0}, + {"matrix": [4, 1], "x": 13, "y": 0}, + {"matrix": [4, 0], "x": 14, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [5, 5], "x": 9, "y": 1}, + {"matrix": [5, 4], "x": 10, "y": 1}, + {"matrix": [5, 3], "x": 11, "y": 1}, + {"matrix": [5, 2], "x": 12, "y": 1}, + {"matrix": [5, 1], "x": 13, "y": 1}, + {"matrix": [5, 0], "x": 14, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [6, 5], "x": 9, "y": 2}, + {"matrix": [6, 4], "x": 10, "y": 2}, + {"matrix": [6, 3], "x": 11, "y": 2}, + {"matrix": [6, 2], "x": 12, "y": 2}, + {"matrix": [6, 1], "x": 13, "y": 2}, + {"matrix": [6, 0], "x": 14, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [7, 6], "x": 8, "y": 3}, + {"matrix": [7, 5], "x": 9, "y": 3}, + {"matrix": [7, 4], "x": 10, "y": 3}, + {"matrix": [7, 3], "x": 11, "y": 3}, + {"matrix": [7, 2], "x": 12, "y": 3}, + {"matrix": [7, 1], "x": 13, "y": 3}, + {"matrix": [7, 0], "x": 14, "y": 3} + ] + }, + "LAYOUT_5row": { + "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": [5, 5], "x": 9, "y": 0}, + {"matrix": [5, 4], "x": 10, "y": 0}, + {"matrix": [5, 3], "x": 11, "y": 0}, + {"matrix": [5, 2], "x": 12, "y": 0}, + {"matrix": [5, 1], "x": 13, "y": 0}, + {"matrix": [5, 0], "x": 14, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [6, 5], "x": 9, "y": 1}, + {"matrix": [6, 4], "x": 10, "y": 1}, + {"matrix": [6, 3], "x": 11, "y": 1}, + {"matrix": [6, 2], "x": 12, "y": 1}, + {"matrix": [6, 1], "x": 13, "y": 1}, + {"matrix": [6, 0], "x": 14, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [7, 5], "x": 9, "y": 2}, + {"matrix": [7, 4], "x": 10, "y": 2}, + {"matrix": [7, 3], "x": 11, "y": 2}, + {"matrix": [7, 2], "x": 12, "y": 2}, + {"matrix": [7, 1], "x": 13, "y": 2}, + {"matrix": [7, 0], "x": 14, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 6], "x": 6, "y": 3}, + {"matrix": [8, 6], "x": 8, "y": 3}, + {"matrix": [8, 5], "x": 9, "y": 3}, + {"matrix": [8, 4], "x": 10, "y": 3}, + {"matrix": [8, 3], "x": 11, "y": 3}, + {"matrix": [8, 2], "x": 12, "y": 3}, + {"matrix": [8, 1], "x": 13, "y": 3}, + {"matrix": [8, 0], "x": 14, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4}, + {"matrix": [4, 6], "x": 6, "y": 4}, + {"matrix": [9, 6], "x": 8, "y": 4}, + {"matrix": [9, 5], "x": 9, "y": 4}, + {"matrix": [9, 4], "x": 10, "y": 4}, + {"matrix": [9, 3], "x": 11, "y": 4}, + {"matrix": [9, 2], "x": 12, "y": 4}, + {"matrix": [9, 1], "x": 13, "y": 4}, + {"matrix": [9, 0], "x": 14, "y": 4} + ] + } + } +} diff --git a/keyboards/helix/rev3/keymaps/default/keymap.json b/keyboards/helix/rev3/keymaps/default/keymap.json new file mode 100644 index 0000000000..429aecd714 --- /dev/null +++ b/keyboards/helix/rev3/keymaps/default/keymap.json @@ -0,0 +1,38 @@ +{ + "keyboard": "helix/rev3", + "keymap": "default", + "layout": "LAYOUT_5row", + "config": { + "features": { + "encoder_map": true + } + }, + "layers": [ + [ + "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "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_BSPC", + "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_LBRC", "KC_RBRC", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_ENT" , + "MO(3)", "KC_ESC", "KC_LALT", "KC_LGUI", "LALT(KC_GRV)", "MO(1)", "KC_SPC", "KC_SPC", "MO(2)", "LALT(KC_GRV)", "KC_LEFT", "KC_DOWN", "KC_UP", "KC_RGHT" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "KC_GRV", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_DEL", + "_______", "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_MINS", "KC_EQL", "KC_LBRC", "KC_RBRC", "KC_BSLS", + "KC_CAPS", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "_______", "_______", "KC_F12", "_______", "_______", "KC_PGDN", "KC_PGUP", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "KC_MNXT", "KC_VOLD", "KC_VOLU", "KC_MPLY" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "KC_F1", "KC_F2", "KC_F3", "KC_F4", "KC_F5", "KC_F6", "KC_F7", "KC_F8", "KC_F9", "KC_F10", "KC_F11", "KC_F12", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "AG_NORM", "AG_SWAP", "_______", "_______", "RM_TOGG", "RM_HUEU", "RM_SATU", "RM_VALU", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "RM_NEXT", "RM_HUED", "RM_SATD", "RM_VALD" + ] + ], + "encoders": [ + [{"ccw": "KC_VOLD", "cw": "KC_VOLU"}, {"ccw": "KC_PGUP", "cw": "KC_PGDN"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}], + [{"ccw": "_______", "cw": "_______"}, {"ccw": "_______", "cw": "_______"}] + ] +} diff --git a/keyboards/helix/rev3/rev3.c b/keyboards/helix/rev3/rev3.c new file mode 100644 index 0000000000..b9960a11bf --- /dev/null +++ b/keyboards/helix/rev3/rev3.c @@ -0,0 +1,77 @@ +// Copyright 2020 Yushakobo +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +#ifdef OLED_ENABLE +void render_status(void) { + static const char os_logo[][2][3] PROGMEM = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}}; + if (!keymap_config.swap_lalt_lgui) { + oled_write_P(os_logo[0][0], false); + oled_write_P(PSTR("\n"), false); + oled_write_P(os_logo[0][1], false); + } else { + oled_write_P(os_logo[1][0], false); + oled_write_P(PSTR("\n"), false); + oled_write_P(os_logo[1][1], false); + } + + oled_write_P(PSTR(" Layer: "), false); + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_ln_P(PSTR("Default"), false); + break; + case 1: + oled_write_ln_P(PSTR("Lower"), false); + break; + case 2: + oled_write_ln_P(PSTR("Raise"), false); + break; + case 3: + oled_write_ln_P(PSTR("Adjust"), false); + break; + default: + oled_write_ln_P(PSTR("Undefined"), false); + } + oled_write_P(PSTR("\n"), false); + + led_t led_state = host_keyboard_led_state(); + oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); + oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); + oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); +} + +static void render_logo(void) { + static const char PROGMEM qmk_logo[] = { + // clang-format off + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 + // clang-format on + }; + oled_write_P(qmk_logo, false); +} + +static void render_rgb_matrix_status(void) { + oled_write_P(PSTR(" LED"), false); + oled_write(get_u8_str(rgb_matrix_get_mode(), ' '), false); + oled_write_char(':', false); + oled_write(get_u8_str(rgb_matrix_get_hue() / RGB_MATRIX_HUE_STEP, ' '), false); + oled_write_char(',', false); + oled_write(get_u8_str(rgb_matrix_get_sat() / RGB_MATRIX_SAT_STEP, ' '), false); + oled_write_char(',', false); + oled_write(get_u8_str(rgb_matrix_get_val() / RGB_MATRIX_VAL_STEP, ' '), false); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + if (is_keyboard_master()) { + render_status(); + } else { + render_logo(); + render_rgb_matrix_status(); + } + return false; +} +#endif diff --git a/keyboards/helix/rev3_4rows/config.h b/keyboards/helix/rev3_4rows/config.h deleted file mode 100644 index 56d9a13feb..0000000000 --- a/keyboards/helix/rev3_4rows/config.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2020 yushakobo - -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 - -/* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 7 - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * - */ -#define MATRIX_ROW_PINS { D4, C6, D7, E6 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 } - -/* COL2ROW, ROW2COL*/ -#define DIODE_DIRECTION COL2ROW - -/* Split hand configration */ -#define SPLIT_HAND_MATRIX_GRID D7,B2 - -/* Custom font */ -#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -//#define NO_DEBUG - -/* disable print */ -//#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT diff --git a/keyboards/helix/rev3_4rows/keyboard.json b/keyboards/helix/rev3_4rows/keyboard.json deleted file mode 100644 index 3d44e8fe78..0000000000 --- a/keyboards/helix/rev3_4rows/keyboard.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "keyboard_name": "Helix rev3 4rows", - "manufacturer": "yushakobo", - "maintainer": "yushakobo", - "usb": { - "vid": "0x3265", - "pid": "0x0004", - "device_version": "0.0.1" - }, - "qmk": { - "locking": { - "enabled": true, - "resync": true - } - }, - "rgb_matrix": { - "driver": "ws2812", - "sat_steps": 8, - "val_steps": 8, - "speed_steps": 10, - "max_brightness": 150, - "split_count": [25, 25], - "sleep": true - }, - "dip_switch": { - "matrix_grid": [ [0,6], [1,6], [5,6], [6,6] ] - }, - "encoder": { - "rotary": [ - {"pin_a": "B6", "pin_b": "B5"} - ] - }, - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "ws2812": { - "pin": "D3" - }, - "rgblight": { - "led_count": 50, - "max_brightness": 120, - "split_count": [25, 25], - "animations": { - "rainbow_mood": true, - "rainbow_swirl": true, - "static_gradient": true, - "rgb_test": true - } - }, - "processor": "atmega32u4", - "bootloader": "caterina", - "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}, - {"matrix": [0, 5], "x": 5, "y": 0}, - - {"matrix": [4, 5], "x": 9, "y": 0}, - {"matrix": [4, 4], "x": 10, "y": 0}, - {"matrix": [4, 3], "x": 11, "y": 0}, - {"matrix": [4, 2], "x": 12, "y": 0}, - {"matrix": [4, 1], "x": 13, "y": 0}, - {"matrix": [4, 0], "x": 14, "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}, - {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [1, 5], "x": 5, "y": 1}, - - {"matrix": [5, 5], "x": 9, "y": 1}, - {"matrix": [5, 4], "x": 10, "y": 1}, - {"matrix": [5, 3], "x": 11, "y": 1}, - {"matrix": [5, 2], "x": 12, "y": 1}, - {"matrix": [5, 1], "x": 13, "y": 1}, - {"matrix": [5, 0], "x": 14, "y": 1}, - - {"matrix": [2, 0], "x": 0, "y": 2}, - {"matrix": [2, 1], "x": 1, "y": 2}, - {"matrix": [2, 2], "x": 2, "y": 2}, - {"matrix": [2, 3], "x": 3, "y": 2}, - {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [2, 5], "x": 5, "y": 2}, - - {"matrix": [6, 5], "x": 9, "y": 2}, - {"matrix": [6, 4], "x": 10, "y": 2}, - {"matrix": [6, 3], "x": 11, "y": 2}, - {"matrix": [6, 2], "x": 12, "y": 2}, - {"matrix": [6, 1], "x": 13, "y": 2}, - {"matrix": [6, 0], "x": 14, "y": 2}, - - {"matrix": [3, 0], "x": 0, "y": 3}, - {"matrix": [3, 1], "x": 1, "y": 3}, - {"matrix": [3, 2], "x": 2, "y": 3}, - {"matrix": [3, 3], "x": 3, "y": 3}, - {"matrix": [3, 4], "x": 4, "y": 3}, - {"matrix": [3, 5], "x": 5, "y": 3}, - {"matrix": [3, 6], "x": 6, "y": 3}, - - {"matrix": [7, 6], "x": 8, "y": 3}, - {"matrix": [7, 5], "x": 9, "y": 3}, - {"matrix": [7, 4], "x": 10, "y": 3}, - {"matrix": [7, 3], "x": 11, "y": 3}, - {"matrix": [7, 2], "x": 12, "y": 3}, - {"matrix": [7, 1], "x": 13, "y": 3}, - {"matrix": [7, 0], "x": 14, "y": 3} - ] - } - } -} diff --git a/keyboards/helix/rev3_4rows/keymaps/default/keymap.c b/keyboards/helix/rev3_4rows/keymaps/default/keymap.c deleted file mode 100644 index e528558ed6..0000000000 --- a/keyboards/helix/rev3_4rows/keymaps/default/keymap.c +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 { - _QWERTY = 0, - _LOWER, - _RAISE, - _ADJUST -}; - -// Defines the keycodes used by our macros in process_record_user -enum custom_keycodes { - EISU = SAFE_RANGE, - KANA, - ADJUST, - RGBRST -}; - -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - 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_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | F12 | | | Home | End | | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | Reset|RGBRST|EEPRST| | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | Mac | | Win | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, QK_BOOT, RGBRST, EE_CLR, _______, _______, _______, _______, _______, _______, _______, KC_DEL, - _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD - ) - -}; - -bool encoder_update_user(uint8_t index, bool clockwise) { - if (index == 0) { /* Left side encoder */ - if (clockwise) { - tap_code(KC_PGDN); - } else { - tap_code(KC_PGUP); - } - } else if (index == 1) { /* Right side encoder */ - if (clockwise) { - tap_code(KC_DOWN); - } else { - tap_code(KC_UP); - } - } - return true; -} - -layer_state_t layer_state_set_user(layer_state_t state) { - return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case EISU: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG2); - }else{ - tap_code16(LALT(KC_GRAVE)); - } - } else { - unregister_code(KC_LNG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG1); - }else{ - tap_code16(LALT(KC_GRAVE)); - } - } else { - unregister_code(KC_LNG1); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_LOWER); - layer_on(_RAISE); - } else { - layer_off(_LOWER); - layer_off(_RAISE); - } - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - } - #endif - break; - } - return true; -} diff --git a/keyboards/helix/rev3_4rows/keymaps/default/oled_display.c b/keyboards/helix/rev3_4rows/keymaps/default/oled_display.c deleted file mode 100644 index 1158461e78..0000000000 --- a/keyboards/helix/rev3_4rows/keymaps/default/oled_display.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 - -#include - -// Defines names for use in layer keycodes and the keymap -enum layer_names { - _QWERTY = 0, - _LOWER, - _RAISE, - _ADJUST -}; - -#ifdef OLED_ENABLE - -void render_status(void) { - - // Render to mode icon - static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if (is_mac_mode()) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - }else{ - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - - oled_write_P(PSTR(" "), false); - - // Host Keyboard Layer Status - oled_write_P(PSTR("Layer: "), false); - - switch (get_highest_layer(layer_state)) { - case _QWERTY: - oled_write_P(PSTR("Default\n"), false); - break; - case _RAISE: - oled_write_P(PSTR("Raise\n"), false); - break; - case _LOWER: - oled_write_P(PSTR("Lower\n"), false); - break; - case _ADJUST: - oled_write_P(PSTR("Adjust\n"), false); - break; - default: - // Or use the write_ln shortcut over adding '\n' to the end of your string - oled_write_ln_P(PSTR("Undefined"), false); - } - - oled_write_P(PSTR("\n"), false); - - // Host Keyboard LED Status - led_t led_state = host_keyboard_led_state(); - oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); - oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); - oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); -} - - -static void render_logo(void) { - static const char PROGMEM qmk_logo[] = { - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 - }; - - oled_write_P(qmk_logo, false); -} - -static void render_rgbled_status(bool full) { -#ifdef RGBLIGHT_ENABLE - if (RGBLIGHT_MODES > 1 && rgblight_is_enabled()) { - if (full) { - // " LED %d:%d,%d,%d" - oled_write_P(PSTR(" LED"), false); - oled_write(get_u8_str(rgblight_get_mode(), ' '), false); - oled_write_char(':', false); - oled_write(get_u8_str(rgblight_get_hue() / RGBLIGHT_HUE_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_sat() / RGBLIGHT_SAT_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_val() / RGBLIGHT_VAL_STEP, ' '), false); - } else { - // "[%2d]" - oled_write_char('[', false); - oled_write(get_u8_str(rgblight_get_mode(), ' '), false); - oled_write_char(']', false); - } - } -#endif -} - -bool oled_task_user(void) { - if(is_keyboard_master()){ - render_status(); - }else{ - render_logo(); - render_rgbled_status(true); - } - return false; -} -#endif diff --git a/keyboards/helix/rev3_4rows/keymaps/default/readme.md b/keyboards/helix/rev3_4rows/keymaps/default/readme.md deleted file mode 100644 index e747096851..0000000000 --- a/keyboards/helix/rev3_4rows/keymaps/default/readme.md +++ /dev/null @@ -1,66 +0,0 @@ -# The default keymap for Helix rev3 4rows - -### Qwerty Layer (Base) -``` -,-----------------------------------------. ,-----------------------------------------. -| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | -|------+------+------+------+------+------+-------------+------+------+------+------+------+------| -|Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | -`-------------------------------------------------------------------------------------------------' -``` -### Lower Layer -``` -,-----------------------------------------. ,-----------------------------------------. -| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| CAPS | F7 | F8 | F9 | F10 | F11 | | F12 | | | Home | End | | -|------+------+------+------+------+------+-------------+------+------+------+------+------+------| -| | | | | | | | | | | Next | Vol- | Vol+ | Play | -`-------------------------------------------------------------------------------------------------' -``` -### Raise Layer -``` -,-----------------------------------------. ,-----------------------------------------. -| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| CAPS | F7 | F8 | F9 | F10 | F11 | | F12 | | |PageDn|PageUp| | -|------+------+------+------+------+------+-------------+------+------+------+------+------+------| -| | | | | | | | | | | Next | Vol- | Vol+ | Play | -`-------------------------------------------------------------------------------------------------' -``` -### Adjust Layer (Lower + Raise) -``` -,-----------------------------------------. ,-----------------------------------------. -| F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | Reset|RGBRST|EEPRST| | | | | | | | | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | Mac | | Win | |RGB ON| HUE+ | SAT+ | VAL+ | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | | | MODE | HUE- | SAT- | VAL- | -`-------------------------------------------------------------------------------------------------' -``` - -### Rotary Encoder Settings - -|L/R|Clockwise|Counter Clockwise| -|---|---|---| -|Left|Page Down|Page Up| -|Right|Down|Up| - -### DipSW Settings - -|Switch No.|| -|---|---| -|Left 1|Toggle Win/mac| -|Left 2|Not assigned| -|Right 1|Not assigned| -|Right 2|Not assigned| diff --git a/keyboards/helix/rev3_4rows/oled_display.c b/keyboards/helix/rev3_4rows/oled_display.c deleted file mode 100644 index 36bf63cb60..0000000000 --- a/keyboards/helix/rev3_4rows/oled_display.c +++ /dev/null @@ -1,9 +0,0 @@ -/* - - There are several ways to create your own keymap oled code: - - * Add the oled code to your keymaps//keymap.c. - * Create a new file in your keymaps// directory, add the oled code, and add `SRC + = ` to keymaps//rules.mk. - * Copy keymaps/default/oled_display.c to your keymaps// directory and modify it. - -*/ diff --git a/keyboards/helix/rev3_4rows/readme.md b/keyboards/helix/rev3_4rows/readme.md deleted file mode 100644 index 25e856badf..0000000000 --- a/keyboards/helix/rev3_4rows/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -# Helix rev3 4rows - -A compact split ortholinear keyboard. - -* Keyboard Maintainer: [yushakobo](https://github.com/yushakobo) -* Hardware Supported: Helix rev3 PCBs, Pro Micro -* Hardware Availability: (Under preparation) - -Make example for this keyboard (after setting up your build environment): - - make helix/rev3_4rows: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). diff --git a/keyboards/helix/rev3_4rows/rev3_4rows.c b/keyboards/helix/rev3_4rows/rev3_4rows.c deleted file mode 100644 index 7f655b6852..0000000000 --- a/keyboards/helix/rev3_4rows/rev3_4rows.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 "rev3_4rows.h" - -bool is_mac_mode(void) { - return keymap_config.swap_lalt_lgui == false; -} - -void set_mac_mode(bool macmode) { - /* The result is the same as pressing the AG_NORM(=MAGIC_UNSWAP_ALT_GUI)/AG_SWAP(=MAGIC_SWAP_ALT_GUI) keys. - * see - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L123-L124 - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 - */ - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(&keymap_config); -} - -#ifdef DIP_SWITCH_ENABLE -bool dip_switch_update_kb(uint8_t index, bool active) { - switch (index) { - case 0: - if(active) { // Left no.1 Helix rev3 common - set_mac_mode(false); - } else { - set_mac_mode(true); - } - break; - default: // Left no.2 or Right no.1 or Right no.2 for user/keymap - dip_switch_update_user(index, active); - break; - } - return true; -} -#endif - -#ifdef OLED_ENABLE -static char *sprint_decimal(char *buf, int data) { - if (data > 9) { - buf = sprint_decimal(buf, data/10); - } - *buf++ = "0123456789"[data%10]; - *buf = '\0'; - return buf; -} - -char *sprints(char *buf, char *src) { - while (*src) { - *buf++ = *src++; - } - *buf = '\0'; - return buf; -} - -char *sprintd(char *buf, char *leadstr, int data) { - buf = sprints(buf, leadstr); - buf = sprint_decimal(buf, data); - return buf; -} - -char *sprint2d(char *buf, char *leadstr, int data) { - buf = sprints(buf, leadstr); - if (data > 99) { - return sprint_decimal(buf, data); - } - if (data < 10) { - *buf++ = ' '; - } - return sprint_decimal(buf, data); -} - -bool oled_task_kb(void) { - if (!oled_task_user()) { return false; } - static const char PROGMEM helix_logo[] = { - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, - 0x0 - }; - static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - - if (is_keyboard_master()) { - if (is_mac_mode()) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - }else{ - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - char buf[20]; - sprint2d(buf, " Layer: ", get_highest_layer(layer_state)); - oled_write(buf, false); - } else { - oled_write_P(helix_logo, false); - } - return false; -} -#endif diff --git a/keyboards/helix/rev3_4rows/rev3_4rows.h b/keyboards/helix/rev3_4rows/rev3_4rows.h deleted file mode 100644 index f36a5f2840..0000000000 --- a/keyboards/helix/rev3_4rows/rev3_4rows.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 "quantum.h" - -bool is_mac_mode(void); -void set_mac_mode(bool macmode); diff --git a/keyboards/helix/rev3_4rows/rules.mk b/keyboards/helix/rev3_4rows/rules.mk deleted file mode 100644 index 01251cd780..0000000000 --- a/keyboards/helix/rev3_4rows/rules.mk +++ /dev/null @@ -1,9 +0,0 @@ -EXTRAKEY_ENABLE = yes # Audio control and System control -RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow -RGB_MATRIX_ENABLE = no -OLED_ENABLE = yes -ENCODER_ENABLE = yes -DIP_SWITCH_ENABLE = no -LTO_ENABLE = yes - -SRC += oled_display.c diff --git a/keyboards/helix/rev3_5rows/config.h b/keyboards/helix/rev3_5rows/config.h deleted file mode 100644 index 84173da2de..0000000000 --- a/keyboards/helix/rev3_5rows/config.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2020 yushakobo - -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 - -/* key matrix size */ -#define MATRIX_ROWS 10 -#define MATRIX_COLS 7 - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * - */ -#define MATRIX_ROW_PINS { D4, C6, D7, E6, B4 } -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 } - -/* COL2ROW, ROW2COL*/ -#define DIODE_DIRECTION COL2ROW - -/* Split hand configration */ -#define SPLIT_HAND_MATRIX_GRID D7,B2 - -/* Custom font */ -#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -//#define NO_DEBUG - -/* disable print */ -//#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT diff --git a/keyboards/helix/rev3_5rows/keyboard.json b/keyboards/helix/rev3_5rows/keyboard.json deleted file mode 100644 index 12328ea86d..0000000000 --- a/keyboards/helix/rev3_5rows/keyboard.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "keyboard_name": "Helix rev3 5rows", - "manufacturer": "yushakobo", - "maintainer": "yushakobo", - "usb": { - "vid": "0x3265", - "pid": "0x0003", - "device_version": "0.0.1" - }, - "qmk": { - "locking": { - "enabled": true, - "resync": true - } - }, - "rgb_matrix": { - "driver": "ws2812", - "sat_steps": 8, - "val_steps": 8, - "speed_steps": 10, - "layout": [ - {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, - {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, - {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, - {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, - {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, - {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, - {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, - {"matrix": [1, 1], "x": 16, "y": 16, "flags": 4}, - {"matrix": [1, 2], "x": 32, "y": 16, "flags": 4}, - {"matrix": [1, 3], "x": 48, "y": 16, "flags": 4}, - {"matrix": [1, 4], "x": 64, "y": 16, "flags": 4}, - {"matrix": [1, 5], "x": 80, "y": 16, "flags": 4}, - {"matrix": [2, 5], "x": 80, "y": 32, "flags": 4}, - {"matrix": [2, 4], "x": 64, "y": 32, "flags": 4}, - {"matrix": [2, 3], "x": 48, "y": 32, "flags": 4}, - {"matrix": [2, 2], "x": 32, "y": 32, "flags": 4}, - {"matrix": [2, 1], "x": 16, "y": 32, "flags": 4}, - {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, - {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, - {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4}, - {"matrix": [3, 2], "x": 32, "y": 48, "flags": 4}, - {"matrix": [3, 3], "x": 48, "y": 48, "flags": 4}, - {"matrix": [3, 4], "x": 64, "y": 48, "flags": 4}, - {"matrix": [3, 5], "x": 80, "y": 48, "flags": 4}, - {"matrix": [3, 6], "x": 96, "y": 48, "flags": 4}, - {"matrix": [4, 6], "x": 96, "y": 64, "flags": 4}, - {"matrix": [4, 5], "x": 80, "y": 64, "flags": 4}, - {"matrix": [4, 4], "x": 64, "y": 64, "flags": 4}, - {"matrix": [4, 3], "x": 48, "y": 64, "flags": 4}, - {"matrix": [4, 2], "x": 32, "y": 64, "flags": 4}, - {"matrix": [4, 1], "x": 16, "y": 64, "flags": 4}, - {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, - {"matrix": [5, 5], "x": 144, "y": 0, "flags": 4}, - {"matrix": [5, 4], "x": 160, "y": 0, "flags": 4}, - {"matrix": [5, 3], "x": 176, "y": 0, "flags": 4}, - {"matrix": [5, 2], "x": 192, "y": 0, "flags": 4}, - {"matrix": [5, 1], "x": 208, "y": 0, "flags": 4}, - {"matrix": [5, 0], "x": 224, "y": 0, "flags": 4}, - {"matrix": [6, 0], "x": 224, "y": 16, "flags": 4}, - {"matrix": [6, 1], "x": 208, "y": 16, "flags": 4}, - {"matrix": [6, 2], "x": 192, "y": 16, "flags": 4}, - {"matrix": [6, 3], "x": 176, "y": 16, "flags": 4}, - {"matrix": [6, 4], "x": 160, "y": 16, "flags": 4}, - {"matrix": [6, 5], "x": 144, "y": 16, "flags": 4}, - {"matrix": [7, 5], "x": 144, "y": 32, "flags": 4}, - {"matrix": [7, 4], "x": 160, "y": 32, "flags": 4}, - {"matrix": [7, 3], "x": 176, "y": 32, "flags": 4}, - {"matrix": [7, 2], "x": 192, "y": 32, "flags": 4}, - {"matrix": [7, 1], "x": 208, "y": 32, "flags": 4}, - {"matrix": [7, 0], "x": 224, "y": 32, "flags": 4}, - {"matrix": [8, 0], "x": 224, "y": 48, "flags": 4}, - {"matrix": [8, 1], "x": 208, "y": 48, "flags": 4}, - {"matrix": [8, 2], "x": 192, "y": 48, "flags": 4}, - {"matrix": [8, 3], "x": 176, "y": 48, "flags": 4}, - {"matrix": [8, 4], "x": 160, "y": 48, "flags": 4}, - {"matrix": [8, 5], "x": 144, "y": 48, "flags": 4}, - {"matrix": [8, 6], "x": 128, "y": 48, "flags": 4}, - {"matrix": [9, 6], "x": 128, "y": 64, "flags": 4}, - {"matrix": [9, 5], "x": 144, "y": 64, "flags": 4}, - {"matrix": [9, 4], "x": 160, "y": 64, "flags": 4}, - {"matrix": [9, 3], "x": 176, "y": 64, "flags": 4}, - {"matrix": [9, 2], "x": 192, "y": 64, "flags": 4}, - {"matrix": [9, 1], "x": 208, "y": 64, "flags": 4}, - {"matrix": [9, 0], "x": 224, "y": 64, "flags": 4} - ], - "max_brightness": 128, - "split_count": [32, 32], - "sleep": true - }, - "dip_switch": { - "matrix_grid": [ [0,6], [1,6], [5,6], [6,6] ] - }, - "encoder": { - "rotary": [ - {"pin_a": "B6", "pin_b": "B5"} - ] - }, - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "ws2812": { - "pin": "D3" - }, - "rgblight": { - "led_count": 64, - "max_brightness": 120, - "split_count": [32, 32], - "animations": { - "rainbow_mood": true, - "rainbow_swirl": true - } - }, - "processor": "atmega32u4", - "bootloader": "caterina", - "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}, - {"matrix": [0, 5], "x": 5, "y": 0}, - - {"matrix": [5, 5], "x": 9, "y": 0}, - {"matrix": [5, 4], "x": 10, "y": 0}, - {"matrix": [5, 3], "x": 11, "y": 0}, - {"matrix": [5, 2], "x": 12, "y": 0}, - {"matrix": [5, 1], "x": 13, "y": 0}, - {"matrix": [5, 0], "x": 14, "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}, - {"matrix": [1, 4], "x": 4, "y": 1}, - {"matrix": [1, 5], "x": 5, "y": 1}, - - {"matrix": [6, 5], "x": 9, "y": 1}, - {"matrix": [6, 4], "x": 10, "y": 1}, - {"matrix": [6, 3], "x": 11, "y": 1}, - {"matrix": [6, 2], "x": 12, "y": 1}, - {"matrix": [6, 1], "x": 13, "y": 1}, - {"matrix": [6, 0], "x": 14, "y": 1}, - - {"matrix": [2, 0], "x": 0, "y": 2}, - {"matrix": [2, 1], "x": 1, "y": 2}, - {"matrix": [2, 2], "x": 2, "y": 2}, - {"matrix": [2, 3], "x": 3, "y": 2}, - {"matrix": [2, 4], "x": 4, "y": 2}, - {"matrix": [2, 5], "x": 5, "y": 2}, - - {"matrix": [7, 5], "x": 9, "y": 2}, - {"matrix": [7, 4], "x": 10, "y": 2}, - {"matrix": [7, 3], "x": 11, "y": 2}, - {"matrix": [7, 2], "x": 12, "y": 2}, - {"matrix": [7, 1], "x": 13, "y": 2}, - {"matrix": [7, 0], "x": 14, "y": 2}, - - {"matrix": [3, 0], "x": 0, "y": 3}, - {"matrix": [3, 1], "x": 1, "y": 3}, - {"matrix": [3, 2], "x": 2, "y": 3}, - {"matrix": [3, 3], "x": 3, "y": 3}, - {"matrix": [3, 4], "x": 4, "y": 3}, - {"matrix": [3, 5], "x": 5, "y": 3}, - {"matrix": [3, 6], "x": 6, "y": 3}, - - {"matrix": [8, 6], "x": 8, "y": 3}, - {"matrix": [8, 5], "x": 9, "y": 3}, - {"matrix": [8, 4], "x": 10, "y": 3}, - {"matrix": [8, 3], "x": 11, "y": 3}, - {"matrix": [8, 2], "x": 12, "y": 3}, - {"matrix": [8, 1], "x": 13, "y": 3}, - {"matrix": [8, 0], "x": 14, "y": 3}, - - {"matrix": [4, 0], "x": 0, "y": 4}, - {"matrix": [4, 1], "x": 1, "y": 4}, - {"matrix": [4, 2], "x": 2, "y": 4}, - {"matrix": [4, 3], "x": 3, "y": 4}, - {"matrix": [4, 4], "x": 4, "y": 4}, - {"matrix": [4, 5], "x": 5, "y": 4}, - {"matrix": [4, 6], "x": 6, "y": 4}, - - {"matrix": [9, 6], "x": 8, "y": 4}, - {"matrix": [9, 5], "x": 9, "y": 4}, - {"matrix": [9, 4], "x": 10, "y": 4}, - {"matrix": [9, 3], "x": 11, "y": 4}, - {"matrix": [9, 2], "x": 12, "y": 4}, - {"matrix": [9, 1], "x": 13, "y": 4}, - {"matrix": [9, 0], "x": 14, "y": 4} - ] - } - } -} diff --git a/keyboards/helix/rev3_5rows/keymaps/default/keymap.c b/keyboards/helix/rev3_5rows/keymaps/default/keymap.c deleted file mode 100644 index 342ee77e99..0000000000 --- a/keyboards/helix/rev3_5rows/keymaps/default/keymap.c +++ /dev/null @@ -1,182 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 { - _QWERTY = 0, - _LOWER, - _RAISE, - _ADJUST -}; - -// Defines the keycodes used by our macros in process_record_user -enum custom_keycodes { - EISU = SAFE_RANGE, - KANA, - ADJUST, - RGBRST -}; - -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC, - 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - ), - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | | | | | | | | | | | | | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | Reset|RGBRST|EEPRST| | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | Mac | | Win | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - _______, QK_BOOT, RGBRST, EE_CLR, _______, _______, _______, _______, _______, _______, _______, KC_DEL, - _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_TOGG, UG_HUEU, UG_SATU, UG_VALU, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_HUED, UG_SATD, UG_VALD - ) - -}; - -#if defined(ENCODER_MAP_ENABLE) -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_QWERTY] = { ENCODER_CCW_CW(MS_WHLU, MS_WHLD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, - [_LOWER] = { ENCODER_CCW_CW(KC_PGUP, KC_PGDN), ENCODER_CCW_CW(KC_HOME, KC_END) }, - [_RAISE] = { ENCODER_CCW_CW(UG_VALD, UG_VALU), ENCODER_CCW_CW(UG_SPDD, UG_SPDU) }, - [_ADJUST] = { ENCODER_CCW_CW(UG_PREV, UG_NEXT), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) }, -}; -#endif - -layer_state_t layer_state_set_user(layer_state_t state) { - return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case EISU: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG2); - }else{ - tap_code16(LALT(KC_GRAVE)); - } - } else { - unregister_code(KC_LNG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if (is_mac_mode()) { - register_code(KC_LNG1); - }else{ - tap_code16(LALT(KC_GRAVE)); - } - } else { - unregister_code(KC_LNG1); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_LOWER); - layer_on(_RAISE); - } else { - layer_off(_LOWER); - layer_off(_RAISE); - } - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - } - #endif - break; - } - return true; -} diff --git a/keyboards/helix/rev3_5rows/keymaps/default/oled_display.c b/keyboards/helix/rev3_5rows/keymaps/default/oled_display.c deleted file mode 100644 index 1158461e78..0000000000 --- a/keyboards/helix/rev3_5rows/keymaps/default/oled_display.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 - -#include - -// Defines names for use in layer keycodes and the keymap -enum layer_names { - _QWERTY = 0, - _LOWER, - _RAISE, - _ADJUST -}; - -#ifdef OLED_ENABLE - -void render_status(void) { - - // Render to mode icon - static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if (is_mac_mode()) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - }else{ - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - - oled_write_P(PSTR(" "), false); - - // Host Keyboard Layer Status - oled_write_P(PSTR("Layer: "), false); - - switch (get_highest_layer(layer_state)) { - case _QWERTY: - oled_write_P(PSTR("Default\n"), false); - break; - case _RAISE: - oled_write_P(PSTR("Raise\n"), false); - break; - case _LOWER: - oled_write_P(PSTR("Lower\n"), false); - break; - case _ADJUST: - oled_write_P(PSTR("Adjust\n"), false); - break; - default: - // Or use the write_ln shortcut over adding '\n' to the end of your string - oled_write_ln_P(PSTR("Undefined"), false); - } - - oled_write_P(PSTR("\n"), false); - - // Host Keyboard LED Status - led_t led_state = host_keyboard_led_state(); - oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); - oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); - oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); -} - - -static void render_logo(void) { - static const char PROGMEM qmk_logo[] = { - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 - }; - - oled_write_P(qmk_logo, false); -} - -static void render_rgbled_status(bool full) { -#ifdef RGBLIGHT_ENABLE - if (RGBLIGHT_MODES > 1 && rgblight_is_enabled()) { - if (full) { - // " LED %d:%d,%d,%d" - oled_write_P(PSTR(" LED"), false); - oled_write(get_u8_str(rgblight_get_mode(), ' '), false); - oled_write_char(':', false); - oled_write(get_u8_str(rgblight_get_hue() / RGBLIGHT_HUE_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_sat() / RGBLIGHT_SAT_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_val() / RGBLIGHT_VAL_STEP, ' '), false); - } else { - // "[%2d]" - oled_write_char('[', false); - oled_write(get_u8_str(rgblight_get_mode(), ' '), false); - oled_write_char(']', false); - } - } -#endif -} - -bool oled_task_user(void) { - if(is_keyboard_master()){ - render_status(); - }else{ - render_logo(); - render_rgbled_status(true); - } - return false; -} -#endif diff --git a/keyboards/helix/rev3_5rows/keymaps/default/readme.md b/keyboards/helix/rev3_5rows/keymaps/default/readme.md deleted file mode 100644 index 423443ba71..0000000000 --- a/keyboards/helix/rev3_5rows/keymaps/default/readme.md +++ /dev/null @@ -1,81 +0,0 @@ -# The default keymap for Helix rev3 5rows - -### Qwerty Layer (Base) -``` -,-----------------------------------------. ,-----------------------------------------. -| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -|Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | -`-------------------------------------------------------------------------------------------------' - -``` - -### Lower Layer -``` -,-----------------------------------------. ,-----------------------------------------. -| | | | | | | | | | | | | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| CAPS | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | | | Next | Vol- | Vol+ | Play | -`-------------------------------------------------------------------------------------------------' - -``` - - -### Raise Layer -``` -,-----------------------------------------. ,-----------------------------------------. -| | | | | | | | | | | | | Bksp | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| CAPS | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | | | Next | Vol- | Vol+ | Play | -`-------------------------------------------------------------------------------------------------' - -``` - -### Adjust Layer (Lower + Raise) -``` -,-----------------------------------------. ,-----------------------------------------. -| F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | Reset|RGBRST|EEPRST| | | | | | | | | Del | -|------+------+------+------+------+------| |------+------+------+------+------+------| -| | | | | | Mac | | Win | | | | | | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | -|------+------+------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | | | | MODE | HUE- | SAT- | VAL- | -`-------------------------------------------------------------------------------------------------' -``` - -### Rotary Encoder Settings - -|L/R|Clockwise|Counter Clockwise| -|---|---|---| -|Left|Page Down|Page Up| -|Right|Down|Up| - -### DipSW Settings - -|Switch No.|| -|---|---| -|Left 1|Toggle Win/mac| -|Left 2|Not assigned| -|Right 1|Not assigned| -|Right 2|Not assigned| diff --git a/keyboards/helix/rev3_5rows/keymaps/default/rules.mk b/keyboards/helix/rev3_5rows/keymaps/default/rules.mk deleted file mode 100644 index ee32568148..0000000000 --- a/keyboards/helix/rev3_5rows/keymaps/default/rules.mk +++ /dev/null @@ -1 +0,0 @@ -ENCODER_MAP_ENABLE = yes diff --git a/keyboards/helix/rev3_5rows/oled_display.c b/keyboards/helix/rev3_5rows/oled_display.c deleted file mode 100644 index 36bf63cb60..0000000000 --- a/keyboards/helix/rev3_5rows/oled_display.c +++ /dev/null @@ -1,9 +0,0 @@ -/* - - There are several ways to create your own keymap oled code: - - * Add the oled code to your keymaps//keymap.c. - * Create a new file in your keymaps// directory, add the oled code, and add `SRC + = ` to keymaps//rules.mk. - * Copy keymaps/default/oled_display.c to your keymaps// directory and modify it. - -*/ diff --git a/keyboards/helix/rev3_5rows/readme.md b/keyboards/helix/rev3_5rows/readme.md deleted file mode 100644 index ff7e2cd59a..0000000000 --- a/keyboards/helix/rev3_5rows/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -# Helix rev3 5rows - -A compact split ortholinear keyboard. - -* Keyboard Maintainer: [yushakobo](https://github.com/yushakobo) -* Hardware Supported: Helix rev3 PCBs, Pro Micro -* Hardware Availability: (Under preparation) - -Make example for this keyboard (after setting up your build environment): - - make helix/rev3_5rows: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). diff --git a/keyboards/helix/rev3_5rows/rev3_5rows.c b/keyboards/helix/rev3_5rows/rev3_5rows.c deleted file mode 100644 index af7276a2b5..0000000000 --- a/keyboards/helix/rev3_5rows/rev3_5rows.c +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 "rev3_5rows.h" - -bool is_mac_mode(void) { - return keymap_config.swap_lalt_lgui == false; -} - -void set_mac_mode(bool macmode) { - /* The result is the same as pressing the AG_NORM(=MAGIC_UNSWAP_ALT_GUI)/AG_SWAP(=MAGIC_SWAP_ALT_GUI) keys. - * see - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L123-L124 - * https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81 - */ - keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode; - eeconfig_update_keymap(&keymap_config); -} - -#ifdef DIP_SWITCH_ENABLE -bool dip_switch_update_kb(uint8_t index, bool active) { - switch (index) { - case 0: - if(active) { // Left no.1 Helix rev3 common - set_mac_mode(false); - } else { - set_mac_mode(true); - } - break; - default: // Left no.2 or Right no.1 or Right no.2 for user/keymap - dip_switch_update_user(index, active); - break; - } - return true; -} -#endif - -#ifdef OLED_ENABLE -static char *sprint_decimal(char *buf, int data) { - if (data > 9) { - buf = sprint_decimal(buf, data/10); - } - *buf++ = "0123456789"[data%10]; - *buf = '\0'; - return buf; -} - -char *sprints(char *buf, char *src) { - while (*src) { - *buf++ = *src++; - } - *buf = '\0'; - return buf; -} - -char *sprintd(char *buf, char *leadstr, int data) { - buf = sprints(buf, leadstr); - buf = sprint_decimal(buf, data); - return buf; -} - -char *sprint2d(char *buf, char *leadstr, int data) { - buf = sprints(buf, leadstr); - if (data > 99) { - return sprint_decimal(buf, data); - } - if (data < 10) { - *buf++ = ' '; - } - return sprint_decimal(buf, data); -} - -bool oled_task_kb(void) { - if (!oled_task_user()) { return false; } - static const char PROGMEM helix_logo[] = { - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, - 0x0 - }; - static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - - if (is_keyboard_master()) { - if (is_mac_mode()) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - }else{ - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - char buf[20]; - sprint2d(buf, " Layer: ", get_highest_layer(layer_state)); - oled_write(buf, false); - } else { - oled_write_P(helix_logo, false); - } - return false; -} -#endif diff --git a/keyboards/helix/rev3_5rows/rev3_5rows.h b/keyboards/helix/rev3_5rows/rev3_5rows.h deleted file mode 100644 index f36a5f2840..0000000000 --- a/keyboards/helix/rev3_5rows/rev3_5rows.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2020 yushakobo - * - * 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 "quantum.h" - -bool is_mac_mode(void); -void set_mac_mode(bool macmode); diff --git a/keyboards/helix/rev3_5rows/rules.mk b/keyboards/helix/rev3_5rows/rules.mk deleted file mode 100644 index d1972faa1b..0000000000 --- a/keyboards/helix/rev3_5rows/rules.mk +++ /dev/null @@ -1,10 +0,0 @@ -EXTRAKEY_ENABLE = yes # Audio control and System control -RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow -RGB_MATRIX_ENABLE = no -OLED_ENABLE = yes -ENCODER_ENABLE = yes -DIP_SWITCH_ENABLE = no -MOUSEKEY_ENABLE = yes -LTO_ENABLE = yes - -SRC += oled_display.c From 74d64c7f43a9a1a0f6a0a26c981f1611ac0edaa3 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Jul 2025 04:33:37 +0100 Subject: [PATCH 513/592] [docs] Align keyboard and keymap placeholders (#25509) --- docs/cli_commands.md | 14 +++++++------- docs/hardware_keyboard_guidelines.md | 10 +++++----- docs/newbs_building_firmware.md | 2 +- docs/newbs_flashing.md | 2 +- docs/reference_info_json.md | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index c6a7ffe191..54bf5cc123 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -17,12 +17,12 @@ qmk compile [-c] **Usage for Keymaps**: ``` -qmk compile [-c] [-e =] [-j ] [--compiledb] -kb -km +qmk compile [-c] [-e =] [-j ] [--compiledb] -kb -km ``` **Usage in Keyboard Directory**: -Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap ` +Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap ` ``` qmk compile ``` @@ -30,7 +30,7 @@ qmk compile **Usage for building all keyboards that support a specific keymap**: ``` -qmk compile -kb all -km +qmk compile -kb all -km ``` **Example**: @@ -62,7 +62,7 @@ $ qmk compile Must be under `qmk_firmware/layouts/`, and in a keymap folder. ``` -qmk compile -kb +qmk compile -kb ``` **Example**: @@ -77,11 +77,11 @@ $ qmk compile -kb dz60 It is possible to speed up compilation by adding the `-j`/`--parallel` flag. ``` -qmk compile -j -kb +qmk compile -j -kb ``` The `num_jobs` argument determines the maximum number of jobs that can be used. Setting it to zero will enable parallel compilation without limiting the maximum number of jobs. ``` -qmk compile -j 0 -kb +qmk compile -j 0 -kb ``` **Compilation Database**: @@ -120,7 +120,7 @@ qmk flash [-bl ] [-c] [-e =] [-j ] -km [-bl ] [-c] [-e =] [-j ] +qmk flash -kb -km [-bl ] [-c] [-e =] [-j ] ``` **Usage for pre-compiled firmwares**: diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md index 7e88ff231d..4df443f9fc 100644 --- a/docs/hardware_keyboard_guidelines.md +++ b/docs/hardware_keyboard_guidelines.md @@ -71,8 +71,8 @@ Your keyboard should be located in `qmk_firmware/keyboards/` and the folder name * `keyboard.json` (or `info.json`) * `config.h` * `rules.mk` -* `.c` -* `.h` +* `.c` +* `.h` ### `readme.md` @@ -203,7 +203,7 @@ The `post_rules.mk` file can interpret `features` of a keyboard-level before `co See `build_keyboard.mk` and `common_features.mk` for more details. ::: -### `` +### `` 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. @@ -214,9 +214,9 @@ The following functions are typically defined in this file: * `bool process_record_kb(uint16_t keycode, keyrecord_t *record)` * `bool led_update_kb(led_t led_state)` -### `` +### `` -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. +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 diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md index f5e529b9ce..82442b7adc 100644 --- a/docs/newbs_building_firmware.md +++ b/docs/newbs_building_firmware.md @@ -33,7 +33,7 @@ qmk new-keymap If you did not configure your environment, or you have multiple keyboards, you can specify a keyboard name: ```sh -qmk new-keymap -kb +qmk new-keymap -kb ``` Look at the output from that command, you should see something like this: diff --git a/docs/newbs_flashing.md b/docs/newbs_flashing.md index 5d5c1983e1..8131920686 100644 --- a/docs/newbs_flashing.md +++ b/docs/newbs_flashing.md @@ -60,7 +60,7 @@ open . The firmware file always follows this naming format: ``` -_.{bin,hex} +_.{bin,hex} ``` For example, the `planck/rev5` with a `default` keymap will have this filename: diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index a64f2992b5..59daafe3f9 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -2,7 +2,7 @@ The information contained in `info.json` is combined with the `config.h` and `rules.mk` files, dynamically generating the necessary configuration for your keyboard at compile time. It is also used by the [QMK API](https://github.com/qmk/qmk_api), and contains the information [QMK Configurator](https://config.qmk.fm/) needs to display a representation of your keyboard. Its key/value pairs are ruled by the [`data/schemas/keyboard.jsonschema`](https://github.com/qmk/qmk_firmware/blob/master/data/schemas/keyboard.jsonschema) file. To learn more about the why and how of the schema file see the [Data Driven Configuration](data_driven_config) page. -You can create `info.json` files at every level under `qmk_firmware/keyboards/`. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies information common to all Clueboard products, such as `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` contains more specific information about Clueboard 66%. +You can create `info.json` files at every level under `qmk_firmware/keyboards/`. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies information common to all Clueboard products, such as `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` contains more specific information about Clueboard 66%. ## General Metadata {#general-metadata} From 36c3f4deba7e4c670736cc95db144b25156e90f1 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 23 Jul 2025 13:08:48 +0100 Subject: [PATCH 514/592] [docs] Align more keyboard placeholders (#25510) --- docs/drivers/aw20216s.md | 2 +- docs/drivers/is31fl3218.md | 2 +- docs/drivers/is31fl3236.md | 2 +- docs/drivers/is31fl3729.md | 2 +- docs/drivers/is31fl3731.md | 2 +- docs/drivers/is31fl3733.md | 2 +- docs/drivers/is31fl3736.md | 2 +- docs/drivers/is31fl3737.md | 2 +- docs/drivers/is31fl3741.md | 2 +- docs/drivers/is31fl3742a.md | 2 +- docs/drivers/is31fl3743a.md | 2 +- docs/drivers/is31fl3745.md | 2 +- docs/drivers/is31fl3746a.md | 2 +- docs/drivers/snled27351.md | 2 +- docs/getting_started_introduction.md | 4 ++-- docs/getting_started_make_guide.md | 4 ++-- docs/hardware_keyboard_guidelines.md | 4 ++-- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/drivers/aw20216s.md b/docs/drivers/aw20216s.md index 042c8df129..a8c87dd0f9 100644 --- a/docs/drivers/aw20216s.md +++ b/docs/drivers/aw20216s.md @@ -44,7 +44,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT] = { diff --git a/docs/drivers/is31fl3218.md b/docs/drivers/is31fl3218.md index 1c98069120..ccc70c3340 100644 --- a/docs/drivers/is31fl3218.md +++ b/docs/drivers/is31fl3218.md @@ -37,7 +37,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT] = { diff --git a/docs/drivers/is31fl3236.md b/docs/drivers/is31fl3236.md index 98e05e4abd..83ce227203 100644 --- a/docs/drivers/is31fl3236.md +++ b/docs/drivers/is31fl3236.md @@ -50,7 +50,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT] = { diff --git a/docs/drivers/is31fl3729.md b/docs/drivers/is31fl3729.md index 32618d82d5..1461874707 100644 --- a/docs/drivers/is31fl3729.md +++ b/docs/drivers/is31fl3729.md @@ -120,7 +120,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3729_led_t PROGMEM g_is31fl3729_leds[IS31FL3729_LED_COUNT] = { diff --git a/docs/drivers/is31fl3731.md b/docs/drivers/is31fl3731.md index 0d928a919e..78b3d7b1ce 100644 --- a/docs/drivers/is31fl3731.md +++ b/docs/drivers/is31fl3731.md @@ -61,7 +61,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = { diff --git a/docs/drivers/is31fl3733.md b/docs/drivers/is31fl3733.md index e299f785bd..13e9148a29 100644 --- a/docs/drivers/is31fl3733.md +++ b/docs/drivers/is31fl3733.md @@ -145,7 +145,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = { diff --git a/docs/drivers/is31fl3736.md b/docs/drivers/is31fl3736.md index b679a232cd..e03275531c 100644 --- a/docs/drivers/is31fl3736.md +++ b/docs/drivers/is31fl3736.md @@ -129,7 +129,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT] = { diff --git a/docs/drivers/is31fl3737.md b/docs/drivers/is31fl3737.md index d23def237f..e4663aa019 100644 --- a/docs/drivers/is31fl3737.md +++ b/docs/drivers/is31fl3737.md @@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = { diff --git a/docs/drivers/is31fl3741.md b/docs/drivers/is31fl3741.md index dce5c08b21..b26262da7c 100644 --- a/docs/drivers/is31fl3741.md +++ b/docs/drivers/is31fl3741.md @@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT] = { diff --git a/docs/drivers/is31fl3742a.md b/docs/drivers/is31fl3742a.md index ebe648cba4..e4f15162f6 100644 --- a/docs/drivers/is31fl3742a.md +++ b/docs/drivers/is31fl3742a.md @@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3742a_led_t PROGMEM g_is31fl3742a_leds[IS31FL3742A_LED_COUNT] = { diff --git a/docs/drivers/is31fl3743a.md b/docs/drivers/is31fl3743a.md index 9ca55c5eeb..b031edd5fb 100644 --- a/docs/drivers/is31fl3743a.md +++ b/docs/drivers/is31fl3743a.md @@ -127,7 +127,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3743a_led_t PROGMEM g_is31fl3743a_leds[IS31FL3743A_LED_COUNT] = { diff --git a/docs/drivers/is31fl3745.md b/docs/drivers/is31fl3745.md index f13f029bfe..fb53dd3690 100644 --- a/docs/drivers/is31fl3745.md +++ b/docs/drivers/is31fl3745.md @@ -127,7 +127,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3745_led_t PROGMEM g_is31fl3745_leds[IS31FL3745_LED_COUNT] = { diff --git a/docs/drivers/is31fl3746a.md b/docs/drivers/is31fl3746a.md index bdd5c18357..19439a8a40 100644 --- a/docs/drivers/is31fl3746a.md +++ b/docs/drivers/is31fl3746a.md @@ -132,7 +132,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const is31fl3746a_led_t PROGMEM g_is31fl3746a_leds[IS31FL3746A_LED_COUNT] = { diff --git a/docs/drivers/snled27351.md b/docs/drivers/snled27351.md index 1d91182f7c..c0785711d9 100644 --- a/docs/drivers/snled27351.md +++ b/docs/drivers/snled27351.md @@ -52,7 +52,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config ## LED Mapping {#led-mapping} -In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: +In order to use this driver, each output must be mapped to an LED index, by adding the following to your `.c`: ```c const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { diff --git a/docs/getting_started_introduction.md b/docs/getting_started_introduction.md index 9417351747..4a44e0e700 100644 --- a/docs/getting_started_introduction.md +++ b/docs/getting_started_introduction.md @@ -19,8 +19,8 @@ Within the folder `keyboards`, its subfolder `handwired` and its vendor and manu * `config.h`: The file that sets the default compile time options. Do not edit this file directly, instead use a keymap specific `config.h`. * `info.json`: The file used for setting layout for QMK Configurator. See [Configurator Support](reference_configurator_support) for more information. * `readme.md`: A brief overview of the keyboard. -* `.h`: This file is where the keyboard layout is defined against the keyboard's switch matrix. -* `.c`: This file is where you can find custom code for the keyboard. +* `.h`: This file is where the keyboard layout is defined against the keyboard's switch matrix. +* `.c`: This file is where you can find custom code for the keyboard. For more information on project structure, see [QMK Keyboard Guidelines](hardware_keyboard_guidelines). diff --git a/docs/getting_started_make_guide.md b/docs/getting_started_make_guide.md index 59455adb30..54f915e444 100644 --- a/docs/getting_started_make_guide.md +++ b/docs/getting_started_make_guide.md @@ -1,8 +1,8 @@ # More Detailed `make` Instructions -The full syntax of the `make` command is `::`, where: +The full syntax of the `make` command is `::`, where: -* `` is the path of the keyboard, for example `planck` +* `` is the path of the keyboard, for example `planck` * Use `all` to compile all keyboards * Specify the path to compile a revision, for example `planck/rev4` or `planck/rev3` * If the keyboard doesn't have any folders, it can be left out diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md index 4df443f9fc..0b8f35a373 100644 --- a/docs/hardware_keyboard_guidelines.md +++ b/docs/hardware_keyboard_guidelines.md @@ -203,7 +203,7 @@ The `post_rules.mk` file can interpret `features` of a keyboard-level before `co See `build_keyboard.mk` and `common_features.mk` for more details. ::: -### `` +### `.c` 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. @@ -214,7 +214,7 @@ The following functions are typically defined in this file: * `bool process_record_kb(uint16_t keycode, keyrecord_t *record)` * `bool led_update_kb(led_t led_state)` -### `` +### `.h` 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. From 542440eac5f6d0788fcc496fc1ef2b7e4301a175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Fri, 25 Jul 2025 08:04:12 +0800 Subject: [PATCH 515/592] Add MATRIX_ROWS_PER_HAND definition (#25513) --- quantum/matrix.c | 38 +++++++++++++++++--------------------- quantum/matrix.h | 6 ++++++ quantum/matrix_common.c | 18 +++++++----------- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/quantum/matrix.c b/quantum/matrix.c index a877fb4e41..167a70e5b6 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -25,10 +25,6 @@ along with this program. If not, see . #ifdef SPLIT_KEYBOARD # include "split_common/split_util.h" # include "split_common/transactions.h" - -# define ROWS_PER_HAND (MATRIX_ROWS / 2) -#else -# define ROWS_PER_HAND (MATRIX_ROWS) #endif #ifdef DIRECT_PINS_RIGHT @@ -52,13 +48,13 @@ along with this program. If not, see . #endif #ifdef DIRECT_PINS -static SPLIT_MUTABLE pin_t direct_pins[ROWS_PER_HAND][MATRIX_COLS] = DIRECT_PINS; +static SPLIT_MUTABLE pin_t direct_pins[MATRIX_ROWS_PER_HAND][MATRIX_COLS] = DIRECT_PINS; #elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) # ifdef MATRIX_ROW_PINS -static SPLIT_MUTABLE_ROW pin_t row_pins[ROWS_PER_HAND] = MATRIX_ROW_PINS; +static SPLIT_MUTABLE_ROW pin_t row_pins[MATRIX_ROWS_PER_HAND] = MATRIX_ROW_PINS; # endif // MATRIX_ROW_PINS # ifdef MATRIX_COL_PINS -static SPLIT_MUTABLE_COL pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +static SPLIT_MUTABLE_COL pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; # endif // MATRIX_COL_PINS #endif @@ -109,7 +105,7 @@ static inline uint8_t readMatrixPin(pin_t pin) { #ifdef DIRECT_PINS __attribute__((weak)) void matrix_init_pins(void) { - for (int row = 0; row < ROWS_PER_HAND; row++) { + for (int row = 0; row < MATRIX_ROWS_PER_HAND; row++) { for (int col = 0; col < MATRIX_COLS; col++) { pin_t pin = direct_pins[row][col]; if (pin != NO_PIN) { @@ -158,7 +154,7 @@ static void unselect_row(uint8_t row) { } static void unselect_rows(void) { - for (uint8_t x = 0; x < ROWS_PER_HAND; x++) { + for (uint8_t x = 0; x < MATRIX_ROWS_PER_HAND; x++) { unselect_row(x); } } @@ -228,7 +224,7 @@ static void unselect_cols(void) { __attribute__((weak)) void matrix_init_pins(void) { unselect_cols(); - for (uint8_t x = 0; x < ROWS_PER_HAND; x++) { + for (uint8_t x = 0; x < MATRIX_ROWS_PER_HAND; x++) { if (row_pins[x] != NO_PIN) { gpio_atomic_set_pin_input_high(row_pins[x]); } @@ -245,7 +241,7 @@ __attribute__((weak)) void matrix_read_rows_on_col(matrix_row_t current_matrix[] matrix_output_select_delay(); // For each row... - for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { + for (uint8_t row_index = 0; row_index < MATRIX_ROWS_PER_HAND; row_index++) { // Check row pin state if (readMatrixPin(row_pins[row_index]) == 0) { // Pin LO, set col bit @@ -275,16 +271,16 @@ void matrix_init(void) { // Set pinout for right half if pinout for that half is defined if (!isLeftHand) { # ifdef DIRECT_PINS_RIGHT - const pin_t direct_pins_right[ROWS_PER_HAND][MATRIX_COLS] = DIRECT_PINS_RIGHT; - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + const pin_t direct_pins_right[MATRIX_ROWS_PER_HAND][MATRIX_COLS] = DIRECT_PINS_RIGHT; + for (uint8_t i = 0; i < MATRIX_ROWS_PER_HAND; i++) { for (uint8_t j = 0; j < MATRIX_COLS; j++) { direct_pins[i][j] = direct_pins_right[i][j]; } } # endif # ifdef MATRIX_ROW_PINS_RIGHT - const pin_t row_pins_right[ROWS_PER_HAND] = MATRIX_ROW_PINS_RIGHT; - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + const pin_t row_pins_right[MATRIX_ROWS_PER_HAND] = MATRIX_ROW_PINS_RIGHT; + for (uint8_t i = 0; i < MATRIX_ROWS_PER_HAND; i++) { row_pins[i] = row_pins_right[i]; } # endif @@ -296,8 +292,8 @@ void matrix_init(void) { # endif } - thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); - thatHand = ROWS_PER_HAND - thisHand; + thisHand = isLeftHand ? 0 : (MATRIX_ROWS_PER_HAND); + thatHand = MATRIX_ROWS_PER_HAND - thisHand; #endif // initialize key pins @@ -307,7 +303,7 @@ void matrix_init(void) { memset(matrix, 0, sizeof(matrix)); memset(raw_matrix, 0, sizeof(raw_matrix)); - debounce_init(ROWS_PER_HAND); + debounce_init(MATRIX_ROWS_PER_HAND); matrix_init_kb(); } @@ -325,7 +321,7 @@ uint8_t matrix_scan(void) { #if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) // Set row, read cols - for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { + for (uint8_t current_row = 0; current_row < MATRIX_ROWS_PER_HAND; current_row++) { matrix_read_cols_on_row(curr_matrix, current_row); } #elif (DIODE_DIRECTION == ROW2COL) @@ -340,9 +336,9 @@ uint8_t matrix_scan(void) { if (changed) memcpy(raw_matrix, curr_matrix, sizeof(curr_matrix)); #ifdef SPLIT_KEYBOARD - changed = debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed) | matrix_post_scan(); + changed = debounce(raw_matrix, matrix + thisHand, MATRIX_ROWS_PER_HAND, changed) | matrix_post_scan(); #else - changed = debounce(raw_matrix, matrix, ROWS_PER_HAND, changed); + changed = debounce(raw_matrix, matrix, MATRIX_ROWS_PER_HAND, changed); matrix_scan_kb(); #endif return (uint8_t)changed; diff --git a/quantum/matrix.h b/quantum/matrix.h index a5b628fc59..99f01aece2 100644 --- a/quantum/matrix.h +++ b/quantum/matrix.h @@ -35,6 +35,12 @@ typedef uint32_t matrix_row_t; # error "MATRIX_COLS: invalid value" #endif +#ifdef SPLIT_KEYBOARD +# define MATRIX_ROWS_PER_HAND (MATRIX_ROWS / 2) +#else +# define MATRIX_ROWS_PER_HAND (MATRIX_ROWS) +#endif + #define MATRIX_ROW_SHIFTER ((matrix_row_t)1) #ifdef __cplusplus diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c index d02c527caa..b4a86fc483 100644 --- a/quantum/matrix_common.c +++ b/quantum/matrix_common.c @@ -8,10 +8,6 @@ # include "split_common/split_util.h" # include "split_common/transactions.h" # include - -# define ROWS_PER_HAND (MATRIX_ROWS / 2) -#else -# define ROWS_PER_HAND (MATRIX_ROWS) #endif #ifndef MATRIX_IO_DELAY @@ -95,8 +91,8 @@ void matrix_print(void) { bool matrix_post_scan(void) { bool changed = false; if (is_keyboard_master()) { - static bool last_connected = false; - matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; + static bool last_connected = false; + matrix_row_t slave_matrix[MATRIX_ROWS_PER_HAND] = {0}; if (transport_master_if_connected(matrix + thisHand, slave_matrix)) { changed = memcmp(matrix + thatHand, slave_matrix, sizeof(slave_matrix)) != 0; @@ -148,8 +144,8 @@ __attribute__((weak)) void matrix_slave_scan_user(void) {} __attribute__((weak)) void matrix_init(void) { #ifdef SPLIT_KEYBOARD - thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); - thatHand = ROWS_PER_HAND - thisHand; + thisHand = isLeftHand ? 0 : (MATRIX_ROWS_PER_HAND); + thatHand = MATRIX_ROWS_PER_HAND - thisHand; #endif matrix_init_custom(); @@ -160,7 +156,7 @@ __attribute__((weak)) void matrix_init(void) { matrix[i] = 0; } - debounce_init(ROWS_PER_HAND); + debounce_init(MATRIX_ROWS_PER_HAND); matrix_init_kb(); } @@ -169,9 +165,9 @@ __attribute__((weak)) uint8_t matrix_scan(void) { bool changed = matrix_scan_custom(raw_matrix); #ifdef SPLIT_KEYBOARD - changed = debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed) | matrix_post_scan(); + changed = debounce(raw_matrix, matrix + thisHand, MATRIX_ROWS_PER_HAND, changed) | matrix_post_scan(); #else - changed = debounce(raw_matrix, matrix, ROWS_PER_HAND, changed); + changed = debounce(raw_matrix, matrix, MATRIX_ROWS_PER_HAND, changed); matrix_scan_kb(); #endif From 7a939ec218056346930096a6e1836fd6bcf64027 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Mon, 28 Jul 2025 20:40:11 +0100 Subject: [PATCH 516/592] Remove some encoder resolution that duplicate defaults (#25517) --- keyboards/gkeyboard/gpad8_2r/keyboard.json | 4 ++-- keyboards/handwired/maverick0197/keydeck8/keyboard.json | 2 +- keyboards/inland/kb83/keyboard.json | 2 +- keyboards/keychron/q1v2/ansi_encoder/keyboard.json | 2 +- keyboards/keychron/q1v2/iso_encoder/keyboard.json | 2 +- keyboards/keychron/q1v2/jis_encoder/keyboard.json | 2 +- keyboards/mechwild/sugarglider/info.json | 8 ++++---- keyboards/pica40/rev2/keyboard.json | 2 +- keyboards/stront/keyboard.json | 6 +----- 9 files changed, 13 insertions(+), 17 deletions(-) diff --git a/keyboards/gkeyboard/gpad8_2r/keyboard.json b/keyboards/gkeyboard/gpad8_2r/keyboard.json index 95645a53fc..6e3f510921 100644 --- a/keyboards/gkeyboard/gpad8_2r/keyboard.json +++ b/keyboards/gkeyboard/gpad8_2r/keyboard.json @@ -35,8 +35,8 @@ "encoder": { "enabled": true, "rotary": [ - {"pin_a": "GP29", "pin_b": "GP28", "resolution": 4}, - {"pin_a": "GP2", "pin_b": "GP3", "resolution": 4} + {"pin_a": "GP29", "pin_b": "GP28"}, + {"pin_a": "GP2", "pin_b": "GP3"} ] }, "rgb_matrix": { diff --git a/keyboards/handwired/maverick0197/keydeck8/keyboard.json b/keyboards/handwired/maverick0197/keydeck8/keyboard.json index 057552e621..0f11bb194b 100644 --- a/keyboards/handwired/maverick0197/keydeck8/keyboard.json +++ b/keyboards/handwired/maverick0197/keydeck8/keyboard.json @@ -11,7 +11,7 @@ }, "encoder": { "rotary": [ - {"pin_a": "D3", "pin_b": "D2", "resolution": 4} + {"pin_a": "D3", "pin_b": "D2"} ] }, "matrix_pins": { diff --git a/keyboards/inland/kb83/keyboard.json b/keyboards/inland/kb83/keyboard.json index cd454cb93d..9e88019bd4 100644 --- a/keyboards/inland/kb83/keyboard.json +++ b/keyboards/inland/kb83/keyboard.json @@ -64,7 +64,7 @@ }, "encoder": { "rotary": [ - {"pin_a": "B13", "pin_b": "B14", "resolution": 4} + {"pin_a": "B13", "pin_b": "B14"} ] }, "qmk": { diff --git a/keyboards/keychron/q1v2/ansi_encoder/keyboard.json b/keyboards/keychron/q1v2/ansi_encoder/keyboard.json index 616c444891..a22a5f6de8 100644 --- a/keyboards/keychron/q1v2/ansi_encoder/keyboard.json +++ b/keyboards/keychron/q1v2/ansi_encoder/keyboard.json @@ -9,7 +9,7 @@ "encoder": { "enabled": true, "rotary": [ - {"pin_a": "A10", "pin_b": "A8", "resolution": 4} + {"pin_a": "A10", "pin_b": "A8"} ] }, "layouts": { diff --git a/keyboards/keychron/q1v2/iso_encoder/keyboard.json b/keyboards/keychron/q1v2/iso_encoder/keyboard.json index 38e34176b8..98f860ddd4 100644 --- a/keyboards/keychron/q1v2/iso_encoder/keyboard.json +++ b/keyboards/keychron/q1v2/iso_encoder/keyboard.json @@ -9,7 +9,7 @@ "encoder": { "enabled": true, "rotary": [ - {"pin_a": "A10", "pin_b": "A8", "resolution": 4} + {"pin_a": "A10", "pin_b": "A8"} ] }, "layouts": { diff --git a/keyboards/keychron/q1v2/jis_encoder/keyboard.json b/keyboards/keychron/q1v2/jis_encoder/keyboard.json index 544958f24f..464f952e0d 100644 --- a/keyboards/keychron/q1v2/jis_encoder/keyboard.json +++ b/keyboards/keychron/q1v2/jis_encoder/keyboard.json @@ -9,7 +9,7 @@ "encoder": { "enabled": true, "rotary": [ - {"pin_a": "A10", "pin_b": "A8", "resolution": 4} + {"pin_a": "A10", "pin_b": "A8"} ] }, "layouts": { diff --git a/keyboards/mechwild/sugarglider/info.json b/keyboards/mechwild/sugarglider/info.json index 514c90b6ce..0df558b0b2 100644 --- a/keyboards/mechwild/sugarglider/info.json +++ b/keyboards/mechwild/sugarglider/info.json @@ -51,10 +51,10 @@ }, "encoder": { "rotary": [ - {"pin_a": "B0", "pin_b": "A2", "resolution": 4}, - {"pin_a": "B3", "pin_b": "A15", "resolution": 4}, - {"pin_a": "B9", "pin_b": "B8", "resolution": 4}, - {"pin_a": "C15", "pin_b": "C14", "resolution": 4} + {"pin_a": "B0", "pin_b": "A2"}, + {"pin_a": "B3", "pin_b": "A15"}, + {"pin_a": "B9", "pin_b": "B8"}, + {"pin_a": "C15", "pin_b": "C14"} ] }, "layouts": { diff --git a/keyboards/pica40/rev2/keyboard.json b/keyboards/pica40/rev2/keyboard.json index 7fd2094706..3c753af26a 100644 --- a/keyboards/pica40/rev2/keyboard.json +++ b/keyboards/pica40/rev2/keyboard.json @@ -46,7 +46,7 @@ }, "encoder": { "rotary": [ - {"pin_a": "GP7", "pin_b": "GP7", "resolution": 4} + {"pin_a": "GP7", "pin_b": "GP7"} ] }, "usb": { diff --git a/keyboards/stront/keyboard.json b/keyboards/stront/keyboard.json index 250d5b56e1..6e83ffa50d 100644 --- a/keyboards/stront/keyboard.json +++ b/keyboards/stront/keyboard.json @@ -75,11 +75,7 @@ }, "encoder": { "rotary": [ - { - "pin_a": "GP7", - "pin_b": "GP8", - "resolution": 4 - } + {"pin_a": "GP7", "pin_b": "GP8"} ] }, "features": { From d575bf7ddcb66849a449aa5f714eb926644862ec Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 1 Aug 2025 23:26:30 +1000 Subject: [PATCH 517/592] Add proprietary libraries policy page. (#25532) --- docs/_sidebar.json | 10 ++- docs/proprietary_libs.md | 171 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 docs/proprietary_libs.md diff --git a/docs/_sidebar.json b/docs/_sidebar.json index 37f2dc580c..ee4709a650 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -21,8 +21,14 @@ { "text": "Debugging QMK", "link": "/faq_debug" }, { "text": "Keymap FAQ", "link": "/faq_keymap" }, { "text": "Squeezing Space from AVR", "link": "/squeezing_avr" }, - { "text": "Glossary", "link": "/reference_glossary" }, - { "text": "License Violations", "link": "/license_violations" } + { "text": "Glossary", "link": "/reference_glossary" } + ] + }, + { + "text": "Licensing", + "items": [ + { "text": "License Violations", "link": "/license_violations" }, + { "text": "Proprietary Libraries", "link": "/proprietary_libs" } ] }, { diff --git a/docs/proprietary_libs.md b/docs/proprietary_libs.md new file mode 100644 index 0000000000..9a4d305638 --- /dev/null +++ b/docs/proprietary_libs.md @@ -0,0 +1,171 @@ +# Proprietary Vendor Libraries + +QMK Firmware cannot include support for any proprietary vendor libraries that impose additional restrictions beyond those in the GPL. This includes binary-only distributions, hardware-locked libraries, and code with redistribution limitations. This document explains why such libraries are incompatible with the GPL-based QMK Firmware and addresses commonly proposed workarounds. + +## Architecture Constraints + +Firmware presents unique licensing challenges: + +- **Monolithic binary**: All code compiles into a single executable image +- **No OS isolation**: No operating system provides process or memory separation +- **Shared resources**: All code shares the same memory space, peripherals, and execution context +- **Static linking**: Everything is statically linked at compile time + +This monolithic nature means any proprietary code becomes inseparable from GPL code, creating immediate license violations. + +## Common Vendor Library Restrictions + +Proprietary vendor libraries typically impose restrictions incompatible with GPL freedoms: + +**Hardware Lock-in:** +- Library only licensed for specific vendor's chips +- Cannot port firmware to alternative hardware +- Examples: Nordic's and ST's chip-only clauses in their respective licenses + +**No Source Distribution:** +- Binary-only libraries without corresponding source +- Precompiled static libraries (.a/.lib files) +- No ability to modify or fix bugs +- Examples: WCH CH582 precompiled libraries, Nordic SoftDevice + +**Redistribution Limitations:** +- Restrictions on who can distribute +- Limitations on commercial use +- Required permissions or fees + +**Additional Legal Terms:** +- Patent assertions beyond GPL's scope +- Indemnification requirements +- Jurisdiction restrictions +- Explicit anti-GPL clauses + +## Bluetooth Stack Licensing Examples + +Both Nordic and ST provide Bluetooth stacks under restrictive licenses: + +**Nordic SoftDevice (under Nordic 5-clause license):** +- Binary-only Bluetooth/radio stack +- License restricts to Nordic hardware +- No source code available +- Communicates via SVC interface (still not GPL-compatible) + +**ST's Bluetooth Stack (under SLA0044 license):** +- Explicitly forbids being subject to "Open Source Terms", specifically mentioning incompatibility with the GPL +- Restricted to ST microcontrollers only +- Similar functional role to Nordic's SoftDevice + +Both represent the same fundamental problem: critical wireless functionality locked behind proprietary licenses. + +## Why the System Library Exception Doesn't Apply + +The GPL's System Library exception **cannot** rescue proprietary vendor libraries. + +### System Library Requirements + +The exception only covers libraries that: +1. Are part of the "normal form of packaging a Major Component" +2. The Major Component is an OS kernel, compiler, or similar system software +3. Are not distributed with the application +4. Are not part of the application itself + +### Why Vendor Libraries Fail These Requirements + +1. **No operating system**: Bare-metal firmware has no OS to provide system libraries +2. **Not Major Components**: Hardware drivers and HALs aren't kernels or compilers +3. **Distributed together**: Vendor code becomes part of the firmware binary +4. **Application-level code**: Peripheral drivers are application functionality + +The exception covers things like Windows system DLLs or Linux glibc, not microcontroller vendor libraries or Bluetooth stacks. + +## Attempted Workarounds + +### Architectural Separation Attempts + +**Supervisor Call (SVC) Interfaces:** + +Nordic's SoftDevice uses supervisor call based APIs instead of direct linking: +- Fixed memory regions for proprietary code +- Communication through CPU exception mechanisms +- Claims of "no linking" between components + +**Why this fails:** The GPL considers functional integration, not just linking methods. In Bluetooth-capable boards, these would require the proprietary component to function, thus they form a single work regardless of the communication mechanism. This applies equally to Nordic's SoftDevice and any similar architecture ST provides. + +**Binary-Only Distributions:** + +Multiple vendors provide precompiled libraries: +- WCH: Precompiled BLE stack +- Nordic: Binary-only SoftDevice library +- ST: Same solution as Nordic + +**Why this fails:** This is classic static linking of proprietary code into GPL code. The inability to modify these libraries violates GPL's fundamental requirements. + +### Loader-Based Separation + +- Write a GPL bootloader/loader +- Load proprietary firmware (such as Nordic/ST Bluetooth) from external storage +- Claim they're separate works + +**Problems:** +- If designed as a system, courts view as single work +- Distribution patterns matter (shipped together?) +- Functional interdependence suggests unity +- Appears designed to circumvent GPL + +## Real-World Examples + +### Bluetooth/Wireless Stacks +- **Nordic SoftDevice**: Binary-only, SVC-interface, hardware-locked +- **ST Bluetooth**: Binary-only, license explicitly GPL-incompatible +- **WCH CH582**: Precompiled Bluetooth libraries + +### HAL and Driver Libraries +- **ST HAL/LL drivers**: Source available but SLA0044 restricted +- **Nordic SDK**: Source visible but 5-Clause restricted +- **Various vendor HALs**: Platform-locked licenses + +### Mixed Proprietary/Open +- Open peripheral drivers with closed protocol stacks +- Basic HAL with proprietary performance libraries +- Partially documented systems requiring binary supplements + +## Legal and Practical Consequences + +Including any proprietary vendor library means: + +1. **License Violation**: Immediate GPL non-compliance +2. **Distribution Ban**: Users cannot legally share modified firmware +3. **Commercial Risk**: Products using the firmware face legal liability +4. **Contributor Tainting**: All GPL contributions become legally problematic +5. **Update Restrictions**: Cannot fix bugs in proprietary components + +## Evaluation Criteria for Libraries + +Before including any library, QMK needs to verify: +- Complete source code available +- GPL-compatible license (GPL, LGPL, MIT, BSD, Apache) +- No hardware restrictions +- No redistribution limitations +- No additional legal terms +- No anti-GPL clauses + +## Policy Implementation + +QMK Firmware maintains a strict policy: + +1. **No proprietary libraries**: Regardless of technical workarounds +2. **No binary blobs**: All code must have source available +3. **No platform restrictions**: Must allow porting to any hardware +4. **No additional terms**: Only GPL restrictions permitted + +## Summary + +There is no legally safe way to include proprietary vendor libraries in GPL firmware. This applies whether they're: +- Bluetooth stacks (Nordic SoftDevice, ST Bluetooth) +- Precompiled static libraries +- Binary blobs with SVC interfaces +- Source code with restrictive licenses +- Mixed open/closed systems + +**Technical architectures cannot overcome license obligations.** + +QMK chooses GPL compliance, ensuring users receive all freedoms the GPL promises. From ae07dee941adb231981ab5fe62dfc39acea069e7 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 3 Aug 2025 04:01:13 +0100 Subject: [PATCH 518/592] Improve 'new-keymap' error handling when default keymap is missing (#25536) --- lib/python/qmk/cli/new/keymap.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py index 20a0c0198c..4d19a726a4 100755 --- a/lib/python/qmk/cli/new/keymap.py +++ b/lib/python/qmk/cli/new/keymap.py @@ -9,6 +9,7 @@ from milc import cli from milc.questions import question, choice from qmk.constants import HAS_QMK_USERSPACE, QMK_USERSPACE +from qmk.errors import NoSuchKeyboardError from qmk.path import is_keyboard, keymaps, keymap from qmk.git import git_get_username from qmk.decorators import automagic_keyboard, automagic_keymap @@ -110,13 +111,18 @@ def new_keymap(cli): cli.log.error(f'Keyboard {{fg_cyan}}{kb_name}{{fg_reset}} does not exist! Please choose a valid name.') return False - # generate keymap paths - keymaps_dirs = keymaps(kb_name) - keymap_path_default = keymap(kb_name, 'default') - keymap_path_new = keymaps_dirs[0] / user_name + # validate before any keymap ops + try: + keymaps_dirs = keymaps(kb_name) + keymap_path_new = keymaps_dirs[0] / user_name + except NoSuchKeyboardError: + cli.log.error(f'Keymap folder for {{fg_cyan}}{kb_name}{{fg_reset}} does not exist!') + return False - if not keymap_path_default.exists(): - cli.log.error(f'Default keymap {{fg_cyan}}{keymap_path_default}{{fg_reset}} does not exist!') + keymap_path_default = keymap(kb_name, 'default') + + if not keymap_path_default: + cli.log.error(f'Default keymap for {{fg_cyan}}{kb_name}{{fg_reset}} does not exist!') return False if not validate_keymap_name(user_name): @@ -134,7 +140,7 @@ def new_keymap(cli): _set_converter(keymap_path_new / 'keymap.json', converter) # end message to user - cli.log.info(f'{{fg_green}}Created a new keymap called {{fg_cyan}}{user_name}{{fg_green}} in: {{fg_cyan}}{keymap_path_new}.{{fg_reset}}') + cli.log.info(f'{{fg_green}}Created a new keymap called {{fg_cyan}}{user_name}{{fg_green}} in: {{fg_cyan}}{keymap_path_new}{{fg_reset}}.') cli.log.info(f"Compile a firmware with your new keymap by typing: {{fg_yellow}}qmk compile -kb {kb_name} -km {user_name}{{fg_reset}}.") # Add to userspace compile if we have userspace available From 1a58fce043e7f2e2b938dee03945dabc29e48d73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 21:15:03 +0100 Subject: [PATCH 519/592] Bump actions/download-artifact from 4 to 5 (#25545) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci_build_major_branch.yml | 2 +- .github/workflows/ci_build_major_branch_keymap.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_build_major_branch.yml b/.github/workflows/ci_build_major_branch.yml index ddc7cb10d1..403ad8b3ef 100644 --- a/.github/workflows/ci_build_major_branch.yml +++ b/.github/workflows/ci_build_major_branch.yml @@ -88,7 +88,7 @@ jobs: fetch-depth: 0 - name: Download firmwares - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: pattern: firmware-* path: . diff --git a/.github/workflows/ci_build_major_branch_keymap.yml b/.github/workflows/ci_build_major_branch_keymap.yml index 2e0f3036a3..4123b17b5f 100644 --- a/.github/workflows/ci_build_major_branch_keymap.yml +++ b/.github/workflows/ci_build_major_branch_keymap.yml @@ -92,7 +92,7 @@ jobs: uses: actions/checkout@v4 - name: Get target definitions - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: targets-${{ inputs.keymap }} path: . @@ -139,7 +139,7 @@ jobs: uses: actions/checkout@v4 - name: Download firmwares - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: pattern: firmware-${{ inputs.keymap }}-* path: . From 12dc6d1ac80b6919fcdb084d897612559b2f391b Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 10 Aug 2025 00:14:40 +0200 Subject: [PATCH 520/592] Fix serial speed DD configuration & migrate keyboards (#25546) * Fix serial speed DD configuration - Fixes incorrect SOFT_SERIAL_SPEED mapping - Renames key split.soft_serial_speed -> split.serial.speed - Migrates keyoards that configure this, and remove configuration from keyboards that do not differ from the default behaviour - Add deprecation notice and migration support --- data/mappings/info_config.hjson | 2 +- data/schemas/keyboard.jsonschema | 10 ++++--- docs/reference_info_json.md | 6 ++--- keyboards/aleblazer/zodiark/config.h | 19 ------------- keyboards/flxlb/zplit/config.h | 1 - keyboards/giabalanai/config.h | 10 ------- .../6x6/blackpill_f411/config.h | 7 ----- keyboards/handwired/myskeeb/config.h | 1 - keyboards/handwired/split65/promicro/config.h | 2 -- keyboards/handwired/split65/stm32/config.h | 1 - keyboards/manta60/config.h | 2 -- keyboards/momoka_ergo/config.h | 2 -- keyboards/momoka_ergo/keyboard.json | 3 ++- keyboards/omkbd/ergodash/mini/config.h | 10 ------- keyboards/omkbd/ergodash/rev1/config.h | 10 ------- keyboards/omkbd/runner3680/3x6/config.h | 27 ------------------- keyboards/omkbd/runner3680/3x7/config.h | 27 ------------------- keyboards/omkbd/runner3680/3x8/config.h | 27 ------------------- keyboards/omkbd/runner3680/4x6/config.h | 27 ------------------- keyboards/omkbd/runner3680/4x7/config.h | 27 ------------------- keyboards/omkbd/runner3680/4x8/config.h | 27 ------------------- keyboards/omkbd/runner3680/5x6/config.h | 27 ------------------- keyboards/omkbd/runner3680/5x6_5x8/config.h | 27 ------------------- keyboards/omkbd/runner3680/5x7/config.h | 27 ------------------- keyboards/omkbd/runner3680/5x8/config.h | 27 ------------------- keyboards/redox/rev1/proton_c/config.h | 7 ----- keyboards/tkw/grandiceps/config.h | 2 -- keyboards/unikeyboard/diverge3/config.h | 4 --- keyboards/unikeyboard/diverge3/keyboard.json | 3 ++- keyboards/zvecr/split_blackpill/config.h | 2 -- keyboards/zvecr/split_blackpill/keyboard.json | 3 ++- keyboards/zvecr/zv48/config.h | 1 - lib/python/qmk/info.py | 3 +++ 33 files changed, 20 insertions(+), 361 deletions(-) delete mode 100644 keyboards/aleblazer/zodiark/config.h delete mode 100644 keyboards/omkbd/runner3680/3x6/config.h delete mode 100644 keyboards/omkbd/runner3680/3x7/config.h delete mode 100644 keyboards/omkbd/runner3680/3x8/config.h delete mode 100644 keyboards/omkbd/runner3680/4x6/config.h delete mode 100644 keyboards/omkbd/runner3680/4x7/config.h delete mode 100644 keyboards/omkbd/runner3680/4x8/config.h delete mode 100644 keyboards/omkbd/runner3680/5x6/config.h delete mode 100644 keyboards/omkbd/runner3680/5x6_5x8/config.h delete mode 100644 keyboards/omkbd/runner3680/5x7/config.h delete mode 100644 keyboards/omkbd/runner3680/5x8/config.h diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index 356dd6ba52..a160e490c7 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -184,7 +184,7 @@ // Split Keyboard "SOFT_SERIAL_PIN": {"info_key": "split.serial.pin"}, - "SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"}, + "SELECT_SOFT_SERIAL_SPEED": {"info_key": "split.serial.speed"}, "SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false}, "SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"}, "SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "flag"}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 13ceec5afa..3775b66c1a 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -864,8 +864,7 @@ }, "soft_serial_speed": { "type": "integer", - "minimum": 0, - "maximum": 5 + "$comment": "Deprecated: use split.serial.speed instead" }, "serial": { "type": "object", @@ -875,7 +874,12 @@ "type": "string", "enum": ["bitbang", "usart", "vendor"] }, - "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"} + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "speed": { + "type": "integer", + "minimum": 0, + "maximum": 5 + } } }, "transport": { diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index c30859955f..cf22317613 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -753,9 +753,9 @@ Configures the [Split Keyboard](features/split_keyboard) feature. * Default: `"bitbang"` * `pin` Pin * The GPIO pin to use for transmit and receive. - * `soft_serial_speed` Number - * The protocol speed, from `0` to `5` (`serial` transport protocol only). - * Default: `1` + * `speed` Number + * The protocol speed, from `0` to `5` (fastest to slowest). + * Default: `1` * `transport` * `protocol` String * The split transport protocol to use. Must be one of `custom`, `i2c`, `serial`. diff --git a/keyboards/aleblazer/zodiark/config.h b/keyboards/aleblazer/zodiark/config.h deleted file mode 100644 index 8230f082b3..0000000000 --- a/keyboards/aleblazer/zodiark/config.h +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2021 Spencer Deven - -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 SELECT_SOFT_SERIAL_SPEED 1 diff --git a/keyboards/flxlb/zplit/config.h b/keyboards/flxlb/zplit/config.h index 832108a54b..af2447eb68 100644 --- a/keyboards/flxlb/zplit/config.h +++ b/keyboards/flxlb/zplit/config.h @@ -18,7 +18,6 @@ along with this program. If not, see . #pragma once -#define SELECT_SOFT_SERIAL_SPEED 1 // #define USE_I2C #define SPLIT_USB_DETECT #define SPLIT_USB_TIMEOUT 500 diff --git a/keyboards/giabalanai/config.h b/keyboards/giabalanai/config.h index bd501c1f76..886df53c18 100644 --- a/keyboards/giabalanai/config.h +++ b/keyboards/giabalanai/config.h @@ -17,16 +17,6 @@ along with this program. If not, see . #pragma once -#define SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps - // Right side has to be the master since 1, LED data is output from right side, and 2, Audio pin is prepared on right side as a reserve. #define MASTER_RIGHT diff --git a/keyboards/handwired/dactyl_manuform/6x6/blackpill_f411/config.h b/keyboards/handwired/dactyl_manuform/6x6/blackpill_f411/config.h index 2258a17c2e..191cd9b224 100644 --- a/keyboards/handwired/dactyl_manuform/6x6/blackpill_f411/config.h +++ b/keyboards/handwired/dactyl_manuform/6x6/blackpill_f411/config.h @@ -25,13 +25,6 @@ #define SERIAL_USART_RX_PIN B7 // USART RX pin #define SERIAL_USART_TX_PIN B6 // USART TX pin -#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5 - // 0: 460800 baud - // 1: 230400 baud (default) - // 2: 115200 baud - // 3: 57600 baud - // 4: 38400 baud - // 5: 19200 baud #define SERIAL_USART_DRIVER SD1 // USART driver of TX and RX pin. default: SD1 #define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 #define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 diff --git a/keyboards/handwired/myskeeb/config.h b/keyboards/handwired/myskeeb/config.h index 8c37524a0e..d290d41aee 100644 --- a/keyboards/handwired/myskeeb/config.h +++ b/keyboards/handwired/myskeeb/config.h @@ -2,7 +2,6 @@ // Comunication and Split Detection -#define SELECT_SOFT_SERIAL_SPEED 1 #define SPLIT_USB_DETECT #define EE_HANDS #define SPLIT_USB_TIMEOUT 1000 diff --git a/keyboards/handwired/split65/promicro/config.h b/keyboards/handwired/split65/promicro/config.h index f5c5ee3be2..e6a8650b9b 100644 --- a/keyboards/handwired/split65/promicro/config.h +++ b/keyboards/handwired/split65/promicro/config.h @@ -15,8 +15,6 @@ */ #pragma once -#define SELECT_SOFT_SERIAL_SPEED 1 - // Feature diable options //#define NO_DEBUG //#define NO_PRINT diff --git a/keyboards/handwired/split65/stm32/config.h b/keyboards/handwired/split65/stm32/config.h index 3d48891e7e..bf84e29fba 100644 --- a/keyboards/handwired/split65/stm32/config.h +++ b/keyboards/handwired/split65/stm32/config.h @@ -21,7 +21,6 @@ #define AUDIO_PIN_ALT A4 #define AUDIO_PIN_ALT_AS_NEGATIVE -#define SELECT_SOFT_SERIAL_SPEED 1 #define SERIAL_USART_DRIVER SD1 #define SERIAL_USART_TX_PAL_MODE 7 #define SERIAL_USART_TIMEOUT 100 diff --git a/keyboards/manta60/config.h b/keyboards/manta60/config.h index 3f0a8cf4e1..01a48cb684 100644 --- a/keyboards/manta60/config.h +++ b/keyboards/manta60/config.h @@ -17,8 +17,6 @@ along with this program. If not, see . #pragma once -#define SELECT_SOFT_SERIAL_SPEED 1 - # ifndef IOS_DEVICE_ENABLE # define RGBLIGHT_VAL_STEP 16 # define RGBLIGHT_LIMIT_VAL 128 /* The maximum brightness level */ diff --git a/keyboards/momoka_ergo/config.h b/keyboards/momoka_ergo/config.h index dbd81b1213..6a401e3906 100644 --- a/keyboards/momoka_ergo/config.h +++ b/keyboards/momoka_ergo/config.h @@ -17,7 +17,5 @@ along with this program. If not, see . #pragma once -#define SELECT_SOFT_SERIAL_SPEED 5 - #define SPLIT_USB_DETECT #define EE_HANDS diff --git a/keyboards/momoka_ergo/keyboard.json b/keyboards/momoka_ergo/keyboard.json index 3b2ba6664f..3430932625 100644 --- a/keyboards/momoka_ergo/keyboard.json +++ b/keyboards/momoka_ergo/keyboard.json @@ -28,7 +28,8 @@ "split": { "enabled": true, "serial": { - "pin": "D1" + "pin": "D1", + "speed": 5 } }, "rgblight": { diff --git a/keyboards/omkbd/ergodash/mini/config.h b/keyboards/omkbd/ergodash/mini/config.h index 12b408ff56..373c238afd 100644 --- a/keyboards/omkbd/ergodash/mini/config.h +++ b/keyboards/omkbd/ergodash/mini/config.h @@ -19,13 +19,3 @@ along with this program. If not, see . #pragma once #define AUDIO_PIN C6 - -#define SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/ergodash/rev1/config.h b/keyboards/omkbd/ergodash/rev1/config.h index 12b408ff56..373c238afd 100644 --- a/keyboards/omkbd/ergodash/rev1/config.h +++ b/keyboards/omkbd/ergodash/rev1/config.h @@ -19,13 +19,3 @@ along with this program. If not, see . #pragma once #define AUDIO_PIN C6 - -#define SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/3x6/config.h b/keyboards/omkbd/runner3680/3x6/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/3x6/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/3x7/config.h b/keyboards/omkbd/runner3680/3x7/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/3x7/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/3x8/config.h b/keyboards/omkbd/runner3680/3x8/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/3x8/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/4x6/config.h b/keyboards/omkbd/runner3680/4x6/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/4x6/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/4x7/config.h b/keyboards/omkbd/runner3680/4x7/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/4x7/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/4x8/config.h b/keyboards/omkbd/runner3680/4x8/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/4x8/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/5x6/config.h b/keyboards/omkbd/runner3680/5x6/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/5x6/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/5x6_5x8/config.h b/keyboards/omkbd/runner3680/5x6_5x8/config.h deleted file mode 100644 index b6f3f5ff86..0000000000 --- a/keyboards/omkbd/runner3680/5x6_5x8/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2021 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/5x7/config.h b/keyboards/omkbd/runner3680/5x7/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/5x7/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/omkbd/runner3680/5x8/config.h b/keyboards/omkbd/runner3680/5x8/config.h deleted file mode 100644 index 2b0210d2be..0000000000 --- a/keyboards/omkbd/runner3680/5x8/config.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 omkbd - * - * 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 SELECT_SOFT_SERIAL_SPEED 1 -/*Sets the protocol speed when using serial communication*/ -//Speeds: -//0: about 189kbps (Experimental only) -//1: about 137kbps (default) -//2: about 75kbps -//3: about 39kbps -//4: about 26kbps -//5: about 20kbps diff --git a/keyboards/redox/rev1/proton_c/config.h b/keyboards/redox/rev1/proton_c/config.h index 4d28bd2f4a..b151d2b29e 100644 --- a/keyboards/redox/rev1/proton_c/config.h +++ b/keyboards/redox/rev1/proton_c/config.h @@ -13,13 +13,6 @@ #define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve. // Check if this feature is necessary with your keyboard design and available on the mcu. -#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5 - // 0: 460800 baud - // 1: 230400 baud (default) - // 2: 115200 baud - // 3: 57600 baud - // 4: 38400 baud - // 5: 19200 baud #define SERIAL_USART_DRIVER SD1 // USART driver of TX and RX pin. default: SD1 #define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 #define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 diff --git a/keyboards/tkw/grandiceps/config.h b/keyboards/tkw/grandiceps/config.h index a02e14f91f..04c41e2a11 100644 --- a/keyboards/tkw/grandiceps/config.h +++ b/keyboards/tkw/grandiceps/config.h @@ -15,8 +15,6 @@ */ #pragma once -#define SELECT_SOFT_SERIAL_SPEED 1 - #define WS2812_PWM_DRIVER PWMD3 #define WS2812_PWM_CHANNEL 4 #define WS2812_PWM_PAL_MODE 2 diff --git a/keyboards/unikeyboard/diverge3/config.h b/keyboards/unikeyboard/diverge3/config.h index bdd2b7cbb2..c77a4f1d16 100644 --- a/keyboards/unikeyboard/diverge3/config.h +++ b/keyboards/unikeyboard/diverge3/config.h @@ -17,10 +17,6 @@ along with this program. If not, see . #pragma once -#ifndef SELECT_SOFT_SERIAL_SPEED -#define SELECT_SOFT_SERIAL_SPEED 3 -#endif - /* If defined, GRAVE_ESC will always act as ESC when CTRL is held. * This is useful for the Windows task manager shortcut (ctrl+shift+esc). */ diff --git a/keyboards/unikeyboard/diverge3/keyboard.json b/keyboards/unikeyboard/diverge3/keyboard.json index 187e5dead0..6a4813d115 100644 --- a/keyboards/unikeyboard/diverge3/keyboard.json +++ b/keyboards/unikeyboard/diverge3/keyboard.json @@ -34,7 +34,8 @@ "split": { "enabled": true, "serial": { - "pin": "D0" + "pin": "D0", + "speed": 3 } }, "development_board": "promicro", diff --git a/keyboards/zvecr/split_blackpill/config.h b/keyboards/zvecr/split_blackpill/config.h index efc3bbe66a..59582a9726 100644 --- a/keyboards/zvecr/split_blackpill/config.h +++ b/keyboards/zvecr/split_blackpill/config.h @@ -2,8 +2,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define SELECT_SOFT_SERIAL_SPEED 0 - #define WS2812_PWM_DRIVER PWMD3 #define WS2812_PWM_CHANNEL 1 #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 diff --git a/keyboards/zvecr/split_blackpill/keyboard.json b/keyboards/zvecr/split_blackpill/keyboard.json index 407314b71a..2884b790d7 100644 --- a/keyboards/zvecr/split_blackpill/keyboard.json +++ b/keyboards/zvecr/split_blackpill/keyboard.json @@ -27,7 +27,8 @@ }, "serial": { "driver": "usart", - "pin": "B6" + "pin": "B6", + "speed": 0 }, "bootmagic": { "matrix": [4, 0] diff --git a/keyboards/zvecr/zv48/config.h b/keyboards/zvecr/zv48/config.h index 9e8c2656a9..ab9ca3355b 100644 --- a/keyboards/zvecr/zv48/config.h +++ b/keyboards/zvecr/zv48/config.h @@ -3,7 +3,6 @@ #pragma once -//#define SELECT_SOFT_SERIAL_SPEED 0 #define SERIAL_USART_SPEED 921600 #define WS2812_PWM_DRIVER PWMD3 diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index b4fa481b1b..f63228b2bc 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -477,6 +477,9 @@ def _extract_split_serial(info_data, config_c): if 'soft_serial_pin' in split: split['serial'] = split.get('serial', {}) split['serial']['pin'] = split.pop('soft_serial_pin') + if 'soft_serial_speed' in split: + split['serial'] = split.get('serial', {}) + split['serial']['speed'] = split.pop('soft_serial_speed') def _extract_split_transport(info_data, config_c): From 9dcf2a11b252d95ad83f9cd34815c57c3147168d Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 9 Aug 2025 23:18:21 +0100 Subject: [PATCH 521/592] Refactor inland/kb83 (#25542) Update keyboard to match current standards: * Move LED config to DD * Revert back to core behaviour for keycodes * Remove vendor code * Configure dip switch map * Align readme --- keyboards/inland/kb83/kb83.c | 410 +----------------- keyboards/inland/kb83/keyboard.json | 94 ++++ .../inland/kb83/keymaps/default/keymap.c | 5 + .../inland/kb83/keymaps/default/rules.mk | 1 + keyboards/inland/kb83/readme.md | 9 +- 5 files changed, 109 insertions(+), 410 deletions(-) diff --git a/keyboards/inland/kb83/kb83.c b/keyboards/inland/kb83/kb83.c index 07d8bdbdb4..431406d008 100644 --- a/keyboards/inland/kb83/kb83.c +++ b/keyboards/inland/kb83/kb83.c @@ -128,128 +128,6 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { {1, CB10_CA5, CB11_CA5, CB12_CA5}, }; -led_config_t g_led_config = { - { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, NO_LED, NO_LED}, - { 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, NO_LED, 28}, - { 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, NO_LED, 43}, - { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, NO_LED, 56, NO_LED, 57}, - { 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, NO_LED, NO_LED, 69, 70, 71}, - { 72, 73, 74, NO_LED, NO_LED, 75, NO_LED, NO_LED, NO_LED, 76, 77, 78, NO_LED, 79, 80, 81} - }, - { - { 0, 0}, // 0 - { 14, 0}, // 1 - { 29, 0}, // 2 - { 44, 0}, // 3 - { 59, 0}, // 4 - { 74, 0}, // 5 - { 89, 0}, // 6 - {104, 0}, // 7 - {119, 0}, // 8 - {134, 0}, // 9 - {149, 0}, // 10 - {164, 0}, // 11 - {179, 0}, // 12 - {194, 0}, // 13 - - { 0, 12}, // 14 - { 14, 12}, // 15 - { 28, 12}, // 16 - { 42, 12}, // 17 - { 56, 12}, // 18 - { 70, 12}, // 19 - { 84, 12}, // 20 - { 98, 12}, // 21 - {112, 12}, // 22 - {126, 12}, // 23 - {140, 12}, // 24 - {154, 12}, // 25 - {168, 12}, // 26 - {182, 12}, // 27 - {224, 12}, // 28 - - { 0, 25}, // 29 - { 14, 25}, // 30 - { 28, 25}, // 31 - { 42, 25}, // 32 - { 56, 25}, // 33 - { 70, 25}, // 34 - { 84, 25}, // 35 - { 98, 25}, // 36 - {112, 25}, // 37 - {126, 25}, // 38 - {140, 25}, // 39 - {154, 25}, // 40 - {168, 25}, // 41 - {182, 25}, // 42 - {224, 25}, // 43 - - { 0, 38}, // 44 - { 28, 38}, // 45 - { 42, 38}, // 46 - { 56, 38}, // 47 - { 70, 38}, // 48 - { 84, 38}, // 49 - { 98, 38}, // 50 - {112, 38}, // 51 - {126, 38}, // 52 - {140, 38}, // 53 - {154, 38}, // 54 - {168, 38}, // 55 - {182, 38}, // 56 - {224, 38}, // 57 - - { 0, 51}, // 58 - { 18, 51}, // 59 - { 37, 51}, // 60 - { 56, 51}, // 61 - { 74, 51}, // 62 - { 93, 51}, // 63 - {112, 51}, // 64 - {130, 51}, // 65 - {149, 51}, // 66 - {168, 51}, // 67 - {186, 51}, // 68 - {200, 51}, // 69 - {214, 51}, // 70 - {224, 51}, // 71 - - { 0, 64}, // 72 - { 18, 64}, // 73 - { 37, 64}, // 74 - { 92, 64}, // 75 - {140, 64}, // 76 - {154, 64}, // 77 - {168, 64}, // 78 - {196, 64}, // 80 - {210, 64}, // 81 - {224, 64}, // 82 - - {0, 0}, // 68 LED 1 - {0, 16}, // 69 LED 2 - {0, 32}, // 70 LED 3 - {0, 48}, // 71 LED 4 - {0, 64}, // 72 LED 5 - - {224, 0 }, // 78 LED 12 - {224, 16}, // 79 LED 13 - {224, 32}, // 80 LED 14 - {224, 48}, // 81 LED 15 - {224, 64}, // 82 LED 16 - }, - { - 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, 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, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, - } -}; - bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { if (!rgb_matrix_indicators_advanced_user(led_min, led_max)) { return false; @@ -275,45 +153,14 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { #endif -enum __layers { - WIN_B, - WIN_FN, - MAC_B, - MAC_FN -}; - -enum colors { - WHITE, - RED, - GREEN, - BLUE -}; -enum colors led_color_status = WHITE; - // clang-format on -static bool fn_make_flag = false; -static bool Lkey_flag = false; -static bool reset_glint_flag = false; -static bool while_test_flag = false; -static bool alarm_flag = false; -static uint16_t current_time = 0; -static uint8_t glint_cnt = 0; -static uint16_t scancode = 0; -static uint8_t alarm_cnt = 0; -static uint8_t RGB_HSV_level; - -hsv_t hsv; - -void led_test(uint8_t color); -void clear_eeprom(void); -void rgb_hsv_updata_user(void); bool dip_switch_update_kb(uint8_t index, bool active) { if (!dip_switch_update_user(index, active)) { return false; } if (index == 0) { - default_layer_set(1UL << (active ? MAC_B : WIN_B)); + set_single_default_layer(active ? 2 : 0); } return true; } @@ -323,163 +170,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return false; } switch (keycode) { - case MO(WIN_FN): - case MO(MAC_FN): - fn_make_flag = record->event.pressed; - return true; - case KC_ESC: - if (fn_make_flag && record->event.pressed) { - Lkey_flag = true; - current_time = timer_read(); - scancode = KC_ESC; - return false; - } else { - Lkey_flag = 0; - } - return true; - case KC_END: - if (fn_make_flag && record->event.pressed) { - if (while_test_flag) { - while_test_flag = false; - rgb_matrix_init(); - } else { - Lkey_flag = true; - current_time = timer_read(); - scancode = KC_END; - } - return false; - } else { - Lkey_flag = 0; - } - return true; - case KC_LEFT: - if (while_test_flag == true) { - if (record->event.pressed) { - if (glint_cnt == 0) - glint_cnt = 3; - else - glint_cnt--; - if ((glint_cnt % 4) == 0) { - rgb_matrix_sethsv_noeeprom(HSV_WHITE); - } else if ((glint_cnt % 4) == 1) { - rgb_matrix_sethsv_noeeprom(HSV_RED); - } else if ((glint_cnt % 4) == 2) { - rgb_matrix_sethsv_noeeprom(HSV_GREEN); - } else if ((glint_cnt % 4) == 3) { - rgb_matrix_sethsv_noeeprom(HSV_BLUE); - } - } - return false; - } - return true; - case KC_RGHT: - if (while_test_flag == true) { - if (record->event.pressed) { - glint_cnt++; - if (glint_cnt >= 4) glint_cnt = 0; - - if ((glint_cnt % 4) == 0) { - rgb_matrix_sethsv_noeeprom(HSV_WHITE); - } else if ((glint_cnt % 4) == 1) { - rgb_matrix_sethsv_noeeprom(HSV_RED); - } else if ((glint_cnt % 4) == 2) { - rgb_matrix_sethsv_noeeprom(HSV_GREEN); - } else if ((glint_cnt % 4) == 3) { - rgb_matrix_sethsv_noeeprom(HSV_BLUE); - } - } - return false; - } - return true; - case DF(WIN_B): - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - alarm_flag = true; - rgb_matrix_toggle_noeeprom(); - current_time = timer_read(); - set_single_persistent_default_layer(WIN_B); - return false; - } - return true; - case DF(MAC_B): - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - alarm_flag = true; - rgb_matrix_toggle_noeeprom(); - current_time = timer_read(); - set_single_persistent_default_layer(MAC_B); - return false; - } - return true; - - case QK_RGB_MATRIX_VALUE_UP: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_val() / (RGB_MATRIX_MAXIMUM_BRIGHTNESS / 4)) < 4) { - RGB_HSV_level++; - rgb_matrix_config.hsv.v = (uint8_t)(RGB_MATRIX_MAXIMUM_BRIGHTNESS / 4) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_VALUE_DOWN: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_val() / (RGB_MATRIX_MAXIMUM_BRIGHTNESS / 4)) > 0) { - RGB_HSV_level--; - rgb_matrix_config.hsv.v = (uint8_t)(RGB_MATRIX_MAXIMUM_BRIGHTNESS / 4) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_SATURATION_UP: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_sat() / (UINT8_MAX / 4)) < 4) { - RGB_HSV_level++; - rgb_matrix_config.hsv.s = (uint8_t)(UINT8_MAX / 4) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_SATURATION_DOWN: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_sat() / (UINT8_MAX / 4)) > 0) { - RGB_HSV_level--; - rgb_matrix_config.hsv.s = (uint8_t)(UINT8_MAX / 4) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_HUE_UP: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_hue() / (UINT8_MAX / 6)) < 6) { - RGB_HSV_level++; - rgb_matrix_config.hsv.h = (uint8_t)(UINT8_MAX / 6) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_HUE_DOWN: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_hue() / (UINT8_MAX / 6)) > 0) { - RGB_HSV_level--; - rgb_matrix_config.hsv.h = (uint8_t)(UINT8_MAX / 6) * RGB_HSV_level; - } - rgb_hsv_updata_user(); - } - return false; - case QK_RGB_MATRIX_SPEED_UP: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_speed() / (UINT8_MAX / 4)) < 4) { - RGB_HSV_level++; - rgb_matrix_set_speed((uint8_t)(UINT8_MAX / 4) * RGB_HSV_level); - } - } - return false; - case QK_RGB_MATRIX_SPEED_DOWN: - if ((fn_make_flag && record->event.pressed) && (alarm_flag == 0)) { - if ((RGB_HSV_level = (uint8_t)rgb_matrix_get_speed() / (UINT8_MAX / 4)) > 0) { - RGB_HSV_level--; - rgb_matrix_set_speed((uint8_t)(UINT8_MAX / 4) * RGB_HSV_level); - } - } - return false; case QK_RGB_MATRIX_TOGGLE: if (record->event.pressed) { switch (rgb_matrix_get_flags()) { @@ -499,102 +189,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return false; default: - return process_record_user(keycode, record); + return true; } } - -void housekeeping_task_kb(void) { - if (Lkey_flag) { - if (scancode == KC_ESC) { - if (timer_elapsed(current_time) >= 3000) { - Lkey_flag = false; - clear_eeprom(); - - current_time = timer_read(); - reset_glint_flag = true; - glint_cnt = 0; - rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); - rgb_matrix_sethsv_noeeprom(HSV_OFF); - } - } else if (scancode == KC_END) { - if (timer_elapsed(current_time) >= 3000) { - Lkey_flag = false; - clear_eeprom(); - - while_test_flag = true; - glint_cnt = 0; - rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); - rgb_matrix_sethsv_noeeprom(HSV_WHITE); - } - } - } else if (reset_glint_flag) { - if ((timer_elapsed(current_time)) >= 300) { - current_time = timer_read(); - if (((glint_cnt++) & 0x01) == 0) { - rgb_matrix_sethsv_noeeprom(HSV_RED); - } else { - rgb_matrix_sethsv_noeeprom(HSV_OFF); - } - if (glint_cnt >= 7) { - glint_cnt = 0; - reset_glint_flag = false; - rgb_matrix_init(); - } - } - } else if (alarm_cnt != 0) { - alarm_cnt--; - if (alarm_cnt == 0) { - alarm_flag = true; - rgb_matrix_toggle_noeeprom(); - current_time = timer_read(); - } - } else if (alarm_flag) { - if ((timer_elapsed(current_time)) >= 200) { - rgb_matrix_toggle_noeeprom(); - alarm_flag = 0; - } - } -} - -void led_test(uint8_t color) { - rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); - - switch (color) { - case WHITE: - rgb_matrix_sethsv_noeeprom(HSV_WHITE); - break; - - case RED: - rgb_matrix_sethsv_noeeprom(HSV_RED); - break; - - case GREEN: - rgb_matrix_sethsv_noeeprom(HSV_GREEN); - break; - - case BLUE: - rgb_matrix_sethsv_noeeprom(HSV_BLUE); - break; - } -} - -void clear_eeprom(void) { - layer_state_t default_layer_temp = default_layer_state; - eeconfig_init(); - default_layer_set(default_layer_temp); - -#ifdef VIA_ENABLE - // This resets the layout options - via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT); - // This resets the keymaps in EEPROM to what is in flash. - dynamic_keymap_reset(); - // This resets the macros in EEPROM to nothing. - dynamic_keymap_macro_reset(); -#endif - - rgb_matrix_enable_noeeprom(); -} - -void rgb_hsv_updata_user(void) { - rgb_matrix_sethsv(rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v); -} diff --git a/keyboards/inland/kb83/keyboard.json b/keyboards/inland/kb83/keyboard.json index 9e88019bd4..8686e33885 100644 --- a/keyboards/inland/kb83/keyboard.json +++ b/keyboards/inland/kb83/keyboard.json @@ -32,6 +32,100 @@ "multisplash": true }, "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 14, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 29, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 44, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 59, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 74, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 89, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 104, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 119, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 134, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 149, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 164, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 179, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 194, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 12, "flags": 4}, + {"matrix": [1, 1], "x": 14, "y": 12, "flags": 4}, + {"matrix": [1, 2], "x": 28, "y": 12, "flags": 4}, + {"matrix": [1, 3], "x": 42, "y": 12, "flags": 4}, + {"matrix": [1, 4], "x": 56, "y": 12, "flags": 4}, + {"matrix": [1, 5], "x": 70, "y": 12, "flags": 4}, + {"matrix": [1, 6], "x": 84, "y": 12, "flags": 4}, + {"matrix": [1, 7], "x": 98, "y": 12, "flags": 4}, + {"matrix": [1, 8], "x": 112, "y": 12, "flags": 4}, + {"matrix": [1, 9], "x": 126, "y": 12, "flags": 4}, + {"matrix": [1, 10], "x": 140, "y": 12, "flags": 4}, + {"matrix": [1, 11], "x": 154, "y": 12, "flags": 4}, + {"matrix": [1, 12], "x": 168, "y": 12, "flags": 4}, + {"matrix": [1, 13], "x": 182, "y": 12, "flags": 4}, + {"matrix": [1, 15], "x": 224, "y": 12, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 25, "flags": 4}, + {"matrix": [2, 1], "x": 14, "y": 25, "flags": 4}, + {"matrix": [2, 2], "x": 28, "y": 25, "flags": 4}, + {"matrix": [2, 3], "x": 42, "y": 25, "flags": 4}, + {"matrix": [2, 4], "x": 56, "y": 25, "flags": 4}, + {"matrix": [2, 5], "x": 70, "y": 25, "flags": 4}, + {"matrix": [2, 6], "x": 84, "y": 25, "flags": 4}, + {"matrix": [2, 7], "x": 98, "y": 25, "flags": 4}, + {"matrix": [2, 8], "x": 112, "y": 25, "flags": 4}, + {"matrix": [2, 9], "x": 126, "y": 25, "flags": 4}, + {"matrix": [2, 10], "x": 140, "y": 25, "flags": 4}, + {"matrix": [2, 11], "x": 154, "y": 25, "flags": 4}, + {"matrix": [2, 12], "x": 168, "y": 25, "flags": 4}, + {"matrix": [2, 13], "x": 182, "y": 25, "flags": 4}, + {"matrix": [2, 15], "x": 224, "y": 25, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 38, "flags": 4}, + {"matrix": [3, 1], "x": 28, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 42, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 56, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 70, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 84, "y": 38, "flags": 4}, + {"matrix": [3, 6], "x": 98, "y": 38, "flags": 4}, + {"matrix": [3, 7], "x": 112, "y": 38, "flags": 4}, + {"matrix": [3, 8], "x": 126, "y": 38, "flags": 4}, + {"matrix": [3, 9], "x": 140, "y": 38, "flags": 4}, + {"matrix": [3, 10], "x": 154, "y": 38, "flags": 4}, + {"matrix": [3, 11], "x": 168, "y": 38, "flags": 4}, + {"matrix": [3, 13], "x": 182, "y": 38, "flags": 4}, + {"matrix": [3, 15], "x": 224, "y": 38, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 51, "flags": 4}, + {"matrix": [4, 1], "x": 18, "y": 51, "flags": 4}, + {"matrix": [4, 2], "x": 37, "y": 51, "flags": 4}, + {"matrix": [4, 3], "x": 56, "y": 51, "flags": 4}, + {"matrix": [4, 4], "x": 74, "y": 51, "flags": 4}, + {"matrix": [4, 5], "x": 93, "y": 51, "flags": 4}, + {"matrix": [4, 6], "x": 112, "y": 51, "flags": 4}, + {"matrix": [4, 7], "x": 130, "y": 51, "flags": 4}, + {"matrix": [4, 8], "x": 149, "y": 51, "flags": 4}, + {"matrix": [4, 9], "x": 168, "y": 51, "flags": 4}, + {"matrix": [4, 10], "x": 186, "y": 51, "flags": 4}, + {"matrix": [4, 13], "x": 200, "y": 51, "flags": 4}, + {"matrix": [4, 14], "x": 214, "y": 51, "flags": 4}, + {"matrix": [4, 15], "x": 224, "y": 51, "flags": 4}, + {"matrix": [5, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [5, 1], "x": 18, "y": 64, "flags": 4}, + {"matrix": [5, 2], "x": 37, "y": 64, "flags": 4}, + {"matrix": [5, 5], "x": 92, "y": 64, "flags": 4}, + {"matrix": [5, 9], "x": 140, "y": 64, "flags": 4}, + {"matrix": [5, 10], "x": 154, "y": 64, "flags": 4}, + {"matrix": [5, 11], "x": 168, "y": 64, "flags": 4}, + {"matrix": [5, 13], "x": 196, "y": 64, "flags": 4}, + {"matrix": [5, 14], "x": 210, "y": 64, "flags": 4}, + {"matrix": [5, 15], "x": 224, "y": 64, "flags": 4}, + {"x": 0, "y": 0, "flags": 2}, + {"x": 0, "y": 16, "flags": 2}, + {"x": 0, "y": 32, "flags": 2}, + {"x": 0, "y": 48, "flags": 2}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 224, "y": 0, "flags": 2}, + {"x": 224, "y": 16, "flags": 2}, + {"x": 224, "y": 32, "flags": 2}, + {"x": 224, "y": 48, "flags": 2}, + {"x": 224, "y": 64, "flags": 2} + ], "max_brightness": 200, "react_on_keyup": true, "sleep": true diff --git a/keyboards/inland/kb83/keymaps/default/keymap.c b/keyboards/inland/kb83/keymaps/default/keymap.c index df7df65678..ac2aa5e7f7 100644 --- a/keyboards/inland/kb83/keymaps/default/keymap.c +++ b/keyboards/inland/kb83/keymaps/default/keymap.c @@ -71,3 +71,8 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { }; #endif +#if defined(DIP_SWITCH_MAP_ENABLE) +const uint16_t PROGMEM dip_switch_map[NUM_DIP_SWITCHES][NUM_DIP_STATES] = { + DIP_SWITCH_OFF_ON(DF(WIN_B), DF(MAC_B)) +}; +#endif diff --git a/keyboards/inland/kb83/keymaps/default/rules.mk b/keyboards/inland/kb83/keymaps/default/rules.mk index ee32568148..d64aefdfb8 100644 --- a/keyboards/inland/kb83/keymaps/default/rules.mk +++ b/keyboards/inland/kb83/keymaps/default/rules.mk @@ -1 +1,2 @@ ENCODER_MAP_ENABLE = yes +DIP_SWITCH_MAP_ENABLE = yes diff --git a/keyboards/inland/kb83/readme.md b/keyboards/inland/kb83/readme.md index e6f1d45990..a56b5c5b5a 100644 --- a/keyboards/inland/kb83/readme.md +++ b/keyboards/inland/kb83/readme.md @@ -14,6 +14,11 @@ Flashing example for this keyboard: make inland/kb83:default:flash -**Reset Key**: Hold down the key located at *K01*, which programmed as *Esc* while plugging in the keyboard. - 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, which programmed as *Esc* while plugging in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 00ca3628267ae85d3eb2ec19a364913c1fca434d Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 10 Aug 2025 00:27:13 +0200 Subject: [PATCH 522/592] Migrate `helix` common configuration (#25433) * Initial tidying up of top level helix/ directory Align readme.md with template & provide more detailed PCB information Remove unused rules.mk Add common config.h file Update glcdfont.c with formatting and license header * Further migrations after PRs merged Move shared configuration to top level info.json and config.h More descriptive hardware compatibility * Add changelog * Align configuration between PCBs - Migrate beta & pico to use RGB Matrix - Move previously RGB Matrix-dependent OLED code in rev3/rev3.c to top level - Remove reundant OLED code in beta/beta.c - Remove RGBLight references * Update changelog with RGB Matrix configuration --- docs/ChangeLog/20250831/HelixRefactor.md | 37 ++++ keyboards/helix/beta/beta.c | 77 -------- keyboards/helix/beta/keyboard.json | 102 ++++++---- keyboards/helix/common/glcdfont.c | 233 ----------------------- keyboards/helix/{beta => }/config.h | 2 +- keyboards/helix/glcdfont.c | 232 ++++++++++++++++++++++ keyboards/helix/{rev3/rev3.c => helix.c} | 0 keyboards/helix/info.json | 40 ++++ keyboards/helix/pico/keyboard.json | 87 +++++---- keyboards/helix/readme.md | 51 +++-- keyboards/helix/rev3/config.h | 5 - keyboards/helix/rev3/keyboard.json | 27 +-- keyboards/helix/rules.mk | 1 - 13 files changed, 475 insertions(+), 419 deletions(-) create mode 100644 docs/ChangeLog/20250831/HelixRefactor.md delete mode 100644 keyboards/helix/beta/beta.c delete mode 100644 keyboards/helix/common/glcdfont.c rename keyboards/helix/{beta => }/config.h (59%) create mode 100644 keyboards/helix/glcdfont.c rename keyboards/helix/{rev3/rev3.c => helix.c} (100%) create mode 100644 keyboards/helix/info.json delete mode 100644 keyboards/helix/rev3/config.h delete mode 100644 keyboards/helix/rules.mk diff --git a/docs/ChangeLog/20250831/HelixRefactor.md b/docs/ChangeLog/20250831/HelixRefactor.md new file mode 100644 index 0000000000..58136ce06b --- /dev/null +++ b/docs/ChangeLog/20250831/HelixRefactor.md @@ -0,0 +1,37 @@ +# Refactor of `keyboards/helix` + +This series of PRs aims to align this keyboard's configuration with current standards, and also remove unnecessary contents. + +### Refactor `helix/pico` [#25428](https://github.com/qmk/qmk_firmware/pull/25428) + - Removes redundant `back`, `base`, `sc`, `under`, & `qmk_conf` revisions + - Migrates legacy defines and configuration to JSON + - Migrates `default` keymap to JSON + - Fixes RGB configuration to illuminate 25 LEDs per half + - Enables standard features like Bootmagic, extrakey, etc. + - Updates keyboard aliases accordingly + +### Refactor `helix/rev2` [#25429](https://github.com/qmk/qmk_firmware/pull/25429) + - Removes redundant `back`, `base`, `sc`, `under`, & `qmk_conf` revisions + - Renames `rev2` to `beta`, as the only PCB sources in the official Helix GitHub repository are named "[beta](https://github.com/MakotoKurauchi/helix/tree/master/PCB/beta)", this keyboard's name in QMK Firmware was already "beta", and this PCB is sold under the name "[beta](https://shop.yushakobo.jp/products/oss_pcb?variant=39452554231969)" on the Yushakobo store + - Migrates legacy defines and configuration to JSON + - Migrates `default` keymap to JSON + - Fixes RGB configuration to illuminate 32 LEDs per half + - Enables standard features like Bootmagic, extrakey, etc. + - Updates keyboard aliases accordingly + - Tidy's up OLED code + - Adds alternate 4 row layout, as this PCB allows users to snap off the bottom row + +### Refactor `helix/rev3_{4,5}rows` [#25430](https://github.com/qmk/qmk_firmware/pull/25430) + - The `rev3_4rows` and `rev3_5rows` firmwares are identical, except for the extra row users can snap off. The 4 row PCB is not sold anywhere as an individual product, only the [5 row PCB](https://shop.yushakobo.jp/products/2143). Thus, this PR removes the aforementioned two build targets and adds a single `rev3` revision + - Migrates legacy defines and configuration to JSON + - Migrates `default` keymap to JSON + - Removes RGB Light configuration + - Updates keyboard aliases accordingly + - Tidy's up OLED code + - Adds alternate 4 row layout, as this PCB allows users to snap off the bottom row + +### Migrate helix common configuration [#25433](https://github.com/qmk/qmk_firmware/pull/25433) + - Migrates common configuration shared between revisions to the top-level keyboard directory + - Improves `readme.md` to provide more detail regarding PCB revisions + - Removes unnecessary top-level `rules.mk` file and other general tidying + - Migrates `beta` and `pico` revisions to use RGB Matrix, which is more appropriate as these PCBs are fit with per-key RGB LEDs diff --git a/keyboards/helix/beta/beta.c b/keyboards/helix/beta/beta.c deleted file mode 100644 index 8020772b96..0000000000 --- a/keyboards/helix/beta/beta.c +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2020 Yushakobo -// SPDX-License-Identifier: GPL-2.0-or-later -#include "quantum.h" - -#ifdef OLED_ENABLE -void render_status(void) { - static const char os_logo[][2][3] PROGMEM = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}}; - if (!keymap_config.swap_lalt_lgui) { - oled_write_P(os_logo[0][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[0][1], false); - } else { - oled_write_P(os_logo[1][0], false); - oled_write_P(PSTR("\n"), false); - oled_write_P(os_logo[1][1], false); - } - - oled_write_P(PSTR(" Layer: "), false); - switch (get_highest_layer(layer_state)) { - case 0: - oled_write_ln_P(PSTR("Default"), false); - break; - case 1: - oled_write_ln_P(PSTR("Lower"), false); - break; - case 2: - oled_write_ln_P(PSTR("Raise"), false); - break; - case 3: - oled_write_ln_P(PSTR("Adjust"), false); - break; - default: - oled_write_ln_P(PSTR("Undefined"), false); - } - oled_write_P(PSTR("\n"), false); - - led_t led_state = host_keyboard_led_state(); - oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); - oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); - oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); -} - -static void render_logo(void) { - static const char PROGMEM qmk_logo[] = { - // clang-format off - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00 - // clang-format on - }; - oled_write_P(qmk_logo, false); -} - -static void render_rgblight_status(void) { - oled_write_P(PSTR(" LED"), false); - oled_write(get_u8_str(rgblight_get_mode(), ' '), false); - oled_write_char(':', false); - oled_write(get_u8_str(rgblight_get_hue() / RGBLIGHT_HUE_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_sat() / RGBLIGHT_SAT_STEP, ' '), false); - oled_write_char(',', false); - oled_write(get_u8_str(rgblight_get_val() / RGBLIGHT_VAL_STEP, ' '), false); -} - -bool oled_task_kb(void) { - if (!oled_task_user()) { - return false; - } - if (is_keyboard_master()) { - render_status(); - } else { - render_logo(); - render_rgblight_status(); - } - return false; -} -#endif diff --git a/keyboards/helix/beta/keyboard.json b/keyboards/helix/beta/keyboard.json index 240a0a8869..c4eb48aab1 100644 --- a/keyboards/helix/beta/keyboard.json +++ b/keyboards/helix/beta/keyboard.json @@ -1,48 +1,82 @@ { - "manufacturer": "Yushakobo", "keyboard_name": "Helix Beta", - "maintainer": "MakotoKurauchi", - "development_board": "promicro", - "diode_direction": "COL2ROW", - "features": { - "bootmagic": true, - "extrakey": true, - "mousekey": true, - "oled": true, - "rgblight": true - }, "matrix_pins": { "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], "rows": ["D4", "C6", "D7", "E6", "B4"] }, - "rgblight": { - "animations": { - "breathing": true, - "christmas": true, - "knight": true, - "rainbow_mood": true, - "rainbow_swirl": true, - "snake": true, - "static_gradient": true - }, - "led_count": 64, - "max_brightness": 45, + "rgb_matrix": { + "layout": [ + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 16, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 96, "y": 48, "flags": 4}, + {"matrix": [4, 6], "x": 96, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 80, "y": 64, "flags": 4}, + {"matrix": [4, 4], "x": 64, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 48, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 32, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 16, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [5, 5], "x": 144, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 160, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 176, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 192, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 16, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 16, "flags": 4}, + {"matrix": [6, 2], "x": 192, "y": 16, "flags": 4}, + {"matrix": [6, 3], "x": 176, "y": 16, "flags": 4}, + {"matrix": [6, 4], "x": 160, "y": 16, "flags": 4}, + {"matrix": [6, 5], "x": 144, "y": 16, "flags": 4}, + {"matrix": [7, 5], "x": 144, "y": 32, "flags": 4}, + {"matrix": [7, 4], "x": 160, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 176, "y": 32, "flags": 4}, + {"matrix": [7, 2], "x": 192, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 32, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 32, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 48, "flags": 4}, + {"matrix": [8, 1], "x": 208, "y": 48, "flags": 4}, + {"matrix": [8, 2], "x": 192, "y": 48, "flags": 4}, + {"matrix": [8, 3], "x": 176, "y": 48, "flags": 4}, + {"matrix": [8, 4], "x": 160, "y": 48, "flags": 4}, + {"matrix": [8, 5], "x": 144, "y": 48, "flags": 4}, + {"matrix": [8, 6], "x": 128, "y": 48, "flags": 4}, + {"matrix": [9, 6], "x": 128, "y": 64, "flags": 4}, + {"matrix": [9, 5], "x": 144, "y": 64, "flags": 4}, + {"matrix": [9, 4], "x": 160, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 176, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 192, "y": 64, "flags": 4}, + {"matrix": [9, 1], "x": 208, "y": 64, "flags": 4}, + {"matrix": [9, 0], "x": 224, "y": 64, "flags": 4} + ], "split_count": [32, 32] }, - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, "url": "https://shop.yushakobo.jp/products/oss_pcb?variant=39452554231969", "usb": { "device_version": "0.0.1", - "pid": "0x0000", - "vid": "0x3265" - }, - "ws2812": { - "pin": "D3" + "pid": "0x0000" }, "layouts": { "LAYOUT_4row": { diff --git a/keyboards/helix/common/glcdfont.c b/keyboards/helix/common/glcdfont.c deleted file mode 100644 index 697d58886e..0000000000 --- a/keyboards/helix/common/glcdfont.c +++ /dev/null @@ -1,233 +0,0 @@ -// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. -// See gfxfont.h for newer custom bitmap font info. - -#include "progmem.h" - -// Standard ASCII 5x7 font - -static const unsigned char font[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, - 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, - 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, - 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, - 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, - 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, - 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, - 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, - 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, - 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, - 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, - 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, - 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, - 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, - 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, - 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, - 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, - 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, - 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, - 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, - 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, - 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, - 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, - 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, - 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, - 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, - 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, - 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, - 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, - 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, - 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, - 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, - 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, - 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, - 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, - 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, - 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, - 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, - 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, - 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, - 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, - 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, - 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, - 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, - 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, - 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, - 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, - 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, - 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, - 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, - 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, - 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, - 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, - 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, - 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, - 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, - 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, - 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, - 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, - 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, - 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, - 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, - 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, - 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, - 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, - 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, - 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, - 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, - 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, - 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, - 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, - 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, - 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, - 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, - 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, - 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, - 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, - 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, - 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, - 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, - 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, - 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, - 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, - 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, - 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, - 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, - 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, - 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, - 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, - 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, - 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, - 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, - 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, - 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, - 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, - 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, - 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, - 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, - 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, - 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, - 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, - 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, - 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, - 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, - 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, - 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, - 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, - 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, - 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, - 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, - 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, - 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, - 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, - 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, - 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, - 0x03, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, - 0xFE, 0xF8, 0xF0, 0xC0, 0x20, 0xF8, - 0xFE, 0xFF, 0xFE, 0x79, 0x27, 0x1F, - 0x7F, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, - 0xC0, 0x20, 0xF8, 0xFE, 0xFF, 0xFF, - 0x7F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFE, - 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x7F, 0x7F, 0x7F, - 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xE0, - 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, - 0xF8, 0x78, 0x78, 0x7C, 0x3C, 0x3C, - 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, - 0xBF, 0xBF, 0xDF, 0xDF, 0xEF, 0xEF, - 0x00, 0x03, 0x07, 0x1F, 0x7F, 0xFF, - 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0xC0, - 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, - 0x7F, 0x1F, 0x07, 0x03, 0x00, 0x00, - 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, - 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, - 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, - 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, - 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, - 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, - 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, - 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xC1, 0xF3, - 0xCF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFC, - 0xFB, 0xE7, 0x81, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xE3, 0xCF, 0x3F, 0xFF, - 0xFF, 0xFF, 0xFC, 0xFB, 0xE7, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x81, 0xE7, - 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E, - 0x7E, 0x3E, 0xFE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF7, 0xF7, 0xF7, 0xFB, - 0xFB, 0x7D, 0x7D, 0x7D, 0xBE, 0xBE, - 0xBE, 0xDF, 0xDF, 0xE0, 0xE0, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0xFC, 0xFC, 0x7C, 0x7E, 0x7E, - 0x3E, 0x3E, 0x1F, 0x1F, 0x1F, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, - 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, - 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, - 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, - 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, - 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, - 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, - 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x60, 0x70, 0x7C, 0x7F, 0x7F, 0x7F, - 0x7F, 0x1F, 0x06, 0x01, 0x03, 0x0F, - 0x3F, 0x7F, 0x7F, 0x7E, 0x7C, 0x7C, - 0x7E, 0x7F, 0x7F, 0x7F, 0x1F, 0x06, - 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0x7F, - 0x7E, 0x7C, 0x7C, 0x7E, 0x7F, 0x7F, - 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7F, 0x7F, 0x7D, 0x7D, 0x3D, 0x3E, - 0x1E, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, - 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, - 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, - 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, - 0x00, 0x40, 0x70, 0x78, 0x7E, 0x7F, - 0x7F, 0x7F, 0x3F, 0x0F, 0x03, 0x01, - 0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0x7F, - 0x7E, 0x78, 0x70, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; diff --git a/keyboards/helix/beta/config.h b/keyboards/helix/config.h similarity index 59% rename from keyboards/helix/beta/config.h rename to keyboards/helix/config.h index dac611de9a..01040ab49f 100644 --- a/keyboards/helix/beta/config.h +++ b/keyboards/helix/config.h @@ -2,4 +2,4 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" +#define OLED_FONT_H "keyboards/helix/glcdfont.c" diff --git a/keyboards/helix/glcdfont.c b/keyboards/helix/glcdfont.c new file mode 100644 index 0000000000..1b81bbcbfe --- /dev/null +++ b/keyboards/helix/glcdfont.c @@ -0,0 +1,232 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include "progmem.h" + +static const unsigned char font[] PROGMEM = { + // clang-format off + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, + 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, + 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, + 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, + 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, + 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, + 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, + 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, + 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, + 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, + 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, + 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, + 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, + 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, + 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, + 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, + 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, + 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, + 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, + 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, + 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, + 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, + 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, + 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, + 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, + 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, + 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, + 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, + 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, + 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, + 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, + 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, + 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, + 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, + 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, + 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, + 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, + 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, + 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, + 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, + 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, + 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, + 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, + 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, + 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, + 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, + 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, + 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, + 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, + 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, + 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, + 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, + 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, + 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, + 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, + 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, + 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, + 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, + 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, + 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, + 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, + 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, + 0x03, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, + 0xFE, 0xF8, 0xF0, 0xC0, 0x20, 0xF8, + 0xFE, 0xFF, 0xFE, 0x79, 0x27, 0x1F, + 0x7F, 0xFF, 0xFF, 0xFE, 0xF8, 0xF0, + 0xC0, 0x20, 0xF8, 0xFE, 0xFF, 0xFF, + 0x7F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFE, + 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x7F, 0x7F, 0x7F, + 0xBF, 0xBF, 0xC0, 0xC0, 0xC0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, + 0xF8, 0x78, 0x78, 0x7C, 0x3C, 0x3C, + 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0xBF, 0xBF, 0xDF, 0xDF, 0xEF, 0xEF, + 0x00, 0x03, 0x07, 0x1F, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, 0xC0, + 0xE0, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, + 0x7F, 0x1F, 0x07, 0x03, 0x00, 0x00, + 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, + 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, + 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, + 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, + 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, + 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, + 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, + 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC1, 0xF3, + 0xCF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFC, + 0xFB, 0xE7, 0x81, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xE3, 0xCF, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFC, 0xFB, 0xE7, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x81, 0xE7, + 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xF8, 0xFC, 0x7C, 0x7E, + 0x7E, 0x3E, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF7, 0xF7, 0xF7, 0xFB, + 0xFB, 0x7D, 0x7D, 0x7D, 0xBE, 0xBE, + 0xBE, 0xDF, 0xDF, 0xE0, 0xE0, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0xFC, 0xFC, 0x7C, 0x7E, 0x7E, + 0x3E, 0x3E, 0x1F, 0x1F, 0x1F, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, + 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, + 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, + 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, + 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, + 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, + 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, + 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x7C, 0x7F, 0x7F, 0x7F, + 0x7F, 0x1F, 0x06, 0x01, 0x03, 0x0F, + 0x3F, 0x7F, 0x7F, 0x7E, 0x7C, 0x7C, + 0x7E, 0x7F, 0x7F, 0x7F, 0x1F, 0x06, + 0x01, 0x07, 0x0F, 0x3F, 0x7F, 0x7F, + 0x7E, 0x7C, 0x7C, 0x7E, 0x7F, 0x7F, + 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7F, 0x7F, 0x7D, 0x7D, 0x3D, 0x3E, + 0x1E, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, + 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, + 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, + 0x00, 0x40, 0x70, 0x78, 0x7E, 0x7F, + 0x7F, 0x7F, 0x3F, 0x0F, 0x03, 0x01, + 0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0x7F, + 0x7E, 0x78, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + // clang-format on +}; diff --git a/keyboards/helix/rev3/rev3.c b/keyboards/helix/helix.c similarity index 100% rename from keyboards/helix/rev3/rev3.c rename to keyboards/helix/helix.c diff --git a/keyboards/helix/info.json b/keyboards/helix/info.json new file mode 100644 index 0000000000..a9ad385b7d --- /dev/null +++ b/keyboards/helix/info.json @@ -0,0 +1,40 @@ +{ + "manufacturer": "Yushakobo", + "maintainer": "MakotoKurauchi", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "rgb_matrix": true + }, + "rgb_matrix": { + "animations": { + "breathing": true, + "cycle_left_right": true, + "cycle_pinwheel": true, + "multisplash": true, + "solid_splash": true + }, + "driver": "ws2812", + "max_brightness": 150, + "sleep": true + }, + "split": { + "enabled": true, + "serial": { + "pin": "D2" + } + }, + "usb": { + "vid": "0x3265" + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/helix/pico/keyboard.json b/keyboards/helix/pico/keyboard.json index 61ea537576..62b25b753b 100644 --- a/keyboards/helix/pico/keyboard.json +++ b/keyboards/helix/pico/keyboard.json @@ -1,48 +1,71 @@ { - "manufacturer": "Yushakobo", "keyboard_name": "Helix Pico", - "maintainer": "MakotoKurauchi", - "development_board": "promicro", - "diode_direction": "COL2ROW", "features": { - "audio": false, - "bootmagic": true, - "extrakey": true, - "mousekey": true, - "rgblight": true + "audio": false }, "matrix_pins": { "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], "rows": ["D4", "C6", "D7", "E6"] }, - "rgblight": { - "animations": { - "breathing": true, - "christmas": true, - "knight": true, - "rainbow_mood": true, - "rainbow_swirl": true, - "snake": true, - "static_gradient": true - }, - "led_count": 50, - "max_brightness": 45, + "rgb_matrix": { + "layout": [ + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 21, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 21, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 21, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 21, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 42, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 42, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 42, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 42, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 42, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 64, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 64, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 64, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 64, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 64, "flags": 4}, + {"matrix": [3, 6], "x": 96, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 144, "y": 0, "flags": 4}, + {"matrix": [4, 4], "x": 160, "y": 0, "flags": 4}, + {"matrix": [4, 3], "x": 176, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 192, "y": 0, "flags": 4}, + {"matrix": [4, 1], "x": 208, "y": 0, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 21, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 21, "flags": 4}, + {"matrix": [5, 2], "x": 192, "y": 21, "flags": 4}, + {"matrix": [5, 3], "x": 176, "y": 21, "flags": 4}, + {"matrix": [5, 4], "x": 160, "y": 21, "flags": 4}, + {"matrix": [5, 5], "x": 144, "y": 21, "flags": 4}, + {"matrix": [6, 5], "x": 144, "y": 42, "flags": 4}, + {"matrix": [6, 4], "x": 160, "y": 42, "flags": 4}, + {"matrix": [6, 3], "x": 176, "y": 42, "flags": 4}, + {"matrix": [6, 2], "x": 192, "y": 42, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 42, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 64, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 64, "flags": 4}, + {"matrix": [7, 2], "x": 192, "y": 64, "flags": 4}, + {"matrix": [7, 3], "x": 176, "y": 64, "flags": 4}, + {"matrix": [7, 4], "x": 160, "y": 64, "flags": 4}, + {"matrix": [7, 5], "x": 144, "y": 64, "flags": 4}, + {"matrix": [7, 6], "x": 128, "y": 64, "flags": 4} + ], "split_count": [25, 25] }, - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, "url": "https://shop.yushakobo.jp/products/helixpico-pcb", "usb": { "device_version": "0.0.2", - "pid": "0x0001", - "vid": "0x3265" - }, - "ws2812": { - "pin": "D3" + "pid": "0x0001" }, "layouts": { "LAYOUT": { diff --git a/keyboards/helix/readme.md b/keyboards/helix/readme.md index 0c190f7626..810e0c1658 100644 --- a/keyboards/helix/readme.md +++ b/keyboards/helix/readme.md @@ -1,16 +1,45 @@ -Helix -=== +# Helix -![Helix](https://i.imgur.com/XBAmynN.jpg) +![image](https://i.imgur.com/11o4MRV.jpeg) -A compact split ortholinear keyboard. +* Keyboard Maintainer: [MakotoKurauchi](https://github.com/MakotoKurauchi) +* Hardware Supported: Helix Pico, Beta, rev3 PCBs w/ Pro Micro compatible development board +* Hardware Availability: [Yushakobo](https://shop.yushakobo.jp), [GitHub](https://github.com/MakotoKurauchi/helix) -Keyboard Maintainer: [Makoto Kurauchi](https://github.com/MakotoKurauchi/) [@pluis9](https://twitter.com/pluis9) [yushakobo](https://github.com/yushakobo) -Hardware Supported: Helix PCB Alpha, Beta, Rev3, Pro Micro -Hardware Availability: [PCB & Case Data](https://github.com/MakotoKurauchi/helix), [Yushakobo Shop](https://yushakobo.jp/shop/), [Little Keyboards](https://littlekeyboards.com/collections/helix) +## Revisions +- [Pico](https://shop.yushakobo.jp/products/helixpico-pcb) + - 4 row PCB + - per-key RGB + - support for a 128x32 OLED display + - footprint for speaker +- [Beta](https://shop.yushakobo.jp/products/oss_pcb?variant=39452554231969) + - 4 or 5 row PCB with snappable bottom row + - per-key RGB + - support for a 128x32 OLED display +- [rev3](https://shop.yushakobo.jp/products/2143) + - 4 or 5 row PCB with snappable bottom row + - per-key RGB + - support for a 128x32 OLED display + - rotary encoders -## How to build - * [Helix how to Customize and Compile](rev2/keymaps/default/readme.md#customize) - * [HelixPico how to Customize and Compile](pico/keymaps/default/readme.md#customize) +Make example for this keyboard (after setting up your build environment): -See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + make helix/pico:default + make helix/beta:default + make helix/rev3:default + +Flashing example for this keyboard: + + make helix/pico:default:flash + make helix/beta:default:flash + make helix/rev3: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 and plug in the keyboard +* **Physical reset button**: Briefly tap or double-tap the button near the TRRS jack +* **Keycode in layout**: Press the key mapped to `QK_BOOT` diff --git a/keyboards/helix/rev3/config.h b/keyboards/helix/rev3/config.h deleted file mode 100644 index dac611de9a..0000000000 --- a/keyboards/helix/rev3/config.h +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2025 QMK -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define OLED_FONT_H "keyboards/helix/common/glcdfont.c" diff --git a/keyboards/helix/rev3/keyboard.json b/keyboards/helix/rev3/keyboard.json index 7122afdd64..887a5c8024 100644 --- a/keyboards/helix/rev3/keyboard.json +++ b/keyboards/helix/rev3/keyboard.json @@ -1,12 +1,5 @@ { - "manufacturer": "Yushakobo", "keyboard_name": "Helix rev3", - "maintainer": "MakotoKurauchi", - "build": { - "lto": true - }, - "development_board": "promicro", - "diode_direction": "COL2ROW", "dip_switch": { "matrix_grid": [ [0, 6], @@ -21,20 +14,14 @@ ] }, "features": { - "bootmagic": true, "dip_switch": false, - "encoder": true, - "extrakey": true, - "mousekey": true, - "oled": true, - "rgb_matrix": true + "encoder": true }, "matrix_pins": { "cols": ["F4", "F5", "F6", "F7", "B1", "B3", "B2"], "rows": ["D4", "C6", "D7", "E6", "B4"] }, "rgb_matrix": { - "driver": "ws2812", "layout": [ {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, @@ -101,27 +88,17 @@ {"matrix": [9, 1], "x": 208, "y": 64, "flags": 4}, {"matrix": [9, 0], "x": 224, "y": 64, "flags": 4} ], - "max_brightness": 150, - "sleep": true, "split_count": [32, 32] }, "split": { - "enabled": true, "handedness": { "matrix_grid": ["D7", "B2"] - }, - "serial": { - "pin": "D2" } }, "url": "https://shop.yushakobo.jp/products/2143", "usb": { "device_version": "0.0.1", - "pid": "0x0003", - "vid": "0x3265" - }, - "ws2812": { - "pin": "D3" + "pid": "0x0003" }, "layouts": { "LAYOUT_4row": { diff --git a/keyboards/helix/rules.mk b/keyboards/helix/rules.mk deleted file mode 100644 index a2f233cf91..0000000000 --- a/keyboards/helix/rules.mk +++ /dev/null @@ -1 +0,0 @@ -HELIX_TOP_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) From 2695344241eabc8da3101a0c2cfecf1f0381226e Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 10 Aug 2025 11:39:12 +0200 Subject: [PATCH 523/592] Refactor `bastardkb/charybdis/3x6` (#25493) * Refactor bastardkb/charybdis/3x6 - Update keyboard aliases accordingly - Migrate various configuration to data-driven - Use short SPDX license headers - Remove configuration that trends towards user-specific (CRC Table) - Migrate common configuration upwards - Migrate keymap to JSON - Remove likely unneeded v1 revision per #23810 - Remove revisions splinky_2, splinky_3, and stemcell where a converter should be used - Rename v2/elitec -> elitec. Specifically named elitec, as this board requires pin compatibility with an Elite-C (bottom 5 pins) * Correct keyboard name in keymap * Replace unecessarily removed split hand pin configuration * Revert "Replace unecessarily removed split hand pin configuration" This reverts commit 737cb635fa8de29bdf0f4ae54cf51b7a4715c7f3. After second thought, it is not necessary to configure this by default, as any user who wishes to set handedness by pin and is using an Elite-C pin compatible development board will need to manually set the pin anyway, which likely means referencing the readme.md file, which also contains the necessary SPLIT_HAND_PIN_LOW_IS_LEFT configuration. --- data/mappings/keyboard_aliases.hjson | 12 +++ keyboards/bastardkb/charybdis/3x6/3x6.c | 91 ------------------- .../charybdis/3x6/blackpill/config.h | 33 +------ .../charybdis/3x6/blackpill/halconf.h | 21 +---- .../charybdis/3x6/blackpill/keyboard.json | 43 +++------ .../charybdis/3x6/blackpill/mcuconf.h | 28 +----- .../charybdis/3x6/blackpill/readme.md | 3 - .../charybdis/3x6/blackpill/rules.mk | 6 -- keyboards/bastardkb/charybdis/3x6/config.h | 22 ----- .../bastardkb/charybdis/3x6/elitec/config.h | 5 + .../charybdis/3x6/elitec/keyboard.json | 19 ++++ keyboards/bastardkb/charybdis/3x6/info.json | 68 +++++++++++--- .../charybdis/3x6/keymaps/default/keymap.c | 66 -------------- .../charybdis/3x6/keymaps/default/keymap.json | 25 +++++ .../charybdis/3x6/keymaps/default/readme.md | 7 -- keyboards/bastardkb/charybdis/3x6/readme.md | 15 --- keyboards/bastardkb/charybdis/3x6/rules.mk | 1 + .../charybdis/3x6/v1/elitec/config.h | 24 ----- .../charybdis/3x6/v1/elitec/keyboard.json | 41 --------- .../charybdis/3x6/v1/elitec/rules.mk | 4 - .../charybdis/3x6/v2/elitec/config.h | 24 ----- .../charybdis/3x6/v2/elitec/keyboard.json | 35 ------- .../charybdis/3x6/v2/elitec/rules.mk | 4 - .../charybdis/3x6/v2/splinky_2/config.h | 38 -------- .../charybdis/3x6/v2/splinky_2/keyboard.json | 33 ------- .../charybdis/3x6/v2/splinky_2/mcuconf.h | 23 ----- .../charybdis/3x6/v2/splinky_2/readme.md | 5 - .../charybdis/3x6/v2/splinky_2/rules.mk | 5 - .../charybdis/3x6/v2/splinky_3/config.h | 38 -------- .../charybdis/3x6/v2/splinky_3/keyboard.json | 33 ------- .../charybdis/3x6/v2/splinky_3/mcuconf.h | 23 ----- .../charybdis/3x6/v2/splinky_3/readme.md | 5 - .../charybdis/3x6/v2/splinky_3/rules.mk | 5 - .../charybdis/3x6/v2/stemcell/config.h | 52 ----------- .../charybdis/3x6/v2/stemcell/halconf.h | 24 ----- .../charybdis/3x6/v2/stemcell/keyboard.json | 38 -------- .../charybdis/3x6/v2/stemcell/mcuconf.h | 32 ------- .../charybdis/3x6/v2/stemcell/rules.mk | 6 -- 38 files changed, 141 insertions(+), 816 deletions(-) delete mode 100644 keyboards/bastardkb/charybdis/3x6/3x6.c delete mode 100644 keyboards/bastardkb/charybdis/3x6/blackpill/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/config.h create mode 100644 keyboards/bastardkb/charybdis/3x6/elitec/config.h create mode 100644 keyboards/bastardkb/charybdis/3x6/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x6/readme.md create mode 100644 keyboards/bastardkb/charybdis/3x6/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_2/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_3/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 73339a2c56..6b1a330bfb 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -80,6 +80,18 @@ "bastardkb/charybdis/3x5/v2/stemcell": { "target": "bastardkb/charybdis/3x5/elitec" }, + "bastardkb/charybdis/3x6/v2/elitec": { + "target": "bastardkb/charybdis/3x6/elitec" + }, + "bastardkb/charybdis/3x6/v2/splinky_2": { + "target": "bastardkb/charybdis/3x6/elitec" + }, + "bastardkb/charybdis/3x6/v2/splinky_3": { + "target": "bastardkb/charybdis/3x6/elitec" + }, + "bastardkb/charybdis/3x6/v2/stemcell": { + "target": "bastardkb/charybdis/3x6/elitec" + }, "bastardkb/dilemma/3x5_2/splinky": { "target": "bastardkb/dilemma/3x5_2/promicro" }, diff --git a/keyboards/bastardkb/charybdis/3x6/3x6.c b/keyboards/bastardkb/charybdis/3x6/3x6.c deleted file mode 100644 index d2c0a39815..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/3x6.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 "charybdis.h" - -// clang-format off -#ifdef RGB_MATRIX_ENABLE -/** - * \brief LEDs index. - * - # 0,0 14 28 42 56 70 84 98 126 140 154 168 182 196 210 224,0 - # 0,0 15 30 45 60 75 90 105 119 134 149 164 179 194 209 224,0 - * ╭────────────────────────╮ ╭────────────────────────╮ - * 0 5 6 11 12 15 36 33 32 27 26 21 - * ├────────────────────────┤ ├────────────────────────┤ - * 1 4 7 10 13 16 37 34 31 28 25 22 - * ├────────────────────────┤ ├────────────────────────┤ - * 2 3 8 9 14 17 38 35 30 29 24 23 - * ╰────────────────────────╯ ╰────────────────────────╯ - * 18 19 20 39 40 XX - * ╰────────────╯ ╰────────────╯ - * - * Note: the LED config simulates 42 LEDs instead of the actual 41 to prevent - * confusion when testing LEDs during assembly when handedness is not set - * correctly. Those fake LEDs are bound to the physical top-left corner. - */ -led_config_t g_led_config = { { - /* Key Matrix to LED index. */ - // Left split. - { 0, 5, 6, 11, 12, 15 }, // Top row - { 1, 4, 7, 10, 13, 16 }, // Middle row - { 2, 3, 8, 9, 14, 17 }, // Bottom row - { NO_LED, 20, NO_LED, 18, 19, NO_LED }, // Thumb cluster - // Right split. - { 21, 26, 27, 32, 33, 36 }, // Top row - { 22, 25, 28, 31, 34, 37 }, // Middle row - { 23, 24, 29, 30, 35, 38 }, // Bottom row - { NO_LED, 41, NO_LED, 39, 40, NO_LED }, // Thumb cluster -}, { - /* LED index to physical position. */ - // Left split. - /* index=0 */ { 0, 0 }, { 0, 21 }, { 0, 42 }, // col 1 (left most) - /* index=3 */ { 15, 42 }, { 15, 21 }, { 15, 0 }, // col 2 - /* index=6 */ { 30, 0 }, { 30, 21 }, { 30, 42 }, - /* index=9 */ { 45, 42 }, { 45, 21 }, { 45, 0 }, - /* index=12 */ { 60, 0 }, { 60, 21 }, { 60, 42 }, - /* index=15 */ { 75, 0 }, { 75, 21 }, { 75, 42 }, - /* index=18 */ { 75, 64 }, { 90, 64 }, { 105, 64 }, // Thumb cluster - // Right split. - /* index=21 */ { 224, 0 }, { 224, 21 }, { 224, 42 }, // col 12 (right most) - /* index=24 */ { 209, 42 }, { 209, 21 }, { 209, 0 }, // col 10 - /* index=27 */ { 194, 0 }, { 194, 21 }, { 194, 42 }, - /* index=30 */ { 179, 42 }, { 179, 21 }, { 179, 0 }, - /* index=33 */ { 164, 0 }, { 164, 21 }, { 164, 42 }, - /* index=36 */ { 149, 0 }, { 149, 21 }, { 149, 42 }, - /* index=39 */ { 119, 64 }, { 134, 64 }, { 0, 0 }, // Thumb cluster -}, { - /* LED index to flag. */ - // Left split. - /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1 - /* index=3 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2 - /* index=6 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=9 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=15 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=18 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster - // Right split. - /* index=21 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 10 - /* index=24 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 9 - /* index=27 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=30 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=36 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=39 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/config.h b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h index e1365a109d..bb870669c8 100644 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/config.h +++ b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h @@ -1,26 +1,7 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - -/* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 #define WS2812_PWM_PAL_MODE 1 @@ -28,14 +9,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for EEPROM and pmw3360 sensor. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 #define SPI_SCK_PAL_MODE 5 @@ -44,9 +17,7 @@ #define SPI_MISO_PIN A6 #define SPI_MISO_PAL_MODE 5 -/* EEPROM config. */ #define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4 -/* PMW3360 settings. */ #define POINTING_DEVICE_CS_PIN B14 #define PMW33XX_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h index 5c5dff98d4..545fc20cb3 100644 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/3x6/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/keyboard.json b/keyboards/bastardkb/charybdis/3x6/blackpill/keyboard.json index ecefbbeb99..df77023bd6 100644 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/keyboard.json +++ b/keyboards/bastardkb/charybdis/3x6/blackpill/keyboard.json @@ -1,38 +1,23 @@ { - "keyboard_name": "Charybdis Mini (3x6) Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B0", "B1", "B10", "B3", "B4", "B5"], "rows": ["A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h index e4cde4880b..ca63a57218 100644 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h +++ b/keyboards/bastardkb/charybdis/3x6/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next @@ -30,11 +15,6 @@ #undef STM32_SPI_USE_SPI1 #define STM32_SPI_USE_SPI1 TRUE -#undef STM32_SPI_SPI1_RX_DMA_STREAM -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#undef STM32_SPI_SPI1_TX_DMA_STREAM -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - #undef STM32_SERIAL_USE_USART1 #define STM32_SERIAL_USE_USART1 TRUE diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md b/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md deleted file mode 100644 index 6a9907c2ae..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Charybdis Mini (3x6) BlackPill - -An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod. diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk b/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk deleted file mode 100644 index 4373b9c33d..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/blackpill/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/charybdis/3x6/config.h b/keyboards/bastardkb/charybdis/3x6/config.h deleted file mode 100644 index 1c952759a7..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -/* Trackball angle adjustment. */ -#define ROTATIONAL_TRANSFORM_ANGLE -25 diff --git a/keyboards/bastardkb/charybdis/3x6/elitec/config.h b/keyboards/bastardkb/charybdis/3x6/elitec/config.h new file mode 100644 index 0000000000..411ddaf6b9 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x6/elitec/config.h @@ -0,0 +1,5 @@ +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/3x6/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/elitec/keyboard.json new file mode 100644 index 0000000000..e736d9df98 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x6/elitec/keyboard.json @@ -0,0 +1,19 @@ +{ + "build": { + "lto": true + }, + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], + "rows": ["F7", "C6", "D4", "B5"] + }, + "pin_compatible": "elite_c", + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/charybdis/3x6/info.json b/keyboards/bastardkb/charybdis/3x6/info.json index 3597e72534..5d1ba362f7 100644 --- a/keyboards/bastardkb/charybdis/3x6/info.json +++ b/keyboards/bastardkb/charybdis/3x6/info.json @@ -1,13 +1,64 @@ { - "url": "https://bastardkb.com", - "usb": { - "pid": "0x1834" + "keyboard_name": "Charybdis Mini (3x6)", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": false, + "pointing_device": true, + "rgb_matrix": true }, "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 42, "flags": 4}, + {"matrix": [2, 1], "x": 15, "y": 42, "flags": 4}, + {"matrix": [1, 1], "x": 15, "y": 21, "flags": 4}, + {"matrix": [0, 1], "x": 15, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 30, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 30, "y": 21, "flags": 4}, + {"matrix": [2, 2], "x": 30, "y": 42, "flags": 4}, + {"matrix": [2, 3], "x": 45, "y": 42, "flags": 4}, + {"matrix": [1, 3], "x": 45, "y": 21, "flags": 4}, + {"matrix": [0, 3], "x": 45, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 60, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 60, "y": 21, "flags": 4}, + {"matrix": [2, 4], "x": 60, "y": 42, "flags": 4}, + {"matrix": [0, 5], "x": 75, "y": 0, "flags": 4}, + {"matrix": [1, 5], "x": 75, "y": 21, "flags": 4}, + {"matrix": [2, 5], "x": 75, "y": 42, "flags": 4}, + {"matrix": [3, 3], "x": 75, "y": 64, "flags": 4}, + {"matrix": [3, 4], "x": 90, "y": 64, "flags": 4}, + {"matrix": [3, 1], "x": 105, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 21, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 42, "flags": 4}, + {"matrix": [6, 1], "x": 209, "y": 42, "flags": 4}, + {"matrix": [5, 1], "x": 209, "y": 21, "flags": 4}, + {"matrix": [4, 1], "x": 209, "y": 0, "flags": 4}, + {"matrix": [4, 2], "x": 194, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 194, "y": 21, "flags": 4}, + {"matrix": [6, 2], "x": 194, "y": 42, "flags": 4}, + {"matrix": [6, 3], "x": 179, "y": 42, "flags": 4}, + {"matrix": [5, 3], "x": 179, "y": 21, "flags": 4}, + {"matrix": [4, 3], "x": 179, "y": 0, "flags": 4}, + {"matrix": [4, 4], "x": 164, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 164, "y": 21, "flags": 4}, + {"matrix": [6, 4], "x": 164, "y": 42, "flags": 4}, + {"matrix": [4, 5], "x": 149, "y": 0, "flags": 4}, + {"matrix": [5, 5], "x": 149, "y": 21, "flags": 4}, + {"matrix": [6, 5], "x": 149, "y": 42, "flags": 4}, + {"matrix": [7, 3], "x": 119, "y": 64, "flags": 4}, + {"matrix": [7, 4], "x": 134, "y": 64, "flags": 4}, + {"matrix": [7, 1], "x": 149, "y": 64, "flags": 4} + ], "split_count": [21, 21] }, - "layout_aliases": { - "LAYOUT_charybdis_3x6": "LAYOUT" + "usb": { + "device_version": "2.0.0", + "pid": "0x1834" }, "layouts": { "LAYOUT": { @@ -18,46 +69,39 @@ {"label": "L03", "matrix": [0, 3], "x": 3, "y": 0}, {"label": "L04", "matrix": [0, 4], "x": 4, "y": 0}, {"label": "L05", "matrix": [0, 5], "x": 5, "y": 0}, - {"label": "R00", "matrix": [4, 5], "x": 11, "y": 0}, {"label": "R01", "matrix": [4, 4], "x": 12, "y": 0}, {"label": "R02", "matrix": [4, 3], "x": 13, "y": 0}, {"label": "R03", "matrix": [4, 2], "x": 14, "y": 0}, {"label": "R04", "matrix": [4, 1], "x": 15, "y": 0}, {"label": "R05", "matrix": [4, 0], "x": 16, "y": 0}, - {"label": "L10", "matrix": [1, 0], "x": 0, "y": 1}, {"label": "L11", "matrix": [1, 1], "x": 1, "y": 1}, {"label": "L12", "matrix": [1, 2], "x": 2, "y": 1}, {"label": "L13", "matrix": [1, 3], "x": 3, "y": 1}, {"label": "L14", "matrix": [1, 4], "x": 4, "y": 1}, {"label": "L15", "matrix": [1, 5], "x": 5, "y": 1}, - {"label": "R10", "matrix": [5, 5], "x": 11, "y": 1}, {"label": "R11", "matrix": [5, 4], "x": 12, "y": 1}, {"label": "R12", "matrix": [5, 3], "x": 13, "y": 1}, {"label": "R13", "matrix": [5, 2], "x": 14, "y": 1}, {"label": "R14", "matrix": [5, 1], "x": 15, "y": 1}, {"label": "R15", "matrix": [5, 0], "x": 16, "y": 1}, - {"label": "L20", "matrix": [2, 0], "x": 0, "y": 2}, {"label": "L21", "matrix": [2, 1], "x": 1, "y": 2}, {"label": "L22", "matrix": [2, 2], "x": 2, "y": 2}, {"label": "L23", "matrix": [2, 3], "x": 3, "y": 2}, {"label": "L24", "matrix": [2, 4], "x": 4, "y": 2}, {"label": "L25", "matrix": [2, 5], "x": 5, "y": 2}, - {"label": "R20", "matrix": [6, 5], "x": 11, "y": 2}, {"label": "R21", "matrix": [6, 4], "x": 12, "y": 2}, {"label": "R22", "matrix": [6, 3], "x": 13, "y": 2}, {"label": "R23", "matrix": [6, 2], "x": 14, "y": 2}, {"label": "R24", "matrix": [6, 1], "x": 15, "y": 2}, {"label": "R25", "matrix": [6, 0], "x": 16, "y": 2}, - {"label": "L33", "matrix": [3, 3], "x": 5, "y": 3}, {"label": "L34", "matrix": [3, 4], "x": 6, "y": 3}, {"label": "L31", "matrix": [3, 1], "x": 7, "y": 3}, - {"label": "R31", "matrix": [7, 1], "x": 9, "y": 3}, {"label": "R33", "matrix": [7, 3], "x": 10, "y": 3} ] diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c deleted file mode 100644 index ba8028104e..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.c +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -enum charybdis_keymap_layers { - LAYER_BASE = 0, - LAYER_LOWER, - LAYER_RAISE, -}; - -#define LOWER MO(LAYER_LOWER) -#define RAISE MO(LAYER_RAISE) - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [LAYER_BASE] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_RCTL, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - 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_BSPC, KC_SPC, LOWER, RAISE, KC_ENT - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_LOWER] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - XXXXXXX, RM_TOGG, KC_MNXT, KC_MPLY, KC_MPRV, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_4, KC_5, KC_6, KC_PMNS, XXXXXXX, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS, XXXXXXX, - // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ - XXXXXXX, XXXXXXX, _______, XXXXXXX, _______ - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_RAISE] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - XXXXXXX, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - XXXXXXX, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ - _______, _______, XXXXXXX, _______, XXXXXXX - // ╰───────────────────────────╯ ╰──────────────────╯ - ), -}; -// clang-format on diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.json b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.json new file mode 100644 index 0000000000..e87fe18f34 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x6/keymaps/default/keymap.json @@ -0,0 +1,25 @@ +{ + "keyboard": "bastardkb/charybdis/3x6/elitec", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_ESC", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)" + ], + [ + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______" + ], + [ + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md b/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md deleted file mode 100644 index 8b407f68a2..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/keymaps/default/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Charybdis Mini (3x6) default keymap - -> :bulb: Have a look at the [`via` keymap](../via) for a more feature-rich layout. - -The Charydbis Mini (3x6) default keymap is inspired from the original [Dactyl Manuform](../../../../../handwired/dactyl_manuform) default keymap. - -This layout supports RGB matrix. However, due to space constraints on the MCU, only a limited number of effect can be enabled at once. Look at the `config.h` file and enable your favorite effect. diff --git a/keyboards/bastardkb/charybdis/3x6/readme.md b/keyboards/bastardkb/charybdis/3x6/readme.md deleted file mode 100644 index c6385ed8f1..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# Charybdis Nano (3x6) - -An ergonomic keyboard with integrated trackball. - -The Charybdis is available in 4x6, 3x6 and 3x5 form factor at [bastardkb.com](https://bastardkb.com). - -## Keymaps - -### [`default`](keymaps/default) - -A simple QWERTY layout with 4 layers. - -### [`via`](keymaps/via) - -A [Miryoku-inspired](https://github.com/manna-harbour/miryoku), feature-rich, keymap with VIA support. diff --git a/keyboards/bastardkb/charybdis/3x6/rules.mk b/keyboards/bastardkb/charybdis/3x6/rules.mk new file mode 100644 index 0000000000..fab9162dc6 --- /dev/null +++ b/keyboards/bastardkb/charybdis/3x6/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h b/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h deleted file mode 100644 index f5c54c58ae..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v1/elitec/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN B0 diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json deleted file mode 100644 index cef4eab72f..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "keyboard_name": "Charybdis Mini (3x6) Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["D5", "C7", "F0", "D7", "E6", "B4"], - "rows": ["B7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - }, - "matrix_pins": { - "right": { - "cols": ["F1", "C7", "B7", "D7", "E6", "B4"], - "rows": ["F0", "C6", "D4", "B5"] - } - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk deleted file mode 100644 index 17dae28bd1..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v1/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h b/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h deleted file mode 100644 index 3b91322247..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/elitec/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json deleted file mode 100644 index fdfd2c38f9..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "keyboard_name": "Charybdis Mini (3x6) Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], - "rows": ["F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk deleted file mode 100644 index 17dae28bd1..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/config.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/config.h deleted file mode 100644 index e6e2a4f216..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP18 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP19 -#define POINTING_DEVICE_CS_PIN GP14 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json deleted file mode 100644 index 650bf46481..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis Mini (3x6) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/readme.md b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/config.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/config.h deleted file mode 100644 index ee7745d41e..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP22 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP23 -#define POINTING_DEVICE_CS_PIN GP16 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json deleted file mode 100644 index b2a4890f56..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis Mini (3x6) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/readme.md b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h deleted file mode 100644 index 3efb323302..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for pmw3360 sensor. */ -#define SPI_DRIVER SPID1 -#define SPI_SCK_PIN A5 -#define SPI_SCK_PAL_MODE 5 -#define SPI_MOSI_PIN A7 -#define SPI_MOSI_PAL_MODE 5 -#define SPI_MISO_PIN A6 -#define SPI_MISO_PAL_MODE 5 - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN A1 -#define PMW3360_CS_MODE 3 -#define PMW3360_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h deleted file mode 100644 index 8141e0cf4b..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/halconf.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE -#define HAL_USE_SPI TRUE - -#include_next diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json deleted file mode 100644 index a405395438..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "keyboard_name": "Charybdis Mini (3x6) STeMCell", - "usb": { - "device_version": "2.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B1", "B2", "A4", "B4", "B5", "B8"], - "rows": ["B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h deleted file mode 100644 index 1a3c4433db..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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_SPI1 -#define STM32_SPI_USE_SPI1 TRUE - -#undef STM32_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk deleted file mode 100644 index 4373b9c33d..0000000000 --- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart From a3ecbc53f60e2e262a0df5e34a89ca6eeb17dd48 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 10 Aug 2025 11:44:49 +0200 Subject: [PATCH 524/592] Refactor `bastardkb/charybdis/4x6` (#25494) * Refactor bastardkb/charybdis/4x6 - Update keyboard aliases accordingly - Migrate various configuration to data-driven - Use short SPDX license headers - Remove configuration that trends towards user-specific (CRC Table) - Migrate common configuration upwards - Migrate keymap to JSON - Remove likely unneeded v1 revision per #23811 - Remove revisions splinky_2, splinky_3, and stemcell where a converter should be used - Rename v2/elitec -> elitec. Specifically named elitec, as this board requires pin compatibility with an Elite-C (bottom 5 pins) * Add aliases * Replace unecessarily removed split hand pin configuration * Revert "Replace unecessarily removed split hand pin configuration" This reverts commit 0b98d1bc140a4b18c16d2b524cc8731f016372b1. After second thought, it is not necessary to configure this by default, as any user who wishes to set handedness by pin and is using an Elite-C pin compatible development board will need to manually set the pin anyway, which likely means referencing the readme.md file, which also contains the necessary SPLIT_HAND_PIN_LOW_IS_LEFT configuration. --- data/mappings/keyboard_aliases.hjson | 12 +++ keyboards/bastardkb/charybdis/4x6/4x6.c | 100 ------------------ .../charybdis/4x6/blackpill/config.h | 37 +------ .../charybdis/4x6/blackpill/halconf.h | 21 +--- .../charybdis/4x6/blackpill/keyboard.json | 43 +++----- .../charybdis/4x6/blackpill/mcuconf.h | 28 +---- .../charybdis/4x6/blackpill/readme.md | 3 - .../charybdis/4x6/blackpill/rules.mk | 6 -- keyboards/bastardkb/charybdis/4x6/config.h | 22 ---- .../bastardkb/charybdis/4x6/elitec/config.h | 5 + .../charybdis/4x6/elitec/keyboard.json | 19 ++++ keyboards/bastardkb/charybdis/4x6/info.json | 90 ++++++++++++---- .../charybdis/4x6/keymaps/default/keymap.c | 75 ------------- .../charybdis/4x6/keymaps/default/keymap.json | 31 ++++++ .../charybdis/4x6/keymaps/default/readme.md | 7 -- keyboards/bastardkb/charybdis/4x6/readme.md | 15 --- keyboards/bastardkb/charybdis/4x6/rules.mk | 1 + .../charybdis/4x6/v1/elitec/config.h | 25 ----- .../charybdis/4x6/v1/elitec/keyboard.json | 41 ------- .../charybdis/4x6/v1/elitec/rules.mk | 4 - .../charybdis/4x6/v2/elitec/config.h | 24 ----- .../charybdis/4x6/v2/elitec/keyboard.json | 35 ------ .../charybdis/4x6/v2/elitec/rules.mk | 4 - .../charybdis/4x6/v2/splinky_2/config.h | 38 ------- .../charybdis/4x6/v2/splinky_2/keyboard.json | 33 ------ .../charybdis/4x6/v2/splinky_2/mcuconf.h | 23 ---- .../charybdis/4x6/v2/splinky_2/readme.md | 5 - .../charybdis/4x6/v2/splinky_2/rules.mk | 5 - .../charybdis/4x6/v2/splinky_3/config.h | 38 ------- .../charybdis/4x6/v2/splinky_3/keyboard.json | 33 ------ .../charybdis/4x6/v2/splinky_3/mcuconf.h | 23 ---- .../charybdis/4x6/v2/splinky_3/readme.md | 5 - .../charybdis/4x6/v2/splinky_3/rules.mk | 5 - .../charybdis/4x6/v2/stemcell/config.h | 52 --------- .../charybdis/4x6/v2/stemcell/halconf.h | 24 ----- .../charybdis/4x6/v2/stemcell/keyboard.json | 38 ------- .../charybdis/4x6/v2/stemcell/mcuconf.h | 32 ------ .../charybdis/4x6/v2/stemcell/rules.mk | 6 -- 38 files changed, 165 insertions(+), 843 deletions(-) delete mode 100644 keyboards/bastardkb/charybdis/4x6/4x6.c delete mode 100644 keyboards/bastardkb/charybdis/4x6/blackpill/readme.md delete mode 100644 keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/config.h create mode 100644 keyboards/bastardkb/charybdis/4x6/elitec/config.h create mode 100644 keyboards/bastardkb/charybdis/4x6/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c create mode 100644 keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/keymaps/default/readme.md delete mode 100644 keyboards/bastardkb/charybdis/4x6/readme.md create mode 100644 keyboards/bastardkb/charybdis/4x6/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_2/config.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_2/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_2/readme.md delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_2/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_3/config.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_3/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_3/readme.md delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/splinky_3/rules.mk delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h delete mode 100644 keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index 6b1a330bfb..cd5ce6e9ab 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -92,6 +92,18 @@ "bastardkb/charybdis/3x6/v2/stemcell": { "target": "bastardkb/charybdis/3x6/elitec" }, + "bastardkb/charybdis/4x6/v2/elitec": { + "target": "bastardkb/charybdis/4x6/elitec" + }, + "bastardkb/charybdis/4x6/v2/splinky_2": { + "target": "bastardkb/charybdis/4x6/elitec" + }, + "bastardkb/charybdis/4x6/v2/splinky_3": { + "target": "bastardkb/charybdis/4x6/elitec" + }, + "bastardkb/charybdis/4x6/v2/stemcell": { + "target": "bastardkb/charybdis/4x6/elitec" + }, "bastardkb/dilemma/3x5_2/splinky": { "target": "bastardkb/dilemma/3x5_2/promicro" }, diff --git a/keyboards/bastardkb/charybdis/4x6/4x6.c b/keyboards/bastardkb/charybdis/4x6/4x6.c deleted file mode 100644 index ff1bbea470..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/4x6.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 "charybdis.h" - -// clang-format off -#ifdef RGB_MATRIX_ENABLE -/** - * \brief LEDs index. - * - * ╭────────────────────────╮ ╭────────────────────────╮ - * 0 7 8 15 16 20 49 45 44 37 36 29 - * ├────────────────────────┤ ├────────────────────────┤ - * 1 6 9 14 17 21 50 46 43 38 35 30 - * ├────────────────────────┤ ├────────────────────────┤ - * 2 5 10 13 18 22 51 47 42 39 34 31 - * ├────────────────────────┤ ├────────────────────────┤ - * 3 4 11 12 19 23 52 48 41 40 33 32 - * ╰────────────────────────╯ ╰────────────────────────╯ - * 26 27 28 53 54 XX - * 25 24 55 XX - * ╰────────────╯ ╰────────────╯ - * - * Note: the LED config simulates 58 LEDs instead of the actual 56 to prevent - * confusion when testing LEDs during assembly when handedness is not set - * correctly. Those fake LEDs are bound to the physical bottom-left corner. - */ -led_config_t g_led_config = { { - /* Key Matrix to LED index. */ - // Left split. - { 0, 7, 8, 15, 16, 20 }, // Num row - { 1, 6, 9, 14, 17, 21 }, // Top row - { 2, 5, 10, 13, 18, 22 }, // Middle row - { 3, 4, 11, 12, 19, 23 }, // Bottom row - { NO_LED, 28, 24, 26, 27, 25 }, // Thumb cluster - // Right split. - { 29, 36, 37, 44, 45, 49 }, // Num row - { 30, 35, 38, 43, 46, 50 }, // Top row - { 31, 34, 39, 42, 47, 51 }, // Middle row - { 32, 33, 40, 41, 48, 52 }, // Bottom row - { NO_LED, 53, 55, 54, NO_LED, NO_LED }, // Thumb cluster -}, { - /* LED index to physical position. */ - // Left split. - /* index=0 */ { 0, 0 }, { 0, 12 }, { 0, 24 }, { 0, 36 }, // col 1 (left most) - /* index=4 */ { 16, 36 }, { 16, 24 }, { 16, 12 }, { 16, 0 }, // col 2 - /* index=8 */ { 32, 0 }, { 32, 12 }, { 32, 24 }, { 32, 36 }, - /* index=12 */ { 48, 36 }, { 48, 24 }, { 48, 12 }, { 48, 0 }, - /* index=16 */ { 64, 0 }, { 64, 12 }, { 64, 24 }, { 64, 36 }, - /* index=20 */ { 80, 0 }, { 80, 12 }, { 80, 24 }, { 80, 36 }, - /* index=24 */ { 112, 64 }, { 96, 64 }, { 80, 52 }, - /* index=27 */ { 96, 52 }, { 112, 52 }, - // Right split. - /* index=29 */ { 224, 0 }, { 224, 12 }, { 224, 24 }, { 224, 36 }, // col 12 (right most) - /* index=33 */ { 208, 36 }, { 208, 24 }, { 208, 12 }, { 208, 0 }, // col 11 - /* index=37 */ { 192, 0 }, { 192, 12 }, { 192, 24 }, { 192, 36 }, - /* index=41 */ { 176, 36 }, { 176, 24 }, { 176, 12 }, { 176, 0 }, - /* index=45 */ { 160, 0 }, { 160, 12 }, { 160, 24 }, { 160, 36 }, - /* index=49 */ { 144, 0 }, { 144, 12 }, { 144, 24 }, { 144, 36 }, - /* index=53 */ { 112, 52 }, { 128, 64 }, { 112, 64 }, - /* index=56 */ { 0, 0 }, { 0, 0 }, -}, { - /* LED index to flag. */ - // Left split. - /* index=0 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 1 - /* index=4 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 2 - /* index=8 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=12 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=16 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=20 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=24 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster top - /* index=27 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster bottom - // Right split. - /* index=29 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 12 - /* index=33 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // col 11 - /* index=37 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=41 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=45 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=49 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, - /* index=53 */ LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, LED_FLAG_KEYLIGHT, // Thumb cluster - /* index=55 */ LED_FLAG_MODIFIER, LED_FLAG_MODIFIER, // Thumb cluster fakes -} }; -#endif -// clang-format on diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/config.h b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h index bd1e0fe31e..9c01986583 100644 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/config.h +++ b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h @@ -1,28 +1,9 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2021 Charly Delay (@0xcharly) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Publicw 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 . - */ - +// Copyright 2020 Christopher Courtney (@drashna) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once -/* Handedness. */ -#define SPLIT_HAND_PIN A3 // High -> left, Low -> right. - -/* RGB settings. */ #define WS2812_PWM_DRIVER PWMD2 #define WS2812_PWM_CHANNEL 2 #define WS2812_PWM_PAL_MODE 1 @@ -30,14 +11,6 @@ #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1 #define WS2812_PWM_DMA_CHANNEL 3 -/* Serial configuration for split keyboard. */ -#define SERIAL_USART_TX_PIN A9 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for EEPROM and pmw3360 sensor. */ #define SPI_DRIVER SPID1 #define SPI_SCK_PIN A5 #define SPI_SCK_PAL_MODE 5 @@ -46,9 +19,7 @@ #define SPI_MISO_PIN A6 #define SPI_MISO_PAL_MODE 5 -/* EEPROM config. */ #define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4 -/* PMW3360 settings. */ #define POINTING_DEVICE_CS_PIN B14 #define PMW33XX_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h index 300b0eeaed..6876cc3e00 100644 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h +++ b/keyboards/bastardkb/charybdis/4x6/blackpill/halconf.h @@ -1,21 +1,6 @@ -/** - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define HAL_USE_PWM TRUE diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/keyboard.json b/keyboards/bastardkb/charybdis/4x6/blackpill/keyboard.json index b55dc29445..4bef461b6b 100644 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/keyboard.json +++ b/keyboards/bastardkb/charybdis/4x6/blackpill/keyboard.json @@ -1,38 +1,23 @@ { - "keyboard_name": "Charybdis (4x6) Blackpill", - "usb": { - "device_version": "1.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, + "development_board": "blackpill_f411", "eeprom": { "driver": "spi" }, - "split": { - "enabled": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A1", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, "matrix_pins": { "cols": ["B0", "B1", "B10", "B3", "B4", "B5"], "rows": ["B15", "A2", "B8", "A8", "B9"] }, - "diode_direction": "ROW2COL", - "development_board": "blackpill_f411" + "split": { + "handedness": { + "pin": "A3" + }, + "serial": { + "driver": "usart", + "pin": "A9" + } + }, + "ws2812": { + "driver": "pwm", + "pin": "A1" + } } diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h index 46b3b42f8b..be641fb899 100644 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h +++ b/keyboards/bastardkb/charybdis/4x6/blackpill/mcuconf.h @@ -1,22 +1,7 @@ -/* - * Copyright 2020 Nick Brassel (tzarc) - * Copyright 2021 Stefan Kerkmann (@KarlK90) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 . - */ - +// Copyright 2020 Nick Brassel (tzarc) +// Copyright 2021 Stefan Kerkmann (@KarlK90) +// Copyright 2021 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include_next @@ -30,11 +15,6 @@ #undef STM32_SPI_USE_SPI1 #define STM32_SPI_USE_SPI1 TRUE -#undef STM32_SPI_SPI1_RX_DMA_STREAM -#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0) -#undef STM32_SPI_SPI1_TX_DMA_STREAM -#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3) - #undef STM32_SERIAL_USE_USART1 #define STM32_SERIAL_USE_USART1 TRUE diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md b/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md deleted file mode 100644 index bbae15bb85..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Charybdis (4x6) BlackPill - -An ergonomic keyboard with integrated trackball, with BlackPill (STM32F411) mod. diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk b/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk deleted file mode 100644 index 3caafdef92..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/blackpill/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported. - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart diff --git a/keyboards/bastardkb/charybdis/4x6/config.h b/keyboards/bastardkb/charybdis/4x6/config.h deleted file mode 100644 index 1c952759a7..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/config.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Quentin LEBASTARD - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -/* Trackball angle adjustment. */ -#define ROTATIONAL_TRANSFORM_ANGLE -25 diff --git a/keyboards/bastardkb/charybdis/4x6/elitec/config.h b/keyboards/bastardkb/charybdis/4x6/elitec/config.h new file mode 100644 index 0000000000..411ddaf6b9 --- /dev/null +++ b/keyboards/bastardkb/charybdis/4x6/elitec/config.h @@ -0,0 +1,5 @@ +// Copyright 2022 Charly Delay (@0xcharly) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/4x6/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/elitec/keyboard.json new file mode 100644 index 0000000000..839598e85e --- /dev/null +++ b/keyboards/bastardkb/charybdis/4x6/elitec/keyboard.json @@ -0,0 +1,19 @@ +{ + "build": { + "lto": true + }, + "development_board": "elite_c", + "matrix_pins": { + "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], + "rows": ["F4", "F7", "C6", "D4", "B5"] + }, + "pin_compatible": "elite_c", + "split": { + "serial": { + "pin": "D2" + } + }, + "ws2812": { + "pin": "D3" + } +} diff --git a/keyboards/bastardkb/charybdis/4x6/info.json b/keyboards/bastardkb/charybdis/4x6/info.json index 54bb564306..17d68900df 100644 --- a/keyboards/bastardkb/charybdis/4x6/info.json +++ b/keyboards/bastardkb/charybdis/4x6/info.json @@ -1,15 +1,80 @@ { - "manufacturer": "Bastard Keyboards", - "url": "https://bastardkb.com/charybdis", - "usb": { - "pid": "0x1833", - "vid": "0xA8F8" + "keyboard_name": "Charybdis (4x6)", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": false, + "pointing_device": true, + "rgb_matrix": true }, "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 12, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 24, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 36, "flags": 4}, + {"matrix": [3, 1], "x": 16, "y": 36, "flags": 4}, + {"matrix": [2, 1], "x": 16, "y": 24, "flags": 4}, + {"matrix": [1, 1], "x": 16, "y": 12, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 32, "y": 12, "flags": 4}, + {"matrix": [2, 2], "x": 32, "y": 24, "flags": 4}, + {"matrix": [3, 2], "x": 32, "y": 36, "flags": 4}, + {"matrix": [3, 3], "x": 48, "y": 36, "flags": 4}, + {"matrix": [2, 3], "x": 48, "y": 24, "flags": 4}, + {"matrix": [1, 3], "x": 48, "y": 12, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [1, 4], "x": 64, "y": 12, "flags": 4}, + {"matrix": [2, 4], "x": 64, "y": 24, "flags": 4}, + {"matrix": [3, 4], "x": 64, "y": 36, "flags": 4}, + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [1, 5], "x": 80, "y": 12, "flags": 4}, + {"matrix": [2, 5], "x": 80, "y": 24, "flags": 4}, + {"matrix": [3, 5], "x": 80, "y": 36, "flags": 4}, + {"matrix": [4, 2], "x": 112, "y": 64, "flags": 1}, + {"matrix": [4, 5], "x": 96, "y": 64, "flags": 1}, + {"matrix": [4, 3], "x": 80, "y": 52, "flags": 1}, + {"matrix": [4, 4], "x": 96, "y": 52, "flags": 1}, + {"matrix": [4, 1], "x": 112, "y": 52, "flags": 1}, + {"matrix": [5, 0], "x": 224, "y": 0, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 12, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 24, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 36, "flags": 4}, + {"matrix": [8, 1], "x": 208, "y": 36, "flags": 4}, + {"matrix": [7, 1], "x": 208, "y": 24, "flags": 4}, + {"matrix": [6, 1], "x": 208, "y": 12, "flags": 4}, + {"matrix": [5, 1], "x": 208, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 192, "y": 0, "flags": 4}, + {"matrix": [6, 2], "x": 192, "y": 12, "flags": 4}, + {"matrix": [7, 2], "x": 192, "y": 24, "flags": 4}, + {"matrix": [8, 2], "x": 192, "y": 36, "flags": 4}, + {"matrix": [8, 3], "x": 176, "y": 36, "flags": 4}, + {"matrix": [7, 3], "x": 176, "y": 24, "flags": 4}, + {"matrix": [6, 3], "x": 176, "y": 12, "flags": 4}, + {"matrix": [5, 3], "x": 176, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 160, "y": 0, "flags": 4}, + {"matrix": [6, 4], "x": 160, "y": 12, "flags": 4}, + {"matrix": [7, 4], "x": 160, "y": 24, "flags": 4}, + {"matrix": [8, 4], "x": 160, "y": 36, "flags": 4}, + {"matrix": [5, 5], "x": 144, "y": 0, "flags": 4}, + {"matrix": [6, 5], "x": 144, "y": 12, "flags": 4}, + {"matrix": [7, 5], "x": 144, "y": 24, "flags": 4}, + {"matrix": [8, 5], "x": 144, "y": 36, "flags": 4}, + {"matrix": [9, 1], "x": 112, "y": 52, "flags": 4}, + {"matrix": [9, 3], "x": 128, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 112, "y": 64, "flags": 4}, + {"x": 128, "y": 52, "flags": 1}, + {"x": 144, "y": 52, "flags": 1} + ], "split_count": [29, 29] }, - "layout_aliases": { - "LAYOUT_charybdis_4x6": "LAYOUT" + "usb": { + "device_version": "2.0.0", + "pid": "0x1833" }, "layouts": { "LAYOUT": { @@ -20,66 +85,55 @@ {"matrix": [0, 3], "x": 3, "y": 0}, {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [5, 5], "x": 11, "y": 0}, {"matrix": [5, 4], "x": 12, "y": 0}, {"matrix": [5, 3], "x": 13, "y": 0}, {"matrix": [5, 2], "x": 14, "y": 0}, {"matrix": [5, 1], "x": 15, "y": 0}, {"matrix": [5, 0], "x": 16, "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}, {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [6, 5], "x": 11, "y": 1}, {"matrix": [6, 4], "x": 12, "y": 1}, {"matrix": [6, 3], "x": 13, "y": 1}, {"matrix": [6, 2], "x": 14, "y": 1}, {"matrix": [6, 1], "x": 15, "y": 1}, {"matrix": [6, 0], "x": 16, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, {"matrix": [2, 2], "x": 2, "y": 2}, {"matrix": [2, 3], "x": 3, "y": 2}, {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [7, 5], "x": 11, "y": 2}, {"matrix": [7, 4], "x": 12, "y": 2}, {"matrix": [7, 3], "x": 13, "y": 2}, {"matrix": [7, 2], "x": 14, "y": 2}, {"matrix": [7, 1], "x": 15, "y": 2}, {"matrix": [7, 0], "x": 16, "y": 2}, - {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, {"matrix": [3, 2], "x": 2, "y": 3}, {"matrix": [3, 3], "x": 3, "y": 3}, {"matrix": [3, 4], "x": 4, "y": 3}, {"matrix": [3, 5], "x": 5, "y": 3}, - {"matrix": [8, 5], "x": 11, "y": 3}, {"matrix": [8, 4], "x": 12, "y": 3}, {"matrix": [8, 3], "x": 13, "y": 3}, {"matrix": [8, 2], "x": 14, "y": 3}, {"matrix": [8, 1], "x": 15, "y": 3}, {"matrix": [8, 0], "x": 16, "y": 3}, - {"matrix": [4, 3], "x": 5, "y": 4}, {"matrix": [4, 4], "x": 6, "y": 4}, {"matrix": [4, 1], "x": 7, "y": 4}, - {"matrix": [9, 1], "x": 9, "y": 4}, {"matrix": [9, 3], "x": 10, "y": 4}, - {"matrix": [4, 5], "x": 6, "y": 5}, {"matrix": [4, 2], "x": 7, "y": 5}, - {"matrix": [9, 5], "x": 9, "y": 5} ] } diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c deleted file mode 100644 index f440dac8cb..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.c +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -enum charybdis_keymap_layers { - LAYER_BASE = 0, - LAYER_LOWER, - LAYER_RAISE, -}; - -#define LOWER MO(LAYER_LOWER) -#define RAISE MO(LAYER_RAISE) - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [LAYER_BASE] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LALT, - // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ - KC_LGUI, KC_SPC, LOWER, RAISE, KC_ENT, - KC_LALT, KC_BSPC, KC_DEL - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_LOWER] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RM_NEXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_P7, KC_P8, KC_P9, KC_RBRC, XXXXXXX, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RM_TOGG, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_PPLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PEQL, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, EE_CLR, QK_BOOT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_PDOT, - // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ - XXXXXXX, XXXXXXX, _______, XXXXXXX, _______, - XXXXXXX, XXXXXXX, KC_P0 - // ╰───────────────────────────╯ ╰──────────────────╯ - ), - - [LAYER_RAISE] = LAYOUT( - // ╭──────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────╮ - KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_MPLY, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, KC_MUTE, - // ├──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────┤ - KC_MPRV, KC_HOME, KC_PGUP, KC_PGDN, KC_END, XXXXXXX, QK_BOOT, EE_CLR, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, - // ╰──────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────╯ - _______, _______, XXXXXXX, _______, XXXXXXX, - _______, _______, XXXXXXX - // ╰───────────────────────────╯ ╰──────────────────╯ - ), -}; -// clang-format on diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.json b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.json new file mode 100644 index 0000000000..2df4f16675 --- /dev/null +++ b/keyboards/bastardkb/charybdis/4x6/keymaps/default/keymap.json @@ -0,0 +1,31 @@ +{ + "keyboard": "bastardkb/charybdis/4x6/elitec", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_ESC" , "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "KC_GRV" , + "KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", + "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_CAPS", + "KC_LGUI", "MO(1)", "KC_SPC", "KC_ENT", "MO(2)", + "KC_LALT", "KC_SPC", "KC_BSPC" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0", "_______", + "_______", "KC_EXLM", "KC_AT", "KC_HASH", "KC_DLR", "KC_PERC", "KC_CIRC", "KC_AMPR", "KC_ASTR", "KC_LPRN", "KC_RPRN", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______" + ], + [ + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "QK_BOOT", "_______", "_______", "_______", "_______", "_______", "RM_VALU", "RM_HUEU", "RM_SATU", "RM_NEXT", "RM_TOGG", "_______", + "EE_CLR", "_______", "_______", "_______", "_______", "_______", "RM_VALD", "RM_HUED", "RM_SATD", "RM_PREV", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______", "_______", "_______", + "_______", "_______", "_______" + ] + ] +} diff --git a/keyboards/bastardkb/charybdis/4x6/keymaps/default/readme.md b/keyboards/bastardkb/charybdis/4x6/keymaps/default/readme.md deleted file mode 100644 index 23a85e54d5..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/keymaps/default/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Charybdis (4x6) default keymap - -> :bulb: Have a look at the [`via` keymap](../via) for a more feature-rich layout. - -The Charydbis (4x6) default keymap is inspired from the original [Dactyl Manuform](../../../../../handwired/dactyl_manuform) default keymap. - -This layout supports RGB matrix. However, due to space constraints on the MCU, only a limited number of effect can be enabled at once. Look at the `config.h` file and enable your favorite effect. diff --git a/keyboards/bastardkb/charybdis/4x6/readme.md b/keyboards/bastardkb/charybdis/4x6/readme.md deleted file mode 100644 index af2396cd6d..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# Charybdis (4x6) - -An ergonomic keyboard with integrated trackball. - -The Charybdis is available in 4x6 and 3x5 form factor at [bastardkb.com](https://bastardkb.com). - -## Keymaps - -### [`default`](keymaps/default) - -A simple QWERTY layout with 3 layers. - -### [`via`](keymaps/via) - -Same as the [default](keymaps/default) keymap, but with VIA support. diff --git a/keyboards/bastardkb/charybdis/4x6/rules.mk b/keyboards/bastardkb/charybdis/4x6/rules.mk new file mode 100644 index 0000000000..fab9162dc6 --- /dev/null +++ b/keyboards/bastardkb/charybdis/4x6/rules.mk @@ -0,0 +1 @@ +POINTING_DEVICE_DRIVER = pmw3360 diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h b/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h deleted file mode 100644 index dc0c6e4e03..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v1/elitec/config.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2020 Christopher Courtney (@drashna) - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN B0 diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json deleted file mode 100644 index 6b0caff82e..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "keyboard_name": "Charybdis (4x6) Elite-C", - "usb": { - "device_version": "1.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["D5", "C7", "F0", "D7", "E6", "B4"], - "rows": ["F1", "B7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - }, - "matrix_pins": { - "right": { - "cols": ["F1", "C7", "B7", "D7", "E6", "B4"], - "rows": ["D5", "F0", "C6", "D4", "B5"] - } - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk b/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk deleted file mode 100644 index 0e4d15d5bc..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v1/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported. - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h b/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h deleted file mode 100644 index 3b91322247..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/elitec/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN F0 diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json deleted file mode 100644 index 4163f9d476..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "keyboard_name": "Charybdis (4x6) Elite-C", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "build": { - "lto": true - }, - "ws2812": { - "pin": "D3" - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["F6", "F5", "B6", "D7", "E6", "B4"], - "rows": ["F4", "F7", "C6", "D4", "B5"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "D2" - } - }, - "processor": "atmega32u4", - "bootloader": "atmel-dfu" -} diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk deleted file mode 100644 index 0e4d15d5bc..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/elitec/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported. - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/config.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/config.h deleted file mode 100644 index e6e2a4f216..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP13 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP18 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP19 -#define POINTING_DEVICE_CS_PIN GP14 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json deleted file mode 100644 index 0da7d0b442..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis (4x6) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP15", "GP6", "GP7", "GP8"], - "rows": ["GP29", "GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/readme.md b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/config.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/config.h deleted file mode 100644 index ee7745d41e..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define SPLIT_HAND_PIN GP15 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* SPI & PMW3360 settings. */ -#define SPI_DRIVER SPID0 -#define SPI_SCK_PIN GP22 -#define SPI_MISO_PIN GP20 -#define SPI_MOSI_PIN GP23 -#define POINTING_DEVICE_CS_PIN GP16 - -/* Reset. */ -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json deleted file mode 100644 index 026684eb92..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "keyboard_name": "Charybdis (4x6) Splinky", - "usb": { - "device_version": "2.0.0" - }, - "features": { - "bootmagic": true, - "mousekey": false, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "matrix_pins": { - "cols": ["GP27", "GP28", "GP21", "GP6", "GP7", "GP8"], - "rows": ["GP29", "GP26", "GP5", "GP4", "GP9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "GP1" - } - }, - "ws2812": { - "pin": "GP0", - "driver": "vendor" - }, - "processor": "RP2040", - "bootloader": "rp2040" -} diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/mcuconf.h deleted file mode 100644 index 6aaf31428c..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/mcuconf.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 RP_SPI_USE_SPI0 -#define RP_SPI_USE_SPI0 TRUE diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/readme.md b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/readme.md deleted file mode 100644 index 662eb5825c..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Splinky controller - -The splinky is a Pro-Micro/Elite-C replacement with USB-C and RP2040. - -See [plut0nium/0xB2](https://github.com/plut0nium/0xB2/#releases) to figure out the right version for you (v2 or v3). diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/rules.mk deleted file mode 100644 index db29cb6789..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 - -SERIAL_DRIVER = vendor diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h deleted file mode 100644 index 3efb323302..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2022 Charly Delay (@0xcharly) - * - * 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 - -/* Handedness. */ -#define MASTER_RIGHT - -// To use the handedness pin, resistors need to be installed on the adapter PCB. -// If so, uncomment the following code, and undefine MASTER_RIGHT above. -// #define A0 PAL_LINE(GPIOA, 0) -// #define SPLIT_HAND_PIN A0 -// #define SPLIT_HAND_PIN_LOW_IS_LEFT // High -> right, Low -> left. - -/* RGB settings. */ -#define WS2812_PWM_DRIVER PWMD2 -#define WS2812_PWM_CHANNEL 4 -#define WS2812_PWM_PAL_MODE 1 -#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 -#define WS2812_PWM_DMA_CHANNEL 3 - -/* CRC. */ -#define CRC8_USE_TABLE -#define CRC8_OPTIMIZE_SPEED - -/* SPI config for pmw3360 sensor. */ -#define SPI_DRIVER SPID1 -#define SPI_SCK_PIN A5 -#define SPI_SCK_PAL_MODE 5 -#define SPI_MOSI_PIN A7 -#define SPI_MOSI_PAL_MODE 5 -#define SPI_MISO_PIN A6 -#define SPI_MISO_PAL_MODE 5 - -/* PMW3360 settings. */ -#define POINTING_DEVICE_CS_PIN A1 -#define PMW3360_CS_MODE 3 -#define PMW3360_CS_DIVISOR 64 diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h deleted file mode 100644 index 0397de50b7..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/halconf.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_PWM TRUE -#define HAL_USE_SERIAL TRUE -#define HAL_USE_SPI TRUE - -#include_next diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json deleted file mode 100644 index ed929f7fb7..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "keyboard_name": "Charybdis (4x6) STeMCell", - "usb": { - "device_version": "2.0.0", - "shared_endpoint": { - "keyboard": true - } - }, - "features": { - "bootmagic": true, - "mousekey": true, - "extrakey": true, - "rgb_matrix": true, - "pointing_device": true - }, - "rgb_matrix": { - "driver": "ws2812" - }, - "ws2812": { - "pin": "A2", - "driver": "pwm" - }, - "build": { - "debounce_type": "asym_eager_defer_pk" - }, - "matrix_pins": { - "cols": ["B1", "B2", "A4", "B4", "B5", "B8"], - "rows": ["B10", "B0", "B3", "A15", "B9"] - }, - "diode_direction": "ROW2COL", - "split": { - "enabled": true, - "serial": { - "pin": "A3" - } - }, - "development_board": "stemcell" -} diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h deleted file mode 100644 index 17a46d8f95..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/mcuconf.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2021 Charly Delay (@0xcharly) - * - * 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_SPI1 -#define STM32_SPI_USE_SPI1 TRUE - -#undef STM32_SERIAL_USE_USART1 -#define STM32_SERIAL_USE_USART1 FALSE - -#undef STM32_PWM_USE_TIM2 -#define STM32_PWM_USE_TIM2 TRUE - -#undef STM32_ST_USE_TIMER -#define STM32_ST_USE_TIMER 5 diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk deleted file mode 100644 index 4373b9c33d..0000000000 --- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/rules.mk +++ /dev/null @@ -1,6 +0,0 @@ -AUDIO_SUPPORTED = no # Audio is not supported - -POINTING_DEVICE_DRIVER = pmw3360 -MOUSE_SHARED_EP = no # Unify multiple HID interfaces into a single Endpoint - -SERIAL_DRIVER = usart From da2c6a41d815200312c72040642b60cee2842eee Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 15 Aug 2025 09:13:13 +0100 Subject: [PATCH 525/592] Remove converter assumption that everything is a promicro (#20330) --- builddefs/converters.mk | 5 ----- 1 file changed, 5 deletions(-) diff --git a/builddefs/converters.mk b/builddefs/converters.mk index 20ecea5cb9..9f8e80706e 100644 --- a/builddefs/converters.mk +++ b/builddefs/converters.mk @@ -1,8 +1,3 @@ -ifneq (,$(filter $(MCU),atmega32u4)) - # TODO: opt in rather than assume everything uses a pro micro - PIN_COMPATIBLE ?= promicro -endif - # Remove whitespace from any rule.mk provided vars # - env cannot be overwritten but cannot have whitespace anyway CONVERT_TO:=$(strip $(CONVERT_TO)) From d2ec940da5f7883e04777e72a338a70f4f828c8a Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 15 Aug 2025 19:32:54 +0100 Subject: [PATCH 526/592] Remove overriding of `DF()` within keyboards (#25541) --- keyboards/akko/5087/5087.c | 25 ++-------------- keyboards/akko/5087/keymaps/default/keymap.c | 4 +-- .../monsgeek/m1/keymaps/default/keymap.c | 4 +-- keyboards/monsgeek/m1/m1.c | 25 ++-------------- .../monsgeek/m3/keymaps/default/keymap.c | 4 +-- keyboards/monsgeek/m3/m3.c | 29 ++----------------- 6 files changed, 12 insertions(+), 79 deletions(-) diff --git a/keyboards/akko/5087/5087.c b/keyboards/akko/5087/5087.c index 27439c20ef..0b26ef90a6 100644 --- a/keyboards/akko/5087/5087.c +++ b/keyboards/akko/5087/5087.c @@ -125,24 +125,15 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { }; #endif // RGB_MATRIX_ENABLE -enum __layers { - WIN_B, - WIN_W, - WIN_FN, - MAC_B, - MAC_W, - MAC_FN, -}; - // clang-format on -void matrix_init_kb(void) { +void keyboard_post_init_kb(void) { gpio_set_pin_output(LED_MAC_OS_PIN); // LDE2 MAC\WIN gpio_write_pin_low(LED_MAC_OS_PIN); gpio_set_pin_output(LED_WIN_LOCK_PIN); // LED3 Win Lock gpio_write_pin_low(LED_WIN_LOCK_PIN); - matrix_init_user(); + keyboard_post_init_user(); } void housekeeping_task_kb(void){ @@ -155,18 +146,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) { return false; } switch (keycode) { - case DF(WIN_B): - if (record->event.pressed) { - set_single_persistent_default_layer(WIN_B); - } - return false; - case DF(MAC_B): - if (record->event.pressed) { - set_single_persistent_default_layer(MAC_B); - keymap_config.no_gui = 0; - eeconfig_update_keymap(&keymap_config); - } - return false; case QK_RGB_MATRIX_TOGGLE: if (record->event.pressed) { switch (rgb_matrix_get_flags()) { diff --git a/keyboards/akko/5087/keymaps/default/keymap.c b/keyboards/akko/5087/keymaps/default/keymap.c index 039823465c..162e862cd6 100644 --- a/keyboards/akko/5087/keymaps/default/keymap.c +++ b/keyboards/akko/5087/keymaps/default/keymap.c @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT_tkl_ansi( /* FN */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, - _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, + _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, PDF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU), @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_FN] = LAYOUT_tkl_ansi( /* 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_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______, + _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, PDF(WIN_B),_______,_______, _______, 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/m1/keymaps/default/keymap.c b/keyboards/monsgeek/m1/keymaps/default/keymap.c index 5cc4c0b3c3..df13a0c953 100644 --- a/keyboards/monsgeek/m1/keymaps/default/keymap.c +++ b/keyboards/monsgeek/m1/keymaps/default/keymap.c @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT_all( /* WASD/↑←↓→ */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______, _______, _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, - _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, KC_INS, DF(MAC_B),KC_PSCR,_______, _______, RM_NEXT, _______, + _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, KC_INS, PDF(MAC_B),KC_PSCR,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_NEXT, RM_HUEU, _______, _______, _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, _______, GU_TOGG, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU), @@ -74,7 +74,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_FN] = LAYOUT_all( /* FN */ _______, 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, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, - _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, KC_INS, DF(WIN_B),KC_PSCR,_______, _______, RM_NEXT, _______, + _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, KC_INS, PDF(WIN_B),KC_PSCR,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_NEXT, RM_HUEU, _______, _______, _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, _______, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU) diff --git a/keyboards/monsgeek/m1/m1.c b/keyboards/monsgeek/m1/m1.c index 2f7365e562..6466b55412 100644 --- a/keyboards/monsgeek/m1/m1.c +++ b/keyboards/monsgeek/m1/m1.c @@ -15,7 +15,7 @@ */ #include "quantum.h" - +// clang-format off #ifdef RGB_MATRIX_ENABLE const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { /* Refer to SNLED27351 manual for these locations @@ -165,34 +165,13 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { } #endif -enum __layers { - WIN_B, - WIN_W, - WIN_FN, - MAC_B, - MAC_W, - MAC_FN -}; +// clang-format on bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (!process_record_user(keycode, record)) { return false; } switch (keycode) { - case DF(WIN_B): - if (record->event.pressed) { - set_single_persistent_default_layer(WIN_B); - layer_state_set(1<event.pressed) { - set_single_persistent_default_layer(MAC_B); - layer_state_set(1<event.pressed) { switch (rgb_matrix_get_flags()) { diff --git a/keyboards/monsgeek/m3/keymaps/default/keymap.c b/keyboards/monsgeek/m3/keymaps/default/keymap.c index 58f69628bf..c92d31da39 100644 --- a/keyboards/monsgeek/m3/keymaps/default/keymap.c +++ b/keyboards/monsgeek/m3/keymaps/default/keymap.c @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [WIN_FN] = LAYOUT_tkl_ansi( /* FN */ _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, - _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, DF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, + _______, _______,TG(WIN_W),_______, _______, _______, _______, _______, _______, PDF(MAC_B),_______,_______, _______, RM_NEXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, GU_TOGG, _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU), @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [MAC_FN] = LAYOUT_tkl_ansi( /* 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_W),_______, _______, _______, _______, _______, _______, DF(WIN_B),_______,_______, _______, RM_NEXT, _______, _______, _______, + _______, _______,TG(MAC_W),_______, _______, _______, _______, _______, _______, PDF(WIN_B),_______,_______, _______, 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/m3/m3.c b/keyboards/monsgeek/m3/m3.c index bf5e038b3d..0b26ef90a6 100644 --- a/keyboards/monsgeek/m3/m3.c +++ b/keyboards/monsgeek/m3/m3.c @@ -126,22 +126,14 @@ const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { #endif // RGB_MATRIX_ENABLE // clang-format on -enum __layers { - WIN_B, - WIN_W, - WIN_FN, - MAC_B, - MAC_W, - MAC_FN, -}; -void matrix_init_kb(void) { +void keyboard_post_init_kb(void) { gpio_set_pin_output(LED_MAC_OS_PIN); // LDE2 MAC\WIN gpio_write_pin_low(LED_MAC_OS_PIN); gpio_set_pin_output(LED_WIN_LOCK_PIN); // LED3 Win Lock gpio_write_pin_low(LED_WIN_LOCK_PIN); - matrix_init_user(); + keyboard_post_init_user(); } void housekeeping_task_kb(void){ @@ -154,23 +146,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) { return false; } switch (keycode) { - case DF(WIN_B): - if (record->event.pressed) { - set_single_persistent_default_layer(WIN_B); - } - return false; - case DF(MAC_B): - if (record->event.pressed) { - set_single_persistent_default_layer(MAC_B); - keymap_config.no_gui = 0; - eeconfig_update_keymap(&keymap_config); - } - return false; - case GU_TOGG: - if (record->event.pressed) { - gpio_write_pin(LED_WIN_LOCK_PIN, !keymap_config.no_gui); - } - return true; case QK_RGB_MATRIX_TOGGLE: if (record->event.pressed) { switch (rgb_matrix_get_flags()) { From f29d8117bf877a4df1f88f40e0131f4465748540 Mon Sep 17 00:00:00 2001 From: dsanderling Date: Sat, 16 Aug 2025 15:04:37 +0000 Subject: [PATCH 527/592] Fix `boardsource/unicorne` RGB Matrix Coordinates (#25556) please see https://github.com/qmk/qmk_firmware/issues/23224 --- keyboards/boardsource/unicorne/keyboard.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/boardsource/unicorne/keyboard.json b/keyboards/boardsource/unicorne/keyboard.json index da1c3a787e..c87f8dd83a 100644 --- a/keyboards/boardsource/unicorne/keyboard.json +++ b/keyboards/boardsource/unicorne/keyboard.json @@ -118,9 +118,9 @@ {"matrix": [6, 1], "x": 208, "y": 42, "flags": 4}, {"matrix": [5, 1], "x": 208, "y": 24, "flags": 4}, {"matrix": [4, 1], "x": 208, "y": 7, "flags": 4}, - {"matrix": [4, 0], "x": 0, "y": 7, "flags": 1}, - {"matrix": [5, 0], "x": 0, "y": 24, "flags": 1}, - {"matrix": [6, 0], "x": 0, "y": 41, "flags": 1} + {"matrix": [4, 0], "x": 223, "y": 7, "flags": 1}, + {"matrix": [5, 0], "x": 223, "y": 24, "flags": 1}, + {"matrix": [6, 0], "x": 223, "y": 41, "flags": 1} ], "sleep": true }, From cc696a2ae838a9639335ca8eb3cb3b794c06bc33 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 17 Aug 2025 01:14:48 +0100 Subject: [PATCH 528/592] Refactor battery driver (#25550) --- builddefs/build_test.mk | 1 + builddefs/common_features.mk | 14 ++- builddefs/generic_features.mk | 1 + builddefs/testlist.mk | 1 + data/mappings/info_config.hjson | 8 ++ data/mappings/info_rules.hjson | 1 + data/schemas/keyboard.jsonschema | 22 +++++ docs/_sidebar.json | 1 + docs/drivers/battery.md | 69 +++++-------- docs/features/battery.md | 55 +++++++++++ docs/reference_info_json.md | 26 +++++ drivers/battery/battery_adc.c | 25 ++--- .../handwired/onekey/keymaps/battery/config.h | 2 +- .../handwired/onekey/keymaps/battery/keymap.c | 3 - .../onekey/keymaps/battery/keymap.json | 4 + .../handwired/onekey/keymaps/battery/rules.mk | 1 - keyboards/handwired/promethium/config.h | 2 - keyboards/handwired/promethium/keyboard.json | 7 ++ keyboards/handwired/promethium/rules.mk | 1 - {drivers => quantum}/battery/battery.c | 0 {drivers => quantum}/battery/battery.h | 0 quantum/battery/tests/battery_tests.cpp | 97 +++++++++++++++++++ quantum/battery/tests/rules.mk | 7 ++ quantum/battery/tests/testlist.mk | 2 + quantum/keyboard.c | 6 +- quantum/quantum.h | 4 + 26 files changed, 287 insertions(+), 73 deletions(-) create mode 100644 docs/features/battery.md delete mode 100644 keyboards/handwired/onekey/keymaps/battery/rules.mk rename {drivers => quantum}/battery/battery.c (100%) rename {drivers => quantum}/battery/battery.h (100%) create mode 100644 quantum/battery/tests/battery_tests.cpp create mode 100644 quantum/battery/tests/rules.mk create mode 100644 quantum/battery/tests/testlist.mk diff --git a/builddefs/build_test.mk b/builddefs/build_test.mk index 0c5c98e2a3..ccdad1b4e7 100644 --- a/builddefs/build_test.mk +++ b/builddefs/build_test.mk @@ -62,6 +62,7 @@ include $(BUILDDEFS_PATH)/common_features.mk include $(BUILDDEFS_PATH)/generic_features.mk include $(PLATFORM_PATH)/common.mk include $(TMK_PATH)/protocol.mk +include $(QUANTUM_PATH)/battery/tests/rules.mk include $(QUANTUM_PATH)/debounce/tests/rules.mk include $(QUANTUM_PATH)/encoder/tests/rules.mk include $(QUANTUM_PATH)/os_detection/tests/rules.mk diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index c122afcff9..1da13997b5 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -945,21 +945,25 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes) endif endif +ifeq ($(strip $(BATTERY_ENABLE)), yes) + BATTERY_DRIVER_REQUIRED := yes +endif + VALID_BATTERY_DRIVER_TYPES := adc custom vendor -BATTERY_DRIVER ?= adc +BATTERY_DRIVER ?= none ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes) ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),) $(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver) endif - OPT_DEFS += -DBATTERY_DRIVER - OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]')) + OPT_DEFS += -DBATTERY_DRIVER_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]')) COMMON_VPATH += $(DRIVER_PATH)/battery - SRC += battery.c - SRC += battery_$(strip $(BATTERY_DRIVER)).c + ifneq ($(strip $(BATTERY_DRIVER)), custom) + SRC += battery_$(strip $(BATTERY_DRIVER)).c + endif # add extra deps ifeq ($(strip $(BATTERY_DRIVER)), adc) diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk index c826514431..6d394977bd 100644 --- a/builddefs/generic_features.mk +++ b/builddefs/generic_features.mk @@ -21,6 +21,7 @@ SPACE_CADET_ENABLE ?= yes GENERIC_FEATURES = \ AUTO_SHIFT \ AUTOCORRECT \ + BATTERY \ BOOTMAGIC \ CAPS_WORD \ COMBO \ diff --git a/builddefs/testlist.mk b/builddefs/testlist.mk index 74a794adcd..2e81fe576b 100644 --- a/builddefs/testlist.mk +++ b/builddefs/testlist.mk @@ -1,6 +1,7 @@ TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk))) FULL_TESTS := $(notdir $(TEST_LIST)) +include $(QUANTUM_PATH)/battery/tests/testlist.mk include $(QUANTUM_PATH)/debounce/tests/testlist.mk include $(QUANTUM_PATH)/encoder/tests/testlist.mk include $(QUANTUM_PATH)/os_detection/tests/testlist.mk diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index a160e490c7..4c53aa4339 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -43,6 +43,14 @@ "BOOTMAGIC_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"}, "BOOTMAGIC_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"}, + // Battery + "BATTERY_SAMPLE_INTERVAL": {"info_key": "battery.sample_interval", "value_type": "int"}, + "BATTERY_ADC_PIN": {"info_key": "battery.adc.pin"}, + "BATTERY_ADC_REF_VOLTAGE_MV": {"info_key": "battery.adc.reference_voltage", "value_type": "int"}, + "BATTERY_ADC_VOLTAGE_DIVIDER_R1": {"info_key": "battery.adc.divider_r1", "value_type": "int"}, + "BATTERY_ADC_VOLTAGE_DIVIDER_R2": {"info_key": "battery.adc.divider_r2", "value_type": "int"}, + "BATTERY_ADC_RESOLUTION": {"info_key": "battery.adc.resolution", "value_type": "int"}, + // Caps Word "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "flag"}, "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"}, diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index d43d83c3ea..5ecd5c12b3 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -13,6 +13,7 @@ "AUDIO_DRIVER": {"info_key": "audio.driver"}, "BACKLIGHT_DRIVER": {"info_key": "backlight.driver"}, + "BATTERY_DRIVER": {"info_key": "battery.driver"}, "BLUETOOTH_DRIVER": {"info_key": "bluetooth.driver"}, "BOARD": {"info_key": "board"}, "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false}, diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 3775b66c1a..93b1c82b1c 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -188,6 +188,28 @@ "as_caps_lock": {"type": "boolean"} } }, + "battery": { + "type": "object", + "additionalProperties": false, + "properties": { + "driver": { + "type": "string", + "enum": ["adc", "custom", "vendor"] + }, + "adc": { + "type": "object", + "additionalProperties": false, + "properties": { + "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}, + "reference_voltage": {"type": "integer"}, + "divider_r1": {"type": "integer"}, + "divider_r2": {"type": "integer"}, + "resolution": {"type": "integer"} + } + }, + "sample_interval": {"type": "integer"} + } + }, "bluetooth": { "type": "object", "additionalProperties": false, diff --git a/docs/_sidebar.json b/docs/_sidebar.json index ee4709a650..eec345b788 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -175,6 +175,7 @@ ] }, { "text": "Audio", "link": "/features/audio" }, + { "text": "Battery", "link": "/features/battery" }, { "text": "Bootmagic", "link": "/features/bootmagic" }, { "text": "Converters", "link": "/feature_converters" }, { "text": "Custom Matrix", "link": "/custom_matrix" }, diff --git a/docs/drivers/battery.md b/docs/drivers/battery.md index e482ffc8b6..ae07668cc0 100644 --- a/docs/drivers/battery.md +++ b/docs/drivers/battery.md @@ -1,6 +1,6 @@ # Battery Driver -This driver provides support for sampling battery level. +This driver provides support for directly sampling battery level. ## Usage @@ -10,21 +10,17 @@ To use this driver, add the following to your `rules.mk`: BATTERY_DRIVER_REQUIRED = yes ``` -## Basic Configuration {#basic-configuration} - -Add the following to your `config.h`: - -|Define |Default |Description | -|--------------------------|--------|--------------------------------------------------| -|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. | +::::info Note +This is already configured for you if you are using the [Battery](../features/battery) feature. +:::: ## Driver Configuration {#driver-configuration} -Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers. +Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc`, `vendor`, or `custom`. See below for information on individual drivers. ### ADC Driver {#adc-driver} -This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider. +The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider. ```make BATTERY_DRIVER = adc @@ -32,42 +28,25 @@ BATTERY_DRIVER = adc The following `#define`s apply only to the `adc` driver: -|Define |Default |Description | -|-----------------------------|--------------|--------------------------------------------------------------| -|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. | -|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. | -|`BATTERY_VOLTAGE_DIVIDER_R1` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | -|`BATTERY_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | -|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. | +|Define |Default |Description | +|---------------------------------|--------------|--------------------------------------------------------------| +|`BATTERY_ADC_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. | +|`BATTERY_ADC_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. | +|`BATTERY_ADC_VOLTAGE_DIVIDER_R1` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_ADC_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. | +|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. | -## Functions +### Custom Driver {#custom-driver} -### `uint8_t battery_get_percent(void)` {#api-battery-get-percent} +A custom driver is expected to implement the following interface: -Sample battery level. +```c +void battery_driver_init(void) { + // Perform any initialisation here +} -#### Return Value {#api-battery-get-percent-return} - -The battery percentage, in the range 0-100. - -## Callbacks - -### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user} - -User hook called when battery level changed. - -### Arguments {#api-battery-percent-changed-user-arguments} - - - `uint8_t level` - The battery percentage, in the range 0-100. - ---- - -### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb} - -Keyboard hook called when battery level changed. - -### Arguments {#api-battery-percent-changed-kb-arguments} - - - `uint8_t level` - The battery percentage, in the range 0-100. +uint8_t battery_driver_sample_percent(void) { + // Read and return current state here + return value; +} +``` diff --git a/docs/features/battery.md b/docs/features/battery.md new file mode 100644 index 0000000000..f5c725efb9 --- /dev/null +++ b/docs/features/battery.md @@ -0,0 +1,55 @@ +# Battery + +This feature provides the high level abstraction for sampling battery level. + +## Usage + +To use this driver, add the following to your `rules.mk`: + +```make +BATTERY_ENABLE = yes +``` + +## Basic Configuration {#basic-configuration} + +Add the following to your `config.h`: + +|Define |Default |Description | +|--------------------------|--------|--------------------------------------------------| +|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. | + +## Driver Configuration {#driver-configuration} + +See the [Battery Driver](../drivers/battery) documentation for more information. + +## Functions + +### `uint8_t battery_get_percent(void)` {#api-battery-get-percent} + +Sample battery level. + +#### Return Value {#api-battery-get-percent-return} + +The battery percentage, in the range 0-100. + +## Callbacks + +### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user} + +User hook called when battery level changed. + +### Arguments {#api-battery-percent-changed-user-arguments} + + - `uint8_t level` + The battery percentage, in the range 0-100. + +--- + +### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb} + +Keyboard hook called when battery level changed. + +### Arguments {#api-battery-percent-changed-kb-arguments} + + - `uint8_t level` + The battery percentage, in the range 0-100. diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index cf22317613..84377ef36c 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -179,6 +179,32 @@ Configures the [Backlight](features/backlight) feature. * `pins` Array: Pin * A list of GPIO pins connected to the backlight LEDs (`software` and `timer` drivers only). +## Battery + +Configures the [Battery](features/battery) feature. + +* `battery` + * `adc` + * `pin` Pin Required + * The GPIO pin connected to the voltage divider. + * `reference_voltage` Number + * The ADC reverence voltage, in millivolts. + * Default: `3300` + * `divider_r1` Number + * The voltage divider resistance, in kOhm. Set to 0 to disable. + * Default: `100` + * `divider_r2` Number + * The voltage divider resistance, in kOhm. Set to 0 to disable. + * Default: `100` + * `resolution` Number + * The ADC resolution configured for the ADC Driver. + * Default: `10` + * `driver` String Required + * The driver to use. Must be one of `adc`, `custom`, `vendor`. + * `sample_interval` Number + * The delay between sampling the battery in milliseconds. + * Default: `30000` (30 s) + ## Wireless/Bluetooth {#bluetooth} Configures the [Wireless](features/wireless) feature. diff --git a/drivers/battery/battery_adc.c b/drivers/battery/battery_adc.c index cf0e69cb48..145265b5db 100644 --- a/drivers/battery/battery_adc.c +++ b/drivers/battery/battery_adc.c @@ -1,23 +1,24 @@ // Copyright 2025 QMK // SPDX-License-Identifier: GPL-2.0-or-later +#include "battery_driver.h" #include "analog.h" #include "gpio.h" -#ifndef BATTERY_PIN -# error("BATTERY_PIN not configured!") +#ifndef BATTERY_ADC_PIN +# error("BATTERY_ADC_PIN not configured!") #endif -#ifndef BATTERY_REF_VOLTAGE_MV -# define BATTERY_REF_VOLTAGE_MV 3300 +#ifndef BATTERY_ADC_REF_VOLTAGE_MV +# define BATTERY_ADC_REF_VOLTAGE_MV 3300 #endif -#ifndef BATTERY_VOLTAGE_DIVIDER_R1 +#ifndef BATTERY_ADC_VOLTAGE_DIVIDER_R1 # define BATTERY_VOLTAGE_DIVIDER_R1 100 #endif -#ifndef BATTERY_VOLTAGE_DIVIDER_R2 -# define BATTERY_VOLTAGE_DIVIDER_R2 100 +#ifndef BATTERY_ADC_VOLTAGE_DIVIDER_R2 +# define BATTERY_ADC_VOLTAGE_DIVIDER_R2 100 #endif // TODO: infer from adc config? @@ -26,16 +27,16 @@ #endif void battery_driver_init(void) { - gpio_set_pin_input(BATTERY_PIN); + gpio_set_pin_input(BATTERY_ADC_PIN); } uint16_t battery_driver_get_mv(void) { - uint32_t raw = analogReadPin(BATTERY_PIN); + uint32_t raw = analogReadPin(BATTERY_ADC_PIN); - uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION); + uint32_t bat_mv = raw * BATTERY_ADC_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION); -#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0 - bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2; +#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_ADC_VOLTAGE_DIVIDER_R2 > 0 + bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_ADC_VOLTAGE_DIVIDER_R2) / BATTERY_ADC_VOLTAGE_DIVIDER_R2; #endif return bat_mv; diff --git a/keyboards/handwired/onekey/keymaps/battery/config.h b/keyboards/handwired/onekey/keymaps/battery/config.h index 8a1c05d436..b93bfe9000 100644 --- a/keyboards/handwired/onekey/keymaps/battery/config.h +++ b/keyboards/handwired/onekey/keymaps/battery/config.h @@ -3,4 +3,4 @@ #pragma once -#define BATTERY_PIN ADC_PIN +#define BATTERY_ADC_PIN ADC_PIN diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.c b/keyboards/handwired/onekey/keymaps/battery/keymap.c index 74191e83fc..793a6ed87e 100644 --- a/keyboards/handwired/onekey/keymaps/battery/keymap.c +++ b/keyboards/handwired/onekey/keymaps/battery/keymap.c @@ -2,7 +2,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H -#include "battery.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_ortho_1x1(KC_A) @@ -14,8 +13,6 @@ void keyboard_post_init_user(void) { // debug_matrix=false; // debug_keyboard=true; // debug_mouse=false; - - battery_init(); } void housekeeping_task_user(void) { diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.json b/keyboards/handwired/onekey/keymaps/battery/keymap.json index c641dfe773..7232d6d899 100644 --- a/keyboards/handwired/onekey/keymaps/battery/keymap.json +++ b/keyboards/handwired/onekey/keymaps/battery/keymap.json @@ -1,6 +1,10 @@ { "config": { + "battery": { + "driver": "adc" + }, "features": { + "battery": true, "console": true } } diff --git a/keyboards/handwired/onekey/keymaps/battery/rules.mk b/keyboards/handwired/onekey/keymaps/battery/rules.mk deleted file mode 100644 index 06908179ae..0000000000 --- a/keyboards/handwired/onekey/keymaps/battery/rules.mk +++ /dev/null @@ -1 +0,0 @@ -BATTERY_DRIVER_REQUIRED = yes diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h index 974a4f951f..c63d3eaead 100644 --- a/keyboards/handwired/promethium/config.h +++ b/keyboards/handwired/promethium/config.h @@ -64,8 +64,6 @@ along with this program. If not, see . #define PS2_MOUSE_INIT_DELAY 2000 -#define BATTERY_PIN B5 - #ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file enum led_sequence { LED_IND_LINUX, diff --git a/keyboards/handwired/promethium/keyboard.json b/keyboards/handwired/promethium/keyboard.json index fa72908039..2e47bd186a 100644 --- a/keyboards/handwired/promethium/keyboard.json +++ b/keyboards/handwired/promethium/keyboard.json @@ -10,6 +10,12 @@ "ws2812": { "pin": "B5" }, + "battery": { + "driver": "adc", + "adc": { + "pin": "B5" + } + }, "bluetooth": { "driver": "bluefruit_le" }, @@ -22,6 +28,7 @@ "nkro": true, "ps2_mouse": true, "ps2": true, + "battery": true, "bluetooth": true }, "build": { diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk index 4012f8ca29..ecadca399c 100644 --- a/keyboards/handwired/promethium/rules.mk +++ b/keyboards/handwired/promethium/rules.mk @@ -5,7 +5,6 @@ PS2_DRIVER = interrupt CUSTOM_MATRIX = yes WS2812_DRIVER_REQUIRED = yes -BATTERY_DRIVER_REQUIRED = yes SRC += rgbsps.c SRC += matrix.c diff --git a/drivers/battery/battery.c b/quantum/battery/battery.c similarity index 100% rename from drivers/battery/battery.c rename to quantum/battery/battery.c diff --git a/drivers/battery/battery.h b/quantum/battery/battery.h similarity index 100% rename from drivers/battery/battery.h rename to quantum/battery/battery.h diff --git a/quantum/battery/tests/battery_tests.cpp b/quantum/battery/tests/battery_tests.cpp new file mode 100644 index 0000000000..ee011be8a8 --- /dev/null +++ b/quantum/battery/tests/battery_tests.cpp @@ -0,0 +1,97 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +using testing::_; + +class BatteryDriverMock { + public: + virtual ~BatteryDriverMock() {} + + // mock methods + MOCK_METHOD0(battery_driver_init, void(void)); + MOCK_METHOD0(battery_driver_sample_percent, uint8_t(void)); + MOCK_METHOD1(battery_percent_changed_kb, void(uint8_t)); +}; + +class BatteryTest : public ::testing::Test { + public: + BatteryTest() { + _batteryDriverMock.reset(new ::testing::NiceMock()); + } + virtual ~BatteryTest() { + _batteryDriverMock.reset(); + } + + static std::unique_ptr _batteryDriverMock; +}; + +std::unique_ptr BatteryTest::_batteryDriverMock; + +extern "C" { +#include "quantum/battery/battery.h" +#include "timer.h" + +void advance_time(uint32_t ms); + +void battery_driver_init(void) { + if (BatteryTest::_batteryDriverMock) { + BatteryTest::_batteryDriverMock->battery_driver_init(); + } +} + +uint8_t battery_driver_sample_percent(void) { + if (BatteryTest::_batteryDriverMock) { + return BatteryTest::_batteryDriverMock->battery_driver_sample_percent(); + } + return 255; +} + +void battery_percent_changed_kb(uint8_t level) { + if (BatteryTest::_batteryDriverMock) { + BatteryTest::_batteryDriverMock->battery_percent_changed_kb(level); + } +} +} + +TEST_F(BatteryTest, TestInit) { + // init driver and initial sample + EXPECT_CALL(*_batteryDriverMock, battery_driver_init()).Times(1); + EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1); + + battery_init(); +} + +TEST_F(BatteryTest, TestSampleCached) { + // sample before timeout + EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0); + + advance_time(1); + battery_task(); +} + +TEST_F(BatteryTest, TestSampleNotCached) { + // sample after timeout + EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(1); + + advance_time(60000); + battery_task(); +} + +TEST_F(BatteryTest, TestGet) { + // sample does not directly sample + EXPECT_CALL(*_batteryDriverMock, battery_driver_sample_percent()).Times(0); + + battery_get_percent(); +} + +TEST_F(BatteryTest, TestChanged) { + // callbacks on value changed + EXPECT_CALL(*_batteryDriverMock, battery_percent_changed_kb(_)).Times(1); + + battery_task(); + advance_time(60000); + battery_task(); +} diff --git a/quantum/battery/tests/rules.mk b/quantum/battery/tests/rules.mk new file mode 100644 index 0000000000..86980f1020 --- /dev/null +++ b/quantum/battery/tests/rules.mk @@ -0,0 +1,7 @@ +VPATH += $(DRIVER_PATH)/battery + +battery_SRC := \ + $(PLATFORM_PATH)/timer.c \ + $(PLATFORM_PATH)/$(PLATFORM_KEY)/timer.c \ + $(QUANTUM_PATH)/battery/battery.c \ + $(QUANTUM_PATH)/battery/tests/battery_tests.cpp \ diff --git a/quantum/battery/tests/testlist.mk b/quantum/battery/tests/testlist.mk new file mode 100644 index 0000000000..e91da865a0 --- /dev/null +++ b/quantum/battery/tests/testlist.mk @@ -0,0 +1,2 @@ +TEST_LIST += \ + battery \ diff --git a/quantum/keyboard.c b/quantum/keyboard.c index bf4890a51d..173c696e2d 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -122,7 +122,7 @@ along with this program. If not, see . #ifdef SPLIT_KEYBOARD # include "split_util.h" #endif -#ifdef BATTERY_DRIVER +#ifdef BATTERY_ENABLE # include "battery.h" #endif #ifdef BLUETOOTH_ENABLE @@ -532,7 +532,7 @@ void keyboard_init(void) { // init after split init pointing_device_init(); #endif -#ifdef BATTERY_DRIVER +#ifdef BATTERY_ENABLE battery_init(); #endif #ifdef BLUETOOTH_ENABLE @@ -779,7 +779,7 @@ void keyboard_task(void) { joystick_task(); #endif -#ifdef BATTERY_DRIVER +#ifdef BATTERY_ENABLE battery_task(); #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 0036cd784b..176c8a292d 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -63,6 +63,10 @@ # include "bootmagic.h" #endif +#ifdef BATTERY_ENABLE +# include "battery.h" +#endif + #ifdef DEFERRED_EXEC_ENABLE # include "deferred_exec.h" #endif From b834819a351f402c2f118a9a3474c197c154a7a5 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sun, 17 Aug 2025 17:47:46 +0100 Subject: [PATCH 529/592] Swap spleeb to default GENERIC_PROMICRO_RP2040 board files (#25564) --- keyboards/spleeb/config.h | 1 - keyboards/spleeb/keyboard.json | 1 - 2 files changed, 2 deletions(-) diff --git a/keyboards/spleeb/config.h b/keyboards/spleeb/config.h index 64a1fb09ba..e71f0dc007 100644 --- a/keyboards/spleeb/config.h +++ b/keyboards/spleeb/config.h @@ -28,5 +28,4 @@ #endif // OLED_ENABLE #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET -#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED GP17 #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 1000U diff --git a/keyboards/spleeb/keyboard.json b/keyboards/spleeb/keyboard.json index 56b0bc83b0..3b55785ee9 100644 --- a/keyboards/spleeb/keyboard.json +++ b/keyboards/spleeb/keyboard.json @@ -18,7 +18,6 @@ "rows": ["GP5", "GP6", "GP7", "GP8", "GP9"] }, "processor": "RP2040", - "board": "QMK_PM2040", "secure": { "idle_timeout": 60000, "unlock_sequence": [ From 7110708d0fdaac1f068b4668fd9816308981a701 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sun, 17 Aug 2025 10:50:59 -0600 Subject: [PATCH 530/592] Refactor `tweetydabird/lotus58` (#25547) - Update aliases accordingly - Remove unnecessary elite_c revision; an alternate bootloader or development board can easily be set by a user. The PCB is not dependant on an Elite-C pin compatible microcontroller - Remove unnecessary nanoboot revision; any user going to the trouble of using this bootloader will have no trouble manually setting the size of their bootloader - Move the promicro revision to be the "standard" for this keyboard - Remove unnecessary rp2040_ce revision; the converter feature should be used here instead --- data/mappings/keyboard_aliases.hjson | 13 +- .../lotus58/elite_c/keyboard.json | 34 ----- .../lotus58/{info.json => keyboard.json} | 117 ++++++++++++++++-- .../lotus58/nanoboot/keyboard.json | 34 ----- .../tweetydabird/lotus58/nanoboot/rules.mk | 2 - .../lotus58/promicro/keyboard.json | 33 ----- keyboards/tweetydabird/lotus58/readme.md | 13 +- .../tweetydabird/lotus58/rp2040_ce/config.h | 9 -- .../tweetydabird/lotus58/rp2040_ce/halconf.h | 21 ---- .../lotus58/rp2040_ce/keyboard.json | 32 ----- .../tweetydabird/lotus58/rp2040_ce/mcuconf.h | 22 ---- 11 files changed, 120 insertions(+), 210 deletions(-) delete mode 100644 keyboards/tweetydabird/lotus58/elite_c/keyboard.json rename keyboards/tweetydabird/lotus58/{info.json => keyboard.json} (53%) delete mode 100644 keyboards/tweetydabird/lotus58/nanoboot/keyboard.json delete mode 100644 keyboards/tweetydabird/lotus58/nanoboot/rules.mk delete mode 100644 keyboards/tweetydabird/lotus58/promicro/keyboard.json delete mode 100644 keyboards/tweetydabird/lotus58/rp2040_ce/config.h delete mode 100644 keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h delete mode 100644 keyboards/tweetydabird/lotus58/rp2040_ce/keyboard.json delete mode 100644 keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson index cd5ce6e9ab..3978235e20 100644 --- a/data/mappings/keyboard_aliases.hjson +++ b/data/mappings/keyboard_aliases.hjson @@ -2265,8 +2265,17 @@ "trnthsn/s6xty5neor2": { "target": "trnthsn/s6xty5neor2/stm32f103" }, - "tweetydabird/lotus58": { - "target": "tweetydabird/lotus58/promicro" + "tweetydabird/lotus58/elite_c": { + "target": "tweetydabird/lotus58" + }, + "tweetydabird/lotus58/nanoboot": { + "target": "tweetydabird/lotus58" + }, + "tweetydabird/lotus58/promicro": { + "target": "tweetydabird/lotus58" + }, + "tweetydabird/lotus58/rp2040_ce": { + "target": "tweetydabird/lotus58" }, "unison": { "target": "unison/v04" diff --git a/keyboards/tweetydabird/lotus58/elite_c/keyboard.json b/keyboards/tweetydabird/lotus58/elite_c/keyboard.json deleted file mode 100644 index 2a4c4a21bc..0000000000 --- a/keyboards/tweetydabird/lotus58/elite_c/keyboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "build": { - "lto": true - }, - "development_board": "elite_c", - "pin_compatible": "elite_c", - "encoder": { - "rotary": [ - {"pin_a": "F5", "pin_b": "F4", "resolution": 2} - ] - }, - "matrix_pins": { - "cols": ["B1", "B2", "B3", "B6", "F7", "F6"], - "rows": ["D4", "C6", "D7", "E6", "B4"] - }, - "split": { - "encoder": { - "right": { - "rotary": [ - {"pin_a": "F4", "pin_b": "F5", "resolution": 2} - ] - } - }, - "handedness": { - "pin": "B5" - }, - "serial": { - "pin": "D2" - } - }, - "ws2812": { - "pin": "D3" - } -} diff --git a/keyboards/tweetydabird/lotus58/info.json b/keyboards/tweetydabird/lotus58/keyboard.json similarity index 53% rename from keyboards/tweetydabird/lotus58/info.json rename to keyboards/tweetydabird/lotus58/keyboard.json index 3c47e3fdc2..a74506ab29 100644 --- a/keyboards/tweetydabird/lotus58/info.json +++ b/keyboards/tweetydabird/lotus58/keyboard.json @@ -3,7 +3,16 @@ "keyboard_name": "Lotus 58 Glow", "maintainer": "TweetyDaBird", "bootloader_instructions": "Short marked pads on PCB, or hold top-outer key when plugging in each hand.", + "build": { + "lto": true + }, + "development_board": "promicro", "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "F5", "pin_b": "F4", "resolution": 2} + ] + }, "features": { "bootmagic": true, "encoder": true, @@ -11,17 +20,94 @@ "mousekey": true, "nkro": true, "oled": true, - "rgblight": true, + "rgb_matrix": true, "tri_layer": true }, - "rgblight": { + "host": { "default": { - "val": 87 - }, - "led_count": 70, + "nkro": true + } + }, + "matrix_pins": { + "cols": ["B1", "B2", "B3", "B6", "F7", "F6"], + "rows": ["D4", "C6", "D7", "E6", "B4"] + }, + "rgb_matrix": { + "driver": "ws2812", + "layout": [ + {"matrix": [0, 5], "x": 72, "y": 4, "flags": 4}, + {"x": 65, "y": 4, "flags": 2}, + {"matrix": [0, 4], "x": 58, "y": 2, "flags": 4}, + {"matrix": [0, 3], "x": 43, "y": 0, "flags": 4}, + {"x": 36, "y": 4, "flags": 2}, + {"matrix": [0, 2], "x": 29, "y": 2, "flags": 4}, + {"matrix": [0, 1], "x": 14, "y": 6, "flags": 4}, + {"x": 7, "y": 4, "flags": 2}, + {"matrix": [0, 0], "x": 0, "y": 8, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 23, "flags": 4}, + {"matrix": [1, 1], "x": 14, "y": 21, "flags": 4}, + {"matrix": [1, 2], "x": 29, "y": 17, "flags": 4}, + {"matrix": [1, 3], "x": 43, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 58, "y": 17, "flags": 4}, + {"matrix": [1, 5], "x": 72, "y": 19, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 34, "flags": 4}, + {"matrix": [2, 4], "x": 58, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 43, "y": 30, "flags": 4}, + {"matrix": [2, 2], "x": 29, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 14, "y": 36, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 38, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 53, "flags": 4}, + {"x": 7, "y": 52, "flags": 2}, + {"matrix": [3, 1], "x": 14, "y": 51, "flags": 4}, + {"matrix": [3, 2], "x": 29, "y": 47, "flags": 4}, + {"matrix": [3, 3], "x": 43, "y": 45, "flags": 4}, + {"matrix": [3, 4], "x": 58, "y": 47, "flags": 4}, + {"matrix": [3, 5], "x": 72, "y": 49, "flags": 4}, + {"x": 79, "y": 45, "flags": 2}, + {"matrix": [4, 5], "x": 87, "y": 41, "flags": 4}, + {"matrix": [4, 4], "x": 87, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 65, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 51, "y": 62, "flags": 4}, + {"x": 43, "y": 62, "flags": 2}, + {"matrix": [4, 1], "x": 36, "y": 62, "flags": 4}, + {"matrix": [5, 5], "x": 152, "y": 4, "flags": 4}, + {"x": 159, "y": 4, "flags": 2}, + {"matrix": [5, 4], "x": 166, "y": 2, "flags": 4}, + {"matrix": [5, 3], "x": 181, "y": 0, "flags": 4}, + {"x": 188, "y": 4, "flags": 2}, + {"matrix": [5, 2], "x": 195, "y": 2, "flags": 4}, + {"matrix": [5, 1], "x": 210, "y": 6, "flags": 4}, + {"x": 217, "y": 4, "flags": 2}, + {"matrix": [5, 0], "x": 224, "y": 8, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 23, "flags": 4}, + {"matrix": [6, 1], "x": 210, "y": 21, "flags": 4}, + {"matrix": [6, 2], "x": 195, "y": 17, "flags": 4}, + {"matrix": [6, 3], "x": 181, "y": 15, "flags": 4}, + {"matrix": [6, 4], "x": 166, "y": 17, "flags": 4}, + {"matrix": [6, 5], "x": 152, "y": 19, "flags": 4}, + {"matrix": [7, 5], "x": 152, "y": 34, "flags": 4}, + {"matrix": [7, 4], "x": 166, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 181, "y": 30, "flags": 4}, + {"matrix": [7, 2], "x": 195, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 210, "y": 36, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 38, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 53, "flags": 4}, + {"x": 217, "y": 52, "flags": 2}, + {"matrix": [8, 1], "x": 210, "y": 51, "flags": 4}, + {"matrix": [8, 2], "x": 195, "y": 47, "flags": 4}, + {"matrix": [8, 3], "x": 181, "y": 45, "flags": 4}, + {"matrix": [8, 4], "x": 166, "y": 47, "flags": 4}, + {"matrix": [8, 5], "x": 152, "y": 49, "flags": 4}, + {"x": 159, "y": 45, "flags": 2}, + {"matrix": [9, 5], "x": 137, "y": 41, "flags": 4}, + {"matrix": [9, 4], "x": 137, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 159, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 173, "y": 62, "flags": 4}, + {"x": 180, "y": 62, "flags": 2}, + {"matrix": [9, 1], "x": 188, "y": 62, "flags": 4} + ], "max_brightness": 175, "sleep": true, - "split": true, "split_count": [35, 35] }, "split": { @@ -29,6 +115,19 @@ "matrix": [5, 0] }, "enabled": true, + "encoder": { + "right": { + "rotary": [ + {"pin_a": "F4", "pin_b": "F5", "resolution": 2} + ] + } + }, + "handedness": { + "pin": "B5" + }, + "serial": { + "pin": "D2" + }, "transport": { "sync": { "indicators": true, @@ -48,10 +147,8 @@ "pid": "0x23B0", "vid": "0xFEED" }, - "host": { - "default": { - "nkro": true - } + "ws2812": { + "pin": "D3" }, "layouts": { "LAYOUT": { diff --git a/keyboards/tweetydabird/lotus58/nanoboot/keyboard.json b/keyboards/tweetydabird/lotus58/nanoboot/keyboard.json deleted file mode 100644 index 85f37a265c..0000000000 --- a/keyboards/tweetydabird/lotus58/nanoboot/keyboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "build": { - "lto": true - }, - "pin_compatible": "promicro", - "processor": "atmega32u4", - "encoder": { - "rotary": [ - {"pin_a": "F5", "pin_b": "F4", "resolution": 2} - ] - }, - "matrix_pins": { - "cols": ["B1", "B2", "B3", "B6", "F7", "F6"], - "rows": ["D4", "C6", "D7", "E6", "B4"] - }, - "split": { - "encoder": { - "right": { - "rotary": [ - {"pin_a": "F4", "pin_b": "F5", "resolution": 2} - ] - } - }, - "handedness": { - "pin": "B5" - }, - "serial": { - "pin": "D2" - } - }, - "ws2812": { - "pin": "D3" - } -} diff --git a/keyboards/tweetydabird/lotus58/nanoboot/rules.mk b/keyboards/tweetydabird/lotus58/nanoboot/rules.mk deleted file mode 100644 index 1d937578bd..0000000000 --- a/keyboards/tweetydabird/lotus58/nanoboot/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -BOOTLOADER = qmk-hid -BOOTLOADER_SIZE = 512 diff --git a/keyboards/tweetydabird/lotus58/promicro/keyboard.json b/keyboards/tweetydabird/lotus58/promicro/keyboard.json deleted file mode 100644 index 83532c8ee2..0000000000 --- a/keyboards/tweetydabird/lotus58/promicro/keyboard.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "build": { - "lto": true - }, - "development_board": "promicro", - "encoder": { - "rotary": [ - {"pin_a": "F5", "pin_b": "F4", "resolution": 2} - ] - }, - "matrix_pins": { - "cols": ["B1", "B2", "B3", "B6", "F7", "F6"], - "rows": ["D4", "C6", "D7", "E6", "B4"] - }, - "split": { - "encoder": { - "right": { - "rotary": [ - {"pin_a": "F4", "pin_b": "F5", "resolution": 2} - ] - } - }, - "handedness": { - "pin": "B5" - }, - "serial": { - "pin": "D2" - } - }, - "ws2812": { - "pin": "D3" - } -} diff --git a/keyboards/tweetydabird/lotus58/readme.md b/keyboards/tweetydabird/lotus58/readme.md index 57a89a9b03..637706f2ab 100644 --- a/keyboards/tweetydabird/lotus58/readme.md +++ b/keyboards/tweetydabird/lotus58/readme.md @@ -9,22 +9,13 @@ * Hardware Availability: [Lectronz Store](https://lectronz.com/stores/tweetys-wild-thinking) * Hardware Design: [GitHub](https://github.com/TweetyDaBird/Lotus58) - -#### This keyboard firmware contains three different versions, all for the same PCB/hardware, but depending on your choice of controller/bootloader. - - -* promicro - This uses the default Caterina bootloader. -* elite_c - This uses the Atmel-DFU bootloader. -* nanoBoot - A tiny 512 byte bootloader giving far more usable memory for features (can be used on both Elite C and Pro Micro). - - Make example for this keyboard (after setting up your build environment): - make tweetydabird/lotus58/promicro:default + make tweetydabird/lotus58:default Flashing example for this keyboard: - make tweetydabird/lotus58/elite_c:default:flash + make tweetydabird/lotus58: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). diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/config.h b/keyboards/tweetydabird/lotus58/rp2040_ce/config.h deleted file mode 100644 index e4a23b7d7f..0000000000 --- a/keyboards/tweetydabird/lotus58/rp2040_ce/config.h +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2024 Markus Knutsson (@TweetyDaBird) -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral - -#define I2C_DRIVER I2CD1 -#define I2C1_SDA_PIN GP2 -#define I2C1_SCL_PIN GP3 diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h b/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h deleted file mode 100644 index 2e098f5113..0000000000 --- a/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2022 QMK - * - * 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 - -#include_next diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/keyboard.json b/keyboards/tweetydabird/lotus58/rp2040_ce/keyboard.json deleted file mode 100644 index 07fb343974..0000000000 --- a/keyboards/tweetydabird/lotus58/rp2040_ce/keyboard.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "development_board": "promicro_rp2040", - "encoder": { - "rotary": [ - {"pin_a": "GP28", "pin_b": "GP29", "resolution": 2} - ] - }, - "matrix_pins": { - "cols": ["GP22", "GP23", "GP20", "GP21", "GP26", "GP27"], - "rows": ["GP4", "GP5", "GP6", "GP7", "GP8"] - }, - "split": { - "encoder": { - "right": { - "rotary": [ - {"pin_a": "GP29", "pin_b": "GP28", "resolution": 2} - ] - } - }, - "serial": { - "driver": "vendor", - "pin": "GP1" - }, - "handedness": { - "pin": "GP9" - } - }, - "ws2812": { - "driver": "vendor", - "pin": "GP0" - } -} diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h b/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h deleted file mode 100644 index 2ae39bf675..0000000000 --- a/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2022 QMK - * - * 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 RP_I2C_USE_I2C1 -#define RP_I2C_USE_I2C1 TRUE From df8bb7ce24856589635af1a99fe9b6f2bee1ec02 Mon Sep 17 00:00:00 2001 From: Lung Sin <31788267+lungsin@users.noreply.github.com> Date: Mon, 25 Aug 2025 04:47:28 +0700 Subject: [PATCH 531/592] Add cachyos as pattern when installing dependencies (#25580) chore: add cachyos as pattern when installing dependencies --- util/qmk_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/qmk_install.sh b/util/qmk_install.sh index 3f49bd255a..0829a917ee 100755 --- a/util/qmk_install.sh +++ b/util/qmk_install.sh @@ -24,7 +24,7 @@ case $(uname -a) in . "$QMK_FIRMWARE_UTIL_DIR/install/linux_shared.sh" case $(grep ID /etc/os-release) in - *arch*|*manjaro*) + *arch*|*manjaro*|*cachyos*) . "$QMK_FIRMWARE_UTIL_DIR/install/arch.sh";; *debian*|*ubuntu*) . "$QMK_FIRMWARE_UTIL_DIR/install/debian.sh";; From b43ec9d65a2c379512800253470ae6485081f3ac Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 5 Sep 2025 22:07:20 +0100 Subject: [PATCH 532/592] 2025q3 develop changelog (#25597) --- docs/ChangeLog/20250831.md | 181 +++++++++++++++++++++++ docs/ChangeLog/20250831/HelixRefactor.md | 37 ----- docs/ChangeLog/20250831/PR25414.md | 5 - docs/_sidebar.json | 2 +- docs/breaking_changes.md | 20 +-- docs/breaking_changes_history.md | 1 + 6 files changed, 193 insertions(+), 53 deletions(-) create mode 100644 docs/ChangeLog/20250831.md delete mode 100644 docs/ChangeLog/20250831/HelixRefactor.md delete mode 100644 docs/ChangeLog/20250831/PR25414.md diff --git a/docs/ChangeLog/20250831.md b/docs/ChangeLog/20250831.md new file mode 100644 index 0000000000..12ce19289f --- /dev/null +++ b/docs/ChangeLog/20250831.md @@ -0,0 +1,181 @@ +# QMK Breaking Changes - 2025 Aug 31 Changelog + +## Changes Requiring User Action + +### Updated Keyboard Codebases + +| Old Keyboard Name | New Keyboard Name | +|--------------------------------------|----------------------------------| +| bastardkb/charybdis/3x5/v2/elitec | bastardkb/charybdis/3x5/elitec | +| bastardkb/charybdis/3x5/v2/splinky_2 | bastardkb/charybdis/3x5/elitec | +| bastardkb/charybdis/3x5/v2/splinky_3 | bastardkb/charybdis/3x5/elitec | +| bastardkb/charybdis/3x5/v2/stemcell | bastardkb/charybdis/3x5/elitec | +| bastardkb/charybdis/3x6/v2/elitec | bastardkb/charybdis/3x6/elitec | +| bastardkb/charybdis/3x6/v2/splinky_2 | bastardkb/charybdis/3x6/elitec | +| bastardkb/charybdis/3x6/v2/splinky_3 | bastardkb/charybdis/3x6/elitec | +| bastardkb/charybdis/3x6/v2/stemcell | bastardkb/charybdis/3x6/elitec | +| bastardkb/charybdis/4x6/v2/elitec | bastardkb/charybdis/4x6/elitec | +| bastardkb/charybdis/4x6/v2/splinky_2 | bastardkb/charybdis/4x6/elitec | +| bastardkb/charybdis/4x6/v2/splinky_3 | bastardkb/charybdis/4x6/elitec | +| bastardkb/charybdis/4x6/v2/stemcell | bastardkb/charybdis/4x6/elitec | +| bastardkb/dilemma/3x5_2/splinky | bastardkb/dilemma/3x5_2/promicro | +| bastardkb/scylla/v2/elitec | bastardkb/scylla/promicro | +| bastardkb/scylla/v2/splinky_2 | bastardkb/scylla/promicro | +| bastardkb/scylla/v2/splinky_3 | bastardkb/scylla/promicro | +| bastardkb/scylla/v2/stemcell | bastardkb/scylla/promicro | +| bastardkb/skeletyl/v2/elitec | bastardkb/skeletyl/promicro | +| bastardkb/skeletyl/v2/splinky_2 | bastardkb/skeletyl/promicro | +| bastardkb/skeletyl/v2/splinky_3 | bastardkb/skeletyl/promicro | +| bastardkb/skeletyl/v2/stemcell | bastardkb/skeletyl/promicro | +| bastardkb/tbkmini/v2/elitec | bastardkb/tbkmini/promicro | +| bastardkb/tbkmini/v2/splinky_2 | bastardkb/tbkmini/promicro | +| bastardkb/tbkmini/v2/splinky_3 | bastardkb/tbkmini/promicro | +| bastardkb/tbkmini/v2/stemcell | bastardkb/tbkmini/promicro | +| helix/rev2 | helix/beta | +| helix/rev3_4rows | helix/rev3 | +| helix/rev3_5rows | helix/rev3 | +| kprepublic/cstc40/daughterboard | kprepublic/cstc40/rev1 | +| kprepublic/cstc40/single_pcb | kprepublic/cstc40/rev2 | +| ll3macorn/bongopad | ll3ma/bongopad | +| novelkeys/nk65/base | novelkeys/nk65/v1 | +| tweetydabird/lotus58/elite_c | tweetydabird/lotus58 | +| tweetydabird/lotus58/nanoboot | tweetydabird/lotus58 | +| tweetydabird/lotus58/promicro | tweetydabird/lotus58 | +| tweetydabird/lotus58/rp2040_ce | tweetydabird/lotus58 | + +### Mitigate VIA keylogger security issues [#25414](https://github.com/qmk/qmk_firmware/pull/25414) + +VIA's keyboard matrix testing functionality, which allows users to identify active key presses, has been identified as a potential security concern by community members and security researchers. This feature has been demonstrated to enable unauthorized keystroke capture, with documented examples showing how malicious scripts could exploit this capability to create keyloggers. A recent security assessment revealed that user credentials could be compromised by exploiting the matrix testing function combined with VIA's keycode assignment queries. In this attack scenario, a script could remain active during a locked session and capture password input when users authenticate upon return. + +The QMK team notified the VIA team of this security vulnerability on May 17, 2022, and made multiple subsequent attempts to coordinate a mitigation strategy. Despite repeated outreach, the VIA team has provided no acknowledgment or response to these security concerns. Given the severity of the potential security implications and the lack of engagement from the VIA team, the QMK team has unilaterally implemented a security enhancement that modifies the keyboard matrix testing functionality to prevent the reporting of key press events. This change prioritizes user security and data protection over potential feature compatibility concerns within VIA. + +## Deprecation Notices + +In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here. + +### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281)) + +`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system. +Parent folders containing common configuration would create invalid build targets. + +With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets. +The `DEFAULT_FOLDER` functionality is now removed with the intent that `rules.mk` is now pure configuration. + +Backwards compatibility of build targets has been maintained where possible. + +### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330)) + +Converter support has been further limited to only function if a keyboard declares that it is compatible. + +This can be configured in the following ways: + +:::::tabs + +==== keyboard.json + +```json [keyboard.json] +{ + "development_board": "promicro", // [!code focus] +} +``` + +==== rules.mk + +```make [rules.mk] +PIN_COMPATIBLE = promicro +``` + +::::: + +see the [Converters Feature](../feature_converters) documentation for more information. + +### Removal of deprecated RGB and Mouse keycodes ([#25444](https://github.com/qmk/qmk_firmware/pull/25444)) + +Backwards compatibility of deprecated RGB and Mouse keycodes has been removed. + +See the following documentation for the list of currently supported keycodes: + +* [RGB Lighting](../features/rgblight#keycodes) +* [RGB Matrix](../features/rgb_matrix#keycodes) +* [Mouse keys](../features/mouse_keys#mapping-mouse-actions) + +## Full changelist + +Core: +* Remove converter assumption that everything is a promicro ([#20330](https://github.com/qmk/qmk_firmware/pull/20330)) +* Remove `DEFAULT_FOLDER` handling ([#23281](https://github.com/qmk/qmk_firmware/pull/23281)) +* Add core handling for pointing device failures. ([#25315](https://github.com/qmk/qmk_firmware/pull/25315)) +* Relocate remaining `process_record_quantum` keycodes ([#25328](https://github.com/qmk/qmk_firmware/pull/25328)) +* Remove `process_action_kb` callback ([#25331](https://github.com/qmk/qmk_firmware/pull/25331)) +* Add `{rgb|led}_matrix_get_mode_name()`. ([#25344](https://github.com/qmk/qmk_firmware/pull/25344)) +* Align sleep_led logic ([#25395](https://github.com/qmk/qmk_firmware/pull/25395)) +* Mitigate VIA keylogger security issues ([#25414](https://github.com/qmk/qmk_firmware/pull/25414)) +* Deprecate some nonstandard mod & mod-tap keycode aliases ([#25437](https://github.com/qmk/qmk_firmware/pull/25437)) +* Refactor Starlight Smooth matrix effect ([#25442](https://github.com/qmk/qmk_firmware/pull/25442)) +* Remove deprecated `RGB_` and Mouse keycodes ([#25444](https://github.com/qmk/qmk_firmware/pull/25444)) +* Configure SPI for `QMK_PM2040` board ([#25481](https://github.com/qmk/qmk_firmware/pull/25481)) +* Configure SPI for `STEMCELL` board ([#25486](https://github.com/qmk/qmk_firmware/pull/25486)) +* Configure SPI for `QMK_BLOK` board ([#25487](https://github.com/qmk/qmk_firmware/pull/25487)) +* Clamp reactive offset value ([#25489](https://github.com/qmk/qmk_firmware/pull/25489)) +* Relocate `AUDIO_INIT_DELAY` implementation ([#25491](https://github.com/qmk/qmk_firmware/pull/25491)) +* Add MATRIX_ROWS_PER_HAND definition ([#25513](https://github.com/qmk/qmk_firmware/pull/25513)) +* Refactor battery driver ([#25550](https://github.com/qmk/qmk_firmware/pull/25550)) +* Add cachyos as pattern when installing dependencies ([#25580](https://github.com/qmk/qmk_firmware/pull/25580)) + +CLI: +* Add MATRIX_MASKED DD config ([#25383](https://github.com/qmk/qmk_firmware/pull/25383)) +* Ensure keyboard aliases do not point to themselves ([#25500](https://github.com/qmk/qmk_firmware/pull/25500)) + +Keyboards: +* [Update] E8ghtyNeo caps indicator ([#25009](https://github.com/qmk/qmk_firmware/pull/25009)) +* Keychron C3 Pro `c3_pro.c` corrections ([#25049](https://github.com/qmk/qmk_firmware/pull/25049)) +* Update franky36 pid and vid ([#25160](https://github.com/qmk/qmk_firmware/pull/25160)) +* Added Encoder support for Soyuz ([#25279](https://github.com/qmk/qmk_firmware/pull/25279)) +* CSTC40 rev3 (FXTWINK) ([#25285](https://github.com/qmk/qmk_firmware/pull/25285)) +* Migrate remaining `DEFAULT_FOLDER` to keyboard aliases ([#25291](https://github.com/qmk/qmk_firmware/pull/25291)) +* Configure boards to use development_board - R ([#25316](https://github.com/qmk/qmk_firmware/pull/25316)) +* Configure boards to use development_board - P ([#25317](https://github.com/qmk/qmk_firmware/pull/25317)) +* Configure boards to use development_board - NO ([#25338](https://github.com/qmk/qmk_firmware/pull/25338)) +* Configure boards to use development_board - LM ([#25341](https://github.com/qmk/qmk_firmware/pull/25341)) +* maple_computing/launchpad - Remove broken `default_rgb` keymap ([#25342](https://github.com/qmk/qmk_firmware/pull/25342)) +* update winry25 VID and PID ([#25351](https://github.com/qmk/qmk_firmware/pull/25351)) +* Configure boards to use development_board - DE ([#25369](https://github.com/qmk/qmk_firmware/pull/25369)) +* Configure boards to use development_board - FGHIJ ([#25370](https://github.com/qmk/qmk_firmware/pull/25370)) +* refactor(mercutio): layouts & reformatting ([#25408](https://github.com/qmk/qmk_firmware/pull/25408)) +* Configure boards to use development_board - ABC ([#25417](https://github.com/qmk/qmk_firmware/pull/25417)) +* Configure boards to use development_board - K ([#25421](https://github.com/qmk/qmk_firmware/pull/25421)) +* Refactor `helix/pico` ([#25428](https://github.com/qmk/qmk_firmware/pull/25428)) +* Refactor `helix/rev2` ([#25429](https://github.com/qmk/qmk_firmware/pull/25429)) +* Refactor `helix/rev3_{4,5}rows` ([#25430](https://github.com/qmk/qmk_firmware/pull/25430)) +* Migrate `helix` common configuration ([#25433](https://github.com/qmk/qmk_firmware/pull/25433)) +* Refactor `bastardkb/tbkmini` ([#25438](https://github.com/qmk/qmk_firmware/pull/25438)) +* Convert `novelkeys/nk65` to use RGB Matrix ([#25450](https://github.com/qmk/qmk_firmware/pull/25450)) +* Convert moon to lite custom matrix ([#25452](https://github.com/qmk/qmk_firmware/pull/25452)) +* Refactor `bastardkb/skeletyl` ([#25456](https://github.com/qmk/qmk_firmware/pull/25456)) +* Refactor `bastardkb/scylla` ([#25459](https://github.com/qmk/qmk_firmware/pull/25459)) +* Refactor `bastardkb/dilemma/3x5_2` ([#25462](https://github.com/qmk/qmk_firmware/pull/25462)) +* Migrate `usb.force_nkro` to `host.default.nkro` ([#25468](https://github.com/qmk/qmk_firmware/pull/25468)) +* Give mouse report to pointing_device_task_user first in ploopyco devices ([#25475](https://github.com/qmk/qmk_firmware/pull/25475)) +* Refactor `bastardkb/charybdis/3x5` ([#25488](https://github.com/qmk/qmk_firmware/pull/25488)) +* Refactor `bastardkb/charybdis/3x6` ([#25493](https://github.com/qmk/qmk_firmware/pull/25493)) +* Refactor `bastardkb/charybdis/4x6` ([#25494](https://github.com/qmk/qmk_firmware/pull/25494)) +* Rebrand For Ll3ma Keyboards ([#25498](https://github.com/qmk/qmk_firmware/pull/25498)) +* Remove some encoder resolution that duplicate defaults ([#25517](https://github.com/qmk/qmk_firmware/pull/25517)) +* Remove overriding of `DF()` within keyboards ([#25541](https://github.com/qmk/qmk_firmware/pull/25541)) +* Refactor inland/kb83 ([#25542](https://github.com/qmk/qmk_firmware/pull/25542)) +* Refactor `tweetydabird/lotus58` ([#25547](https://github.com/qmk/qmk_firmware/pull/25547)) +* Swap spleeb to default GENERIC_PROMICRO_RP2040 board files ([#25564](https://github.com/qmk/qmk_firmware/pull/25564)) + +Keyboard fixes: +* Fix `keebio/quefrency/rev1:default60` ([#25423](https://github.com/qmk/qmk_firmware/pull/25423)) +* Fixup `bastardkb/tbkmini` keymap's build target ([#25458](https://github.com/qmk/qmk_firmware/pull/25458)) +* Miscellaneous fixes for lint warnings ([#25469](https://github.com/qmk/qmk_firmware/pull/25469)) +* Fix pytest/has_community default keymap location ([#25471](https://github.com/qmk/qmk_firmware/pull/25471)) +* Fix serial speed DD configuration & migrate keyboards ([#25546](https://github.com/qmk/qmk_firmware/pull/25546)) +* Update rgb x coordinate of rightmost column ([#25556](https://github.com/qmk/qmk_firmware/pull/25556)) + +Bugs: +* Fix buggy switch statement in quantum.c ([#25322](https://github.com/qmk/qmk_firmware/pull/25322)) +* Compilation fixes for `-fno-common` ([#25436](https://github.com/qmk/qmk_firmware/pull/25436)) +* Only userspace should be searched for keyboard aliases when locating keymaps ([#25477](https://github.com/qmk/qmk_firmware/pull/25477)) +* Allow `qmk flash ` to flash AT32 boards ([#25497](https://github.com/qmk/qmk_firmware/pull/25497)) diff --git a/docs/ChangeLog/20250831/HelixRefactor.md b/docs/ChangeLog/20250831/HelixRefactor.md deleted file mode 100644 index 58136ce06b..0000000000 --- a/docs/ChangeLog/20250831/HelixRefactor.md +++ /dev/null @@ -1,37 +0,0 @@ -# Refactor of `keyboards/helix` - -This series of PRs aims to align this keyboard's configuration with current standards, and also remove unnecessary contents. - -### Refactor `helix/pico` [#25428](https://github.com/qmk/qmk_firmware/pull/25428) - - Removes redundant `back`, `base`, `sc`, `under`, & `qmk_conf` revisions - - Migrates legacy defines and configuration to JSON - - Migrates `default` keymap to JSON - - Fixes RGB configuration to illuminate 25 LEDs per half - - Enables standard features like Bootmagic, extrakey, etc. - - Updates keyboard aliases accordingly - -### Refactor `helix/rev2` [#25429](https://github.com/qmk/qmk_firmware/pull/25429) - - Removes redundant `back`, `base`, `sc`, `under`, & `qmk_conf` revisions - - Renames `rev2` to `beta`, as the only PCB sources in the official Helix GitHub repository are named "[beta](https://github.com/MakotoKurauchi/helix/tree/master/PCB/beta)", this keyboard's name in QMK Firmware was already "beta", and this PCB is sold under the name "[beta](https://shop.yushakobo.jp/products/oss_pcb?variant=39452554231969)" on the Yushakobo store - - Migrates legacy defines and configuration to JSON - - Migrates `default` keymap to JSON - - Fixes RGB configuration to illuminate 32 LEDs per half - - Enables standard features like Bootmagic, extrakey, etc. - - Updates keyboard aliases accordingly - - Tidy's up OLED code - - Adds alternate 4 row layout, as this PCB allows users to snap off the bottom row - -### Refactor `helix/rev3_{4,5}rows` [#25430](https://github.com/qmk/qmk_firmware/pull/25430) - - The `rev3_4rows` and `rev3_5rows` firmwares are identical, except for the extra row users can snap off. The 4 row PCB is not sold anywhere as an individual product, only the [5 row PCB](https://shop.yushakobo.jp/products/2143). Thus, this PR removes the aforementioned two build targets and adds a single `rev3` revision - - Migrates legacy defines and configuration to JSON - - Migrates `default` keymap to JSON - - Removes RGB Light configuration - - Updates keyboard aliases accordingly - - Tidy's up OLED code - - Adds alternate 4 row layout, as this PCB allows users to snap off the bottom row - -### Migrate helix common configuration [#25433](https://github.com/qmk/qmk_firmware/pull/25433) - - Migrates common configuration shared between revisions to the top-level keyboard directory - - Improves `readme.md` to provide more detail regarding PCB revisions - - Removes unnecessary top-level `rules.mk` file and other general tidying - - Migrates `beta` and `pico` revisions to use RGB Matrix, which is more appropriate as these PCBs are fit with per-key RGB LEDs diff --git a/docs/ChangeLog/20250831/PR25414.md b/docs/ChangeLog/20250831/PR25414.md deleted file mode 100644 index bee901c6ca..0000000000 --- a/docs/ChangeLog/20250831/PR25414.md +++ /dev/null @@ -1,5 +0,0 @@ -# Mitigate VIA keylogger security issues [#25414](https://github.com/qmk/qmk_firmware/pull/25414) - -VIA's keyboard matrix testing functionality, which allows users to identify active key presses, has been identified as a potential security concern by community members and security researchers. This feature has been demonstrated to enable unauthorized keystroke capture, with documented examples showing how malicious scripts could exploit this capability to create keyloggers. A recent security assessment revealed that user credentials could be compromised by exploiting the matrix testing function combined with VIA's keycode assignment queries. In this attack scenario, a script could remain active during a locked session and capture password input when users authenticate upon return. - -The QMK team notified the VIA team of this security vulnerability on May 17, 2022, and made multiple subsequent attempts to coordinate a mitigation strategy. Despite repeated outreach, the VIA team has provided no acknowledgment or response to these security concerns. Given the severity of the potential security implications and the lack of engagement from the VIA team, the QMK team has unilaterally implemented a security enhancement that modifies the keyboard matrix testing functionality to prevent the reporting of key press events. This change prioritizes user security and data protection over potential feature compatibility concerns within VIA. diff --git a/docs/_sidebar.json b/docs/_sidebar.json index eec345b788..d237b0e1d0 100644 --- a/docs/_sidebar.json +++ b/docs/_sidebar.json @@ -214,7 +214,7 @@ { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "Most Recent ChangeLog", - "link": "/ChangeLog/20250525" + "link": "/ChangeLog/20250831" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Deprecation Policy", "link": "/support_deprecation_policy" } diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md index 9063fc18db..1e9335d8bc 100644 --- a/docs/breaking_changes.md +++ b/docs/breaking_changes.md @@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch ## What has been included in past Breaking Changes? +* [2025 Aug 31](ChangeLog/20250831) * [2025 May 25](ChangeLog/20250525) * [2025 Feb 23](ChangeLog/20250223) -* [2024 Nov 24](ChangeLog/20241124) * [Older Breaking Changes](breaking_changes_history) ## When is the next Breaking Change? -The next Breaking Change is scheduled for Aug 31, 2025. +The next Breaking Change is scheduled for November 30, 2025. ### Important Dates -* 2025 May 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. -* 2025 Aug 3 - `develop` closed to new PRs. -* 2025 Aug 3 - Call for testers. -* 2025 Aug 17 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes -* 2025 Aug 24 - `develop` is locked, only critical bugfix PRs merged. -* 2025 Aug 29 - `master` is locked, no PRs merged. -* 2025 Aug 31 - Merge `develop` to `master`. -* 2025 Aug 31 - `master` is unlocked. PRs can be merged again. +* 2025 Aug 31 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. +* 2025 Nov 2 - `develop` closed to new PRs. +* 2025 Nov 2 - Call for testers. +* 2025 Nov 16 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes +* 2025 Nov 23 - `develop` is locked, only critical bugfix PRs merged. +* 2025 Nov 28 - `master` is locked, no PRs merged. +* 2025 Nov 30 - Merge `develop` to `master`. +* 2025 Nov 30 - `master` is unlocked. PRs can be merged again. ## What changes will be included? diff --git a/docs/breaking_changes_history.md b/docs/breaking_changes_history.md index 274aa340df..29ceb09db7 100644 --- a/docs/breaking_changes_history.md +++ b/docs/breaking_changes_history.md @@ -2,6 +2,7 @@ This page links to all previous changelogs from the QMK Breaking Changes process. +* [2025 Aug 31](ChangeLog/20250831) - version 0.30.0 * [2025 May 25](ChangeLog/20250525) - version 0.29.0 * [2025 Feb 23](ChangeLog/20250223) - version 0.28.0 * [2024 Nov 24](ChangeLog/20241124) - version 0.27.0 From 2a4b9f79fd32a41fd157cba83293ece995523b45 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 6 Sep 2025 17:54:54 +1000 Subject: [PATCH 533/592] Merge point for 2025q3 breaking changes. --- readme.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/readme.md b/readme.md index e5c0d41b7b..62aed12066 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,3 @@ -# THIS IS THE DEVELOP BRANCH - -Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information. - # Quantum Mechanical Keyboard Firmware [![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) From e42877d0071d40e4ad1f9576f6739f7dedde1165 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:08:17 +0100 Subject: [PATCH 534/592] Bump actions/labeler from 5 to 6 (#25604) Bumps [actions/labeler](https://github.com/actions/labeler) from 5 to 6. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/labeler dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 2dc354dda2..0e9f29908e 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -10,4 +10,4 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v5 + - uses: actions/labeler@v6 From 20e7906c80ef0880a97ed2a4ede725350d38f066 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Mon, 8 Sep 2025 02:25:17 +0900 Subject: [PATCH 535/592] Add new keyboard "Palmbrain" (#25377) Co-authored-by: Duncan Sutherland Co-authored-by: Joel Challis Co-authored-by: jack <0x6a73@protonmail.com> --- keyboards/takashicompany/palmbrain/config.h | 6 ++ .../takashicompany/palmbrain/keyboard.json | 80 +++++++++++++++++++ .../palmbrain/keymaps/default/keymap.c | 49 ++++++++++++ keyboards/takashicompany/palmbrain/readme.md | 31 +++++++ 4 files changed, 166 insertions(+) create mode 100644 keyboards/takashicompany/palmbrain/config.h create mode 100644 keyboards/takashicompany/palmbrain/keyboard.json create mode 100644 keyboards/takashicompany/palmbrain/keymaps/default/keymap.c create mode 100644 keyboards/takashicompany/palmbrain/readme.md diff --git a/keyboards/takashicompany/palmbrain/config.h b/keyboards/takashicompany/palmbrain/config.h new file mode 100644 index 0000000000..d9d98bf85f --- /dev/null +++ b/keyboards/takashicompany/palmbrain/config.h @@ -0,0 +1,6 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define EE_HANDS diff --git a/keyboards/takashicompany/palmbrain/keyboard.json b/keyboards/takashicompany/palmbrain/keyboard.json new file mode 100644 index 0000000000..830b202bed --- /dev/null +++ b/keyboards/takashicompany/palmbrain/keyboard.json @@ -0,0 +1,80 @@ +{ + "manufacturer": "takashicompany", + "keyboard_name": "Palmbrain", + "maintainer": "takashicompany", + "development_board": "promicro", + "dynamic_keymap": { + "layer_count": 12 + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "direct": [ + ["F5", "D1", "F6", "E6", "F7", "F4", "D0", "C6", "B4", "B1", "D3", "D4", "D7", "B5", "B3", "B2", "B6"] + ] + }, + "split": { + "enabled": true, + "matrix_pins": { + "right": { + "direct": [ + ["F7", "E6", "F6", "D1", "F5", "B1", "B4", "C6", "D0", "F4", "B3", "B5", "D7", "D4", "D3", "B6", "B2"] + ] + } + }, + "serial": { + "pin": "D2" + } + }, + "url": "https://github.com/takashicompany/palmbrain", + "usb": { + "device_version": "1.0.0", + "pid": "0x0066", + "vid": "0x7463" + }, + "community_layouts": ["split_3x5_2"], + "layouts": { + "LAYOUT_split_3x5_2": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.45}, + {"matrix": [0, 1], "x": 0.9, "y": 0.225}, + {"matrix": [0, 2], "x": 1.8, "y": 0}, + {"matrix": [0, 3], "x": 2.7, "y": 0.225}, + {"matrix": [0, 4], "x": 3.6, "y": 0.45}, + {"matrix": [1, 0], "x": 7.2, "y": 0.45}, + {"matrix": [1, 1], "x": 8.1, "y": 0.225}, + {"matrix": [1, 2], "x": 9, "y": 0}, + {"matrix": [1, 3], "x": 9.9, "y": 0.225}, + {"matrix": [1, 4], "x": 10.8, "y": 0.45}, + {"matrix": [0, 5], "x": 0, "y": 1.35}, + {"matrix": [0, 6], "x": 0.9, "y": 1.125}, + {"matrix": [0, 7], "x": 1.8, "y": 0.9}, + {"matrix": [0, 8], "x": 2.7, "y": 1.125}, + {"matrix": [0, 9], "x": 3.6, "y": 1.35}, + {"matrix": [1, 5], "x": 7.2, "y": 1.35}, + {"matrix": [1, 6], "x": 8.1, "y": 1.125}, + {"matrix": [1, 7], "x": 9, "y": 0.9}, + {"matrix": [1, 8], "x": 9.9, "y": 1.125}, + {"matrix": [1, 9], "x": 10.8, "y": 1.35}, + {"matrix": [0, 10], "x": 0, "y": 2.25}, + {"matrix": [0, 11], "x": 0.9, "y": 2.025}, + {"matrix": [0, 12], "x": 1.8, "y": 1.8}, + {"matrix": [0, 13], "x": 2.7, "y": 2.025}, + {"matrix": [0, 14], "x": 3.6, "y": 2.25}, + {"matrix": [1, 10], "x": 7.2, "y": 2.25}, + {"matrix": [1, 11], "x": 8.1, "y": 2.025}, + {"matrix": [1, 12], "x": 9, "y": 1.8}, + {"matrix": [1, 13], "x": 9.9, "y": 2.025}, + {"matrix": [1, 14], "x": 10.8, "y": 2.25}, + {"matrix": [0, 15], "x": 3.6, "y": 3.375}, + {"matrix": [0, 16], "x": 4.5, "y": 3.375}, + {"matrix": [1, 15], "x": 6.3, "y": 3.375}, + {"matrix": [1, 16], "x": 7.2, "y": 3.375} + ] + } + } +} diff --git a/keyboards/takashicompany/palmbrain/keymaps/default/keymap.c b/keyboards/takashicompany/palmbrain/keymaps/default/keymap.c new file mode 100644 index 0000000000..fede7140e2 --- /dev/null +++ b/keyboards/takashicompany/palmbrain/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +// Copyright 2025 takashicompany (@takashicompany) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_split_3x5_2( + LT(4, KC_Q), KC_W, KC_E, LT(3, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, LT(4, KC_D), KC_F, KC_G, KC_H, KC_J, LT(3, KC_K), KC_L, KC_ENT, + LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, + LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1) + ), + + [1] = LAYOUT_split_3x5_2( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + LCTL_T(KC_EQL), KC_LBRC, KC_SLSH, KC_MINS, KC_INT1, KC_SCLN, KC_QUOT, KC_RBRC, KC_NUHS, KC_INT3, + LSFT_T(KC_PLUS), KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT_split_3x5_2( + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, LGUI(KC_INT3), + KC_PLUS, KC_LCBR, KC_QUES, KC_UNDS, LSFT(KC_INT1), KC_COLN, KC_DQUO, KC_RCBR, LSFT(KC_NUHS), LSFT(KC_INT3), + KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [3] = LAYOUT_split_3x5_2( + KC_ESC, KC_TAB, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, + KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, + KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [4] = LAYOUT_split_3x5_2( + KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(5), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT_split_3x5_2( + UG_TOGG, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/takashicompany/palmbrain/readme.md b/keyboards/takashicompany/palmbrain/readme.md new file mode 100644 index 0000000000..ac41ca488a --- /dev/null +++ b/keyboards/takashicompany/palmbrain/readme.md @@ -0,0 +1,31 @@ +# Palmbrain + +![takashicompany/Palmbrain](https://i.imgur.com/Og9lYip.jpeg) + +Palmbrain is a 34-key split keyboard with a key pitch of 17 mm (0.9 u). +It can be equipped with BLE Micro Pro and is also compatible with wireless connectivity. + +Palmbrainは17mm(0.9u)のキーピッチを採用した34キーの分割型のキーボードです。 +BLE Micro Proを搭載することが可能で、無線化にも対応しています。 + +* Keyboard Maintainer: [takashicompany](https://github.com/takashicompany) +* Hardware Supported: PCB, Pro Micro development board. +* Hardware Availability: https://github.com/takashicompany/palmbrain + +Make example for this keyboard (after setting up your build environment): + + make takashicompany/palmbrain:default + +Flashing example for this keyboard: + + make takashicompany/palmbrain: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 fa37d958b4f77c56846e455792516ea90cf9001f Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 8 Sep 2025 02:57:07 -0400 Subject: [PATCH 536/592] Add Nyquist LM (#25583) --- keyboards/keebio/nyquist_lm/info.json | 8 + .../nyquist_lm/keymaps/default/keymap.c | 35 ++ .../nyquist_lm/keymaps/default/rules.mk | 1 + keyboards/keebio/nyquist_lm/readme.md | 24 ++ keyboards/keebio/nyquist_lm/rev1/config.h | 23 ++ keyboards/keebio/nyquist_lm/rev1/halconf.h | 10 + .../keebio/nyquist_lm/rev1/keyboard.json | 304 ++++++++++++++++++ keyboards/keebio/nyquist_lm/rev1/mcuconf.h | 14 + keyboards/keebio/nyquist_lm/rev1/rev1.c | 11 + 9 files changed, 430 insertions(+) create mode 100644 keyboards/keebio/nyquist_lm/info.json create mode 100644 keyboards/keebio/nyquist_lm/keymaps/default/keymap.c create mode 100644 keyboards/keebio/nyquist_lm/keymaps/default/rules.mk create mode 100644 keyboards/keebio/nyquist_lm/readme.md create mode 100644 keyboards/keebio/nyquist_lm/rev1/config.h create mode 100644 keyboards/keebio/nyquist_lm/rev1/halconf.h create mode 100644 keyboards/keebio/nyquist_lm/rev1/keyboard.json create mode 100644 keyboards/keebio/nyquist_lm/rev1/mcuconf.h create mode 100644 keyboards/keebio/nyquist_lm/rev1/rev1.c diff --git a/keyboards/keebio/nyquist_lm/info.json b/keyboards/keebio/nyquist_lm/info.json new file mode 100644 index 0000000000..64fa5a05ca --- /dev/null +++ b/keyboards/keebio/nyquist_lm/info.json @@ -0,0 +1,8 @@ +{ + "manufacturer": "Keebio", + "maintainer": "Keebio", + "url": "https://keeb.io", + "usb": { + "vid": "0xCB10" + } +} diff --git a/keyboards/keebio/nyquist_lm/keymaps/default/keymap.c b/keyboards/keebio/nyquist_lm/keymaps/default/keymap.c new file mode 100644 index 0000000000..e47cd18d4f --- /dev/null +++ b/keyboards/keebio/nyquist_lm/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_5x12( + KC_GRV, 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_DEL, + KC_ESC, 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_ENT , + MO(3), KC_LCTL, KC_LALT, KC_LGUI, TL_LOWR, KC_SPC, KC_SPC, TL_UPPR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [1] = LAYOUT_ortho_5x12( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + RM_NEXT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME,KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + [2] = LAYOUT_ortho_5x12( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + [3] = LAYOUT_ortho_5x12( + _______, QK_BOOT, RM_TOGG, RM_NEXT, RM_HUED, RM_HUEU, RM_SATD, RM_SATU, RM_VALD, RM_VALU, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/keebio/nyquist_lm/keymaps/default/rules.mk b/keyboards/keebio/nyquist_lm/keymaps/default/rules.mk new file mode 100644 index 0000000000..7c9bf212a6 --- /dev/null +++ b/keyboards/keebio/nyquist_lm/keymaps/default/rules.mk @@ -0,0 +1 @@ +TRI_LAYER_ENABLE = yes diff --git a/keyboards/keebio/nyquist_lm/readme.md b/keyboards/keebio/nyquist_lm/readme.md new file mode 100644 index 0000000000..84d65f7c9f --- /dev/null +++ b/keyboards/keebio/nyquist_lm/readme.md @@ -0,0 +1,24 @@ +# Nyquist LM + +A low-profile 60% split 5x12 ortholinear keyboard made and sold by Keebio. [More info at Keebio](https://keeb.io). + +* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges) +* Hardware Availability: [Keebio](https://keeb.io/) + +Make example for this keyboard (after setting up your build environment): + + make keebio/nyquist_lm/rev1:default + +Example of flashing this keyboard: + + make keebio/nyquist_lm/rev1: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 the top left of left half or top right of right half and plug in the keyboard +* **Physical reset button**: Press and hold the button on the back of the PCB for at least 1 second and let go +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/keebio/nyquist_lm/rev1/config.h b/keyboards/keebio/nyquist_lm/rev1/config.h new file mode 100644 index 0000000000..06498b8b8b --- /dev/null +++ b/keyboards/keebio/nyquist_lm/rev1/config.h @@ -0,0 +1,23 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Defines for the split keyboard setup */ +#define SERIAL_USART_DRIVER SD1 // USART 1 +#define SERIAL_USART_TX_PIN A9 +#define SERIAL_USART_RX_PIN A10 +#define SERIAL_USART_TX_PAL_MODE 7 +#define SERIAL_USART_RX_PAL_MODE 7 +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_PIN_SWAP + +#define USB_VBUS_PIN A7 + +/* Defines for the RGB matrix */ +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_DMA_CHANNEL 2 +#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP diff --git a/keyboards/keebio/nyquist_lm/rev1/halconf.h b/keyboards/keebio/nyquist_lm/rev1/halconf.h new file mode 100644 index 0000000000..ce1dfd06d7 --- /dev/null +++ b/keyboards/keebio/nyquist_lm/rev1/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SERIAL TRUE + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/keebio/nyquist_lm/rev1/keyboard.json b/keyboards/keebio/nyquist_lm/rev1/keyboard.json new file mode 100644 index 0000000000..011bb01b5e --- /dev/null +++ b/keyboards/keebio/nyquist_lm/rev1/keyboard.json @@ -0,0 +1,304 @@ +{ + "keyboard_name": "Nyquist LM Rev. 1", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["A6", "A5", "A4", "A15", "B5", "B6"], + "rows": ["B3", "B4", "B7", "F0", "F1"] + }, + "processor": "STM32G431", + "rgb_matrix": { + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "flower_blooming": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true, + "starlight": true, + "starlight_smooth": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "riverflow": true + }, + "driver": "ws2812", + "layout": [ + { "flags": 4, "matrix": [0, 0], "x": 9, "y": 6 }, + { "flags": 4, "matrix": [0, 1], "x": 28, "y": 6 }, + { "flags": 4, "matrix": [0, 2], "x": 46, "y": 6 }, + { "flags": 4, "matrix": [0, 3], "x": 65, "y": 6 }, + { "flags": 4, "matrix": [0, 4], "x": 84, "y": 6 }, + { "flags": 4, "matrix": [0, 5], "x": 102, "y": 6 }, + + { "flags": 4, "matrix": [1, 5], "x": 102, "y": 19 }, + { "flags": 4, "matrix": [1, 4], "x": 84, "y": 19 }, + { "flags": 4, "matrix": [1, 3], "x": 65, "y": 19 }, + { "flags": 4, "matrix": [1, 2], "x": 46, "y": 19 }, + { "flags": 4, "matrix": [1, 1], "x": 28, "y": 19 }, + { "flags": 4, "matrix": [1, 0], "x": 9, "y": 19 }, + + { "flags": 4, "matrix": [2, 0], "x": 9, "y": 32 }, + { "flags": 4, "matrix": [2, 1], "x": 28, "y": 32 }, + { "flags": 4, "matrix": [2, 2], "x": 46, "y": 32 }, + { "flags": 4, "matrix": [2, 3], "x": 65, "y": 32 }, + { "flags": 4, "matrix": [2, 4], "x": 84, "y": 32 }, + { "flags": 4, "matrix": [2, 5], "x": 102, "y": 32 }, + + { "flags": 4, "matrix": [3, 5], "x": 102, "y": 44 }, + { "flags": 4, "matrix": [3, 4], "x": 84, "y": 44 }, + { "flags": 4, "matrix": [3, 3], "x": 65, "y": 44 }, + { "flags": 4, "matrix": [3, 2], "x": 46, "y": 44 }, + { "flags": 4, "matrix": [3, 1], "x": 28, "y": 44 }, + { "flags": 4, "matrix": [3, 0], "x": 9, "y": 44 }, + + { "flags": 4, "matrix": [4, 0], "x": 9, "y": 57 }, + { "flags": 4, "matrix": [4, 1], "x": 28, "y": 57 }, + { "flags": 4, "matrix": [4, 2], "x": 46, "y": 57 }, + { "flags": 4, "matrix": [4, 3], "x": 65, "y": 57 }, + { "flags": 4, "matrix": [4, 4], "x": 81, "y": 57 }, + { "flags": 4, "matrix": [4, 5], "x": 102, "y": 57 }, + + { "flags": 4, "matrix": [5, 0], "x": 121, "y": 6 }, + { "flags": 4, "matrix": [5, 1], "x": 140, "y": 6 }, + { "flags": 4, "matrix": [5, 2], "x": 158, "y": 6 }, + { "flags": 4, "matrix": [5, 3], "x": 177, "y": 6 }, + { "flags": 4, "matrix": [5, 4], "x": 196, "y": 6 }, + { "flags": 4, "matrix": [5, 5], "x": 214, "y": 6 }, + + { "flags": 4, "matrix": [6, 5], "x": 214, "y": 19 }, + { "flags": 4, "matrix": [6, 4], "x": 196, "y": 19 }, + { "flags": 4, "matrix": [6, 3], "x": 177, "y": 19 }, + { "flags": 4, "matrix": [6, 2], "x": 158, "y": 19 }, + { "flags": 4, "matrix": [6, 1], "x": 140, "y": 19 }, + { "flags": 4, "matrix": [6, 0], "x": 121, "y": 19 }, + + { "flags": 4, "matrix": [7, 0], "x": 121, "y": 32 }, + { "flags": 4, "matrix": [7, 1], "x": 140, "y": 32 }, + { "flags": 4, "matrix": [7, 2], "x": 158, "y": 32 }, + { "flags": 4, "matrix": [7, 3], "x": 177, "y": 32 }, + { "flags": 4, "matrix": [7, 4], "x": 196, "y": 32 }, + { "flags": 4, "matrix": [7, 5], "x": 214, "y": 32 }, + + { "flags": 4, "matrix": [8, 5], "x": 214, "y": 44 }, + { "flags": 4, "matrix": [8, 4], "x": 196, "y": 44 }, + { "flags": 4, "matrix": [8, 3], "x": 177, "y": 44 }, + { "flags": 4, "matrix": [8, 2], "x": 158, "y": 44 }, + { "flags": 4, "matrix": [8, 1], "x": 140, "y": 44 }, + { "flags": 4, "matrix": [8, 0], "x": 121, "y": 44 }, + + { "flags": 4, "matrix": [9, 0], "x": 121, "y": 57 }, + { "flags": 4, "matrix": [9, 1], "x": 140, "y": 57 }, + { "flags": 4, "matrix": [9, 2], "x": 158, "y": 57 }, + { "flags": 4, "matrix": [9, 3], "x": 177, "y": 57 }, + { "flags": 4, "matrix": [9, 4], "x": 196, "y": 57 }, + { "flags": 4, "matrix": [9, 5], "x": 214, "y": 57 } + ], + "max_brightness": 160, + "sleep": true, + "split_count": [30, 30] + }, + "split": { + "bootmagic": { + "matrix": [5, 5] + }, + "enabled": true, + "handedness": { + "pin": "A8" + }, + "serial": { + "driver": "usart" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x1856" + }, + "ws2812": { + "driver": "pwm", + "pin": "B0" + }, + "community_layouts": ["ortho_5x12", "ortho_4x12"], + "layouts": { + "LAYOUT_ortho_5x12": { + "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": [5, 0], "x": 7, "y": 0}, + {"matrix": [5, 1], "x": 8, "y": 0}, + {"matrix": [5, 2], "x": 9, "y": 0}, + {"matrix": [5, 3], "x": 10, "y": 0}, + {"matrix": [5, 4], "x": 11, "y": 0}, + {"matrix": [5, 5], "x": 12, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [6, 0], "x": 7, "y": 1}, + {"matrix": [6, 1], "x": 8, "y": 1}, + {"matrix": [6, 2], "x": 9, "y": 1}, + {"matrix": [6, 3], "x": 10, "y": 1}, + {"matrix": [6, 4], "x": 11, "y": 1}, + {"matrix": [6, 5], "x": 12, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [7, 0], "x": 7, "y": 2}, + {"matrix": [7, 1], "x": 8, "y": 2}, + {"matrix": [7, 2], "x": 9, "y": 2}, + {"matrix": [7, 3], "x": 10, "y": 2}, + {"matrix": [7, 4], "x": 11, "y": 2}, + {"matrix": [7, 5], "x": 12, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + + {"matrix": [8, 0], "x": 7, "y": 3}, + {"matrix": [8, 1], "x": 8, "y": 3}, + {"matrix": [8, 2], "x": 9, "y": 3}, + {"matrix": [8, 3], "x": 10, "y": 3}, + {"matrix": [8, 4], "x": 11, "y": 3}, + {"matrix": [8, 5], "x": 12, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4}, + + {"matrix": [9, 0], "x": 7, "y": 4}, + {"matrix": [9, 1], "x": 8, "y": 4}, + {"matrix": [9, 2], "x": 9, "y": 4}, + {"matrix": [9, 3], "x": 10, "y": 4}, + {"matrix": [9, 4], "x": 11, "y": 4}, + {"matrix": [9, 5], "x": 12, "y": 4} + ] + }, + "LAYOUT_ortho_4x12": { + "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": [5, 0], "x": 7, "y": 0}, + {"matrix": [5, 1], "x": 8, "y": 0}, + {"matrix": [5, 2], "x": 9, "y": 0}, + {"matrix": [5, 3], "x": 10, "y": 0}, + {"matrix": [5, 4], "x": 11, "y": 0}, + {"matrix": [5, 5], "x": 12, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + + {"matrix": [6, 0], "x": 7, "y": 1}, + {"matrix": [6, 1], "x": 8, "y": 1}, + {"matrix": [6, 2], "x": 9, "y": 1}, + {"matrix": [6, 3], "x": 10, "y": 1}, + {"matrix": [6, 4], "x": 11, "y": 1}, + {"matrix": [6, 5], "x": 12, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + + {"matrix": [7, 0], "x": 7, "y": 2}, + {"matrix": [7, 1], "x": 8, "y": 2}, + {"matrix": [7, 2], "x": 9, "y": 2}, + {"matrix": [7, 3], "x": 10, "y": 2}, + {"matrix": [7, 4], "x": 11, "y": 2}, + {"matrix": [7, 5], "x": 12, "y": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + + {"matrix": [8, 0], "x": 7, "y": 3}, + {"matrix": [8, 1], "x": 8, "y": 3}, + {"matrix": [8, 2], "x": 9, "y": 3}, + {"matrix": [8, 3], "x": 10, "y": 3}, + {"matrix": [8, 4], "x": 11, "y": 3}, + {"matrix": [8, 5], "x": 12, "y": 3} + ] + } + } +} diff --git a/keyboards/keebio/nyquist_lm/rev1/mcuconf.h b/keyboards/keebio/nyquist_lm/rev1/mcuconf.h new file mode 100644 index 0000000000..77847f5b2c --- /dev/null +++ b/keyboards/keebio/nyquist_lm/rev1/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +/* enable USART1, used for split comms */ +#undef STM32_SERIAL_USE_USART1 +#define STM32_SERIAL_USE_USART1 TRUE + +/* enable TIM3, used for RGB LED PWM driver */ +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/keebio/nyquist_lm/rev1/rev1.c b/keyboards/keebio/nyquist_lm/rev1/rev1.c new file mode 100644 index 0000000000..9acf0dc882 --- /dev/null +++ b/keyboards/keebio/nyquist_lm/rev1/rev1.c @@ -0,0 +1,11 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Disable the PD peripheral in pre-init because its pins (B4, B6) are being used in the matrix: + PWR->CR3 |= PWR_CR3_UCPD_DBDIS; + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_pre_init_user(); +} From 1e067bd4dd5f378a9c3170d742d23823556d7991 Mon Sep 17 00:00:00 2001 From: Zackarias Montell Date: Tue, 9 Sep 2025 18:27:15 +0200 Subject: [PATCH 537/592] Add 5x6_split/rev1 keyboard (#25507) --- keyboards/handwired/5x6_split/rev1/config.h | 23 ++++ .../handwired/5x6_split/rev1/keyboard.json | 107 ++++++++++++++++++ .../5x6_split/rev1/keymaps/default/keymap.c | 46 ++++++++ keyboards/handwired/5x6_split/rev1/readme.md | 33 ++++++ 4 files changed, 209 insertions(+) create mode 100644 keyboards/handwired/5x6_split/rev1/config.h create mode 100644 keyboards/handwired/5x6_split/rev1/keyboard.json create mode 100644 keyboards/handwired/5x6_split/rev1/keymaps/default/keymap.c create mode 100644 keyboards/handwired/5x6_split/rev1/readme.md diff --git a/keyboards/handwired/5x6_split/rev1/config.h b/keyboards/handwired/5x6_split/rev1/config.h new file mode 100644 index 0000000000..0797edb143 --- /dev/null +++ b/keyboards/handwired/5x6_split/rev1/config.h @@ -0,0 +1,23 @@ +/* Copyright 2025 Zackarias Montell (@Wholteza) + * + * 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 SERIAL_USART_FULL_DUPLEX + +#define SERIAL_USART_TX_PIN GP0 +#define SERIAL_USART_RX_PIN GP1 + +#define MASTER_RIGHT diff --git a/keyboards/handwired/5x6_split/rev1/keyboard.json b/keyboards/handwired/5x6_split/rev1/keyboard.json new file mode 100644 index 0000000000..4589b87855 --- /dev/null +++ b/keyboards/handwired/5x6_split/rev1/keyboard.json @@ -0,0 +1,107 @@ +{ + "manufacturer": "zacke.dev", + "keyboard_name": "5x6_split", + "maintainer": "Wholteza", + "board": "GENERIC_RP_RP2040", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP16", "GP17", "GP18", "GP19", "GP20", "GP21"], + "rows": ["GP15", "GP14", "GP13", "GP12", "GP11"] + }, + "processor": "RP2040", + "split": { + "enabled": true, + "matrix_pins": { + "right": { + "cols": ["GP10", "GP11", "GP12", "GP13", "GP14", "GP15"], + "rows": ["GP16", "GP17", "GP18", "GP19", "GP20"] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "watchdog": true, + "watchdog_timeout": 3000 + } + }, + "url": "https://git.zacke.dev/wholteza/5x6-split-kb/src/branch/main/rev1", + "usb": { + "device_version": "1.0.0", + "pid": "0x0057", + "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}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [5, 0], "x": 6, "y": 0}, + {"matrix": [5, 1], "x": 7, "y": 0}, + {"matrix": [5, 2], "x": 8, "y": 0}, + {"matrix": [5, 3], "x": 9, "y": 0}, + {"matrix": [5, 4], "x": 10, "y": 0}, + {"matrix": [5, 5], "x": 11, "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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [6, 0], "x": 6, "y": 1}, + {"matrix": [6, 1], "x": 7, "y": 1}, + {"matrix": [6, 2], "x": 8, "y": 1}, + {"matrix": [6, 3], "x": 9, "y": 1}, + {"matrix": [6, 4], "x": 10, "y": 1}, + {"matrix": [6, 5], "x": 11, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [7, 0], "x": 6, "y": 2}, + {"matrix": [7, 1], "x": 7, "y": 2}, + {"matrix": [7, 2], "x": 8, "y": 2}, + {"matrix": [7, 3], "x": 9, "y": 2}, + {"matrix": [7, 4], "x": 10, "y": 2}, + {"matrix": [7, 5], "x": 11, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [8, 0], "x": 6, "y": 3}, + {"matrix": [8, 1], "x": 7, "y": 3}, + {"matrix": [8, 2], "x": 8, "y": 3}, + {"matrix": [8, 3], "x": 9, "y": 3}, + {"matrix": [8, 4], "x": 10, "y": 3}, + {"matrix": [8, 5], "x": 11, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 1], "x": 1, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 4], "x": 4, "y": 4}, + {"matrix": [4, 5], "x": 5, "y": 4}, + {"matrix": [9, 0], "x": 6, "y": 4}, + {"matrix": [9, 1], "x": 7, "y": 4}, + {"matrix": [9, 2], "x": 8, "y": 4}, + {"matrix": [9, 3], "x": 9, "y": 4}, + {"matrix": [9, 4], "x": 10, "y": 4}, + {"matrix": [9, 5], "x": 11, "y": 4} + ] + } + } +} diff --git a/keyboards/handwired/5x6_split/rev1/keymaps/default/keymap.c b/keyboards/handwired/5x6_split/rev1/keymaps/default/keymap.c new file mode 100644 index 0000000000..05f023d3c8 --- /dev/null +++ b/keyboards/handwired/5x6_split/rev1/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2025 Zackarias Montell (@Wholteza) + * + * 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 + +enum layer_names { + _BASE, + _LOWER, + _RAISE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_GRV, 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_BSPC, + KC_ESC, 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_ENT , + _______, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [_LOWER] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + [_RAISE] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, QK_BOOT + ) +}; diff --git a/keyboards/handwired/5x6_split/rev1/readme.md b/keyboards/handwired/5x6_split/rev1/readme.md new file mode 100644 index 0000000000..0e0c41fc1d --- /dev/null +++ b/keyboards/handwired/5x6_split/rev1/readme.md @@ -0,0 +1,33 @@ +# 5x6_split revision 1 + +![5x6_split-rev1](https://i.imgur.com/FJ3kro3.jpeg) + +**This is the first revision of the 5x6_split keyboard.** + +The 5x6_split is designed to be easily accessible, with openly and freely available hardware and firmware. It features a split layout to minimize the PCB footprint, reducing manufacturing costs. Like the Ergodox, it allows you to keep your hands at shoulder width for a more natural typing posture, but without a thumb cluster, making it a better option for users who experience discomfort or limitations in their thumbs. + +The keyboard is also designed with ergonomics in mind. Its low profile, measuring just 19.4 mm from the table to the top of the keycaps (including rubber feet), helps reduce wrist strain during extended use. + +In the repository linked below (see the Hardware Availability section), you will find KiCad schematics, PCB designs, and 3D models for a printable chassis. + +* Keyboard Maintainer: [wholteza](https://github.com/wholteza) +* Hardware Supported: Raspberry Pi Pico, 5x6_split PCB, 5x6_split Chassis +* Hardware Availability: [PCB, Chassi 3d-models](https://git.zacke.dev/wholteza/5x6-split-kb/src/branch/main/rev1) + +Make example for this keyboard (after setting up your build environment): + + make handwired/5x6_split/rev1:default + +Flashing example for this keyboard: + + make handwired/5x6_split/rev1: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 ec515f21647d15f7a99702e57700fca12f51620b Mon Sep 17 00:00:00 2001 From: Zackarias Montell Date: Tue, 9 Sep 2025 18:28:12 +0200 Subject: [PATCH 538/592] Add handwired/planck keyboard (#25506) --- keyboards/handwired/planck/keyboard.json | 77 +++++++++++++++++++ .../handwired/planck/keymaps/default/keymap.c | 43 +++++++++++ keyboards/handwired/planck/readme.md | 27 +++++++ 3 files changed, 147 insertions(+) create mode 100644 keyboards/handwired/planck/keyboard.json create mode 100644 keyboards/handwired/planck/keymaps/default/keymap.c create mode 100644 keyboards/handwired/planck/readme.md diff --git a/keyboards/handwired/planck/keyboard.json b/keyboards/handwired/planck/keyboard.json new file mode 100644 index 0000000000..dde4ecb9e6 --- /dev/null +++ b/keyboards/handwired/planck/keyboard.json @@ -0,0 +1,77 @@ +{ + "manufacturer": "OLKB", + "keyboard_name": "Planck", + "maintainer": "Wholteza ", + "bootloader": "halfkay", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["C7", "D6", "D7", "B4", "B5", "B6", "F7", "F6", "F5", "F4", "F1", "F0"], + "rows": ["E6", "B3", "B7", "D0"] + }, + "processor": "atmega32u4", + "url": "https://blog.roastpotatoes.co/guide/2015/11/04/how-to-handwire-a-planck/", + "usb": { + "device_version": "1.0.0", + "pid": "0x0053", + "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}, + {"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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2}, + {"matrix": [2, 11], "x": 11, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3}, + {"matrix": [3, 5], "x": 5, "y": 3}, + {"matrix": [3, 7], "x": 7, "y": 3}, + {"matrix": [3, 8], "x": 8, "y": 3}, + {"matrix": [3, 9], "x": 9, "y": 3}, + {"matrix": [3, 10], "x": 10, "y": 3}, + {"matrix": [3, 11], "x": 11, "y": 3} + ] + } + } +} diff --git a/keyboards/handwired/planck/keymaps/default/keymap.c b/keyboards/handwired/planck/keymaps/default/keymap.c new file mode 100644 index 0000000000..3783d37f95 --- /dev/null +++ b/keyboards/handwired/planck/keymaps/default/keymap.c @@ -0,0 +1,43 @@ +/* Copyright 2025 Zackarias Montel (@Wholteza) + * + * 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 + +enum layer_names { + _BASE, + _NUM, + _SYM +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_ESC, 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_ENT , + MO(3), KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [_NUM] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ), + [_SYM] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, QK_BOOT + ) +}; diff --git a/keyboards/handwired/planck/readme.md b/keyboards/handwired/planck/readme.md new file mode 100644 index 0000000000..3bdbf87270 --- /dev/null +++ b/keyboards/handwired/planck/readme.md @@ -0,0 +1,27 @@ +# Plank Handwired + +![plank handwired](https://i.imgur.com/khseWs7.jpeg) + +A compact 40% (12x4) ortholinear keyboard kit sold by OLKB before the PCB was released. + +Keyboard Maintainer: [Wholteza](https://github.com/wholteza) +Hardware Supported: [Teensy 2.0](https://www.pjrc.com/store/teensy.html) +Hardware Availability: [PJRC](https://www.pjrc.com/store/teensy.html) + +Make example for this keyboard (after setting up your build environment): + + make handwired/planck:default + +Flashing example for this keyboard: + + make handwired/planck: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 From 4fc14c2712b149e37673ed3130377778336f6447 Mon Sep 17 00:00:00 2001 From: Sam Mohr Date: Tue, 9 Sep 2025 12:32:59 -0400 Subject: [PATCH 539/592] [Keyboard] Add the Clog (#23009) --- keyboards/clog/keyboard.json | 89 +++++++++++++++++++++++++ keyboards/clog/keymaps/default/config.h | 7 ++ keyboards/clog/keymaps/default/keymap.c | 35 ++++++++++ keyboards/clog/readme.md | 26 ++++++++ 4 files changed, 157 insertions(+) create mode 100644 keyboards/clog/keyboard.json create mode 100644 keyboards/clog/keymaps/default/config.h create mode 100644 keyboards/clog/keymaps/default/keymap.c create mode 100644 keyboards/clog/readme.md diff --git a/keyboards/clog/keyboard.json b/keyboards/clog/keyboard.json new file mode 100644 index 0000000000..6197a176e5 --- /dev/null +++ b/keyboards/clog/keyboard.json @@ -0,0 +1,89 @@ +{ + "keyboard_name": "The Clog", + "manufacturer": "S'mores", + "url": "https://github.com/smores56/clog", + "maintainer": "@smores56", + "usb": { + "vid": "0xBEEF", + "pid": "0x5051", + "device_version": "0.0.1" + }, + "development_board": "elite_c", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "matrix_pins": { + "direct": [ + ["B2", "F7", "F6", "F5", "F4"], + ["B6", "B3", "B1", "D3", "D1"], + ["D0", "D4", "C6", "D7", "E6"], + ["B4", "B5", null, null, null] + ] + }, + "split": { + "bootmagic": { + "matrix": [4, 4] + }, + "enabled": true, + "matrix_pins": { + "right": { + "direct": [ + ["F4", "F5", "F6", "F7", "B2"], + ["D1", "D3", "B1", "B3", "B6"], + ["E6", "D7", "C6", "D4", "D0"], + ["B5", "B4", null, null, null] + ] + } + }, + "serial": { + "pin": "D2" + } + }, + "community_layouts": ["split_3x5_2"], + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x5_2" + }, + "layouts": { + "LAYOUT_split_3x5_2": { + "layout": [ + {"label": "L01", "matrix": [0, 0], "x": 0, "y": 2.27}, + {"label": "L02", "matrix": [0, 1], "x": 2, "y": 0.31}, + {"label": "L03", "matrix": [0, 2], "x": 3, "y": 0}, + {"label": "L04", "matrix": [0, 3], "x": 4, "y": 0.28}, + {"label": "L05", "matrix": [0, 4], "x": 5, "y": 0.42}, + {"label": "R01", "matrix": [4, 0], "x": 9, "y": 0.42}, + {"label": "R02", "matrix": [4, 1], "x": 10, "y": 0.28}, + {"label": "R03", "matrix": [4, 2], "x": 11, "y": 0}, + {"label": "R04", "matrix": [4, 3], "x": 12, "y": 0.31}, + {"label": "R05", "matrix": [4, 4], "x": 14, "y": 2.27}, + {"label": "L06", "matrix": [1, 0], "x": 0, "y": 2.27}, + {"label": "L07", "matrix": [1, 1], "x": 2, "y": 1.31}, + {"label": "L08", "matrix": [1, 2], "x": 3, "y": 1}, + {"label": "L09", "matrix": [1, 3], "x": 4, "y": 1.28}, + {"label": "L10", "matrix": [1, 4], "x": 5, "y": 1.42}, + {"label": "R06", "matrix": [5, 0], "x": 9, "y": 1.42}, + {"label": "R07", "matrix": [5, 1], "x": 10, "y": 1.28}, + {"label": "R08", "matrix": [5, 2], "x": 11, "y": 1}, + {"label": "R09", "matrix": [5, 3], "x": 12, "y": 1.31}, + {"label": "R10", "matrix": [5, 4], "x": 14, "y": 2.27}, + {"label": "L11", "matrix": [2, 0], "x": 0, "y": 3.27}, + {"label": "L12", "matrix": [2, 1], "x": 2, "y": 2.31}, + {"label": "L13", "matrix": [2, 2], "x": 3, "y": 2}, + {"label": "L14", "matrix": [2, 3], "x": 4, "y": 2.28}, + {"label": "L15", "matrix": [2, 4], "x": 5, "y": 2.42}, + {"label": "R11", "matrix": [6, 0], "x": 9, "y": 2.42}, + {"label": "R12", "matrix": [6, 1], "x": 10, "y": 2.28}, + {"label": "R13", "matrix": [6, 2], "x": 11, "y": 2}, + {"label": "R14", "matrix": [6, 3], "x": 12, "y": 2.31}, + {"label": "R15", "matrix": [6, 4], "x": 14, "y": 3.27}, + {"label": "L16", "matrix": [3, 0], "x": 5, "y": 3.9}, + {"label": "L17", "matrix": [3, 1], "x": 6, "y": 3.7}, + {"label": "R16", "matrix": [7, 0], "x": 8, "y": 3.7}, + {"label": "R17", "matrix": [7, 1], "x": 9, "y": 3.9} + ] + } + } +} diff --git a/keyboards/clog/keymaps/default/config.h b/keyboards/clog/keymaps/default/config.h new file mode 100644 index 0000000000..be257a5919 --- /dev/null +++ b/keyboards/clog/keymaps/default/config.h @@ -0,0 +1,7 @@ +// Copyright 2024 Sam Mohr (@smores56) +// SPDX-License-Identifier: GPL-2.0+ + +#pragma once + +// Defaults for usable home row mods +#define TAPPING_TERM 250 diff --git a/keyboards/clog/keymaps/default/keymap.c b/keyboards/clog/keymaps/default/keymap.c new file mode 100644 index 0000000000..98617d7de0 --- /dev/null +++ b/keyboards/clog/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +// Copyright 2024 Sam Mohr (@smores56) +// SPDX-License-Identifier: GPL-2.0+ + +#include QMK_KEYBOARD_H + +/* Base layer 0 layout uses home row mods. See the following guide for details: + * https://precondition.github.io/home-row-mods + */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split_3x5_2( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + CTL_T(KC_A),ALT_T(KC_S),GUI_T(KC_D),SFT_T(KC_F), KC_G, KC_H, SFT_T(KC_J),GUI_T(KC_K),ALT_T(KC_L),CTL_T(KC_SCLN), + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, + LT(2,KC_TAB), KC_ENT, KC_SPC, LT(1,KC_BSPC) + ), + [1] = LAYOUT_split_3x5_2( + KC_INS, KC_1, KC_2, KC_3, KC_VOLU, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_DQUO, + KC_DEL, KC_4, KC_5, KC_6, KC_VOLD, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_QUOT, + KC_CAPS, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, _______, _______, + MO(3), QK_GESC, _______, _______ + ), + [2] = LAYOUT_split_3x5_2( + _______, KC_LBRC, KC_LCBR, KC_RCBR, _______, KC_CIRC, KC_LPRN, KC_RPRN, KC_RBRC, KC_TILD, + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, + _______, _______, _______, _______, _______, KC_ASTR, KC_UNDS, KC_PLUS, KC_PIPE, _______, + _______, _______, KC_DEL, MO(3) + ), + [3] = LAYOUT_split_3x5_2( + _______, KC_F1, KC_F2, KC_F3, KC_F10, _______, MS_WHLU, MS_WHLD, _______, QK_BOOT, + _______, KC_F4, KC_F5, KC_F6, KC_F11, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, KC_INS, + _______, KC_F7, KC_F8, KC_F9, KC_F12, _______, MS_BTN1, MS_BTN2, _______, _______, + _______, _______, _______, _______ + ) +}; diff --git a/keyboards/clog/readme.md b/keyboards/clog/readme.md new file mode 100644 index 0000000000..ddf7105669 --- /dev/null +++ b/keyboards/clog/readme.md @@ -0,0 +1,26 @@ +# The Clog + +This is the official firmware for a family of boards designed by [smores56](https://github.com/smores56), +the first of which was [the Clog](https://github.com/smores56/clog). This firmware works for the following boards: + +- [The Clog](https://github.com/smores56/clog) +- [The Clog V3](https://github.com/smores56/clog-v3) +- [The Steel Toe](https://github.com/smores56/steel-toe) +- [The Sephirette](https://github.com/smores56/sephirette) + +Make example for this keyboard (after setting up your build environment): + + make clog:default + +Flashing example for this keyboard: + + make clog: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 key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From f6f627d07fe6acf54e88bfba2e41688e3eb58444 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 10 Sep 2025 02:35:01 +1000 Subject: [PATCH 540/592] Print build failures with `qmk mass-compile` and `qmk userspace-compile` if requested (`-p`/`--print-failures`) (#25518) --- docs/cli_commands.md | 7 +++--- lib/python/qmk/cli/mass_compile.py | 31 ++++++++++++++++++++++--- lib/python/qmk/cli/userspace/compile.py | 3 ++- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/docs/cli_commands.md b/docs/cli_commands.md index 54bf5cc123..02f362b14c 100644 --- a/docs/cli_commands.md +++ b/docs/cli_commands.md @@ -631,14 +631,15 @@ This command compiles all the External Userspace build targets. **Usage**: ``` -qmk userspace-compile [-h] [-e ENV] [-n] [-c] [-j PARALLEL] [-t] +qmk userspace-compile [-h] [-e ENV] [-p] [-n] [-c] [-j PARALLEL] [-t] options: -h, --help show this help message and exit - -e ENV, --env ENV Set a variable to be passed to make. May be passed multiple times. + -e, --env ENV Set a variable to be passed to make. May be passed multiple times. + -p, --print-failures Print failed builds. -n, --dry-run Don't actually build, just show the commands to be run. -c, --clean Remove object files before compiling. - -j PARALLEL, --parallel PARALLEL + -j, --parallel PARALLEL Set the number of parallel make jobs; 0 means unlimited. -t, --no-temp Remove temporary files during build. ``` diff --git a/lib/python/qmk/cli/mass_compile.py b/lib/python/qmk/cli/mass_compile.py index 4c4669d451..e71280f482 100755 --- a/lib/python/qmk/cli/mass_compile.py +++ b/lib/python/qmk/cli/mass_compile.py @@ -16,7 +16,7 @@ from qmk.build_targets import BuildTarget, JsonKeymapBuildTarget from qmk.util import maybe_exit_config -def mass_compile_targets(targets: List[BuildTarget], clean: bool, dry_run: bool, no_temp: bool, parallel: int, **env): +def mass_compile_targets(targets: List[BuildTarget], clean: bool, dry_run: bool, no_temp: bool, parallel: int, print_failures: bool, **env): if len(targets) == 0: return @@ -37,6 +37,30 @@ def mass_compile_targets(targets: List[BuildTarget], clean: bool, dry_run: bool, builddir.mkdir(parents=True, exist_ok=True) with open(makefile, "w") as f: + # yapf: disable + f.write( + f"""\ +# This file is auto-generated by qmk mass-compile +# Do not edit this file directly. +all: print_failures +.PHONY: all_targets print_failures +print_failures: all_targets +"""# noqa + ) + if print_failures: + f.write( + f"""\ + @for f in $$(ls .build/failed.log.{os.getpid()}.* 2>/dev/null | sort); do \\ + echo; \\ + echo "======================================================================================"; \\ + echo "Failed build log: $$f"; \\ + echo "------------------------------------------------------"; \\ + cat $$f; \\ + echo "------------------------------------------------------"; \\ + done +"""# noqa + ) + # yapf: enable for target in sorted(targets, key=lambda t: (t.keyboard, t.keymap)): keyboard_name = target.keyboard keymap_name = target.keymap @@ -58,7 +82,7 @@ def mass_compile_targets(targets: List[BuildTarget], clean: bool, dry_run: bool, f.write( f"""\ .PHONY: {target_filename}{target_suffix}_binary -all: {target_filename}{target_suffix}_binary +all_targets: {target_filename}{target_suffix}_binary {target_filename}{target_suffix}_binary: @rm -f "{build_log}" || true @echo "Compiling QMK Firmware for target: '{keyboard_name}:{keymap_name}'..." >>"{build_log}" @@ -98,6 +122,7 @@ all: {target_filename}{target_suffix}_binary @cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.") @cli.argument('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.") @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the commands to be run.") +@cli.argument('-p', '--print-failures', arg_only=True, action='store_true', help="Print failed builds.") @cli.argument( '-f', '--filter', @@ -123,4 +148,4 @@ def mass_compile(cli): else: targets = search_keymap_targets([('all', cli.config.mass_compile.keymap)], cli.args.filter) - return mass_compile_targets(targets, cli.args.clean, cli.args.dry_run, cli.args.no_temp, cli.config.mass_compile.parallel, **build_environment(cli.args.env)) + return mass_compile_targets(targets, cli.args.clean, cli.args.dry_run, cli.args.no_temp, cli.config.mass_compile.parallel, cli.args.print_failures, **build_environment(cli.args.env)) diff --git a/lib/python/qmk/cli/userspace/compile.py b/lib/python/qmk/cli/userspace/compile.py index f164ca2ef1..64fa3ed0c9 100644 --- a/lib/python/qmk/cli/userspace/compile.py +++ b/lib/python/qmk/cli/userspace/compile.py @@ -20,6 +20,7 @@ def _extra_arg_setter(target, extra_args): @cli.argument('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.") @cli.argument('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.") @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't actually build, just show the commands to be run.") +@cli.argument('-p', '--print-failures', arg_only=True, action='store_true', help="Print failed builds.") @cli.argument('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.") @cli.subcommand('Compiles the build targets specified in userspace `qmk.json`.') def userspace_compile(cli): @@ -42,4 +43,4 @@ def userspace_compile(cli): if len(keyboard_keymap_targets) > 0: build_targets.extend(search_keymap_targets(keyboard_keymap_targets)) - return mass_compile_targets(list(set(build_targets)), cli.args.clean, cli.args.dry_run, cli.config.userspace_compile.no_temp, cli.config.userspace_compile.parallel, **build_environment(cli.args.env)) + return mass_compile_targets(list(set(build_targets)), cli.args.clean, cli.args.dry_run, cli.config.userspace_compile.no_temp, cli.config.userspace_compile.parallel, cli.args.print_failures, **build_environment(cli.args.env)) From 7be4540b4688eab74920eb4cb2347af43fb6a779 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 17:40:53 +0100 Subject: [PATCH 541/592] Bump actions/checkout from 4 to 5 (#25554) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/api.yml | 2 +- .github/workflows/auto_tag.yml | 2 +- .github/workflows/ci_build_major_branch.yml | 4 ++-- .github/workflows/ci_build_major_branch_keymap.yml | 6 +++--- .github/workflows/cli.yml | 2 +- .github/workflows/develop_update.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/feature_branch_update.yml | 2 +- .github/workflows/format.yml | 2 +- .github/workflows/format_push.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/regen.yml | 2 +- .github/workflows/regen_push.yml | 2 +- .github/workflows/unit_test.yml | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/api.yml b/.github/workflows/api.yml index db78f16112..cdf6349878 100644 --- a/.github/workflows/api.yml +++ b/.github/workflows/api.yml @@ -25,7 +25,7 @@ jobs: if: github.repository == 'qmk/qmk_firmware' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 1 persist-credentials: false diff --git a/.github/workflows/auto_tag.yml b/.github/workflows/auto_tag.yml index 4afca6c66d..a2c6a104a8 100644 --- a/.github/workflows/auto_tag.yml +++ b/.github/workflows/auto_tag.yml @@ -28,7 +28,7 @@ jobs: if: github.repository == 'qmk/qmk_firmware' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/ci_build_major_branch.yml b/.github/workflows/ci_build_major_branch.yml index 403ad8b3ef..48ae71114f 100644 --- a/.github/workflows/ci_build_major_branch.yml +++ b/.github/workflows/ci_build_major_branch.yml @@ -45,7 +45,7 @@ jobs: git config --global --add safe.directory '*' - name: Checkout QMK Firmware - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Determine concurrency id: generate_slice_length @@ -83,7 +83,7 @@ jobs: git config --global --add safe.directory '*' - name: Checkout QMK Firmware - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/ci_build_major_branch_keymap.yml b/.github/workflows/ci_build_major_branch_keymap.yml index 4123b17b5f..1a0b44b908 100644 --- a/.github/workflows/ci_build_major_branch_keymap.yml +++ b/.github/workflows/ci_build_major_branch_keymap.yml @@ -37,7 +37,7 @@ jobs: git config --global --add safe.directory '*' - name: Checkout QMK Firmware - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Generate build targets id: generate_targets @@ -89,7 +89,7 @@ jobs: git config --global --add safe.directory '*' - name: Checkout QMK Firmware - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get target definitions uses: actions/download-artifact@v5 @@ -136,7 +136,7 @@ jobs: steps: - name: Checkout QMK Firmware - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download firmwares uses: actions/download-artifact@v5 diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 77b5bfe073..fc24c6b366 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -24,7 +24,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/develop_update.yml b/.github/workflows/develop_update.yml index afcda1fe98..5c046b8f64 100644 --- a/.github/workflows/develop_update.yml +++ b/.github/workflows/develop_update.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'qmk/qmk_firmware' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: token: ${{ secrets.QMK_BOT_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 34319675bf..275e2b2483 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -30,7 +30,7 @@ jobs: container: ghcr.io/qmk/qmk_cli steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 1 diff --git a/.github/workflows/feature_branch_update.yml b/.github/workflows/feature_branch_update.yml index 283a255342..fc33f883a8 100644 --- a/.github/workflows/feature_branch_update.yml +++ b/.github/workflows/feature_branch_update.yml @@ -21,7 +21,7 @@ jobs: - riot steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: token: ${{ secrets.QMK_BOT_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 309b9eeda1..9dbda4e5a6 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -26,7 +26,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/format_push.yml b/.github/workflows/format_push.yml index b865ea9eec..74a42669d6 100644 --- a/.github/workflows/format_push.yml +++ b/.github/workflows/format_push.yml @@ -19,7 +19,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 581fe02156..62e1263a48 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -18,7 +18,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 diff --git a/.github/workflows/regen.yml b/.github/workflows/regen.yml index a31526084f..06759102cc 100644 --- a/.github/workflows/regen.yml +++ b/.github/workflows/regen.yml @@ -19,7 +19,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Run qmk generators run: | diff --git a/.github/workflows/regen_push.yml b/.github/workflows/regen_push.yml index 8f22e931f1..4798e86c59 100644 --- a/.github/workflows/regen_push.yml +++ b/.github/workflows/regen_push.yml @@ -19,7 +19,7 @@ jobs: - name: Disable safe.directory check run : git config --global --add safe.directory '*' - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Run qmk generators run: | diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index a834053a76..7ab9969242 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -26,7 +26,7 @@ jobs: container: ghcr.io/qmk/qmk_cli steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: submodules: recursive - name: Install dependencies From 09ab67c0440d8e5e3faf832d23eb1b754845a573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Magimel?= Date: Tue, 9 Sep 2025 23:51:13 +0200 Subject: [PATCH 542/592] docs: fix misspellings (#25555) * docs: fix misspellings * docs: do line breaks with HTML instead of spaces To remove trailing spaces and to avoid breaking things, line breaks can be done with the HTML br tag. --- docs/ChangeLog/20200229.md | 2 +- docs/ChangeLog/20200530.md | 20 ++++---- docs/ChangeLog/20210529.md | 6 +-- docs/ChangeLog/20210828.md | 2 +- docs/ChangeLog/20220226.md | 2 +- docs/custom_quantum_functions.md | 8 ++-- docs/drivers/serial.md | 16 +++---- docs/feature_debounce_type.md | 2 +- docs/feature_eeprom.md | 4 +- docs/feature_layers.md | 46 +++++++++---------- docs/feature_userspace.md | 43 ++++++++--------- docs/features/audio.md | 29 ++++++------ docs/features/bootmagic.md | 2 +- docs/features/encoders.md | 2 +- docs/features/haptic_feedback.md | 14 +++--- docs/features/pointing_device.md | 79 +++++++++++++++++--------------- docs/features/repeat_key.md | 34 +++++++------- docs/features/rgb_matrix.md | 14 +++--- docs/features/space_cadet.md | 2 +- docs/features/split_keyboard.md | 62 ++++++++++++------------- docs/features/st7565.md | 4 +- docs/features/stenography.md | 2 +- docs/hand_wire.md | 10 ++-- docs/hardware_drivers.md | 2 +- docs/quantum_painter_lvgl.md | 4 +- docs/squeezing_avr.md | 14 +++--- docs/usb_nkro.txt | 2 +- drivers/lcd/st7565.h | 4 +- tmk_core/protocol/report.c | 2 +- 29 files changed, 219 insertions(+), 214 deletions(-) diff --git a/docs/ChangeLog/20200229.md b/docs/ChangeLog/20200229.md index 02bca3e371..fd075c24e0 100644 --- a/docs/ChangeLog/20200229.md +++ b/docs/ChangeLog/20200229.md @@ -36,7 +36,7 @@ Four times a year QMK runs a process for merging Breaking Changes. A Breaking Ch ## Encoder flip * Flips the encoder direction so that `clockwise == true` is for actually turning the knob clockwise -* Adds `ENCODER_DIRECTION_FLIP` define, so that reversing the expected dirction is simple for users. +* Adds `ENCODER_DIRECTION_FLIP` define, so that reversing the expected direction is simple for users. * Cleans up documentation page for encoders diff --git a/docs/ChangeLog/20200530.md b/docs/ChangeLog/20200530.md index 9def9ae123..701b6bd5d6 100644 --- a/docs/ChangeLog/20200530.md +++ b/docs/ChangeLog/20200530.md @@ -19,7 +19,7 @@ These PRs move the V-USB driver code out of the qmk_firmware repository and into Updates all of the per key tap-hold functions to pass the `keyrecord_t` structure, and include documentation changes. -Any remaining versions or code outside of the main repo will need to be converted: +Any remaining versions or code outside of the main repo will need to be converted: | Old function | New Function | |------------------------------------------------------|---------------------------------------------------------------------------| |`uint16_t get_tapping_term(uint16_t keycode)` |`uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record)` | @@ -38,7 +38,7 @@ After the next breaking change you will not be able to build if `bin/qmk hello` [#8269](https://github.com/qmk/qmk_firmware/pull/8269) - Provides debug functionality on ChibiOS/ARM that is more compliant than previous integrations. -- Less maintenence, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues. +- Less maintenance, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues. - A `make git-submodule` may be required after pulling the latest QMK Firmware code to update to the new dependency. ### Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup @@ -51,8 +51,10 @@ After the next breaking change you will not be able to build if `bin/qmk hello` The `RGB_DISABLE_AFTER_TIMEOUT` definition is now deprecated, and has been superseded by `RGB_DISABLE_TIMEOUT`. To use the new definition, rename `RGB_DISABLE_AFTER_TIMEOUT` to `RGB_DISABLE_TIMEOUT` in your `config.h` file, and multiply the value set by 1200. -Before: `#define RGB_DISABLE_AFTER_TIMEOUT 100` -After: `#define RGB_DISABLE_TIMEOUT 120000` +```diff +-#define RGB_DISABLE_AFTER_TIMEOUT 100 ++#define RGB_DISABLE_TIMEOUT 120000 +``` ### Switch to qmk forks for everything @@ -103,8 +105,8 @@ This allows current lily58 firmware to advance with updates to the `split_common - Alternatively, if you did not change the OLED code from that in `default`, you may find it easier to simply copy the [relevant section](https://github.com/qmk/qmk_firmware/blob/4ac310668501ae6786c711ecc8f01f62ddaa1c0b/keyboards/lily58/keymaps/default/keymap.c#L138-L172). Otherwise, the changes you need to make are as follows (sample change [here](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7R138-R173)) - [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L138-L141) the block ```c -#ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display +#ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display #endif ``` - Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides: @@ -127,7 +129,7 @@ oled_rotation_t oled_init_user(oled_rotation_t rotation) { * Refactor to use split_common and remove split codes under the zinc/revx/ * Add - backlight RGB LED and/or underglow RGB LED option -* Add - continuous RGB animations feature (between L and R halves) +* Add - continuous RGB animations feature (between L and R halves) * Fix - keymap files to adapt to changes * all authors of keymaps confirmed this PR * Update - documents and rules.mk @@ -164,8 +166,8 @@ void keyboard_pre_init_kb(void) { - The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190) - [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L91-L158) the block ```c -#ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display +#ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display #endif ``` - Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides: diff --git a/docs/ChangeLog/20210529.md b/docs/ChangeLog/20210529.md index 69923b0c5a..e3d250874a 100644 --- a/docs/ChangeLog/20210529.md +++ b/docs/ChangeLog/20210529.md @@ -12,7 +12,7 @@ Added support for MK66F18 (Teensy 3.6) microcontroller. ### New command: qmk console ([#12828](https://github.com/qmk/qmk_firmware/pull/12828)) {#new-command-qmk-console} -A new `qmk console` command has been added for attaching to your keyboard's console. It operates similiarly to QMK Toolbox by allowing you to connect to one or more keyboard consoles to display debugging messages. +A new `qmk console` command has been added for attaching to your keyboard's console. It operates similarly to QMK Toolbox by allowing you to connect to one or more keyboard consoles to display debugging messages. ### Improved command: qmk config {#improve-command-qmk-config} @@ -121,8 +121,8 @@ bool encoder_update_user(uint8_t index, bool clockwise) { tap_code(KC_UP); } } - return true; - // If you return true, this will allow the keyboard level code to run, as well. + return true; + // If you return true, this will allow the keyboard level code to run, as well. //Returning false will override the keyboard level code. Depending on how the keyboard level function is set up. } ``` diff --git a/docs/ChangeLog/20210828.md b/docs/ChangeLog/20210828.md index 18b1d92b0c..9268711262 100644 --- a/docs/ChangeLog/20210828.md +++ b/docs/ChangeLog/20210828.md @@ -104,7 +104,7 @@ void dip_switch_update_user(uint8_t index, bool active) { } } -void dip_switch_update_mask_kb(uint32_t state) { +void dip_switch_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); } diff --git a/docs/ChangeLog/20220226.md b/docs/ChangeLog/20220226.md index a10b6447ea..29283a3a9c 100644 --- a/docs/ChangeLog/20220226.md +++ b/docs/ChangeLog/20220226.md @@ -29,7 +29,7 @@ Bootloader configuration is no longer assumed. Keyboards must now set either: ### Rename `AdafruitBLE` to `BluefruitLE` ([#16127](https://github.com/qmk/qmk_firmware/pull/16127)) -In preparation of future bluetooth work, the `AdafruitBLE` integration has been renamed to allow potential for any other Adafruit BLE products. +In preparation of future bluetooth work, the `AdafruitBLE` integration has been renamed to allow potential for any other Adafruit BLE products. ### Updated Keyboard Codebases {#updated-keyboard-codebases} diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index c69beb055e..2c4eac64f0 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -145,7 +145,7 @@ void keyboard_pre_init_user(void) { This is called when the matrix is initialized, and after some of the hardware has been set up, but before many of the features have been initialized. -This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependant on where it's started. +This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependent on where it's started. ### `matrix_init_*` Function Documentation @@ -209,7 +209,7 @@ You should use this function if you need custom matrix scanning code. It can als This function gets called at the end of all QMK processing, before starting the next iteration. You can safely assume that QMK has dealt with the last matrix scan at the time that these functions are invoked -- layer states have been updated, USB reports have been sent, LEDs have been updated, and displays have been drawn. -Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throtting their behaviour if you do indeed require implementing something special. +Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throttling their behaviour if you do indeed require implementing something special. ### Example `void housekeeping_task_user(void)` implementation @@ -246,7 +246,7 @@ void check_rgb_timeout(void) { } } /* Then, call the above functions from QMK's built in post processing functions like so */ -/* Runs at the end of each scan loop, check if RGB timeout has occured or not */ +/* Runs at the end of each scan loop, check if RGB timeout has occurred or not */ void housekeeping_task_user(void) { #ifdef RGBLIGHT_TIMEOUT check_rgb_timeout(); @@ -316,7 +316,7 @@ bool shutdown_kb(bool jump_to_bootloader) { if (!shutdown_user(jump_to_bootloader)) { return false; } - + if (jump_to_bootloader) { // red for bootloader rgb_matrix_set_color_all(RGB_OFF); diff --git a/docs/drivers/serial.md b/docs/drivers/serial.md index dda75f629a..2c78f59043 100644 --- a/docs/drivers/serial.md +++ b/docs/drivers/serial.md @@ -33,7 +33,7 @@ On ARM platforms the bitbang driver causes connection issues when using it toget +-------+ +-------+ ``` -One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A TRS or USB cable provides enough conductors for this driver to function. +One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A TRS or USB cable provides enough conductors for this driver to function. ### Setup @@ -63,12 +63,12 @@ SERIAL_DRIVER = bitbang ## USART Half-duplex -Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose Half-duplex over Bitbang if MCU is capable of utilising Half-duplex, and Full-duplex can't be used instead (e.g. lack of available GPIO pins, or imcompatible PCB design). +Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose Half-duplex over Bitbang if MCU is capable of utilising Half-duplex, and Full-duplex can't be used instead (e.g. lack of available GPIO pins, or incompatible PCB design). ### Pin configuration ``` - LEFT RIGHT + LEFT RIGHT +-------+ | | +-------+ | | R R | | | | | SERIAL | | | @@ -80,7 +80,7 @@ Targeting ARM boards based on ChibiOS, where communication is offloaded to a USA +-------+ +-------+ ``` -Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Ensure that the pin chosen for split communication can operate as the TX pin of the contoller's USART peripheral. A TRS or USB cable provides enough conductors for this driver to function. As the split connection is configured to operate in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work. +Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Ensure that the pin chosen for split communication can operate as the TX pin of the contoller's USART peripheral. A TRS or USB cable provides enough conductors for this driver to function. As the split connection is configured to operate in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work. ::: warning ***Note:*** A pull-up resistor isn't required for RP2040 controllers configured with PIO subsystem. @@ -278,7 +278,7 @@ There are several advanced configuration options that can be defined in your key ### Baudrate -If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions. +If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions. ```c #define SELECT_SOFT_SERIAL_SPEED n @@ -307,19 +307,19 @@ This is the default time window in milliseconds in which a successful communicat ## Troubleshooting -If you're having issues withe serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file: +If you're having issues with serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file: ```c #define SERIAL_DEBUG ``` - + ::: tip The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](../faq_debug). ::: ## Alternate Functions for selected STM32 MCUs -Pins for USART Peripherals with +Pins for USART Peripherals with ### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf) diff --git a/docs/feature_debounce_type.md b/docs/feature_debounce_type.md index eb29b4ef26..4e3b0f4543 100644 --- a/docs/feature_debounce_type.md +++ b/docs/feature_debounce_type.md @@ -47,7 +47,7 @@ susceptible to noise, you must choose a debounce method that will also mitigate * Debounce algorithms often have a 'debounce time' parameter, that specifies the maximum settling time of the switch contacts. This time might be measured in various units: * Cycles-based debouncing waits n cycles (scans), decreasing count by one each matrix_scan - * Timestamp-based debouncing stores the millisecond timestamp a change occurred, and does substraction to figure out time elapsed. + * Timestamp-based debouncing stores the millisecond timestamp a change occurred, and does subtraction to figure out time elapsed. * Timestamp-based debouncing is usually superior, especially in the case of noise-resistant devices because settling times of physical switches is specified in units of time, and should not depend on the matrix scan-rate of the keyboard. * Cycles-based debouncing is sometimes considered inferior, because the settling time that it is able to compensate for depends on the diff --git a/docs/feature_eeprom.md b/docs/feature_eeprom.md index 22257b3202..7d40e81f5a 100644 --- a/docs/feature_eeprom.md +++ b/docs/feature_eeprom.md @@ -100,7 +100,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled if (user_config.rgb_layer_change) { // only if this is enabled user_config.rgb_layer_change = false; // disable it, and - eeconfig_update_user(user_config.raw); // write the setings to EEPROM + eeconfig_update_user(user_config.raw); // write the settings to EEPROM } } return true; break; @@ -109,7 +109,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } ``` -And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EE_CLR` keycode or [Bootmagic](features/bootmagic) functionallity. For example, if you want to set rgb layer indication by default, and save the default valued. +And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EE_CLR` keycode or [Bootmagic](features/bootmagic) functionality. For example, if you want to set rgb layer indication by default, and save the default valued. ```c void eeconfig_init_user(void) { // EEPROM is getting reset! diff --git a/docs/feature_layers.md b/docs/feature_layers.md index da6a28bd88..8e6510ca2a 100644 --- a/docs/feature_layers.md +++ b/docs/feature_layers.md @@ -25,7 +25,7 @@ active layer until pressed again. Currently, the `layer` argument of `LT()` is limited to layers 0-15, and the `kc` argument to the [Basic Keycode set](keycodes_basic), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. This is because QMK uses 16-bit keycodes, of which 4 bits are used for the function identifier and 4 bits for the layer, leaving only 8 bits for the keycode. -For a similar reason, the `layer` argument of `LM()` is also limited to layers 0-15 and the `mod` argument must fit within 5 bits. As a consequence, although left and right modifiers are supported by `LM()`, it is impossible to mix and match left and right modifiers. Specifying at least one right-hand modifier in a combination such as `MOD_RALT|MOD_LSFT` will convert *all* the listed modifiers to their right-hand counterpart. So, using the aforementionned mod-mask will actually send Right Alt+Right Shift. Make sure to use the `MOD_xxx` constants over alternative ways of specifying modifiers when defining your layer-mod key. +For a similar reason, the `layer` argument of `LM()` is also limited to layers 0-15 and the `mod` argument must fit within 5 bits. As a consequence, although left and right modifiers are supported by `LM()`, it is impossible to mix and match left and right modifiers. Specifying at least one right-hand modifier in a combination such as `MOD_RALT|MOD_LSFT` will convert *all* the listed modifiers to their right-hand counterpart. So, using the aforementioned mod-mask will actually send Right Alt+Right Shift. Make sure to use the `MOD_xxx` constants over alternative ways of specifying modifiers when defining your layer-mod key. | `LM(1,KC_LSFT)` | `LM(1,MOD_MASK_SHIFT)` | `LM(1,MOD_BIT(KC_LSFT))` | `LM(1,MOD_LSFT)` | |:---------------:|:----------------------:|:------------------------:|:----------------:| @@ -61,27 +61,27 @@ Sometimes, you might want to switch between layers in a macro or as part of a ta There are a number of functions (and variables) related to how you can use or manipulate the layers. -|Function |Description | -|----------------------------------------------|---------------------------------------------------------------------------------------------------------| -| `layer_state_set(layer_mask)` | Directly sets the layer state (avoid unless you know what you are doing). | -| `layer_clear()` | Clears all layers (turns them all off). | -| `layer_move(layer)` | Turns specified layer on, and all other layers off. | -| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. | -| `layer_off(layer)` | Turns specified layer off, leaves all other layers in existing state. | -| `layer_invert(layer)` | Inverts/toggles the state of the specified layer | -| `layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing layer state. | -| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. | -| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. | -| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. | -| `default_layer_set(layer_mask)` | Directly sets the default layer state (avoid unless you know what you are doing). | -| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. | -| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. | -| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. | -| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. | -| [`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer, but does _not_ write it to persistent memory (EEPROM). | -| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). | -| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). | -| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. | +|Function |Description | +|---------------------------------------------|--------------------------------------------------------------------------------------------------------| +|`layer_state_set(layer_mask)` |Directly sets the layer state (avoid unless you know what you are doing). | +|`layer_clear()` |Clears all layers (turns them all off). | +|`layer_move(layer)` |Turns specified layer on, and all other layers off. | +|`layer_on(layer)` |Turns specified layer on, leaves all other layers in existing state. | +|`layer_off(layer)` |Turns specified layer off, leaves all other layers in existing state. | +|`layer_invert(layer)` |Inverts/toggles the state of the specified layer | +|`layer_or(layer_mask)` |Turns on layers based on matching bits between specified layer and existing layer state. | +|`layer_and(layer_mask)` |Turns on layers based on matching enabled bits between specified layer and existing layer state. | +|`layer_xor(layer_mask)` |Turns on layers based on non-matching bits between specified layer and existing layer state. | +|`layer_debug(layer_mask)` |Prints out the current bit mask and highest active layer to debugger console. | +|`default_layer_set(layer_mask)` |Directly sets the default layer state (avoid unless you know what you are doing). | +|`default_layer_or(layer_mask)` |Turns on layers based on matching bits between specified layer and existing default layer state. | +|`default_layer_and(layer_mask)` |Turns on layers based on matching enabled bits between specified layer and existing default layer state.| +|`default_layer_xor(layer_mask)` |Turns on layers based on non-matching bits between specified layer and existing default layer state. | +|`default_layer_debug(layer_mask)` |Prints out the current bit mask and highest active default layer to debugger console. | +|[`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) |Sets the default layer, but does _not_ write it to persistent memory (EEPROM). | +|[`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer)|Sets the default layer and writes it to persistent memory (EEPROM). | +|[`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) |Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off).| +|[`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) |Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. | In addition to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passes the layer state to the function, where it can be read or modified. @@ -154,7 +154,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case KC_CYCLE_LAYERS: // Our logic will happen on presses, nothing is done on releases - if (!record->event.pressed) { + if (!record->event.pressed) { // We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily return false; } diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index 0f5c4a5f96..2c8c08b38e 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -24,10 +24,10 @@ For example, make planck:jack -Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. +Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. ::: warning -This `name` can be [overridden](#override-default-userspace), if needed. +This `name` can be [overridden](#override-default-userspace), if needed. ::: ## `Rules.mk` @@ -38,9 +38,9 @@ It's highly recommended that you use `.c` as the default source file to be SRC += .c -Additional files may be added in the same way - it's recommended you have one named ``.c/.h to start off with, though. +Additional files may be added in the same way - it's recommended you have one named ``.c/.h to start off with, though. -The `/users//rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. +The `/users//rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can add support for that if the RGBLIGHT feature is enabled: ```make @@ -82,7 +82,7 @@ You should use the `config.h` for [configuration options](config_options), and t Please include authorship (your name, GitHub username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses). -You can use this as a template: +You can use this as a template: ``` Copyright @ @@ -100,9 +100,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ``` -You'd want to replace the year, name, email and GitHub username with your info. +You'd want to replace the year, name, email and GitHub username with your info. -Additionally, this is a good place to document your code, if you wish to share it with others. +Additionally, this is a good place to document your code, if you wish to share it with others. ## Build All Keyboards That Support a Specific Keymap @@ -118,20 +118,21 @@ 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 more complicated examples, checkout the [`awesome-qmk` colletion](https://github.com/qmk/awesome-qmk). +For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example). + +For more complicated examples, checkout the [`awesome-qmk` collection](https://github.com/qmk/awesome-qmk). ### Customized Functions -QMK has a bunch of [functions](custom_quantum_functions) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap. +QMK has a bunch of [functions](custom_quantum_functions) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap. -However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap! +However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap! -For instance, let's look at the `layer_state_set_user()` function. You can enable the [Tri Layer State](ref_functions#olkb-tri-layers) functionality on all of your boards, while also retaining the Tri Layer functionality in your `keymap.c` files. +For instance, let's look at the `layer_state_set_user()` function. You can enable the [Tri Layer State](ref_functions#olkb-tri-layers) functionality on all of your boards, while also retaining the Tri Layer functionality in your `keymap.c` files. -In your `` file, you'd want to add this: +In your `` file, you'd want to add this: ```c __attribute__ ((weak)) layer_state_t layer_state_set_keymap (layer_state_t state) { @@ -143,7 +144,7 @@ layer_state_t layer_state_set_user (layer_state_t state) { return layer_state_set_keymap (state); } ``` -The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. +The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else. @@ -151,7 +152,7 @@ You can see a list of this and other common functions in [`template.c`](https:// ### Custom Features -Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace. +Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace. For instance, if you wanted to have a bunch of macros available, but only on certain boards (to save space), you could "hide" them being a `#ifdef MACROS_ENABLED`, and then enable it per board. To do this, add this to your rules.mk ```make @@ -159,11 +160,11 @@ ifeq ($(strip $(MACROS_ENABLED)), yes) OPT_DEFS += -DMACROS_ENABLED endif ``` -The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. +The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace. -And in your `process_record_user` function, you'd do something like this: +And in your `process_record_user` function, you'd do something like this: ```c bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { @@ -187,9 +188,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { ### Consolidated Macros -If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too. +If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too. -First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlapping keycodes +First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you won't have any overlapping keycodes Then add `#include ".h"` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap. @@ -245,7 +246,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -For boards that may not have a shift button (such as on a macro pad), we need a way to always include the bootloader option. To do that, add the following to the `rules.mk` in your userspace folder: +For boards that may not have a shift button (such as on a macro pad), we need a way to always include the bootloader option. To do that, add the following to the `rules.mk` in your userspace folder: ```make ifeq ($(strip $(FLASH_BOOTLOADER)), yes) @@ -255,7 +256,7 @@ endif This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. -Also, holding Shift will add the flash target (`:flash`) to the command. Holding Control will add some commands that will speed up compiling time by processing multiple files at once. +Also, holding Shift will add the flash target (`:flash`) to the command. Holding Control will add some commands that will speed up compiling time by processing multiple files at once. And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap. diff --git a/docs/features/audio.md b/docs/features/audio.md index 2f5e5b2d98..a5f770d811 100644 --- a/docs/features/audio.md +++ b/docs/features/audio.md @@ -73,16 +73,13 @@ Should you rather choose to generate and use your own sample-table with the DAC ### PWM (software) -if the DAC pins are unavailable (or the MCU has no usable DAC at all, like STM32F1xx); PWM can be an alternative. +If the DAC pins are unavailable (or the MCU has no usable DAC at all, like STM32F1xx); PWM can be an alternative. Note that there is currently only one speaker/pin supported. -set in `rules.mk`: - -`AUDIO_DRIVER = pwm_software` and in `config.h`: -`#define AUDIO_PIN C13` (can be any pin) to have the selected pin output a pwm signal, generated from a timer callback which toggles the pin in software. +To use this feature, set `AUDIO_DRIVER = pwm_software` in `rules.mk` and set `#define AUDIO_PIN C13` (can be any pin) in `config.h` to have the selected pin output a pwm signal, generated from a timer callback which toggles the pin in software. #### Wiring -the usual piezo wiring: red goes to the selected AUDIO_PIN, black goes to ground. +The usual piezo wiring: red goes to the selected AUDIO_PIN, black goes to ground. OR if you can chose to drive one piezo with two pins, for example `#define AUDIO_PIN B1`, `#define AUDIO_PIN_ALT B2` in `config.h`, with `#define AUDIO_PIN_ALT_AS_NEGATIVE` - then the red lead could go to B1, the black to B2. @@ -159,7 +156,7 @@ PLAY_LOOP(my_song); It's advised that you wrap all audio features in `#ifdef AUDIO_ENABLE` / `#endif` to avoid causing problems when audio isn't built into the keyboard. -The available keycodes for audio are: +The available keycodes for audio are: |Key |Aliases |Description | |-------------------------|---------|-------------------------------------------| @@ -178,8 +175,8 @@ These keycodes turn all of the audio functionality on and off. Turning it off m |`AUDIO_PIN` | *Not defined* |Configures the pin that the speaker is connected to. | |`AUDIO_PIN_ALT` | *Not defined* |Configures the pin for a second speaker or second pin connected to one speaker. | |`AUDIO_PIN_ALT_AS_NEGATIVE` | *Not defined* |Enables support for one speaker connected to two pins. | -|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accomidate for USB startup issues. | -|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simutaneously. | +|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accommodate for USB startup issues. | +|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simultaneously. | |`AUDIO_POWER_CONTROL_PIN` | *Not defined* |Enables power control code to enable or cut off power to speaker (such as with PAM8302 amp). | |`AUDIO_POWER_CONTROL_PIN_ON_STATE`| `1` |The state of the audio power control pin when audio is "on" - `1` for high, `0` for low. | |`STARTUP_SONG` | `STARTUP_SOUND` |Plays when the keyboard starts up (audio.c) | @@ -301,9 +298,9 @@ Things that return false are not part of the mask, and are always processed. ### Music Map -By default, the Music Mode uses the columns and row to determine the scale for the keys. For a board that uses a rectangular matrix that matches the keyboard layout, this is just fine. However, for boards that use a more complicated matrix (such as the Planck Rev6, or many split keyboards) this would result in a very skewed experience. +By default, the Music Mode uses the columns and row to determine the scale for the keys. For a board that uses a rectangular matrix that matches the keyboard layout, this is just fine. However, for boards that use a more complicated matrix (such as the Planck Rev6, or many split keyboards) this would result in a very skewed experience. -However, the Music Map option allows you to remap the scaling for the music mode, so it fits the layout, and is more natural. +However, the Music Map option allows you to remap the scaling for the music mode, so it fits the layout, and is more natural. To enable this feature, add `#define MUSIC_MAP` to your `config.h` file, and then you will want to add a `uint8_t music_map` to your keyboard's `c` file, or your `keymap.c`. @@ -316,13 +313,13 @@ const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x12( ); ``` -You will want to use whichever `LAYOUT` macro that your keyboard uses here. This maps it to the correct key location. Start in the bottom left of the keyboard layout, and move to the right, and then upwards. Fill in all the entries until you have a complete matrix. +You will want to use whichever `LAYOUT` macro that your keyboard uses here. This maps it to the correct key location. Start in the bottom left of the keyboard layout, and move to the right, and then upwards. Fill in all the entries until you have a complete matrix. -You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) as an example of how to implement this. +You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) as an example of how to implement this. ## Audio Click -This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly. +This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly. Keycodes available: @@ -341,7 +338,7 @@ The feature is disabled by default, to save space. To enable it, add this to yo #define AUDIO_CLICKY ``` -You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values: +You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values: | Option | Default Value | Description | |--------|---------------|-------------| @@ -349,7 +346,7 @@ You can configure the default, min and max frequencies, the stepping and built i | `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). | | `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the highest frequency. Too high may result in coworkers attacking you. | | `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. This is a multiplicative factor. The default steps the frequency up/down by a musical minor third. | -| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. | +| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. | | `AUDIO_CLICKY_DELAY_DURATION` | 1 | An integer note duration where 1 is 1/16th of the tempo, or a sixty-fourth note (see `quantum/audio/musical_notes.h` for implementation details). The main clicky effect will be delayed by this duration. Adjusting this to values around 6-12 will help compensate for loud switches. | ## MIDI Functionality diff --git a/docs/features/bootmagic.md b/docs/features/bootmagic.md index 49fae5ba45..15c2bec293 100644 --- a/docs/features/bootmagic.md +++ b/docs/features/bootmagic.md @@ -46,7 +46,7 @@ When [handedness](split_keyboard#setting-handedness) is predetermined via option } ``` -If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file: +If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 column 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file: ```c #define BOOTMAGIC_ROW_RIGHT 4 diff --git a/docs/features/encoders.md b/docs/features/encoders.md index a674eaa4a6..59f949be65 100644 --- a/docs/features/encoders.md +++ b/docs/features/encoders.md @@ -68,7 +68,7 @@ Additionally, if one side does not have an encoder, you can specify `{}` for the ``` ::: warning -Keep in mind that whenver you change the encoder resolution, you will need to reflash the half that has the encoder affected by the change. +Keep in mind that whenever you change the encoder resolution, you will need to reflash the half that has the encoder affected by the change. ::: ## Encoder map {#encoder-map} diff --git a/docs/features/haptic_feedback.md b/docs/features/haptic_feedback.md index 52667965a0..08e66ea8e1 100644 --- a/docs/features/haptic_feedback.md +++ b/docs/features/haptic_feedback.md @@ -44,14 +44,14 @@ Not all keycodes below will work depending on which haptic mechanism you have ch |`QK_HAPTIC_MODE_NEXT` |`HF_NEXT`| Go to next DRV2605L waveform | |`QK_HAPTIC_MODE_PREVIOUS` |`HF_PREV`| Go to previous DRV2605L waveform | |`QK_HAPTIC_CONTINUOUS_TOGGLE`|`HF_CONT`| Toggle continuous haptic mode on/off | -|`QK_HAPTIC_CONTINUOUS_UP` |`HF_CONU`| Increase DRV2605L continous haptic strength | -|`QK_HAPTIC_CONTINUOUS_DOWN` |`HF_COND`| Decrease DRV2605L continous haptic strength | +|`QK_HAPTIC_CONTINUOUS_UP` |`HF_CONU`| Increase DRV2605L continuous haptic strength | +|`QK_HAPTIC_CONTINUOUS_DOWN` |`HF_COND`| Decrease DRV2605L continuous haptic strength | |`QK_HAPTIC_DWELL_UP` |`HF_DWLU`| Increase Solenoid dwell time | |`QK_HAPTIC_DWELL_DOWN` |`HF_DWLD`| Decrease Solenoid dwell time | ### Solenoids -The solenoid code supports relay switches, and similar hardware, as well as solenoids. +The solenoid code supports relay switches, and similar hardware, as well as solenoids. For a regular solenoid, you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid. @@ -75,7 +75,7 @@ For relay switches, the hardware may already contain all of that ciruitry, and j |`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the switch is in buzz mode. | * If solenoid buzz is off, then dwell time is how long the "plunger" stays activated. The dwell time changes how the solenoid sounds. -* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times withing the buzz period. +* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times within the buzz period. * With the current implementation, for any of the above time settings, the precision of these settings may be affected by how fast the keyboard is able to scan the matrix. Therefore, if the keyboards scanning routine is slow, it may be preferable to set `SOLENOID_DWELL_STEP_SIZE` to a value slightly smaller than the time it takes to scan the keyboard. @@ -104,7 +104,7 @@ Eccentric Rotating Mass vibration motors (ERM) is motor with a off-set weight at ``` ##### LRA -Linear resonant actuators (LRA, also know as a linear vibrator) works different from a ERM. A LRA has a weight and magnet suspended by springs and a voice coil. When the drive signal is applied, the weight would be vibrate on a single axis (side to side or up and down). Since the weight is attached to a spring, there is a resonance effect at a specific frequency. This frequency is where the LRA will operate the most efficiently. Refer to the motor's datasheet for the recommanded range for this frequency. +Linear resonant actuators (LRA, also know as a linear vibrator) works different from a ERM. A LRA has a weight and magnet suspended by springs and a voice coil. When the drive signal is applied, the weight would be vibrate on a single axis (side to side or up and down). Since the weight is attached to a spring, there is a resonance effect at a specific frequency. This frequency is where the LRA will operate the most efficiently. Refer to the motor's datasheet for the recommended range for this frequency. ```c #define DRV2605L_FB_ERM_LRA 1 @@ -114,7 +114,7 @@ Linear resonant actuators (LRA, also know as a linear vibrator) works different /* Please refer to your datasheet for the optimal setting for your specific motor. */ #define DRV2605L_RATED_VOLTAGE 2 #define DRV2605L_V_PEAK 2.8 -#define DRV2605L_V_RMS 2.0 +#define DRV2605L_V_RMS 2.0 #define DRV2605L_V_PEAK 2.1 #define DRV2605L_F_LRA 205 /* resonance freq */ ``` @@ -125,7 +125,7 @@ DRV2605L comes with preloaded library of various waveform sequences that can be List of waveform sequences from the datasheet: -|seq# | Sequence name |seq# | Sequence name |seq# |Sequence name | +|seq# | Sequence name |seq# | Sequence name |seq# |Sequence name | |-----|---------------------|-----|-----------------------------------|-----|--------------------------------------| | 1 | strong_click | 43 | lg_dblclick_med_60 | 85 | transition_rampup_med_smooth2 | | 2 | strong_click_60 | 44 | lg_dblsharp_tick | 86 | transition_rampup_short_smooth1 | diff --git a/docs/features/pointing_device.md b/docs/features/pointing_device.md index f25ea1b033..d6dcddcdf0 100644 --- a/docs/features/pointing_device.md +++ b/docs/features/pointing_device.md @@ -51,7 +51,7 @@ The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surfac | `ADNS9800_CS_PIN` | (Required) Sets the Chip Select pin connected to the sensor. | `POINTING_DEVICE_CS_PIN` | -The CPI range is 800-8200, in increments of 200. Defaults to 1800 CPI. +The CPI range is 800-8200, in increments of 200. Defaults to 1800 CPI. ### Analog Joystick @@ -258,7 +258,7 @@ To use the paw 3204 sensor, add this to your `rules.mk` POINTING_DEVICE_DRIVER = paw3204 ``` -The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source. +The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source. | Setting (`config.h`) | Description | Default | | -------------------- |--------------------------------------------------------------- | -------------------------- | @@ -275,7 +275,7 @@ To use the Pimoroni Trackball module, add this to your `rules.mk`: POINTING_DEVICE_DRIVER = pimoroni_trackball ``` -The Pimoroni Trackball module is a I2C based breakout board with an RGB enable trackball. +The Pimoroni Trackball module is a I2C based breakout board with an RGB enable trackball. | Setting (`config.h`) | Description | Default | | ------------------------------------ | ---------------------------------------------------------------------------------- | ------- | @@ -386,7 +386,7 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {} ``` ::: warning -Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/pointing_device_drivers.c`, but there may be cases where it's very specific to the hardware. So these functions are provided, just in case. +Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/pointing_device_drivers.c`, but there may be cases where it's very specific to the hardware. So these functions are provided, just in case. ::: ## Common Configuration @@ -413,7 +413,7 @@ Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/ When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and `POINTING_DEVICE_TASK_THROTTLE_MS` will default to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness. ::: -The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_SCLK_PIN` provide a convenient way to define a single pin that can be used for an interchangeable sensor config. This allows you to have a single config, without defining each device. Each sensor allows for this to be overridden with their own defines. +The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_SCLK_PIN` provide a convenient way to define a single pin that can be used for an interchangeable sensor config. This allows you to have a single config, without defining each device. Each sensor allows for this to be overridden with their own defines. ::: warning Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports. @@ -424,7 +424,7 @@ Any pointing device with a lift/contact status can integrate inertial cursor fea | Setting | Description | Default | | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- | | `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ | -| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution mutiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` | +| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution multiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` | | `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` | The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels). @@ -435,7 +435,7 @@ If even smoother scrolling than provided by this default value is desired, first The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`. ::: warning -High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer. +High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer. To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent. ::: @@ -465,7 +465,7 @@ If there is a `_RIGHT` configuration option or callback, the [common configurati ::: -## Callbacks and Functions +## Callbacks and Functions | Function | Description | | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | @@ -513,7 +513,7 @@ To manually manipulate the mouse reports outside of the `pointing_device_task_*` * `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer * `pointing_device_set_report(report_mouse_t mouse_report)` - Overrides and saves the report_mouse_t to be sent to the host computer -* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report. +* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report. When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden. @@ -548,7 +548,7 @@ Recall that the mouse report is set to zero (except the buttons) whenever it is ### Drag Scroll or Mouse Scroll -A very common implementation is to use the mouse movement to scroll instead of moving the cursor on the system. This uses the `pointing_device_task_user` callback to intercept and modify the mouse report before it's sent to the host system. +A very common implementation is to use the mouse movement to scroll instead of moving the cursor on the system. This uses the `pointing_device_task_user` callback to intercept and modify the mouse report before it's sent to the host system. ```c enum custom_keycodes { @@ -575,7 +575,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key. +This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key. ### Advanced Drag Scroll @@ -711,7 +711,7 @@ If you are having issues with pointing device drivers debug messages can be enab ```c #define POINTING_DEVICE_DEBUG ``` - + ::: tip The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](../faq_debug). ::: @@ -720,7 +720,7 @@ The messages will be printed out to the `CONSOLE` output. For additional informa --- # Automatic Mouse Layer {#pointing-device-auto-mouse} -When using a pointing device combined with a keyboard the mouse buttons are often kept on a separate layer from the default keyboard layer, which requires pressing or holding a key to change layers before using the mouse. To make this easier and more efficient an additional pointing device feature may be enabled that will automatically activate a target layer as soon as the pointing device is active _(in motion, mouse button pressed etc.)_ and deactivate the target layer after a set time. +When using a pointing device combined with a keyboard the mouse buttons are often kept on a separate layer from the default keyboard layer, which requires pressing or holding a key to change layers before using the mouse. To make this easier and more efficient an additional pointing device feature may be enabled that will automatically activate a target layer as soon as the pointing device is active _(in motion, mouse button pressed etc.)_ and deactivate the target layer after a set time. Additionally if any key that is defined as a mouse key is pressed then the layer will be held as long as the key is pressed and the timer will be reset on key release. When a non-mouse key is pressed then the layer is deactivated early _(with some exceptions see below)_. Mod, mod tap, and one shot mod keys are ignored _(i.e. don't hold or activate layer but do not deactivate the layer either)_ when sending a modifier keycode _(e.g. hold for mod tap)_ allowing for mod keys to be used with the mouse without activating the target layer when typing. @@ -754,8 +754,9 @@ void pointing_device_init_user(void) { } ``` -Because the auto mouse feature can be disabled/enabled during runtime and starts as disabled by default it must be enabled by calling `set_auto_mouse_enable(true);` somewhere in firmware before the feature will work. -_Note: for setting the target layer during initialization either setting `AUTO_MOUSE_DEFAULT_LAYER` in `config.h` or calling `set_auto_mouse_layer()` can be used._ +Because the auto mouse feature can be disabled/enabled during runtime and starts as disabled by default it must be enabled by calling `set_auto_mouse_enable(true);` somewhere in firmware before the feature will work. + +_Note: for setting the target layer during initialization either setting `AUTO_MOUSE_DEFAULT_LAYER` in `config.h` or calling `set_auto_mouse_layer()` can be used._ ## How to Customize: @@ -774,7 +775,7 @@ There are a few ways to control the auto mouse feature with both `config.h` opti ### Adding mouse keys -While all default mouse keys and layer keys(for current mouse layer) are treated as mouse keys, additional Keyrecords can be added to mouse keys by adding them to the is_mouse_record_* stack. +While all default mouse keys and layer keys(for current mouse layer) are treated as mouse keys, additional Keyrecords can be added to mouse keys by adding them to the is_mouse_record_* stack. #### Callbacks for setting up additional key codes as mouse keys: | Callback | Description | @@ -782,7 +783,7 @@ While all default mouse keys and layer keys(for current mouse layer) are treated | `bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record)` | keyboard level callback for adding mouse keys | | `bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record)` | user/keymap level callback for adding mouse keys | -##### To use the callback function to add mouse keys: +##### To use the callback function to add mouse keys: The following code will cause the enter key and all of the arrow keys to be treated as mouse keys (hold target layer while they are pressed and reset active layer timer). ```c @@ -806,7 +807,7 @@ bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) { There are several functions that allow for more advanced interaction with the auto mouse feature allowing for greater control. -### Functions to control auto mouse enable and target layer: +### Functions to control auto mouse enable and target layer: | Function | Description | Aliases | Return type | | :--------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------- | --------------: | | `set_auto_mouse_enable(bool enable)` | Enable or disable auto mouse (true:enable, false:disable) | | `void`(None) | @@ -825,25 +826,27 @@ There are several functions that allow for more advanced interaction with the au | `get_auto_mouse_key_tracker(void)` | Gets the current count for the auto mouse key tracker. | | `int8_t` | | `set_auto_mouse_key_tracker(int8_t key_tracker)` | Sets/Overrides the current count for the auto mouse key tracker. | | `void`(None) | -_NOTES:_ - - _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._ - - _It is recommended that `remove_auto_mouse_layer` is used in the `layer_state_set_*` stack of functions and `auto_mouse_layer_off` is used everywhere else_ - - _`remove_auto_mouse_layer(state, false)` or `auto_mouse_layer_off()` should be called before any instance of `set_auto_mouse_enabled(false)` or `set_auto_mouse_layer(layer)` to ensure that the target layer will be removed appropriately before disabling auto mouse or changing target to avoid a stuck layer_ - -### Functions for handling custom key events: +_NOTES:_ + +- _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._ +- _It is recommended that `remove_auto_mouse_layer` is used in the `layer_state_set_*` stack of functions and `auto_mouse_layer_off` is used everywhere else_ +- _`remove_auto_mouse_layer(state, false)` or `auto_mouse_layer_off()` should be called before any instance of `set_auto_mouse_enabled(false)` or `set_auto_mouse_layer(layer)` to ensure that the target layer will be removed appropriately before disabling auto mouse or changing target to avoid a stuck layer_ + +### Functions for handling custom key events: | Function | Description | Return type | | :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: | | `auto_mouse_keyevent(bool pressed)` | Auto mouse mouse key event (true: key down, false: key up) | `void`(None) | | `auto_mouse_trigger_reset(bool pressed)` | Reset auto mouse status on key down and start delay timer (non-mouse key event) | `void`(None) | | `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | `void`(None) | -| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | `bool` | +| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | `bool` | + _NOTE: Generally it would be preferable to use the `is_mouse_record_*` functions to add any additional keys that should act as mouse keys rather than adding `auto_mouse_keyevent(record.event->pressed)` to `process_records_*`_ -### Advanced control examples +### Advanced control examples -#### Disable auto mouse on certain layers: +#### Disable auto mouse on certain layers: -The auto mouse feature can be disabled any time and this can be helpful if you want to disable the auto mouse feature under certain circumstances such as when particular layers are active. One issue however is the handling of the target layer, it needs to be removed appropriately **before** disabling auto mouse _(see notes under control functions above)_. The following function would disable the auto_mouse feature whenever the layers `_LAYER5` through `_LAYER7` are active as the top most layer _(ignoring target layer)_. +The auto mouse feature can be disabled any time and this can be helpful if you want to disable the auto mouse feature under certain circumstances such as when particular layers are active. One issue however is the handling of the target layer, it needs to be removed appropriately **before** disabling auto mouse _(see notes under control functions above)_. The following function would disable the auto_mouse feature whenever the layers `_LAYER5` through `_LAYER7` are active as the top most layer _(ignoring target layer)_. ```c // in keymap.c: @@ -882,7 +885,7 @@ layer_state_t default_layer_state_set_user(layer_state_t state) { auto_mouse_layer_off(); set_auto_mouse_layer(_MOUSE_LAYER_2); break; - + default: if((AUTO_MOUSE_TARGET_LAYER) == _MOUSE_LAYER_1) break; auto_mouse_layer_off(); @@ -892,9 +895,11 @@ layer_state_t default_layer_state_set_user(layer_state_t state) { } ``` -### Use custom keys to control auto mouse: -Custom key records could also be created that control the auto mouse feature. -The code example below would create a custom key that would toggle the auto mouse feature on and off when pressed while also setting a bool that could be used to disable other code that may turn it on such as the layer code above. +### Use custom keys to control auto mouse: + +Custom key records could also be created that control the auto mouse feature. + +The code example below would create a custom key that would toggle the auto mouse feature on and off when pressed while also setting a bool that could be used to disable other code that may turn it on such as the layer code above. ```c // in config.h: @@ -923,11 +928,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { ## Customize Target Layer Activation -Layer activation can be customized by overwriting the `auto_mouse_activation` function. This function is checked every time `pointing_device_task` is called when inactive and every `AUTO_MOUSE_DEBOUNCE` ms when active, and will evaluate pointing device level conditions that trigger target layer activation. When it returns true, the target layer will be activated barring the usual exceptions _(e.g. delay time has not expired)_. +Layer activation can be customized by overwriting the `auto_mouse_activation` function. This function is checked every time `pointing_device_task` is called when inactive and every `AUTO_MOUSE_DEBOUNCE` ms when active, and will evaluate pointing device level conditions that trigger target layer activation. When it returns true, the target layer will be activated barring the usual exceptions _(e.g. delay time has not expired)_. By default it will return true if any of the `mouse_report` axes `x`,`y`,`h`,`v` are non zero, or if there is any mouse buttons active in `mouse_report`. _Note: The Cirque pinnacle track pad already implements a custom activation function that will activate on touchdown as well as movement all of the default conditions, currently this only works for the master side of split keyboards._ - + | Function | Description | Return type | | :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: | | `auto_mouse_activation(report_mouse_t mouse_report)` | Overwritable function that controls target layer activation (when true) | `bool` | @@ -939,12 +944,12 @@ When using a custom pointing device (overwriting `pointing_device_task`) the fol ```c bool pointing_device_task(void) { //...Custom pointing device task code - + // handle automatic mouse layer (needs report_mouse_t as input) pointing_device_task_auto_mouse(local_mouse_report); - + //...More custom pointing device task code - + return pointing_device_send(); } ``` diff --git a/docs/features/repeat_key.md b/docs/features/repeat_key.md index 7f2bdc44e6..543dfd1008 100644 --- a/docs/features/repeat_key.md +++ b/docs/features/repeat_key.md @@ -5,7 +5,7 @@ Key after tapping the Z key types another "`z`." This is useful for typing doubled letters, like the `z` in "`dazzle`": a double tap on Z can instead be a roll from Z to Repeat, which is potentially faster and more comfortable. The Repeat Key is also useful for -hotkeys, like repeating Ctrl + Shift + Right Arrow to select by word. +hotkeys, like repeating Ctrl + Shift + Right Arrow to select by word. Repeat Key remembers mods that were active with the last key press. These mods are combined with any additional mods while pressing the Repeat Key. If the last @@ -49,10 +49,10 @@ reduce firmware size, Alternate Repeat may be disabled by adding in config.h: The following alternate keys are defined by default. See `get_alt_repeat_key_keycode_user()` below for how to change or add to these -definitions. Where it makes sense, these definitions also include combinations +definitions. Where it makes sense, these definitions also include combinations with mods, like Ctrl + Left ↔ Ctrl + Right Arrow. -**Navigation** +**Navigation** |Keycodes |Description | |-----------------------------------|-----------------------------------| @@ -65,7 +65,7 @@ with mods, like Ctrl + Left ↔ Ctrl + Right Arrow. |`MS_WHLL` ↔ `MS_WHLR` | Mouse Wheel Left ↔ Right | |`MS_WHLU` ↔ `MS_WHLD` | Mouse Wheel Up ↔ Down | -**Misc** +**Misc** |Keycodes |Description | |-----------------------------------|-----------------------------------| @@ -73,7 +73,7 @@ with mods, like Ctrl + Left ↔ Ctrl + Right Arrow. |`KC_LBRC` ↔ `KC_RBRC` | `[` ↔ `]` | |`KC_LCBR` ↔ `KC_RCBR` | `{` ↔ `}` | -**Media** +**Media** |Keycodes |Description | |-----------------------------------|-----------------------------------| @@ -176,9 +176,9 @@ macro](../feature_macros). This way macros can be used without having to dedicate keys to them. The following defines a couple shortcuts. * Typing K, Alt Repeat produces "`keyboard`," with the - initial "`k`" typed as usual and the "`eybord`" produced by the macro. + initial "`k`" typed as usual and the "`eybord`" produced by the macro. * Typing ., Alt Repeat produces "`../`," handy for "up - directory" on the shell. Similary, . types the initial "`.`" and + directory" on the shell. Similarly, . types the initial "`.`" and "`./`" is produced by the macro. ```c @@ -290,7 +290,7 @@ By default, pressing the Repeat Key will simply behave as if the last key were pressed again. This also works with macro keys with custom handlers, invoking the macro again. In case fine-tuning is needed for sensible repetition, you can handle how a key is repeated with `get_repeat_key_count()` within -`process_record_user()`. +`process_record_user()`. The `get_repeat_key_count()` function returns a signed count of times the key has been repeated or alternate repeated. When a key is pressed as usual, @@ -306,16 +306,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { if (get_repeat_key_count() > 0) { // MY_MACRO is being repeated! if (record->event.pressed) { - SEND_STRING("repeat!"); + SEND_STRING("repeat!"); } - } else { + } else { // MY_MACRO is being used normally. - if (record->event.pressed) { + if (record->event.pressed) { SEND_STRING("macro"); } } return false; - + // Other macros... } return true; @@ -347,19 +347,19 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { case MY_MACRO: if (get_repeat_key_count() > 0) { // Repeating. if (record->event.pressed) { - SEND_STRING("repeat!"); + SEND_STRING("repeat!"); } } else if (get_repeat_key_count() < 0) { // Alternate repeating. if (record->event.pressed) { SEND_STRING("alt repeat!"); } } else { // Used normally. - if (record->event.pressed) { + if (record->event.pressed) { SEND_STRING("macro"); } } return false; - + // Other macros... } return true; @@ -377,7 +377,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) { | `set_last_mods(mods)` | Set the mods to apply when repeating. | | `get_repeat_key_count()` | Signed count of times the key has been repeated or alternate repeated. | | `get_alt_repeat_key_keycode()` | Keycode to be used for alternate repeating. | - + ## Additional "Alternate" keys @@ -437,7 +437,7 @@ static void process_altrep3(uint16_t keycode, uint8_t mods) { bool process_record_user(uint16_t keycode, keyrecord_t* record) { switch (keycode) { - case ALTREP2: + case ALTREP2: if (record->event.pressed) { process_altrep2(get_last_keycode(), get_last_mods()); } diff --git a/docs/features/rgb_matrix.md b/docs/features/rgb_matrix.md index b0110b436b..95ee4c4896 100644 --- a/docs/features/rgb_matrix.md +++ b/docs/features/rgb_matrix.md @@ -125,13 +125,13 @@ enum rgb_matrix_effects { RGB_MATRIX_CYCLE_SPIRAL, // Full gradient spinning spiral around center of keyboard RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard RGB_MATRIX_RAINBOW_BEACON, // Full tighter gradient spinning around center of keyboard - RGB_MATRIX_RAINBOW_PINWHEELS, // Full dual gradients spinning two halfs of keyboard + RGB_MATRIX_RAINBOW_PINWHEELS, // Full dual gradients spinning two halves of keyboard RGB_MATRIX_FLOWER_BLOOMING, // Full tighter gradient of first half scrolling left to right and second half scrolling right to left RGB_MATRIX_RAINDROPS, // Randomly changes a single key's hue RGB_MATRIX_JELLYBEAN_RAINDROPS, // Randomly changes a single key's hue and saturation - RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight ammount at the same time, then shifts back - RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left - RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right + RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight amount at the same time, then shifts back + RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight amount in a wave to the right, then back to the left + RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight amount and then back down in a wave to the right RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges RGB_MATRIX_PIXEL_FLOW, // Pulsing RGB flow along LED wiring with random hues RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues @@ -240,7 +240,7 @@ In order to change the delay of temperature decrease define `RGB_MATRIX_TYPING_H As heatmap uses the physical position of the leds set in the g_led_config, you may need to tweak the following options to get the best effect for your keyboard. Note the size of this grid is `224x64`. -Limit the distance the effect spreads to surrounding keys. +Limit the distance the effect spreads to surrounding keys. ```c #define RGB_MATRIX_TYPING_HEATMAP_SPREAD 40 @@ -406,8 +406,8 @@ const char* effect_name = rgb_matrix_get_mode_name(rgb_matrix_get_mode()); #define RGB_MATRIX_VAL_STEP 16 // The value by which to increment the brightness per adjustment action #define RGB_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action #define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set -#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. - // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR +#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. + // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR #define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards ``` diff --git a/docs/features/space_cadet.md b/docs/features/space_cadet.md index 0abdaebf33..66761f5a46 100644 --- a/docs/features/space_cadet.md +++ b/docs/features/space_cadet.md @@ -32,7 +32,7 @@ COMMAND_ENABLE = no ## Configuration -By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. In addition, you can redefine the modifier to send on tap, or even send no modifier at all. The new configuration defines bundle all options up into a single define of 3 key codes in this order: the `Modifier` when held or when used with other keys, the `Tap Modifer` sent when tapped (no modifier if `KC_TRNS`), finally the `Keycode` sent when tapped. Now keep in mind, mods from other keys will still apply to the `Keycode` if say `KC_RSFT` is held while tapping `SC_LSPO` key with `KC_TRNS` as the `Tap Modifer`. +By default Space Cadet assumes a US ANSI layout, but if your layout uses different keys for parentheses, you can redefine them in your `config.h`. In addition, you can redefine the modifier to send on tap, or even send no modifier at all. The new configuration defines bundle all options up into a single define of 3 key codes in this order: the `Modifier` when held or when used with other keys, the `Tap Modifier` sent when tapped (no modifier if `KC_TRNS`), finally the `Keycode` sent when tapped. Now keep in mind, mods from other keys will still apply to the `Keycode` if say `KC_RSFT` is held while tapping `SC_LSPO` key with `KC_TRNS` as the `Tap Modifier`. |Define |Default |Description | |----------------|-------------------------------|---------------------------------------------------------------------------------| diff --git a/docs/features/split_keyboard.md b/docs/features/split_keyboard.md index fbf5d3d3e2..4b299b14f8 100644 --- a/docs/features/split_keyboard.md +++ b/docs/features/split_keyboard.md @@ -1,12 +1,12 @@ -# Split Keyboard +# Split Keyboard -Many keyboards in the QMK Firmware repo are "split" keyboards. They use two controllers—one plugging into USB, and the second connected by a serial or an I2C connection over a TRRS or similar cable. +Many keyboards in the QMK Firmware repo are "split" keyboards. They use two controllers—one plugging into USB, and the second connected by a serial or an I2C connection over a TRRS or similar cable. -Split keyboards can have a lot of benefits, but there is some additional work needed to get them enabled. +Split keyboards can have a lot of benefits, but there is some additional work needed to get them enabled. -QMK Firmware has a generic implementation that is usable by any board, as well as numerous board specific implementations. +QMK Firmware has a generic implementation that is usable by any board, as well as numerous board specific implementations. -For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards. +For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards. ::: warning ARM split supports most QMK subsystems when using the 'serial' and 'serial_usart' drivers. I2C slave is currently unsupported. @@ -29,33 +29,33 @@ Notes: ## Hardware Configuration -This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves. +This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves. ### Required Hardware Apart from diodes and key switches for the keyboard matrix in each half, you will need 2x TRRS sockets and 1x TRRS cable. -Alternatively, you can use any sort of cable and socket that has at least 3 wires. +Alternatively, you can use any sort of cable and socket that has at least 3 wires. If you want to use I2C to communicate between halves, you will need a cable with at least 4 wires and 2x 4.7kΩ pull-up resistors. -#### Considerations +#### Considerations -The most commonly used connection is a TRRS cable and jacks. These provide 4 wires, making them very useful for split keyboards, and are easy to find. +The most commonly used connection is a TRRS cable and jacks. These provide 4 wires, making them very useful for split keyboards, and are easy to find. -However, since one of the wires carries VCC, this means that the boards are not hot pluggable. You should always disconnect the board from USB before unplugging and plugging in TRRS cables, or you can short the controller, or worse. +However, since one of the wires carries VCC, this means that the boards are not hot pluggable. You should always disconnect the board from USB before unplugging and plugging in TRRS cables, or you can short the controller, or worse. -Another option is to use phone cables (as in, old school RJ-11/RJ-14 cables). Make sure that you use one that actually supports 4 wires/lanes. +Another option is to use phone cables (as in, old school RJ-11/RJ-14 cables). Make sure that you use one that actually supports 4 wires/lanes. -However, USB cables, SATA cables, and even just 4 wires have been known to be used for communication between the controllers. +However, USB cables, SATA cables, and even just 4 wires have been known to be used for communication between the controllers. ::: warning -Using USB cables for communication between the controllers works just fine, but the connector could be mistaken for a normal USB connection and potentially short out the keyboard, depending on how it's wired. For this reason, they are not recommended for connecting split keyboards. +Using USB cables for communication between the controllers works just fine, but the connector could be mistaken for a normal USB connection and potentially short out the keyboard, depending on how it's wired. For this reason, they are not recommended for connecting split keyboards. ::: ### Serial Wiring -The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0/D1/D2/D3 (aka PD0/PD1/PD2/PD3) between the two Pro Micros. +The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0/D1/D2/D3 (aka PD0/PD1/PD2/PD3) between the two Pro Micros. ::: tip Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below. @@ -66,7 +66,7 @@ Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below. ### I2C Wiring -The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros. +The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros. The pull-up resistors may be placed on either half. If you wish to use the halves independently, it is also possible to use 4 resistors and have the pull-ups in both halves. Note that the total resistance for the connected system should be within spec at 2.2k-10kOhm, with an 'ideal' at 4.7kOhm, regardless of the placement and number. @@ -75,13 +75,13 @@ Note that the total resistance for the connected system should be within spec at ## Firmware Configuration -To enable the split keyboard feature, add the following to your `rules.mk`: +To enable the split keyboard feature, add the following to your `rules.mk`: ```make SPLIT_KEYBOARD = yes ``` -If you're using a custom transport (communication method), then you will also need to add: +If you're using a custom transport (communication method), then you will also need to add: ```make SPLIT_TRANSPORT = custom @@ -109,7 +109,7 @@ You can configure the firmware to read a pin on the controller to determine hand #define SPLIT_HAND_PIN B7 ``` -This will read the specified pin. By default, if it's high, then the controller assumes it is the left hand, and if it's low, it's assumed to be the right side. +This will read the specified pin. By default, if it's high, then the controller assumes it is the left hand, and if it's low, it's assumed to be the right side. This behaviour can be flipped by adding this to you `config.h` file: @@ -141,10 +141,10 @@ While `MATRIX_MASKED` isn't necessary to use `SPLIT_HAND_MATRIX_GRID` successful #### Handedness by EEPROM -This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout. +This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout. -To enable this method, add the following to your `config.h` file: +To enable this method, add the following to your `config.h` file: ```c #define EE_HANDS @@ -176,7 +176,7 @@ Some controllers (e.g. Blackpill with DFU compatible bootloader) will need to be [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases/) can also be used to flash EEPROM handedness files. Place the controller in bootloader mode and select menu option Tools -> EEPROM -> Set Left/Right Hand ::: -This setting is not changed when re-initializing the EEPROM using the `EE_CLR` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases/)'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files. +This setting is not changed when re-initializing the EEPROM using the `EE_CLR` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases/)'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files. You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common). @@ -208,13 +208,13 @@ Because not every split keyboard is identical, there are a number of additional #define USE_I2C ``` -This configures the use of I2C support for split keyboard transport (AVR only). +This configures the use of I2C support for split keyboard transport (AVR only). ```c #define SOFT_SERIAL_PIN D0 ``` -This sets the pin to be used for serial communication. If you're not using serial, you shouldn't need to define this. +This sets the pin to be used for serial communication. If you're not using serial, you shouldn't need to define this. However, if you are using serial and I2C on the board, you will need to set this, and to something other than D0 and D1 (as these are used for I2C communication). @@ -235,7 +235,7 @@ If you're having issues with serial communication, you can change this value, as #define FORCED_SYNC_THROTTLE_MS 100 ``` -This sets the maximum number of milliseconds before forcing a synchronization of data from master to slave. Under normal circumstances this sync occurs whenever the data _changes_, for safety a data transfer occurs after this number of milliseconds if no change has been detected since the last sync. +This sets the maximum number of milliseconds before forcing a synchronization of data from master to slave. Under normal circumstances this sync occurs whenever the data _changes_, for safety a data transfer occurs after this number of milliseconds if no change has been detected since the last sync. ```c #define SPLIT_MAX_CONNECTION_ERRORS 10 @@ -249,7 +249,7 @@ Set to 0 to disable the disconnection check altogether. ``` How long (in milliseconds) the master part should block all connection attempts to the slave after the communication has been flagged as disconnected (see `SPLIT_MAX_CONNECTION_ERRORS` above). -One communication attempt will be allowed everytime this amount of time has passed since the last attempt. If that attempt succeeds, the communication is seen as working again. +One communication attempt will be allowed every time this amount of time has passed since the last attempt. If that attempt succeeds, the communication is seen as working again. Set to 0 to disable this throttling of communications while disconnected. This can save you a couple of bytes of firmware size. @@ -280,7 +280,7 @@ This enables syncing of the Host LED status (caps lock, num lock, etc) between b #define SPLIT_MODS_ENABLE ``` -This enables transmitting modifier state (normal, weak, oneshot and oneshot locked) to the non primary side of the split keyboard. The purpose of this feature is to support cosmetic use of modifer state (e.g. displaying status on an OLED screen). +This enables transmitting modifier state (normal, weak, oneshot and oneshot locked) to the non primary side of the split keyboard. The purpose of this feature is to support cosmetic use of modifier state (e.g. displaying status on an OLED screen). ```c #define SPLIT_WPM_ENABLE @@ -304,7 +304,7 @@ This enables transmitting the current ST7565 on/off status to the slave side of #define SPLIT_POINTING_ENABLE ``` -This enables transmitting the pointing device status to the master side of the split keyboard. The purpose of this feature is to enable use pointing devices on the slave side. +This enables transmitting the pointing device status to the master side of the split keyboard. The purpose of this feature is to enable use pointing devices on the slave side. ::: warning There is additional required configuration for `SPLIT_POINTING_ENABLE` outlined in the [pointing device documentation](pointing_device#split-keyboard-configuration). @@ -401,7 +401,7 @@ By default, the inbound and outbound data is limited to a maximum of 32 bytes ea ### Hardware Configuration Options -There are some settings that you may need to configure, based on how the hardware is set up. +There are some settings that you may need to configure, based on how the hardware is set up. ```c #define MATRIX_ROW_PINS_RIGHT { } @@ -433,7 +433,7 @@ This option enables synchronization of the RGB Light modes between the controlle #define RGBLED_SPLIT { 6, 6 } ``` -This sets how many LEDs are directly connected to each controller. The first number is the left side, and the second number is the right side. +This sets how many LEDs are directly connected to each controller. The first number is the left side, and the second number is the right side. ::: tip This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable it, if it's not. @@ -479,7 +479,7 @@ This set the maximum slave timeout when waiting for communication from master wh Master/slave delegation is made either by detecting voltage on VBUS connection or waiting for USB communication (`SPLIT_USB_DETECT`). Pro Micro boards can use VBUS detection out of the box and be used with or without `SPLIT_USB_DETECT`. -Many ARM boards, but not all, do not support VBUS detection. Because it is common that ARM boards lack VBUS detection, `SPLIT_USB_DETECT` is automatically defined on ARM targets (technically when ChibiOS is targetted). +Many ARM boards, but not all, do not support VBUS detection. Because it is common that ARM boards lack VBUS detection, `SPLIT_USB_DETECT` is automatically defined on ARM targets (technically when ChibiOS is targeted). ### Teensy boards @@ -501,7 +501,7 @@ You may need to use the 5V pad from the regulator block above as the pads were t ## Additional Resources -Nicinabox has a [very nice and detailed guide](https://github.com/nicinabox/lets-split-guide) for the Let's Split keyboard, that covers most everything you need to know, including troubleshooting information. +Nicinabox has a [very nice and detailed guide](https://github.com/nicinabox/lets-split-guide) for the Let's Split keyboard, that covers most everything you need to know, including troubleshooting information. However, the RGB Light section is out of date, as it was written long before the RGB Split code was added to QMK Firmware. Instead, wire each strip up directly to the controller. diff --git a/docs/features/st7565.md b/docs/features/st7565.md index de3e44d8e9..09a1efce30 100644 --- a/docs/features/st7565.md +++ b/docs/features/st7565.md @@ -182,12 +182,12 @@ void st7565_render(void); void st7565_set_cursor(uint8_t col, uint8_t line); // Advances the cursor to the next page, writing ' ' if true -// Wraps to the begining when out of bounds +// Wraps to the beginning when out of bounds void st7565_advance_page(bool clearPageRemainder); // Moves the cursor forward 1 character length // Advance page if there is not enough room for the next character -// Wraps to the begining when out of bounds +// Wraps to the beginning when out of bounds void st7565_advance_char(void); // Writes a single character to the buffer at current cursor position diff --git a/docs/features/stenography.md b/docs/features/stenography.md index 4176344b5a..b253890e13 100644 --- a/docs/features/stenography.md +++ b/docs/features/stenography.md @@ -102,7 +102,7 @@ STENO_ENABLE = yes STENO_PROTOCOL = all ``` -If you want to switch protocols programatically, as part of a custom macro for example, don't use `tap_code(QK_STENO_*)`, as `tap_code` only supports [basic keycodes](../keycodes_basic). Instead, you should use `steno_set_mode(STENO_MODE_*)`, whose valid arguments are `STENO_MODE_BOLT` and `STENO_MODE_GEMINI`. +If you want to switch protocols programmatically, as part of a custom macro for example, don't use `tap_code(QK_STENO_*)`, as `tap_code` only supports [basic keycodes](../keycodes_basic). Instead, you should use `steno_set_mode(STENO_MODE_*)`, whose valid arguments are `STENO_MODE_BOLT` and `STENO_MODE_GEMINI`. The default protocol is Gemini PR but the last protocol used is stored in non-volatile memory so QMK will remember your choice between reboots of your keyboard — assuming that your keyboard features (emulated) EEPROM. diff --git a/docs/hand_wire.md b/docs/hand_wire.md index be21cf2cc4..492ca384b1 100644 --- a/docs/hand_wire.md +++ b/docs/hand_wire.md @@ -162,7 +162,7 @@ The pins you'll absolutely have to avoid, as with any controller, are: GND, VCC, Cut wires to the length of the distance from the a point on each column/row to the controller. You can solder anywhere along the row, as long as it's after the diode - soldering before the diode (on the keyswitch side) will cause that row not to work. -Ribbon cable can be used to keep this extra tidy. You may also want to consider routing the wires beneath the exisiting columns/rows. +Ribbon cable can be used to keep this extra tidy. You may also want to consider routing the wires beneath the existing columns/rows. Ribbon Cable @@ -188,7 +188,7 @@ qmk import-kbfirmware /path/to/export.json For example: ``` -$ qmk import-kbfirmware ~/Downloads/gh62.json +$ qmk import-kbfirmware ~/Downloads/gh62.json Ψ Importing gh62.json. ⚠ Support here is basic - Consider using 'qmk new-keyboard' instead @@ -227,16 +227,16 @@ If you've done all of these things, keep in mind that sometimes you might have h ## Finishing up -Once you have confirmed that the keyboard is working, if you have used a seperate (non handwire specific) controller you will want to secure it in place. This can be done in many different ways e.g. hot glue, double sided sticky tape, 3D printed caddy, electrical tape. +Once you have confirmed that the keyboard is working, if you have used a separate (non handwire specific) controller you will want to secure it in place. This can be done in many different ways e.g. hot glue, double sided sticky tape, 3D printed caddy, electrical tape. -If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/) +If you found this fulfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/) There are a lot of possibilities inside the firmware - explore [the documentation](/) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help! ## Links to Other Guides - [matt3o's step by step guide (BrownFox build)](https://deskthority.net/viewtopic.php?f=7&t=6050) also his [website](https://matt3o.com/hand-wiring-a-custom-keyboard/) and [video guide](https://www.youtube.com/watch?v=LVzpsjFWPP4) -- [Cribbit's "Modern hand wiring guide - stronger, cleaner, easier"](https://geekhack.org/index.php?topic=87689.0) +- [Cribbit's "Modern hand wiring guide - stronger, cleaner, easier"](https://geekhack.org/index.php?topic=87689.0) - [Sasha Solomon's "Building my first Keyboard"](https://medium.com/@sachee/building-my-first-keyboard-and-you-can-too-512c0f8a4c5f) - [RoastPotatoes' "How to hand wire a Planck"](https://blog.roastpotatoes.co/guide/2015/11/04/how-to-handwire-a-planck/) - [Masterzen's "Handwired keyboard build log"](https://www.masterzen.fr/2018/12/16/handwired-keyboard-build-log-part-1/) diff --git a/docs/hardware_drivers.md b/docs/hardware_drivers.md index 694d46971a..40a25d9fa7 100644 --- a/docs/hardware_drivers.md +++ b/docs/hardware_drivers.md @@ -24,7 +24,7 @@ Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light] ## IS31FL3731 -Support for up to 2 drivers. Each driver impliments 2 charlieplex matrices to individually address LEDs using I2C. This allows up to 144 same color LEDs or 32 RGB LEDs. For more information on how to setup the driver see the [RGB Matrix](features/rgb_matrix) page. +Support for up to 2 drivers. Each driver implements 2 charlieplex matrices to individually address LEDs using I2C. This allows up to 144 same color LEDs or 32 RGB LEDs. For more information on how to setup the driver see the [RGB Matrix](features/rgb_matrix) page. ## IS31FL3733 diff --git a/docs/quantum_painter_lvgl.md b/docs/quantum_painter_lvgl.md index 40b3c3b2f1..0ff0e321ec 100644 --- a/docs/quantum_painter_lvgl.md +++ b/docs/quantum_painter_lvgl.md @@ -5,7 +5,7 @@ LVGL (Light and Versatile Graphics Library) is an open-source graphics library p LVGL integrates with [Quantum Painter's](quantum_painter) API and drivers to render to the display, the hardware supported by Quantum Painter is also supported by LVGL. ::: tip -Keep in mind that enabling the LVGL integration has a big impact in firmware size, it is recommeded to use a supported MCU with >256 kB of flash space. +Keep in mind that enabling the LVGL integration has a big impact in firmware size, it is recommended to use a supported MCU with >256 kB of flash space. ::: To learn more about LVGL and how to use it please take a look at their [official documentation](https://docs.lvgl.io/8.2/intro/) @@ -35,7 +35,7 @@ static painter_device_t display; void keyboard_post_init_kb(void) { display = qp_make_.......; // Create the display qp_init(display, QP_ROTATION_0); // Initialise the display - + if (qp_lvgl_attach(display)) { // Attach LVGL to the display ...Your code to draw // Run LVGL specific code to draw } diff --git a/docs/squeezing_avr.md b/docs/squeezing_avr.md index c3f3d3c6e1..458b442d59 100644 --- a/docs/squeezing_avr.md +++ b/docs/squeezing_avr.md @@ -5,14 +5,14 @@ AVR is severely resource-constrained, and as QMK continues to grow, it is approa However, if you need to reduce the compiled size of your firmware to fit the controller's limited flash size, there are a number of options to do so. ## `rules.mk` Settings -First and foremost is enabling link time optimization. To do so, add this to your rules.mk: +First and foremost is enabling link time optimization. To do so, add this to your rules.mk: ```make LTO_ENABLE = yes ``` This will cause the final step to take longer, but should get you a smaller compiled size. This also disables Action Functions, and Action Macros, both of which are deprecated. This will get you the most savings, in most situations. -From there, disabling extraneous systems will help -- e.g.: +From there, disabling extraneous systems will help -- e.g.: ```make CONSOLE_ENABLE = no COMMAND_ENABLE = no @@ -21,10 +21,10 @@ EXTRAKEY_ENABLE = no ``` This disables some of the functionality that you may not need. But note that extrakeys disables stuff like the media keys and system volume control. -If that isn't enough to get your firmware down to size, then there are some additional features that you can disable: +If that isn't enough to get your firmware down to size, then there are some additional features that you can disable: ```make SPACE_CADET_ENABLE = no -GRAVE_ESC_ENABLE = no +GRAVE_ESC_ENABLE = no MAGIC_ENABLE = no ``` These features are enabled by default, but they may not be needed. Double check to make sure. The [Magic Keycodes](keycodes_magic) are the largest and control things like NKRO toggling, GUI and ALT/CTRL swapping, etc. Disabling them will disable those functions. See [Magic Functions](#magic-functions) for disabling related functions. @@ -51,7 +51,7 @@ Starting with Lock Key support. If you have a Cherry MX Lock switch (lucky you!) #undef LOCKING_SUPPORT_ENABLE #undef LOCKING_RESYNC_ENABLE ``` -Oneshots. If you're not using these, you can disable the feature by adding this to your `config.h`: +Oneshots. If you're not using these, you can disable the feature by adding this to your `config.h`: ```c #define NO_ACTION_ONESHOT ``` @@ -61,7 +61,7 @@ The same with tapping keys (mod tap, layer tap, etc) ``` ## Audio Settings -If you're using the Audio feature, by default that includes the music mode feature. This tranlates matrix positions into notes. It's neat for sure, but most likely, you're not using it. You can disable it by adding this to your `config.h`: +If you're using the Audio feature, by default that includes the music mode feature. This translates matrix positions into notes. It's neat for sure, but most likely, you're not using it. You can disable it by adding this to your `config.h`: ```c #define NO_MUSIC_MODE ``` @@ -124,7 +124,7 @@ into this: oled_write_P(PSTR("WPM: "), false); oled_write(get_u8_str(get_current_wpm(), ' '), false); ``` -which outputs `WPM: 5`. Or this: +which outputs `WPM: 5`. Or this: ```c // NEW CODE oled_write_P(PSTR("WPM: "), false); diff --git a/docs/usb_nkro.txt b/docs/usb_nkro.txt index d9f1d12292..5817291b6b 100644 --- a/docs/usb_nkro.txt +++ b/docs/usb_nkro.txt @@ -58,7 +58,7 @@ USB NKRO methods Report Format ------------- -Other report formats than followings are possible, though these format are typical one. +Other report formats than following are possible, though these format are typical one. 1. Standard 8bytes modifiers(bitmap) 1byte diff --git a/drivers/lcd/st7565.h b/drivers/lcd/st7565.h index 0e42c8765b..7ab10e23ed 100644 --- a/drivers/lcd/st7565.h +++ b/drivers/lcd/st7565.h @@ -116,12 +116,12 @@ void st7565_render(void); void st7565_set_cursor(uint8_t col, uint8_t line); // Advances the cursor to the next page, writing ' ' if true -// Wraps to the begining when out of bounds +// Wraps to the beginning when out of bounds void st7565_advance_page(bool clearPageRemainder); // Moves the cursor forward 1 character length // Advance page if there is not enough room for the next character -// Wraps to the begining when out of bounds +// Wraps to the beginning when out of bounds void st7565_advance_char(void); // Writes a single character to the buffer at current cursor position diff --git a/tmk_core/protocol/report.c b/tmk_core/protocol/report.c index f68334adeb..8cae256cc6 100644 --- a/tmk_core/protocol/report.c +++ b/tmk_core/protocol/report.c @@ -62,7 +62,7 @@ uint8_t get_first_key(void) { /** \brief Checks if a key is pressed in the report * * Returns true if the keyboard_report reports that the key is pressed, otherwise false - * Note: The function doesn't support modifers currently, and it returns false for KC_NO + * Note: The function doesn't support modifiers currently, and it returns false for KC_NO */ bool is_key_pressed(uint8_t key) { if (key == KC_NO) { From 65e1afe0af419fc8ad3e318376bd1cf3fea83283 Mon Sep 17 00:00:00 2001 From: diegorodriguezv Date: Tue, 9 Sep 2025 20:43:28 -0500 Subject: [PATCH 543/592] Correct link in faq_general.md (#25640) Updated the link to the QMK trademark page. --- docs/faq_general.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq_general.md b/docs/faq_general.md index fe26dc3806..c80c1b8938 100644 --- a/docs/faq_general.md +++ b/docs/faq_general.md @@ -38,7 +38,7 @@ Awesome! Open up a Pull Request for it. We'll review the code, and merge it! That's amazing! We would love to assist you with that! -In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. +In fact, we have a [whole page](https://qmk.fm/trademark) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. If you have any questions about this, open an issue or head to [Discord](https://discord.gg/qmk). From 24c05ff1c7915e3d07b2359caa0a0fc88ef02a69 Mon Sep 17 00:00:00 2001 From: diegorodriguezv Date: Tue, 9 Sep 2025 20:44:47 -0500 Subject: [PATCH 544/592] Correct link in porting_your_keyboard_to_qmk.md (#25635) Fixed anchor --- docs/porting_your_keyboard_to_qmk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/porting_your_keyboard_to_qmk.md b/docs/porting_your_keyboard_to_qmk.md index 737ec4a2cf..108576cb58 100644 --- a/docs/porting_your_keyboard_to_qmk.md +++ b/docs/porting_your_keyboard_to_qmk.md @@ -164,7 +164,7 @@ There are a lot of features that can be turned on or off, configured or tuned. S ### Configuration Options -For available options for `config.h`, you should see the [Config Options](config_options#the-configh-file) page for more details. +For available options for `config.h`, you should see the [Config Options](config_options#the-config-h-file) page for more details. ### Build Options From c4ccbf06e147ce8d50b2629fb32e39ce56b4fb04 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Wed, 10 Sep 2025 09:11:46 +0100 Subject: [PATCH 545/592] Fix silakka54 layout (#25643) --- keyboards/silakka54/keyboard.json | 56 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/keyboards/silakka54/keyboard.json b/keyboards/silakka54/keyboard.json index f04b67d3aa..e621a10b37 100644 --- a/keyboards/silakka54/keyboard.json +++ b/keyboards/silakka54/keyboard.json @@ -40,12 +40,12 @@ {"matrix": [0, 4], "x": 4, "y": 0}, {"matrix": [0, 5], "x": 5, "y": 0}, - {"matrix": [5, 5], "x": 0, "y": 5}, - {"matrix": [5, 4], "x": 1, "y": 5}, - {"matrix": [5, 3], "x": 2, "y": 5}, - {"matrix": [5, 2], "x": 3, "y": 5}, - {"matrix": [5, 1], "x": 4, "y": 5}, - {"matrix": [5, 0], "x": 5, "y": 5}, + {"matrix": [5, 5], "x": 7, "y": 0}, + {"matrix": [5, 4], "x": 8, "y": 0}, + {"matrix": [5, 3], "x": 9, "y": 0}, + {"matrix": [5, 2], "x": 10, "y": 0}, + {"matrix": [5, 1], "x": 11, "y": 0}, + {"matrix": [5, 0], "x": 12, "y": 0}, {"matrix": [1, 0], "x": 0, "y": 1}, @@ -55,12 +55,12 @@ {"matrix": [1, 4], "x": 4, "y": 1}, {"matrix": [1, 5], "x": 5, "y": 1}, - {"matrix": [6, 5], "x": 0, "y": 6}, - {"matrix": [6, 4], "x": 1, "y": 6}, - {"matrix": [6, 3], "x": 2, "y": 6}, - {"matrix": [6, 2], "x": 3, "y": 6}, - {"matrix": [6, 1], "x": 4, "y": 6}, - {"matrix": [6, 0], "x": 5, "y": 6}, + {"matrix": [6, 5], "x": 7, "y": 1}, + {"matrix": [6, 4], "x": 8, "y": 1}, + {"matrix": [6, 3], "x": 9, "y": 1}, + {"matrix": [6, 2], "x": 10, "y": 1}, + {"matrix": [6, 1], "x": 11, "y": 1}, + {"matrix": [6, 0], "x": 12, "y": 1}, {"matrix": [2, 0], "x": 0, "y": 2}, {"matrix": [2, 1], "x": 1, "y": 2}, @@ -69,12 +69,12 @@ {"matrix": [2, 4], "x": 4, "y": 2}, {"matrix": [2, 5], "x": 5, "y": 2}, - {"matrix": [7, 5], "x": 0, "y": 7}, - {"matrix": [7, 4], "x": 1, "y": 7}, - {"matrix": [7, 3], "x": 2, "y": 7}, - {"matrix": [7, 2], "x": 3, "y": 7}, - {"matrix": [7, 1], "x": 4, "y": 7}, - {"matrix": [7, 0], "x": 5, "y": 7}, + {"matrix": [7, 5], "x": 7, "y": 2}, + {"matrix": [7, 4], "x": 8, "y": 2}, + {"matrix": [7, 3], "x": 9, "y": 2}, + {"matrix": [7, 2], "x": 10, "y": 2}, + {"matrix": [7, 1], "x": 11, "y": 2}, + {"matrix": [7, 0], "x": 12, "y": 2}, {"matrix": [3, 0], "x": 0, "y": 3}, {"matrix": [3, 1], "x": 1, "y": 3}, @@ -83,22 +83,20 @@ {"matrix": [3, 4], "x": 4, "y": 3}, {"matrix": [3, 5], "x": 5, "y": 3}, - {"matrix": [8, 5], "x": 0, "y": 9}, - {"matrix": [8, 4], "x": 1, "y": 9}, - {"matrix": [8, 3], "x": 2, "y": 9}, - {"matrix": [8, 2], "x": 3, "y": 9}, - {"matrix": [8, 1], "x": 4, "y": 9}, - {"matrix": [8, 0], "x": 5, "y": 9}, + {"matrix": [8, 5], "x": 7, "y": 3}, + {"matrix": [8, 4], "x": 8, "y": 3}, + {"matrix": [8, 3], "x": 9, "y": 3}, + {"matrix": [8, 2], "x": 10, "y": 3}, + {"matrix": [8, 1], "x": 11, "y": 3}, + {"matrix": [8, 0], "x": 12, "y": 3}, {"matrix": [4, 3], "x": 3, "y": 4}, {"matrix": [4, 4], "x": 4, "y": 4}, {"matrix": [4, 5], "x": 5, "y": 4}, - {"matrix": [9, 5], "x": 3, "y": 9}, - {"matrix": [9, 4], "x": 4, "y": 9}, - {"matrix": [9, 3], "x": 5, "y": 9} - - + {"matrix": [9, 5], "x": 7, "y": 4}, + {"matrix": [9, 4], "x": 8, "y": 4}, + {"matrix": [9, 3], "x": 9, "y": 4} ] } } From b4bdf3f1d5bb1c8926ca3b519e56e75f069376f9 Mon Sep 17 00:00:00 2001 From: diegorodriguezv Date: Wed, 10 Sep 2025 03:52:25 -0500 Subject: [PATCH 546/592] Update data_driven_config.md (#25612) --- docs/data_driven_config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/data_driven_config.md b/docs/data_driven_config.md index 2c1a56e004..a97b314a2f 100644 --- a/docs/data_driven_config.md +++ b/docs/data_driven_config.md @@ -6,7 +6,7 @@ This page describes how QMK's data driven JSON configuration system works. It is Historically QMK has been configured through a combination of two mechanisms- `rules.mk` and `config.h`. While this worked well when QMK was only a handful of keyboards we've grown to encompass nearly 4000 supported keyboards. That extrapolates out to 6000 configuration files under `keyboards/` alone! The freeform nature of these files and the unique patterns people have used to avoid duplication have made ongoing maintenance a challenge, and a large number of our keyboards follow patterns that are outdated and sometimes harder to understand. -We have also been working on bringing the power of QMK to people who aren't comformable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use. +We have also been working on bringing the power of QMK to people who aren't comfortable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use. Now we have support for generating `rules.mk` and `config.h` values from `info.json`, allowing us to have a single source of truth. This will allow us to use automated tooling to maintain keyboards saving a lot of time and maintenance work. From fc55fcff3d28ca2c5b6c9b54c1330d6a1d3e1faf Mon Sep 17 00:00:00 2001 From: Alex Havermale Date: Wed, 10 Sep 2025 08:28:24 -0400 Subject: [PATCH 547/592] Add `haverworks/theseus75` keyboard (#25457) Co-authored-by: Moritz --- keyboards/haverworks/theseus75/config.h | 33 ++ keyboards/haverworks/theseus75/halconf.h | 10 + keyboards/haverworks/theseus75/keyboard.json | 456 ++++++++++++++++++ .../theseus75/keymaps/ansi/keymap.c | 31 ++ .../theseus75/keymaps/ansi/rules.mk | 1 + .../theseus75/keymaps/default/keymap.c | 31 ++ .../theseus75/keymaps/default/rules.mk | 1 + .../haverworks/theseus75/keymaps/iso/keymap.c | 31 ++ .../haverworks/theseus75/keymaps/iso/rules.mk | 1 + keyboards/haverworks/theseus75/mcuconf.h | 14 + keyboards/haverworks/theseus75/readme.md | 31 ++ keyboards/haverworks/theseus75/theseus75.c | 214 ++++++++ 12 files changed, 854 insertions(+) create mode 100644 keyboards/haverworks/theseus75/config.h create mode 100644 keyboards/haverworks/theseus75/halconf.h create mode 100644 keyboards/haverworks/theseus75/keyboard.json create mode 100644 keyboards/haverworks/theseus75/keymaps/ansi/keymap.c create mode 100644 keyboards/haverworks/theseus75/keymaps/ansi/rules.mk create mode 100644 keyboards/haverworks/theseus75/keymaps/default/keymap.c create mode 100644 keyboards/haverworks/theseus75/keymaps/default/rules.mk create mode 100644 keyboards/haverworks/theseus75/keymaps/iso/keymap.c create mode 100644 keyboards/haverworks/theseus75/keymaps/iso/rules.mk create mode 100644 keyboards/haverworks/theseus75/mcuconf.h create mode 100644 keyboards/haverworks/theseus75/readme.md create mode 100644 keyboards/haverworks/theseus75/theseus75.c diff --git a/keyboards/haverworks/theseus75/config.h b/keyboards/haverworks/theseus75/config.h new file mode 100644 index 0000000000..7627837e76 --- /dev/null +++ b/keyboards/haverworks/theseus75/config.h @@ -0,0 +1,33 @@ +// Copyright 2023 Moritz Plattner (@ebastler), Alex Havermale (@haversnail) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Defines for configuring the serial driver for split comms (see https://docs.qmk.fm/drivers/serial) */ +#define SERIAL_USART_DRIVER SD3 // USART 3 + +/* Defines for required pins */ +#define ID_PIN A13 +#define USBSW_PIN A14 // Switches the hub input/output with the MUXes +#define PSW_PIN A15 // Turns the power routing to the USB-C port on/off +#define BUS_B_PIN C13 // Tells the hub to be bus-powered or self-powered (which in turn tells the clients to use 100 mA or 500 mA) +#define USB_VBUS_PIN C15 // Only the master side will have VBUS present at power-up (used to determine master/slave) +#define USBPD_1_PIN F0 +#define USBPD_2_PIN F1 + +/* Additional defines for managing power and state scross split */ +#define DISABLE_BUS_POWER_MODE TRUE +#define KB_STATE_SYNC_INTERVAL 500 +#define USBPD_ALLOWANCE_CHECK_INTERVAL 100 +#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_STATE + +/* Defines for the RGB matrix */ +#define INDICATOR_MAX_BRIGHTNESS 255 +#define CAPS_LOCK_LED_INDEX 0 // LED1 on PCB +#define WS2812_EXTERNAL_PULLUP +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 4 +#define WS2812_PWM_PAL_MODE 10 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_DMA_CHANNEL 2 +#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP diff --git a/keyboards/haverworks/theseus75/halconf.h b/keyboards/haverworks/theseus75/halconf.h new file mode 100644 index 0000000000..e7da7271bb --- /dev/null +++ b/keyboards/haverworks/theseus75/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2023 Moritz Plattner (@ebastler) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SERIAL TRUE + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/haverworks/theseus75/keyboard.json b/keyboards/haverworks/theseus75/keyboard.json new file mode 100644 index 0000000000..60f791ae9d --- /dev/null +++ b/keyboards/haverworks/theseus75/keyboard.json @@ -0,0 +1,456 @@ +{ + "manufacturer": "Haverworks", + "keyboard_name": "Theseus75", + "maintainer": "ebastler", + "bootloader": "stm32-dfu", + "bootmagic": { + "matrix": [0, 1] + }, + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A8", "pin_b": "C6", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["B11", "C14", "B6", "B5", "B4", "B3", "C11", "C10", null], + "rows": ["A9", "A10", "B15", "B12", "B13", "B14"] + }, + "processor": "STM32G431", + "rgb_matrix": { + "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, + "dual_beacon": true, + "gradient_left_right": true, + "gradient_up_down": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "jellybean_raindrops": true, + "pixel_flow": true, + "pixel_fractal": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [3, 1], "x": 32, "y": 34, "flags": 8}, + {"x": 28, "y": 1, "flags": 2}, + {"x": 43, "y": 1, "flags": 2}, + {"x": 56, "y": 1, "flags": 2}, + {"x": 69, "y": 1, "flags": 2}, + {"x": 84, "y": 1, "flags": 2}, + {"x": 99, "y": 1, "flags": 2}, + {"x": 97, "y": 8, "flags": 2}, + {"x": 91, "y": 19, "flags": 2}, + {"x": 91, "y": 31, "flags": 2}, + {"x": 92, "y": 42, "flags": 2}, + {"x": 96, "y": 53, "flags": 2}, + {"x": 97, "y": 64, "flags": 2}, + {"x": 81, "y": 64, "flags": 2}, + {"x": 66, "y": 64, "flags": 2}, + {"x": 53, "y": 64, "flags": 2}, + {"x": 40, "y": 64, "flags": 2}, + {"x": 26, "y": 64, "flags": 2}, + {"x": 13, "y": 64, "flags": 2}, + {"x": 0, "y": 64, "flags": 2}, + {"x": 0, "y": 53, "flags": 2}, + {"x": 0, "y": 42, "flags": 2}, + {"x": 0, "y": 31, "flags": 2}, + {"x": 0, "y": 19, "flags": 2}, + {"x": 0, "y": 9, "flags": 2}, + {"x": 0, "y": 1, "flags": 2}, + {"x": 13, "y": 1, "flags": 2}, + {"x": 224, "y": 31, "flags": 2}, + {"x": 224, "y": 42, "flags": 2}, + {"x": 224, "y": 53, "flags": 2}, + {"x": 224, "y": 64, "flags": 2}, + {"x": 209, "y": 64, "flags": 2}, + {"x": 194, "y": 64, "flags": 2}, + {"x": 180, "y": 64, "flags": 2}, + {"x": 165, "y": 64, "flags": 2}, + {"x": 152, "y": 64, "flags": 2}, + {"x": 138, "y": 64, "flags": 2}, + {"x": 124, "y": 64, "flags": 2}, + {"x": 124, "y": 53, "flags": 2}, + {"x": 119, "y": 42, "flags": 2}, + {"x": 114, "y": 31, "flags": 2}, + {"x": 117, "y": 19, "flags": 2}, + {"x": 122, "y": 8, "flags": 2}, + {"x": 126, "y": 1, "flags": 2}, + {"x": 140, "y": 1, "flags": 2}, + {"x": 155, "y": 1, "flags": 2}, + {"x": 168, "y": 1, "flags": 2}, + {"x": 181, "y": 1, "flags": 2}, + {"x": 196, "y": 1, "flags": 2}, + {"x": 211, "y": 1, "flags": 2}, + {"x": 224, "y": 1, "flags": 2}, + {"x": 224, "y": 8, "flags": 2}, + {"x": 224, "y": 19, "flags": 2} + ], + "max_brightness": 128, + "sleep": true, + "split_count": [27, 26] + }, + "split": { + "bootmagic": { + "matrix": [6, 6] + }, + "enabled": true, + "encoder": { + "right": { + "rotary": [ + {"pin_a": "B5", "pin_b": "B4", "resolution": 2} + ] + } + }, + "handedness": { + "pin": "B9" + }, + "matrix_pins": { + "right": { + "cols": ["A10", "A9", "A8", "C6", "B15", "B14", "B13", "B12", "C14"], + "rows": ["B3", "C10", "C11", "A1", "A0", "B6"] + } + }, + "serial": { + "driver": "usart", + "pin": "B10" + }, + "soft_serial_speed": 0, + "transport": { + "sync": { + "indicators": true, + "layer_state": true, + "matrix_state": true + }, + "watchdog": true + } + }, + "url": "https://haver.works/theseus75", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x6877" + }, + "ws2812": { + "driver": "pwm", + "pin": "B7" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label": "LENC", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "ESC", "matrix": [0, 1], "x": 1.5, "y": 0}, + {"label": "F1", "matrix": [0, 2], "x": 2.75, "y": 0}, + {"label": "F2", "matrix": [0, 3], "x": 3.75, "y": 0}, + {"label": "F3", "matrix": [0, 4], "x": 4.75, "y": 0}, + {"label": "F4", "matrix": [0, 5], "x": 5.75, "y": 0}, + {"label": "F5", "matrix": [0, 6], "x": 7, "y": 0}, + {"label": "F6", "matrix": [0, 7], "x": 8, "y": 0}, + {"label": "F7", "matrix": [6, 0], "x": 10, "y": 0}, + {"label": "F8", "matrix": [6, 1], "x": 11, "y": 0}, + {"label": "F9", "matrix": [6, 2], "x": 12.25, "y": 0}, + {"label": "F10", "matrix": [6, 3], "x": 13.25, "y": 0}, + {"label": "F11", "matrix": [6, 4], "x": 14.25, "y": 0}, + {"label": "F12", "matrix": [6, 5], "x": 15.25, "y": 0}, + {"label": "F13", "matrix": [6, 6], "x": 16.5, "y": 0}, + {"label": "RENC", "matrix": [6, 8], "x": 18, "y": 0}, + {"label": "M1", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "GRAV", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "1", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "2", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "3", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "4", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "5", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "6", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "7", "matrix": [7, 0], "x": 9.5, "y": 1}, + {"label": "8", "matrix": [7, 1], "x": 10.5, "y": 1}, + {"label": "9", "matrix": [7, 2], "x": 11.5, "y": 1}, + {"label": "0", "matrix": [7, 3], "x": 12.5, "y": 1}, + {"label": "-", "matrix": [7, 4], "x": 13.5, "y": 1}, + {"label": "=", "matrix": [7, 5], "x": 14.5, "y": 1}, + {"label": "Back", "matrix": [7, 6], "x": 15.5, "y": 1}, + {"label": "Del", "matrix": [7, 7], "x": 16.5, "y": 1}, + {"label": "Home", "matrix": [7, 8], "x": 18, "y": 1}, + {"label": "M2", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "Tab", "matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.5}, + {"label": "Q", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "W", "matrix": [2, 4], "x": 4, "y": 2}, + {"label": "E", "matrix": [2, 5], "x": 5, "y": 2}, + {"label": "R", "matrix": [2, 6], "x": 6, "y": 2}, + {"label": "T", "matrix": [2, 7], "x": 7, "y": 2}, + {"label": "Y", "matrix": [8, 0], "x": 9, "y": 2}, + {"label": "U", "matrix": [8, 1], "x": 10, "y": 2}, + {"label": "I", "matrix": [8, 2], "x": 11, "y": 2}, + {"label": "O", "matrix": [8, 3], "x": 12, "y": 2}, + {"label": "P", "matrix": [8, 4], "x": 13, "y": 2}, + {"label": "[", "matrix": [8, 5], "x": 14, "y": 2}, + {"label": "]", "matrix": [8, 6], "x": 15, "y": 2}, + {"label": "BSLS", "matrix": [8, 7], "x": 16, "y": 2, "w": 1.5}, + {"label": "PgUp", "matrix": [8, 8], "x": 18, "y": 2}, + {"label": "M3", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Caps", "matrix": [3, 1], "x": 1.5, "y": 3, "w": 1.75}, + {"label": "A", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "S", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "D", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "F", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "G", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "H", "matrix": [9, 0], "x": 9.25, "y": 3}, + {"label": "J", "matrix": [9, 1], "x": 10.25, "y": 3}, + {"label": "K", "matrix": [9, 2], "x": 11.25, "y": 3}, + {"label": "L", "matrix": [9, 3], "x": 12.25, "y": 3}, + {"label": ";", "matrix": [9, 4], "x": 13.25, "y": 3}, + {"label": "'", "matrix": [9, 5], "x": 14.25, "y": 3}, + {"label": "NUHS", "matrix": [9, 6], "x": 15.25, "y": 3}, + {"label": "Enter", "matrix": [9, 7], "x": 16.25, "y": 3, "w": 1.25}, + {"label": "PgDn", "matrix": [9, 8], "x": 18, "y": 3}, + {"label": "M4", "matrix": [4, 0], "x": 0, "y": 4}, + {"label": "Shift", "matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.25}, + {"label": "NUBS", "matrix": [4, 2], "x": 2.75, "y": 4}, + {"label": "Z", "matrix": [4, 3], "x": 3.75, "y": 4}, + {"label": "X", "matrix": [4, 4], "x": 4.75, "y": 4}, + {"label": "C", "matrix": [4, 5], "x": 5.75, "y": 4}, + {"label": "V", "matrix": [4, 6], "x": 6.75, "y": 4}, + {"label": "B", "matrix": [4, 7], "x": 7.75, "y": 4}, + {"label": "N", "matrix": [10, 0], "x": 9.75, "y": 4}, + {"label": "M", "matrix": [10, 1], "x": 10.75, "y": 4}, + {"label": ",", "matrix": [10, 2], "x": 11.75, "y": 4}, + {"label": ".", "matrix": [10, 3], "x": 12.75, "y": 4}, + {"label": "/", "matrix": [10, 4], "x": 13.75, "y": 4}, + {"label": "Shift", "matrix": [10, 6], "x": 14.75, "y": 4, "w": 1.75}, + {"label": "Up", "matrix": [10, 7], "x": 16.75, "y": 4}, + {"label": "End", "matrix": [10, 8], "x": 18, "y": 4}, + {"label": "M5", "matrix": [5, 0], "x": 0, "y": 5}, + {"label": "Ctrl", "matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.25}, + {"label": "Gui", "matrix": [5, 2], "x": 2.75, "y": 5, "w": 1.25}, + {"label": "Alt", "matrix": [5, 3], "x": 4, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [5, 4], "x": 5.25, "y": 5, "w": 2.25}, + {"label": "FN", "matrix": [5, 7], "x": 7.5, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [11, 1], "x": 9.75, "y": 5, "w": 2.75}, + {"label": "Alt", "matrix": [11, 3], "x": 12.5, "y": 5}, + {"label": "Gui", "matrix": [11, 4], "x": 13.5, "y": 5}, + {"label": "Ctrl", "matrix": [11, 5], "x": 14.5, "y": 5}, + {"label": "Left", "matrix": [11, 6], "x": 15.75, "y": 5}, + {"label": "Down", "matrix": [11, 7], "x": 16.75, "y": 5}, + {"label": "Rght", "matrix": [11, 8], "x": 17.75, "y": 5} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"label": "LENC", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "ESC", "matrix": [0, 1], "x": 1.5, "y": 0}, + {"label": "F1", "matrix": [0, 2], "x": 2.75, "y": 0}, + {"label": "F2", "matrix": [0, 3], "x": 3.75, "y": 0}, + {"label": "F3", "matrix": [0, 4], "x": 4.75, "y": 0}, + {"label": "F4", "matrix": [0, 5], "x": 5.75, "y": 0}, + {"label": "F5", "matrix": [0, 6], "x": 7, "y": 0}, + {"label": "F6", "matrix": [0, 7], "x": 8, "y": 0}, + {"label": "F7", "matrix": [6, 0], "x": 10, "y": 0}, + {"label": "F8", "matrix": [6, 1], "x": 11, "y": 0}, + {"label": "F9", "matrix": [6, 2], "x": 12.25, "y": 0}, + {"label": "F10", "matrix": [6, 3], "x": 13.25, "y": 0}, + {"label": "F11", "matrix": [6, 4], "x": 14.25, "y": 0}, + {"label": "F12", "matrix": [6, 5], "x": 15.25, "y": 0}, + {"label": "F13", "matrix": [6, 6], "x": 16.5, "y": 0}, + {"label": "RENC", "matrix": [6, 8], "x": 18, "y": 0}, + {"label": "M1", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "GRAV", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "1", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "2", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "3", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "4", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "5", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "6", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "7", "matrix": [7, 0], "x": 9.5, "y": 1}, + {"label": "8", "matrix": [7, 1], "x": 10.5, "y": 1}, + {"label": "9", "matrix": [7, 2], "x": 11.5, "y": 1}, + {"label": "0", "matrix": [7, 3], "x": 12.5, "y": 1}, + {"label": "-", "matrix": [7, 4], "x": 13.5, "y": 1}, + {"label": "=", "matrix": [7, 5], "x": 14.5, "y": 1}, + {"label": "Back", "matrix": [7, 6], "x": 15.5, "y": 1, "w": 2}, + {"label": "Home", "matrix": [7, 8], "x": 18, "y": 1}, + {"label": "M2", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "Tab", "matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.5}, + {"label": "Q", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "W", "matrix": [2, 4], "x": 4, "y": 2}, + {"label": "E", "matrix": [2, 5], "x": 5, "y": 2}, + {"label": "R", "matrix": [2, 6], "x": 6, "y": 2}, + {"label": "T", "matrix": [2, 7], "x": 7, "y": 2}, + {"label": "Y", "matrix": [8, 0], "x": 9, "y": 2}, + {"label": "U", "matrix": [8, 1], "x": 10, "y": 2}, + {"label": "I", "matrix": [8, 2], "x": 11, "y": 2}, + {"label": "O", "matrix": [8, 3], "x": 12, "y": 2}, + {"label": "P", "matrix": [8, 4], "x": 13, "y": 2}, + {"label": "[", "matrix": [8, 5], "x": 14, "y": 2}, + {"label": "]", "matrix": [8, 6], "x": 15, "y": 2}, + {"label": "BSLS", "matrix": [8, 7], "x": 16, "y": 2, "w": 1.5}, + {"label": "PgUp", "matrix": [8, 8], "x": 18, "y": 2}, + {"label": "M3", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Caps", "matrix": [3, 1], "x": 1.5, "y": 3, "w": 1.75}, + {"label": "A", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "S", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "D", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "F", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "G", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "H", "matrix": [9, 0], "x": 9.25, "y": 3}, + {"label": "J", "matrix": [9, 1], "x": 10.25, "y": 3}, + {"label": "K", "matrix": [9, 2], "x": 11.25, "y": 3}, + {"label": "L", "matrix": [9, 3], "x": 12.25, "y": 3}, + {"label": ";", "matrix": [9, 4], "x": 13.25, "y": 3}, + {"label": "'", "matrix": [9, 5], "x": 14.25, "y": 3}, + {"label": "Enter", "matrix": [9, 7], "x": 15.25, "y": 3, "w": 2.25}, + {"label": "PgDn", "matrix": [9, 8], "x": 18, "y": 3}, + {"label": "M4", "matrix": [4, 0], "x": 0, "y": 4}, + {"label": "Shift", "matrix": [4, 1], "x": 1.5, "y": 4, "w": 2.25}, + {"label": "Z", "matrix": [4, 3], "x": 3.75, "y": 4}, + {"label": "X", "matrix": [4, 4], "x": 4.75, "y": 4}, + {"label": "C", "matrix": [4, 5], "x": 5.75, "y": 4}, + {"label": "V", "matrix": [4, 6], "x": 6.75, "y": 4}, + {"label": "B", "matrix": [4, 7], "x": 7.75, "y": 4}, + {"label": "N", "matrix": [10, 0], "x": 9.75, "y": 4}, + {"label": "M", "matrix": [10, 1], "x": 10.75, "y": 4}, + {"label": ",", "matrix": [10, 2], "x": 11.75, "y": 4}, + {"label": ".", "matrix": [10, 3], "x": 12.75, "y": 4}, + {"label": "/", "matrix": [10, 4], "x": 13.75, "y": 4}, + {"label": "Shift", "matrix": [10, 6], "x": 14.75, "y": 4, "w": 1.75}, + {"label": "Up", "matrix": [10, 7], "x": 16.75, "y": 4}, + {"label": "End", "matrix": [10, 8], "x": 18, "y": 4}, + {"label": "M5", "matrix": [5, 0], "x": 0, "y": 5}, + {"label": "Ctrl", "matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.25}, + {"label": "Gui", "matrix": [5, 2], "x": 2.75, "y": 5, "w": 1.25}, + {"label": "Alt", "matrix": [5, 3], "x": 4, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [5, 4], "x": 5.25, "y": 5, "w": 2.25}, + {"label": "FN", "matrix": [5, 7], "x": 7.5, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [11, 1], "x": 9.75, "y": 5, "w": 2.75}, + {"label": "Alt", "matrix": [11, 3], "x": 12.5, "y": 5}, + {"label": "Gui", "matrix": [11, 4], "x": 13.5, "y": 5}, + {"label": "Ctrl", "matrix": [11, 5], "x": 14.5, "y": 5}, + {"label": "Left", "matrix": [11, 6], "x": 15.75, "y": 5}, + {"label": "Down", "matrix": [11, 7], "x": 16.75, "y": 5}, + {"label": "Rght", "matrix": [11, 8], "x": 17.75, "y": 5} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"label": "LENC", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "ESC", "matrix": [0, 1], "x": 1.5, "y": 0}, + {"label": "F1", "matrix": [0, 2], "x": 2.75, "y": 0}, + {"label": "F2", "matrix": [0, 3], "x": 3.75, "y": 0}, + {"label": "F3", "matrix": [0, 4], "x": 4.75, "y": 0}, + {"label": "F4", "matrix": [0, 5], "x": 5.75, "y": 0}, + {"label": "F5", "matrix": [0, 6], "x": 7, "y": 0}, + {"label": "F6", "matrix": [0, 7], "x": 8, "y": 0}, + {"label": "F7", "matrix": [6, 0], "x": 10, "y": 0}, + {"label": "F8", "matrix": [6, 1], "x": 11, "y": 0}, + {"label": "F9", "matrix": [6, 2], "x": 12.25, "y": 0}, + {"label": "F10", "matrix": [6, 3], "x": 13.25, "y": 0}, + {"label": "F11", "matrix": [6, 4], "x": 14.25, "y": 0}, + {"label": "F12", "matrix": [6, 5], "x": 15.25, "y": 0}, + {"label": "F13", "matrix": [6, 6], "x": 16.5, "y": 0}, + {"label": "RENC", "matrix": [6, 8], "x": 18, "y": 0}, + {"label": "M1", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "GRAV", "matrix": [1, 1], "x": 1.5, "y": 1}, + {"label": "1", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "2", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "3", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "4", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "5", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "6", "matrix": [1, 7], "x": 7.5, "y": 1}, + {"label": "7", "matrix": [7, 0], "x": 9.5, "y": 1}, + {"label": "8", "matrix": [7, 1], "x": 10.5, "y": 1}, + {"label": "9", "matrix": [7, 2], "x": 11.5, "y": 1}, + {"label": "0", "matrix": [7, 3], "x": 12.5, "y": 1}, + {"label": "-", "matrix": [7, 4], "x": 13.5, "y": 1}, + {"label": "=", "matrix": [7, 5], "x": 14.5, "y": 1}, + {"label": "Back", "matrix": [7, 6], "x": 15.5, "y": 1, "w": 2}, + {"label": "Home", "matrix": [7, 8], "x": 18, "y": 1}, + {"label": "M2", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "Tab", "matrix": [2, 1], "x": 1.5, "y": 2, "w": 1.5}, + {"label": "Q", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "W", "matrix": [2, 4], "x": 4, "y": 2}, + {"label": "E", "matrix": [2, 5], "x": 5, "y": 2}, + {"label": "R", "matrix": [2, 6], "x": 6, "y": 2}, + {"label": "T", "matrix": [2, 7], "x": 7, "y": 2}, + {"label": "Y", "matrix": [8, 0], "x": 9, "y": 2}, + {"label": "U", "matrix": [8, 1], "x": 10, "y": 2}, + {"label": "I", "matrix": [8, 2], "x": 11, "y": 2}, + {"label": "O", "matrix": [8, 3], "x": 12, "y": 2}, + {"label": "P", "matrix": [8, 4], "x": 13, "y": 2}, + {"label": "[", "matrix": [8, 5], "x": 14, "y": 2}, + {"label": "]", "matrix": [8, 6], "x": 15, "y": 2}, + {"label": "PgUp", "matrix": [8, 8], "x": 18, "y": 2}, + {"label": "M3", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "Caps", "matrix": [3, 1], "x": 1.5, "y": 3, "w": 1.75}, + {"label": "A", "matrix": [3, 3], "x": 3.25, "y": 3}, + {"label": "S", "matrix": [3, 4], "x": 4.25, "y": 3}, + {"label": "D", "matrix": [3, 5], "x": 5.25, "y": 3}, + {"label": "F", "matrix": [3, 6], "x": 6.25, "y": 3}, + {"label": "G", "matrix": [3, 7], "x": 7.25, "y": 3}, + {"label": "H", "matrix": [9, 0], "x": 9.25, "y": 3}, + {"label": "J", "matrix": [9, 1], "x": 10.25, "y": 3}, + {"label": "K", "matrix": [9, 2], "x": 11.25, "y": 3}, + {"label": "L", "matrix": [9, 3], "x": 12.25, "y": 3}, + {"label": ";", "matrix": [9, 4], "x": 13.25, "y": 3}, + {"label": "'", "matrix": [9, 5], "x": 14.25, "y": 3}, + {"label": "NUHS", "matrix": [9, 6], "x": 15.25, "y": 3}, + {"label": "Enter", "matrix": [9, 7], "x": 16.25, "y": 2, "w": 1.25, "h": 2}, + {"label": "PgDn", "matrix": [9, 8], "x": 18, "y": 3}, + {"label": "M4", "matrix": [4, 0], "x": 0, "y": 4}, + {"label": "Shift", "matrix": [4, 1], "x": 1.5, "y": 4, "w": 1.25}, + {"label": "NUBS", "matrix": [4, 2], "x": 2.75, "y": 4}, + {"label": "Z", "matrix": [4, 3], "x": 3.75, "y": 4}, + {"label": "X", "matrix": [4, 4], "x": 4.75, "y": 4}, + {"label": "C", "matrix": [4, 5], "x": 5.75, "y": 4}, + {"label": "V", "matrix": [4, 6], "x": 6.75, "y": 4}, + {"label": "B", "matrix": [4, 7], "x": 7.75, "y": 4}, + {"label": "N", "matrix": [10, 0], "x": 9.75, "y": 4}, + {"label": "M", "matrix": [10, 1], "x": 10.75, "y": 4}, + {"label": ",", "matrix": [10, 2], "x": 11.75, "y": 4}, + {"label": ".", "matrix": [10, 3], "x": 12.75, "y": 4}, + {"label": "/", "matrix": [10, 4], "x": 13.75, "y": 4}, + {"label": "Shift", "matrix": [10, 6], "x": 14.75, "y": 4, "w": 1.75}, + {"label": "Up", "matrix": [10, 7], "x": 16.75, "y": 4}, + {"label": "End", "matrix": [10, 8], "x": 18, "y": 4}, + {"label": "M5", "matrix": [5, 0], "x": 0, "y": 5}, + {"label": "Ctrl", "matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.25}, + {"label": "Gui", "matrix": [5, 2], "x": 2.75, "y": 5, "w": 1.25}, + {"label": "Alt", "matrix": [5, 3], "x": 4, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [5, 4], "x": 5.25, "y": 5, "w": 2.25}, + {"label": "FN", "matrix": [5, 7], "x": 7.5, "y": 5, "w": 1.25}, + {"label": "Space", "matrix": [11, 1], "x": 9.75, "y": 5, "w": 2.75}, + {"label": "Alt", "matrix": [11, 3], "x": 12.5, "y": 5}, + {"label": "Gui", "matrix": [11, 4], "x": 13.5, "y": 5}, + {"label": "Ctrl", "matrix": [11, 5], "x": 14.5, "y": 5}, + {"label": "Left", "matrix": [11, 6], "x": 15.75, "y": 5}, + {"label": "Down", "matrix": [11, 7], "x": 16.75, "y": 5}, + {"label": "Rght", "matrix": [11, 8], "x": 17.75, "y": 5} + ] + } + } +} diff --git a/keyboards/haverworks/theseus75/keymaps/ansi/keymap.c b/keyboards/haverworks/theseus75/keymaps/ansi/keymap.c new file mode 100644 index 0000000000..25494f7e47 --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/ansi/keymap.c @@ -0,0 +1,31 @@ +// Copyright 2023 Moritz Plattner (@ebastler), Alex Havermale (@haversnail) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_ansi( + RM_TOGG, 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_PSCR, KC_MUTE, + KC_F13, 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_HOME, + KC_F14, 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_F15, 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_PGDN, + KC_F16, 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_END, + KC_F17, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) }, +}; +#endif diff --git a/keyboards/haverworks/theseus75/keymaps/ansi/rules.mk b/keyboards/haverworks/theseus75/keymaps/ansi/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/ansi/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/haverworks/theseus75/keymaps/default/keymap.c b/keyboards/haverworks/theseus75/keymaps/default/keymap.c new file mode 100644 index 0000000000..5e56d121eb --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +// Copyright 2023 Moritz Plattner (@ebastler), Alex Havermale (@haversnail) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + RM_TOGG, 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_PSCR, KC_MUTE, + KC_F13, 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_DEL, KC_HOME, + KC_F14, 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_F15, 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_PGDN, + KC_F16, 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_END, + KC_F17, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) }, +}; +#endif diff --git a/keyboards/haverworks/theseus75/keymaps/default/rules.mk b/keyboards/haverworks/theseus75/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/haverworks/theseus75/keymaps/iso/keymap.c b/keyboards/haverworks/theseus75/keymaps/iso/keymap.c new file mode 100644 index 0000000000..d7487010ee --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/iso/keymap.c @@ -0,0 +1,31 @@ +// Copyright 2023 Moritz Plattner (@ebastler), Alex Havermale (@haversnail) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_iso( + RM_TOGG, 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_PSCR, KC_MUTE, + KC_F13, 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_HOME, + KC_F14, 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_F15, 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_PGDN, + KC_F16, 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_END, + KC_F17, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_iso( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(RM_VALD, RM_VALU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(RM_PREV, RM_NEXT), ENCODER_CCW_CW(KC_MPRV, KC_MNXT) }, +}; +#endif diff --git a/keyboards/haverworks/theseus75/keymaps/iso/rules.mk b/keyboards/haverworks/theseus75/keymaps/iso/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/haverworks/theseus75/keymaps/iso/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/haverworks/theseus75/mcuconf.h b/keyboards/haverworks/theseus75/mcuconf.h new file mode 100644 index 0000000000..a3dbdb4ba2 --- /dev/null +++ b/keyboards/haverworks/theseus75/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2023 Moritz Plattner (@ebastler) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +/* enable USART3, used for split comms */ +#undef STM32_SERIAL_USE_USART3 +#define STM32_SERIAL_USE_USART3 TRUE + +/* enable TIM3, used for Underglow PWM driver */ +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/haverworks/theseus75/readme.md b/keyboards/haverworks/theseus75/readme.md new file mode 100644 index 0000000000..7119f61a64 --- /dev/null +++ b/keyboards/haverworks/theseus75/readme.md @@ -0,0 +1,31 @@ +# Haverworks Theseus75 + +![Theseus75 v1 PCB](https://imgur.com/N81LsCO.png) + +The Theseus75 is a 75% row-staggered split keyboard with a macro column and rotary encoders on both sides. Each half features a dual-role USB-C port and integrated USB hub, allowing the unused port to act as a USB-C 2.0 High-Speed host for connecting a numpad, mouse, flash drive, security key, mobile phone, or similar device. + +> [!NOTE] +> Up to 5V at 1.5A can be supplied, depending on negotiations with the host. + +* Keyboard Maintainers: [Moritz Plattner](https://github.com/ebastler), [Alex Havermale](https://github.com/haversnail) +* Hardware Supported: Haverworks Theseus75 v1 PCBs (hot-swap and solder) +* Hardware Availability: [Group buy](https://haver.works/theseus75) + +Make example for this keyboard (after setting up your build environment): + + make haverworks/theseus75:default + +Flashing example for this keyboard: + + make haverworks/theseus75: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 two ways: + +* **Physical reset button**: Hold the Reset/Flash button on the back of the PCB for approximately one second (instructions are also included on the PCB) +* **Bootmagic reset**: + * **Left half**: Hold down the first key to the right of the encoder (Esc by default) and plug in the keyboard + * **Right half**: Hold down the first key to the left of the encoder (Print Screen by default) and plug in the keyboard diff --git a/keyboards/haverworks/theseus75/theseus75.c b/keyboards/haverworks/theseus75/theseus75.c new file mode 100644 index 0000000000..45ead4811d --- /dev/null +++ b/keyboards/haverworks/theseus75/theseus75.c @@ -0,0 +1,214 @@ +// Copyright 2023 Moritz Plattner (@ebastler), Alex Havermale (@haversnail) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" +#include "transactions.h" +#include +#include "print.h" +#include "split_util.h" +#include "usbpd.h" + +typedef struct _kb_state_t { + usbpd_allowance_t allowance; +} kb_state_t; + +kb_state_t kb_state; + +const char* usbpd_str(usbpd_allowance_t allowance) { + switch (allowance) { + case USBPD_500MA: + return "500mA"; + case USBPD_1500MA: + return "1500mA"; + case USBPD_3000MA: + return "3000mA"; + default: + dprintf("Encountered unknown allowance enum value: %d\n", allowance); + return "UNKNOWN"; + } +} + +void kb_state_slave_handler(uint8_t m2s_size, const void* m2s_buffer, uint8_t s2m_size, void* s2m_buffer) { + if (m2s_size == sizeof(kb_state_t)) { + memcpy(&kb_state, m2s_buffer, sizeof(kb_state_t)); + } else { + dprintf("Unexpected response in slave handler\n"); // TODO: add split debug logging + } +} + +void keyboard_pre_init_kb(void) { + // Disable the PD peripheral in pre-init because its pins are being used in the matrix: + PWR->CR3 |= PWR_CR3_UCPD_DBDIS; + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_pre_init_user(); +} + +void keyboard_post_init_kb(void) { + // Register keyboard state transaction: + transaction_register_rpc(RPC_ID_KB_STATE, kb_state_slave_handler); + + // Set default state values: + kb_state.allowance = USBPD_500MA; + + // If the keyboard is master, + if (is_keyboard_master()) { + // Turn on power to the split half and to underglow LEDs: + gpio_set_pin_output(PSW_PIN); + gpio_write_pin_high(PSW_PIN); + + // Enable inputs used for current negotiation: + gpio_set_pin_input_high(USBPD_1_PIN); + gpio_set_pin_input_high(USBPD_2_PIN); + + // Not needed in this mode (always high-Z with pull-up on PCB if port controller is sink) + gpio_set_pin_input_high(ID_PIN); + } else { + // Prepare output to enable power for USB output after negotiation: + gpio_set_pin_output(PSW_PIN); + + // Switch the USB MUXes between hub and ports: + gpio_set_pin_output(USBSW_PIN); + gpio_write_pin_high(USBSW_PIN); + + // Enable outputs used for current negotiation and default to 500mA: + gpio_set_pin_output(USBPD_1_PIN); + gpio_write_pin_high(USBPD_1_PIN); + gpio_set_pin_output(USBPD_2_PIN); + gpio_write_pin_high(USBPD_2_PIN); + + // Use ID pin to check if client is detected (if low: USB source port powered): + gpio_set_pin_input_high(ID_PIN); + + // Indicate that the hub is either self-powered or bus-powered based on whether the bus-power mode flag is enabled + // (configurable for users who would rather always have their device connect, regardless of whether they meet the specs): + gpio_set_pin_output(BUS_B_PIN); + if (DISABLE_BUS_POWER_MODE == TRUE) { + gpio_write_pin_high(BUS_B_PIN); + } else { + gpio_write_pin_low(BUS_B_PIN); + } + } + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_post_init_user(); +} + +void housekeeping_task_kb(void) { + // Update any shared kb state to send to slave: + static uint32_t last_usbpd_allowance_check_time = 0; + if (timer_elapsed32(last_usbpd_allowance_check_time) > USBPD_ALLOWANCE_CHECK_INTERVAL) { + // On master side: check USBPD_1_PIN and USBPD_2_PIN to determine current negotiated with host + // (Can't use the usbpd_get_allowance() function, as this uses this uses the native CC PD interface + // of the G series MCU, while we're using dedicated port controllers instead): + if (is_keyboard_master()) { + usbpd_allowance_t allowance; + + if (gpio_read_pin(USBPD_1_PIN)) { + allowance = USBPD_500MA; + } else if (gpio_read_pin(USBPD_2_PIN)) { + allowance = USBPD_1500MA; + } else { + allowance = USBPD_3000MA; + } + + if (kb_state.allowance != allowance) { + printf("Host negotiated current: %s -> %s\n", usbpd_str(kb_state.allowance), usbpd_str(allowance)); + kb_state.allowance = allowance; + } + } else { + // On peripheral side - If ID_PIN is low: USB client negotiated 5V successfully -> enable power routing + // Check if PSW_PIN is not already high to avoid wasting time + if (!gpio_read_pin(ID_PIN) && !gpio_read_pin(PSW_PIN)) { + gpio_write_pin_high(PSW_PIN); + dprintf("USB downstream device connected\n"); // TODO: add split debug logging + } else if (gpio_read_pin(ID_PIN) && gpio_read_pin(PSW_PIN)) { + gpio_write_pin_low(PSW_PIN); + dprintf("USB downstream device disconnected\n"); // TODO: add split debug logging + } + }; + last_usbpd_allowance_check_time = timer_read32(); + }; + + // Sync state from master to slave: + if (is_keyboard_master() && is_transport_connected()) { + bool needs_sync = false; + static uint32_t last_kb_state_sync_time; + static kb_state_t last_kb_state; + + // Check if the state values are different: + if (memcmp(&kb_state, &last_kb_state, sizeof(kb_state_t))) { + needs_sync = true; + memcpy(&last_kb_state, &kb_state, sizeof(kb_state_t)); + } + + // Sync state every so often regardless: + if (timer_elapsed32(last_kb_state_sync_time) > KB_STATE_SYNC_INTERVAL) { + needs_sync = true; + } + + if (needs_sync) { + bool did_sync = transaction_rpc_send(RPC_ID_KB_STATE, sizeof(kb_state_t), &kb_state); + if (did_sync) { + dprintf("Synced to slave\n"); + last_kb_state_sync_time = timer_read32(); + } else { + dprintf("Failed to sync state\n"); + } + } + } + + // Update the USBPD output pins on slave half whenever allowance has changed: + if (!is_keyboard_master()) { + static usbpd_allowance_t last_allowance; + + if (last_allowance != kb_state.allowance) { + last_allowance = kb_state.allowance; + + printf("Setting USB-PD output to %s (%s-powered)\n", usbpd_str(kb_state.allowance), kb_state.allowance == USBPD_500MA ? "bus" : "self"); // TODO: add split debug logging + + switch (kb_state.allowance) { + default: + case USBPD_500MA: + // Set USBPD output to 500 mA: + gpio_write_pin_high(USBPD_1_PIN); + gpio_write_pin_high(USBPD_2_PIN); + if (DISABLE_BUS_POWER_MODE == TRUE) { + // Indicate hub is self-powered and devices can try to connect or fast charge: + gpio_write_pin_high(BUS_B_PIN); + } else { + // Indicate hub is bus-powered and devices should not try to connect or fast charge: + gpio_write_pin_low(BUS_B_PIN); + } + break; + case USBPD_1500MA: + // Set USBPD output to 500 mA: + gpio_write_pin_high(USBPD_1_PIN); + gpio_write_pin_high(USBPD_2_PIN); + // Indicate hub is self-powered and devices can try to connect or fast charge: + gpio_write_pin_high(BUS_B_PIN); + break; + case USBPD_3000MA: + // Set USBPD output to 1500 mA: + gpio_write_pin_low(USBPD_1_PIN); + gpio_write_pin_high(USBPD_2_PIN); + // Indicate hub is self-powered and devices can try to connect or fast charge: + gpio_write_pin_high(BUS_B_PIN); + break; + } + } + } +} + +#ifdef RGB_MATRIX_ENABLE +bool rgb_matrix_indicators_kb(void) { + if (!rgb_matrix_indicators_user()) { + return false; + } + + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color(CAPS_LOCK_LED_INDEX, INDICATOR_MAX_BRIGHTNESS, INDICATOR_MAX_BRIGHTNESS, INDICATOR_MAX_BRIGHTNESS); + } else { + rgb_matrix_set_color(CAPS_LOCK_LED_INDEX, 0, 0, 0); + } + return true; +} +#endif From 35e62d236b94d5b84c5e19db3f53095bf2138a4b Mon Sep 17 00:00:00 2001 From: Steven Karrmann Date: Wed, 10 Sep 2025 20:44:38 -0400 Subject: [PATCH 548/592] Add Cata keyboard (#25557) Co-authored-by: Jack Sangdahl --- keyboards/cata/keyboard.json | 65 +++++++++++++++++++++++++ keyboards/cata/keymaps/default/keymap.c | 42 ++++++++++++++++ keyboards/cata/readme.md | 27 ++++++++++ 3 files changed, 134 insertions(+) create mode 100644 keyboards/cata/keyboard.json create mode 100644 keyboards/cata/keymaps/default/keymap.c create mode 100644 keyboards/cata/readme.md diff --git a/keyboards/cata/keyboard.json b/keyboards/cata/keyboard.json new file mode 100644 index 0000000000..f6b5ef169f --- /dev/null +++ b/keyboards/cata/keyboard.json @@ -0,0 +1,65 @@ +{ + "manufacturer": "Steven Karrmann", + "keyboard_name": "Cata", + "maintainer": "skarrmann", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP9", "GP10", "GP11", "GP12", "GP13", "GP14"], + "rows": ["GP27", "GP5", "GP26", "GP6", "GP15", "GP7", "GP14", "GP8"] + }, + "processor": "RP2040", + "url": "https://github.com/skarrmann/cata", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "community_layouts": ["split_3x5_2"], + "layouts": { + "LAYOUT_split_3x5_2": { + "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": [1, 0], "x": 6, "y": 0}, + {"matrix": [1, 1], "x": 7, "y": 0}, + {"matrix": [1, 2], "x": 8, "y": 0}, + {"matrix": [1, 3], "x": 9, "y": 0}, + {"matrix": [1, 4], "x": 10, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1}, + {"matrix": [2, 1], "x": 1, "y": 1}, + {"matrix": [2, 2], "x": 2, "y": 1}, + {"matrix": [2, 3], "x": 3, "y": 1}, + {"matrix": [2, 4], "x": 4, "y": 1}, + {"matrix": [3, 0], "x": 6, "y": 1}, + {"matrix": [3, 1], "x": 7, "y": 1}, + {"matrix": [3, 2], "x": 8, "y": 1}, + {"matrix": [3, 3], "x": 9, "y": 1}, + {"matrix": [3, 4], "x": 10, "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": [5, 0], "x": 6, "y": 2}, + {"matrix": [5, 1], "x": 7, "y": 2}, + {"matrix": [5, 2], "x": 8, "y": 2}, + {"matrix": [5, 3], "x": 9, "y": 2}, + {"matrix": [5, 4], "x": 10, "y": 2}, + {"matrix": [6, 3], "x": 3, "y": 3}, + {"matrix": [6, 4], "x": 4, "y": 3}, + {"matrix": [7, 0], "x": 6, "y": 3}, + {"matrix": [7, 1], "x": 7, "y": 3} + ] + } + } +} diff --git a/keyboards/cata/keymaps/default/keymap.c b/keyboards/cata/keymaps/default/keymap.c new file mode 100644 index 0000000000..ac760ab014 --- /dev/null +++ b/keyboards/cata/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +// Copyright 2025 Steven Karrmann (@skarrmann) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _SYMBOL, + _NAVIGATION, + _FUNCTION +}; + +#define MO_SYM MO(_SYMBOL) +#define MO_NAV MO(_NAVIGATION) +#define MO_FUN MO(_FUNCTION) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_split_3x5_2( + KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , + KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_QUOT, + KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, + MO_NAV , KC_LSFT, KC_SPC , MO_SYM + ), + [_SYMBOL] = LAYOUT_split_3x5_2( + KC_SCLN, KC_LBRC, KC_RBRC, KC_5 , XXXXXXX, XXXXXXX, KC_6 , KC_MINS, KC_EQL , KC_GRV , + KC_1 , KC_2 , KC_3 , KC_4 , KC_BSLS, XXXXXXX, KC_7 , KC_8 , KC_9 , KC_0 , + OS_LGUI, OS_LALT, OS_LSFT, OS_LCTL, XXXXXXX, XXXXXXX, OS_RCTL, OS_RSFT, OS_RALT, OS_RGUI, + MO_FUN , _______, _______, _______ + ), + [_NAVIGATION] = LAYOUT_split_3x5_2( + KC_PSCR, KC_INS , KC_APP , KC_DEL , XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END , + KC_ESC , KC_TAB , KC_ENT , KC_BSPC, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, + OS_LGUI, OS_LALT, OS_LSFT, OS_LCTL, XXXXXXX, XXXXXXX, OS_RCTL, OS_RSFT, OS_RALT, OS_RGUI, + _______, _______, _______, MO_FUN + ), + [_FUNCTION] = LAYOUT_split_3x5_2( + KC_F1 , KC_F2 , KC_F3 , KC_F4 , QK_BOOT, KC_SCRL, KC_F9 , KC_F10 , KC_F11 , KC_F12 , + KC_F5 , KC_F6 , KC_F7 , KC_F8 , XXXXXXX, KC_CAPS, KC_MUTE, KC_VOLD, KC_VOLU, KC_PAUS, + OS_LGUI, OS_LALT, OS_LSFT, OS_LCTL, XXXXXXX, KC_NUM, OS_RCTL, OS_RSFT, OS_RALT, OS_RGUI, + _______, _______, _______, _______ + ), +}; diff --git a/keyboards/cata/readme.md b/keyboards/cata/readme.md new file mode 100644 index 0000000000..c21750b16d --- /dev/null +++ b/keyboards/cata/readme.md @@ -0,0 +1,27 @@ +# Cata + +![Cata](https://i.imgur.com/6jGENr9.jpeg) + +Cata is a 34 key ortholinear keyboard, powered by a Waveshare RP2040-Zero. + +* Keyboard Maintainer: [skarrmann](https://github.com/skarrmann) +* Hardware Supported: Cata PCBs with RP2040-Zero +* Hardware Availability: [Cata GitHub repository](https://github.com/skarrmann/cata) + +Make example for this keyboard (after setting up your build environment): + + make cata:default + +Flashing example for this keyboard: + + make cata: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 top left key) and plug in the keyboard. +* **Physical reset button**: Double-tap the RESET button on the RP-2040 Zero (button on the right). +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available. From 05ea735e86b5de9cbd482a2c8e3a91d930f0388a Mon Sep 17 00:00:00 2001 From: Ryan Chomistek <35873399+RyanChomistek@users.noreply.github.com> Date: Thu, 11 Sep 2025 01:15:45 -0700 Subject: [PATCH 549/592] Add Leftpaw Keyboard (#25313) Co-authored-by: jack --- keyboards/leftpaw/keyboard.json | 114 +++++++++++++++++++++ keyboards/leftpaw/keymaps/default/keymap.c | 38 +++++++ keyboards/leftpaw/readme.md | 25 +++++ 3 files changed, 177 insertions(+) create mode 100644 keyboards/leftpaw/keyboard.json create mode 100644 keyboards/leftpaw/keymaps/default/keymap.c create mode 100644 keyboards/leftpaw/readme.md diff --git a/keyboards/leftpaw/keyboard.json b/keyboards/leftpaw/keyboard.json new file mode 100644 index 0000000000..34fea17b37 --- /dev/null +++ b/keyboards/leftpaw/keyboard.json @@ -0,0 +1,114 @@ +{ + "manufacturer": "Ryan Chomistek", + "keyboard_name": "leftpaw", + "maintainer": "Ryan Chomistek", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP21", "GP22", "GP26", "GP0", "GP1", "GP2", "GP3", "GP4", "GP5", "GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15"], + "rows": ["GP20", "GP19", "GP18", "GP17", "GP16"] + }, + "processor": "RP2040", + "url": "https://github.com/RyanChomistek/lefty", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Num Lock", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "/", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "*", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "-", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "esc", "matrix": [0, 4], "x": 4.25, "y": 0}, + {"label": "!", "matrix": [0, 5], "x": 5.25, "y": 0}, + {"label": "@", "matrix": [0, 6], "x": 6.25, "y": 0}, + {"label": "#", "matrix": [0, 7], "x": 7.25, "y": 0}, + {"label": "$", "matrix": [0, 8], "x": 8.25, "y": 0}, + {"label": "%", "matrix": [0, 9], "x": 9.25, "y": 0}, + {"label": "^", "matrix": [0, 10], "x": 10.25, "y": 0}, + {"label": "&", "matrix": [0, 11], "x": 11.25, "y": 0}, + {"label": "*", "matrix": [0, 12], "x": 12.25, "y": 0}, + {"label": "(", "matrix": [0, 13], "x": 13.25, "y": 0}, + {"label": ")", "matrix": [0, 14], "x": 14.25, "y": 0}, + {"label": "_", "matrix": [0, 15], "x": 15.25, "y": 0}, + {"label": "+", "matrix": [0, 16], "x": 16.25, "y": 0}, + {"label": "Backspace", "matrix": [0, 17], "x": 17.25, "y": 0, "w": 2}, + {"label": "Pg Up", "matrix": [0, 18], "x": 19.5, "y": 0}, + {"label": "7", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "8", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "9", "matrix": [1, 2], "x": 2, "y": 1}, + {"label": "+", "matrix": [1, 3], "x": 3, "y": 1, "h": 2}, + {"label": "Tab", "matrix": [1, 4], "x": 4.25, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 5], "x": 5.75, "y": 1}, + {"label": "W", "matrix": [1, 6], "x": 6.75, "y": 1}, + {"label": "E", "matrix": [1, 7], "x": 7.75, "y": 1}, + {"label": "R", "matrix": [1, 8], "x": 8.75, "y": 1}, + {"label": "T", "matrix": [1, 9], "x": 9.75, "y": 1}, + {"label": "Y", "matrix": [1, 10], "x": 10.75, "y": 1}, + {"label": "U", "matrix": [1, 11], "x": 11.75, "y": 1}, + {"label": "I", "matrix": [1, 12], "x": 12.75, "y": 1}, + {"label": "O", "matrix": [1, 13], "x": 13.75, "y": 1}, + {"label": "P", "matrix": [1, 14], "x": 14.75, "y": 1}, + {"label": "{", "matrix": [1, 15], "x": 15.75, "y": 1}, + {"label": "}", "matrix": [1, 16], "x": 16.75, "y": 1}, + {"label": "|", "matrix": [1, 17], "x": 17.75, "y": 1, "w": 1.5}, + {"label": "Pg Dn", "matrix": [1, 18], "x": 19.5, "y": 1}, + {"label": "4", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "5", "matrix": [2, 1], "x": 1, "y": 2}, + {"label": "6", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "Caps Lock", "matrix": [2, 4], "x": 4.25, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 5], "x": 6, "y": 2}, + {"label": "S", "matrix": [2, 6], "x": 7, "y": 2}, + {"label": "D", "matrix": [2, 7], "x": 8, "y": 2}, + {"label": "F", "matrix": [2, 8], "x": 9, "y": 2}, + {"label": "G", "matrix": [2, 9], "x": 10, "y": 2}, + {"label": "H", "matrix": [2, 10], "x": 11, "y": 2}, + {"label": "J", "matrix": [2, 11], "x": 12, "y": 2}, + {"label": "K", "matrix": [2, 12], "x": 13, "y": 2}, + {"label": "L", "matrix": [2, 13], "x": 14, "y": 2}, + {"label": ":", "matrix": [2, 14], "x": 15, "y": 2}, + {"label": "\"", "matrix": [2, 15], "x": 16, "y": 2}, + {"label": "Enter", "matrix": [2, 17], "x": 17, "y": 2, "w": 2.25}, + {"label": "Delete", "matrix": [2, 18], "x": 19.5, "y": 2}, + {"label": "1", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "2", "matrix": [3, 1], "x": 1, "y": 3}, + {"label": "3", "matrix": [3, 2], "x": 2, "y": 3}, + {"label": "Enter", "matrix": [3, 3], "x": 3, "y": 3, "h": 2}, + {"label": "Shift", "matrix": [3, 4], "x": 4.25, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 5], "x": 6.5, "y": 3}, + {"label": "X", "matrix": [3, 6], "x": 7.5, "y": 3}, + {"label": "C", "matrix": [3, 7], "x": 8.5, "y": 3}, + {"label": "V", "matrix": [3, 8], "x": 9.5, "y": 3}, + {"label": "B", "matrix": [3, 9], "x": 10.5, "y": 3}, + {"label": "N", "matrix": [3, 10], "x": 11.5, "y": 3}, + {"label": "M", "matrix": [3, 11], "x": 12.5, "y": 3}, + {"label": "<", "matrix": [3, 12], "x": 13.5, "y": 3}, + {"label": ">", "matrix": [3, 13], "x": 14.5, "y": 3}, + {"label": "?", "matrix": [3, 14], "x": 15.5, "y": 3}, + {"label": "Shift", "matrix": [3, 16], "x": 16.5, "y": 3, "w": 1.5}, + {"label": "\u2191", "matrix": [3, 17], "x": 18.5, "y": 3.25}, + {"label": "0", "matrix": [4, 0], "x": 0, "y": 4, "w": 2}, + {"label": ".", "matrix": [4, 2], "x": 2, "y": 4}, + {"label": "Ctrl", "matrix": [4, 4], "x": 4.25, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 5], "x": 5.5, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 6], "x": 6.75, "y": 4, "w": 1.25}, + {"matrix": [4, 9], "x": 8, "y": 4, "w": 6.25}, + {"label": "Alt", "matrix": [4, 13], "x": 14.25, "y": 4}, + {"label": "Win", "matrix": [4, 14], "x": 15.25, "y": 4}, + {"label": "Ctrl", "matrix": [4, 15], "x": 16.25, "y": 4}, + {"label": "\u2190", "matrix": [4, 16], "x": 17.5, "y": 4.25}, + {"label": "\u2193", "matrix": [4, 17], "x": 18.5, "y": 4.25}, + {"label": "\u2192", "matrix": [4, 18], "x": 19.5, "y": 4.25} + ] + } + } +} diff --git a/keyboards/leftpaw/keymaps/default/keymap.c b/keyboards/leftpaw/keymaps/default/keymap.c new file mode 100644 index 0000000000..197e87ea94 --- /dev/null +++ b/keyboards/leftpaw/keymaps/default/keymap.c @@ -0,0 +1,38 @@ +/* Copyright 2025 Ryan Chomistek + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + KC_NUM, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPC, KC_GRAVE, + KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, 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_PGDN, + KC_KP_4, KC_KP_5, KC_KP_6, MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, KC_ENTER, KC_DELETE, + KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT, KC_UP, + KC_KP_0, KC_KP_DOT, KC_LCTL, KC_LWIN, KC_LALT, KC_SPACE, KC_RALT, KC_RWIN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT + ), + [1] = LAYOUT( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRAVE, 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_TRNS, KC_PGUP, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_KB_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + +}; diff --git a/keyboards/leftpaw/readme.md b/keyboards/leftpaw/readme.md new file mode 100644 index 0000000000..9a58aafab9 --- /dev/null +++ b/keyboards/leftpaw/readme.md @@ -0,0 +1,25 @@ +# leftpaw + +A 76% keyboard with a numpad on the left hand side + +* Keyboard Maintainer: [Ryan Chomistek](https://github.com/RyanChomistek) +* Hardware Supported: RP2040 +* Hardware Availability: [PCB Files](https://github.com/RyanChomistek/lefty) and [Case Files](https://www.printables.com/model/1310397-leftpaw-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make leftpaw:default + +Flashing example for this keyboard: + + make leftpaw: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 e5f47fa26947eb3d05cf1c18dfe71b51715516e0 Mon Sep 17 00:00:00 2001 From: Freather <72902384+CMMS-Freather@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:16:25 +0800 Subject: [PATCH 550/592] add fave 10xs pcb (#25296) Co-authored-by: Joel Challis Co-authored-by: Duncan Sutherland --- keyboards/linworks/fave10xs/keyboard.json | 273 ++++++++++++++++++ .../fave10xs/keymaps/default/keymap.c | 15 + keyboards/linworks/fave10xs/readme.md | 27 ++ 3 files changed, 315 insertions(+) create mode 100644 keyboards/linworks/fave10xs/keyboard.json create mode 100644 keyboards/linworks/fave10xs/keymaps/default/keymap.c create mode 100644 keyboards/linworks/fave10xs/readme.md diff --git a/keyboards/linworks/fave10xs/keyboard.json b/keyboards/linworks/fave10xs/keyboard.json new file mode 100644 index 0000000000..9a52638448 --- /dev/null +++ b/keyboards/linworks/fave10xs/keyboard.json @@ -0,0 +1,273 @@ +{ + "manufacturer": "Lx3", + "keyboard_name": "Fave10xS", + "maintainer": "Freather", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["B10", "A6", "A7", "B0", "B1", "B2", "A13", "B12", "B13", "B14", "B15", "A8", "A9", "A10", "A15", "B3", "B4", "C13", "C14", "C15", "F0"], + "rows": ["A14", "B5", "B7", "B8", "F1", "A0"] + }, + "indicators": { + "caps_lock": "B11", + "scroll_lock": "B9", + "num_lock": "B6" + }, + "processor": "STM32F072", + "usb": { + "device_version": "1.0.0", + "pid": "0x0100", + "vid": "0x4C58" + }, + "community_layouts": ["fullsize_extended_ansi"], + "layouts": { + "LAYOUT_fullsize_extended_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [0, 17], "x": 18.5, "y": 0}, + {"matrix": [0, 18], "x": 19.5, "y": 0}, + {"matrix": [0, 19], "x": 20.5, "y": 0}, + {"matrix": [0, 20], "x": 21.5, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + {"matrix": [1, 17], "x": 18.5, "y": 1.25}, + {"matrix": [1, 18], "x": 19.5, "y": 1.25}, + {"matrix": [1, 19], "x": 20.5, "y": 1.25}, + {"matrix": [1, 20], "x": 21.5, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + {"matrix": [2, 17], "x": 18.5, "y": 2.25}, + {"matrix": [2, 18], "x": 19.5, "y": 2.25}, + {"matrix": [2, 19], "x": 20.5, "y": 2.25}, + {"matrix": [2, 20], "x": 21.5, "y": 2.25, "h": 2}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [3, 17], "x": 18.5, "y": 3.25}, + {"matrix": [3, 18], "x": 19.5, "y": 3.25}, + {"matrix": [3, 19], "x": 20.5, "y": 3.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [4, 17], "x": 18.5, "y": 4.25}, + {"matrix": [4, 18], "x": 19.5, "y": 4.25}, + {"matrix": [4, 19], "x": 20.5, "y": 4.25}, + {"matrix": [4, 20], "x": 21.5, "y": 4.25, "h": 2}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 6], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25}, + {"matrix": [5, 17], "x": 18.5, "y": 5.25, "w": 2}, + {"matrix": [5, 19], "x": 20.5, "y": 5.25} + ] + }, + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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.5, "y": 0}, + {"matrix": [0, 7], "x": 7.5, "y": 0}, + {"matrix": [0, 8], "x": 8.5, "y": 0}, + {"matrix": [0, 9], "x": 9.5, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 11], "x": 12, "y": 0}, + {"matrix": [0, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + {"matrix": [0, 14], "x": 15.25, "y": 0}, + {"matrix": [0, 15], "x": 16.25, "y": 0}, + {"matrix": [0, 16], "x": 17.25, "y": 0}, + {"matrix": [0, 17], "x": 18.5, "y": 0}, + {"matrix": [0, 18], "x": 19.5, "y": 0}, + {"matrix": [0, 19], "x": 20.5, "y": 0}, + {"matrix": [0, 20], "x": 21.5, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1.25}, + {"matrix": [1, 1], "x": 1, "y": 1.25}, + {"matrix": [1, 2], "x": 2, "y": 1.25}, + {"matrix": [1, 3], "x": 3, "y": 1.25}, + {"matrix": [1, 4], "x": 4, "y": 1.25}, + {"matrix": [1, 5], "x": 5, "y": 1.25}, + {"matrix": [1, 6], "x": 6, "y": 1.25}, + {"matrix": [1, 7], "x": 7, "y": 1.25}, + {"matrix": [1, 8], "x": 8, "y": 1.25}, + {"matrix": [1, 9], "x": 9, "y": 1.25}, + {"matrix": [1, 10], "x": 10, "y": 1.25}, + {"matrix": [1, 11], "x": 11, "y": 1.25}, + {"matrix": [1, 12], "x": 12, "y": 1.25}, + {"matrix": [1, 13], "x": 13, "y": 1.25}, + {"matrix": [2, 13], "x": 14, "y": 1.25}, + {"matrix": [1, 14], "x": 15.25, "y": 1.25}, + {"matrix": [1, 15], "x": 16.25, "y": 1.25}, + {"matrix": [1, 16], "x": 17.25, "y": 1.25}, + {"matrix": [1, 17], "x": 18.5, "y": 1.25}, + {"matrix": [1, 18], "x": 19.5, "y": 1.25}, + {"matrix": [1, 19], "x": 20.5, "y": 1.25}, + {"matrix": [1, 20], "x": 21.5, "y": 1.25}, + + {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"matrix": [3, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [2, 14], "x": 15.25, "y": 2.25}, + {"matrix": [2, 15], "x": 16.25, "y": 2.25}, + {"matrix": [2, 16], "x": 17.25, "y": 2.25}, + {"matrix": [2, 17], "x": 18.5, "y": 2.25}, + {"matrix": [2, 18], "x": 19.5, "y": 2.25}, + {"matrix": [2, 19], "x": 20.5, "y": 2.25}, + {"matrix": [2, 20], "x": 21.5, "y": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"matrix": [3, 12], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [3, 17], "x": 18.5, "y": 3.25}, + {"matrix": [3, 18], "x": 19.5, "y": 3.25}, + {"matrix": [3, 19], "x": 20.5, "y": 3.25}, + {"matrix": [3, 20], "x": 21.5, "y": 3.25}, + + {"matrix": [4, 0], "x": 0, "y": 4.25, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4.25}, + {"matrix": [4, 2], "x": 2.25, "y": 4.25}, + {"matrix": [4, 3], "x": 3.25, "y": 4.25}, + {"matrix": [4, 4], "x": 4.25, "y": 4.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4.25}, + {"matrix": [4, 6], "x": 6.25, "y": 4.25}, + {"matrix": [4, 7], "x": 7.25, "y": 4.25}, + {"matrix": [4, 8], "x": 8.25, "y": 4.25}, + {"matrix": [4, 9], "x": 9.25, "y": 4.25}, + {"matrix": [4, 10], "x": 10.25, "y": 4.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4.25}, + {"matrix": [4, 12], "x": 12.25, "y": 4.25, "w": 1.75}, + {"matrix": [4, 13], "x": 14, "y": 4.25}, + {"matrix": [4, 15], "x": 16.25, "y": 4.25}, + {"matrix": [4, 17], "x": 18.5, "y": 4.25}, + {"matrix": [4, 18], "x": 19.5, "y": 4.25}, + {"matrix": [4, 19], "x": 20.5, "y": 4.25}, + {"matrix": [4, 20], "x": 21.5, "y": 4.25}, + + {"matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 4], "x": 3.75, "y": 5.25, "w": 2.25}, + {"matrix": [5, 6], "x": 6, "y": 5.25, "w": 1.25}, + {"matrix": [5, 8], "x": 7.25, "y": 5.25, "w": 2.75}, + {"matrix": [5, 10], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [5, 11], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [5, 12], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [5, 13], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [5, 14], "x": 15.25, "y": 5.25}, + {"matrix": [5, 15], "x": 16.25, "y": 5.25}, + {"matrix": [5, 16], "x": 17.25, "y": 5.25}, + {"matrix": [5, 17], "x": 18.5, "y": 5.25}, + {"matrix": [5, 18], "x": 19.5, "y": 5.25}, + {"matrix": [5, 19], "x": 20.5, "y": 5.25}, + {"matrix": [5, 20], "x": 21.5, "y": 5.25} + ] + } + } +} diff --git a/keyboards/linworks/fave10xs/keymaps/default/keymap.c b/keyboards/linworks/fave10xs/keymaps/default/keymap.c new file mode 100644 index 0000000000..f55ae86ed0 --- /dev/null +++ b/keyboards/linworks/fave10xs/keymaps/default/keymap.c @@ -0,0 +1,15 @@ +// 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_all( + 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_PSCR, KC_SCRL, KC_PAUS, KC_MNXT, KC_MPRV, KC_VOLU, KC_VOLD, + 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_TILD, KC_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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_PENT, + 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_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_P0, KC_PDOT, KC_PCMM + ) +}; diff --git a/keyboards/linworks/fave10xs/readme.md b/keyboards/linworks/fave10xs/readme.md new file mode 100644 index 0000000000..9a823a9118 --- /dev/null +++ b/keyboards/linworks/fave10xs/readme.md @@ -0,0 +1,27 @@ +# fave10xs + +![fave10xs](https://i.imgur.com/o4pq0mV.png) + +Dolphin max PCB solder version Fave10xs + +* Keyboard Maintainer: [Freather](https://github.com/Freather) +* Hardware Supported: STM32F072 Linworks Fave10xs PCB +* Hardware Availability: small gb ran in Asia + +Make example for this keyboard (after setting up your build environment): + + make linworks/fave10xs:default + +Flashing example for this keyboard: + + make linworks/fave10xs: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**: Hold the button on the back of the PCB then plug in the PCB with USB cable +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From bef5c95675c2727d0e5ecf4108a2e379647074dc Mon Sep 17 00:00:00 2001 From: Nikolai Grigoriev <2364632+ngrigoriev@users.noreply.github.com> Date: Thu, 11 Sep 2025 04:42:20 -0400 Subject: [PATCH 551/592] Handwired Dactyl Manuform version 5x7 matrix, 6-key thumb cluster, 2 keys in the last row (#24246) Co-authored-by: Ryan --- .../dactyl_manuform/5x7_2_6/config.h | 20 +++ .../dactyl_manuform/5x7_2_6/keyboard.json | 115 ++++++++++++++++++ .../5x7_2_6/keymaps/default/keymap.c | 74 +++++++++++ .../dactyl_manuform/5x7_2_6/readme.md | 29 +++++ 4 files changed, 238 insertions(+) create mode 100644 keyboards/handwired/dactyl_manuform/5x7_2_6/config.h create mode 100644 keyboards/handwired/dactyl_manuform/5x7_2_6/keyboard.json create mode 100644 keyboards/handwired/dactyl_manuform/5x7_2_6/keymaps/default/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform/5x7_2_6/readme.md diff --git a/keyboards/handwired/dactyl_manuform/5x7_2_6/config.h b/keyboards/handwired/dactyl_manuform/5x7_2_6/config.h new file mode 100644 index 0000000000..ce536e2d00 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x7_2_6/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2012 Jun Wako Nikolai Grigoriev @ngrigoriev + +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 EE_HANDS diff --git a/keyboards/handwired/dactyl_manuform/5x7_2_6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x7_2_6/keyboard.json new file mode 100644 index 0000000000..7e41ff0083 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x7_2_6/keyboard.json @@ -0,0 +1,115 @@ +{ + "manufacturer": "Nikolai Grigoriev", + "keyboard_name": "Dactyl Manuform 5x7 2-key last row 6-key thumb cluster", + "maintainer": "ngrigoriev", + "build": { + "lto": true + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": false, + "nkro": true + }, + "matrix_pins": { + "cols": ["F5", "F6", "F7", "B1", "B3", "B2", "B6"], + "rows": ["D4", "C6", "D7", "E6", "B4", "B5"] + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "split": { + "enabled": true, + "transport": { + "protocol": "i2c" + }, + "usb_detect": { + "enabled": true + } + }, + "url": "https://github.com/ngrigoriev/dactyl-manuform-5x7_2_6", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT_5x7_2_6": { + "layout": [ + {"label": "KC_GRV", "matrix": [0, 0], "x": 0, "y": 0.5, "w": 1.5}, + {"label": "KC_1", "matrix": [0, 1], "x": 1.5, "y": 0.5}, + {"label": "KC_2", "matrix": [0, 2], "x": 2.5, "y": 0}, + {"label": "KC_3", "matrix": [0, 3], "x": 3.5, "y": 0}, + {"label": "KC_4", "matrix": [0, 4], "x": 4.5, "y": 0}, + {"label": "KC_5", "matrix": [0, 5], "x": 5.5, "y": 0}, + {"label": "KC_NO", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "KC_EQL", "matrix": [6, 0], "x": 12, "y": 0}, + {"label": "KC_6", "matrix": [6, 1], "x": 13, "y": 0}, + {"label": "KC_7", "matrix": [6, 2], "x": 14, "y": 0}, + {"label": "KC_8", "matrix": [6, 3], "x": 15, "y": 0}, + {"label": "KC_9", "matrix": [6, 4], "x": 16, "y": 0}, + {"label": "KC_0", "matrix": [6, 5], "x": 17, "y": 0.5}, + {"label": "KC_BSPC", "matrix": [6, 6], "x": 18, "y": 0.5, "w": 1.5}, + {"label": "KC_TAB", "matrix": [1, 0], "x": 0, "y": 1.5, "w": 1.5}, + {"label": "KC_Q", "matrix": [1, 1], "x": 1.5, "y": 1.5}, + {"label": "KC_W", "matrix": [1, 2], "x": 2.5, "y": 1}, + {"label": "KC_E", "matrix": [1, 3], "x": 3.5, "y": 1}, + {"label": "KC_R", "matrix": [1, 4], "x": 4.5, "y": 1}, + {"label": "KC_T", "matrix": [1, 5], "x": 5.5, "y": 1}, + {"label": "KC_NO", "matrix": [1, 6], "x": 6.5, "y": 1}, + {"label": "KC_MINUS", "matrix": [7, 0], "x": 12, "y": 1}, + {"label": "KC_Y", "matrix": [7, 1], "x": 13, "y": 1}, + {"label": "KC_U", "matrix": [7, 2], "x": 14, "y": 1}, + {"label": "KC_I", "matrix": [7, 3], "x": 15, "y": 1}, + {"label": "KC_O", "matrix": [7, 4], "x": 16, "y": 1}, + {"label": "KC_P", "matrix": [7, 5], "x": 17, "y": 1.5}, + {"label": "KC_BSLS", "matrix": [7, 6], "x": 18, "y": 1.5, "w": 1.5}, + {"label": "KC_LCTL", "matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, + {"label": "KC_A", "matrix": [2, 1], "x": 1.5, "y": 2.5}, + {"label": "KC_S", "matrix": [2, 2], "x": 2.5, "y": 2}, + {"label": "KC_D", "matrix": [2, 3], "x": 3.5, "y": 2}, + {"label": "KC_F", "matrix": [2, 4], "x": 4.5, "y": 2}, + {"label": "KC_G", "matrix": [2, 5], "x": 5.5, "y": 2}, + {"label": "KC_NO", "matrix": [2, 6], "x": 6.5, "y": 2}, + {"label": "KC_DEL", "matrix": [8, 0], "x": 12, "y": 2}, + {"label": "KC_H", "matrix": [8, 1], "x": 13, "y": 2}, + {"label": "KC_J", "matrix": [8, 2], "x": 14, "y": 2}, + {"label": "KC_K", "matrix": [8, 3], "x": 15, "y": 2}, + {"label": "KC_L", "matrix": [8, 4], "x": 16, "y": 2}, + {"label": "KC_SCLN", "matrix": [8, 5], "x": 17, "y": 2.5}, + {"label": "KC_RSFT", "matrix": [8, 6], "x": 18, "y": 2.5, "w": 1.5}, + {"label": "KC_LSFT", "matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.5}, + {"label": "KC_Z", "matrix": [3, 1], "x": 1.5, "y": 3.5}, + {"label": "KC_X", "matrix": [3, 2], "x": 2.5, "y": 3}, + {"label": "KC_C", "matrix": [3, 3], "x": 3.5, "y": 3}, + {"label": "KC_V", "matrix": [3, 4], "x": 4.5, "y": 3}, + {"label": "KC_B", "matrix": [3, 5], "x": 5.5, "y": 3}, + {"label": "KC_N", "matrix": [9, 1], "x": 13, "y": 3}, + {"label": "KC_M", "matrix": [9, 2], "x": 14, "y": 3}, + {"label": "KC_COMM", "matrix": [9, 3], "x": 15, "y": 3}, + {"label": "KC_DOT", "matrix": [9, 4], "x": 16, "y": 3}, + {"label": "KC_SLSH", "matrix": [9, 5], "x": 17, "y": 3.5}, + {"label": "KC_RSFT", "matrix": [9, 6], "x": 18, "y": 3.5, "w": 1.5}, + {"label": "KC_PGUP", "matrix": [4, 2], "x": 2.5, "y": 4}, + {"label": "KC_PGDN", "matrix": [4, 3], "x": 3.5, "y": 4}, + {"label": "KC_LBRC", "matrix": [10, 3], "x": 15, "y": 4}, + {"label": "KC_RBRC", "matrix": [10, 4], "x": 16, "y": 4}, + {"label": "KC_LCTL", "matrix": [4, 4], "x": 5, "y": 5, "h": 1.5, "r": 30}, + {"label": "KC_ESC", "matrix": [4, 5], "x": 6, "y": 5, "h": 1.5, "r": 30}, + {"label": "KC_ENTER", "matrix": [10, 1], "x": 12.5, "y": 5, "h": 1.5, "r": -30}, + {"label": "KC_SPC", "matrix": [10, 2], "x": 13.5, "y": 5, "h": 1.5, "r": -30}, + {"label": "KC_UP", "matrix": [5, 5], "x": 7.5, "y": 6.5, "r": 45}, + {"label": "KC_DOWN", "matrix": [5, 3], "x": 8, "y": 7.5, "r": 45}, + {"label": "KC_LEFT", "matrix": [11, 3], "x": 10.5, "y": 7.5, "r": -45}, + {"label": "KC_RIGHT", "matrix": [11, 1], "x": 11, "y": 6.5, "r": -45}, + {"label": "KC_LCMD", "matrix": [5, 4], "x": 6.5, "y": 7, "r": 45}, + {"label": "KC_LALT", "matrix": [5, 2], "x": 7, "y": 8, "r": 45}, + {"label": "KC_RCTL", "matrix": [11, 4], "x": 11.5, "y": 8, "r": -45}, + {"label": "KC_RALT", "matrix": [11, 2], "x": 12, "y": 7, "r": -45} + ] + } + } +} diff --git a/keyboards/handwired/dactyl_manuform/5x7_2_6/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/5x7_2_6/keymaps/default/keymap.c new file mode 100644 index 0000000000..5ad2f77bad --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x7_2_6/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* vim: noai:ts=4:sw=4:nowrap +*/ +/* +Copyright 2012 Jun Wako Nikolai Grigoriev @ngrigoriev + +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 + +enum layers { + _BASE, + _MAGIC, + _NUMPAD, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_5x7_2_6( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, MO(_MAGIC), KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(_NUMPAD), KC_MINUS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, _______, KC_DEL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM(MOD_RSFT), + KC_PGUP, KC_PGDN, KC_LBRC, KC_RBRC, + KC_LCTL, LT(_FN, KC_ESC), KC_ENTER,KC_SPC, + KC_UP, KC_DOWN, KC_LEFT, KC_RIGHT, + KC_LCMD, KC_LALT, KC_RCTL, KC_RALT + ), + + [_FN] = LAYOUT_5x7_2_6( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, MO(_MAGIC), _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + _______, _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F12, + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, QK_BOOT, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_MPRV, KC_MNXT, _______, _______, + _______, _______, KC_DEL, _______, + _______, _______, _______, _______, + _______, _______, _______, _______ + ), + + [_NUMPAD] = LAYOUT_5x7_2_6( + _______, _______, _______, _______, _______, _______, MO(_MAGIC), _______, _______, KC_NUM, _______, KC_PMNS, KC_PPLS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_P4, KC_P5, KC_P6, KC_PAST, _______, + _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PSLS, _______, + _______, _______, KC_P0, KC_PDOT, + _______, _______, _______, KC_PENT, + _______, _______, _______, _______, + _______, _______, _______, _______ + ), + + [_MAGIC] = LAYOUT_5x7_2_6( + _______, _______, _______, _______, _______, _______, _______, CG_SWAP, _______, _______, _______, _______, _______, QK_REBOOT, + _______, _______, _______, _______, _______, _______, _______, CG_NORM, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOTLOADER, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______, + _______, _______, _______, _______ + ) +}; + diff --git a/keyboards/handwired/dactyl_manuform/5x7_2_6/readme.md b/keyboards/handwired/dactyl_manuform/5x7_2_6/readme.md new file mode 100644 index 0000000000..e29bbeb8ce --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/5x7_2_6/readme.md @@ -0,0 +1,29 @@ +# handwired/dactyl_manuform/5x7_2_6 + +![keyboad_image](https://i.ibb.co/09tfjY0/kbpic-small-21.jpg) + +A standard Dactyl Manuform keyboard with 5x7 matrix, 6 thumb cluster keys. Last row has 2 keys only. Index column has 3 rows. The outer keys are 1,5u wide. [More info on https://github.com/ngrigoriev/dactyl-manuform-5x7_2_6](https://github.com/ngrigoriev/dactyl-manuform-5x7_2_6). Based on the original set of Dactyl Manuform keyboards created and maintaied by [Jack Humbert](https://github.com/jackhumbert). + +This keyboard can be generated using one of Dactyl Manuform generators, such as (https://dactyl.mbugert.de/manuform). + +* Keyboard Maintainer: [Nikolai Grigoriev](https://github.com/ngrigoriev) +* Hardware Supported: Promicro +* Hardware Availability: general DIY + +Make example for this keyboard (after setting up your build environment): + + make handwired/dactyl_manuform/5x7_2_6:default + +Flashing example for this keyboard: + + make handwired/dactyl_manuform/5x7_2_6:default:flash + +See the [build environment setup](getting_started_build_tools) and the [make instructions](getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](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 45a5a94b969c33e60acb4f9187c4d47f752cfafb Mon Sep 17 00:00:00 2001 From: Duncan Sutherland Date: Thu, 11 Sep 2025 11:04:19 +0100 Subject: [PATCH 552/592] Correct key position for Swiftrax Bebol (#25147) --- keyboards/handwired/swiftrax/bebol/keyboard.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/handwired/swiftrax/bebol/keyboard.json b/keyboards/handwired/swiftrax/bebol/keyboard.json index 0a665a0ae7..ad3af9176d 100644 --- a/keyboards/handwired/swiftrax/bebol/keyboard.json +++ b/keyboards/handwired/swiftrax/bebol/keyboard.json @@ -251,7 +251,7 @@ {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.5}, - {"label": "Ctrl", "matrix": [4, 12], "x": 12, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 11.5, "y": 4, "w": 1.5}, {"label": "\u2190", "matrix": [4, 13], "x": 13, "y": 4}, {"label": "\u2193", "matrix": [4, 14], "x": 14, "y": 4}, {"label": "\u2192", "matrix": [4, 15], "x": 15, "y": 4} @@ -327,7 +327,7 @@ {"label": "Alt", "matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, {"label": "Space", "matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "matrix": [4, 10], "x": 10, "y": 4, "w": 1.5}, - {"label": "Ctrl", "matrix": [4, 12], "x": 12, "y": 4, "w": 1.5}, + {"label": "Ctrl", "matrix": [4, 12], "x": 11.5, "y": 4, "w": 1.5}, {"label": "\u2190", "matrix": [4, 13], "x": 13, "y": 4}, {"label": "\u2193", "matrix": [4, 14], "x": 14, "y": 4}, {"label": "\u2192", "matrix": [4, 15], "x": 15, "y": 4} From 8f728aa7311f3d66d8c7b68bf85e5da605909b4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:12:40 +0100 Subject: [PATCH 553/592] Bump vite from 5.4.19 to 5.4.20 in /builddefs/docsgen (#25646) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.19 to 5.4.20. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.20/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.20/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 5.4.20 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index 69e229ae61..19c80580d6 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.4.19", + "vite": "^5.4.20", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index 8a8457eb8d..bc2edf6024 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -766,10 +766,10 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.9, vite@^5.4.19: - version "5.4.19" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.19.tgz#20efd060410044b3ed555049418a5e7d1998f959" - integrity sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA== +vite@^5.2.9, vite@^5.4.20: + version "5.4.20" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.20.tgz#3267a5e03f21212f44edfd72758138e8fcecd76a" + integrity sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From f31004ebec6903408f1b1687d89ba98900c82e4c Mon Sep 17 00:00:00 2001 From: bkchqaeh <167339684+bkchqaeh@users.noreply.github.com> Date: Fri, 19 Sep 2025 05:40:42 +0300 Subject: [PATCH 554/592] Add ENMEPAD3x4 (#25435) --- keyboards/enmeseoz/enmepad3x4/keyboard.json | 39 +++++++++++++++++++ .../enmepad3x4/keymaps/default/keymap.c | 31 +++++++++++++++ keyboards/enmeseoz/enmepad3x4/readme.md | 25 ++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 keyboards/enmeseoz/enmepad3x4/keyboard.json create mode 100644 keyboards/enmeseoz/enmepad3x4/keymaps/default/keymap.c create mode 100644 keyboards/enmeseoz/enmepad3x4/readme.md diff --git a/keyboards/enmeseoz/enmepad3x4/keyboard.json b/keyboards/enmeseoz/enmepad3x4/keyboard.json new file mode 100644 index 0000000000..50fccf9d8c --- /dev/null +++ b/keyboards/enmeseoz/enmepad3x4/keyboard.json @@ -0,0 +1,39 @@ +{ + "manufacturer": "ENMESEOZ", + "keyboard_name": "ENMEPAD", + "maintainer": "ENMESEOZ", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP26", "GP27", "GP28", "GP29"], + "rows": ["GP3", "GP4", "GP5"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT_3x4": { + "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}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2} + ] + } + } +} diff --git a/keyboards/enmeseoz/enmepad3x4/keymaps/default/keymap.c b/keyboards/enmeseoz/enmepad3x4/keymaps/default/keymap.c new file mode 100644 index 0000000000..0f6fd6b302 --- /dev/null +++ b/keyboards/enmeseoz/enmepad3x4/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +/* Copyright 2025 ENMESEOZ + * + * 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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_3x4( + KC_0, KC_1, KC_4, KC_7, + KC_ENT, KC_2, KC_5, KC_8, + MO(1), KC_3, KC_6, KC_9 + ), + LAYOUT_3x4( + QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/enmeseoz/enmepad3x4/readme.md b/keyboards/enmeseoz/enmepad3x4/readme.md new file mode 100644 index 0000000000..dd7391daac --- /dev/null +++ b/keyboards/enmeseoz/enmepad3x4/readme.md @@ -0,0 +1,25 @@ +# ENMEPAD 3x4 + +ENMEPAD3x4 a compact macropad controlled with rp2040. + +* Keyboard Maintainer: [bkchqaeh](https://github.com/bkchqaeh) +* Hardware Supported: *rp2040* +* Hardware Availability: *Not available* + +Make example for this keyboard (after setting up your build environment): + + make enmeseoz/enmepad3x4:default + +Flashing example for this keyboard: + + make enmeseoz/enmepad3x4: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 \ No newline at end of file From 880c0c8ee000b8a3c8f407f9204f09a5107acc28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 20:33:25 +0100 Subject: [PATCH 555/592] Bump tj-actions/changed-files from 46 to 47 (#25658) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 46 to 47. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/v46...v47) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-version: '47' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/format.yml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 9dbda4e5a6..be6617e2b2 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -36,7 +36,7 @@ jobs: - name: Get changed files id: file_changes - uses: tj-actions/changed-files@v46 + uses: tj-actions/changed-files@v47 with: use_rest_api: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 62e1263a48..7d4ff0a977 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -27,7 +27,7 @@ jobs: - name: Get changed files id: file_changes - uses: tj-actions/changed-files@v46 + uses: tj-actions/changed-files@v47 with: use_rest_api: true From 7aed244aaeb943377e134e21cce273a12b4b56f9 Mon Sep 17 00:00:00 2001 From: Jonas Eppard Date: Tue, 30 Sep 2025 00:54:48 +0200 Subject: [PATCH 556/592] [DOCS] Fix keycodes_basic FastForward + Rewind #25685 (#25686) --- docs/keycodes.md | 4 ++-- docs/keycodes_basic.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index e569e87431..c540a7ce7f 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -203,8 +203,8 @@ See also: [Basic Keycodes](keycodes_basic) |`KC_WWW_STOP` |`KC_WSTP` |Browser Stop |✔ | |✔ | |`KC_WWW_REFRESH` |`KC_WREF` |Browser Refresh |✔ | |✔ | |`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites |✔ | |✔ | -|`KC_MEDIA_FAST_FORWARD` |`KC_MFFD` |Next Track |✔ |✔5|✔ | -|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track |✔6|✔5|✔ | +|`KC_MEDIA_FAST_FORWARD` |`KC_MFFD` |Fast Forward |✔ |✔5|✔ | +|`KC_MEDIA_REWIND` |`KC_MRWD` |Rewind |✔6|✔5|✔ | |`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |✔ |✔ |✔ | |`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |✔ |✔ |✔ | |`KC_CONTROL_PANEL` |`KC_CPNL` |Open Control Panel |✔ | | | diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 66dfbe6ded..8b0e1d694d 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -219,8 +219,8 @@ Some of these keycodes may behave differently depending on the OS. For example, |`KC_WWW_STOP` |`KC_WSTP`|Browser Stop | |`KC_WWW_REFRESH` |`KC_WREF`|Browser Refresh | |`KC_WWW_FAVORITES` |`KC_WFAV`|Browser Favorites | -|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD`|Next Track | -|`KC_MEDIA_REWIND` |`KC_MRWD`|Previous Track | +|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD`|Fast Forward | +|`KC_MEDIA_REWIND` |`KC_MRWD`|Rewind | |`KC_BRIGHTNESS_UP` |`KC_BRIU`|Brightness Up | |`KC_BRIGHTNESS_DOWN` |`KC_BRID`|Brightness Down | |`KC_CONTROL_PANEL` |`KC_CPNL`|Open Control Panel | From eae39d37c634646dfab59d801bbf957572cf3dce Mon Sep 17 00:00:00 2001 From: Danny Date: Sun, 5 Oct 2025 16:46:15 -0400 Subject: [PATCH 557/592] [Keyboard] Add Quefrency LM Rev. 1 (#25692) * Initial WIP commit * Update right half pins * Update RGB matrix and layout * Enable more RGB animations * Update license headers * Cleanup keymap and RGB * Move handedness pin definition, cleanup RGB defines * Adjust keymap --- keyboards/keebio/quefrency_lm/info.json | 21 ++ .../quefrency_lm/keymaps/default/keymap.c | 21 ++ keyboards/keebio/quefrency_lm/readme.md | 27 ++ keyboards/keebio/quefrency_lm/rev1/config.h | 23 ++ keyboards/keebio/quefrency_lm/rev1/halconf.h | 10 + .../keebio/quefrency_lm/rev1/keyboard.json | 320 ++++++++++++++++++ keyboards/keebio/quefrency_lm/rev1/mcuconf.h | 14 + keyboards/keebio/quefrency_lm/rev1/rev1.c | 11 + 8 files changed, 447 insertions(+) create mode 100644 keyboards/keebio/quefrency_lm/info.json create mode 100644 keyboards/keebio/quefrency_lm/keymaps/default/keymap.c create mode 100644 keyboards/keebio/quefrency_lm/readme.md create mode 100644 keyboards/keebio/quefrency_lm/rev1/config.h create mode 100644 keyboards/keebio/quefrency_lm/rev1/halconf.h create mode 100644 keyboards/keebio/quefrency_lm/rev1/keyboard.json create mode 100644 keyboards/keebio/quefrency_lm/rev1/mcuconf.h create mode 100644 keyboards/keebio/quefrency_lm/rev1/rev1.c diff --git a/keyboards/keebio/quefrency_lm/info.json b/keyboards/keebio/quefrency_lm/info.json new file mode 100644 index 0000000000..cb41e89ff6 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/info.json @@ -0,0 +1,21 @@ +{ + "manufacturer": "Keebio", + "url": "https://keeb.io", + "maintainer": "nooges", + "usb": { + "vid": "0xCB10" + }, + "features": { + "bootmagic": true, + "console": true, + "extrakey": true, + "mousekey": true, + "nkro": false + }, + "split": { + "enabled": true + }, + "build": { + "lto": true + } +} diff --git a/keyboards/keebio/quefrency_lm/keymaps/default/keymap.c b/keyboards/keebio/quefrency_lm/keymaps/default/keymap.c new file mode 100644 index 0000000000..75bb1601de --- /dev/null +++ b/keyboards/keebio/quefrency_lm/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65xt( + KC_F1, KC_F2, 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_F3, KC_F4, 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_F5, KC_F6, 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_F7, KC_F8, 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_F9, KC_F10, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT_65xt( + RM_HUEU, RM_HUED, 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, _______, _______, + RM_SATU, RM_SATD, RM_TOGG, RM_NEXT, KC_UP, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + RM_VALU, RM_VALD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RM_SPDU, RM_SPDD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/keebio/quefrency_lm/readme.md b/keyboards/keebio/quefrency_lm/readme.md new file mode 100644 index 0000000000..c602f252cc --- /dev/null +++ b/keyboards/keebio/quefrency_lm/readme.md @@ -0,0 +1,27 @@ +# Quefrency LM + +A split 65XT staggered low-profile keyboard made and sold by Keebio. [More info at Keebio](https://keeb.io). + +* Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges) +* Hardware Availability: [Keebio](https://keeb.io/) + +Make example for this keyboard (after setting up your build environment): + + make keebio/quefrency_lm/rev1:default + +Example of flashing this keyboard: + + make keebio/quefrency_lm/rev1:default:flash + +Handedness detection is already hardwired onto the PCB, so no need to deal with `EE_HANDS` or flashing .eep files. + +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 one of these ways: + +* **Physical reset button**: Press and hold the button on the back of the PCB for at least 2 seconds and let go, or double-press the button +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available + +A build guide for this keyboard can be found here: [Keebio Build Guides](https://docs.keeb.io) diff --git a/keyboards/keebio/quefrency_lm/rev1/config.h b/keyboards/keebio/quefrency_lm/rev1/config.h new file mode 100644 index 0000000000..039947f539 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/rev1/config.h @@ -0,0 +1,23 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Defines for the split keyboard setup */ +#define SERIAL_USART_DRIVER SD3 // USART 3 +#define SERIAL_USART_TX_PIN B10 +#define SERIAL_USART_RX_PIN B11 +#define SERIAL_USART_TX_PAL_MODE 7 +#define SERIAL_USART_RX_PAL_MODE 7 +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_PIN_SWAP + +#define USB_VBUS_PIN C6 + +/* Defines for the RGB matrix */ +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 4 +#define WS2812_PWM_PAL_MODE 10 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_DMA_CHANNEL 2 +#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP diff --git a/keyboards/keebio/quefrency_lm/rev1/halconf.h b/keyboards/keebio/quefrency_lm/rev1/halconf.h new file mode 100644 index 0000000000..ce1dfd06d7 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/rev1/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SERIAL TRUE + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/keebio/quefrency_lm/rev1/keyboard.json b/keyboards/keebio/quefrency_lm/rev1/keyboard.json new file mode 100644 index 0000000000..1e56222de4 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/rev1/keyboard.json @@ -0,0 +1,320 @@ +{ + "manufacturer": "Keebio", + "keyboard_name": "Quefrency LM Rev. 1", + "maintainer": "nooges", + "bootloader": "stm32-dfu", + "bootmagic": { + "matrix": [0, 2] + }, + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["B13", "B14", "B2", "F0", "C10", "B6", "C13", "C14", "C15"], + "rows": ["B4", "C11", "B12", "B5", "F1"] + }, + "processor": "STM32G431", + "rgb_matrix": { + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "flower_blooming": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_fractal": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_multiwide": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_nexus": true, + "solid_reactive_multinexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true, + "solid_multisplash": true, + "starlight": true, + "starlight_smooth": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "riverflow": true + }, + "driver": "ws2812", + "layout": [ + { "matrix": [0, 8], "x": 103, "y": 4, "flags": 4 }, + { "x": 97, "y": 8, "flags": 2 }, + { "matrix": [0, 7], "x": 91, "y": 4, "flags": 4 }, + { "matrix": [0, 6], "x": 79, "y": 4, "flags": 4 }, + { "x": 73, "y": 0, "flags": 2 }, + { "matrix": [0, 5], "x": 67, "y": 4, "flags": 4 }, + { "matrix": [0, 4], "x": 54, "y": 4, "flags": 4 }, + { "matrix": [0, 3], "x": 42, "y": 4, "flags": 4 }, + { "matrix": [0, 2], "x": 30, "y": 4, "flags": 4 }, + { "x": 27, "y": 19, "flags": 2 }, + + { "matrix": [1, 2], "x": 33, "y": 19, "flags": 4 }, + { "matrix": [1, 3], "x": 48, "y": 19, "flags": 4 }, + { "matrix": [1, 4], "x": 61, "y": 19, "flags": 4 }, + { "matrix": [1, 5], "x": 73, "y": 19, "flags": 4 }, + { "matrix": [1, 6], "x": 85, "y": 19, "flags": 4 }, + { "matrix": [1, 7], "x": 97, "y": 19, "flags": 4 }, + + { "matrix": [2, 7], "x": 100, "y": 34, "flags": 4 }, + { "matrix": [2, 6], "x": 88, "y": 34, "flags": 4 }, + { "matrix": [2, 5], "x": 76, "y": 34, "flags": 4 }, + { "matrix": [2, 4], "x": 64, "y": 34, "flags": 4 }, + { "matrix": [2, 3], "x": 51, "y": 34, "flags": 4 }, + { "matrix": [2, 2], "x": 35, "y": 34, "flags": 4 }, + + { "matrix": [3, 2], "x": 38, "y": 49, "flags": 4 }, + { "matrix": [3, 4], "x": 58, "y": 49, "flags": 4 }, + { "matrix": [3, 5], "x": 70, "y": 49, "flags": 4 }, + { "matrix": [3, 6], "x": 82, "y": 49, "flags": 4 }, + { "matrix": [3, 7], "x": 94, "y": 49, "flags": 4 }, + { "x": 100, "y": 45, "flags": 2 }, + { "matrix": [3, 8], "x": 106, "y": 49, "flags": 4 }, + + { "matrix": [4, 7], "x": 98, "y": 64, "flags": 4 }, + { "x": 85, "y": 64, "flags": 2 }, + { "matrix": [4, 5], "x": 77, "y": 64, "flags": 4 }, + { "matrix": [4, 4], "x": 62, "y": 64, "flags": 4 }, + { "matrix": [4, 3], "x": 47, "y": 64, "flags": 4 }, + { "x": 39, "y": 60, "flags": 4 }, + { "matrix": [4, 2], "x": 32, "y": 64, "flags": 4 }, + + { "matrix": [4, 1], "x": 12, "y": 64, "flags": 4 }, + { "x": 6, "y": 60, "flags": 2 }, + { "matrix": [4, 0], "x": 0, "y": 64, "flags": 4 }, + { "matrix": [3, 0], "x": 0, "y": 49, "flags": 4 }, + { "matrix": [3, 1], "x": 12, "y": 49, "flags": 4 }, + { "matrix": [2, 1], "x": 12, "y": 34, "flags": 4 }, + { "matrix": [2, 0], "x": 0, "y": 34, "flags": 4 }, + { "matrix": [1, 0], "x": 0, "y": 19, "flags": 4 }, + { "matrix": [1, 1], "x": 12, "y": 19, "flags": 4 }, + { "matrix": [0, 1], "x": 12, "y": 4, "flags": 4 }, + { "x": 6, "y": 0, "flags": 2 }, + { "matrix": [0, 0], "x": 0, "y": 4, "flags": 4 }, + + { "matrix": [5, 0], "x": 127, "y": 4, "flags": 4 }, + { "x": 127, "y": 11, "flags": 2 }, + { "matrix": [5, 1], "x": 139, "y": 4, "flags": 4 }, + { "matrix": [5, 2], "x": 151, "y": 4, "flags": 4 }, + { "x": 157, "y": 0, "flags": 2 }, + { "matrix": [5, 3], "x": 163, "y": 4, "flags": 4 }, + { "matrix": [5, 4], "x": 176, "y": 4, "flags": 4 }, + { "x": 182, "y": 0, "flags": 2 }, + { "matrix": [5, 5], "x": 188, "y": 4, "flags": 4 }, + { "matrix": [5, 7], "x": 206, "y": 4, "flags": 4 }, + { "x": 218, "y": 0, "flags": 2 }, + { "matrix": [5, 8], "x": 224, "y": 4, "flags": 4 }, + + { "matrix": [6, 8], "x": 224, "y": 19, "flags": 4 }, + { "matrix": [6, 7], "x": 209, "y": 19, "flags": 4 }, + { "matrix": [6, 6], "x": 194, "y": 19, "flags": 4 }, + { "matrix": [6, 5], "x": 182, "y": 19, "flags": 4 }, + { "matrix": [6, 4], "x": 170, "y": 19, "flags": 4 }, + { "matrix": [6, 3], "x": 157, "y": 19, "flags": 4 }, + { "matrix": [6, 2], "x": 145, "y": 19, "flags": 4 }, + { "matrix": [6, 1], "x": 133, "y": 19, "flags": 4 }, + { "matrix": [6, 0], "x": 121, "y": 19, "flags": 4 }, + + { "matrix": [7, 0], "x": 124, "y": 34, "flags": 4 }, + { "matrix": [7, 1], "x": 136, "y": 34, "flags": 4 }, + { "matrix": [7, 2], "x": 148, "y": 34, "flags": 4 }, + { "matrix": [7, 3], "x": 160, "y": 34, "flags": 4 }, + { "matrix": [7, 4], "x": 173, "y": 34, "flags": 4 }, + { "matrix": [7, 5], "x": 185, "y": 34, "flags": 4 }, + { "matrix": [7, 7], "x": 204, "y": 34, "flags": 4 }, + { "matrix": [7, 8], "x": 224, "y": 34, "flags": 4 }, + + { "matrix": [8, 8], "x": 224, "y": 49, "flags": 4 }, + { "matrix": [8, 7], "x": 212, "y": 49, "flags": 4 }, + { "matrix": [8, 6], "x": 195, "y": 49, "flags": 4 }, + { "matrix": [8, 4], "x": 179, "y": 49, "flags": 4 }, + { "matrix": [8, 3], "x": 166, "y": 49, "flags": 4 }, + { "matrix": [8, 2], "x": 154, "y": 49, "flags": 4 }, + { "matrix": [8, 1], "x": 142, "y": 49, "flags": 4 }, + { "matrix": [8, 0], "x": 130, "y": 49, "flags": 4 }, + + { "x": 127, "y": 64, "flags": 2 }, + { "matrix": [9, 1], "x": 141, "y": 64, "flags": 4 }, + { "x": 157, "y": 64, "flags": 2 }, + { "matrix": [9, 2], "x": 163, "y": 64, "flags": 4 }, + { "matrix": [9, 3], "x": 176, "y": 64, "flags": 4 }, + { "matrix": [9, 4], "x": 188, "y": 64, "flags": 4 }, + { "x": 194, "y": 64, "flags": 2 }, + { "matrix": [9, 6], "x": 200, "y": 64, "flags": 4 }, + { "matrix": [9, 7], "x": 212, "y": 64, "flags": 4 }, + { "x": 218, "y": 64, "flags": 2 }, + { "matrix": [9, 8], "x": 224, "y": 64, "flags": 4 } + ], + "max_brightness": 120, + "sleep": true, + "split_count": [48, 48] + }, + "split": { + "bootmagic": { + "matrix": [5, 8] + }, + "enabled": true, + "handedness": { + "pin": "A0" + }, + + "matrix_pins": { + "right": { + "cols": ["B2", "A15", "A2", "A1", "A4", "B15", "B6", "C13", "C14"], + "rows": ["B12", "B13", "B14", "B5", "F1"] + } + }, + "serial": { + "driver": "usart" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "url": "https://keeb.io", + "usb": { + "device_version": "1.0.0", + "pid": "0x1657", + "vid": "0xCB10" + }, + "ws2812": { + "driver": "pwm", + "pin": "B7" + }, + "layouts": { + "LAYOUT_65xt": { + "layout": [ + {"label": "F1", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "F2", "matrix": [0, 1], "x": 1, "y": 0}, + + {"label": "Esc", "matrix": [0, 2], "x": 2.25, "y": 0}, + {"label": "1", "matrix": [0, 3], "x": 3.25, "y": 0}, + {"label": "2", "matrix": [0, 4], "x": 4.25, "y": 0}, + {"label": "3", "matrix": [0, 5], "x": 5.25, "y": 0}, + {"label": "4", "matrix": [0, 6], "x": 6.25, "y": 0}, + {"label": "5", "matrix": [0, 7], "x": 7.25, "y": 0}, + {"label": "6", "matrix": [0, 8], "x": 8.25, "y": 0}, + + {"label": "7", "matrix": [5, 0], "x": 10.25, "y": 0}, + {"label": "8", "matrix": [5, 1], "x": 11.25, "y": 0}, + {"label": "9", "matrix": [5, 2], "x": 12.25, "y": 0}, + {"label": "0", "matrix": [5, 3], "x": 13.25, "y": 0}, + {"label": "-", "matrix": [5, 4], "x": 14.25, "y": 0}, + {"label": "=", "matrix": [5, 5], "x": 15.25, "y": 0}, + {"label": "Bksp", "matrix": [5, 7], "x": 16.25, "y": 0, "w": 2}, + {"label": "Del", "matrix": [5, 8], "x": 18.25, "y": 0}, + + {"label": "F3", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "F4", "matrix": [1, 1], "x": 1, "y": 1}, + + {"label": "Tab", "matrix": [1, 2], "x": 2.25, "y": 1, "w": 1.5}, + {"label": "Q", "matrix": [1, 3], "x": 3.75, "y": 1}, + {"label": "W", "matrix": [1, 4], "x": 4.75, "y": 1}, + {"label": "E", "matrix": [1, 5], "x": 5.75, "y": 1}, + {"label": "R", "matrix": [1, 6], "x": 6.75, "y": 1}, + {"label": "T", "matrix": [1, 7], "x": 7.75, "y": 1}, + + {"label": "Y", "matrix": [6, 0], "x": 9.75, "y": 1}, + {"label": "U", "matrix": [6, 1], "x": 10.75, "y": 1}, + {"label": "I", "matrix": [6, 2], "x": 11.75, "y": 1}, + {"label": "O", "matrix": [6, 3], "x": 12.75, "y": 1}, + {"label": "P", "matrix": [6, 4], "x": 13.75, "y": 1}, + {"label": "{", "matrix": [6, 5], "x": 14.75, "y": 1}, + {"label": "}", "matrix": [6, 6], "x": 15.75, "y": 1}, + {"label": "|", "matrix": [6, 7], "x": 16.75, "y": 1, "w": 1.5}, + {"label": "Home", "matrix": [6, 8], "x": 18.25, "y": 1}, + + {"label": "F5", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "F6", "matrix": [2, 1], "x": 1, "y": 2}, + + {"label": "Caps Lock", "matrix": [2, 2], "x": 2.25, "y": 2, "w": 1.75}, + {"label": "A", "matrix": [2, 3], "x": 4, "y": 2}, + {"label": "S", "matrix": [2, 4], "x": 5, "y": 2}, + {"label": "D", "matrix": [2, 5], "x": 6, "y": 2}, + {"label": "F", "matrix": [2, 6], "x": 7, "y": 2}, + {"label": "G", "matrix": [2, 7], "x": 8, "y": 2}, + + {"label": "H", "matrix": [7, 0], "x": 10, "y": 2}, + {"label": "J", "matrix": [7, 1], "x": 11, "y": 2}, + {"label": "K", "matrix": [7, 2], "x": 12, "y": 2}, + {"label": "L", "matrix": [7, 3], "x": 13, "y": 2}, + {"label": ":", "matrix": [7, 4], "x": 14, "y": 2}, + {"label": "\"", "matrix": [7, 5], "x": 15, "y": 2}, + {"label": "Enter", "matrix": [7, 7], "x": 16, "y": 2, "w": 2.25}, + {"label": "PgUp", "matrix": [7, 8], "x": 18.25, "y": 2}, + + {"label": "F7", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "F8", "matrix": [3, 1], "x": 1, "y": 3}, + + {"label": "Shift", "matrix": [3, 2], "x": 2.25, "y": 3, "w": 2.25}, + {"label": "Z", "matrix": [3, 4], "x": 4.5, "y": 3}, + {"label": "X", "matrix": [3, 5], "x": 5.5, "y": 3}, + {"label": "C", "matrix": [3, 6], "x": 6.5, "y": 3}, + {"label": "V", "matrix": [3, 7], "x": 7.5, "y": 3}, + {"label": "B", "matrix": [3, 8], "x": 8.5, "y": 3}, + + {"label": "N", "matrix": [8, 0], "x": 10.5, "y": 3}, + {"label": "M", "matrix": [8, 1], "x": 11.5, "y": 3}, + {"label": ",", "matrix": [8, 2], "x": 12.5, "y": 3}, + {"label": ".", "matrix": [8, 3], "x": 13.5, "y": 3}, + {"label": "/", "matrix": [8, 4], "x": 14.5, "y": 3}, + {"label": "Shift", "matrix": [8, 6], "x": 15.5, "y": 3, "w": 1.75}, + {"label": "Up", "matrix": [8, 7], "x": 17.25, "y": 3}, + {"label": "PgDn", "matrix": [8, 8], "x": 18.25, "y": 3}, + + {"label": "F9", "matrix": [4, 0], "x": 0, "y": 4}, + {"label": "F10", "matrix": [4, 1], "x": 1, "y": 4}, + + {"label": "Ctrl", "matrix": [4, 2], "x": 2.25, "y": 4, "w": 1.25}, + {"label": "Win", "matrix": [4, 3], "x": 3.5, "y": 4, "w": 1.25}, + {"label": "Alt", "matrix": [4, 4], "x": 4.75, "y": 4, "w": 1.25}, + {"label": "Fn", "matrix": [4, 5], "x": 6, "y": 4, "w": 1.25}, + {"label": "Space", "matrix": [4, 7], "x": 7.25, "y": 4, "w": 2.25}, + + {"label": "Space", "matrix": [9, 1], "x": 10.5, "y": 4, "w": 2.75}, + {"label": "Alt", "matrix": [9, 2], "x": 13.25, "y": 4}, + {"label": "Fn", "matrix": [9, 3], "x": 14.25, "y": 4}, + {"label": "Ctrl", "matrix": [9, 4], "x": 15.25, "y": 4}, + {"label": "Left", "matrix": [9, 6], "x": 16.25, "y": 4}, + {"label": "Down", "matrix": [9, 7], "x": 17.25, "y": 4}, + {"label": "Right", "matrix": [9, 8], "x": 18.25, "y": 4} + ] + } + } +} diff --git a/keyboards/keebio/quefrency_lm/rev1/mcuconf.h b/keyboards/keebio/quefrency_lm/rev1/mcuconf.h new file mode 100644 index 0000000000..81e0d04f67 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/rev1/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +/* enable USART3, used for split comms */ +#undef STM32_SERIAL_USE_USART3 +#define STM32_SERIAL_USE_USART3 TRUE + +/* enable TIM3, used for RGB LED PWM driver */ +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/keebio/quefrency_lm/rev1/rev1.c b/keyboards/keebio/quefrency_lm/rev1/rev1.c new file mode 100644 index 0000000000..744fdd8293 --- /dev/null +++ b/keyboards/keebio/quefrency_lm/rev1/rev1.c @@ -0,0 +1,11 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Disable the PD peripheral in pre-init because its pins are being used in the matrix: + PWR->CR3 |= PWR_CR3_UCPD_DBDIS; + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_pre_init_user(); +} From 85fa06c3db45d33d19dc2bdea6049d60ef294bee Mon Sep 17 00:00:00 2001 From: Danny Tan <23428162+zykrah@users.noreply.github.com> Date: Mon, 6 Oct 2025 07:50:03 +1100 Subject: [PATCH 558/592] Update Idyllic pizzapad with Encoder (#25683) * Update pizzapad with encoder * Added extra features to enable volume controls * Added license header and updated pin number * Remove config.h file * Update keyboard.json features and pizzapad.c license header --- keyboards/idyllic/pizzapad/keyboard.json | 14 +++++++++++++- keyboards/idyllic/pizzapad/pizzapad.c | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 keyboards/idyllic/pizzapad/pizzapad.c diff --git a/keyboards/idyllic/pizzapad/keyboard.json b/keyboards/idyllic/pizzapad/keyboard.json index 638db19822..590d354034 100644 --- a/keyboards/idyllic/pizzapad/keyboard.json +++ b/keyboards/idyllic/pizzapad/keyboard.json @@ -13,10 +13,22 @@ "rows": ["GP6", "GP29", "GP28"] }, "usb": { - "device_version": "0.0.1", + "device_version": "0.0.2", "pid": "0x5050", "vid": "0x7A79" }, + "features": { + "bootmagic": true, + "mousekey": true, + "extrakey": true, + "nkro": true, + "encoder": true + }, + "encoder": { + "rotary": [ + { "pin_a": "GP2", "pin_b": "GP3" } + ] + }, "community_layouts": ["ortho_3x3"], "layouts": { "LAYOUT_ortho_3x3": { diff --git a/keyboards/idyllic/pizzapad/pizzapad.c b/keyboards/idyllic/pizzapad/pizzapad.c new file mode 100644 index 0000000000..11a35193aa --- /dev/null +++ b/keyboards/idyllic/pizzapad/pizzapad.c @@ -0,0 +1,14 @@ +// Copyright 2025 Zykrah +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#define ENCODER_PIN_C GP27 + +void keyboard_pre_init_kb(void) { + // Set encoder pin C low + gpio_set_pin_output_push_pull(ENCODER_PIN_C); + gpio_write_pin_low(ENCODER_PIN_C); + + keyboard_pre_init_user(); +} From 61ecee15850db51ff2ddba862b0337a2ae439e23 Mon Sep 17 00:00:00 2001 From: takashicompany Date: Mon, 6 Oct 2025 08:55:49 +0900 Subject: [PATCH 559/592] Fix keymap for Palmslave (#25675) * fix keymap * fix keymap * Update keyboards/takashicompany/palmslave/keymaps/default/keymap.c Co-authored-by: Joel Challis --------- Co-authored-by: Jack Sangdahl Co-authored-by: Joel Challis --- .../palmslave/keymaps/default/keymap.c | 44 +++++++------------ 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/keyboards/takashicompany/palmslave/keymaps/default/keymap.c b/keyboards/takashicompany/palmslave/keymaps/default/keymap.c index 02747c0881..294aa9fde0 100644 --- a/keyboards/takashicompany/palmslave/keymaps/default/keymap.c +++ b/keyboards/takashicompany/palmslave/keymaps/default/keymap.c @@ -6,8 +6,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( - LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, + LT(4, KC_Q), KC_W, KC_E, LT(3, KC_R), KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, LT(3, KC_K), KC_L, KC_ENT, LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(2, KC_SPC), LT(1, KC_LNG1), KC_RGUI, KC_RCTL ), @@ -27,44 +27,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [3] = LAYOUT( - LT(7, KC_Q), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, - KC_A, KC_S, LT(6, KC_D), KC_F, KC_G, KC_H, KC_J, LT(6, KC_K), KC_L, KC_ENT, - LSFT_T(KC_Z), LGUI_T(KC_X), KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, LCTL_T(KC_DOT), KC_BSPC, - KC_LCTL, KC_LGUI, LALT_T(KC_LNG2), LSFT_T(KC_TAB), LT(5, KC_SPC), LT(4, KC_LNG1), KC_RGUI, KC_RCTL - ), - - [4] = LAYOUT( - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, - KC_CIRC, KC_AT, KC_SLSH, KC_MINS, KC_UNDS, KC_SCLN, KC_COLN, KC_LBRC, KC_RBRC, KC_INT3, - LT(5, KC_TILD), KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - ), - - [5] = LAYOUT( - KC_EXLM, KC_DQUO, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_BSLS, - KC_TILD, KC_GRV, KC_QUES, KC_EQL, KC_UNDS, KC_PLUS, KC_ASTR, KC_LCBR, KC_RCBR, KC_PIPE, - KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_LSFT, KC_SPC, KC_LNG1, KC_TRNS, KC_TRNS, KC_DEL, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS - ), - - [6] = LAYOUT( - KC_ESC, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, - KC_LCTL, KC_TRNS, KC_QUES, KC_EXLM, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, + KC_ESC, KC_TAB, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, + KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_LSFT, KC_LGUI, KC_LALT, KC_LNG2, KC_TRNS, KC_NO, KC_LNG1, KC_NO, KC_NO, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), - [7] = LAYOUT( + [4] = LAYOUT( KC_NO, KC_TAB, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NO, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(8), MO(9), + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, MO(5), MO(6), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), - [8] = LAYOUT( - UG_TOGG, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, KC_NO, KC_NO, KC_NO, DF(0), DF(3), + [5] = LAYOUT( + UG_TOGG, UG_NEXT, UG_HUEU, UG_SATU, UG_VALU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, QK_BOOT, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [6] = LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO ) }; From 92ead44cf66e7f7f0f912eb5dd1fae36e15d5ed9 Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 6 Oct 2025 10:31:02 -0400 Subject: [PATCH 560/592] Add FoldKB Rev. 2 (#25679) --- keyboards/keebio/foldkb/info.json | 8 + keyboards/keebio/foldkb/rev1/keyboard.json | 4 - .../{ => rev1}/keymaps/default/keymap.c | 21 +- keyboards/keebio/foldkb/rev2/config.h | 23 ++ keyboards/keebio/foldkb/rev2/halconf.h | 10 + keyboards/keebio/foldkb/rev2/keyboard.json | 263 ++++++++++++++++++ .../foldkb/rev2/keymaps/default/keymap.c | 21 ++ keyboards/keebio/foldkb/rev2/mcuconf.h | 14 + keyboards/keebio/foldkb/rev2/rev2.c | 29 ++ 9 files changed, 372 insertions(+), 21 deletions(-) create mode 100644 keyboards/keebio/foldkb/info.json rename keyboards/keebio/foldkb/{ => rev1}/keymaps/default/keymap.c (61%) create mode 100644 keyboards/keebio/foldkb/rev2/config.h create mode 100644 keyboards/keebio/foldkb/rev2/halconf.h create mode 100644 keyboards/keebio/foldkb/rev2/keyboard.json create mode 100644 keyboards/keebio/foldkb/rev2/keymaps/default/keymap.c create mode 100644 keyboards/keebio/foldkb/rev2/mcuconf.h create mode 100644 keyboards/keebio/foldkb/rev2/rev2.c diff --git a/keyboards/keebio/foldkb/info.json b/keyboards/keebio/foldkb/info.json new file mode 100644 index 0000000000..669038aff1 --- /dev/null +++ b/keyboards/keebio/foldkb/info.json @@ -0,0 +1,8 @@ +{ + "manufacturer": "Keebio", + "url": "https://keeb.io", + "maintainer": "Keebio", + "usb": { + "vid": "0xCB10" + } +} diff --git a/keyboards/keebio/foldkb/rev1/keyboard.json b/keyboards/keebio/foldkb/rev1/keyboard.json index 70808c2662..28594a783b 100644 --- a/keyboards/keebio/foldkb/rev1/keyboard.json +++ b/keyboards/keebio/foldkb/rev1/keyboard.json @@ -1,10 +1,6 @@ { "keyboard_name": "FoldKB Rev. 1", - "manufacturer": "Keebio", - "url": "https://keeb.io", - "maintainer": "nooges", "usb": { - "vid": "0xCB10", "pid": "0x1358", "device_version": "1.0.0" }, diff --git a/keyboards/keebio/foldkb/keymaps/default/keymap.c b/keyboards/keebio/foldkb/rev1/keymaps/default/keymap.c similarity index 61% rename from keyboards/keebio/foldkb/keymaps/default/keymap.c rename to keyboards/keebio/foldkb/rev1/keymaps/default/keymap.c index 0c099df625..ae21a1267f 100644 --- a/keyboards/keebio/foldkb/keymaps/default/keymap.c +++ b/keyboards/keebio/foldkb/rev1/keymaps/default/keymap.c @@ -1,18 +1,5 @@ -/* Copyright 2021 Danny Nguyen - -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 . -*/ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H @@ -25,10 +12,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_PGDN, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL ), [1] = LAYOUT( - KC_MUTE, QK_BOOT, _______, UG_HUED, UG_HUEU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, + KC_MUTE, QK_BOOT, KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_DEL, BL_STEP, _______, UG_SATD, UG_SATU, _______, _______, _______, _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, UG_NEXT, _______, UG_VALD, UG_VALU, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, - KC_VOLU, _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, + KC_VOLU, _______, UG_HUED, UG_HUEU, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, KC_0, _______, _______, _______, _______ ), }; diff --git a/keyboards/keebio/foldkb/rev2/config.h b/keyboards/keebio/foldkb/rev2/config.h new file mode 100644 index 0000000000..06498b8b8b --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/config.h @@ -0,0 +1,23 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Defines for the split keyboard setup */ +#define SERIAL_USART_DRIVER SD1 // USART 1 +#define SERIAL_USART_TX_PIN A9 +#define SERIAL_USART_RX_PIN A10 +#define SERIAL_USART_TX_PAL_MODE 7 +#define SERIAL_USART_RX_PAL_MODE 7 +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_PIN_SWAP + +#define USB_VBUS_PIN A7 + +/* Defines for the RGB matrix */ +#define WS2812_PWM_DRIVER PWMD3 +#define WS2812_PWM_CHANNEL 3 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 +#define WS2812_DMA_CHANNEL 2 +#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM3_UP diff --git a/keyboards/keebio/foldkb/rev2/halconf.h b/keyboards/keebio/foldkb/rev2/halconf.h new file mode 100644 index 0000000000..ce1dfd06d7 --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/halconf.h @@ -0,0 +1,10 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SERIAL TRUE + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/keebio/foldkb/rev2/keyboard.json b/keyboards/keebio/foldkb/rev2/keyboard.json new file mode 100644 index 0000000000..19dd601c86 --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/keyboard.json @@ -0,0 +1,263 @@ +{ + "keyboard_name": "FoldKB Rev. 2", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "A4", "pin_b": "A3"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["A6", "A15", "B3", "B4", "B5", "B6", "B7", "F0"], + "rows": ["A5", "A0", "A1", "A2", "F1"] + }, + "processor": "STM32G431", + "rgb_matrix": { + "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, + "starlight_smooth": true, + "typing_heatmap": true + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 1], "x": 17, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 31, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 45, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 59, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 72, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 86, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 100, "y": 0, "flags": 4}, + {"matrix": [1, 7], "x": 100, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 86, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 72, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 59, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 45, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 28, "y": 16, "flags": 4}, + {"matrix": [2, 2], "x": 26, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 45, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 59, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 72, "y": 32, "flags": 4}, + {"matrix": [2, 6], "x": 86, "y": 32, "flags": 4}, + {"matrix": [2, 7], "x": 100, "y": 32, "flags": 4}, + {"matrix": [3, 7], "x": 100, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 86, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 72, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 59, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 45, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 22, "y": 48, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 22, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 40, "y": 64, "flags": 4}, + {"matrix": [4, 4], "x": 57, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 72, "y": 64, "flags": 4}, + {"matrix": [4, 6], "x": 86, "y": 64, "flags": 4}, + {"matrix": [4, 7], "x": 100, "y": 64, "flags": 4}, + {"matrix": [5, 7], "x": 221, "y": 0, "flags": 4}, + {"matrix": [5, 6], "x": 207, "y": 0, "flags": 4}, + {"matrix": [5, 5], "x": 193, "y": 0, "flags": 4}, + {"matrix": [5, 4], "x": 179, "y": 0, "flags": 4}, + {"matrix": [5, 3], "x": 165, "y": 0, "flags": 4}, + {"matrix": [5, 2], "x": 152, "y": 0, "flags": 4}, + {"matrix": [5, 1], "x": 138, "y": 0, "flags": 4}, + {"matrix": [5, 0], "x": 124, "y": 0, "flags": 4}, + {"matrix": [6, 0], "x": 124, "y": 16, "flags": 4}, + {"matrix": [6, 1], "x": 138, "y": 16, "flags": 4}, + {"matrix": [6, 2], "x": 152, "y": 16, "flags": 4}, + {"matrix": [6, 3], "x": 165, "y": 16, "flags": 4}, + {"matrix": [6, 4], "x": 179, "y": 16, "flags": 4}, + {"matrix": [6, 5], "x": 193, "y": 16, "flags": 4}, + {"matrix": [6, 6], "x": 207, "y": 16, "flags": 4}, + {"matrix": [6, 7], "x": 224, "y": 16, "flags": 4}, + {"matrix": [7, 7], "x": 215, "y": 32, "flags": 4}, + {"matrix": [7, 5], "x": 193, "y": 32, "flags": 4}, + {"matrix": [7, 4], "x": 179, "y": 32, "flags": 4}, + {"matrix": [7, 3], "x": 165, "y": 32, "flags": 4}, + {"matrix": [7, 2], "x": 152, "y": 32, "flags": 4}, + {"matrix": [7, 1], "x": 138, "y": 32, "flags": 4}, + {"matrix": [7, 0], "x": 124, "y": 32, "flags": 4}, + {"matrix": [8, 0], "x": 124, "y": 48, "flags": 4}, + {"matrix": [8, 1], "x": 138, "y": 48, "flags": 4}, + {"matrix": [8, 2], "x": 152, "y": 48, "flags": 4}, + {"matrix": [8, 3], "x": 165, "y": 48, "flags": 4}, + {"matrix": [8, 4], "x": 179, "y": 48, "flags": 4}, + {"matrix": [8, 5], "x": 198, "y": 48, "flags": 4}, + {"matrix": [8, 7], "x": 217, "y": 48, "flags": 4}, + {"matrix": [9, 7], "x": 215, "y": 64, "flags": 4}, + {"matrix": [9, 5], "x": 198, "y": 64, "flags": 4}, + {"matrix": [9, 4], "x": 181, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 164, "y": 64, "flags": 4}, + {"matrix": [9, 1], "x": 145, "y": 64, "flags": 4}, + {"matrix": [9, 0], "x": 136, "y": 64, "flags": 4}, + {"matrix": [9, 0], "x": 126, "y": 64, "flags": 4} + ], + "max_brightness": 120, + "sleep": true, + "split_count": [36, 37] + }, + "split": { + "bootmagic": { + "matrix": [5, 8] + }, + "enabled": true, + "handedness": { + "pin": "A8" + }, + "matrix_pins": { + "right": { + "cols": ["A6", "A5", "A4", "A3", "A2", "B5", "B6", "B7"], + "rows": ["A15", "B3", "B4", "A0", "A1"] + } + }, + "serial": { + "driver": "usart" + }, + "transport": { + "sync": { + "matrix_state": true + } + } + }, + "usb": { + "device_version": "2.0.0", + "pid": "0x2358" + }, + "ws2812": { + "driver": "pwm", + "pin": "B0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1.25, "y": 0}, + {"matrix": [0, 2], "x": 2.25, "y": 0}, + {"matrix": [0, 3], "x": 3.25, "y": 0}, + {"matrix": [0, 4], "x": 4.25, "y": 0}, + {"matrix": [0, 5], "x": 5.25, "y": 0}, + {"matrix": [0, 6], "x": 6.25, "y": 0}, + {"matrix": [0, 7], "x": 7.25, "y": 0}, + {"matrix": [5, 0], "x": 9, "y": 0}, + {"matrix": [5, 1], "x": 10, "y": 0}, + {"matrix": [5, 2], "x": 11, "y": 0}, + {"matrix": [5, 3], "x": 12, "y": 0}, + {"matrix": [5, 4], "x": 13, "y": 0}, + {"matrix": [5, 5], "x": 14, "y": 0}, + {"matrix": [5, 6], "x": 15, "y": 0}, + {"matrix": [5, 7], "x": 16, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 2], "x": 1.75, "y": 1, "w": 1.5}, + {"matrix": [1, 3], "x": 3.25, "y": 1}, + {"matrix": [1, 4], "x": 4.25, "y": 1}, + {"matrix": [1, 5], "x": 5.25, "y": 1}, + {"matrix": [1, 6], "x": 6.25, "y": 1}, + {"matrix": [1, 7], "x": 7.25, "y": 1}, + {"matrix": [6, 0], "x": 9, "y": 1}, + {"matrix": [6, 1], "x": 10, "y": 1}, + {"matrix": [6, 2], "x": 11, "y": 1}, + {"matrix": [6, 3], "x": 12, "y": 1}, + {"matrix": [6, 4], "x": 13, "y": 1}, + {"matrix": [6, 5], "x": 14, "y": 1}, + {"matrix": [6, 6], "x": 15, "y": 1}, + {"matrix": [6, 7], "x": 16, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 2], "x": 1.5, "y": 2, "w": 1.75}, + {"matrix": [2, 3], "x": 3.25, "y": 2}, + {"matrix": [2, 4], "x": 4.25, "y": 2}, + {"matrix": [2, 5], "x": 5.25, "y": 2}, + {"matrix": [2, 6], "x": 6.25, "y": 2}, + {"matrix": [2, 7], "x": 7.25, "y": 2}, + {"matrix": [7, 0], "x": 9, "y": 2}, + {"matrix": [7, 1], "x": 10, "y": 2}, + {"matrix": [7, 2], "x": 11, "y": 2}, + {"matrix": [7, 3], "x": 12, "y": 2}, + {"matrix": [7, 4], "x": 13, "y": 2}, + {"matrix": [7, 5], "x": 14, "y": 2}, + {"matrix": [7, 7], "x": 15, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 2], "x": 1, "y": 3, "w": 2.25}, + {"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": [8, 0], "x": 9, "y": 3}, + {"matrix": [8, 1], "x": 10, "y": 3}, + {"matrix": [8, 2], "x": 11, "y": 3}, + {"matrix": [8, 3], "x": 12, "y": 3}, + {"matrix": [8, 4], "x": 13, "y": 3}, + {"matrix": [8, 5], "x": 14, "y": 3, "w": 1.75}, + {"matrix": [8, 7], "x": 15.75, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4}, + {"matrix": [4, 2], "x": 1.5, "y": 4, "w": 1.25}, + {"matrix": [4, 3], "x": 2.75, "y": 4, "w": 1.25}, + {"matrix": [4, 4], "x": 4, "y": 4, "w": 1.25}, + {"matrix": [4, 5], "x": 5.25, "y": 4}, + {"matrix": [4, 6], "x": 6.25, "y": 4}, + {"matrix": [4, 7], "x": 7.25, "y": 4}, + {"matrix": [9, 0], "x": 9, "y": 4, "w": 1.25}, + {"matrix": [9, 1], "x": 10.25, "y": 4, "w": 1.5}, + {"matrix": [9, 3], "x": 11.75, "y": 4, "w": 1.25}, + {"matrix": [9, 4], "x": 13, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 14.25, "y": 4, "w": 1.25}, + {"matrix": [9, 7], "x": 15.5, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/keebio/foldkb/rev2/keymaps/default/keymap.c b/keyboards/keebio/foldkb/rev2/keymaps/default/keymap.c new file mode 100644 index 0000000000..bf3f325446 --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_MUTE, KC_ESC, 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_HOME, 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_END, 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, MO(1), + KC_PGDN, KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL + ), + [1] = LAYOUT( + KC_MUTE, QK_BOOT, KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_DEL, + RM_TOGG, _______, RM_SATD, RM_SATU, _______, _______, _______, _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, + RM_NEXT, _______, RM_VALD, RM_VALU, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, + KC_VOLU, _______, RM_HUED, RM_HUEU, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, + KC_VOLD, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, KC_0, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/keebio/foldkb/rev2/mcuconf.h b/keyboards/keebio/foldkb/rev2/mcuconf.h new file mode 100644 index 0000000000..77847f5b2c --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/mcuconf.h @@ -0,0 +1,14 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +/* enable USART1, used for split comms */ +#undef STM32_SERIAL_USE_USART1 +#define STM32_SERIAL_USE_USART1 TRUE + +/* enable TIM3, used for RGB LED PWM driver */ +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE diff --git a/keyboards/keebio/foldkb/rev2/rev2.c b/keyboards/keebio/foldkb/rev2/rev2.c new file mode 100644 index 0000000000..0fc47b1483 --- /dev/null +++ b/keyboards/keebio/foldkb/rev2/rev2.c @@ -0,0 +1,29 @@ +// Copyright 2025 Keebio (@keebio) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +void keyboard_pre_init_kb(void) { + // Disable the PD peripheral in pre-init because its pins are being used in the matrix: + PWR->CR3 |= PWR_CR3_UCPD_DBDIS; + // Call the corresponding _user() function (see https://docs.qmk.fm/#/custom_quantum_functions) + keyboard_pre_init_user(); +} + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!encoder_update_user(index, clockwise)) { return false; } + if (index == 0) { + if (clockwise) { + tap_code(KC_VOLU); + } else { + tap_code(KC_VOLD); + } + } else if (index == 1) { + if (clockwise) { + tap_code(KC_PGDN); + } else { + tap_code(KC_PGUP); + } + } + return false; +} From 082b69db912b106d2c55321671d67704ec9f44b7 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 7 Oct 2025 03:27:31 +1100 Subject: [PATCH 561/592] Fix Slovak and Lithuanian (QWERTY) sendstring LUTs (#25703) --- quantum/keymap_extras/sendstring_lithuanian_qwerty.h | 6 +++--- quantum/keymap_extras/sendstring_slovak.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quantum/keymap_extras/sendstring_lithuanian_qwerty.h b/quantum/keymap_extras/sendstring_lithuanian_qwerty.h index 676930e9d3..0c0bdc6a98 100644 --- a/quantum/keymap_extras/sendstring_lithuanian_qwerty.h +++ b/quantum/keymap_extras/sendstring_lithuanian_qwerty.h @@ -54,13 +54,13 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = { XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, // ! " # $ % & ' - KC_SPC, LT_1, LT_QUOT, LT_3, LT_4, LT_5, LT_7, LT_QUOT, + KC_SPC, LT_AOGO, LT_QUOT, LT_EOGO, LT_EDOT, LT_IOGO, LT_UOGO, LT_QUOT, // ( ) * + , - . / - LT_9, LT_0, LT_8, LT_ZCAR, LT_COMM, LT_MINS, LT_DOT, LT_SLSH, + LT_9, LT_0, LT_UMAC, LT_ZCAR, LT_COMM, LT_MINS, LT_DOT, LT_SLSH, // 0 1 2 3 4 5 6 7 LT_0, LT_AOGO, LT_CCAR, LT_EOGO, LT_EDOT, LT_IOGO, LT_SCAR, LT_UOGO, // 8 9 : ; < = > ? - LT_UMAC, LT_9, LT_SCLN, LT_SCLN, LT_COMM, LT_PLUS, LT_DOT, LT_SLSH, + LT_UMAC, LT_9, LT_SCLN, LT_SCLN, LT_COMM, LT_ZCAR, LT_DOT, LT_SLSH, // @ A B C D E F G LT_CCAR, LT_A, LT_B, LT_C, LT_D, LT_E, LT_F, LT_G, // H I J K L M N O diff --git a/quantum/keymap_extras/sendstring_slovak.h b/quantum/keymap_extras/sendstring_slovak.h index a908773969..a2a545e412 100644 --- a/quantum/keymap_extras/sendstring_slovak.h +++ b/quantum/keymap_extras/sendstring_slovak.h @@ -108,13 +108,13 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = { // P Q R S T U V W SK_P, SK_Q, SK_R, SK_S, SK_T, SK_U, SK_V, SK_W, // X Y Z [ \ ] ^ _ - SK_X, SK_Y, SK_Z, SK_F, SK_Q, SK_G, SK_3, SK_MINS, + SK_X, SK_Y, SK_Z, SK_F, SK_Q, SK_G, SK_SCAR, SK_MINS, // ` a b c d e f g - SK_7, SK_A, SK_B, SK_C, SK_D, SK_E, SK_F, SK_G, + SK_YACU, SK_A, SK_B, SK_C, SK_D, SK_E, SK_F, SK_G, // h i j k l m n o SK_H, SK_I, SK_J, SK_K, SK_L, SK_M, SK_N, SK_O, // p q r s t u v w SK_P, SK_Q, SK_R, SK_S, SK_T, SK_U, SK_V, SK_W, // x y z { | } ~ DEL - SK_X, SK_Y, SK_Z, SK_B, SK_W, SK_N, SK_1, KC_DEL + SK_X, SK_Y, SK_Z, SK_B, SK_W, SK_N, SK_PLUS, KC_DEL }; From fd6108371047bc02face67526e92b126715d67de Mon Sep 17 00:00:00 2001 From: TreasureTypes <73436366+TreasureTypes@users.noreply.github.com> Date: Mon, 6 Oct 2025 18:30:08 +0200 Subject: [PATCH 562/592] Add Keyboard Treasure TYPE-30 (#25688) --- .../treasure/type30/hotswap/keyboard.json | 121 ++++++++++++++++++ .../type30/hotswap/keymaps/default/keymap.c | 19 +++ keyboards/treasure/type30/hotswap/readme.md | 23 ++++ 3 files changed, 163 insertions(+) create mode 100644 keyboards/treasure/type30/hotswap/keyboard.json create mode 100644 keyboards/treasure/type30/hotswap/keymaps/default/keymap.c create mode 100644 keyboards/treasure/type30/hotswap/readme.md diff --git a/keyboards/treasure/type30/hotswap/keyboard.json b/keyboards/treasure/type30/hotswap/keyboard.json new file mode 100644 index 0000000000..54b7c6d6a7 --- /dev/null +++ b/keyboards/treasure/type30/hotswap/keyboard.json @@ -0,0 +1,121 @@ +{ + "manufacturer": "TREASURE", + "keyboard_name": "TYPE30", + "maintainer": "TREASURE", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "nkro": true, + "rgb_matrix": true + }, + + "matrix_pins": { + "cols": ["B5", "B6", "B7", "C7", "C6", "C4", "D4", "D5", "D6", "B0", "B1", "B2"], + "rows": ["D2", "C5", "B3"] + }, + "processor": "atmega32u2", + "rgb_matrix": { + "animations": { + "gradient_up_down": true, + "gradient_left_right": true + }, + "driver": "ws2812", + "default": { + "speed": 40, + "animation": "gradient_left_right" + }, + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0, "flags": 4 }, + { "matrix": [0, 1], "x": 20, "y": 0, "flags": 4 }, + { "matrix": [0, 2], "x": 40, "y": 0, "flags": 4 }, + { "matrix": [0, 3], "x": 60, "y": 0, "flags": 4 }, + { "matrix": [0, 4], "x": 80, "y": 0, "flags": 4 }, + { "matrix": [0, 5], "x": 100, "y": 0, "flags": 4 }, + { "matrix": [0, 6], "x": 120, "y": 0, "flags": 4 }, + { "matrix": [0, 7], "x": 140, "y": 0, "flags": 4 }, + { "matrix": [0, 8], "x": 160, "y": 0, "flags": 4 }, + { "matrix": [0, 9], "x": 180, "y": 0, "flags": 4 }, + { "matrix": [0,10], "x": 200, "y": 0, "flags": 4 }, + { "matrix": [0,11], "x": 220, "y": 0, "flags": 4 }, + { "matrix": [1, 0], "x": 0, "y": 32, "flags": 4 }, + { "matrix": [1, 1], "x": 20, "y": 32, "flags": 4 }, + { "matrix": [1, 2], "x": 40, "y": 32, "flags": 4 }, + { "matrix": [1, 3], "x": 60, "y": 32, "flags": 4 }, + { "matrix": [1, 4], "x": 80, "y": 32, "flags": 4 }, + { "matrix": [1, 5], "x": 100, "y": 32, "flags": 4 }, + { "matrix": [1, 6], "x": 120, "y": 32, "flags": 4 }, + { "matrix": [1, 7], "x": 140, "y": 32, "flags": 4 }, + { "matrix": [1, 8], "x": 160, "y": 32, "flags": 4 }, + { "matrix": [1, 9], "x": 180, "y": 32, "flags": 4 }, + { "matrix": [1,10], "x": 200, "y": 32, "flags": 4 }, + { "matrix": [1,11], "x": 220, "y": 32, "flags": 4 }, + { "matrix": [2, 0], "x": 0, "y": 64, "flags": 4 }, + { "matrix": [2, 1], "x": 20, "y": 64, "flags": 4 }, + { "matrix": [2, 2], "x": 40, "y": 64, "flags": 4 }, + { "matrix": [2, 3], "x": 60, "y": 64, "flags": 4 }, + { "matrix": [2, 4], "x": 80, "y": 64, "flags": 4 }, + { "matrix": [2, 5], "x": 100, "y": 64, "flags": 4 }, + { "matrix": [2, 6], "x": 120, "y": 64, "flags": 4 }, + { "matrix": [2, 7], "x": 140, "y": 64, "flags": 4 }, + { "matrix": [2, 8], "x": 160, "y": 64, "flags": 4 }, + { "matrix": [2, 9], "x": 180, "y": 64, "flags": 4 }, + { "matrix": [2,10], "x": 200, "y": 64, "flags": 4 }, + { "matrix": [2,11], "x": 220, "y": 64, "flags": 4 } + ], + "max_brightness": 180, + "sleep": true + }, + "url": "http://treasuretypes.com", + "usb": { + "device_version": "1.0.1", + "pid": "0x3330", + "vid": "0x5452" + }, + "ws2812": { + "pin": "B4" + }, + "layouts": { + "LAYOUT_ortho_3x12": { + "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": [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}, + {"matrix": [1, 4], "x": 4, "y": 1}, + {"matrix": [1, 5], "x": 5, "y": 1}, + {"matrix": [1, 6], "x": 6, "y": 1}, + {"matrix": [1, 7], "x": 7, "y": 1}, + {"matrix": [1, 8], "x": 8, "y": 1}, + {"matrix": [1, 9], "x": 9, "y": 1}, + {"matrix": [1, 10], "x": 10, "y": 1}, + {"matrix": [1, 11], "x": 11, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2}, + {"matrix": [2, 5], "x": 5, "y": 2}, + {"matrix": [2, 6], "x": 6, "y": 2}, + {"matrix": [2, 7], "x": 7, "y": 2}, + {"matrix": [2, 8], "x": 8, "y": 2}, + {"matrix": [2, 9], "x": 9, "y": 2}, + {"matrix": [2, 10], "x": 10, "y": 2}, + {"matrix": [2, 11], "x": 11, "y": 2} + ] + } + } +} diff --git a/keyboards/treasure/type30/hotswap/keymaps/default/keymap.c b/keyboards/treasure/type30/hotswap/keymaps/default/keymap.c new file mode 100644 index 0000000000..24ae38af89 --- /dev/null +++ b/keyboards/treasure/type30/hotswap/keymaps/default/keymap.c @@ -0,0 +1,19 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Base + [0] = LAYOUT_ortho_3x12( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, MO(1), KC_SPC, + KC_LCTL, KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RGUI, KC_UP, KC_DOWN + ), + // Fn + [1] = LAYOUT_ortho_3x12( + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + _______, S(KC_EQL), KC_MINS, KC_SLSH, KC_PAST, KC_LBRC, KC_RBRC, KC_BSLS, KC_SCLN, KC_QUOT, _______, KC_ENT, + _______, _______, KC_EQL, RM_TOGG, RM_HUEU, RM_NEXT, KC_GRV, KC_COMM, KC_DOT, _______, KC_LEFT, KC_RIGHT + ) +}; diff --git a/keyboards/treasure/type30/hotswap/readme.md b/keyboards/treasure/type30/hotswap/readme.md new file mode 100644 index 0000000000..33b95d5495 --- /dev/null +++ b/keyboards/treasure/type30/hotswap/readme.md @@ -0,0 +1,23 @@ +# Treasure TYPE-30 + +* Keyboard Maintainer: [Treasure](https://www,treasuretypes.com) +* Hardware Supported: Treasure TYPE-30 Hotswap PCB +* Hardware Availability: [Treasure Store](http://treasuretypes.com) + +Make example for this keyboard (after setting up your build environment): + + make treasure/type30/hotswap:default + +Flashing example for this keyboard: + + make treasure/type30/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: + +* **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 b9078609b649ff40f725233d628d2854977366f2 Mon Sep 17 00:00:00 2001 From: jacksaxi Date: Mon, 6 Oct 2025 19:44:26 +0300 Subject: [PATCH 563/592] Add Printronics Mectechpad (#25365) --- keyboards/mectechpad/config.h | 11 +++++ keyboards/mectechpad/keyboard.json | 40 +++++++++++++++++++ keyboards/mectechpad/keymaps/default/keymap.c | 37 +++++++++++++++++ keyboards/mectechpad/mectechpad.c | 25 ++++++++++++ keyboards/mectechpad/readme.md | 25 ++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 keyboards/mectechpad/config.h create mode 100644 keyboards/mectechpad/keyboard.json create mode 100644 keyboards/mectechpad/keymaps/default/keymap.c create mode 100644 keyboards/mectechpad/mectechpad.c create mode 100644 keyboards/mectechpad/readme.md diff --git a/keyboards/mectechpad/config.h b/keyboards/mectechpad/config.h new file mode 100644 index 0000000000..283902350e --- /dev/null +++ b/keyboards/mectechpad/config.h @@ -0,0 +1,11 @@ +// Copyright 2025 Jack Sachinidhs (@jacksaxi) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +/* LED pin definitions */ +#define LED_PIN_LAYER_0 GP12 +#define LED_PIN_LAYER_1 GP11 +#define LED_PIN_LAYER_2 GP10 +#define LED_PIN_LAYER_3 GP9 + +/* matrix mask for direct pin switch */ +#define MATRIX_MASKED diff --git a/keyboards/mectechpad/keyboard.json b/keyboards/mectechpad/keyboard.json new file mode 100644 index 0000000000..93c1fbaefc --- /dev/null +++ b/keyboards/mectechpad/keyboard.json @@ -0,0 +1,40 @@ +{ + "manufacturer": "Printronics", + "keyboard_name": "Mectechpad", + "maintainer": "jacksaxi", + "bootloader": "rp2040", + "debounce": 15, + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "rows": ["GP13", "GP26", "GP15", "GP14"], + "cols": ["GP29", "GP28", "GP27"] + }, + "processor": "RP2040", + "url": "printronics.gr", + "usb": { + "device_version": "1.0.0", + "pid": "0x1A2B", + "vid": "0x3C4D" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "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}, + {"matrix": [3, 0], "x": 0, "y": 3}, + {"matrix": [3, 1], "x": 1, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3} + ] + } + } +} diff --git a/keyboards/mectechpad/keymaps/default/keymap.c b/keyboards/mectechpad/keymaps/default/keymap.c new file mode 100644 index 0000000000..7e19ec069f --- /dev/null +++ b/keyboards/mectechpad/keymaps/default/keymap.c @@ -0,0 +1,37 @@ +// Copyright 2025 Jack Sachinidhs (@jacksaxi) +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +enum layers { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_LAYER0] = LAYOUT( + TO(_LAYER1), + KC_1, KC_2, KC_3, + KC_4, KC_5, KC_6, + KC_7, KC_8, KC_9 + ), + [_LAYER1] = LAYOUT( + TO(_LAYER2), + KC_Q, KC_W, KC_E, + KC_R, KC_T, KC_Y, + KC_U, KC_I, KC_O + ), + [_LAYER2] = LAYOUT( + TO(_LAYER3), + KC_A, KC_S, KC_D, + KC_F, KC_G, KC_H, + KC_J, KC_K, KC_L + ), + [_LAYER3] = LAYOUT( + TO(_LAYER0), + KC_Z, KC_X, KC_C, + KC_V, KC_B, KC_N, + KC_M, KC_COMM, KC_DOT + ) +}; diff --git a/keyboards/mectechpad/mectechpad.c b/keyboards/mectechpad/mectechpad.c new file mode 100644 index 0000000000..0aa520db1a --- /dev/null +++ b/keyboards/mectechpad/mectechpad.c @@ -0,0 +1,25 @@ +// Copyright 2025 Jack Sachinidhs (@jacksaxi) +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +void keyboard_post_init_kb(void) { + // Initialize LED pins + gpio_set_pin_output(LED_PIN_LAYER_0); + gpio_write_pin_low(LED_PIN_LAYER_0); + gpio_set_pin_output(LED_PIN_LAYER_1); + gpio_write_pin_low(LED_PIN_LAYER_1); + gpio_set_pin_output(LED_PIN_LAYER_2); + gpio_write_pin_low(LED_PIN_LAYER_2); + gpio_set_pin_output(LED_PIN_LAYER_3); + gpio_write_pin_low(LED_PIN_LAYER_3); + + keyboard_post_init_user(); +} + +// Update LEDs based on the current layer +void housekeeping_task_kb(void) { + gpio_write_pin(LED_PIN_LAYER_0, (get_highest_layer(layer_state) == 0)); + gpio_write_pin(LED_PIN_LAYER_1, (get_highest_layer(layer_state) == 1)); + gpio_write_pin(LED_PIN_LAYER_2, (get_highest_layer(layer_state) == 2)); + gpio_write_pin(LED_PIN_LAYER_3, (get_highest_layer(layer_state) == 3)); +} diff --git a/keyboards/mectechpad/readme.md b/keyboards/mectechpad/readme.md new file mode 100644 index 0000000000..515326baab --- /dev/null +++ b/keyboards/mectechpad/readme.md @@ -0,0 +1,25 @@ +# Mectechpad + +![Mectechpad](https://i.imgur.com/fNnLVLf.jpeg) + +* Keyboard Maintainer: [Jack Sachinidhs](https://github.com/jacksaxi) +* Hardware Supported: rp2040 +* Hardware Availability: [Printronics Website](https://printronics.gr) + +Make example for this keyboard (after setting up your build environment): + + make mectechpad:default + +Flashing example for this keyboard: + + make mectechpad: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 top left 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 7e8690eae14094b1a2fa1837eb13101bd709f967 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Tue, 7 Oct 2025 16:20:39 +1100 Subject: [PATCH 564/592] Add 'xap' branch to CI workflow and options (#25708) --- .github/workflows/ci_build_major_branch.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_build_major_branch.yml b/.github/workflows/ci_build_major_branch.yml index 48ae71114f..c37e1377b1 100644 --- a/.github/workflows/ci_build_major_branch.yml +++ b/.github/workflows/ci_build_major_branch.yml @@ -6,13 +6,13 @@ permissions: on: push: - branches: [master, develop] + branches: [master, develop, xap] workflow_dispatch: inputs: branch: type: choice description: "Branch to build" - options: [master, develop] + options: [master, develop, xap] env: # https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits @@ -52,7 +52,7 @@ jobs: run: | target_count=$( { qmk find -km default 2>/dev/null - # qmk find -km xap 2>/dev/null + qmk find -km xap 2>/dev/null } | sort | uniq | wc -l) slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution echo "slice_length=$slice_length" >> $GITHUB_OUTPUT @@ -63,8 +63,7 @@ jobs: strategy: fail-fast: false matrix: - keymap: [default] - # keymap: [default, xap] + keymap: [default, xap] uses: ./.github/workflows/ci_build_major_branch_keymap.yml with: branch: ${{ inputs.branch || github.ref_name }} From 4eee8c1023bccd1e4147f523de10767eddc17884 Mon Sep 17 00:00:00 2001 From: ascYAOBT <53766398+ascYAOBT@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:16:01 -0400 Subject: [PATCH 565/592] Add hnk65 (#25366) --- keyboards/hnk/hnk65/keyboard.json | 216 +++++++++++++++++++ keyboards/hnk/hnk65/keymaps/default/keymap.c | 54 +++++ keyboards/hnk/hnk65/readme.md | 25 +++ 3 files changed, 295 insertions(+) create mode 100644 keyboards/hnk/hnk65/keyboard.json create mode 100644 keyboards/hnk/hnk65/keymaps/default/keymap.c create mode 100644 keyboards/hnk/hnk65/readme.md diff --git a/keyboards/hnk/hnk65/keyboard.json b/keyboards/hnk/hnk65/keyboard.json new file mode 100644 index 0000000000..a72ff783ba --- /dev/null +++ b/keyboards/hnk/hnk65/keyboard.json @@ -0,0 +1,216 @@ +{ + "manufacturer": "hnkbd", + "keyboard_name": "hnk65", + "maintainer": "ascYAOBT", + "bootloader": "atmel-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["F4", "F5", "F1", "F0", "B7", "F6", "F7", "D0", "D1", "D2", "D3", "D5", "D4", "D6", "D7"], + "rows": ["C7", "C6", "B6", "B5", "B4"] + }, + "processor": "atmega32u4", + "rgb_matrix": { + "animations": { + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "rainbow_moving_chevron": true, + "cycle_out_in": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_rain": true, + "pixel_flow": true, + "typing_heatmap":true, + "solid_reactive_simple": true, + "solid_reactive_wide": true, + "solid_reactive_cross": true, + "splash": true + }, + "brightness_steps": 20, + "default": { + "val": 120, + "animation": "solid_color" + }, + "driver": "ws2812", + "hue_steps": 22, + "layout": [ + {"matrix": [0, 14], "x": 210, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 189, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 168, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 154, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 140, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 126, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 98, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 84, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 70, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 56, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 42, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 28, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 14, "y": 0, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 21, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 35, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 49, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 63, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 77, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 91, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 105, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 119, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 133, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 147, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 161, "y": 16, "flags": 4}, + {"matrix": [1, 12], "x": 175, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 185, "y": 16, "flags": 4}, + {"matrix": [1, 14], "x": 210, "y": 16, "flags": 4}, + {"matrix": [2, 14], "x": 210, "y": 32, "flags": 4}, + {"matrix": [2, 13], "x": 196, "y": 32, "flags": 4}, + {"matrix": [2, 11], "x": 161, "y": 32, "flags": 4}, + {"matrix": [2, 10], "x": 147, "y": 32, "flags": 4}, + {"matrix": [2, 9], "x": 133, "y": 32, "flags": 4}, + {"matrix": [2, 8], "x": 119, "y": 32, "flags": 4}, + {"matrix": [2, 7], "x": 105, "y": 32, "flags": 4}, + {"matrix": [2, 6], "x": 91, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 77, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 63, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 49, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 35, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 21, "y": 32, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 48, "flags": 4}, + {"matrix": [3, 1], "x": 32, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 46, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 60, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 74, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 88, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 104, "y": 48, "flags": 4}, + {"matrix": [3, 7], "x": 118, "y": 48, "flags": 4}, + {"matrix": [3, 8], "x": 132, "y": 48, "flags": 4}, + {"matrix": [3, 9], "x": 146, "y": 48, "flags": 4}, + {"matrix": [3, 10], "x": 160, "y": 48, "flags": 4}, + {"matrix": [3, 11], "x": 173, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 196, "y": 48, "flags": 4}, + {"matrix": [3, 14], "x": 210, "y": 48, "flags": 4}, + {"matrix": [4, 14], "x": 210, "y": 64, "flags": 4}, + {"matrix": [4, 13], "x": 196, "y": 64, "flags": 4}, + {"matrix": [4, 11], "x": 182, "y": 64, "flags": 4}, + {"matrix": [4, 10], "x": 168, "y": 64, "flags": 4}, + {"matrix": [4, 9], "x": 154, "y": 64, "flags": 4}, + {"matrix": [4, 8], "x": 140, "y": 64, "flags": 4}, + {"matrix": [4, 5], "x": 105, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 39, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 21, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 4, "y": 64, "flags": 4} + ], + "max_brightness": 170, + "saturation_steps": 22, + "sleep": true + }, + "url": "https://hnkbd.ca/", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x484E" + }, + "ws2812": { + "pin": "B2" + }, + "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], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"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, 11], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [3, 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, 5], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 8], "x": 10, "y": 4}, + {"matrix": [4, 9], "x": 11, "y": 4}, + {"matrix": [4, 10], "x": 12, "y": 4}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/hnk/hnk65/keymaps/default/keymap.c b/keyboards/hnk/hnk65/keymaps/default/keymap.c new file mode 100644 index 0000000000..efe7cc03fe --- /dev/null +++ b/keyboards/hnk/hnk65/keymaps/default/keymap.c @@ -0,0 +1,54 @@ +// Copyright 2023 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 │ - │ = │ Backsp│Home│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgUp│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼────┤ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgDn│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼────┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┼───┼────┤ + * │Ctrl│GUI │Alt │ │Alt│ Fn│Ctl│ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴────┘ + */ + + + [0] = LAYOUT_65_ansi( + 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_HOME, + 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_ENT, 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, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT,KC_DOWN, KC_RGHT + ), + + + /* + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┬───┬──────────┬────┐ + * │Grv│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11 │F12│ Ins │Del │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬─┴─┬─┴─┬────────┼────┤ + * │ │ │Vl+│ │ │ │ │SrL│ │ 7 │ 8 │ 9 │ \ │ SATU │HUEU│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┴┬──┴┬──┴────────┼────┤ + * │ │Mut│Vl-│Pau│ │ │ │ │ │ 4 │ 5 │ 6 │ SATD │HUED│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬─┴─┬─┴──────┬────┼────┤ + * │ │ | │ │ │ │ │ │ │ │ 1 │ 2 │ 3 │VALU│TOGG│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┬┴──┬┴───┬────┼────┼────┤ + * │ │ │ │ PScr │SPDD│ │SPDU│PREV│VALD│NEXT│ + * └────┴────┴────┴────────────────────────┴────┴───┴────┴────┴────┴────┘ + */ + + + [1] = LAYOUT_65_ansi( + 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, + _______, _______, KC_VOLU, _______, _______, _______, _______, KC_SCRL, _______, KC_7, KC_8, KC_9, KC_BSLS, RM_SATU, RM_HUEU, + _______, KC_MUTE, KC_VOLD, KC_PAUS, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, RM_SATD, RM_HUED, + _______, KC_PIPE, _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, RM_VALU, RM_TOGG, + _______, _______, _______, KC_PSCR, RM_SPDD, _______, RM_SPDU, RM_PREV, RM_VALD, RM_NEXT + ) +}; diff --git a/keyboards/hnk/hnk65/readme.md b/keyboards/hnk/hnk65/readme.md new file mode 100644 index 0000000000..e77dd86d1f --- /dev/null +++ b/keyboards/hnk/hnk65/readme.md @@ -0,0 +1,25 @@ +# hnk65 + +Our Hide Nothing Keyboard version of the traditional 65%, with or without RGB support. For more information visit https://hnkbd.ca + +* Keyboard Maintainer: [hnkbd](https://github.com/ascYAOBT) +* Hardware Supported: hnk65, either with or without per key RGB LED +* Hardware Availability: https://hnkbd.ca + +Make example for this keyboard (after setting up your build environment): + + make hnk/hnk65:default + +Flashing example for this keyboard: + + make hnk/hnk65: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 while plugged in and with QMK Toolbox opened. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 911232abfcbceb38866fb4e1654d3ef644a498a1 Mon Sep 17 00:00:00 2001 From: Enoch Date: Tue, 7 Oct 2025 18:16:30 -0700 Subject: [PATCH 566/592] add dropout keyboard (#25645) --- keyboards/enochchau/dropout/dropout.c | 33 ++++++++++ keyboards/enochchau/dropout/keyboard.json | 60 +++++++++++++++++++ .../dropout/keymaps/default/keymap.c | 35 +++++++++++ .../dropout/keymaps/default/rules.mk | 1 + keyboards/enochchau/dropout/readme.md | 27 +++++++++ 5 files changed, 156 insertions(+) create mode 100644 keyboards/enochchau/dropout/dropout.c create mode 100644 keyboards/enochchau/dropout/keyboard.json create mode 100644 keyboards/enochchau/dropout/keymaps/default/keymap.c create mode 100644 keyboards/enochchau/dropout/keymaps/default/rules.mk create mode 100644 keyboards/enochchau/dropout/readme.md diff --git a/keyboards/enochchau/dropout/dropout.c b/keyboards/enochchau/dropout/dropout.c new file mode 100644 index 0000000000..bef939fed1 --- /dev/null +++ b/keyboards/enochchau/dropout/dropout.c @@ -0,0 +1,33 @@ +// Copyright 2025 Enoch Chau +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +// Mimic handle_backlight_caps_lock to use num lock indicator for backlight +void handle_backlight_num_lock(led_t led_state) { + // Use backlight as num_lock indicator + uint8_t bl_toggle_lvl = 0; + bool backlight_enabled = is_backlight_enabled(); + + if (led_state.num_lock && !backlight_enabled) { + // Turning num_lock ON and backlight is disabled in config + // Toggling backlight to the brightest level + bl_toggle_lvl = BACKLIGHT_LEVELS; + } else if (!led_state.num_lock && backlight_enabled) { + // Turning num_lock OFF and backlight is enabled in config + // Toggling backlight and restoring config level + bl_toggle_lvl = get_backlight_level(); + } + + backlight_set(bl_toggle_lvl); +} + +bool led_update_kb(led_t led_state) { + bool res = led_update_user(led_state); + if (res) { +#ifdef BACKLIGHT_ENABLE + handle_backlight_num_lock(led_state); +#endif + } + return res; +} diff --git a/keyboards/enochchau/dropout/keyboard.json b/keyboards/enochchau/dropout/keyboard.json new file mode 100644 index 0000000000..f928181ef6 --- /dev/null +++ b/keyboards/enochchau/dropout/keyboard.json @@ -0,0 +1,60 @@ +{ + "manufacturer": "enochchau", + "keyboard_name": "dropout", + "maintainer": "enochchau", + "backlight": { + "levels": 6, + "on_state": 0, + "pin": "B6" + }, + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "D0", "pin_b": "D4"} + ] + }, + "features": { + "backlight": true, + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["B3", "B1", "D7", "C6"], + "rows": ["D1", "B2", "E6", "B4", "B5"] + }, + "tags": ["numpad"], + "url": "https://github.com/enochchau/dropout-numpad", + "usb": { + "device_version": "0.0.1", + "pid": "0x2800", + "vid": "0x9650" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Num Lock", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "/", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "*", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "Play", "matrix": [0, 3], "x": 3, "y": 0, "encoder": 0}, + {"label": "7", "matrix": [1, 0], "x": 0, "y": 1}, + {"label": "8", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "9", "matrix": [1, 2], "x": 2, "y": 1}, + {"label": "-", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "4", "matrix": [2, 0], "x": 0, "y": 2}, + {"label": "5", "matrix": [2, 1], "x": 1, "y": 2}, + {"label": "6", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "+", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "1", "matrix": [3, 0], "x": 0, "y": 3}, + {"label": "2", "matrix": [3, 1], "x": 1, "y": 3}, + {"label": "3", "matrix": [3, 2], "x": 2, "y": 3}, + {"label": "Enter", "matrix": [3, 3], "x": 3, "y": 3, "h": 2}, + {"label": "0", "matrix": [4, 0], "x": 0, "y": 4, "w": 2}, + {"label": ".", "matrix": [4, 2], "x": 2, "y": 4} + ] + } + } +} diff --git a/keyboards/enochchau/dropout/keymaps/default/keymap.c b/keyboards/enochchau/dropout/keymaps/default/keymap.c new file mode 100644 index 0000000000..15d954987e --- /dev/null +++ b/keyboards/enochchau/dropout/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +// Copyright 2025 Enoch Chau +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum layer_names { + _BASE, + _LIGHT +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT( + LT(1, KC_NUM), KC_PSLS, KC_PAST, KC_MPLY, + KC_P7, KC_P8, KC_P9, KC_PMNS, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, KC_PENT, + KC_P0, KC_PDOT + ), + + [_LIGHT] = LAYOUT( + _______, _______, _______, _______, + _______, BL_UP, BL_DOWN, BL_TOGG, + _______, _______, _______, _______, + _______, _______, _______, QK_BOOT, + _______, _______ + ) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = {ENCODER_CCW_CW(KC_VOLU, KC_VOLD)}, + [_LIGHT] = {ENCODER_CCW_CW(_______, _______)} +}; +#endif diff --git a/keyboards/enochchau/dropout/keymaps/default/rules.mk b/keyboards/enochchau/dropout/keymaps/default/rules.mk new file mode 100644 index 0000000000..ee32568148 --- /dev/null +++ b/keyboards/enochchau/dropout/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/enochchau/dropout/readme.md b/keyboards/enochchau/dropout/readme.md new file mode 100644 index 0000000000..8d595e8606 --- /dev/null +++ b/keyboards/enochchau/dropout/readme.md @@ -0,0 +1,27 @@ +# dropout + +![dropout](https://i.imgur.com/VTjdJ4e.jpeg) + +A numpad with a rotary encoder. + +* Keyboard Maintainer: [Enoch Chau](https://github.com/enochchau) +* Hardware Supported: PCB w/ Pro Micro compatible development board +* Hardware Availability: [Github](https://github.com/enochchau/dropout-numpad) + +Make example for this keyboard (after setting up your build environment): + + make enochchau/dropout:default + +Flashing example for this keyboard: + + make enochchau/dropout: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 micro-controller +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 338a7ed6d50465daf93f613da7e783ac00163096 Mon Sep 17 00:00:00 2001 From: Navid <147196417+navidyt@users.noreply.github.com> Date: Wed, 8 Oct 2025 05:42:47 +0330 Subject: [PATCH 567/592] Add stardustn0 (#25681) --- keyboards/stardustn0/keyboard.json | 124 ++++++++++++++++++ keyboards/stardustn0/keymaps/default/keymap.c | 51 +++++++ keyboards/stardustn0/readme.md | 25 ++++ 3 files changed, 200 insertions(+) create mode 100644 keyboards/stardustn0/keyboard.json create mode 100644 keyboards/stardustn0/keymaps/default/keymap.c create mode 100644 keyboards/stardustn0/readme.md diff --git a/keyboards/stardustn0/keyboard.json b/keyboards/stardustn0/keyboard.json new file mode 100644 index 0000000000..a13d0169a6 --- /dev/null +++ b/keyboards/stardustn0/keyboard.json @@ -0,0 +1,124 @@ +{ + "manufacturer": "Stars", + "keyboard_name": "StarDustN0", + "maintainer": "navidyt", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "cols": ["GP8","GP11","GP19","GP18","GP17","GP16"], + "rows": ["GP3","GP9","GP13","GP14","GP15"] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0x4E54" + }, + + "split": { + "enabled": true, + "matrix_pins": { + "right": { + "cols": ["GP15","GP14","GP13","GP12","GP20","GP26"], + "rows": ["GP28","GP22","GP18","GP17","GP16"] + } + }, + "usb_detect": { + "timeout": 2500 + }, + "serial": { + "driver":"vendor", + "pin":"GP1" + }, + "handedness":{ + "pin":"GP2" + }, + "transport": { + "watchdog": true + } + }, + "indicators":{ + "caps_lock" : "GP25" + }, + "layouts": { + "LAYOUT_split_4x6_4": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.9}, + {"matrix": [0, 1], "x": 1, "y": 0.9}, + {"matrix": [0, 2], "x": 2, "y": 0.2}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0.2}, + {"matrix": [0, 5], "x": 5, "y": 0.4}, + + {"matrix": [5, 0], "x": 11, "y": 0.4}, + {"matrix": [5, 1], "x": 12, "y": 0.2}, + {"matrix": [5, 2], "x": 13, "y": 0}, + {"matrix": [5, 3], "x": 14, "y": 0.2}, + {"matrix": [5, 4], "x": 15, "y": 0.9}, + {"matrix": [5, 5], "x": 16, "y": 0.9}, + + + {"matrix": [1, 0], "x": 0, "y": 1.9}, + {"matrix": [1, 1], "x": 1, "y": 1.9}, + {"matrix": [1, 2], "x": 2, "y": 1.2}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 4], "x": 4, "y": 1.2}, + {"matrix": [1, 5], "x": 5, "y": 1.4}, + + {"matrix": [6, 0], "x": 11, "y": 1.4}, + {"matrix": [6, 1], "x": 12, "y": 1.2}, + {"matrix": [6, 2], "x": 13, "y": 1}, + {"matrix": [6, 3], "x": 14, "y": 1.2}, + {"matrix": [6, 4], "x": 15, "y": 1.9}, + {"matrix": [6, 5], "x": 16, "y": 1.9}, + + + {"matrix": [2, 0], "x": 0, "y": 2.9}, + {"matrix": [2, 1], "x": 1, "y": 2.9}, + {"matrix": [2, 2], "x": 2, "y": 2.2}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 4], "x": 4, "y": 2.2}, + {"matrix": [2, 5], "x": 5, "y": 2.4}, + + {"matrix": [7, 0], "x": 11, "y": 2.4}, + {"matrix": [7, 1], "x": 12, "y": 2.2}, + {"matrix": [7, 2], "x": 13, "y": 2}, + {"matrix": [7, 3], "x": 14, "y": 2.2}, + {"matrix": [7, 4], "x": 15, "y": 2.9}, + {"matrix": [7, 5], "x": 16, "y": 2.9}, + + + {"matrix": [3, 0], "x": 0, "y": 3.9}, + {"matrix": [3, 1], "x": 1, "y": 3.9}, + {"matrix": [3, 2], "x": 2, "y": 3.2}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 4], "x": 4, "y": 3.2}, + {"matrix": [3, 5], "x": 5, "y": 3.4}, + + {"matrix": [8, 0], "x": 11, "y": 3.4}, + {"matrix": [8, 1], "x": 12, "y": 3.2}, + {"matrix": [8, 2], "x": 13, "y": 3}, + {"matrix": [8, 3], "x": 14, "y": 3.2}, + {"matrix": [8, 4], "x": 15, "y": 3.9}, + {"matrix": [8, 5], "x": 16, "y": 3.9}, + + + {"matrix": [4, 2], "x": 4, "y": 3.5}, + {"matrix": [4, 3], "x": 5, "y": 3.5}, + {"matrix": [4, 4], "x": 6, "y": 3.5}, + {"matrix": [4, 5], "x": 7, "y": 3.5}, + + {"matrix": [9, 0], "x": 8, "y": 3.5}, + {"matrix": [9, 1], "x": 9, "y": 3.5}, + {"matrix": [9, 2], "x": 10, "y": 3.5}, + {"matrix": [9, 3], "x": 11, "y": 3.5} + ] + } + } +} diff --git a/keyboards/stardustn0/keymaps/default/keymap.c b/keyboards/stardustn0/keymaps/default/keymap.c new file mode 100644 index 0000000000..21547811e8 --- /dev/null +++ b/keyboards/stardustn0/keymaps/default/keymap.c @@ -0,0 +1,51 @@ +// Copyright 2023 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 │ BSPC│ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │ TAB │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ BSLS│ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │LSFT │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │QUOT│ ENT │ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │LCTL │ Z │ X │ C │ V │ B │ │ N │ M │COMM│DOT │SLSH│RSFT │ +// └─────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴─────┘ +// ┌─────┬─────┬─────┬────┐ ┌─────┬─────┬─────┬─────┐ +// │ LGUI│MO(1)│ SPC │LALT│ │LEFT │DOWN │ UP │RIGHT│ +// └─────┴─────┴─────┴────┘ └─────┴─────┴─────┴─────┘ +// +// +// ┌─────┬────┬────┬────┬────┬────┐ ┌────┬────┬────┬────┬────┬─────┐ +// │ GRV │ F1 │ F2 │ F3 │ F4 │ F5 │ │ F6 │ F7 │ F8 │ F9 │ F10│ DEL │ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │CAPS │NO │NO │NO │NO │NO │ │MINS│ EQL│LBRC│RBRC│ F11│ F12 │ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │LSFT │NO │NO │NO │NO │NO │ │ NO │ NO │ NO │ NO │SCLN│ NO │ +// ├─────┼────┼────┼────┼────┼────┤ ├────┼────┼────┼────┼────┼─────┤ +// │LCTL │NO │NO │NO │NO │NO │ │ NO │ NO │ NO │ NO │ NO │RSFT │ +// └─────┴────┴────┴────┴────┴────┘ └────┴────┴────┴────┴────┴─────┘ +// ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ +// │ NO │ NO │ NO │LALT│ │HOME│PGDN│PGUP│ END│ +// └────┴────┴────┴────┘ └────┴────┴────┴────┘ + + + [0] = LAYOUT_split_4x6_4( + 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_BSLS, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, MO(1), KC_SPC, KC_LALT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT + ), + [1] = LAYOUT_split_4x6_4( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_F11, KC_F12, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SCLN, KC_NO, + KC_LCTL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, + KC_NO, KC_TRNS, KC_NO, KC_LALT, KC_HOME, KC_PGDN, KC_PGUP, KC_END + ) +}; diff --git a/keyboards/stardustn0/readme.md b/keyboards/stardustn0/readme.md new file mode 100644 index 0000000000..5a658e9b48 --- /dev/null +++ b/keyboards/stardustn0/readme.md @@ -0,0 +1,25 @@ +# stardustn0 + +![stardustn0](https://i.imgur.com/9SWMHH4.jpeg) + +This project is a custom-built split ergonomic mechanical keyboard, using two Raspberry Pi Pico microcontrollers. + +* Keyboard Maintainer: [navidyt](https://github.com/navidyt) +* Hardware Supported: Raspberry Pi Pico, MX switches, Gateron hot-swap sockets, 1N4148 diodes, generic USB-C breakout board + +Make example for this keyboard (after setting up your build environment): + + make stardustn0:default + +Flashing example for this keyboard: + + make stardustn0: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 reset button on the pico while connecting USB +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From a8711b2b0a59cd052419b2ae9a13355d012e12ac Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:41:48 +0700 Subject: [PATCH 568/592] [Keyboard] Add support Tyson65 (#25697) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Duncan Sutherland Co-authored-by: Joel Challis Co-authored-by: Trần Thanh Sơn --- keyboards/trnthsn/tyson65/config.h | 9 + keyboards/trnthsn/tyson65/halconf.h | 7 + keyboards/trnthsn/tyson65/info.json | 353 ++++++++++++++++++ .../trnthsn/tyson65/keymaps/default/keymap.c | 41 ++ keyboards/trnthsn/tyson65/mcuconf.h | 9 + keyboards/trnthsn/tyson65/readme.md | 28 ++ .../trnthsn/tyson65/stm32f072/keyboard.json | 4 + .../trnthsn/tyson65/stm32f103/keyboard.json | 4 + 8 files changed, 455 insertions(+) create mode 100644 keyboards/trnthsn/tyson65/config.h create mode 100644 keyboards/trnthsn/tyson65/halconf.h create mode 100644 keyboards/trnthsn/tyson65/info.json create mode 100644 keyboards/trnthsn/tyson65/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/tyson65/mcuconf.h create mode 100644 keyboards/trnthsn/tyson65/readme.md create mode 100644 keyboards/trnthsn/tyson65/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/tyson65/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/tyson65/config.h b/keyboards/trnthsn/tyson65/config.h new file mode 100644 index 0000000000..8ab8c1a85f --- /dev/null +++ b/keyboards/trnthsn/tyson65/config.h @@ -0,0 +1,9 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#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/tyson65/halconf.h b/keyboards/trnthsn/tyson65/halconf.h new file mode 100644 index 0000000000..7056539285 --- /dev/null +++ b/keyboards/trnthsn/tyson65/halconf.h @@ -0,0 +1,7 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE +#include_next diff --git a/keyboards/trnthsn/tyson65/info.json b/keyboards/trnthsn/tyson65/info.json new file mode 100644 index 0000000000..1828c6f832 --- /dev/null +++ b/keyboards/trnthsn/tyson65/info.json @@ -0,0 +1,353 @@ +{ + "manufacturer": "Tyson.Keebs", + "keyboard_name": "Tyson65", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A10", "A9", "A8", "B14", "B12", "B11", "B10", "B1", "A15", "B8", "B7", "B6", "B5", "B4", "B3"], + "rows": ["B0", "A7", "A6", "B9", "A4"] + }, + "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" + }, + "led_count": 30, + "sleep": true + }, + "ws2812": { + "pin": "B15", + "driver": "spi" + }, + "indicators": { + "caps_lock": "A5" + }, + "usb": { + "vid": "0x5453", + "pid": "0x6533", + "device_version": "0.0.1" + }, + "layout_aliases": { + "LAYOUT_all": "LAYOUT_65_ansi_blocker_tsangan_split_bs" + }, + "community_layouts": ["65_ansi_blocker_tsangan", "65_ansi_blocker_tsangan_split_bs", "65_iso_blocker_tsangan", "65_iso_blocker_tsangan_split_bs"], + "layouts": { + "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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": [1, 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": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan_split_bs": { + "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": [0, 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": [1, 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": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "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, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4}, + {"matrix": [4, 14], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_iso_blocker_tsangan_split_bs": { + "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": [0, 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, 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": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 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": [3, 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, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"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/trnthsn/tyson65/keymaps/default/keymap.c b/keyboards/trnthsn/tyson65/keymaps/default/keymap.c new file mode 100644 index 0000000000..b84bab6b63 --- /dev/null +++ b/keyboards/trnthsn/tyson65/keymaps/default/keymap.c @@ -0,0 +1,41 @@ +// Copyright 2025 Tyson.Keebs +// 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│Del│ + // ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + // │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│ + // ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + // │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│ + // ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + // │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│ + // ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤ + // │Ctrl │GUI│ Alt │ │ Fn │ │ ← │ ↓ │ → │ + // └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ + + + [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_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_ENT, 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, KC_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + [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, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, UG_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, + MO(2) , _______, _______, _______, _______, _______, _______, UG_NEXT, UG_VALD, UG_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; diff --git a/keyboards/trnthsn/tyson65/mcuconf.h b/keyboards/trnthsn/tyson65/mcuconf.h new file mode 100644 index 0000000000..d131af9fdf --- /dev/null +++ b/keyboards/trnthsn/tyson65/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/trnthsn/tyson65/readme.md b/keyboards/trnthsn/tyson65/readme.md new file mode 100644 index 0000000000..b22bf95d18 --- /dev/null +++ b/keyboards/trnthsn/tyson65/readme.md @@ -0,0 +1,28 @@ +# Tyson65 + +![trnthsn/tyson65](https://live.staticflickr.com/65535/54831930681_bf79fb1761_c.jpg) + +A 65% keyboard PCB compatible with various keyboard cases. Supports a middle USB Type-C connector, 5 JST SH1.0 and 2 JST ZH1.25 positions for a daughter board. + +* Keyboard Maintainer: [Trnthsn](https://github.com/trnthsn) +* Hardware Supported: STM32, Tyson65 +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/tyson65/stm32f103:default + +Flashing example for this keyboard: + + make trnthsn/tyson65/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/tyson65/stm32f072/keyboard.json b/keyboards/trnthsn/tyson65/stm32f072/keyboard.json new file mode 100644 index 0000000000..8bba6f5d5d --- /dev/null +++ b/keyboards/trnthsn/tyson65/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu" +} diff --git a/keyboards/trnthsn/tyson65/stm32f103/keyboard.json b/keyboards/trnthsn/tyson65/stm32f103/keyboard.json new file mode 100644 index 0000000000..4dc77604c4 --- /dev/null +++ b/keyboards/trnthsn/tyson65/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot" +} From 97d622651a9aca22c2af9afb22764fab04609525 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 10 Oct 2025 23:17:27 +0100 Subject: [PATCH 569/592] Align `drivers.txt` to qmk_toolbox (#25713) --- util/drivers.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/drivers.txt b/util/drivers.txt index e8ed7bdb0b..0490bfa4ab 100644 --- a/util/drivers.txt +++ b/util/drivers.txt @@ -5,6 +5,8 @@ # Use Windows Powershell and type [guid]::NewGuid() to generate guids winusb,STM32 Bootloader,0483,DF11,6d98a87f-4ecf-464d-89ed-8c684d857a75 winusb,APM32 Bootloader,314B,0106,9ff3cc31-6772-4a3f-a492-a80d91f7a853 +winusb,WB32 Bootloader,342D,DFA0,89b0fdf0-3d22-4408-8393-32147ba508ce +winusb,GD32V Bootloader,28E9,0189,e1421fd6-f799-4b6c-97e6-39e87d37f858 winusb,STM32duino Bootloader,1EAF,0003,746915ec-99d8-4a90-a722-3c85ba31e4fe libusbk,USBaspLoader,16C0,05DC,e69affdc-0ef0-427c-aefb-4e593c9d2724 winusb,Kiibohd DFU Bootloader,1C11,B007,aa5a3f86-b81e-4416-89ad-0c1ea1ed63af From 608bcf08fe5c0355beba644e65f3169c367e84c8 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 14 Oct 2025 07:35:22 +0100 Subject: [PATCH 570/592] Fix hhkb/jp layout order (#25722) --- keyboards/hhkb/jp/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/hhkb/jp/keyboard.json b/keyboards/hhkb/jp/keyboard.json index db96a92a6c..69bb681edf 100644 --- a/keyboards/hhkb/jp/keyboard.json +++ b/keyboards/hhkb/jp/keyboard.json @@ -48,7 +48,6 @@ {"matrix": [14, 3], "x": 10.5, "y": 1}, {"matrix": [15, 3], "x": 11.5, "y": 1}, {"matrix": [13, 3], "x": 12.5, "y": 1}, - {"matrix": [0, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, {"matrix": [6, 6], "x": 0, "y": 2, "w": 1.75}, {"matrix": [2, 6], "x": 1.75, "y": 2}, @@ -63,6 +62,7 @@ {"matrix": [15, 6], "x": 10.75, "y": 2}, {"matrix": [13, 6], "x": 11.75, "y": 2}, {"matrix": [12, 6], "x": 12.75, "y": 2}, + {"matrix": [0, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, {"matrix": [0, 5], "x": 0, "y": 3, "w": 2}, {"matrix": [6, 5], "x": 2, "y": 3}, From 969f324de4b029574e48bfb85c3b030a41bd4d06 Mon Sep 17 00:00:00 2001 From: Rin Jun Kit Liu <30439030+DesyncTheThird@users.noreply.github.com> Date: Sat, 18 Oct 2025 11:17:57 +0100 Subject: [PATCH 571/592] [Docs] Tap-Hold examples (#24391) * Update tap_hold.md Minor grammar/punctuation changes; Added some more tap-hold examples; Added a link about home row mods to the reference near the end; Replaced directional quotation marks with symmetric variant, as this seem to be the only page using them; Standardised formatting of "tap-hold" (hyphenated is slightly more frequent in existing documentation, so I went with that), as well as "Mod-Tap"/"Layer-Tap". * Update docs/tap_hold.md Co-authored-by: Ryan * Update docs/tap_hold.md Co-authored-by: Ryan --------- Co-authored-by: Ryan --- docs/tap_hold.md | 110 +++++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 38 deletions(-) diff --git a/docs/tap_hold.md b/docs/tap_hold.md index 164be229f6..bc2c505040 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -1,15 +1,15 @@ # Tap-Hold Configuration Options -While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonable defaults, but that may still cause issues for some people. +While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonable defaults, but that may still cause issues for some people. -These options let you modify the behavior of the Tap-Hold keys. +These options let you modify the behavior of the tap-hold keys. ## Tapping Term -The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. The exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key. +The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. The exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key. ::: tip -`DYNAMIC_TAPPING_TERM_ENABLE` enables three special keys that can help you quickly find a comfortable tapping term for you. See "Dynamic Tapping Term" for more details. +`DYNAMIC_TAPPING_TERM_ENABLE` enables three special keys that can help you quickly find a comfortable tapping term for you. See [Dynamic Tapping Term](#dynamic-tapping-term) for more details. ::: You can set the global time for this by adding the following setting to your `config.h`: @@ -18,14 +18,14 @@ You can set the global time for this by adding the following setting to your `co #define TAPPING_TERM 200 ``` -This setting is defined in milliseconds and defaults to 200ms. This is a good average for the majority of people. +This setting is defined in milliseconds and defaults to 200ms. This is a good average for the majority of people. For more granular control of this feature, you can add the following to your `config.h`: ```c #define TAPPING_TERM_PER_KEY ``` -You can then add the following function to your keymap: +You can then add the following function to your `keymap.c` to customise the tapping term for each key: ```c uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { @@ -40,9 +40,41 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { } ``` +### Example + +You can compare keycodes to `QK_MOD_TAP`/`QK_MOD_TAP_MAX` and `QK_LAYER_TAP`/`QK_LAYER_TAP_MAX` to filter out Mod-Tap/Layer-Tap keys, rather than checking such keys manually in a switch-case. For instance, this example sets all Mod-Tap keys to have a higher tapping term, while leaving all other tap-hold keys unchanged: + +```c +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + return TAPPING_TERM + 100; + default: + return TAPPING_TERM; + } +} +``` + +You can also use functions like `QK_MOD_TAP_GET_MODS`, `QK_LAYER_MOD_GET_MODS`, and `QK_ONE_SHOT_MOD_GET_MODS` to filter Mod-Tap/Layer-Mod/One Shot keys by their mods. + +For instance, this example sets a higher tapping term for `AltGr` Mod-Taps and lower tapping terms for `Shift` Mod-Taps: + +```c +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + uint8_t mod = mod_config(QK_MOD_TAP_GET_MODS(keycode)); + if (mod & MOD_LSFT != 0 || mod & MOD_RSFT != 0) { + return 100; + } + if (mod & MOD_RALT != 0) { + return TAPPING_TERM + 50; + } + return TAPPING_TERM; +} +``` + ### Dynamic Tapping Term {#dynamic-tapping-term} -`DYNAMIC_TAPPING_TERM_ENABLE` is a feature you can enable in `rules.mk` that lets you use three special keys in your keymap to configure the tapping term on the fly. +`DYNAMIC_TAPPING_TERM_ENABLE` is a feature you can enable in `rules.mk` that lets you use three special keys in your keymap to configure the tapping term on the fly: | Key | Aliases | Description | |-------------------------------|---------|-------------------------------------------------------------------------------------------| @@ -52,13 +84,13 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { Set the tapping term as usual with `#define TAPPING_TERM ` in `config.h` and add `DYNAMIC_TAPPING_TERM_ENABLE = yes` in `rules.mk`. Then, place the above three keys somewhere in your keymap and flash the new firmware onto your board. -Now, you can try using your dual-role keys, such as layer-taps and mod-taps, and use `DT_DOWN` and `DT_UP` to adjust the tapping term immediately. If you find that you frequently trigger the modifier of your mod-tap(s) by accident, for example, that's a sign that your tapping term may be too low so tap `DT_UP` a few times to increase the tapping term until that no longer happens. On the flip side, if you get superfluous characters when you actually intended to momentarily activate a layer, tap `DT_DOWN` to lower the tapping term. Do note that these keys affect the *global* tapping term, you cannot change the tapping term of a specific key on the fly. +Now, you can try using your dual-role keys such as Layer-Taps and Mod-Taps and use `DT_DOWN` and `DT_UP` to adjust the tapping term immediately. If you find that you frequently trigger the modifier of your Mod-Tap(s) by accident, for example, that's a sign that your tapping term may be too low, so tap `DT_UP` a few times to increase the tapping term until that no longer happens. Conversely, if you get superfluous characters when you actually intended to momentarily activate a layer, tap `DT_DOWN` to lower the tapping term. Do note that these keys affect the *global* tapping term, you cannot change the tapping term of a specific key on the fly. -Once you're satisfied with the current tapping term value, open `config.h` and replace whatever value you first wrote for the tapping term by the output of the `DT_PRNT` key. +Once you're satisfied with the current tapping term value, you can tap the `DT_PRNT` key to see your new tapping term, and you can replace the tapping term in `config.h` with this new value. -It's important to update `TAPPING_TERM` with the new value because the adjustments made using `DT_UP` and `DT_DOWN` are not persistent. +It's important to update `TAPPING_TERM` with the new value because the adjustments made using `DT_UP` and `DT_DOWN` are *not* persistent. -The value by which the tapping term increases or decreases when you tap `DT_UP` and `DT_DOWN` can be configured in `config.h` with `#define DYNAMIC_TAPPING_TERM_INCREMENT `. Note that the tapping term is *not* modified when holding down the tap term keys so if you need to, for example, decrease the current tapping term by 50ms, you cannot just press down and hold `DT_DOWN`; you will have to tap it 10 times in a row with the default increment of 5ms. +The value by which the tapping term increases or decreases when you tap `DT_UP` and `DT_DOWN` can be configured in `config.h` with `#define DYNAMIC_TAPPING_TERM_INCREMENT `. Note that the tapping term is *not* modified when *holding* down the tap term keys, so if you need to, for example, decrease the current tapping term by 50ms, you cannot just press down and hold `DT_DOWN`; you will have to tap it 10 times in a row with the default increment of 5ms. If you need more flexibility, nothing prevents you from defining your own custom keys to dynamically change the tapping term. @@ -97,7 +129,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { }; ``` -In order for this feature to be effective if you use per-key tapping terms, you need to make a few changes to the syntax of the `get_tapping_term` function. All you need to do is replace every occurrence of `TAPPING_TERM` in the `get_tapping_term` function by lowercase `g_tapping_term`. If you don't do that, you will still see the value typed by `DT_PRNT` go up and down as you configure the tapping term on the fly but you won't feel those changes as they don't get applied. If you can go as low as 10ms and still easily trigger the tap function of a dual-role key, that's a sign that you forgot to make the necessary changes to your `get_tapping_term` function. +In order for this feature to be effective, if you use per-key tapping terms, then you need to make a few changes to the syntax of the `get_tapping_term` function. All you need to do is replace every occurrence of `TAPPING_TERM` in the `get_tapping_term` function by lowercase `g_tapping_term`. If you don't do this, you will still see the value typed by `DT_PRNT` go up and down as you configure the tapping term on the fly, but you won't feel those changes as they don't get applied. If you can go as low as 10ms and still easily trigger the tap function of a dual-role key, that's a sign that you forgot to make the necessary changes to your `get_tapping_term` function. For instance, here's how the example `get_tapping_term` shown earlier should look after the transformation: @@ -114,23 +146,23 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { } ``` -The reason is that `TAPPING_TERM` is a macro that expands to a constant integer and thus cannot be changed at runtime whereas `g_tapping_term` is a variable whose value can be changed at runtime. If you want, you can temporarily enable `DYNAMIC_TAPPING_TERM_ENABLE` to find a suitable tapping term value and then disable that feature and revert back to using the classic syntax for per-key tapping term settings. In case you need to access the tapping term from elsewhere in your code, you can use the `GET_TAPPING_TERM(keycode, record)` macro. This macro will expand to whatever is the appropriate access pattern given the current configuration. +The reason is that `TAPPING_TERM` is a macro that expands to a constant integer and thus cannot be changed at runtime, whereas `g_tapping_term` is a variable whose value can be changed at runtime. If you want, you can temporarily enable `DYNAMIC_TAPPING_TERM_ENABLE` to find a suitable tapping term value and then disable that feature and revert back to using the classic syntax for per-key tapping term settings. In case you need to access the tapping term from elsewhere in your code, you can use the `GET_TAPPING_TERM(keycode, record)` macro. This macro will expand to whatever is the appropriate access pattern given the current configuration. ## Tap-Or-Hold Decision Modes The code which decides between the tap and hold actions of dual-role keys supports three different modes, in increasing order of preference for the hold action: -1. The default mode selects the hold action only if the dual-role key is held down longer than the tapping term. In this mode pressing other keys while the dual-role key is held down does not influence the tap-or-hold decision. In other words, this mode ignores interrupts. +1. The default mode selects the hold action only if the dual-role key is held down longer than the tapping term. In this mode, pressing other keys while the dual-role key is held down does not influence the tap-or-hold decision. In other words, this mode ignores interrupts. -2. The “permissive hold” mode, in addition to the default behavior, immediately selects the hold action when another key is tapped (pressed and then released) while the dual-role key is held down, even if this happens earlier than the tapping term. If another key is just pressed, but then the dual-role key is released before that other key (and earlier than the tapping term), this mode will still select the tap action. +2. The "permissive hold" mode, in addition to the default behavior, immediately selects the hold action when another key is tapped (pressed and then released) while the dual-role key is held down, even if this happens earlier than the tapping term. If another key is just pressed, but then the dual-role key is released before that other key (and earlier than the tapping term), this mode will still select the tap action. That is, this mode converts "nested" sequences, but not "rolls". -3. The “hold on other key press” mode, in addition to the default behavior, immediately selects the hold action when another key is pressed while the dual-role key is held down, even if this happens earlier than the tapping term. +3. The "hold on other key press" mode, in addition to the default behavior, immediately selects the hold action when another key is pressed while the dual-role key is held down, even if this happens earlier than the tapping term. Note that until the tap-or-hold decision completes (which happens when either the dual-role key is released, or the tapping term has expired, or the extra condition for the selected decision mode is satisfied), key events are delayed and not transmitted to the host immediately. The default mode gives the most delay (if the dual-role key is held down, this mode always waits for the whole tapping term), and the other modes may give less delay when other keys are pressed, because the hold action may be selected earlier. ### Comparison {#comparison} -To better illustrate the tap-or-hold decision modes, let us compare the expected output of each decision mode in a handful of tapping scenarios involving a mod-tap key (`LSFT_T(KC_A)`) and a regular key (`KC_B`) with the `TAPPING_TERM` set to 200ms. +To better illustrate the tap-or-hold decision modes, let us compare the expected output of each decision mode in a handful of tapping scenarios involving a Mod-Tap key (`LSFT_T(KC_A)`) and a regular key (`KC_B`) with the `TAPPING_TERM` set to 200ms. Note: "`kc` held" in the "Physical key event" column means that the key wasn't physically released yet at this point in time. @@ -228,7 +260,7 @@ The above sequence will not send `KC_RGHT` but `KC_A` `KC_L` instead, since `LT( --- -Example sequence 3 (Mod Tap): +Example sequence 3 (Mod-Tap): ``` TAPPING_TERM @@ -246,17 +278,17 @@ followed by any key event that happened after the initial press of `SFT_T(KC_A)` ### Permissive Hold -The “permissive hold” mode can be enabled for all dual-role keys by adding the corresponding option to `config.h`: +The "permissive hold" mode can be enabled for all dual-role keys by adding the corresponding option to `config.h`: ```c #define PERMISSIVE_HOLD ``` -This makes tap and hold keys (like Layer Tap) work better for fast typists, or for high `TAPPING_TERM` settings. +This makes tap and hold keys (like Layer-Tap) work better for fast typists, or for high `TAPPING_TERM` settings. -If you press a dual-role key, tap another key (press and release) and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `PERMISSIVE_HOLD` option is enabled, the dual-role key will perform its hold action instead. +If you press a dual-role key, tap another key (press and release) and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `PERMISSIVE_HOLD` option is enabled, the dual-role key will perform its hold action instead. -An example of a sequence that is affected by the “permissive hold” mode: +An example of a sequence that is affected by the "permissive hold" mode: - `LT(2, KC_A)` Down - `KC_L` Down (the `L` key is also mapped to `KC_RGHT` on layer 2) @@ -275,9 +307,9 @@ An example of a sequence that is affected by the “permissive hold” mode: +---------------------------|--------+ ``` -Normally, if you do all this within the `TAPPING_TERM` (default: 200ms), this will be registered as `al` by the firmware and host system. With the `PERMISSIVE_HOLD` option enabled, the Layer Tap key is considered as a layer switch if another key is tapped, and the above sequence would be registered as `KC_RGHT` (the mapping of `L` on layer 2). We could describe this sequence as a “nested tap” (the modified key's key down and key up events are “nested” between the dual-role key's key down and key up events). +Normally, if you do all this within the `TAPPING_TERM` (default: 200ms), this will be registered as `al` by the firmware and host system. With the `PERMISSIVE_HOLD` option enabled, the Layer-Tap key is considered as a layer switch if another key is tapped, and the above sequence would be registered as `KC_RGHT` (the mapping of `L` on layer 2). We could describe this sequence as a "nested tap" (the modified key's key down and key up events are "nested" between the dual-role key's key down and key up events). -However, this slightly different sequence will not be affected by the “permissive hold” mode: +However, this slightly different sequence will not be affected by the "permissive hold" mode: - `LT(2, KC_A)` Down - `KC_L` Down (the `L` key is also mapped to `KC_RGHT` on layer 2) @@ -296,10 +328,10 @@ However, this slightly different sequence will not be affected by the “permiss +---------------------------|--------+ ``` -In the sequence above the dual-role key is released before the other key is released, and if that happens within the tapping term, the “permissive hold” mode will still choose the tap action for the dual-role key, and the sequence will be registered as `al` by the host. We could describe this as a “rolling press” (the two keys' key down and key up events behave as if you were rolling a ball across the two keys, first pressing each key down in sequence and then releasing them in the same order). +In the sequence above the dual-role key is released before the other key is released, and if that happens within the tapping term, the "permissive hold" mode will still choose the tap action for the dual-role key, and the sequence will be registered as `al` by the host. We could describe this as a "rolling press" (the two keys' key down and key up events behave as if you were rolling a ball across the two keys, first pressing each key down in sequence and then releasing them in the same order). ::: tip -The `PERMISSIVE_HOLD` option is not noticeable if you also enable `HOLD_ON_OTHER_KEY_PRESS` because the latter option considers both the “nested tap” and “rolling press” sequences like shown above as a hold action, not the tap action. `HOLD_ON_OTHER_KEY_PRESS` makes the Tap-Or-Hold decision earlier in the chain of key events, thus taking a precedence over `PERMISSIVE_HOLD`. +The `PERMISSIVE_HOLD` option is not noticeable if you also enable `HOLD_ON_OTHER_KEY_PRESS` because the latter option considers both the "nested tap" and "rolling press" sequences like shown above as a hold action, not the tap action. `HOLD_ON_OTHER_KEY_PRESS` makes the tap-or-hold decision earlier in the chain of key events, thus taking a precedence over `PERMISSIVE_HOLD`. ::: For more granular control of this feature, you can add the following to your `config.h`: @@ -323,19 +355,21 @@ bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) { } ``` +As in the earlier example, you can filter Mod-Tap/Layer-Mod/One Shot keys by their mods rather than checking such keys manually in a switch-case. (Also applicable to the other following `PER_KEY` functions.) + ### Hold On Other Key Press -The “hold on other key press” mode can be enabled for all dual-role keys by adding the corresponding option to `config.h`: +The "hold on other key press" mode can be enabled for all dual-role keys by adding the corresponding option to `config.h`: ```c #define HOLD_ON_OTHER_KEY_PRESS ``` -This mode makes tap and hold keys (like Layer Tap) work better for fast typists, or for high `TAPPING_TERM` settings. Compared to the “permissive hold” mode, this mode selects the hold action in more cases. +This mode makes tap and hold keys (like Layer-Tap) work better for fast typists, or for high `TAPPING_TERM` settings. Compared to the "permissive hold" mode, this mode selects the hold action in more cases. -If you press a dual-role key, press another key, and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `HOLD_ON_OTHER_KEY_PRESS` option is enabled, the dual-role key will perform its hold action instead. +If you press a dual-role key, press another key, and then release the dual-role key, all within the tapping term, by default the dual-role key will perform its tap action. If the `HOLD_ON_OTHER_KEY_PRESS` option is enabled, the dual-role key will perform its hold action instead. -An example of a sequence that is affected by the “hold on other key press” mode, but not by the “permissive hold” mode: +An example of a sequence that is affected by the "hold on other key press" mode, but not by the "permissive hold" mode: - `LT(2, KC_A)` Down - `KC_L` Down (the `L` key is also mapped to `KC_RGHT` on layer 2) @@ -354,7 +388,7 @@ An example of a sequence that is affected by the “hold on other key press” m +---------------------------|--------+ ``` -Normally, if you do all this within the `TAPPING_TERM` (default: 200ms), this will be registered as `al` by the firmware and host system. With the `HOLD_ON_OTHER_KEY_PRESS` option enabled, the Layer Tap key is considered as a layer switch if another key is pressed, and the above sequence would be registered as `KC_RGHT` (the mapping of `L` on layer 2). +Normally, if you do all this within the `TAPPING_TERM` (default: 200ms), this will be registered as `al` by the firmware and host system. With the `HOLD_ON_OTHER_KEY_PRESS` option enabled, the Layer-Tap key is considered as a layer switch if another key is pressed, and the above sequence would be registered as `KC_RGHT` (the mapping of `L` on layer 2). For more granular control of this feature, you can add the following to your `config.h`: @@ -394,9 +428,9 @@ Example: - `SFT_T(KC_A)` Down - (wait until tapping term expires...) -With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function until the key is released. +With default settings, `a` will be sent on the first release, then `a` will be sent on the second press, allowing the computer to trigger its auto repeat function until the key is released. -With `QUICK_TAP_TERM` configured, the timing between `SFT_T(KC_A)` up and `SFT_T(KC_A)` down must be within `QUICK_TAP_TERM` to trigger auto repeat. Otherwise the second press will be sent as a Shift. If `QUICK_TAP_TERM` is set to `0`, the second press will always be sent as a Shift, effectively disabling auto-repeat. +With `QUICK_TAP_TERM` configured, the timing between `SFT_T(KC_A)` up and `SFT_T(KC_A)` down must be within `QUICK_TAP_TERM` to trigger auto-repeat. Otherwise, the second press will be sent as a Shift. If `QUICK_TAP_TERM` is set to `0`, the second press will always be sent as a Shift, effectively disabling auto-repeat. ::: warning `QUICK_TAP_TERM` timing will also impact anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tap Toggle). @@ -714,10 +748,10 @@ bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) { } ``` -If the programs you use bind an action to taps of modifier keys (e.g. tapping left GUI to bring up the applications menu or tapping left Alt to focus the menu bar), you may find that using retro-tapping falsely triggers those actions. To counteract this, you can define a `DUMMY_MOD_NEUTRALIZER_KEYCODE` in `config.h` that will get sent in between the register and unregister events of a held mod-tap key. That way, the programs on your computer will no longer interpret the mod suppression induced by retro-tapping as a lone tap of a modifier key and will thus not falsely trigger the undesired action. +If the programs you use bind an action to taps of modifier keys (e.g. tapping left GUI to bring up the applications menu or tapping left Alt to focus the menu bar), you may find that using retro-tapping falsely triggers those actions. To counteract this, you can define a `DUMMY_MOD_NEUTRALIZER_KEYCODE` in `config.h` that will get sent in between the register and unregister events of a held Mod-Tap key. That way, the programs on your computer will no longer interpret the mod suppression induced by retro-tapping as a lone tap of a modifier key and will thus not falsely trigger the undesired action. Naturally, for this technique to be effective, you must choose a `DUMMY_MOD_NEUTRALIZER_KEYCODE` for which no keyboard shortcuts are bound to. Recommended values are: `KC_RIGHT_CTRL` or `KC_F18`. -Please note that `DUMMY_MOD_NEUTRALIZER_KEYCODE` must be a basic, unmodified, HID keycode so values like `KC_NO`, `KC_TRANSPARENT` or `KC_PIPE` aka `S(KC_BACKSLASH)` are not permitted. +Please note that `DUMMY_MOD_NEUTRALIZER_KEYCODE` must be a basic, unmodified, HID keycode, so values like `KC_NO`, `KC_TRANSPARENT`, or `KC_PIPE` (aka `S(KC_BACKSLASH)`) are not permitted. By default, only left Alt and left GUI are neutralized. If you want to change the list of applicable modifier masks, use the following in your `config.h`: @@ -743,14 +777,14 @@ Do not use `MOD_xxx` constants like `MOD_LSFT` or `MOD_RALT`, since they're 5-bi ### Retro Shift -[Auto Shift,](features/auto_shift) has its own version of `retro tapping` called `retro shift`. It is extremely similar to `retro tapping`, but holding the key past `AUTO_SHIFT_TIMEOUT` results in the value it sends being shifted. Other configurations also affect it differently; see [here](features/auto_shift#retro-shift) for more information. +[Auto Shift](features/auto_shift) has its own version of `retro tapping` called `retro shift`. It is extremely similar to `retro tapping`, but holding the key past `AUTO_SHIFT_TIMEOUT` results in the value it sends being shifted. Other configurations also affect it differently; see [here](features/auto_shift#retro-shift) for more information. ## Why do we include the key record for the per key functions? One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that. -Well, it's simple really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.key.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine-tune those to not interfere with your normal typing. +Well, it's simple really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.key.row == 3)` instead of checking a whole bunch of keycodes, which is especially good for those people using the tap-hold keys on the home row (see about *home row mods* [here](https://precondition.github.io/home-row-mods)). So, you could fine-tune those to not interfere with your normal typing. ## Why are there no `*_kb` or `*_user` functions?! -Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard-level function. Only user-level functions are useful here, so no need to mark them as such. +Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum- or keyboard-level function. Only user-level functions are useful here, so there is no need to mark them as such. \ No newline at end of file From 1a32aa12e039ccec0c8e73d7039caf0f0e78e9b9 Mon Sep 17 00:00:00 2001 From: xenogear74 <51131374+xenogear74@users.noreply.github.com> Date: Sun, 19 Oct 2025 21:50:45 -0400 Subject: [PATCH 572/592] Fix `vertex/t75` layout coordinates (#25736) Updated the Y value for row 5. Before they were set to row 4 as well, which caused qmk configurator to overlap rows 4 and 5. --- keyboards/vertex/t75/keyboard.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/keyboards/vertex/t75/keyboard.json b/keyboards/vertex/t75/keyboard.json index f67326afb8..824659e827 100644 --- a/keyboards/vertex/t75/keyboard.json +++ b/keyboards/vertex/t75/keyboard.json @@ -103,15 +103,15 @@ {"matrix": [4, 11], "x": 12.25, "y": 4, "w": 1.75}, {"matrix": [4, 12], "x": 14, "y": 4}, {"matrix": [4, 13], "x": 15, "y": 4}, - {"matrix": [5, 0], "x": 0, "y": 4, "w": 1.25}, - {"matrix": [5, 1], "x": 1.25, "y": 4, "w": 1.25}, - {"matrix": [5, 2], "x": 2.5, "y": 4, "w": 1.25}, - {"matrix": [5, 5], "x": 3.75, "y": 4, "w": 6.25}, - {"matrix": [5, 9], "x": 10, "y": 4, "w": 1.25}, - {"matrix": [5, 10], "x": 11.25, "y": 4, "w": 1.25}, - {"matrix": [5, 11], "x": 13, "y": 4}, - {"matrix": [5, 12], "x": 14, "y": 4}, - {"matrix": [5, 13], "x": 15, "y": 4} + {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25}, + {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25}, + {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25}, + {"matrix": [5, 5], "x": 3.75, "y": 5, "w": 6.25}, + {"matrix": [5, 9], "x": 10, "y": 5, "w": 1.25}, + {"matrix": [5, 10], "x": 11.25, "y": 5, "w": 1.25}, + {"matrix": [5, 11], "x": 13, "y": 5}, + {"matrix": [5, 12], "x": 14, "y": 5}, + {"matrix": [5, 13], "x": 15, "y": 5} ] } } From d0db38cbdc9410dd58e6c83d18bca2232b823d24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 10:57:34 +0100 Subject: [PATCH 573/592] Bump vite from 5.4.20 to 5.4.21 in /builddefs/docsgen (#25740) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.20 to 5.4.21. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- builddefs/docsgen/package.json | 2 +- builddefs/docsgen/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json index 19c80580d6..b6c56f3448 100644 --- a/builddefs/docsgen/package.json +++ b/builddefs/docsgen/package.json @@ -1,7 +1,7 @@ { "license": "GPL-2.0-or-later", "devDependencies": { - "vite": "^5.4.20", + "vite": "^5.4.21", "vitepress": "^1.1.0", "vitepress-plugin-tabs": "^0.5.0", "vue": "^3.4.24" diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock index bc2edf6024..e5eaaa2c8f 100644 --- a/builddefs/docsgen/yarn.lock +++ b/builddefs/docsgen/yarn.lock @@ -766,10 +766,10 @@ tabbable@^6.2.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -vite@^5.2.9, vite@^5.4.20: - version "5.4.20" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.20.tgz#3267a5e03f21212f44edfd72758138e8fcecd76a" - integrity sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g== +vite@^5.2.9, vite@^5.4.21: + version "5.4.21" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" + integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== dependencies: esbuild "^0.21.3" postcss "^8.4.43" From 1c1e8d7f7af36ae668a9a690f22e6535a48fde57 Mon Sep 17 00:00:00 2001 From: kay <106367116+kaybarkbark@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:19:48 -0700 Subject: [PATCH 574/592] Fix Broken Numpad 0 on `yacobo` IBM Model M (#25742) I built three of these and was confused as to why my numpad 0 wasn't working. Eventually, I consulted this website to see the key matrix for the Model M https://sharktastica.co.uk/sims/matrix?kb=enhanced `kp_0` is in the matrix at [0, 12], not [0, 11]. Simple off by one error. I fixed this, flashed to all my keyboards, and it worked. Co-authored-by: Kay Barkbark --- keyboards/ibm/model_m/yacobo/keyboard.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ibm/model_m/yacobo/keyboard.json b/keyboards/ibm/model_m/yacobo/keyboard.json index 7ea9c6a621..dd88ac5cd4 100644 --- a/keyboards/ibm/model_m/yacobo/keyboard.json +++ b/keyboards/ibm/model_m/yacobo/keyboard.json @@ -153,7 +153,7 @@ {"label": "\u2193", "matrix": [7, 11], "x": 16.5, "y": 5.5}, {"label": "\u2192", "matrix": [7, 12], "x": 17.5, "y": 5.5}, - {"label": "0", "matrix": [0, 11], "x": 19, "y": 5.5, "w": 2}, + {"label": "0", "matrix": [0, 12], "x": 19, "y": 5.5, "w": 2}, {"label": ".", "matrix": [0, 13], "x": 21, "y": 5.5} ] }, @@ -277,7 +277,7 @@ {"label": "\u2193", "matrix": [7, 11], "x": 16.5, "y": 5.5}, {"label": "\u2192", "matrix": [7, 12], "x": 17.5, "y": 5.5}, - {"label": "0", "matrix": [0, 11], "x": 19, "y": 5.5, "w": 2}, + {"label": "0", "matrix": [0, 12], "x": 19, "y": 5.5, "w": 2}, {"label": ".", "matrix": [0, 13], "x": 21, "y": 5.5} ] } From 7d0fc5d486f701c527ed0c3cb1d5d759a0440240 Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Thu, 23 Oct 2025 07:55:33 +0700 Subject: [PATCH 575/592] [Keyboard] Add support Tyson60 (#25702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Duncan Sutherland Co-authored-by: Joel Challis Co-authored-by: Trần Thanh Sơn --- keyboards/trnthsn/tyson60/config.h | 9 ++ keyboards/trnthsn/tyson60/halconf.h | 7 ++ keyboards/trnthsn/tyson60/info.json | 114 ++++++++++++++++++ .../trnthsn/tyson60/keymaps/default/keymap.c | 40 ++++++ keyboards/trnthsn/tyson60/mcuconf.h | 9 ++ keyboards/trnthsn/tyson60/readme.md | 27 +++++ .../trnthsn/tyson60/stm32f072/keyboard.json | 4 + .../trnthsn/tyson60/stm32f103/keyboard.json | 4 + 8 files changed, 214 insertions(+) create mode 100644 keyboards/trnthsn/tyson60/config.h create mode 100644 keyboards/trnthsn/tyson60/halconf.h create mode 100644 keyboards/trnthsn/tyson60/info.json create mode 100644 keyboards/trnthsn/tyson60/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/tyson60/mcuconf.h create mode 100644 keyboards/trnthsn/tyson60/readme.md create mode 100644 keyboards/trnthsn/tyson60/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/tyson60/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/tyson60/config.h b/keyboards/trnthsn/tyson60/config.h new file mode 100644 index 0000000000..8ab8c1a85f --- /dev/null +++ b/keyboards/trnthsn/tyson60/config.h @@ -0,0 +1,9 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#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/tyson60/halconf.h b/keyboards/trnthsn/tyson60/halconf.h new file mode 100644 index 0000000000..7056539285 --- /dev/null +++ b/keyboards/trnthsn/tyson60/halconf.h @@ -0,0 +1,7 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_SPI TRUE +#include_next diff --git a/keyboards/trnthsn/tyson60/info.json b/keyboards/trnthsn/tyson60/info.json new file mode 100644 index 0000000000..6f4df15d99 --- /dev/null +++ b/keyboards/trnthsn/tyson60/info.json @@ -0,0 +1,114 @@ +{ + "manufacturer": "Tyson.Keebs", + "keyboard_name": "Tyson60", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "B4" + }, + "matrix_pins": { + "cols": ["A10", "A9", "A8", "B14", "B12", "B10", "B1", "B0", "A15", "B5", "C15", "C14", "C13", "B9"], + "rows": ["B8", "B7", "B6", "B11", "A6"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "led_count": 30, + "sleep": true + }, + "usb": { + "device_version": "0.0.1", + "pid": "0x5336", + "vid": "0x5453" + }, + "ws2812": { + "driver": "spi", + "pin": "B15" + }, + "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}, + {"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": 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, "w": 1.75}, + {"matrix": [3, 12], "x": 13, "y": 3}, + {"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, "w": 1}, + {"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}, + {"matrix": [4, 11], "x": 12, "y": 4}, + {"matrix": [4, 12], "x": 13, "y": 4}, + {"matrix": [4, 13], "x": 14, "y": 4} + ] + } + } +} diff --git a/keyboards/trnthsn/tyson60/keymaps/default/keymap.c b/keyboards/trnthsn/tyson60/keymaps/default/keymap.c new file mode 100644 index 0000000000..30786c4b60 --- /dev/null +++ b/keyboards/trnthsn/tyson60/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +// Copyright 2025 Tyson.Keebs +// 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 │ ; │ ' │ Enter │ + // ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤ + // │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │Shift │↑ │/ │ + // ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴──┬───┼───┼───┤ + // │Ctrl │GUI│ Alt │ │Fn │← │↓ │→ │ + // └─────┴───┴─────┴───────────────────────────┴───┴───┴───┴───┘ + + [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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_SLSH, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + ), + [1] = LAYOUT( + 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, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + MO(2) , _______, _______, _______, _______, _______, _______, UG_TOGG, UG_NEXT, UG_VALD, UG_VALU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/trnthsn/tyson60/mcuconf.h b/keyboards/trnthsn/tyson60/mcuconf.h new file mode 100644 index 0000000000..d131af9fdf --- /dev/null +++ b/keyboards/trnthsn/tyson60/mcuconf.h @@ -0,0 +1,9 @@ +// Copyright 2025 Tyson.Keebs +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/trnthsn/tyson60/readme.md b/keyboards/trnthsn/tyson60/readme.md new file mode 100644 index 0000000000..d38c012aad --- /dev/null +++ b/keyboards/trnthsn/tyson60/readme.md @@ -0,0 +1,27 @@ +# Tyson60 + +![trnthsn/tyson60](https://live.staticflickr.com/65535/54831948531_6b41780afe_b.jpg) + +Tyson60 PCB, 60% keyboard PCB. + +* Keyboard Maintainer: [Trnthsn](https://github.com/trnthsn) +* Hardware Supported: STM32, Tyson60 +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/tyson60/stm32f103:default + +Flashing example for this keyboard: + + make trnthsn/tyson60/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/tyson60/stm32f072/keyboard.json b/keyboards/trnthsn/tyson60/stm32f072/keyboard.json new file mode 100644 index 0000000000..b5d728b1cd --- /dev/null +++ b/keyboards/trnthsn/tyson60/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu", +} diff --git a/keyboards/trnthsn/tyson60/stm32f103/keyboard.json b/keyboards/trnthsn/tyson60/stm32f103/keyboard.json new file mode 100644 index 0000000000..5b2b6bc7d9 --- /dev/null +++ b/keyboards/trnthsn/tyson60/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot", +} From 98e65cf3e1fb4bf61367d469a62d3cce0a9fac20 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 23 Oct 2025 11:44:29 +0100 Subject: [PATCH 576/592] Fix hhkb/jp - Restore previous matrix locations (#25724) --- keyboards/hhkb/jp/keyboard.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/keyboards/hhkb/jp/keyboard.json b/keyboards/hhkb/jp/keyboard.json index 69bb681edf..b776b416ec 100644 --- a/keyboards/hhkb/jp/keyboard.json +++ b/keyboards/hhkb/jp/keyboard.json @@ -49,20 +49,20 @@ {"matrix": [15, 3], "x": 11.5, "y": 1}, {"matrix": [13, 3], "x": 12.5, "y": 1}, - {"matrix": [6, 6], "x": 0, "y": 2, "w": 1.75}, - {"matrix": [2, 6], "x": 1.75, "y": 2}, - {"matrix": [1, 6], "x": 2.75, "y": 2}, - {"matrix": [5, 6], "x": 3.75, "y": 2}, - {"matrix": [7, 6], "x": 4.75, "y": 2}, - {"matrix": [10, 6], "x": 5.75, "y": 2}, - {"matrix": [9, 6], "x": 6.75, "y": 2}, - {"matrix": [8, 6], "x": 7.75, "y": 2}, - {"matrix": [11, 6], "x": 8.75, "y": 2}, - {"matrix": [14, 6], "x": 9.75, "y": 2}, - {"matrix": [15, 6], "x": 10.75, "y": 2}, - {"matrix": [13, 6], "x": 11.75, "y": 2}, - {"matrix": [12, 6], "x": 12.75, "y": 2}, - {"matrix": [0, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [0, 6], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [6, 6], "x": 1.75, "y": 2}, + {"matrix": [2, 6], "x": 2.75, "y": 2}, + {"matrix": [1, 6], "x": 3.75, "y": 2}, + {"matrix": [5, 6], "x": 4.75, "y": 2}, + {"matrix": [7, 6], "x": 5.75, "y": 2}, + {"matrix": [10, 6], "x": 6.75, "y": 2}, + {"matrix": [9, 6], "x": 7.75, "y": 2}, + {"matrix": [8, 6], "x": 8.75, "y": 2}, + {"matrix": [11, 6], "x": 9.75, "y": 2}, + {"matrix": [14, 6], "x": 10.75, "y": 2}, + {"matrix": [15, 6], "x": 11.75, "y": 2}, + {"matrix": [13, 6], "x": 12.75, "y": 2}, + {"matrix": [12, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, {"matrix": [0, 5], "x": 0, "y": 3, "w": 2}, {"matrix": [6, 5], "x": 2, "y": 3}, From f4123acc725346caadeb49eb873a3ca93c263a25 Mon Sep 17 00:00:00 2001 From: aedanmills <40202903+aedanmills@users.noreply.github.com> Date: Sun, 26 Oct 2025 21:19:06 -0400 Subject: [PATCH 577/592] [Keyboard] Add WhirlwindFX ElementV2 (#25356) Co-authored-by: Joel Challis Co-authored-by: Duncan Sutherland --- keyboards/whirlwind_fx_element/config.h | 7 + keyboards/whirlwind_fx_element/halconf.h | 9 + keyboards/whirlwind_fx_element/keyboard.json | 302 ++++++++++++++++++ .../keymaps/default/keymap.c | 42 +++ keyboards/whirlwind_fx_element/mcuconf.h | 10 + keyboards/whirlwind_fx_element/readme.md | 31 ++ .../whirlwind_fx_element.c | 119 +++++++ 7 files changed, 520 insertions(+) create mode 100644 keyboards/whirlwind_fx_element/config.h create mode 100644 keyboards/whirlwind_fx_element/halconf.h create mode 100644 keyboards/whirlwind_fx_element/keyboard.json create mode 100644 keyboards/whirlwind_fx_element/keymaps/default/keymap.c create mode 100644 keyboards/whirlwind_fx_element/mcuconf.h create mode 100644 keyboards/whirlwind_fx_element/readme.md create mode 100644 keyboards/whirlwind_fx_element/whirlwind_fx_element.c diff --git a/keyboards/whirlwind_fx_element/config.h b/keyboards/whirlwind_fx_element/config.h new file mode 100644 index 0000000000..606163cf10 --- /dev/null +++ b/keyboards/whirlwind_fx_element/config.h @@ -0,0 +1,7 @@ +// Copyright 2023 WhirlwindFX +// Copyright 2023 aedanmills +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define IS31FL3741_I2C_ADDRESS_1 IS31FL3741_I2C_ADDRESS_GND diff --git a/keyboards/whirlwind_fx_element/halconf.h b/keyboards/whirlwind_fx_element/halconf.h new file mode 100644 index 0000000000..75e92dea90 --- /dev/null +++ b/keyboards/whirlwind_fx_element/halconf.h @@ -0,0 +1,9 @@ +// Copyright 2023 WhirlwindFX +// Copyright 2023 aedanmills +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_I2C TRUE + +#include_next diff --git a/keyboards/whirlwind_fx_element/keyboard.json b/keyboards/whirlwind_fx_element/keyboard.json new file mode 100644 index 0000000000..f01c5859da --- /dev/null +++ b/keyboards/whirlwind_fx_element/keyboard.json @@ -0,0 +1,302 @@ +{ + "manufacturer": "WhirlwindFX", + "keyboard_name": "Element", + "maintainer": "aedanmills", + "bootloader": "stm32-dfu", + "diode_direction": "ROW2COL", + "features": { + "bootmagic": true, + "extrakey": true, + "nkro": true, + "rgb_matrix": true + }, + "matrix_pins": { + "rows": [ "B0", "B1", "B2", "B3", "B12", "B13", "B14", "B15" ], + "cols": [ "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A13", "A14" ] + }, + "processor": "STM32F303", + "url": "https://www.whirlwindfx.com/products/element", + "usb": { + "vid": "0x0483", + "pid": "0xA33E", + "device_version": "1.0.6" + }, + "indicators": { + "caps_lock": "B9", + "num_lock": "B8", + "scroll_lock": "B10", + "on_state": 0 + }, + "community_layouts": ["fullsize_ansi"], + "layouts": { + "LAYOUT_fullsize_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [0, 2], "x": 3, "y": 0}, + {"matrix": [0, 3], "x": 4, "y": 0}, + {"matrix": [0, 4], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6.5, "y": 0}, + {"matrix": [0, 6], "x": 7.5, "y": 0}, + {"matrix": [0, 7], "x": 8.5, "y": 0}, + {"matrix": [0, 8], "x": 9.5, "y": 0}, + {"matrix": [0, 9], "x": 11, "y": 0}, + {"matrix": [0, 10], "x": 12, "y": 0}, + {"matrix": [0, 11], "x": 13, "y": 0}, + {"matrix": [0, 12], "x": 14, "y": 0}, + {"matrix": [1, 0], "x": 15.25, "y": 0}, + {"matrix": [1, 1], "x": 16.25, "y": 0}, + {"matrix": [1, 2], "x": 17.25, "y": 0}, + {"matrix": [1, 3], "x": 0, "y": 1.25}, + {"matrix": [1, 4], "x": 1, "y": 1.25}, + {"matrix": [1, 5], "x": 2, "y": 1.25}, + {"matrix": [1, 6], "x": 3, "y": 1.25}, + {"matrix": [1, 7], "x": 4, "y": 1.25}, + {"matrix": [1, 8], "x": 5, "y": 1.25}, + {"matrix": [1, 9], "x": 6, "y": 1.25}, + {"matrix": [1, 10], "x": 7, "y": 1.25}, + {"matrix": [1, 11], "x": 8, "y": 1.25}, + {"matrix": [1, 12], "x": 9, "y": 1.25}, + {"matrix": [2, 0], "x": 10, "y": 1.25}, + {"matrix": [2, 1], "x": 11, "y": 1.25}, + {"matrix": [2, 2], "x": 12, "y": 1.25}, + {"matrix": [2, 3], "x": 13, "y": 1.25, "w": 2}, + {"matrix": [2, 4], "x": 15.25, "y": 1.25}, + {"matrix": [2, 5], "x": 16.25, "y": 1.25}, + {"matrix": [2, 6], "x": 17.25, "y": 1.25}, + {"matrix": [2, 7], "x": 18.5, "y": 1.25}, + {"matrix": [2, 8], "x": 19.5, "y": 1.25}, + {"matrix": [2, 9], "x": 20.5, "y": 1.25}, + {"matrix": [2, 10], "x": 21.5, "y": 1.25}, + {"matrix": [2, 11], "x": 0, "y": 2.25, "w": 1.5}, + {"matrix": [2, 12], "x": 1.5, "y": 2.25}, + {"matrix": [3, 0], "x": 2.5, "y": 2.25}, + {"matrix": [3, 1], "x": 3.5, "y": 2.25}, + {"matrix": [3, 2], "x": 4.5, "y": 2.25}, + {"matrix": [3, 3], "x": 5.5, "y": 2.25}, + {"matrix": [3, 4], "x": 6.5, "y": 2.25}, + {"matrix": [3, 5], "x": 7.5, "y": 2.25}, + {"matrix": [3, 6], "x": 8.5, "y": 2.25}, + {"matrix": [3, 7], "x": 9.5, "y": 2.25}, + {"matrix": [3, 8], "x": 10.5, "y": 2.25}, + {"matrix": [3, 9], "x": 11.5, "y": 2.25}, + {"matrix": [3, 10], "x": 12.5, "y": 2.25}, + {"matrix": [3, 11], "x": 13.5, "y": 2.25, "w": 1.5}, + {"matrix": [3, 12], "x": 15.25, "y": 2.25}, + {"matrix": [4, 0], "x": 16.25, "y": 2.25}, + {"matrix": [4, 1], "x": 17.25, "y": 2.25}, + {"matrix": [4, 2], "x": 18.5, "y": 2.25}, + {"matrix": [4, 3], "x": 19.5, "y": 2.25}, + {"matrix": [4, 4], "x": 20.5, "y": 2.25}, + {"matrix": [5, 8], "x": 21.5, "y": 2.25, "h": 2}, + {"matrix": [4, 5], "x": 0, "y": 3.25, "w": 1.75}, + {"matrix": [4, 6], "x": 1.75, "y": 3.25}, + {"matrix": [4, 7], "x": 2.75, "y": 3.25}, + {"matrix": [4, 8], "x": 3.75, "y": 3.25}, + {"matrix": [4, 9], "x": 4.75, "y": 3.25}, + {"matrix": [4, 10], "x": 5.75, "y": 3.25}, + {"matrix": [4, 11], "x": 6.75, "y": 3.25}, + {"matrix": [4, 12], "x": 7.75, "y": 3.25}, + {"matrix": [5, 0], "x": 8.75, "y": 3.25}, + {"matrix": [5, 1], "x": 9.75, "y": 3.25}, + {"matrix": [5, 2], "x": 10.75, "y": 3.25}, + {"matrix": [5, 3], "x": 11.75, "y": 3.25}, + {"matrix": [5, 4], "x": 12.75, "y": 3.25, "w": 2.25}, + {"matrix": [5, 5], "x": 18.5, "y": 3.25}, + {"matrix": [5, 6], "x": 19.5, "y": 3.25}, + {"matrix": [5, 7], "x": 20.5, "y": 3.25}, + {"matrix": [5, 9], "x": 0, "y": 4.25, "w": 2.25}, + {"matrix": [5, 10], "x": 2.25, "y": 4.25}, + {"matrix": [5, 11], "x": 3.25, "y": 4.25}, + {"matrix": [5, 12], "x": 4.25, "y": 4.25}, + {"matrix": [6, 0], "x": 5.25, "y": 4.25}, + {"matrix": [6, 1], "x": 6.25, "y": 4.25}, + {"matrix": [6, 2], "x": 7.25, "y": 4.25}, + {"matrix": [6, 3], "x": 8.25, "y": 4.25}, + {"matrix": [6, 4], "x": 9.25, "y": 4.25}, + {"matrix": [6, 5], "x": 10.25, "y": 4.25}, + {"matrix": [6, 6], "x": 11.25, "y": 4.25}, + {"matrix": [6, 7], "x": 12.25, "y": 4.25, "w": 2.75}, + {"matrix": [6, 8], "x": 16.25, "y": 4.25}, + {"matrix": [6, 9], "x": 18.5, "y": 4.25}, + {"matrix": [6, 10], "x": 19.5, "y": 4.25}, + {"matrix": [6, 11], "x": 20.5, "y": 4.25}, + {"matrix": [6, 12], "x": 21.5, "y": 4.25, "h": 2}, + {"matrix": [7, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"matrix": [7, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"matrix": [7, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"matrix": [7, 3], "x": 3.75, "y": 5.25, "w": 6.25}, + {"matrix": [7, 4], "x": 10, "y": 5.25, "w": 1.25}, + {"matrix": [7, 5], "x": 11.25, "y": 5.25, "w": 1.25}, + {"matrix": [7, 6], "x": 12.5, "y": 5.25, "w": 1.25}, + {"matrix": [7, 7], "x": 13.75, "y": 5.25, "w": 1.25}, + {"matrix": [7, 8], "x": 15.25, "y": 5.25}, + {"matrix": [7, 9], "x": 16.25, "y": 5.25}, + {"matrix": [7, 10], "x": 17.25, "y": 5.25}, + {"matrix": [7, 11], "x": 18.5, "y": 5.25, "w": 2}, + {"matrix": [7, 12], "x": 20.5, "y": 5.25} + ] + } + }, + "rgb_matrix": { + "driver": "is31fl3741", + "max_brightness": 200, + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 21, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 31, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 42, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 52, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 68, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 78, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 89, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 99, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 115, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 125, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 136, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 146, "y": 0, "flags": 4}, + {"matrix": [1, 0], "x": 159, "y": 0, "flags": 4}, + {"matrix": [1, 1], "x": 169, "y": 0, "flags": 4}, + {"matrix": [1, 2], "x": 180, "y": 0, "flags": 4}, + + {"matrix": [1, 3], "x": 0, "y": 15, "flags": 4}, + {"matrix": [1, 4], "x": 10, "y": 15, "flags": 4}, + {"matrix": [1, 5], "x": 21, "y": 15, "flags": 4}, + {"matrix": [1, 6], "x": 31, "y": 15, "flags": 4}, + {"matrix": [1, 7], "x": 42, "y": 15, "flags": 4}, + {"matrix": [1, 8], "x": 52, "y": 15, "flags": 4}, + {"matrix": [1, 9], "x": 63, "y": 15, "flags": 4}, + {"matrix": [1, 10], "x": 73, "y": 15, "flags": 4}, + {"matrix": [1, 11], "x": 83, "y": 15, "flags": 4}, + {"matrix": [1, 12], "x": 94, "y": 15, "flags": 4}, + {"matrix": [2, 0], "x": 104, "y": 15, "flags": 4}, + {"matrix": [2, 1], "x": 115, "y": 15, "flags": 4}, + {"matrix": [2, 2], "x": 125, "y": 15, "flags": 4}, + {"matrix": [2, 3], "x": 141, "y": 15, "flags": 4}, + {"matrix": [2, 4], "x": 159, "y": 15, "flags": 4}, + {"matrix": [2, 5], "x": 169, "y": 15, "flags": 4}, + {"matrix": [2, 6], "x": 180, "y": 15, "flags": 4}, + {"matrix": [2, 7], "x": 193, "y": 15, "flags": 4}, + {"matrix": [2, 8], "x": 203, "y": 15, "flags": 4}, + {"matrix": [2, 9], "x": 214, "y": 15, "flags": 4}, + {"matrix": [2, 10], "x": 224, "y": 15, "flags": 4}, + + {"matrix": [2, 11], "x": 3, "y": 27, "flags": 4}, + {"matrix": [2, 12], "x": 16, "y": 27, "flags": 4}, + {"matrix": [3, 0], "x": 26, "y": 27, "flags": 4}, + {"matrix": [3, 1], "x": 36, "y": 27, "flags": 4}, + {"matrix": [3, 2], "x": 47, "y": 27, "flags": 4}, + {"matrix": [3, 3], "x": 57, "y": 27, "flags": 4}, + {"matrix": [3, 4], "x": 68, "y": 27, "flags": 4}, + {"matrix": [3, 5], "x": 78, "y": 27, "flags": 4}, + {"matrix": [3, 6], "x": 89, "y": 27, "flags": 4}, + {"matrix": [3, 7], "x": 99, "y": 27, "flags": 4}, + {"matrix": [3, 8], "x": 109, "y": 27, "flags": 4}, + {"matrix": [3, 9], "x": 120, "y": 27, "flags": 4}, + {"matrix": [3, 10], "x": 130, "y": 27, "flags": 4}, + {"matrix": [3, 11], "x": 143, "y": 27, "flags": 4}, + {"matrix": [3, 12], "x": 159, "y": 27, "flags": 4}, + {"matrix": [4, 0], "x": 169, "y": 27, "flags": 4}, + {"matrix": [4, 1], "x": 180, "y": 27, "flags": 4}, + {"matrix": [4, 2], "x": 193, "y": 27, "flags": 4}, + {"matrix": [4, 3], "x": 203, "y": 27, "flags": 4}, + {"matrix": [4, 4], "x": 214, "y": 27, "flags": 4}, + + {"matrix": [4, 5], "x": 4, "y": 40, "flags": 4}, + {"matrix": [4, 6], "x": 18, "y": 40, "flags": 4}, + {"matrix": [4, 7], "x": 29, "y": 40, "flags": 4}, + {"matrix": [4, 8], "x": 39, "y": 40, "flags": 4}, + {"matrix": [4, 9], "x": 50, "y": 40, "flags": 4}, + {"matrix": [4, 10], "x": 60, "y": 40, "flags": 4}, + {"matrix": [4, 11], "x": 70, "y": 40, "flags": 4}, + {"matrix": [4, 12], "x": 81, "y": 40, "flags": 4}, + {"matrix": [5, 0], "x": 91, "y": 40, "flags": 4}, + {"matrix": [5, 1], "x": 102, "y": 40, "flags": 4}, + {"matrix": [5, 2], "x": 112, "y": 40, "flags": 4}, + {"matrix": [5, 3], "x": 123, "y": 40, "flags": 4}, + {"matrix": [5, 4], "x": 139, "y": 40, "flags": 4}, + {"matrix": [5, 5], "x": 193, "y": 40, "flags": 4}, + {"matrix": [5, 6], "x": 203, "y": 40, "flags": 4}, + {"matrix": [5, 7], "x": 214, "y": 40, "flags": 4}, + {"matrix": [5, 8], "x": 224, "y": 34, "flags": 4}, + + {"matrix": [5, 9], "x": 7, "y": 52, "flags": 4}, + {"matrix": [5, 10], "x": 23, "y": 52, "flags": 4}, + {"matrix": [5, 11], "x": 34, "y": 52, "flags": 4}, + {"matrix": [5, 12], "x": 44, "y": 52, "flags": 4}, + {"matrix": [6, 0], "x": 55, "y": 52, "flags": 4}, + {"matrix": [6, 1], "x": 65, "y": 52, "flags": 4}, + {"matrix": [6, 2], "x": 76, "y": 52, "flags": 4}, + {"matrix": [6, 3], "x": 86, "y": 52, "flags": 4}, + {"matrix": [6, 4], "x": 96, "y": 52, "flags": 4}, + {"matrix": [6, 5], "x": 107, "y": 52, "flags": 4}, + {"matrix": [6, 6], "x": 117, "y": 52, "flags": 4}, + {"matrix": [6, 7], "x": 137, "y": 52, "flags": 4}, + {"matrix": [6, 8], "x": 169, "y": 52, "flags": 4}, + {"matrix": [6, 9], "x": 193, "y": 52, "flags": 4}, + {"matrix": [6, 10], "x": 203, "y": 52, "flags": 4}, + {"matrix": [6, 11], "x": 214, "y": 52, "flags": 4}, + {"matrix": [6, 12], "x": 224, "y": 58, "flags": 4}, + + {"matrix": [7, 0], "x": 1, "y": 64, "flags": 4}, + {"matrix": [7, 1], "x": 14, "y": 64, "flags": 4}, + {"matrix": [7, 2], "x": 27, "y": 64, "flags": 4}, + {"matrix": [7, 3], "x": 66, "y": 64, "flags": 4}, + {"matrix": [7, 4], "x": 105, "y": 64, "flags": 4}, + {"matrix": [7, 5], "x": 118, "y": 64, "flags": 4}, + {"matrix": [7, 6], "x": 131, "y": 64, "flags": 4}, + {"matrix": [7, 7], "x": 145, "y": 64, "flags": 4}, + {"matrix": [7, 8], "x": 159, "y": 64, "flags": 4}, + {"matrix": [7, 9], "x": 169, "y": 64, "flags": 4}, + {"matrix": [7, 10], "x": 180, "y": 64, "flags": 4}, + {"matrix": [7, 11], "x": 198, "y": 64, "flags": 4}, + {"matrix": [7, 12], "x": 214, "y": 64, "flags": 4} + ], + "animations": { + "alphas_mods": true, + "gradient_up_down": true, + "gradient_left_right": true, + "breathing": true, + "band_sat": true, + "band_val": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_up_down": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "rainbow_moving_chevron": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "dual_beacon": true, + "rainbow_beacon": true, + "rainbow_pinwheels": true, + "raindrops": true, + "jellybean_raindrops": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "pixel_flow": true, + "pixel_rain": true, + "typing_heatmap": true, + "digital_rain": true, + "solid_reactive_simple": true, + "solid_reactive": true, + "solid_reactive_wide": true, + "solid_reactive_cross": true, + "solid_reactive_nexus": true, + "splash": true, + "multisplash": true, + "solid_splash": true + }, + "default": { + "val": 128 + }, + "led_process_limit": 4, + "led_flush_limit": 26, + "sleep": true + } +} diff --git a/keyboards/whirlwind_fx_element/keymaps/default/keymap.c b/keyboards/whirlwind_fx_element/keymaps/default/keymap.c new file mode 100644 index 0000000000..36690aca28 --- /dev/null +++ b/keyboards/whirlwind_fx_element/keymaps/default/keymap.c @@ -0,0 +1,42 @@ +// Copyright 2023 WhirlwindFX +// Copyright 2023 aedanmills +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ + * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│ + * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ + * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │ + * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ │ 4 │ 5 │ 6 │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤ + * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│ + * │Ctrl│GUI │Alt │ │ Alt│ FN │Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ + */ + [0] = LAYOUT_fullsize_ansi( + 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_PSCR, KC_SCRL, KC_PAUS, + + 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_INS, KC_HOME, KC_PGUP, 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_DEL, KC_END, KC_PGDN, 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(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT + ), + [1] = LAYOUT_fullsize_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BRID, KC_BRIU, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_CALC, + + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_VALD, RM_VALU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_SPDU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RM_PREV, RM_SPDD, RM_NEXT, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/whirlwind_fx_element/mcuconf.h b/keyboards/whirlwind_fx_element/mcuconf.h new file mode 100644 index 0000000000..c89f7275d4 --- /dev/null +++ b/keyboards/whirlwind_fx_element/mcuconf.h @@ -0,0 +1,10 @@ +// Copyright 2023 WhirlwindFX +// Copyright 2023 aedanmills +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include_next + +#undef STM32_I2C_USE_I2C1 +#define STM32_I2C_USE_I2C1 TRUE diff --git a/keyboards/whirlwind_fx_element/readme.md b/keyboards/whirlwind_fx_element/readme.md new file mode 100644 index 0000000000..362b984772 --- /dev/null +++ b/keyboards/whirlwind_fx_element/readme.md @@ -0,0 +1,31 @@ +# WhirlwindFX ElementV2 + +![WhirlwindFX ElementV2](https://i.imgur.com/Etso6Ni.png) + +A full-size (100%) mechanical keyboard with RGB lighting. + +* Keyboard Maintainer: [Aedan Mills](https://github.com/aedanmills) +* Hardware Supported: WhirlwindFX ElementV2 +* Hardware Availability: [WhirlwindFX](https://www.whirlwindfx.com/products/element) + +Make example for this keyboard (after setting up your build environment): + + make whirlwind_fx_element:default + +Flashing example for this keyboard: + + make whirlwind_fx_element:default:flash + +## Bootloader + +Enter the bootloader by pressing and holding the reset button on the back of the PCB while plugging in the keyboard. You will have to remove the key caps to access the screws to disassemble the keyboard and access the button. + +Don't forget to backup the original firmware before proceeding by using the following dfu-util command with the keyboard in bootloader mode: + + dfu-util --list # Check that the keyboard is listed in DFU mode + dfu-util -a 0 -U backup.bin -s 0x08000000 # Save backup as backup.bin + +After flashing with QMK, BootMagic can be used to enter the bootloader by holding ESC while plugging in the keyboard. + + +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). diff --git a/keyboards/whirlwind_fx_element/whirlwind_fx_element.c b/keyboards/whirlwind_fx_element/whirlwind_fx_element.c new file mode 100644 index 0000000000..6f17dbda2f --- /dev/null +++ b/keyboards/whirlwind_fx_element/whirlwind_fx_element.c @@ -0,0 +1,119 @@ +// Copyright 2023 WhirlwindFX +// Copyright 2023 aedanmills +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +#ifdef RGB_MATRIX_ENABLE +const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT] = { + {0, SW1_CS2, SW1_CS3, SW1_CS1}, + {0, SW1_CS5, SW1_CS6, SW1_CS4}, + {0, SW1_CS8, SW1_CS9, SW1_CS7}, + {0, SW1_CS11, SW1_CS12, SW1_CS10}, + {0, SW1_CS14, SW1_CS15, SW1_CS13}, + {0, SW1_CS17, SW1_CS18, SW1_CS16}, + {0, SW1_CS20, SW1_CS21, SW1_CS19}, + {0, SW1_CS23, SW1_CS24, SW1_CS22}, + {0, SW1_CS26, SW1_CS27, SW1_CS25}, + {0, SW1_CS29, SW1_CS30, SW1_CS28}, + {0, SW1_CS32, SW1_CS33, SW1_CS31}, + {0, SW1_CS35, SW1_CS36, SW1_CS34}, + {0, SW1_CS38, SW1_CS39, SW1_CS37}, + {0, SW2_CS2, SW2_CS3, SW2_CS1}, + {0, SW2_CS5, SW2_CS6, SW2_CS4}, + {0, SW2_CS8, SW2_CS9, SW2_CS7}, + {0, SW2_CS11, SW2_CS12, SW2_CS10}, + {0, SW2_CS14, SW2_CS15, SW2_CS13}, + {0, SW2_CS17, SW2_CS18, SW2_CS16}, + {0, SW2_CS20, SW2_CS21, SW2_CS19}, + {0, SW2_CS23, SW2_CS24, SW2_CS22}, + {0, SW2_CS26, SW2_CS27, SW2_CS25}, + {0, SW2_CS29, SW2_CS30, SW2_CS28}, + {0, SW2_CS32, SW2_CS33, SW2_CS31}, + {0, SW2_CS35, SW2_CS36, SW2_CS34}, + {0, SW2_CS38, SW2_CS39, SW2_CS37}, + {0, SW3_CS2, SW3_CS3, SW3_CS1}, + {0, SW3_CS5, SW3_CS6, SW3_CS4}, + {0, SW3_CS8, SW3_CS9, SW3_CS7}, + {0, SW3_CS11, SW3_CS12, SW3_CS10}, + {0, SW3_CS14, SW3_CS15, SW3_CS13}, + {0, SW3_CS17, SW3_CS18, SW3_CS16}, + {0, SW3_CS20, SW3_CS21, SW3_CS19}, + {0, SW3_CS23, SW3_CS24, SW3_CS22}, + {0, SW3_CS26, SW3_CS27, SW3_CS25}, + {0, SW3_CS29, SW3_CS30, SW3_CS28}, + {0, SW3_CS32, SW3_CS33, SW3_CS31}, + {0, SW3_CS35, SW3_CS36, SW3_CS34}, + {0, SW3_CS38, SW3_CS39, SW3_CS37}, + {0, SW4_CS2, SW4_CS3, SW4_CS1}, + {0, SW4_CS5, SW4_CS6, SW4_CS4}, + {0, SW4_CS8, SW4_CS9, SW4_CS7}, + {0, SW4_CS11, SW4_CS12, SW4_CS10}, + {0, SW4_CS14, SW4_CS15, SW4_CS13}, + {0, SW4_CS17, SW4_CS18, SW4_CS16}, + {0, SW4_CS20, SW4_CS21, SW4_CS19}, + {0, SW4_CS23, SW4_CS24, SW4_CS22}, + {0, SW4_CS26, SW4_CS27, SW4_CS25}, + {0, SW4_CS29, SW4_CS30, SW4_CS28}, + {0, SW4_CS32, SW4_CS33, SW4_CS31}, + {0, SW4_CS35, SW4_CS36, SW4_CS34}, + {0, SW4_CS38, SW4_CS39, SW4_CS37}, + {0, SW5_CS2, SW5_CS3, SW5_CS1}, + {0, SW5_CS5, SW5_CS6, SW5_CS4}, + {0, SW5_CS8, SW5_CS9, SW5_CS7}, + {0, SW5_CS11, SW5_CS12, SW5_CS10}, + {0, SW5_CS14, SW5_CS15, SW5_CS13}, + {0, SW5_CS17, SW5_CS18, SW5_CS16}, + {0, SW5_CS20, SW5_CS21, SW5_CS19}, + {0, SW5_CS23, SW5_CS24, SW5_CS22}, + {0, SW5_CS26, SW5_CS27, SW5_CS25}, + {0, SW5_CS29, SW5_CS30, SW5_CS28}, + {0, SW5_CS32, SW5_CS33, SW5_CS31}, + {0, SW5_CS35, SW5_CS36, SW5_CS34}, + {0, SW5_CS38, SW5_CS39, SW5_CS37}, + {0, SW6_CS2, SW6_CS3, SW6_CS1}, + {0, SW6_CS5, SW6_CS6, SW6_CS4}, + {0, SW6_CS8, SW6_CS9, SW6_CS7}, + {0, SW6_CS11, SW6_CS12, SW6_CS10}, + {0, SW6_CS14, SW6_CS15, SW6_CS13}, + {0, SW6_CS17, SW6_CS18, SW6_CS16}, + {0, SW6_CS20, SW6_CS21, SW6_CS19}, + {0, SW6_CS23, SW6_CS24, SW6_CS22}, + {0, SW6_CS26, SW6_CS27, SW6_CS25}, + {0, SW6_CS29, SW6_CS30, SW6_CS28}, + {0, SW6_CS32, SW6_CS33, SW6_CS31}, + {0, SW6_CS35, SW6_CS36, SW6_CS34}, + {0, SW6_CS38, SW6_CS39, SW6_CS37}, + {0, SW7_CS2, SW7_CS3, SW7_CS1}, + {0, SW7_CS5, SW7_CS6, SW7_CS4}, + {0, SW7_CS8, SW7_CS9, SW7_CS7}, + {0, SW7_CS11, SW7_CS12, SW7_CS10}, + {0, SW7_CS14, SW7_CS15, SW7_CS13}, + {0, SW7_CS17, SW7_CS18, SW7_CS16}, + {0, SW7_CS20, SW7_CS21, SW7_CS19}, + {0, SW7_CS23, SW7_CS24, SW7_CS22}, + {0, SW7_CS26, SW7_CS27, SW7_CS25}, + {0, SW7_CS29, SW7_CS30, SW7_CS28}, + {0, SW7_CS32, SW7_CS33, SW7_CS31}, + {0, SW7_CS35, SW7_CS36, SW7_CS34}, + {0, SW7_CS38, SW7_CS39, SW7_CS37}, + {0, SW8_CS2, SW8_CS3, SW8_CS1}, + {0, SW8_CS5, SW8_CS6, SW8_CS4}, + {0, SW8_CS8, SW8_CS9, SW8_CS7}, + {0, SW8_CS11, SW8_CS12, SW8_CS10}, + {0, SW8_CS14, SW8_CS15, SW8_CS13}, + {0, SW8_CS17, SW8_CS18, SW8_CS16}, + {0, SW8_CS20, SW8_CS21, SW8_CS19}, + {0, SW8_CS23, SW8_CS24, SW8_CS22}, + {0, SW8_CS26, SW8_CS27, SW8_CS25}, + {0, SW8_CS29, SW8_CS30, SW8_CS28}, + {0, SW8_CS32, SW8_CS33, SW8_CS31}, + {0, SW8_CS35, SW8_CS36, SW8_CS34}, + {0, SW8_CS38, SW8_CS39, SW8_CS37} +}; +#endif +void keyboard_pre_init_kb(void) { + gpio_set_pin_output(B11); // Required for indicators to work correctly + + keyboard_pre_init_user(); +} From 8e5550dbb219591eee97f533568ba9a6271f5d84 Mon Sep 17 00:00:00 2001 From: SneakboxKB <67670271+SneakboxKB@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:05:52 -0500 Subject: [PATCH 578/592] Add M4m5 support (#25499) --- keyboards/sneakbox/m4m5/keyboard.json | 203 ++++++++++++++++++ .../sneakbox/m4m5/keymaps/alice/keymap.c | 32 +++ .../sneakbox/m4m5/keymaps/default/keymap.c | 32 +++ keyboards/sneakbox/m4m5/readme.md | 27 +++ 4 files changed, 294 insertions(+) create mode 100644 keyboards/sneakbox/m4m5/keyboard.json create mode 100644 keyboards/sneakbox/m4m5/keymaps/alice/keymap.c create mode 100644 keyboards/sneakbox/m4m5/keymaps/default/keymap.c create mode 100644 keyboards/sneakbox/m4m5/readme.md diff --git a/keyboards/sneakbox/m4m5/keyboard.json b/keyboards/sneakbox/m4m5/keyboard.json new file mode 100644 index 0000000000..ba56a6c85d --- /dev/null +++ b/keyboards/sneakbox/m4m5/keyboard.json @@ -0,0 +1,203 @@ +{ + "manufacturer": "Sneakbox", + "keyboard_name": "M4 & M5", + "maintainer": "mujimanic", + "bootloader": "atmel-dfu", + "bootmagic": { + "matrix": [2, 0] + }, + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "D3", "pin_b": "D2"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "D6", + "num_lock": "D4", + "scroll_lock": "D7" + }, + "matrix_pins": { + "cols": ["F0", "D0", "C7", "C6", "B6", "B5", "B4", "D1"], + "rows": ["F1", "E6", "F4", "B1", "F5", "B2", "F6", "B3", "F7", "B7"] + }, + "processor": "atmega32u4", + "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": 16 + }, + "url": "https://sneakbox.design", + "usb": { + "device_version": "0.0.1", + "pid": "0x0005", + "vid": "0x5342" + }, + "ws2812": { + "pin": "D5" + }, + "layouts": { + "LAYOUT_alice": { + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 0}, + {"matrix": [0, 0], "x": 1.25, "y": 0}, + {"matrix": [0, 1], "x": 2.25, "y": 0}, + {"matrix": [0, 2], "x": 3.25, "y": 0}, + {"matrix": [0, 3], "x": 4.25, "y": 0}, + {"matrix": [0, 4], "x": 5.25, "y": 0}, + {"matrix": [0, 5], "x": 6.25, "y": 0}, + {"matrix": [0, 6], "x": 7.25, "y": 0}, + {"matrix": [1, 0], "x": 10.25, "y": 0}, + {"matrix": [1, 1], "x": 11.25, "y": 0}, + {"matrix": [1, 2], "x": 12.25, "y": 0}, + {"matrix": [1, 3], "x": 13.25, "y": 0}, + {"matrix": [1, 4], "x": 14.25, "y": 0}, + {"matrix": [1, 5], "x": 15.25, "y": 0}, + {"matrix": [1, 6], "x": 16.25, "y": 0, "w": 2}, + {"matrix": [4, 0], "x": 0, "y": 1}, + {"matrix": [2, 1], "x": 1.25, "y": 1, "w": 1.5}, + {"matrix": [2, 2], "x": 2.75, "y": 1}, + {"matrix": [2, 3], "x": 3.75, "y": 1}, + {"matrix": [2, 4], "x": 4.75, "y": 1}, + {"matrix": [2, 5], "x": 5.75, "y": 1}, + {"matrix": [2, 6], "x": 6.75, "y": 1}, + {"matrix": [3, 0], "x": 9.75, "y": 1}, + {"matrix": [3, 1], "x": 10.75, "y": 1}, + {"matrix": [3, 2], "x": 11.75, "y": 1}, + {"matrix": [3, 3], "x": 12.75, "y": 1}, + {"matrix": [3, 4], "x": 13.75, "y": 1}, + {"matrix": [3, 5], "x": 14.75, "y": 1}, + {"matrix": [3, 6], "x": 15.75, "y": 1}, + {"matrix": [3, 7], "x": 16.75, "y": 1, "w": 1.5}, + {"matrix": [6, 0], "x": 0, "y": 2}, + {"matrix": [4, 1], "x": 1.25, "y": 2, "w": 1.75}, + {"matrix": [4, 2], "x": 3, "y": 2}, + {"matrix": [4, 3], "x": 4, "y": 2}, + {"matrix": [4, 4], "x": 5, "y": 2}, + {"matrix": [4, 5], "x": 6, "y": 2}, + {"matrix": [4, 6], "x": 7, "y": 2}, + {"matrix": [5, 0], "x": 10, "y": 2}, + {"matrix": [5, 1], "x": 11, "y": 2}, + {"matrix": [5, 2], "x": 12, "y": 2}, + {"matrix": [5, 3], "x": 13, "y": 2}, + {"matrix": [5, 4], "x": 14, "y": 2}, + {"matrix": [5, 5], "x": 15, "y": 2}, + {"matrix": [5, 6], "x": 16, "y": 2, "w": 2.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 3.5, "y": 3}, + {"matrix": [6, 3], "x": 4.5, "y": 3}, + {"matrix": [6, 4], "x": 5.5, "y": 3}, + {"matrix": [6, 5], "x": 6.5, "y": 3}, + {"matrix": [6, 6], "x": 7.5, "y": 3}, + {"matrix": [7, 0], "x": 9.5, "y": 3}, + {"matrix": [7, 1], "x": 10.5, "y": 3}, + {"matrix": [7, 2], "x": 11.5, "y": 3}, + {"matrix": [7, 3], "x": 12.5, "y": 3}, + {"matrix": [7, 4], "x": 13.5, "y": 3}, + {"matrix": [7, 5], "x": 14.5, "y": 3}, + {"matrix": [7, 6], "x": 15.5, "y": 3, "w": 1.75}, + {"matrix": [7, 7], "x": 17.25, "y": 3}, + {"matrix": [8, 1], "x": 1.25, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 5], "x": 5.5, "y": 4, "w": 2.25}, + {"matrix": [8, 6], "x": 7.75, "y": 4}, + {"matrix": [9, 1], "x": 9.75, "y": 4, "w": 1.25}, + {"matrix": [9, 2], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [9, 3], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [9, 7], "x": 16.75, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_alice_split_bs": { + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 0}, + {"matrix": [0, 0], "x": 1.25, "y": 0}, + {"matrix": [0, 1], "x": 2.25, "y": 0}, + {"matrix": [0, 2], "x": 3.25, "y": 0}, + {"matrix": [0, 3], "x": 4.25, "y": 0}, + {"matrix": [0, 4], "x": 5.25, "y": 0}, + {"matrix": [0, 5], "x": 6.25, "y": 0}, + {"matrix": [0, 6], "x": 7.25, "y": 0}, + {"matrix": [1, 0], "x": 10.25, "y": 0}, + {"matrix": [1, 1], "x": 11.25, "y": 0}, + {"matrix": [1, 2], "x": 12.25, "y": 0}, + {"matrix": [1, 3], "x": 13.25, "y": 0}, + {"matrix": [1, 4], "x": 14.25, "y": 0}, + {"matrix": [1, 5], "x": 15.25, "y": 0}, + {"matrix": [1, 6], "x": 16.25, "y": 0}, + {"matrix": [1, 7], "x": 17.25, "y": 0}, + {"matrix": [4, 0], "x": 0, "y": 1}, + {"matrix": [2, 1], "x": 1.25, "y": 1, "w": 1.5}, + {"matrix": [2, 2], "x": 2.75, "y": 1}, + {"matrix": [2, 3], "x": 3.75, "y": 1}, + {"matrix": [2, 4], "x": 4.75, "y": 1}, + {"matrix": [2, 5], "x": 5.75, "y": 1}, + {"matrix": [2, 6], "x": 6.75, "y": 1}, + {"matrix": [3, 0], "x": 9.75, "y": 1}, + {"matrix": [3, 1], "x": 10.75, "y": 1}, + {"matrix": [3, 2], "x": 11.75, "y": 1}, + {"matrix": [3, 3], "x": 12.75, "y": 1}, + {"matrix": [3, 4], "x": 13.75, "y": 1}, + {"matrix": [3, 5], "x": 14.75, "y": 1}, + {"matrix": [3, 6], "x": 15.75, "y": 1}, + {"matrix": [3, 7], "x": 16.75, "y": 1, "w": 1.5}, + {"matrix": [6, 0], "x": 0, "y": 2}, + {"matrix": [4, 1], "x": 1.25, "y": 2, "w": 1.75}, + {"matrix": [4, 2], "x": 3, "y": 2}, + {"matrix": [4, 3], "x": 4, "y": 2}, + {"matrix": [4, 4], "x": 5, "y": 2}, + {"matrix": [4, 5], "x": 6, "y": 2}, + {"matrix": [4, 6], "x": 7, "y": 2}, + {"matrix": [5, 0], "x": 10, "y": 2}, + {"matrix": [5, 1], "x": 11, "y": 2}, + {"matrix": [5, 2], "x": 12, "y": 2}, + {"matrix": [5, 3], "x": 13, "y": 2}, + {"matrix": [5, 4], "x": 14, "y": 2}, + {"matrix": [5, 5], "x": 15, "y": 2}, + {"matrix": [5, 6], "x": 16, "y": 2, "w": 2.25}, + {"matrix": [6, 1], "x": 1.25, "y": 3, "w": 2.25}, + {"matrix": [6, 2], "x": 3.5, "y": 3}, + {"matrix": [6, 3], "x": 4.5, "y": 3}, + {"matrix": [6, 4], "x": 5.5, "y": 3}, + {"matrix": [6, 5], "x": 6.5, "y": 3}, + {"matrix": [6, 6], "x": 7.5, "y": 3}, + {"matrix": [7, 0], "x": 9.5, "y": 3}, + {"matrix": [7, 1], "x": 10.5, "y": 3}, + {"matrix": [7, 2], "x": 11.5, "y": 3}, + {"matrix": [7, 3], "x": 12.5, "y": 3}, + {"matrix": [7, 4], "x": 13.5, "y": 3}, + {"matrix": [7, 5], "x": 14.5, "y": 3}, + {"matrix": [7, 6], "x": 15.5, "y": 3, "w": 1.75}, + {"matrix": [7, 7], "x": 17.25, "y": 3}, + {"matrix": [8, 1], "x": 1.25, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 1.5}, + {"matrix": [8, 5], "x": 5.5, "y": 4, "w": 2.25}, + {"matrix": [8, 6], "x": 7.75, "y": 4}, + {"matrix": [9, 1], "x": 9.75, "y": 4, "w": 1.25}, + {"matrix": [9, 2], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [9, 3], "x": 12.5, "y": 4, "w": 1.5}, + {"matrix": [9, 7], "x": 16.75, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/sneakbox/m4m5/keymaps/alice/keymap.c b/keyboards/sneakbox/m4m5/keymaps/alice/keymap.c new file mode 100644 index 0000000000..113ebfd8b6 --- /dev/null +++ b/keyboards/sneakbox/m4m5/keymaps/alice/keymap.c @@ -0,0 +1,32 @@ +// Copyright 2023 Bryan Ong +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_alice( + KC_ESC, 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_PGUP, 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_PGDN, 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_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LGUI, + KC_LCTL, KC_LALT, KC_SPC, LT(_FN, KC_SPC), KC_SPC, KC_SPC, KC_RALT, KC_RCTL), + [_FN] = LAYOUT_alice( + KC_TRNS, KC_TRNS, 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_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_PREV, UG_NEXT, UG_TOGG, + QK_BOOT, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_VALD, UG_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_SATD, UG_SATU, KC_TRNS, UG_HUEU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [_FN] = { ENCODER_CCW_CW(_______, _______)} +}; +#endif diff --git a/keyboards/sneakbox/m4m5/keymaps/default/keymap.c b/keyboards/sneakbox/m4m5/keymaps/default/keymap.c new file mode 100644 index 0000000000..938f073837 --- /dev/null +++ b/keyboards/sneakbox/m4m5/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +// Copyright 2023 Bryan Ong +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_alice_split_bs( + KC_ESC, 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_BSPC, + KC_PGUP, 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_PGDN, 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_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LGUI, + KC_LCTL, KC_LALT, KC_SPC, LT(_FN, KC_SPC), KC_SPC, KC_SPC, KC_RALT, KC_RCTL), + [_FN] = LAYOUT_alice_split_bs( + KC_TRNS, KC_TRNS, 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_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_PREV, UG_NEXT, UG_TOGG, + QK_BOOT, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_VALD, UG_VALU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_SATD, UG_SATU, KC_TRNS, UG_HUEU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, + [_FN] = { ENCODER_CCW_CW(_______, _______)} +}; +#endif diff --git a/keyboards/sneakbox/m4m5/readme.md b/keyboards/sneakbox/m4m5/readme.md new file mode 100644 index 0000000000..4be06dbf98 --- /dev/null +++ b/keyboards/sneakbox/m4m5/readme.md @@ -0,0 +1,27 @@ +# Sneakbox M4 & M5 PCB + +![Sneakbox M4 & M5 PCB](https://i.imgur.com/hVLal1m.jpeg) + +An Alice-compatible PCB with hotswap with pushbutton rotary encoder socket placed at the top left key position. This PCB is the successor to the AliceCloneRGB PCB and features RGB underglow lighting along with revised hardware components such as an additional spacebar key in the right spacebar cluster. M4M5 firmware covers two physical PCBs for the MGA project (M4 PCB and M5 PCB) namely for the MGA V3 keyboard (which uses either PCB). + +* Keyboard Maintainer: [mujimanic](https://github.com/mujimanic) +* Hardware Supported: Any Alice-layout case. +* Hardware Availability: [sneakbox.design](https://sneakbox.com/products/m4-alice-pcbs-for-mga-cases) + +Make example for this keyboard (after setting up your build environment): + + make sneakbox/m4m5:default + +Flashing example for this keyboard: + + make sneakbox/m4m5: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 top left key in the nevigation cluster (Escape key) and plug in the keyboard +* **Physical reset button**: Briefly press the small metal button on the back of the PCB +* **Keycode in layout**: Press and hold the key next to the right split spacebar (to the right of the spacebar) and then press the End key (located on the bottom of the three-key navigation cluster) From 62d87fa4464d601746343ca750de2ffa8cf4650e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix?= <59839401+v3lmx@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:11:40 +0100 Subject: [PATCH 579/592] [Keyboard] Add Cornifi keyboard (#25753) --- keyboards/cornifi/config.h | 14 ++++ keyboards/cornifi/keyboard.json | 96 ++++++++++++++++++++++ keyboards/cornifi/keymaps/default/keymap.c | 27 ++++++ keyboards/cornifi/readme.md | 32 ++++++++ 4 files changed, 169 insertions(+) create mode 100644 keyboards/cornifi/config.h create mode 100644 keyboards/cornifi/keyboard.json create mode 100644 keyboards/cornifi/keymaps/default/keymap.c create mode 100644 keyboards/cornifi/readme.md diff --git a/keyboards/cornifi/config.h b/keyboards/cornifi/config.h new file mode 100644 index 0000000000..36750714de --- /dev/null +++ b/keyboards/cornifi/config.h @@ -0,0 +1,14 @@ +// Copyright 2024-2025 QMK +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP12 +#define SERIAL_USART_RX_PIN GP13 +#define USB_VBUS_PIN GP24 + +/* RP2040- and hardware-specific config */ +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/keyboards/cornifi/keyboard.json b/keyboards/cornifi/keyboard.json new file mode 100644 index 0000000000..68e062ad33 --- /dev/null +++ b/keyboards/cornifi/keyboard.json @@ -0,0 +1,96 @@ +{ + "manufacturer": "v3lmx", + "keyboard_name": "cornifi", + "maintainer": "v3lmx", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true + }, + "matrix_pins": { + "direct": [ + ["GP21", "GP25", "GP26", "GP28", "GP29", "GP5"], + ["GP20", "GP22", "GP27", "GP2", "GP3", "GP8"], + ["GP19", "GP23", "GP1", "GP0", "GP4", null], + [null, null, "GP16", "GP17", "GP18", null] + ] + }, + "processor": "RP2040", + "split": { + "bootmagic": { + "matrix": [4, 0] + }, + "enabled": true, + "matrix_pins": { + "right": { + "direct": [ + ["GP9", "GP8", "GP4", "GP3", "GP2", "GP25"], + ["GP10", "GP6", "GP1", "GP28", "GP27", "GP21"], + ["GP11", "GP5", "GP0", "GP29", "GP26", null], + [null, null, "GP16", "GP17", "GP18", null] + ] + } + }, + "serial": { + "driver": "vendor" + } + }, + "url": "https://github.com/v3lmx/cornifi", + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layout_aliases": { + "LAYOUT": "LAYOUT_split_3x5_3_ex2" + }, + "layouts": { + "LAYOUT_split_3x5_3_ex2": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0.9}, + {"matrix": [0, 1], "x": 1, "y": 0.3}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0.35}, + {"matrix": [0, 4], "x": 4, "y": 0.45}, + {"matrix": [0, 5], "x": 5, "y": 0.7}, + {"matrix": [4, 5], "x": 8, "y": 0.7}, + {"matrix": [4, 4], "x": 9, "y": 0.45}, + {"matrix": [4, 3], "x": 10, "y": 0.35}, + {"matrix": [4, 2], "x": 11, "y": 0}, + {"matrix": [4, 1], "x": 12, "y": 0.3}, + {"matrix": [4, 0], "x": 13, "y": 0.9}, + {"matrix": [1, 0], "x": 0, "y": 1.9}, + {"matrix": [1, 1], "x": 1, "y": 1.3}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1.35}, + {"matrix": [1, 4], "x": 4, "y": 1.45}, + {"matrix": [1, 5], "x": 5, "y": 1.7}, + {"matrix": [5, 5], "x": 8, "y": 1.7}, + {"matrix": [5, 4], "x": 9, "y": 1.45}, + {"matrix": [5, 3], "x": 10, "y": 1.35}, + {"matrix": [5, 2], "x": 11, "y": 1}, + {"matrix": [5, 1], "x": 12, "y": 1.3}, + {"matrix": [5, 0], "x": 13, "y": 1.9}, + {"matrix": [2, 0], "x": 0, "y": 2.9}, + {"matrix": [2, 1], "x": 1, "y": 2.3}, + {"matrix": [2, 2], "x": 2, "y": 2}, + {"matrix": [2, 3], "x": 3, "y": 2.35}, + {"matrix": [2, 4], "x": 4, "y": 2.45}, + {"matrix": [6, 4], "x": 9, "y": 2.45}, + {"matrix": [6, 3], "x": 10, "y": 2.35}, + {"matrix": [6, 2], "x": 11, "y": 2}, + {"matrix": [6, 1], "x": 12, "y": 2.3}, + {"matrix": [6, 0], "x": 13, "y": 2.9}, + {"matrix": [3, 2], "x": 3, "y": 3.7}, + {"matrix": [3, 3], "x": 4, "y": 3.7}, + {"matrix": [3, 4], "x": 5, "y": 3.2, "h": 1.5}, + {"matrix": [7, 4], "x": 8, "y": 3.2, "h": 1.5}, + {"matrix": [7, 3], "x": 9, "y": 3.7}, + {"matrix": [7, 2], "x": 10, "y": 3.7} + ] + } + } +} diff --git a/keyboards/cornifi/keymaps/default/keymap.c b/keyboards/cornifi/keymaps/default/keymap.c new file mode 100644 index 0000000000..207db11738 --- /dev/null +++ b/keyboards/cornifi/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2025 @v3lmx +// SPDX-License-Identifier: GPL-3.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [0] = LAYOUT_split_3x5_3_ex2( + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN, + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, + KC_ESC, MO(1), KC_TAB, KC_ENT, MO(2), KC_BSPC + ), + [1] = LAYOUT_split_3x5_3_ex2( + KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, _______, KC_LEFT,KC_DOWN,KC_UP, KC_RIGHT,XXXXXXX, + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, + KC_LGUI,_______,KC_SPC, KC_ENT, XXXXXXX, KC_RALT + ), + [2] = LAYOUT_split_3x5_3_ex2( + KC_EXLM, KC_AT,KC_HASH, KC_DLR, KC_PERC,_______, _______, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, _______, KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS, + XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE, + KC_LGUI,XXXXXXX, KC_SPC, KC_ENT, _______,KC_RALT + ) + // clang-format on +}; diff --git a/keyboards/cornifi/readme.md b/keyboards/cornifi/readme.md new file mode 100644 index 0000000000..3c4022e5ac --- /dev/null +++ b/keyboards/cornifi/readme.md @@ -0,0 +1,32 @@ +# cornifi + +![cornifi keyboard](https://i.imgur.com/Q7B3VX8.jpeg) + +The cornifi keyboard is a split keyboard based on the [corne](https://github.com/foostan/crkbd) with the physical layout of the [fifi](https://github.com/raychengy/fifi_split_keeb). + +* Keyboard Maintainer: [v3lmx (github)](https://github.com/v3lmx) +* Hardware Availability: [v3lmx/cornifi (github)](https://github.com/v3lmx/cornifi) + +Make example for this keyboard (after setting up your build environment): + + make cornifi:default + +Flashing example for this keyboard: + + make cornifi: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**: Hold down the `boot` button and press the `reset` button +* **Keycode in layout**: Press the key mapped to `TD_BOOT` twice if it is available + +## Keymap + +It is recommended to make your own keymap using the [external userspace feature(https://docs.qmk.fm/newbs_external_userspace). + +You can find an example here: [v3lmx qmk userspace](https://github.com/v3lmx/qmk_userspace) From a5fb7cfbc9f8e2eee6dcd46f3d47ec58fd539336 Mon Sep 17 00:00:00 2001 From: "Nes (Jordan)" Date: Sat, 1 Nov 2025 17:06:47 -0700 Subject: [PATCH 580/592] Sofle pico (#25750) --- keyboards/sofle_pico/config.h | 23 ++ keyboards/sofle_pico/halconf.h | 7 + keyboards/sofle_pico/keyboard.json | 239 ++++++++++++++++++ keyboards/sofle_pico/keymaps/default/keymap.c | 53 ++++ .../sofle_pico/keymaps/default/readme.md | 10 + keyboards/sofle_pico/keymaps/default/rules.mk | 1 + keyboards/sofle_pico/readme.md | 31 +++ keyboards/sofle_pico/sofle_pico.c | 32 +++ 8 files changed, 396 insertions(+) create mode 100644 keyboards/sofle_pico/config.h create mode 100644 keyboards/sofle_pico/halconf.h create mode 100644 keyboards/sofle_pico/keyboard.json create mode 100644 keyboards/sofle_pico/keymaps/default/keymap.c create mode 100644 keyboards/sofle_pico/keymaps/default/readme.md create mode 100644 keyboards/sofle_pico/keymaps/default/rules.mk create mode 100644 keyboards/sofle_pico/readme.md create mode 100644 keyboards/sofle_pico/sofle_pico.c diff --git a/keyboards/sofle_pico/config.h b/keyboards/sofle_pico/config.h new file mode 100644 index 0000000000..f4f34171fa --- /dev/null +++ b/keyboards/sofle_pico/config.h @@ -0,0 +1,23 @@ +// Copyright 2024 Ryan Neff (@JellyTitan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* Use full duplex communication (TRRS) */ +#define SERIAL_USART_FULL_DUPLEX +#define SERIAL_USART_TX_PIN GP16 +#define SERIAL_USART_RX_PIN GP17 +/* Swap TX and RX pins if keyboard is master half. Only available on some MCU's. This _is_ available on the RP2040 */ +#define SERIAL_USART_PIN_SWAP + +/* I2C for OLEDs */ +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP6 +#define I2C1_SCL_PIN GP7 + +#define OLED_DISPLAY_128X64 +#define OLED_TIMEOUT 30000 + +#define ENCODER_MAP_KEY_DELAY 10 + +#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50 diff --git a/keyboards/sofle_pico/halconf.h b/keyboards/sofle_pico/halconf.h new file mode 100644 index 0000000000..ed969d9afc --- /dev/null +++ b/keyboards/sofle_pico/halconf.h @@ -0,0 +1,7 @@ +// Copyright 2024 Ryan Neff (@JellyTitan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#define HAL_USE_I2C TRUE +#include_next diff --git a/keyboards/sofle_pico/keyboard.json b/keyboards/sofle_pico/keyboard.json new file mode 100644 index 0000000000..c57c4e8f9e --- /dev/null +++ b/keyboards/sofle_pico/keyboard.json @@ -0,0 +1,239 @@ +{ + "manufacturer": "Ryan Neff", + "keyboard_name": "Sofle Pico", + "maintainer": "Ryan Neff ", + "bootloader": "rp2040", + "bootloader_instructions": "Hold the BOOT button while plugging in the usb cable", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP14", "pin_b": "GP15"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "oled": true, + "rgb_matrix": true + }, + "matrix_pins": { + "cols": ["GP1", "GP2", "GP3", "GP4", "GP5", "GP8"], + "rows": ["GP9", "GP10", "GP11", "GP12", "GP13"] + }, + "processor": "RP2040", + "rgb_matrix": { + "animations": { + "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, + "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_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": 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, + "typing_heatmap": true + }, + "default": { + "animation": "cycle_out_in_dual", + "speed": 16 + }, + "driver": "ws2812", + "layout": [ + {"matrix": [0, 5], "x": 95, "y": 7, "flags": 4}, + {"matrix": [1, 5], "x": 95, "y": 21, "flags": 4}, + {"matrix": [2, 5], "x": 95, "y": 36, "flags": 4}, + {"matrix": [3, 5], "x": 95, "y": 50, "flags": 4}, + {"matrix": [4, 4], "x": 115, "y": 64, "flags": 4}, + {"matrix": [4, 3], "x": 95, "y": 64, "flags": 4}, + {"matrix": [4, 2], "x": 76, "y": 62, "flags": 4}, + {"matrix": [3, 4], "x": 76, "y": 48, "flags": 4}, + {"matrix": [2, 4], "x": 76, "y": 33, "flags": 4}, + {"matrix": [1, 4], "x": 76, "y": 19, "flags": 4}, + {"matrix": [0, 4], "x": 76, "y": 5, "flags": 4}, + {"matrix": [0, 3], "x": 57, "y": 3, "flags": 4}, + {"matrix": [1, 3], "x": 57, "y": 17, "flags": 4}, + {"matrix": [2, 3], "x": 57, "y": 31, "flags": 4}, + {"matrix": [3, 3], "x": 57, "y": 46, "flags": 4}, + {"matrix": [4, 1], "x": 57, "y": 62, "flags": 4}, + {"matrix": [4, 0], "x": 38, "y": 64, "flags": 4}, + {"matrix": [3, 2], "x": 38, "y": 48, "flags": 4}, + {"matrix": [2, 2], "x": 38, "y": 33, "flags": 4}, + {"matrix": [1, 2], "x": 38, "y": 19, "flags": 4}, + {"matrix": [0, 2], "x": 38, "y": 5, "flags": 4}, + {"matrix": [0, 1], "x": 19, "y": 7, "flags": 4}, + {"matrix": [1, 1], "x": 19, "y": 21, "flags": 4}, + {"matrix": [2, 1], "x": 19, "y": 36, "flags": 4}, + {"matrix": [3, 1], "x": 19, "y": 50, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 50, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 36, "flags": 4}, + {"matrix": [1, 0], "x": 0, "y": 21, "flags": 4}, + {"matrix": [0, 0], "x": 0, "y": 7, "flags": 4}, + {"matrix": [5, 5], "x": 129, "y": 7, "flags": 4}, + {"matrix": [6, 5], "x": 129, "y": 21, "flags": 4}, + {"matrix": [7, 5], "x": 129, "y": 36, "flags": 4}, + {"matrix": [8, 5], "x": 129, "y": 50, "flags": 4}, + {"matrix": [9, 4], "x": 119, "y": 64, "flags": 4}, + {"matrix": [9, 3], "x": 129, "y": 64, "flags": 4}, + {"matrix": [9, 2], "x": 148, "y": 62, "flags": 4}, + {"matrix": [8, 4], "x": 148, "y": 48, "flags": 4}, + {"matrix": [7, 4], "x": 148, "y": 33, "flags": 4}, + {"matrix": [6, 4], "x": 148, "y": 19, "flags": 4}, + {"matrix": [5, 4], "x": 148, "y": 5, "flags": 4}, + {"matrix": [5, 3], "x": 167, "y": 3, "flags": 4}, + {"matrix": [6, 3], "x": 167, "y": 17, "flags": 4}, + {"matrix": [7, 3], "x": 167, "y": 31, "flags": 4}, + {"matrix": [8, 3], "x": 167, "y": 46, "flags": 4}, + {"matrix": [9, 1], "x": 167, "y": 62, "flags": 4}, + {"matrix": [9, 0], "x": 186, "y": 64, "flags": 4}, + {"matrix": [8, 2], "x": 186, "y": 48, "flags": 4}, + {"matrix": [7, 2], "x": 186, "y": 33, "flags": 4}, + {"matrix": [6, 2], "x": 186, "y": 19, "flags": 4}, + {"matrix": [5, 2], "x": 186, "y": 5, "flags": 4}, + {"matrix": [5, 1], "x": 209, "y": 7, "flags": 4}, + {"matrix": [6, 1], "x": 209, "y": 21, "flags": 4}, + {"matrix": [7, 1], "x": 209, "y": 36, "flags": 4}, + {"matrix": [8, 1], "x": 209, "y": 50, "flags": 4}, + {"matrix": [8, 0], "x": 224, "y": 50, "flags": 4}, + {"matrix": [7, 0], "x": 224, "y": 36, "flags": 4}, + {"matrix": [6, 0], "x": 224, "y": 21, "flags": 4}, + {"matrix": [5, 0], "x": 224, "y": 7, "flags": 4} + ], + "max_brightness": 127, + "sleep": true, + "split_count": [29, 29] + }, + "split": { + "bootmagic": { + "matrix": [5, 0] + }, + "enabled": true, + "encoder": { + "right": { + "rotary": [ + {"pin_a": "GP14", "pin_b": "GP15"} + ] + } + }, + "serial": { + "driver": "vendor" + }, + "transport": { + "sync": { + "layer_state": true, + "matrix_state": true + } + } + }, + "tags": ["ortho", "split", "rgb", "encoder", "OLED", "128x64", "tenting_puck"], + "url": "https://github.com/JellyTitan/Sofle-Pico", + "usb": { + "device_version": "3.5.4", + "pid": "0x5350", + "vid": "0x4A54" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "`", "matrix": [0, 0], "x": 0, "y": 0.7}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0.7}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0.3}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0.3}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0.45}, + {"label": "6", "matrix": [5, 5], "x": 9, "y": 0.45}, + {"label": "7", "matrix": [5, 4], "x": 10, "y": 0.3}, + {"label": "8", "matrix": [5, 3], "x": 11, "y": 0}, + {"label": "9", "matrix": [5, 2], "x": 12, "y": 0.3}, + {"label": "0", "matrix": [5, 1], "x": 13, "y": 0.7}, + {"label": "`", "matrix": [5, 0], "x": 14, "y": 0.7}, + {"label": "Esc", "matrix": [1, 0], "x": 0, "y": 1.7}, + {"label": "Q", "matrix": [1, 1], "x": 1, "y": 1.7}, + {"label": "W", "matrix": [1, 2], "x": 2, "y": 1.3}, + {"label": "E", "matrix": [1, 3], "x": 3, "y": 1}, + {"label": "R", "matrix": [1, 4], "x": 4, "y": 1.3}, + {"label": "T", "matrix": [1, 5], "x": 5, "y": 1.45}, + {"label": "Y", "matrix": [6, 5], "x": 9, "y": 1.45}, + {"label": "U", "matrix": [6, 4], "x": 10, "y": 1.3}, + {"label": "I", "matrix": [6, 3], "x": 11, "y": 1}, + {"label": "O", "matrix": [6, 2], "x": 12, "y": 1.3}, + {"label": "P", "matrix": [6, 1], "x": 13, "y": 1.7}, + {"label": "Bspc", "matrix": [6, 0], "x": 14, "y": 1.7}, + {"label": "Tab", "matrix": [2, 0], "x": 0, "y": 2.7}, + {"label": "A", "matrix": [2, 1], "x": 1, "y": 2.7}, + {"label": "S", "matrix": [2, 2], "x": 2, "y": 2.3}, + {"label": "D", "matrix": [2, 3], "x": 3, "y": 2}, + {"label": "F", "matrix": [2, 4], "x": 4, "y": 2.3}, + {"label": "G", "matrix": [2, 5], "x": 5, "y": 2.45}, + {"label": "H", "matrix": [7, 5], "x": 9, "y": 2.45}, + {"label": "J", "matrix": [7, 4], "x": 10, "y": 2.3}, + {"label": "K", "matrix": [7, 3], "x": 11, "y": 2}, + {"label": "L", "matrix": [7, 2], "x": 12, "y": 2.3}, + {"label": ";", "matrix": [7, 1], "x": 13, "y": 2.7}, + {"label": "'", "matrix": [7, 0], "x": 14, "y": 2.7}, + {"label": "LShift", "matrix": [3, 0], "x": 0, "y": 3.7}, + {"label": "Z", "matrix": [3, 1], "x": 1, "y": 3.7}, + {"label": "X", "matrix": [3, 2], "x": 2, "y": 3.3}, + {"label": "C", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "V", "matrix": [3, 4], "x": 4, "y": 3.3}, + {"label": "B", "matrix": [3, 5], "x": 5, "y": 3.45}, + {"label": "Mute", "matrix": [4, 5], "x": 6.2, "y": 3.45}, + {"label": "Pause", "matrix": [9, 5], "x": 7.8, "y": 3.45}, + {"label": "N", "matrix": [8, 5], "x": 9, "y": 3.45}, + {"label": "M", "matrix": [8, 4], "x": 10, "y": 3.3}, + {"label": ",", "matrix": [8, 3], "x": 11, "y": 3}, + {"label": ".", "matrix": [8, 2], "x": 12, "y": 3.3}, + {"label": "/", "matrix": [8, 1], "x": 13, "y": 3.7}, + {"label": "RShift", "matrix": [8, 0], "x": 14, "y": 3.7}, + {"label": "LCtrl", "matrix": [4, 0], "x": 2, "y": 4.3}, + {"label": "LGUI", "matrix": [4, 1], "x": 3, "y": 4}, + {"label": "LCmnd", "matrix": [4, 2], "x": 4, "y": 4.3}, + {"label": "LAlt", "matrix": [4, 3], "x": 5.1, "y": 4.5, "h": 1.5}, + {"label": "Enter", "matrix": [4, 4], "x": 6.1, "y": 4.5, "h": 1.5}, + {"label": "Space", "matrix": [9, 4], "x": 7.9, "y": 4.5, "h": 1.5}, + {"label": "RAlt", "matrix": [9, 3], "x": 8.9, "y": 4.5, "h": 1.5}, + {"label": "RCmnd", "matrix": [9, 2], "x": 10, "y": 4.3}, + {"label": "RGui", "matrix": [9, 1], "x": 11, "y": 4}, + {"label": "RCtrl", "matrix": [9, 0], "x": 12, "y": 4.3} + ] + } + } +} diff --git a/keyboards/sofle_pico/keymaps/default/keymap.c b/keyboards/sofle_pico/keymaps/default/keymap.c new file mode 100644 index 0000000000..a09f32fc37 --- /dev/null +++ b/keyboards/sofle_pico/keymaps/default/keymap.c @@ -0,0 +1,53 @@ +// Copyright 2024 Ryan Neff (@JellyTitan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +enum sofle_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // clang-format off + [_QWERTY] = LAYOUT( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, 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_MUTE, XXXXXXX, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LGUI, KC_LALT, KC_LCTL, TL_LOWR, KC_ENT, KC_SPC , TL_UPPR, KC_RCTL, KC_RALT, KC_RGUI + ), + [_LOWER] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, + _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, KC_BSPC, + _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , KC_BSPC, + _______, C(KC_Z), C(KC_X), C(KC_C), C(KC_V), XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [_ADJUST] = LAYOUT( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RM_TOGG, RM_VALU, RM_VALD, XXXXXXX, XXXXXXX, XXXXXXX, + QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, CG_TOGG, XXXXXXX, RM_NEXT, RM_PREV, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + // clang-format on +}; + +#ifdef 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(KC_PGUP, KC_PGDN)}, + [2] = {ENCODER_CCW_CW(_______, _______)}, + [3] = {ENCODER_CCW_CW(_______, _______)}, +}; +#endif diff --git a/keyboards/sofle_pico/keymaps/default/readme.md b/keyboards/sofle_pico/keymaps/default/readme.md new file mode 100644 index 0000000000..a15159d07c --- /dev/null +++ b/keyboards/sofle_pico/keymaps/default/readme.md @@ -0,0 +1,10 @@ +![SofleKeyboard default keymap](https://i.imgur.com/MZxVvm9.png) +![SofleKeyboard adjust layer](https://i.imgur.com/f5sKy0I.png) + + +# Default keymap for Sofle Pico Keyboard + +Adapted from the classic Sofle Keyboard by Josef Adamcik. +Simplified to serve as a starting point for further customizations. +Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff) +Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN. diff --git a/keyboards/sofle_pico/keymaps/default/rules.mk b/keyboards/sofle_pico/keymaps/default/rules.mk new file mode 100644 index 0000000000..7c9bf212a6 --- /dev/null +++ b/keyboards/sofle_pico/keymaps/default/rules.mk @@ -0,0 +1 @@ +TRI_LAYER_ENABLE = yes diff --git a/keyboards/sofle_pico/readme.md b/keyboards/sofle_pico/readme.md new file mode 100644 index 0000000000..34498d0c1b --- /dev/null +++ b/keyboards/sofle_pico/readme.md @@ -0,0 +1,31 @@ +# Sofle Pico Keyboard + +![Sofle Pico](https://i.imgur.com/9VBj3T5.jpeg) +![Sofle Pico PCB](https://i.imgur.com/8SDTm4h.jpeg) +Sofle Pico is a 60% Raspberry Pi Pico powered split keyboard boasting a 4x6 layout with an aggressive columnar stagger. It has 5 "thumb" keys on either side, support for 2-4 rotary encoders, per-key RGB lighting, 128x64 OLEDs and a tenting puck mount. + +- Keyboard Maintainer: [Ryan Neff](https://github.com/JellyTitan) +- Hardware Supported: Sofle Pico PCB v3.5.x, Raspberry Pi Pico +- Hardware Availability: [PCB, Case, Parts List](https://github.com/JellyTitan/Sofle-Pico) + +Remember you have to flash both halves of the keyboard for it to work! + +Make example for this keyboard (after setting up your build environment): + + make sofle_pico:default + +Flashing example for this keyboard: + + make sofle_pico: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** (works after you have flashed once): Hold down the top far corner key while plugging in the keyboard (`~` left half, `-` right half). This will also clear the EEPROM. +- **Physical reset button**: Hold the `BOOT` button on the Pico and press the `RST` button on the Pico, release the the `RST` button before the `BOOT` button. +- **Keycode in layout**: In the default layout, the `Bootloader` keycode is above home row pinky on the right side's adjust layer. + +Once you enter the bootloader, the keyboard will show up as a USB device on your computer, you could drag and drop a `.uf2` firmware file to flash it. diff --git a/keyboards/sofle_pico/sofle_pico.c b/keyboards/sofle_pico/sofle_pico.c new file mode 100644 index 0000000000..b237dfc599 --- /dev/null +++ b/keyboards/sofle_pico/sofle_pico.c @@ -0,0 +1,32 @@ +// Copyright 2024 Ryan Neff (@JellyTitan) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#ifdef OLED_ENABLE + +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_90; +} + +static void render_logo(void) { + static const char PROGMEM sofle_pico_logo[] = { + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xe0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf8, 0xfc, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x3f, 0x3f, 0x3f, 0x7c, 0x78, 0xf8, 0xf8, 0xf0, 0xe0, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0x3c, 0x1c, 0x1e, 0x1e, 0x3c, 0xfc, 0xf8, 0xf0, 0xc0, 0x00, 0x1c, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xce, 0xce, 0xce, 0xdc, 0xfc, 0xfc, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1e, 0x1e, 0x1e, 0x3c, 0x3c, 0x3c, 0x3e, 0x1f, 0x1f, 0x0f, 0x07, 0x01, 0x00, 0x01, 0x07, + 0x0f, 0x1f, 0x1e, 0x3c, 0x3c, 0x3c, 0x1e, 0x1f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x3c, 0x38, 0x38, 0x3c, 0x1c, 0x1c, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x06, 0x06, 0x06, 0x0e, 0x9e, 0xfc, 0xf8, 0x00, 0x00, 0x8e, 0x8e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 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, 0xff, 0xff, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x7c, 0xfe, 0xff, 0x83, 0x01, 0x01, 0x01, 0x83, 0x83, 0x00, 0x00, 0x7e, 0xff, 0xc7, 0x83, 0x01, 0x01, 0x01, + 0x83, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc3, 0xe3, 0xe0, 0xe0, 0xe0, 0xf0, 0x70, 0x70, 0x70, 0x70, 0x30, 0x33, 0x73, 0xe0, 0x60, 0xe0, 0xe0, 0xc0, 0xc1, 0x83, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x70, 0x30, 0x70, 0x70, 0x70, 0x70, 0x70, 0xf0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, 0xff, 0xf8, 0xd0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x20, 0x40, 0xc0, 0x80, 0x00, 0x01, 0x87, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xff, 0xff, 0x03, 0x01, 0x00, 0x80, 0xc0, 0x40, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xf0, 0xf8, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, 0x1c, 0x1c, 0x38, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x38, 0x39, 0xdf, 0xef, 0xf7, 0x7b, 0x39, 0x1c, 0x1c, 0x0e, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0e, 0x0e, 0x1e, 0x1c, 0x3c, 0x79, 0xfb, 0xf7, 0xef, 0x9f, 0x38, 0x30, 0x70, 0x60, 0x60, 0x60, 0x60, 0x70, 0x38, 0x3c, 0x1c, 0x0f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0xf8, 0xfc, 0x7e, 0x7f, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xff, 0x7f, 0x7f, 0x3f, 0x7c, 0xf8, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xfe, 0x7c, 0x78, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x78, 0x78, 0x7c, 0xfe, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x0e, 0x1e, 0x3f, 0x7f, 0xf1, 0xe0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xe1, 0xf3, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + oled_write_raw_P(sofle_pico_logo, sizeof(sofle_pico_logo)); +} + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + render_logo(); + return false; +} + +#endif From a9739f78681dee290ede955c02b360f5c133f783 Mon Sep 17 00:00:00 2001 From: James Young <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 3 Nov 2025 16:05:39 -0800 Subject: [PATCH 581/592] [docs] Replace Imgur-hosted images (#25690) --- .gitignore | 5 ++++ docs/driver_installation_zadig.md | 12 ++++---- docs/easy_maker.md | 2 +- docs/faq_keymap.md | 2 +- docs/features/autocorrect.md | 4 +-- docs/features/backlight.md | 2 +- docs/features/layer_lock.md | 4 +-- docs/features/rgblight.md | 2 +- docs/features/split_keyboard.md | 6 ++-- docs/getting_started_github.md | 10 +++---- docs/hand_wire.md | 28 +++++++++---------- docs/newbs_building_firmware_configurator.md | 2 +- docs/newbs_external_userspace.md | 8 +++--- docs/other_eclipse.md | 2 +- docs/other_vscode.md | 2 +- docs/platformdev_blackpill_f4x1.md | 2 +- docs/platformdev_proton_c.md | 2 +- docs/platformdev_rp2040.md | 4 +-- docs/public/0GNIYY0.jpg | Bin 0 -> 97616 bytes docs/public/1TPAhrs.jpg | Bin 0 -> 117667 bytes docs/public/2wUZNWk.png | Bin 0 -> 7734 bytes docs/public/3RrSjzW.png | Bin 0 -> 10544 bytes docs/public/4wjJzBU.png | Bin 0 -> 4051 bytes docs/public/5wsh5wM.png | Bin 0 -> 47259 bytes docs/public/8Toomz4.jpg | Bin 0 -> 27480 bytes docs/public/AvXZShD.jpg | Bin 0 -> 94653 bytes docs/public/BPEC5n5.jpg | Bin 0 -> 38514 bytes docs/public/BmAvoUC.png | Bin 0 -> 17960 bytes docs/public/Bu4mk9m.png | Bin 0 -> 3447 bytes docs/public/CWYmsk8.png | Bin 0 -> 31676 bytes docs/public/CnASmPo.jpg | Bin 0 -> 289270 bytes docs/public/DkEhj9x.png | Bin 0 -> 8998 bytes docs/public/DxMHpJ8.jpg | Bin 0 -> 32520 bytes docs/public/EGrPM1L.png | Bin 0 -> 28464 bytes docs/public/EVkxOt1.png | Bin 0 -> 65661 bytes docs/public/FRShcLD.png | Bin 0 -> 41983 bytes docs/public/HL5DP8H.png | Bin 0 -> 11250 bytes docs/public/Hx0E5kC.png | Bin 0 -> 9873 bytes docs/public/JKngtTw.png | Bin 0 -> 5700 bytes docs/public/JcDhZll.png | Bin 0 -> 13471 bytes docs/public/N1NYcSz.jpg | Bin 0 -> 32344 bytes docs/public/Ojydlaj.jpg | Bin 0 -> 40688 bytes docs/public/QeY6kMQ.png | Bin 0 -> 3572 bytes docs/public/QiA3ta6.jpg | Bin 0 -> 164162 bytes docs/public/RFyNMlL.jpg | Bin 0 -> 166582 bytes docs/public/UlJ4ZDP.png | Bin 0 -> 26297 bytes docs/public/aEs2RuA.png | Bin 0 -> 3784 bytes docs/public/aTnG8TV.jpg | Bin 0 -> 46839 bytes docs/public/anw9cOL.png | Bin 0 -> 82094 bytes docs/public/b4b7KDb.jpg | Bin 0 -> 288162 bytes docs/public/b8VgXzx.png | Bin 0 -> 9653 bytes docs/public/eGO0ohO.jpg | Bin 0 -> 11793 bytes docs/public/eHJjmnU.jpg | Bin 0 -> 123338 bytes docs/public/fmDvDzR.png | Bin 0 -> 12205 bytes docs/public/hcegguh.png | Bin 0 -> 19408 bytes docs/public/mBe5vkL.jpg | Bin 0 -> 78381 bytes docs/public/nCgeolTh.png | Bin 0 -> 201338 bytes docs/public/nLaiYDE.jpg | Bin 0 -> 222428 bytes docs/public/o7WLvBl.png | Bin 0 -> 3524 bytes docs/public/oHYR1yW.png | Bin 0 -> 18766 bytes docs/public/oITudbX.jpg | Bin 0 -> 444216 bytes docs/public/vkYVo66.jpg | Bin 0 -> 44280 bytes docs/public/z2QlKfB.jpg | Bin 0 -> 260874 bytes docs/public/zmwOL5P.png | Bin 0 -> 35246 bytes docs/reference_configurator_support.md | 18 +++++++++--- 65 files changed, 66 insertions(+), 51 deletions(-) create mode 100644 docs/public/0GNIYY0.jpg create mode 100644 docs/public/1TPAhrs.jpg create mode 100644 docs/public/2wUZNWk.png create mode 100644 docs/public/3RrSjzW.png create mode 100644 docs/public/4wjJzBU.png create mode 100644 docs/public/5wsh5wM.png create mode 100644 docs/public/8Toomz4.jpg create mode 100644 docs/public/AvXZShD.jpg create mode 100644 docs/public/BPEC5n5.jpg create mode 100644 docs/public/BmAvoUC.png create mode 100644 docs/public/Bu4mk9m.png create mode 100644 docs/public/CWYmsk8.png create mode 100644 docs/public/CnASmPo.jpg create mode 100644 docs/public/DkEhj9x.png create mode 100644 docs/public/DxMHpJ8.jpg create mode 100644 docs/public/EGrPM1L.png create mode 100644 docs/public/EVkxOt1.png create mode 100644 docs/public/FRShcLD.png create mode 100644 docs/public/HL5DP8H.png create mode 100644 docs/public/Hx0E5kC.png create mode 100644 docs/public/JKngtTw.png create mode 100644 docs/public/JcDhZll.png create mode 100644 docs/public/N1NYcSz.jpg create mode 100644 docs/public/Ojydlaj.jpg create mode 100644 docs/public/QeY6kMQ.png create mode 100644 docs/public/QiA3ta6.jpg create mode 100644 docs/public/RFyNMlL.jpg create mode 100644 docs/public/UlJ4ZDP.png create mode 100644 docs/public/aEs2RuA.png create mode 100644 docs/public/aTnG8TV.jpg create mode 100644 docs/public/anw9cOL.png create mode 100644 docs/public/b4b7KDb.jpg create mode 100644 docs/public/b8VgXzx.png create mode 100644 docs/public/eGO0ohO.jpg create mode 100644 docs/public/eHJjmnU.jpg create mode 100644 docs/public/fmDvDzR.png create mode 100644 docs/public/hcegguh.png create mode 100644 docs/public/mBe5vkL.jpg create mode 100644 docs/public/nCgeolTh.png create mode 100644 docs/public/nLaiYDE.jpg create mode 100644 docs/public/o7WLvBl.png create mode 100644 docs/public/oHYR1yW.png create mode 100644 docs/public/oITudbX.jpg create mode 100644 docs/public/vkYVo66.jpg create mode 100644 docs/public/z2QlKfB.jpg create mode 100644 docs/public/zmwOL5P.png diff --git a/.gitignore b/.gitignore index 5886640d68..6ec26d3876 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,11 @@ tags *.mpeg *.ttf *.otf +# Un-ignore limited image file formats in docs +!docs/public/**.gif +!docs/public/**.jpg +!docs/public/**.jpeg +!docs/public/**.png # Things Travis sees /.vs diff --git a/docs/driver_installation_zadig.md b/docs/driver_installation_zadig.md index 1a5bd1cc34..6fbcfa3bff 100644 --- a/docs/driver_installation_zadig.md +++ b/docs/driver_installation_zadig.md @@ -22,7 +22,7 @@ If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is pr If the arrow appears green, select the driver, and click **Install Driver**. See the [list of known bootloaders](#list-of-known-bootloaders) for the correct driver to install. -![Zadig with a bootloader driver correctly installed](https://i.imgur.com/b8VgXzx.png) +![Zadig with a bootloader driver correctly installed](/b8VgXzx.png) Finally, unplug and replug the keyboard to make sure the new driver has been loaded. If you are using the QMK Toolbox to flash, exit and restart it too, as it can sometimes fail to recognize the driver change. @@ -30,15 +30,15 @@ Finally, unplug and replug the keyboard to make sure the new driver has been loa If you find that you can no longer type with the keyboard, you may have accidentally replaced the driver for the keyboard itself instead of for the bootloader. This can happen when the keyboard is not in the bootloader mode. You can easily confirm this in Zadig - a healthy keyboard has the `HidUsb` driver installed on all of its interfaces: -![A healthy keyboard as seen by Zadig](https://i.imgur.com/Hx0E5kC.png) +![A healthy keyboard as seen by Zadig](/Hx0E5kC.png) Open the Device Manager, select **View → Devices by container**, and look for an entry with your keyboard's name. -![The board with the wrong driver installed, in Device Manager](https://i.imgur.com/o7WLvBl.png) +![The board with the wrong driver installed, in Device Manager](/o7WLvBl.png) Right-click each entry and hit **Uninstall device**. Make sure to tick **Delete the driver software for this device** first if it appears. -![The Device Uninstall dialog, with the "delete driver" checkbox ticked](https://i.imgur.com/aEs2RuA.png) +![The Device Uninstall dialog, with the "delete driver" checkbox ticked](/aEs2RuA.png) Click **Action → Scan for hardware changes**. At this point, you should be able to type again. Double check in Zadig that the keyboard device(s) are using the `HidUsb` driver. If so, you're all done, and your board should be functional again! Otherwise, repeat this process until Zadig reports the correct driver. @@ -54,11 +54,11 @@ Open the Device Manager, select **View → Devices by container**, and look for Find the `Inf name` value in the Details tab of the device properties. This should generally be something like `oemXX.inf`: -![Device properties showing the Inf name value](https://i.imgur.com/Bu4mk9m.png) +![Device properties showing the Inf name value](/Bu4mk9m.png) Then, open a new Command Prompt window as an Administrator (type in `cmd` into the Start menu and press Ctrl+Shift+Enter). Run `pnputil /enum-drivers` to verify the `Inf name` matches the `Published Name` field of one of the entries: -![pnputil output with matching driver highlighted](https://i.imgur.com/3RrSjzW.png) +![pnputil output with matching driver highlighted](/3RrSjzW.png) Run `pnputil /delete-driver oemXX.inf /uninstall`. This will delete the driver and remove it from any devices using it. Note that this will not uninstall the device itself. diff --git a/docs/easy_maker.md b/docs/easy_maker.md index e94477322b..4a6aa1cb61 100644 --- a/docs/easy_maker.md +++ b/docs/easy_maker.md @@ -24,7 +24,7 @@ As its name implies Direct Pin works by connecting one switch per pin. The other Here is a schematic showing how we connect a single button to pin A3 on a ProMicro: -![Schematic diagram showing a ProMicro with a wire coming out of A3, connecting to the left side of a switch. Another wire comes out of the right side of the switch to connect to the Ground Plane.](https://i.imgur.com/JcDhZll.png) +![Schematic diagram showing a ProMicro with a wire coming out of A3, connecting to the left side of a switch. Another wire comes out of the right side of the switch to connect to the Ground Plane.](/JcDhZll.png) Once you have wired your switches you can assign keycodes to each pin and build a firmware by selecting the MCU you are using from the Keyboard dropdown. Use this link to show only Easy Maker Direct Pin: diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 05bd4fed3e..dbaf7de991 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -13,7 +13,7 @@ Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_ There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here: -![Keyboard Layout Image](https://i.imgur.com/5wsh5wM.png) +![Keyboard Layout Image](/5wsh5wM.png) ## How Can I Make Custom Names For Complex Keycodes? diff --git a/docs/features/autocorrect.md b/docs/features/autocorrect.md index df3f2e0fd8..57024f2cd2 100644 --- a/docs/features/autocorrect.md +++ b/docs/features/autocorrect.md @@ -8,7 +8,7 @@ The feature maintains a small buffer of recent key presses. On each key press, i The tricky part is how to efficiently check the buffer for typos. We don’t want to spend too much memory or time on storing or searching the typos. A good solution is to represent the typos with a trie data structure. A trie is a tree data structure where each node is a letter, and words are formed by following a path to one of the leaves. -![An example trie](https://i.imgur.com/HL5DP8H.png) +![An example trie](/HL5DP8H.png) Since we search whether the buffer ends in a typo, we store the trie writing in reverse. The trie is queried starting from the last letter, then second to last letter, and so on, until either a letter doesn’t match or we reach a leaf, meaning a typo was found. @@ -279,7 +279,7 @@ All autocorrection data is stored in a single flat array autocorrect_data. Each * 01 ⇒ branching node: a trie node with multiple children. * 10 ⇒ leaf node: a leaf, corresponding to a typo and storing its correction. -![An example trie](https://i.imgur.com/HL5DP8H.png) +![An example trie](/HL5DP8H.png) **Branching node**. Each branch is encoded with one byte for the keycode (KC_A–KC_Z) followed by a link to the child node. Links between nodes are 16-bit byte offsets relative to the beginning of the array, serialized in little endian order. diff --git a/docs/features/backlight.md b/docs/features/backlight.md index 20f84ac6b5..87d5a36c00 100644 --- a/docs/features/backlight.md +++ b/docs/features/backlight.md @@ -227,7 +227,7 @@ In this typical example, the backlight LEDs are all connected in parallel toward A pulldown resistor is also placed between the gate pin and ground to keep it at a defined state when it is not otherwise being driven by the MCU. The values of these resistors are not critical - see [this Electronics StackExchange question](https://electronics.stackexchange.com/q/68748) for more information. -![Backlight example circuit](https://i.imgur.com/BmAvoUC.png) +![Backlight example circuit](/BmAvoUC.png) ## API {#api} diff --git a/docs/features/layer_lock.md b/docs/features/layer_lock.md index aaf323accc..27856ada26 100644 --- a/docs/features/layer_lock.md +++ b/docs/features/layer_lock.md @@ -35,12 +35,12 @@ layer. Consider a keymap with the following base layer. -![Base layer with a MO(NAV) key.](https://i.imgur.com/DkEhj9x.png) +![Base layer with a MO(NAV) key.](/DkEhj9x.png) The highlighted key is a momentary layer switch `MO(NAV)`. Holding it accesses a navigation layer. -![Nav layer with a Layer Lock key.](https://i.imgur.com/2wUZNWk.png) +![Nav layer with a Layer Lock key.](/2wUZNWk.png) Holding the NAV key is fine for brief use, but awkward to continue holding when diff --git a/docs/features/rgblight.md b/docs/features/rgblight.md index 43e3781f8d..20d32c4f5a 100644 --- a/docs/features/rgblight.md +++ b/docs/features/rgblight.md @@ -55,7 +55,7 @@ Changing the **Hue** cycles around the circle.
Changing the **Saturation** moves between the inner and outer sections of the wheel, affecting the intensity of the color.
Changing the **Value** sets the overall brightness.
-![QMK Color Wheel with HSV Values](https://i.imgur.com/vkYVo66.jpg) +![QMK Color Wheel with HSV Values](/vkYVo66.jpg) ## Keycodes diff --git a/docs/features/split_keyboard.md b/docs/features/split_keyboard.md index 4b299b14f8..a6fbad1c8f 100644 --- a/docs/features/split_keyboard.md +++ b/docs/features/split_keyboard.md @@ -91,11 +91,11 @@ SPLIT_TRANSPORT = custom Configuring your layout in a split keyboard works slightly differently to a non-split keyboard. Take for example the following layout. The top left numbers refer to the matrix row and column, and the bottom right are the order of the keys in the layout: -![Physical layout](https://i.imgur.com/QeY6kMQ.png) +![Physical layout](/QeY6kMQ.png) Since the matrix scanning procedure operates on entire rows, it first populates the left half's rows, then the right half's. Thus, the matrix as QMK views it has double the rows instead of double the columns: -![Matrix](https://i.imgur.com/4wjJzBU.png) +![Matrix](/4wjJzBU.png) ### Setting Handedness @@ -497,7 +497,7 @@ Once you have done that, you will want to solder the diode from the 5V pad to th You may need to use the 5V pad from the regulator block above as the pads were too small and placed too closely together to place the Schottky diode properly. -![Teensy++ 2.0](https://i.imgur.com/BPEC5n5.png) +![Teensy++ 2.0](/BPEC5n5.jpg) ## Additional Resources diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md index b8587dbb13..4cc9978d3d 100644 --- a/docs/getting_started_github.md +++ b/docs/getting_started_github.md @@ -8,15 +8,15 @@ This guide assumes you're somewhat comfortable with running things at the comman Start on the [QMK GitHub page](https://github.com/qmk/qmk_firmware), and you'll see a button in the upper right that says "Fork": -![Fork on GitHub](https://i.imgur.com/8Toomz4.jpg) +![Fork on GitHub](/8Toomz4.jpg) If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: -![Download from GitHub](https://i.imgur.com/N1NYcSz.jpg) +![Download from GitHub](/N1NYcSz.jpg) And be sure to select "HTTPS", and select the link and copy it: -![HTTPS link](https://i.imgur.com/eGO0ohO.jpg) +![HTTPS link](/eGO0ohO.jpg) From here, enter `git clone --recurse-submodules ` into the command line, and then paste your link: @@ -57,10 +57,10 @@ To https://github.com/whoeveryouare/qmk_firmware.git Your changes now exist on your fork on GitHub - if you go back there (`https://github.com//qmk_firmware`), you can create a "New Pull Request" by clicking this button: -![New Pull Request](https://i.imgur.com/DxMHpJ8.jpg) +![New Pull Request](/DxMHpJ8.jpg) Here you'll be able to see exactly what you've committed - if it all looks good, you can finalize it by clicking "Create Pull Request": -![Create Pull Request](https://i.imgur.com/Ojydlaj.jpg) +![Create Pull Request](/Ojydlaj.jpg) After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :) diff --git a/docs/hand_wire.md b/docs/hand_wire.md index 492ca384b1..25be46fdb7 100644 --- a/docs/hand_wire.md +++ b/docs/hand_wire.md @@ -36,12 +36,12 @@ What you want to achieve is one leg from each switch being attached to the corre It is fairly simple to plan for an ortholinear keyboard (like a Planck). -![Example Planck matrix](https://i.imgur.com/FRShcLD.png) +![Example Planck matrix](/FRShcLD.png) Image from [RoastPotatoes' "How to hand wire a Planck"](https://blog.roastpotatoes.co/guide/2015/11/04/how-to-handwire-a-planck/) But the larger and more complicated your keyboard, the more complex the matrix. [Keyboard Firmware Builder](https://kbfirmware.com/) can help you plan your matrix layout (shown here with a basic fullsize ISO keyboard imported from [Keyboard Layout Editor](https://www.keyboard-layout-editor.com). -![Example ISO matrix](https://i.imgur.com/UlJ4ZDP.png) +![Example ISO matrix](/UlJ4ZDP.png) Bear in mind that the number of rows plus the number of columns can not exceed the number of I/O pins on your controller. So the fullsize matrix shown above would be possible on a Proton C or Teensy++, but not on a regular Teensy or Pro Micro. @@ -51,14 +51,14 @@ Bear in mind that the number of rows plus the number of columns can not exceed t | :------------ |:-------------:| ------:| ------ | | Pro Micro* | ATmega32u4 | 20 | [link](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro#Teensy++_2.0) | | Teensy 2.0 | ATmega32u4 | 25 | [link](https://www.pjrc.com/teensy/pinout.html) | -| [QMK Proton C](https://qmk.fm/proton-c/) | STM32F303xC | 36 | [link 1](https://i.imgur.com/RhtrAlc.png), [2](https://deskthority.net/wiki/QMK_Proton_C) | +| [QMK Proton C](https://qmk.fm/proton-c/) | STM32F303xC | 36 | [link 1](https://qmk.fm/proton-c-pinout.jpg), [2](https://deskthority.net/wiki/QMK_Proton_C) | | Teensy++ 2.0 | AT90USB1286 | 46 | [link](https://www.pjrc.com/teensy/pinout.html#Teensy_2.0) | *Elite C is essentially the same as a Pro Micro with a USB-C instead of Micro-USB There are also a number of boards designed specifically for handwiring that mount directly to a small number of switches and offer pinouts for the rest. Though these are generally more expensive and may be more difficult to get hold of. -Postage board mini mounted in place +Postage board mini mounted in place | Board | Controller | # I/O | | :------------ |:-------------:| ------:| @@ -74,13 +74,13 @@ Established materials and techniques include: | Technique | Examples | Pros | Cons | Image | :-----------| :------- | :------ | :--- | :--- -| Lengths of wire with stripped segments | [Sasha Solomon's Dactyl](https://medium.com/@sachee/building-my-first-keyboard-and-you-can-too-512c0f8a4c5f) and [Cribbit's modern hand wire](https://geekhack.org/index.php?topic=87689.0) | Neat and tidy | Some effort in stripping the wire | ![Stripped wire](https://i.imgur.com/0GNIYY0.jpg) -| Short lengths of wire | [u/xicolinguada's ortho build](https://www.reddit.com/r/MechanicalKeyboards/comments/c39k4f/my_first_hand_wired_keyboard_its_not_perfect_but/) | Easier to strip the wire | More difficult to place | ![individual wire lengths](https://i.imgur.com/mBe5vkL.jpg) -| Magnet/Enamelled wire | [fknraiden's custom board](https://geekhack.org/index.php?topic=74223.0) | Can be directly soldered onto (insulation burns off with heat) | Appearance? | ![Magnet wire](https://i.imgur.com/b4b7KDb.jpg) -| Bending the legs of the diodes for the rows | [Matt3o's Brownfox](https://deskthority.net/viewtopic.php?f=7&t=6050) | Fewer solder joints required | Uninsulated | ![Bent diode legs](https://i.imgur.com/aTnG8TV.jpg) -| Using rigid wiring (e.g. brass tube) | [u/d_stilgar's invisible hardline](https://www.reddit.com/r/MechanicalKeyboards/comments/8aw5j2/invisible_hardline_keyboard_progress_update_april/) and [u/jonasfasler's first attempt](https://www.reddit.com/r/MechanicalKeyboards/comments/de1jyv/my_first_attempt_at_handwiring_a_keyboard/) | Very pretty | More difficult. No physical insulation | ![Hardline hand wire](https://i.imgur.com/CnASmPo.jpg) -| Bare wire with insulation added after (e.g. kapton tape) | [Matt3o's 65% on his website](https://matt3o.com/hand-wiring-a-custom-keyboard/) | Easier (no wire stripping required) | Not as attractive | ![Bare wire](https://i.imgur.com/AvXZShD.jpg) -| Copper tape | [ManuForm Dactyl](https://github.com/tshort/dactyl-keyboard) | Very easy | Only really works when your plate/case aligns with the bottom of your switches | ![Copper tape](https://i.imgur.com/RFyNMlL.jpg) +| Lengths of wire with stripped segments | [Sasha Solomon's Dactyl](https://medium.com/@sachee/building-my-first-keyboard-and-you-can-too-512c0f8a4c5f) and [Cribbit's modern hand wire](https://geekhack.org/index.php?topic=87689.0) | Neat and tidy | Some effort in stripping the wire | ![Stripped wire](/0GNIYY0.jpg) +| Short lengths of wire | [u/xicolinguada's ortho build](https://www.reddit.com/r/MechanicalKeyboards/comments/c39k4f/my_first_hand_wired_keyboard_its_not_perfect_but/) | Easier to strip the wire | More difficult to place | ![individual wire lengths](/mBe5vkL.jpg) +| Magnet/Enamelled wire | [fknraiden's custom board](https://geekhack.org/index.php?topic=74223.0) | Can be directly soldered onto (insulation burns off with heat) | Appearance? | ![Magnet wire](/b4b7KDb.jpg) +| Bending the legs of the diodes for the rows | [Matt3o's Brownfox](https://deskthority.net/viewtopic.php?f=7&t=6050) | Fewer solder joints required | Uninsulated | ![Bent diode legs](/aTnG8TV.jpg) +| Using rigid wiring (e.g. brass tube) | [u/d_stilgar's invisible hardline](https://www.reddit.com/r/MechanicalKeyboards/comments/8aw5j2/invisible_hardline_keyboard_progress_update_april/) and [u/jonasfasler's first attempt](https://www.reddit.com/r/MechanicalKeyboards/comments/de1jyv/my_first_attempt_at_handwiring_a_keyboard/) | Very pretty | More difficult. No physical insulation | ![Hardline hand wire](/CnASmPo.jpg) +| Bare wire with insulation added after (e.g. kapton tape) | [Matt3o's 65% on his website](https://matt3o.com/hand-wiring-a-custom-keyboard/) | Easier (no wire stripping required) | Not as attractive | ![Bare wire](/AvXZShD.jpg) +| Copper tape | [ManuForm Dactyl](https://github.com/tshort/dactyl-keyboard) | Very easy | Only really works when your plate/case aligns with the bottom of your switches | ![Copper tape](/RFyNMlL.jpg) Note that these methods can be combined. Prepare your lengths of wire before moving on to soldering. @@ -97,11 +97,11 @@ There are a lot of soldering guides and tips available elsewhere but here are so To ensure a strong solder joint you want a good amount of contact between the solder and the two pieces of metal you are connecting. A good way of doing this (though not required) is looping around pins or twisting wires together before applying solder. -Looped around rod Looped diode leg +Looped around rod If your diodes are on a packaging strip and need a bend in them (either the start of a loop or for connecting to its neighbour) this can easily done by bending it over something straight like the edge of a box, table, or ruler. This also helps keep track of the direction of the diode as all the bends will be on the same side. -Bent diode legs +Bent diode legs If your iron has temperature control, set it to 315ºC (600ºF). @@ -164,7 +164,7 @@ Cut wires to the length of the distance from the a point on each column/row to t Ribbon cable can be used to keep this extra tidy. You may also want to consider routing the wires beneath the existing columns/rows. -Ribbon Cable +Ribbon Cable As you solder the wires to the controller make a note of which row/column is going to which pin on the controller as we'll use this data to setup the matrix when we create the firmware. diff --git a/docs/newbs_building_firmware_configurator.md b/docs/newbs_building_firmware_configurator.md index 85522e405c..6d441311dc 100644 --- a/docs/newbs_building_firmware_configurator.md +++ b/docs/newbs_building_firmware_configurator.md @@ -1,6 +1,6 @@ # QMK Configurator -[![QMK Configurator Screenshot](https://i.imgur.com/anw9cOL.png)](https://config.qmk.fm/) +[![QMK Configurator Screenshot](/anw9cOL.png)](https://config.qmk.fm/) The [QMK Configurator](https://config.qmk.fm) is an online graphical user interface that generates QMK Firmware `.hex` or `.bin` files. diff --git a/docs/newbs_external_userspace.md b/docs/newbs_external_userspace.md index fdc998c37a..9f818f46f9 100644 --- a/docs/newbs_external_userspace.md +++ b/docs/newbs_external_userspace.md @@ -32,11 +32,11 @@ Building locally has a much shorter turnaround time than waiting for GitHub Acti A basic skeleton External Userspace repository can be found [here](https://github.com/qmk/qmk_userspace). If you wish to keep your keymaps on GitHub (strongly recommended!), you can fork the repository and use it as a base: -![Userspace Fork](https://i.imgur.com/hcegguh.png) +![Userspace Fork](/hcegguh.png) Going ahead with your fork will copy it to your account, at which point you can clone it to your local machine and begin adding your keymaps: -![Userspace Clone](https://i.imgur.com/CWYmsk8.png) +![Userspace Clone](/CWYmsk8.png) ```sh cd $HOME @@ -99,8 +99,8 @@ All firmware builds you've added to the External Userspace build targets will be GitHub Actions can be used to automatically build your keymaps whenever you push changes to your External Userspace repository. If you have set up your list of build targets, this is as simple as enabling workflows in the GitHub repository settings: -![Repo Settings](https://i.imgur.com/EVkxOt1.png) +![Repo Settings](/EVkxOt1.png) Any push will result in compilation of all configured builds, and once completed a new release containing the newly-minted firmware files will be created on GitHub, which you can subsequently download and flash to your keyboard: -![Releases](https://i.imgur.com/zmwOL5P.png) +![Releases](/zmwOL5P.png) diff --git a/docs/other_eclipse.md b/docs/other_eclipse.md index 5a0228efce..1745f08932 100644 --- a/docs/other_eclipse.md +++ b/docs/other_eclipse.md @@ -66,7 +66,7 @@ Once both plugins are installed, restart Eclipse as prompted. * Select the _AVR-GCC Toolchain_; * Keep the rest as-is and click Finish - ![Importing QMK in Eclipse](https://i.imgur.com/oHYR1yW.png) + ![Importing QMK in Eclipse](/oHYR1yW.png) 3. The project will now be loaded and indexed. Its files can be browsed easily through the _Project Explorer_ on the left. diff --git a/docs/other_vscode.md b/docs/other_vscode.md index 0b39746a6e..3bd7e3f44f 100644 --- a/docs/other_vscode.md +++ b/docs/other_vscode.md @@ -174,7 +174,7 @@ You'll need to perform some modifications to the file above in order to target y * `"armToolchainPath"`: _[Optional]_ The path to the ARM toolchain installation location on Windows -- under normal circumstances Linux/macOS will auto-detect this correctly and will not need to be specified. ::: warning -Windows builds of QMK Firmware are generally compiled using QMK MSYS, and the path to gdb's location (`C:\\QMK_MSYS\\mingw64\\bin`) needs to be specified under `armToolchainPath` for it to be detected. You may also need to change the GDB path to point at `C:\\QMK_MSYS\\mingw64\\bin\\gdb-multiarch.exe` in the VSCode Cortex-Debug user settings: ![VSCode Settings](https://i.imgur.com/EGrPM1L.png) +Windows builds of QMK Firmware are generally compiled using QMK MSYS, and the path to gdb's location (`C:\\QMK_MSYS\\mingw64\\bin`) needs to be specified under `armToolchainPath` for it to be detected. You may also need to change the GDB path to point at `C:\\QMK_MSYS\\mingw64\\bin\\gdb-multiarch.exe` in the VSCode Cortex-Debug user settings: ![VSCode Settings](/EGrPM1L.png) ::: The following modifications must be made to the keyboard's `rules.mk` file to enable debug information and disable optimisations -- this will ensure breakpoints and variable viewing works correctly: diff --git a/docs/platformdev_blackpill_f4x1.md b/docs/platformdev_blackpill_f4x1.md index a8d21c255c..e9af534e58 100644 --- a/docs/platformdev_blackpill_f4x1.md +++ b/docs/platformdev_blackpill_f4x1.md @@ -7,7 +7,7 @@ The WeAct Blackpill is a popular choice for handwired boards, as it offers a pow * [WeAct GitHub for F4x1 Blackpill](https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1) * Unfortunately, due to supply issues official WeAct F411 based blackpills may not be available. -![Blackpill F411](https://i.imgur.com/nCgeolTh.png) +![Blackpill F411](/nCgeolTh.png) ## Pin Usage Limitations diff --git a/docs/platformdev_proton_c.md b/docs/platformdev_proton_c.md index 3afec893fa..16eeb7b28a 100644 --- a/docs/platformdev_proton_c.md +++ b/docs/platformdev_proton_c.md @@ -2,7 +2,7 @@ The Proton C is an Arm STM32F303xC based drop-in replacement for the Pro Micro. -Proton C +Proton C #### Features diff --git a/docs/platformdev_rp2040.md b/docs/platformdev_rp2040.md index 1269ffeeb5..346cae58dc 100644 --- a/docs/platformdev_rp2040.md +++ b/docs/platformdev_rp2040.md @@ -17,8 +17,8 @@ The following table shows the current driver status for peripherals on RP2040 MC ## GPIO -Raspberry Pi Pico pinout -Sparkfun RP2040 Pro Micro pinout +Raspberry Pi Pico pinout +Sparkfun RP2040 Pro Micro pinout ::: warning The GPIO pins of the RP2040 are not 5V tolerant! diff --git a/docs/public/0GNIYY0.jpg b/docs/public/0GNIYY0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccf2f5dcbedf4853d34ed86762c0863342f981ef GIT binary patch literal 97616 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 literal 0 HcmV?d00001 diff --git a/docs/public/1TPAhrs.jpg b/docs/public/1TPAhrs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1629c8f3a5c6f4f635145213bf808d0e33b6a7a6 GIT binary patch literal 117667 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 w$;`8Co75Pr z1-7_Lq%`x+%Ut-DPikJqnQNw#Hgxypak=|2mMxjH^J3&(#~}W%Vcn$*;(2RNG@f8d zo@936^D?h$lV$5bm9bz!=l0H(CSmzz46>2e+7_-!j`dq8J>mGe$w`JKX*2n4?%wM! zQh6e}F1>eUdA-W5_r@u!+0XvFr7+Ki`RsLuHQS=z?74cvw5gXPj^VOE+t!6w!nSQ^ z;9q3-Txgr&&odXEE$dcY9O&~cJJfXARl6;QQ|~U?S~;hu_d07n*Rs=3rQP;DTphtG zwYFYqQ@!r0i)l6j`N$b(tTrp3MNx6$-&;3>2 zYrfY^^WofYZroRTTkhMgK6!~lmsjxqO~Xe8PiB4K*rV;vC7~vVC@o zKARPo|5x;;?4%Pq(>&i^{WW>^$`@N-XCz;>=J^!2;qiwB7X+Bqx~fDQw=a3=`Z}4{ zR%1g(Xc=Qdv&wCbU#GVmwci`do+@}U>+U3x_@#CkIp?+*ox2;cE7K`NY~`ADn>WP= zy*|gb*QC<_=lz#&9)h~OmZ^sr{c^)=>6c{}CWVZ+v2v+gmi z+!UQ_bgSFfp^W)pRQMEbO{|sL)y!JeHKJ8}z*1IKgPYZW{l3r-qBXF1VqaXXaTZdH>e(t~RI*;RQ zp7c3e(McD|qcTFHvIJJ1=M_6Y`=WetW?rJ|-U!VY&m+rYGeBvNYKtlZz@fT0zG6TUYzPY%6PoraXZoYuVM(LtFi-bxVpjn+H2CRG#%@r=ExTy9Az7cezV+ukP9e+On`_+N-?RHtdIQ~iV zc+}f+#TShepLHaxd=_}1`E20YgK>$cP5qrFPr6p7AFNm$mTlU!=aGbUV0E0lucWNS zXUB;R{#hrx)pTZTO2VMjIvE!4(lORn*u)J-ii;KYUY!uh8qVli398Ri#2gX5@uHXs z<#%pu4EJ58_2<;a9Tugmv6IqF?{dbieOq4W;H?}{?Pax6>Q{-@mp0u-@T4tnkMA#< z>@V$~8NP7hdf9f@o4JBp?=B5V>1&jJUF}@D_139w>BoCleaYkFS{h__QvZZNZp`&R zdR$+Y&9x55zNu3B?Bk2=?{eajvtXX^D;0=BhN?2Y>OIzPD)6LFpU(vA|xrgNvtT6Dz{ zSDP%%II+y#nEB?)6YH%uZE-Y7XF8)bSLI{VU(bT|%C0 zC`q;No>{n3t68CIW!TP_-QVq14wcW|6x#g!KSQcJgL_uzhle7&^|ChKjLJ~4_AoMZ zYq@T@=(De*i z81?6zo7?NA?XAJ8pL&DC`lWiLKuyuI+#1-X^yYv-;j z?)B8-&^gkfo~b(5Wcyz8y>2(6z!a6(;sUD>JK6?b2(lDpWIxwgR7@>yX)_0%r~_qe9K57{HAW4?NR(TjVl z_O;%aU-&mr$g}4Anrqo6(%yYe&rD4H-*Y|t9JqUPXi>1ko2lY2!|#e*I-Zuxwsz~{ zuCBDBCV^+}Mt|+u-LLxOQ<32gZTF&%IzjN*?#p$P+0Keyo5DIP*ZcKct(mD?qe{;j zPEU2Ym|7jFw%nX+nY_lWtrJbIhaGeXUBa`~?_by1JN2u!MBY8p7aS`WFn4#~bmps! z-k@hibR-)yy=ANj$t0J#=pTEhuaoZ6M z_9IK%!tNO5vaM!6|L>O0wlb+*UmxFCGkNZrE&IM(dXs$% zv9!!uHc8{L^>sGQ4TnXguDW@PG_O9Ud2M%c%eE#BD^pMjykgM;pVDcMHKVpX4!L&g z9S7seY}==YVoVRCqOuo^3@a~GiCVeJiGOfEK zDp$Gu>RW9SY7&yRZtIV-MeMecb46Zkoft4HsMYRA_R@(@-xXbLYujOAxqMOUZJjMH zS=ZIfuCEf|=?sLeA>hZ5q+KMO#0$-DO3 zWP*O>*+*MA;%1$Tj&aE1y)&`xvy7$a%1Itkha0PleKsGtWuSDF`>bi;@71b27cZ{s zf3M1g3TIZ^hpRRp!Q`FKGnJbcu0#6F=v^LUuy71yQ zy>iP1*S0fgY!CBRk*a%Uuu{7)Pxt7K?P8DaM0dlO;eF1P`A4IYmEG=2Y7~r7OsD~FtdGsV= z40a^KxoVw~UQc$dMRw*cu#3Ca<#FuHYuzRG0$gQ7s0na(-0wM6pcR~TJuxOpP6wJ7 zC%!E&yx4W4I`$5z#NK~|3Y4YEAUGE_Z0X$AfF%R&R__E__qg3~J zMPbXL7z?r;B`&&VZrJ-a_rvvLu>m2|+Rd*S&Q@R4`Egs{#D?8leNwAi`@~~-*rs=_ zo%O|-_xhIQ+v;rec6`;@*2zEP*z2BzQvI?;uZ{KYfp<(^W|pqYj4d?mf)~xMbLT!ayO=JuMQYJ3=V4(TYCT*axGn?u%d&Fejuw(lZ9Nz z;wLZC&9CbYKd~n4cQnhkv`udh{+;ov`G#ZW5&1;W1cz_Q46}@NTfQyO+59R#=4Ght zw5yrdwqBf`*DyGDedc$lgk)3|EcvaZTshcLl>PZe>~;7`xLdj z$4eL31~6o+*YWhE1-}j3Tz6HizNN(Vl7;EwnZ9bDZRSg^wg2q@TZ>nuU_~g;uBt67 z*1VmtPm?v{ofoJ4j&GN}XT(I^jo9m#$dPKg+2+meh}3uy{%EYYPOwH3`Yx2m55bD7Cshwu68uDbi73m!HHeQjx%3{>`UiP-Mr`C)ydvV&2Hu;NNx0ZoO!a~)Wa#Pw{+)uaXv`B z?ZUQp<@ptH`KmKF9DDmcZf$VX4Ks&j*$p+}3_sQ}evDy$w1fR<0e{y6dC>!Q+Av|) zS*yb525=ZHYe;?Jk;a|5{+-_q`&qfqq_-Zez7o2t`tl+^Yu{A|zxvs8Wq)3kogcPP zEN-bt|60AGXTd6bYu|bH?r&}@@$35*bNOye^t;c#^)bTA`z}|6eOHN&`nKSEN$3|v zhQ#-xCgJ7=e(AcV+`_>jatEtfKC|@J?wREKUe3!xUZ5a5Z%%QLnc1~7kHa?1y?W42yQwCe<;ObCk1@iJcBmgM z@b5}}7Rzhu(C5l#XLOw>>f`LtgDOFM>+&?Bb@TbBn7zn$WfHr^y~uicIIqN;?-DW` zr4K_Cr#*g@_m)lj+#B~`!+SDwdV;-W3g?_j7P*ns)ytLbtkU)S9P6VcEVn-$h(4d_ zqO7q@a~g7{6|ie}Jze#B$-3O|VAK2(|2&0OhZl2iIT_#LoRoZi(N2Zs&KF~Q z-&9xaP&=DBWzTlCp2=%XM09q$Bu|_nl04;p!rfP}?e7ct?;JM@=UFHCF-G~(4)>!4 z{ap{`MGx6&x7395{8%R$W3(f+;MBvZTMmhOJ(w?w&FdJ#+a4+IEwScz3c0mq-o@n^ zT8w86&*YXBMlTg$T<8!O@4i*g=d!yAmq|!?@jHhtI<8(fGgsvnt<&atz3j#DNhQ7( z*7Fx-UuA2%SA=0SB(O1r8>+dpr}e=ddsw?IoCoUm^IZ?89@frmVXb(w-EMX9D?-Go z?{^-9*MNRWdaxndg|(60?eML4j~7?&)2_(Ougb6AUX)*SnEk7Z%%KyjLg;oI&VFK!n{-wTa$l%1t z_f($HKd#4C9+RAxQ1EcawbrQH8JPvyjv^+3QEP&1*Y1=0ae5U;&@Gw!QO9y-Jy}$f zyLd^0Ua(}`!=%>h&Qh5b>wgC%%*flj)OK2*iQm<|1#|x?25vfb>BgJiK~j^0FMC&C zuD)Dz?ZS;#L)NWPhjWvAGp==f)|_?rSMpn#*>@Lt^*OxAZYy0hWnysPf=lyfJzdau zOXG-w$z9hcZ@z{{6u#(CE*E9H>K)y|_2Ze5Zw8-QXJ5~!BP9WGwf=?|O%Hrp#CvQN z+o4xBq7}2uwyer_zFoDlS8~qeb+fFdgp~3YT)IBf@4BjTOI!1#U6s351O!SgZ~J<| zF66gr(`(Zj&$+$UOnXIl_`GlY*dVawxY?R5+!ybz)5v~$ZO7y2E#C_MoSgegUj3$Q zk*8txKe4sjBxTQ@vzVf?*;k=$cA#)mN^n!;%C*|A&&$|P3O}~!zRDN%GIEQOetzPj zu7dkfADyyqEi>Bt=qUHPHfHamVW)V&4VO(9kGEczo3Hcm(%xgc-5J(=i1ZXVce!%v zs!b7#3iIb!^(jB}E1kGZ^Rf7>4}}L^jkk9k-|rkL_Gj4($At^#r7R3%c-W!nk=fPN ze3$EX?SiMXgpcWYT~BnCmTs9eOKs~K(Pv(tXE>y6eB9LM-%G}rfdr?Jg#1#decJzS2HdX5G4bT;-u`)`|;$GE-$VW)@y44rx8Nx~sgxaZ>*o<$};VtLB{K zyLjB;XZV!tz3Z*i{!FRY0LRpe_WB+GzT6KM>yTR@RwVw-;mtJ}DxhXsM zeV4U`sZRgBum&SRP;FfJZ`DQN?KchgEvztt1D69Xh)(@8Tj{W>X=Rs& zzdaU90vaNnwE3KLSspOqlEYW0bTU=Y{+oo~1Eq!Hxw>JN5*N*&f-9y`Dw#zi^ zaymR|;T9F}C%3u(u#?hklIsI_~SNubaLetbz$FIw;&)wLtXLLm&4A z?^|#7tyc9uXZzIsHSgoDlB!Rc=T<#wu?gF;cBN)XLgPN8=(j;uU-e3#En0DGYQVIv zgoW%&LsS>dPzzrgV(w}XSoAz#%^8XCS=FaEWF==5YQ)vaX3Z@ZoV4_!(-M{oD_(c+ zTD9e3uFa&5d|S))5m^t$Xl|oz_)un?fcI@j35SaJ$ZX z-6pNJ8ri{cAM__|d$~?S@We8)c6Xb!H5E_R?K&;9{Lxy0ZMSY+yPJEu$9LsRk9cgp>3VxHZnYH);Gz2knO+qu`)N_+>;uj)H5EnB*%tMj7AVW+J*$!Q6vR_;1* zBl(S+MpEwKGtZiJ1sh8OV#8*}+?}cEx+}2HZIquzl)lfJFKnO%Fc=KZ*PzLY<* z-{qRY&ZCD#R~N6FV7bV^w|efLqKIGo?;Qem%yYz%B%wYiJyV=LHB7th=?)~{>mJvW zo{sSU#ze-DC)>U5YD0n)OohFS6x|i}GJ0v=)WGHPt%XuMdOt=#cG!~{vn6(qe#tk% z@)f)P?yd%{1)dNp{i-D};pzlG!LEx&;ZXIFs`?T<y&pfyE&6KO2nK_#b&!nBb9-#5$n#Xsq1CML32D{6=Z#&AlD=#4? zu(s*4O)&q_fIy=zf5}}RZ!O&tJ@31~FOKFF5;K!KKiQqv){iY*dloe49#(BTcj4tT zzSm1k#Nx9Lf|)fXPNFnj%J z$(%H|JEfKyZ}p~y?|m$NZpB$&kzzY(5w+Ld#+7c~tcxm^Nrrx9-z%)K^s-mxc z^qV_b?v8xvyP?Tn)NJoQQrGR@v6>B7rW^l;?ZA9=(i9L&$pU*GLTf7XkbZxax!9B5G*NpC$6t8Nj3}BCB-Zr1# z?%xrP)3+@7o_Ls5;)JDvmtEVt(96A zE>37Y3|WvAY4WX$}g>Dc|$|S z=tb8ii+Amhms$Njv#ewGnZ0FK)Y>{6mPsrZxB9d0=+TJ1ic4(Q=!ra;W14?@(XJo! zc&oHGy8KpWgt$cq?-q%c*6Klo7kFL%TU7NLJON7!jS3UiHovKBrZ5uyY{C;n# zoL*4f{d!HQ@v6_6I+M%8oV)qvSDkFVyKB927l*wK=z1IWdh+9@Ge3QL zb*cJDAQs0?Vvlp8m}|8=+hXCTB|#}HK=rd{}tn@A+! zUbQEj&!6@17*_GBJ+kw5EB^`<+M59WD3*sg*kA-1QySEx#Cs==EJ z(J@Y{CNE5%mB`A@n;rN*V!^u4d%KQL2xVJXm+@Ww`!AvLHO0~EKM;vRj+C!~SKBF| zx*JU7O`RCMG$qvQ*(PlzOti}6pI2YCW3+x|sMcE3P_?eLrra5q_8rpuD!(1l8<#z? zw>hUa)a0~(XZSSNQrVDKy>~AJTnOXdec`xw^)>C!j)B%Y-S4bCDfd+2X{>p~y5_jm zkg4AK?HUV|rX0zhAsRCI)Y9b(v%c1a>b=Wa`KkNB&+vbSUwkXKOU|$izR7DpsiJ}< z#`R-&U%tzsV#WFwC%;5>oI7yzX>6WE!a^hO`s^F7_ZItZi0D0j>C2=V#oSxE`ja0U zC3VMU)qJZ;tTzZ)uN*j_R%Y?XLDcWBP&!mXmI!3;pvS z9d=Keoszs{*&36ObzfcG9&NZJESQ}c)a*C?>VgL|qz>?hcKw;s@->2Y@zsFkU)P${ zO?k++$fC{l(30gh-mXpC^!D4{nF2eEy)xs&POVrzZTj7q-GAqR=WvrY2A@m)-oHyU zS8TS+rW)55F-X!VZk*oTw_H_r z>8DfQ_as+dm0Y>FFa2h4mknYnAa4>qSRXXw(J_)z)mh1J@nlVna$D3)GbVY)hW-g)hn%&mTw ztFk0r{`xWA**oF#PxV)sRqsu1yzN_TZTUhlXnmRI2bUOWp(jseKiOp>{eYpDMze4UL1@TzEb+X`5?S=ZPr!mh$6pgt;!1u@v^s8JG^vxaN}ggv+n;4 z7rE53`Tz^;8zq&j>K&_1{VRo3*JkKB1OHHpAEP80QYU{4*%N-8ZoNOGE zmdL!0m0xP*8C%*sYw{_fEgP3^SIYcRwbCwV&3}f~{~0EJD*&zY+j@?7YP62;)UPLI zsYU9BmAO}LUnLuIJ@Vmo`{3PCiaZ~-olajHyEQ0u;bKMZ_KT6f`@aU8LK+sSvv*xd zoqHw!tNSUljipzX==^Z&j{kH>W3_VMi#jXkRLK-~)o9zTf6oOS%w&#~H#~on*Zk!s zr;=IQV|IJ3UdMh=%vZYi&fKe3mA6XU6)&28Gr?J>I=4OT(wT!N4+iw;S-BR0$KkdRV zT(J6<<(;}++W7-R%7IPVN(~IpT3Is!3~xS}E+ru1bdh<%rY-lBjlS-B&${bB1F@JT z;@Ga`8yVIavlVOG>Xn81ge>TYocV!W-8q{rtNAs0aDzn2R6)PUCH~RWWG1W9v9nLUEB>|dhRE&QMS|Q?r?=;aEW4E_>$mFd)3bKgHhfb~T)Nz=_h4q)mYZkF z+5Tq7giPyZHr?pm{b;S>tF2|#!ix$I{XXa69`t-p+`FY#*{(h3uE~eoe!zHZmh6+~ z48>Ll*1HNXtv@_z*0mh|CB3}6*GMRCi27uh@8WKfRCV<<+up_Mrl*r+ovn5}+B&VQ zQ)$`Dko?JatGC|JRNW$VTCH~8iSXZ-MR$okh%sAxVAI8X*2P@9b4)_E=pNY4bce$} ze2X}b!ecS*HgVp9Lkh;svkn<-XL{Irm^&rd<(w`{n<(?jPHxsMVlQG0wu`+gJ=3rM z=)6YV{9XQ^MALrO_xxG-tL~-!iO|_k{~3R3fBAdKe+I>{{OLbBFFSibXzbz>j@)>> z)IV+O2D6IIyC+`U~n)2_u_boRii*i7x_TV1_p&jOUTmUVK+*UY^XI`5(| zch0orfY0wmc?@lgJnxo${O%s=oUvy9&sle}*6I{*y%c#eJN9FVTXxOSZ<8Jeq%6H^ zJX8CO$==dq+XJ`!^t+(-c%$eqHrBM%w(M`!Zl@RTjb6TLV|(0^ulu_S+x}fY^6EbW z$Npzosp=b7lUD?ja$JAQC&ymh#Aqtmb5 zPc>}UZVp&^KXvEow4Vu4_d|oJg1_slC)vCEKlGlQA$P8|c9Q(9b%%~^+{?7nnECdF)gKSsKD@5`{pM}o zlXyBCdu5vB3WekSR);e)OJArjifL@@J=ZAaap9SqYu1bd%0DW#kDWQXy3cIuT!!%8 zx%(&WvF5U2y9&UYMtM)y?eRr@`WS(O8#leHT+}we}q9-fRTZTk(rT$ ziJ1`u7#J8C1QiV(0}}-b8z(N@_~E0$MTLV89TEZx8vcWBCS+t_v{(Gk@Wo|~!=v0z z??ZQ@PMa6(F+LL}xmqeZqSWKaL7$(#!QKm`zqAIVc1L6gTv>BmwzJss`IdlkpLv`O zUmJg3%eYcI@jt`eKl;MYch0w7qnn}bW+2Sa7`EoQo)EW)yrf63)|N*xy3)Qs5`?#Y zFnYXCa>qS}?|u*KxwHQ>R8?^VGqPM#-@{-2?;j5$y*y!FM3v*N$>!a7Rq=fBa^ z{?G70Mf%8B7Vp51^K0#H)qeT?^84lY%WwMcn4il3W%&(fU(pPOTk8MreOr;E-ILQL zbwr0@X2cP$M~tCbcFGzpxl?18UA%MV&Z^95)*gu_TNG9q3OC*Vcj@WTTiJreyi;FF zK6g87l`nc|%MzX&vWrhgbi2rGx}$$xamk^HvC_W&S+bv=o}T`nVZ+X1|7^*wdy3s5 z1}_Z07;^0FjVSL}ePJf&5xx5^mR2s3T#KGHZ|iuwcYn>7*w)k2^*7XiwKaF~<2Y!$ z@xi(HQ>FWY*M6FLb?vu}!O?ek4P??I%&tbR2sFPpRqe&8H+@>FUp8>uc6v9#BoRYB% z5>|(H#~wPnPWkd0iz$zkCNpl2yU26Lt0OTsx1YoN)wE58HxzY_C`TK6E}HFqswZ;G zF>erw8;EQ^5Ub;(8MMmm!kpJPFYP_{N9w3t=xVX}U!gB29NIhS{k6Nw zLRY!3E&KK8(kast&b(RX)-sK^5`5<-PcJUxxpT>E%C?C)x|YfZvIU(PJGOXrHt!2@ zX4`b?#cqjJwkBTd#7YKpZ$%1$xIR26Bo7yJPA~A>($)L$L?Q2)%mgi+y%)EN zOf8)EgX3A1-?>hmhUbE{&W%T2s4h!#vXXnr9HJw5?_)}~oL!pz-@mof|1%t!x9?!@ z$44{T&amzci&*E*v+8L?#-?58CT$LhJfF{@_*>*sR+(Co*;jQdDA;eH}l4Q7Pjvy?@2k_rC9aUw!ZUR?|DDotfAC!UNaZH?sdp>}#7Edww?>-02U8j_NY` zg_tKX7>#1ieeHMGIp7x(1GXEb>zMf^bWP$GpR60&n_it+?zV0r%hkxk5qG1l{Qfi4TV6V| z?R{@VUg6q;4Axt*zL{35n(7>PF8lUsWns>xxG8Iw8S9rGIkqe3S*)tVRbhi&8w5-@ z9Et9AG=HbpXwth*E%EGrn@OH3lRU1O_AN2AIQdlj!}LE9f2qP8cXdyW}&d<=$$?foj|ew3_)AkJj|pIytrR0Iy*UF;q{fbUkG1L<8XDF zJ3%OPldJ-(gUs3HxZ{t${rh}rL4bm`sHuLi(9F1^v8T*X{3OvzxnY#C#C zUw($PS&P^cPT5UI61mw~%)d0IoP6H@^hN#0SKrlF{q~RTOf`5F6nNiw$Fezef`RLQasb{g*-P|v9t4P7W3Q0L#8uy5ZbE()ex&a}Sa?&


9_Qgo_lU%q;zFzQOS&GfW#qb)FB~8*S;pHJ z7=2ntHJQ`AH8OU=o;`kZy^OibwV0mV&{aLWb>-fY1NEjy45IFTnW8N2mKwCFdu7>< z6P3zFOZVJ0QLH_@Jem8@UI)WVZ>ESZ*`vKP{mB>2S9O<_W=q+q$?D1kt$n(k>qc<3 z6XUiGXO$&*vchB)=1J8TnqPC}U$Fj>zw>{F{_uxuzQ$+1Huk^x-0Izx{|pH?=5(HY z#Be}gEWdaE{Hu1C@BL>8mge5<{B%}lwnPS-#Tp%pd*TU)=fT)8?ngdtY_7@6<-S&#m;GjyT*z&!+5BzZ+Q05I z*c+LbU5b4wK0Qoxn(W(Ij{?P}M;^?NQJVFi!Jtb1PdaDPclTGz`8Z0Rn}!?PRvX%_ zn6hLl|D>`elViS20RikqwMn%`wMMl`AjrGmoz_C8E51U;eycy3mkIg_1Y)o^l+jzL6Jxu*YL(fWcig z%`MYxHn&=MPv0l&6YrIgsRi@Y9wi-p5bg5S zBgW(1frENn=XNqQmWI3$JX3n|Z=<@aEK5n?MR!-x1CzK6|1(IWaa5Yy9f!iBcHiy3 z+g-PN4yM1`J-2&qQn>7U(1TacO7EZf&+wn&{rh+S-rU$6**?|l`tvg`F6Z98d&i)i zY;_~1`gvc+Y;(Sxz||6QxyphDdsPENl=2MN+oI;a`r1<>+MHRvU3G!?tZlcB^Pb+g zX1Cgg(o=<}!lp}nW6ii|XwP?Sy9oEJo$hkgjbdCu&k}dFtvwMpVLoH5u}0Lwz-vi~ zVTWQaS|wSZ6{}g}{G{Q{jy*>_1i!j;mAkldUtDo`%7r;btyB4wH*B27dT83Z&C8$7 zwKsYBbGiRntGdj~pZ(^~D*1C6P0&4i#>LXk)dKIBt^}{vop#z-{Skw9_eQN{J6_c6 ze|+uTfuuik6kB(OeVO`1WGkcFY_=BEoj%-W#g`f$p0`)HwiUym0t-Px3C?DoZ7z%%CMJVEb+ zyi0=*R|K7XX65uK^Ti5_W779#2>43xx;^W#x@+7-QOVtP9Lm|%7H^F29=#Ir{M(fU za~i(R-dxzX@|c!1&#iD`eOt%v}YXDU5k!l%YWhw!xXn4Mgl z`RR}4tGX9+WB&@T;fjvF_GL$;+rp)PtG#R{o(Q zW#hV?E4sGH-u};E-}m^RZQdL1ucvF&roAiZUc->w!EfL_L3?6*_aX+SZR!Gd|J>XA z);8MW-X-p;DK<%qp2kmB$z)eHz0ol14DXF--CgsFTqibbE}GlBH-SU9SK{s3SGzT2 zEiCzdewtJEE98qu{lyZACFi-Oeo+f^P(`yUNm{Wt_9F2HY}UksnlD^yt8qT$5W?r__sH@08iSV)mw}JhtQ(t}nB_LURM% zxz0^xJ-KsP*0$zXSJbXbZIC+@z@?;iRm9`ganG!5uS}OCeld5{cCr|D2WYZIOsVpc z2t1U=-IbAGa*UO)?eaG5QWhDnIH?nF#d{aA&))3B8Tw|%tW8HJt`+>xpwc6r|E^L- zugCU$GDE}c_Q<2LMW2iJo#g&teC6-O4b9VgoqIMqU28pck7@VBU-5UAwCERpzGrae z;O5X9!ViBQH;wo%{@3Z=hM4?6`>gwaeBHglY{kP54ICSEh4dmGcYMxuxO+q^c8a-g zNT`$imWx+DKmYmXUC-AIh6^9sC9_qApHX+y$TuvJ-27(l^B&%{Nhp*TYYV365-wJ(WkrfB`*VxTmETmYez|yd@+FLI!XWA~gpcy$2 zwdXvaefpUR?+L~ymjf1R1eO>o$}06Gby#RWC`L z`!Q)(f985gn-iZ*XP4)y?Q~wg@z0lwuj*cuUEQ_3U*_~d`P%|lbS*_*82pmI$aF{c--&k9GEs1;VwtH*qMq#^0;i_wk`wb8lVu zj~%ZrZ@(vZ{L$?C!ceyLUmWBGUh9ASd-_j((SHW{JNu7+hwuuLxAbTQrnR~8uHAY$ zz4`eryPZc(w!Tl?Dq1}EI$w$Hg+PyQi7f|b#}~65-so;(Zmh;N00{wkF<1C&b|I_5JC?i8{A)11!!I&MB&s!g+RrWL z7|mJ_&3d$>!dGfUPRZn$9&5y(# z3~)97*tWiA^|oV+t=bki|D1JgLyHpo9zEN=+j9Cn7#w`HeHbRs`0PEG^$7a`^$>?^ z6_Z)3Kf{t={~0dT=D)Pt|7CvsFaPzJa`i8@*b-)L6Ff9)=lmyM=S%)Z zN0z_mW1zm%kCNB5p80FKP`1dNzp;2Kd#ToM+b{PM+M}o4JvMQAkix%5yPI$1{=Jwu zWzmjYk(g~!;*OiHL|4SlSh#6{g=4g!&9uwmLSIZX*DRf@G_Cw}lUlmC073r@oPR7!gP;g*W-vl;f1_h znkIhDhc|EYUpl>8k#&vBzXS#b24*wXgRUi<*ODz0j9_2H(#_xv&s5-Qx(8oRS4q*4!+cdwg#J73#AY}31k9#fb0 z-%;vZ{;ghr(zB}kq~f(L4Z0lfToa|5XC^3~I{jhKs_tOf=MTQ^`+P|?Tj;1`-Kg^XjEq7Wt z*}Zd?PF5jv;)BwDdr{MsGpoF`lbtgZOk+)tMDrfK_^$ifnFO9qKi#-=axb1))P3{x z4DM{{J;G~qir)pT)w^`7L8;=<_0xV66fd$)kV~{$%kG*i)gU0py&a^wR6~R)yr8t?q63{`1Qofl3BdhTONq@vVXYrpW%^r$~ocU ze}Vh3mnVG|=N)iar)eK}KKSQv{mPefo7b&7 z-Wi;=9F2f{JL=Ju9M}auRfY4Oy6bY)7Na>l3>3qO^dO6 zN!IH>RlCv_Gv5*Yrz~L3oRE5P(&np2lyZN6NPOMVX{9o8_a(-iA9&w+zu0xv^uXJH zr+UlcG@h|_ZmZeUDD^n7eWB6!r3Fu3cj)~4cK9^MA7Sei`wx5nXXw;=HP1Lw`(Sr< zZ|RTJe4jo4@4Vr-Q#YZR9`l%v5QsG*jTp+DB^3MDK0?Q^!2><>uI&(rNK? zEGC_leyPpuq3YdXJ?ZYQJ~g}GM-_=?OvaL1UN#<|{`p(n=gVrJW2Jl4jZ44CxM%8K z+ZfyAW~Z~dc~$7LjTO~fSe!KWrahX$x3ah(%hAi5wcBauM@80!s|$)BR!l9{2##F7 z{B^hppJcT6YtiH-D{gFCw5;#Y8tVmI%RRl!V)lrhdlA0kYHmQdTW`hbh^<-EjAAs> zN`oVlPq(hFFtF=%)H0Z@eCGb@V^0ezqYrTKo$*odxRQVSlJM-*)j9$4VN&%0QTnrk z9`K%5+&t|uD(d~upx!w|Il3#UawrvSp6@5uP^S0@<#}64BC+xpC zYx0U3DW}&}t*43%uBRIm9FtJYI{$Fte}=<8rfbdDEq>zgOrpqr&kT;WuM)Pcjj23z z^UCz!{(GFXMfj5Tq&hP6w)ZT(!2I{%<5>$I_-{N9fjbYVDzmq+xd+PpPJHDj9G6v4 zC>_1P`t4D@cWbg9ahi3!E;-2fnjt-g*K3w}`p*dr42-#XqRgCIEI#-MCj;74p2@a*KJA^#|FzKIhMfyU&Pyb?8O;Del91asmt-2lytRoAtw5H)E~n zqAg)v7o(K@%gqB~QhYVK3V$h8&eU+#vvK?MEZKbvgUpSkO1g3rIFq^)8NNH;$qMVq zYudD@J+bC#_Pw(~9d#;;o+joC@3;Otnf*Tlud=>gtjOOp_S&avUjLeJ^>6vH{VPAO ze^rzHYrfRK<>w%r*I>@E{VP9$W!gn|Fmqpu$V^*TvM+e)r#H?&nB2no+E10(1uy(G zmw(EOn&r+Xj-OZ96IP+w!~dyXSY0{%6?pduRRk>HirjF-c#hgDgF- zHvbTCWPiM)9`O^J7mybO>Sa*lXlD!AmRnC}}D1KYC)mVF0l-Y&XH>?=v zUhb-Q{$upJaO1y8(c-rY+C@Oo);L6m- z9mg*3N}Qa%viI3Ct6-UrFQ18>YScSxQqh=DW~Ly1r<*PF2;+}<>s>YLCNwrqezRWp z@ytW@4KMe2sd4X1W}IK(9%9GwlxzFvD*OKoLeee|dQ9_QaGVj@trb6&t912xk1JQE z+stf!dHuZp`*Zs3OTO5@OT6ov*`>R4#jKn0&3|f@?^Vg{E6LFAS7Y$IZ}?dI4R7I- zX?5o++`q1gf7`CAuraG|$|=9=PFAN_8Ku_M&)@ug-sBA~T-xW7n?!OZ^PTW{ZE*Fr zY;v5Ut8MHzH}Okr1Ma6pa2gjck*E_h6%9SgFE)px$H#>KMPtTpgY0|%8J@(6uI5$z zSk(5dy+SrA{hsZl9bZm=pBhoBu;;4rnUb2e+g^ReFX~w=e0QEl&E5QmU+Vv<$nALHNIeeL}&3=%F+d{Uo`5Wcl7g~6Fm+m*W2&KJ!2O@nxesGR_cMBM8T=uiOb*6Mekbde}-d>-S znF2BAvuvu1J_hWxo33XfwctHhhxco}rOxZpY<6cJDO$L!TH)#|FY#-MZx@`+TswP3 zN#e52IrSb>r@mi2-(%6SreBIL;@va(x`Ow{x9qF;Ow2i=m76B3Ah?Dr%Qd$@Qp( zFL_zh+-*h gLwI3>$H4>DnVRuN|K_{~|BY{B!J1aJMi{av;B`!#N+jak)@A~ijqW=u(7wb2_*njiOMecPQQlER}_%1*2?}6!l z|9kfG-?cPK|1$)py)2M_^Y@6{rkQuG_CD18D4QBBH~&>l-RH;O=gaSTUswJ7_q;B1-YXUW98k{L0}$s!(bw9hysoMB+f44X#m0SQ zGUc_H^Tajgwekb|;wSd?#|4hqxqrXOKk@H3=O^{G6MpjFS^nbSk}W2ycILmBA8WTO z>E8lN4TT)Fnpbau!+%{?EJ^VTej)tu^N{W|c2)%oN@X4~$X>u;1P(dC=Hu{C+7=D{?M z%6bWszwYnQ9#q%Nm>CRKa;*PqSv$o0=XT4qbNzrUKbE53DiRGVr z4y=ugdbYHsTbG|L`M68uLyrAB`z1tLlk#P1u3XOAH&J~4l{hAqmCI~GoGvSy?(REv zBWA7-it7j?y3zd=G?sa zPww^oe`?h~dS1F*{cRAjhiPHT+K;i>Gtznz`6E=-to;SFPRC|W_IQ#MrN{3Y9-*{; zY6Sa^tmUH#56I$`Ue&(bCQj5hdhJ9@;Na$Tt_*zWBb!YhRhC9pNWk;Nd-S)!7 zx9;&h?W*G?YQ?svE-A(q{hQ?<^ZgCWGSl1czj@bMKc3;nU>GoKL;0D=toPy^%F0RG zKYaDy|HtS12h&m?-rV;xLeoy2o>|!2dVPuaj0feyvHuL-B|rUYEx;4XRT|3tQgDN0 zc*cqS8>64+z9_!@(B{gT^YaQqA3gtU?=wy3zK~|5o`%@$7cVtZY&&x_ z)KYKeEH&miKkG=<8nYccy2WPB*d$U?mQ!$5cACW_s|WEx%5_;;r~YYaT~E|pk<2#r z$R$>7g>$>awYfL#&MTJcllbcOWJ2!l5b<<2?FiY-j+5tBnPz9G=gizzoaWT<>Wc5z zyu^hy)s}a}dcI1Zz8+Ao+WGpKn*6DD$Ex33vP0BX8yv5@s+WGzBIie3u=C~nUGKge zUGvL{B~%Yae>qM z5VN!Fkp{=tS0CkJ+;udWb4$az-Vbs1JKTMfTpe0(Z#vDeY`LJm;_5R_-sg{h_#Xf9 zfwGs>>GIY)hsw?|*sV=Cq5n}SX3r`rFS=-O_MzwsT0Vbj!WSZzq3#c(Rmt z>8@|)+S6{FS2`*fJ5}!i+ec{~Ny)hG3x7i%l?LlnoHhN^wQAL>Rjb|F*E&XSaB;h1 z+gf}xTk5>4tW7XO|HVYt&Gmx!`L6ELamwGYc4fnvg+&vjIh(fKiqO)O-uj<`S1rp< zzDljsaEdTn+-}c zQD+jL-Z(H}@2p4jJfyuZ=Bph!oORQ`XT4m0)cZ#B47N$zUM%I>ds$L;f$13y%ZbYr zHtqhyC=_~!Nv^}IzU;4WcXk{S;Cp?ek*P5@d(8>8xF62~L$wNy zXgs*`;+e{^wSHwuTe>!NZs~t+mH6g>>~0J9qify<$OrO&vQFS%GT+l~Qmx7_&o7f- zs$cTjH0`XyvQ4`!|1)rv>rt^|A_Lo3fhX|| z(_U=Zw)fK1+(o^A9^C9WveF^zhg->8=itNJU2OUPF}@5uxxTg0@YI4?pLSnXdt$pR zD73p-nzLB$<&Bs8jj~7fxEYwgQU5VfB>11mFTEQJUp#8BJLeTWZ_;E}H<4MU+`OFA z15ewy2$rX1&1}0h^X8d%W(93)_0%0=HmbgmOJ(-z|6}^1g>}^;b)9PmpZOF^Kamrb zJ+7P)`=22%P+CdDVz1jF$*4=WzB}+)Mb=xGC3{wudQW^RZC-HYz1nV*8_hDk{4<0W zC`DbI*QytN)Tu{Y>(#|%!R~;pqjitho(S}hIV&V^=c@OqG&3>P#kLA>i-N!&WD`xl%DnH)TzQHid*fp4+U5xtEuP7Yj-Tz(S2w7$xf*Q4~tEB zU)g-jVzgc)pf~qhwOiPu&Z*i@{=F&B>!^}Z?2fH@zGNl8!nUGdyaP7E8aR+&9Hw#cc1^PSqtmC6C)wm)j~y&7Qhs<(6u%!=kMpP0JVO zHLkoA+LK`FBeKJ|Lq+zm=o-oA5Uta!rTsy3>k0Qf%cU9r=517ep&IU0uXE0w zF;ZIYUV+zD21O3G8;nn8OFnuWIcH15?n|bV*-Rd^E_t&o=Al!u8Sm>;Mia9bt!J!e zZ(qGBEy3^9`-T-;q_k%3?_Fekty*H)LR~Yqm_oPhrH0d{Wr;VRTE4XU(4nUDg2n~U zGCy`YzUnRf=d&-ZTBb;Q#})%=m~8-v)QDh zCoqdo?zL~Il21)(vub>Q;=7MzNbslgUf*WTjTb83qa_k_-RMW(^)1JDcwK#7v*!IS z*`QXIz0;!pGXzI&7wrhUwrWc1HZ_rtvNKyRwgqdXdgmS5o>^ZW<9KJyjZ?O%6K-{f z3Le+%xW9S9!rm3njRWTNsj_GvP)iSteW2df;BoL53Wkru-LH0?*U5 zR{UqM+w?%<8t0k&$G)&f_7}P2Dg@*n>N)Uaxw>Gy*JTD6Ds?S{er+kmAn_IHQ zb!GLM6EeEa(;sZB@Ay9NKf}jW2cFCn)ieH*7`D{u{a5zTsJ9nxMd;{f?K<})uvgIL zX512iCEbgK8?W4pn{=V3j4@?F%PJ|>c{;f%7d0N~w|rOk>#XQacH9&)T{T5?#dqgx zhtACTY-O*0$x~%g`3_Ny9ioB<-?{Dbi-`_1R$cemd#~B-&B`mhk4vSjN_^6*lx8tK zpjtK{N^GJa^CHDW)gre8hG)B~9gL>!P<@*ub;XP4reM?R&aTs@3VobzqP&p@|Ed15 z4Pe^9tb1x^*s7+i-2(S4%aTI#K6p9xuqvNXEZMl{G;c5agiA6jrsxEp{uo|fUS3c% zwFWbI#8>-*aw8{jn>HX3Uk`_40P; zKH-|QA7?+#e$0F*zb9T|N1pVSHEZ0KNeA9)day%}8$mR)9ouq1aIyIWP48IMTjBz@ zOq~kSrdK7a^(TDjpJMCjEW6=eWK-MO84l8?F6nGKX?XtHjd#5QY|T?YYCTJ=ee^d@ zY}$NpDLA4KIvDVRBAJM?UT9rDz7UQ&pw$SDE~n{ z_@rG^Ez2*?E1!I)#sB#Gge8>i&60E}zs0Lw>?uz$zO+8s`6k!$jz_D^pFa;?bWL`3 zo7htS59^)(Gc^9PFu2urYNm^b<89kO-K%jY3%_hjm|$YSAoMJPh22|N*x5FXIW)v! zg62+yl$UuQ^rJDxYAuyHu<8$kvYc!k4WXZ5Hx!H}JA-GJLz`YX6ScMO%WemYOTDu&y>fQpnU^ z#pBd3JELk=N(2{p1rA@aV%WAc-AGSxtk`QE$v=#Ix;Ecau3@k!Dpdg-Y9o$-{C5w zI)!90h-v?_2f$o-icxTZ@JRK<8-Wlii+PuQ-q z{m&M?;L{7U_bQyRi|goNEx5MRDd2$_-=yZp4E%vQksH3>d}}mok!bb9T}yaHXYKd* zyy&-b#fmL={IVpTJk7Q>QoJH|Hpcw$;;))_Dz6Lc{bzW8;`VT_D#VVP>P+lSKy2gFbQj9=V+joB|* z`u34U8hZ{emS9@Rd`q-ty3EapVx7xRT&sSm3qCbuv#j=USv}c($==ybh2PaS?OfhF zLnPY4v2wv1_6)0oj}~)X7h4*hwERWKW#)xz-km55-u6Vx?dDO#N)NyP3~cOggEKQ? zzCU7f?I}5?Ak=&E{1j8$HnBHlRpn2kC+EDoAo|PZL5O8^?8&*eLeH1ne|_d%^P)$k zjSZK7PquHI!z$8Lv|_)<%b8qnEi0oN_uS&G)$pF5`##<8^t98D?)-RZn!dQjAxkHGt+TsFIk!EbnLdsEndlK z52TOWSZ*kLS#MK!WtQ!1hw};I%!fh_%n|Plb~~25cK52>EUB%Y$;&?|7#ljg>$_|g z^=z44A)E7K^Mu9Ox=GWxqvm?%opQOSRL<)jCB$=9xm8)chd1E0X2&)CIvzEqhpDlj zAEX~T-#VY$POL`fN92di57Q5wI4#Yw z!X8^f(={g-s>e=*a|y} zgvbNNkPR4zA@`pS+{XML1R372JZ<`@ zSfk&b>7uC^K0&YG_|m5{w|qLkvj3;i**%*VKAo$t^YUlAScB{9W}J|ZnBlG6Vg~;@{_2tP-xox5k)(TZAZ`9m1tyiJJrzazCL*aL^XEsY-wRmteu&$Q5 zvVBX-l`TsSm7aDuExzhYpgg3w`uZ{JMyh^>SoPIs0?*1n70T{gaM$p{m9_nomqnkLbGrB<@+%W=)M>o)vkb$e=&$h=_lC%>DEZqJ)>U~$;d_em>M zwy7^U;h%YI<4%^%#UARa=24zblZ>9qv`YWHw#xCXnC;9vs$I8l$;WM;kuVms-87wnzw24HHLW|9lp$lal5WQdRgzxKI3~|Pe#nyZ4U(hL|*Q0a2HUGcVKhl zH}$DW)Jm}xHZ0<4-?{$bd)xmEkH3B}UQTY< z$G2jR7dYj#zMCyvdfu)2nCaT1*ECbP-Qr58aL%0l*FUIhiqHq|H6eEdZEAM39h;aX z+ibr0E9)+m2O|3x|FQkP|4*KOp@VSl1SZb5txY#JiD)T1dOulFu*|MPe064U|22(g zI!jh^zkl?{JhElk;^Nh(jaGkj@u_4_s46=uCLq0Y*Tfx?2ChqA?OA;-ul7A4voZPH6FB4h#cJ4`Ar*!w}&(=w|zVSFX zDDOxWsfnBL``O&NvrQXK&S_=eHJSBHseT|(P4tP5Kc~|bf zdf8>;c@vzPKbDu5mzQqX*Zb&I*t2-E2Va`HCm9&{Hk-JY{{67t$Zf7+nQBt@o@Z=f z@vm2%uk+zKZer2Fzs5PtkwEo9yCq8rVlrQ(-cDfh*Na%@lUBuOk+M6TdE`zGC-mXoT z|JfvLVNZSaJpM-2%xmAmgzVPYANqbEWW$c|qqox9@=q}+fB<`TX`{51Q*68U{S9TT z9j2cYUi{YB19>84J3rrtC==GBUAmjmZ+4mR9+A#e6(jW#jK zxC`s1aF-wIyx{%dHrvJGEylgU=c2^-Tr*s%6fJhbZ^EJlPx#cO*s5LraamkVU7+;b z@kV^=PmT@{XpZ-KDk>JmdD*Y4BzRFjS4rS@mlw-jtt=iMDhb%^ViBOF5-qv%+vWGm z>Q3{2-QS#6;5_-KM@L73;pKn!Vc$v)dMeIUWzY}fn2|Hp#QNq-jXNwMd>dCqH&$~U zVb}2$v$%Ix;7k1Z&*kS`dj2!4a5~Omt?_=2Z=w#vG5$x_dOaom%p=~0h@Dz=^EIcD z?Cm2fnNLZG#mJ~Vcgjjy$HC|v)fdbj`|GsQrm2E_0xJV2n;jNCq$ApMMkQ_X4UsYi zsVnDn)fkVu#X4=)xwtXlgl=Z51?Vc>y7HTwa(~dV+cjaqen#w3W_gm9juEpiI7s>UDw_Lg(?s3^dCh_R& zpS9xOZJ9Ssry_)7fmN#zSNnN&%N%`EK*Q{p@W~trJOxU(4Y*A3u zg;;BcOVYc|b*H>`HprdTwa+9VYHwQF38T-(xd&L|cBpPz@nn16ymxB)-hoSWU9=uM zh@Hq~yPOphr5F|cEw^Et(_PP-d`Z5JX>%9aT@-7&>NRIA?>vs8gNiq@uLb!W+r|!-3v$yOyA#JwzO^A#%3%;J@ZtW_5 z`r6E)-&?5Izh%vu?mw*;?=Lp_pcZjc&-=`Z-nJtut9HG+a_wEyjE2b_LIDS|mKPOB z&g{G`{bxmtx1-?gNMnWzJkt-^<$atauA^W-fB%1m&Us54A0J)FbmHzcwGid*nTrpU ziV7|&tYz2vVe9$nkDv0rZ}zdh>gSlAUi+~!{f3gQ(G{gl@!2l6Y*F(Bv_l`>lS_6~ zyxh6qwVnOsi}l5qR9RZo6iWz{#%RZpLpbqA+sE|Tq+`PlmN%$tgveG`6G zy!CZ^HT!_qHij(4bsNH*d^euj&R>(CY^`(s%@QwT-x4-UORN}i>&|ABB>c= z{~1{9T2o&ZGV~e#Yxg{qy=Z;MlFCfK4FOX1Nz(8B{@5qm{`JPH^DVxQ&fn4cx9qLh z?MAMI=#4VUnTfm)L^KS15*frfj)d%c@}EK3`FTg(!fRb(Uv7WBJ>^n4o08J`=!f&4 zzx&VdIMY_bO5@pb9?=D1Orf0HmiI`05j<48#dTF_=iH?%d}}k$D4tvV=S#v-Lnr1X z=5emYXSrt`JGo8yH5M{wJ^&pd-`&T=5 zd`Q22rYw(^#;j8}W<7Lw?B22`+12~C-ORpk%bGH0oV=83+LgWEM@ha&Qsuovm+@S8 zkE51Zt38`Jr)i6=sp4>s%s;j-B0}Qg+SeINveJ%zWAgG1yy$mD^=5dqB?EF4iw^^f}>JmDnJrs?aYduQ3UyMY&Dm-$V2 zv9W7H%jICsM_lYRua?ebe8L&gr6?k?bzSPghi3jO4Fm2RnWFGd`?T=ZShgn4hNV1{ z&oTVo#M!k!A~&nC(MF3Uyre|xw2+zL)e|nW!}*?6pOUr>(JEaQqPt7;!ltEGLgsJh zd%VqG$jD@L!*5gRG(VMvDQtaY z)bs?^{|pBdIezqC!Gns+Ro6vK^Io;!!rsRmha%5$sJjHsa^3m)&E17o2NGLuFqmvp z8GNkued*l4R`L(7oiym(|WV^x5 zd7I~_U*3Q0;}3D>x4(*h`0GuZbN!FM)i*D*sLXn);aIi7aq6ix%XNKMTjUuXWw<+4 zb%*)(CKK%g-(IvY{8yi8E0uX6Q|hG1;Xf}YGhfpb)t&C4_ zkjSB{rCX{F`U@0ZP}iRKf-%3SXm;zCv%kOG5>qq3)3!^uF~H7oh75W|$C7p9kQJ>r{Wz4T++^)&_) z>g4u+u-o^1^I{Gm1unrmeHY?3Fe|>B{i5i+m)k=nhOCWI5jWxv=iJL`joThpre%Lc z`{vf)eWzZ()G0Tt-xXpS&gi<6;qwdE-4!_>11{!=}^j#%+GK|ITvF z8`mXmcd5Sks4&+kP5V^O#krh!+K>OVUGk+rGvM+Bzkla02{OyCFb-3gF?X@MhtQLd zT`Lcqolv}BYwyEkiSJ8YwaY$z(y){gJnoe0?Q*eH_S578FU5*yp6KZCedi`+cl?fG z&X$#BZ#A=aKU2%@Nwdz}7`8zC*h>R{)$Y!au#-7b-Y#N4x3u2xOnS*aDdcK*R`vu4gP+?KET$kuJL$dhVSLznZf)jo%0oG%b$`tgRt@=K5FeXh{o$Erjt zQ)g}qTF*8=bM0N}uHA)N&vUM=;k3xeI3ss)rZ>|~ch7FuwR#JxgpRE<*YGtva`f_{ zt!a{{j;(oZ5F7NLL6-0PKl_LSM_4TtD!CqRTC8wUSL!s|)mK{C$AuO=oiD!Thn+fi z{)E3}iq~52#c2-4C5`$<@%a@CN4lcgk<#N|KB0*wZG0W8AD~8{=-nH!3x_0`=VLvktrFGqR z91a~f+5NZhit#>%d6wnMm$oNMX0}?HIUVJR zysYybuO;OrRA-$j;ViZYeZJA%hxhO6=(4KyB|rG=m0!PmxR`nWoVuBbXN$VEvM=+q zI6fBiZjCY1zL=w+p?u!1c*;ZGFY?!u1nLeNRZE8yIG%JddHjA#qJ#D8zm3Z${WKJM zvH7g+3j2Geb&Hgf=baC$K0ogfgJ#+6St63He^w?|PMWD5<$ZnA`|h>IpZ{6OzW-Bo z(L6Z+{CA7QwY*WnfzR!<*Sz1+2dO44QbxUA;+$lze_ z*5~qvUbTfrZxgzA?uWbwhMhxce&Ri`EukSfCx6Rm8lyC0KI}eYl zJ@PL1S7w))t+}c})?5EnOKORiUR%Tr?s9?MjSrkY-<3L8n&Pcw?jGS~B=KPucT7v< z)QNAow(iU`YLz|j;wpOknhL+@p_zSeGp0yq%+%=Zdi)xpr+wHWw zRlCvdQtg)Cp5G?FU4CD-XQ(Rx^%NL7dX&yH9XGpp-X&anQk)A|9GSVQGOiSs7CgO!iRs z*Et-hHdP?5OM3Tl7yIvD&O6?`C}h|czgThxPibD)GY8(NsVYWFk(0C(LT&DY}#wucbGw;u^yr&tq?NMw2|JRm;~M($sp}8ocHNZ^CznAF0j~yO*qzPHEzs z7P(={O#Vu?`=aY38nv}7rbK9_T1`BBqER@?_R;5Or$W#2N}M{qzQkl@g1BDdZIuhZ zU$gND$g<5%x*M5!F(+cv-Zk9|F02qg9H6pY+ikx|K1%;bBofMp}kr==$GKnAn}b` z4e$MD2;tVa!yCTvNL4wX&F3@K6B`yzYrd=NwqxzHRL)sX>{wLtx?8^Z%zc+Ct}LNv zv*7Ku1q+v~UdVU6N=o$JnJ+=>{aL>@37oj6G~-p>iX&n1%58x{H?~guYVjxi#Ankl zbFT1;+KBTtU0WBhVOry#+VlAv<}J3(vh42QJs)yaBlEcbQMrw8ZC#SO`Sp8Tk4{}C zF0fvBrK?~tW4u^M)7&Y!DL-V>Pk*%E8u#KqLp5VX(e8Es8FoA{V0Jz6@*#g>;0`|N zvR^D;A}-v?xZT&|%qcF+tMT$wz}Yk5@{@1<{${-1Is1~7*3?rwXH~p-D`J%;d+B=E z{jY-M(u~uJpR#QFuGUyQF-G&gM048L;^oP|n^lbOIC~_8miV|7@>V&#&{MrXv&}v7 z)ziB|ZVGAg1{UJxi3fw;W=y>N-YM?gvsm_qZihHEb&>sd_Ds%+So>s-R2kcx=;S}v z>@()scRwvJ^I&WY-Cp=BVQ+9)NZ`!9uV&@2+2o$xH1B9bagLK(L*?_O-_!S8+f$b2 zeXRW1Qx==j7qk9XpK+`YNI$|=wNY{XHGfXu9oK%QrL8~NEPd?6c3tg7 zD$Hxo`tLfw>s#P=&+ne!BUj(o@Nn)f5?cGH`HqCF><5!Vqia*osI5|6Ri-HQD*IEi zZmTojk6Al{PcPhZIC{(7Qm)Rm$3rq2b}{D7Fkrelt-RW!*KPKe)-zXvXM{;v?e5#z z-nHPBe$IA*Kg>IS@_^d%3=A6*C3`#eq~>x4Z*R#qJGTv||6NA! zeoAR`cc&+sx8CS_VGz0J*6}S0=rim| zmbh1?nV?WG-Bi#j>&|g!PLYQvyw`G`aR0T>X#Z2a1F}3@_PplnyBa+Cc+Xa;{nJ%u zaZY@_-qUf?6V3duN2RY%mT)gl>fB-H&lvHWp7}fT{^4k&9n&|r~fmA>|a#qzh?c9EBj4;Wq!H*a`|PK z>$AS?-=I-*{}vR@hcWKos*y)R_ixq2gHXbu$1;cX?jB^`BHFY8ba06#tHKhIrcGg7 zjuFy+k6o(l=W2FlM_t>xHannXUSfIXU(Wu-w%hB!YCiR!ePat1vbr`_cHzcpJ;G%;&G z=VPX-)0U_ldi7BhQ_-%o{?DuAzw(%Bg{%zPCBluR^Jo<6+&V)LcclMiyOmnOM7?fdeYgE@Kr$v1zW z1&Op+N@Tp&Y7VGe#y!*Z;$9-elQu4^Ba5_JR~w!=u;tv+>A6qO*liKLQ*$G6gWdxHowivs zul?4}_-p&HY=&DA({-M$+czkDEK&RC?vp5g{qdLj*PEgkukvN+Mr-+ev6$`^u(x+* zmty>`{hAdFriGU~Hbm5(*ZFMJa3Emm@+lh(zee9VdvngtS8l@TZ3+oF>kD^mh&TH3 zssH*PAE{-YOD}J#@?b3T7kF{B^5%>!!YtcXb#tfLT~nE3Y?lg%eoRnU*|mhBfd5@t zY5PnrP|d+o8TCHz=>gUP)?In_ZP`M7>-p}x&TAGw-myt$Cm$mU&)9?Qa#4qL6}xRg|2I;Ew%Lw(`H;T)J?$a^L)Af>*_6iia$B z>02xGuY1RtNbQ=jsE(|7lD&-;CO0f#@w2+rR6?%n(Nhc{m?*S1gD{U$^F zput1i%-Me$gxCIPUr`;x>=5CkA}VrU=)*hN9=Eltz8t)M_-Jd~YQr_2_b1O&E-Kua=W%#{*TkPF1oj4B|p<}R`@{l(iC%U5v5CtPWBSrG8*QUYt}cge4tU#ISUcT&%j*(Lk)1(RbG9-Ss7TUbYt(3zrAGJ>Ava*Z3=cK8e3!Y%ghh?x6J3X6RJ`9;rU_mL-j*m zcAqwKN1Gd+Th7_Hgv+*N?~^TzvZo9>g0onY6Oyd`1N;u-4>Y3%&5@yQDA%suITQ_k+#(PxxA=}Sf8th9z* zQxB|*mOYmywIJF}X=Oc|LQiP(#UE3mw*C{<3QzT#sui*_cItly(fZ@=bvxdzZ~3)C z=2zC#b)L>Q*C~c*UecJprDXP9yLGibzh?Y0xj65*%9K~vlhdWj3hhi{&hDM>Z~14& z+x`})Sl-=Q&A}h40&w-}~RVe4;}6pVpgox8AHf^=4)4RG~nvkd;A8 zy`~CpSuvqu{lEJQ|1(Vd_{YEf`hSM>7xhnS?1i6xt^Zcn{?GmV$NvnAZF^E8XS|uh zSaH%`mpyfxa8$MC=2_7nFRIu6XqI>U;Tu?$Tp^N8Z2G zx1G90e;SY34Vg6p5jUj-Zd{vF|72hFjM55|owiB#f1=iIK67&Qqvrm6i)CK}*fJ#p za<1e~|JHQZi*;_-bditoj5Vom`6riso%2;cysvuUg|AQT+`rrDBO(6pyubeD{%3fi z(X_TytiZCX=Kec4GM=-hc<;^^Gx`OX8TmL?u&~X3FKghlX8P*MS9vFX-S<0UfyK@F zk7Ba>t{q@r@>0t|-*3|MUPHyTmeUjc#21ug8@0yD9lPW6pP|95{z<&;nMJm-{emCg zo!GrXBHt_N`YB~i2G1i#V%K(F_4{+`^NGT=ONSm*8)ot{BxfWnJUc!0Kf{N=!bZF1 zEz@Y)+9ND7rE%h7yOzpa?L}E-F>Ktk9!JhLcyqeX;l-)%R!;fRse!vW#C~?Lo_o1C z-eQH%IrIMvN*izPdh>=csCQQX%u){PsCKP4JAUUD?EASas;xtEgW#l;759VxGqkTc zr+;wKGld^*5+V@}awjLedyqJz>Fbgyfic&ZnP1&CabmjN^Yh$G(erceh+ZxXbM`L( zx7N!3!{Pt87RugGR!|E?YO`};5b+yhc` z-r}^5!Dl}cFx%#V(-FPHJUi{aewW+d-u(|d~lAVvH9P-6O+$bd_ELwCcF9j zBi|ceDS4}L_`FTwg}--xwRp=t6}_`QqHBh7hl;^5p5Ajy!u7==T9iTFvsuN_6dY&7 znh8q31$TBEW?c&P?01;+vUiG0HM7m<^IV)>X0camAzGNhS{^!WIovE$e8xigyba_2 zbB!gxVkUU^)v8Y1^@I7T$mesW?1A6Kj$empVFznj(BARL-)1qd#^dug3(97HyTVxW zT+4mZ8M}DJ2(~?+PwBomn}7P52t*6SVVhk<9`M;ra3V13=Z>rvgrRc<;0x77Z)i%{uYt4 zRmI>iv!T&z7Fh)^y`c1xMY0fw1ylzdVz+AqJ2LR7&-2}?y9;c}lzwxxMBB`_`FvX9 zn`fAQ;-rke<2R@d?@uS zG&|%i$d;h<*PC{&($Cw9wq?J{ z+oMH?cAS)%spNO%u)ukn&j%LtuUR?0J@}tX=wX{kh{HC!i``n>w?qwWORnp+Z(OHk zZ@jsts+0VD(s`TD$2jbY;{OQsUJwcVnY;<&u*b($oB~=(4uibEFy`glMIV@VKiS2h zcEI5a$dq$>+dOO@ar>F_%wHj30&$qo&chi-7vG-+J51!un)4ql>wh%A5^G$w`}rZ8 z&*wHCI&ZP5p^g8m(dYBOAP!?XnCMY+<|wE-U}%mx&dk-hYxxu%7boxfFNI77hj~SQ z8+7r1n{h7Y+ve(Kh{HZD{=9Nk{&H~ae^6^mWu0F1rTR+o>6pFyMEY$$pV}dB@vFvS zg|+_1Cn-S?Ee8W1|83rMgJ@8SOVpJAKozOT6;J&QGSKixF(TsTi+)!hdZ9gIQAOru|kf%(wY9fIG5*NC)mi1K(|V%xQ#LvZmYL~Wc5*1H z2riQPe%^J7z(Lma`+mrSJoEYMypJuyvZwn^FK*VpodYuEu+HZDwPm+`ZN8uT^81fF zD19?$pSStIzvnlI4brt3!Z@|%_j^b+0}=#f9eao&*yFaA7RiI zWMF1sWM*MvVqj-v1jRQ4qoAUIp`$@yVxhvs#)S?61se}O{BZFj_Tk?BtR>-ifQr$sFjS#IbXXfyGKcPUHP=ZnuisoybjJ2{g#M(p|2#f6GR-#_hA zo$h+teUB60hCf_)t#{nsq^oh`{sFIsDW^h9bcG4(`Z)LfYh+c_#-r%XP$iTUA; zj~m|9JowLG@$V69-o)Sgf86Ng+;q9-@4Mb*7grW=Ngk=a)_dUgjG1SS1uD(doUG>a zW%dFdftOEa8cOi1J~@?_5oTxAJ>kNVC95+cGL`4?Tddy^*E-qz#?8}jJ0pB;XQ=w8 zZqMI*?sxj+Z)b$_w_l3>*?S{urr^}7q-UomJ`mK6ZhOAB?8m1Uo0l4;6cuiGt0|hy z*EM59sK8W#jTY{oc;C7md-}$`(K+{r_y-j?KbyeYr}t+>nMM86+|zL7rm~RozI*Ip zYu4X*ukm4?@FCxgMpKq*x@@}d7RUX-WB(P8)0qVdn-(!;x;JRcot;x5>(hSX(&N*j z)2HP>WDiskk$zCSzv}o12@PlTkfmT|kw(XRe&U#Hl;Q)Q&D! zwPp|wJy}s{^rG#3Veg6D3BKB<3+|q0=IBj1!1jA#W39n1i-=7*PQ09Kz5I1O|5TUu z>aH{R%N-c{pq8C!lG2(C4=I-j^Rou;BJ|b=CRxNCx;=5?=FELwZ*0~t+SV=It-^ic ziQB>V7dQWyS*XqR+uHlLbjIXzy(dl?(>J{P5M3puvZ9r>&8Ek|d%7>LiQH4?+)rvj3p>{^h*-%Np*#k}vOGobEDJ zN+6@zedEq`T~aw6x$L5EG`j8tF{vK&{^)rpX;STlt4`adKB)=TRQu0R-+cW`*hJ0} zxo8(f6Nf7yNo{#fS6WhAk`GMWCC*VhG5JgPv+X63J7%N=Tr&Esxqq?vd-E@jy3(^$ z-zgnBSZcUXYO(NXo6T;E_`Za_mFo^Wk=SHh;H@O4mFl|erxm~Rhorv8jn{en56d@8 z+I6k!wv?_AKJa%_i+%dG=_~K|h#j|QIQmLwPRfJ%d(8Ombyr^8zG`vKHzgj;S(O31 z52wB9*KkdpS`>Lvf7acLX-AG(+)AnbYX3`bHQPs@**7ekX1Gn6$IkIfeu;UR+AppL zJ&xV~8JrDgSH4*LH7d`se@f*swN1OFd%SlvZOL*jUvyPi!f(3U!&kcRUCo}_C^6}n zZ4eGlIO$?`$MKW!b}sGYni~#L%|;e8y3Q?rb>hUsgO4R&b>3?`@4i;!=qgUWWhy=? zT6)YUVn2S^_}ZvMx@AxIiEp-NDs9`J=vZF#pWDxoC@awZM(nY&>f>yUWj5RWUaVKK zR6lXLKx4xW0r##OH#L(t^fR-%UW`m#qR6@M&?2wXIj#kTD`qFmGR}1J(D}!d`X!)c zVOO51fNz;$SnsrzS=|dl`riw#3yWM75T5U8R$=ant=A(fA?KGG$Xgmv-8hxLlw zy(Hj?@0045;EE28yF8)&7aYQD`MS)_K6!TDUL-gp_`H(dAK$ZX9ysY_0yApo`M`j+rm|p_X_?%V$i%tD6W_)cd`dwKhp+^v}g>u;<~Y~0@Y z_{IBZ9?#QS@7#+|m^^$@c;0Ky@6GuJwSol~rXS^f>=H8L;Iq`<^STQfm-ED>lq*lG zG!f76@$dFeHn}i&YWPXnrU^f-A8(V~x%qdS%bkuCn?=g`IzjCjU-R#KI0+=VJ-F}4 zI!X4LaS=y_^iQXZrIQmi^Tkv2`c)JKIXYTTloT7Xzx~hfGUrG2HtSvAJxwCy{BIe| zdmN-Db$`RPvVSMLPpmJL6FydPW@+(<)erM_>Ca8uCfO|ZblHY>of$$h6JNAS_uPn| z!|T`>B9R<#Hc=_`QvkL0Ko^PxTzvS!q2S=h1aNDQ3DnyA&roV^ zvP#oSy*@UN-$iwaSoha7!>$~?por**8@u#YW;|=zektpc=)dJc1s*qhpDhk9@rsZZ zevwqATg%N9F7>Ztulbhw8k%pk%S=pi*{^K5VWK5gee1ze2@j==W0T$-RXr?qQEI=l z&WC@@!Cu|c($;ksU&>9t@MT|9jE~R+j}sX!MXJ`8$EuFR@hk}ZW+b4r!L(d-*P9KR zK2zCKId5}(pV;TlHsSiFKRoS+49)I0Zr$MQio@2{-w&+pboXXTYr6aL;_8d~nfjZI`uyK7nl{t^eWT|g+mC-F zOV>~Tp#Sn8|J(lzhkw<7=wAFr-C8G4P3DBRoUUe{$)zbL?ivfc>@WN_&GzAI+vIEg zQMSp~1kc2-KXR&hNv`T2&Xb>ia3=;cm9Q%(*^0lcd-TF%?iL{)8$O|9>Yu8;KUJTv zd~dtReZz7_8Oid+3Gq+XzU|d~npOBBX*_3W>Y9GY^PMc=Na@>|{+_XxkPugNNfl+$F6ytDHkm%6WY9nEJ_7`FwV6(5npZ zrMmgCGkE15S2tdfR?O!-Fm;N;lc0kOB@<3Xw=D9|bL=V0;XQeHPT;QSlggIQukBCT zQ=9$Gwm#}_i=*|Xoj*BjcYYLbcZ=t&Yx#2Wl90EOyL07b#^4lX!*z=SZ%^rQ@#t;& z&Aa!B=-g@7qSwpor-|jI%&2=m>C3&tq2U{a^)Bb$SXX11^zEGgw8OpcjEn4U*4aCq zxGc1M!{U;#IeVYB3WNssUAFUBFO}rZww+J<^kSKHZNILp441v*HA}x+!DF9J+@tv9 zUnxHqmnG|P`hOID-|46l$}&-4RlZZ}cHb>Y1slv<7FbN`=sV3_AMD8d$d&7A zZL9xSU#`}fY7%$h$t$fFC$H}7?QBlmGnXZBrop+E_ue1P9GR1a`kN(Ylm|F2Q;B~l z=HZmdp?B8#a!v)m*M!6-qinW~?guBE_uUcRA$IZRo#yZbSIvx=a+>3m?kFwxSUn^~*0k2pMC&AcItYkJtP=}s?BbUrw8bIXjo4}KgA%{aa|^_IU=QgW*N z!s%%|#?otBPPDZ<70&P};`l(4sKm)0*%bnKJ1MT8sD( z*>h~N)`@>$>3bx5lCj)@2^a3@^~9?=wuKgM+^A~J6RYjsxG==$Zp%xigfAXBzjb_a z7FDUc>6FFF@!an8F)=&T`{k*Lt?){rncvDTO<9yGvBJ(pUyzSKQ0YhSXV;i-@h(@V zZ#a@?%jYwbN6+fpi&7Ok0TV5+Z&G`MczJRkZM59d<&x*aduhU#n%&tKZrqsr#?VaK z#azyD%Z(eavwDv?INvp!Qzp?BG$q8sT*33VXj_yGtJ1uWugfAiOjLXo=5A3-m~krS z;=cA}Ji&z*7uucZa1st&;c?Zu`OZ(S*Ry`|_l2y!ov-Y)r?~mnZ@KF?;>vI2y~`|% z_;o$wipEdzMITPJ_bq>7D%a$x%iVWaJUU5ITl}4lEAN&+MJwLz+^4t8R!01jYfahN z`Sa(y-(GiG;NF^DdS|b?+@H+oc%7s0kko;>JKGdLOt`b|sFC@>h?Pm)z3bCNmTG$0 z%&ypR^!UY|m9r}*{by)>ekIfLn?zP>L3G89^mVr_z4@>4SO5MbRp0zg=s!dAH#377 zZ}u(eyqVN9V2H{_Qm^&XVAnQ zCW)Ko9X`15Qcs9siridjhr4+TIh-?lr}&*wK6h-w@71fXvTrsC-1>QuPxt%tmkW`-;XW^3)4K63HAUbF9n3a7nN7gGwKeDjy#x_USJ8pra4(&_Kia_7&Ozv=g! z@H^Axi?4oHJ^ZWlw~t4QqDfP1o8{$;&Ms=5{Ylhntevy<3JQrOvQ>5&2T~Nj1Yc`(N zviC3S%IE(#)8za^MW^KtGQ&+&t)u_&zc zpCRLpR{Mk0YhK)4r{}Yt(^2N}&@K4E_Dg9RN75U^N|h8FVd;x{(_$r=oK}5%VlJd` zB46XW*7_Okvmfl6;PEy)?DTW)z?uROb@8UhwLVJ0CCTu0Jf9!!4bgmcGjLlkMVL!at?Y_-c9uO<8)W{N6*k ziMedEq+9m!2fmP>FgaH>WrvV%hvTxx*Nj${D{?sTN=)(cZ`5zH;jIyV{GXw1|EsOP z_(5$E$kk>{tgH;6yUjrRkQpFXn}KdNyZAw1XHJ zGdQJGXWr8|eX~j5|Bi&zikX`)uG;n2&7pOY$!fmR>lSMhV>rvNpIVu{EH?SC;k3T! zJ7u|{pi9ui?U&ixFXAl;FX()&cai7lI!AkvxMR;wWH#)M__lk^6@Iq1ju{DGkFHoM zHowDmEo0n;?NNbI`Vqohx31_rZ~Eh5VHS5?G-1cY%9}MARr0?teu(m1F;!c-oagYg z@{GgfThfz-TLSpS{fsWj`y@SXFg7(Ud8C&En%n5E!)~FW0o~**5Mw>iYq(KE|%n)tTowewg2~V zE3t&LZ+jWOw7st2;J6^K`jTBJ7cxcd6Qj;+lRV)+!~64}_WymihQoK_)p@(+-Gcu! zi0^r;k-98S&nToM=~ZA~dXKoqOZlZX@t5|03;*gW>+0Zc*^qi~SqpEKx6#sTsjN=N zXWe4#5`U_DyF22syXj+Du6wC#lS>)rcnd9Ap)z59k4CXqghj%d@+o|$7cDGn7l^vH z+spgFHTmCSda0_aQ=iF-3(ua_ebC*0#iSh`Niy1vFO8=8CWg5!K9MZ+L?P>JFo%c) z*ITYc>FWZ@j$W~9i$itoY7|uNDX^84J>xqZqvm@l$5MSK!&^;Fo~8d8UX@PQGc4`C z7WS__uXfFsi=sNgv3VK_3;8ZBG|DNxX3KHjfHP=w*6WPfjfv$gTp!|%UL7$xX3_WX z#tZ3#NwFK>g(zH7Z}JdUWQ zt~_&WU(NN&o4>4;)t3z0vm)zd^-J}vxsW#C@nTHKjF$0C-qL~fm*@7B$3roC5kIfPhWCY;zDUpZbIDD z_go+IGhO{Ez327sJrLUWqltHJkz3hulcu9D_AmNdvou2Uz^QqP%UQKU?7x)r#$=d< zmF?L0PD@vs`JRNp!nI|89c*-cm+r3Rw=D8>E!`+*(|C2~%WFEy9g2?}H6_0BRMy%r zofbXmD9iV@aI=rwrZRi`Dzq}se#@fSFs;W}H*CR?>nAGCaI6k3G)QpkyfC9NZ1Iw_ zrYjfq#zzL-kz`uUn<-novM0HCN!Y~J*pNHMHo9i__r$DOGyCr&YxmhA&u4n6Zr`VR z#D(p3o3BT==E>Fk$Nnk)XIOltJNRkQq@ueQcO1{*ba#BJr5o{F;q~=PVI`W@kL7oK zT)kqynBB@n7bks`*|z7vwol)D>;M)~y@mhjUe@3(BX#)ZMi0o?L#NDgrb=qo0o~TWn z6niJz^S$im1exR8vusn-+-~VbPn^kpLA92Z@BDd=yw)vO5F()9l>%91PyQI!Nsc@6#n_m|g^mjbGH5VO zUGFh%qJq?G_9^~eGx(0}n`*4YTIyS~;KGcBFOAne{?xnXw6^%l<5RAG zwWZy!=p)VN|1-R_HCbuRzlV)cI&9+WTr2G*O9NM)H~F=%pnGc0GW~b%Wm~%ZZnodt zQto%t9lw@}<-nYj~v{#qpP!j^(SO?ug;!(d)vpt zk6jthgqCeLzyFgi{1z$R`~5%OzpVHE6|=MG z>0kYSq0{xZ?7Q^a`z?f0oiypBXNpjKWXk55DVrkCY@V5JbTZxOT=P9H%UvfKtt|=6~A=veff9FvbgnuCc7_fUr}yu@KZ-& zi(W;}JZ0HP(W8fQ1G!8aUhpcez9q88lFu)BhMB{r)^*c`{mkxZKi2yp`C6APYI3k6 zhh^maIm>UUs>M!TFDN0AcDO0^uF|nnHS0Qd2qh=3`n&t|g7}*^x3h_?cwzi?-}dF6 z-v1eR7RBBy-jb@!b@nXx7GW2GrM%4Ls^U6FV#2(%R;7#CdYJwb)zE&nh;#Y0`Dd%o zKim8KbKK{j>ns0U-}5i~UcKpi`&r-7C8}mVkXW$3)aB`~wD~rF{+j%J{`}?QF9-SO z)zxhC9ZgUK{SXk%phAD@!F0du#yFR^p}K40)GQXEnz^ z8~taPvgwx2=JaOK72MsID<_}gO^mWLSYfjNpjUuV_{){?lRti0ROf&EN6?hI;E$TV zdIxFE@dqa!cfs z2M@DfYN~EKw$A#DphwgCL-t#=E%xe~uYSoi*FbX;&*h5;z1KMTH{889KfU&u?uK8= zM%Qcm?|yqEw(yX}-M2j5{=3o`_}0%k%PdiKWaXCE?sAsrJ$xQs|x8|yyA<*xZMp>o5?SJSsvpK1DHa{K!=!6{eYYafrCVzPF|JDb{s4{rl%mL4+q zTDNZM$4lnx5-%+lb5QWwIJGkV*k|RyHw~-@t?q4%-B-N$^IZ8kFaA7te{N-OdGY7D z{&OXDsDky5L9cRU1kRYBvRUdiRl74l)vH4yVCt?rD`S_sJqlCS3XQzFqW;ja%vZtf zI(wJCi_~tg_L(_#<>lo)Lbn<>O^sW6YQBSlMy%s{KQ`g@_v1IFcC6lSd@e2DYV%}G zbI!db{~7FCpME)(b5-~dTNsnCM$Cjodo?e`%2u*oy*F<=i;2cYZz<_@o7yE;y=&TA zef5~>Hf0B1-y8a?kAw!btA@|yY>QfxH04Ik*A+MNrb%&S*+_kFbIQFTxnA#0y?XVn zJxRQ|!FuvVvh@d|W3ye{InF;`^mYL&xA?^5Cm;D2Mm=EEsn@9XTx)&!uifl7{w)uB z^Y}fio<;1=TeaT)MhxQAX?s^PP20$L2K% zYRWRO=vp0&J@I<8*5=SD-{*;^%kMbyXkkB-6|3=*CDZ;cR-Sb8>Ha5v2R6k89bMP! z$`csh#qvs+C{5;J1Fy%Ah?@ooe`5>>s8d`*gnXsh#^IDTdyT z=?@M>>|)qnUF5}ab+PX1s$-|c4(E!`JshyuMxyu1S+k|z>(4*mSt}ZC5wx@LN$%^; z{8Qhwqqf`cXqmaYbk4PGVKD`bAAgU0;AS(`cJ|+QY4+pN)upRKq&*mBb}tYpNT_gW z;NCE6!W*VKueI^T?@lZEZRJWo^(QILJxxpURe$4`^wY&(K6(C1nzKf1>PF|z8{3jY z4(e>Ep7AV-<%o3KvIT8l*|olPwg0L$zcJtP$kH^aFs;&^QTHP*KIdWA7Q11(;|@dI zufuf*r1^SY#U%(GHQw?5h%--Z`1Nh78#cRK->4(H=d;U}yyRQ(RdoN}RFj0XN?n_V#`cEmo_ZC+l?|+_}1s%P>8Hby>1+aj^Ch2Db&hU2ES< zsB~Z7(K*|6-s10F<}YS^i=LI0zSYQhl8Cc{*|J&w-!?zk>GyrQRIHyQEA!T!Z9Uui zD%y&KSMh4p=mjq^RyAGT;dB1)!zDX~x(}>>v}f_9OXsVi7Tmd@^f@p4Oha0q-|-*0 zUuyUT{xh`BH#}3rues>QO?jSEmTziydaU4@DXnN&@oSrbDOWx7hLV{z`G>3$dM>pw zsV68raIoe7{PSPEFN4{I1TT}`>x-;-(t`3AY|-d7cUjJFvb0<8uiE1K$>kx|g1-&K zxsSv?(0Va(x77S)dS)yPUQ3r|U+Gzz(bjq)?@QyqFPq+oJT@tg^*DR_(}@k$diop8$}Lms3kluJXZ2bl?6lRSH4b8mE;rs*?W(|mjCP|cam({j)3R4dlMWm?jy z>9fNyao^?$JyRYIW{a6^9}+k{_syHMcv)jy!;bdT^EP%0>cnwIRh{XP_7+b&SF-8h zv86eC{|V@(^&WiobNZ=7;i}(Kr)0yj4?W}(`?$q9XJ=RLjOY-%OM9=SowYvZrN8=m z#(`$3Wxa8ieeFJbH8(E_T(^vM)rHc?zdQf_{9B0zD?%D#oOAyM9=QC@BaG|k{$2eS zb945%B@}8bo>O_ea?xJ@>@%CVx0daHY$WaW-hB(#k_aS8mXSLwmvbSquBGjbbEkAa~UFcB< zYp#Lqmh(5BshkuQDBAtfexrqg!NMCe_GN`Rri3b=l--?lkx{vXcltuX9i6RL-CFl7 z+p)vM|J=cVfcjK})$3-lO@3DQ{LJ6;Gk?!F{%)84uIBumpYwNqwl98G_pCiWZswE~ z3m938PPNM$Y8ZH_vusTDdEME6p)>O;CsW6|;~aBS4={NdW^TVQJ)Lu(`l|wSex;ZN zslKJvr_yKl$JKH!`XqB~mN z9Wj-TF9jxDTJ6EN>eEd3tMhNpzuW&V{oC^|&%dQZ@R#(j&&B6+v0Ig%`t$Y2j=FQp zzx-z?{$0QG@BTag?!T+g|85ulu09PJGCbAx-Cl3;PBhATvht>NC(PCv{aLxKJTrjl zNJZO`T|Lf?TTC0y?*7i6F*Bq^SL5l#HD!%e4fe*oDgpL$6>sT9weJ0ObOB3+YR`Ao z5Y>otJ?6dom3xA0Z0cfU3`|tC3}e5~nxG+=wte}%4E?oBrS}%DkA5k%_eE5=_sh6T zPxU0?e187fnY*Ikxc7PYb1@2&ni|6V^et!BI40IsKjUBv^$VQyNWsQUVeig!+a<0m zv6|SW#p%C&nsIS$NqO6*X9r{VSf(vXG(Iy+V(L}*y!FWo`R?A3torhHhPZFe`^s*K zT}~Hd`xK_nk_^2kui+}NAnER+>kH4u>wj+w0&O%qX4unzC5}T`bbOZ*b6zu(bt3 zM`gA4Je+f;)hsyq>RG`{*CH+i|L&J%ygGA((Xm$y(?hs9UdK9kuV0XsT{l6vV&<~)7YcBI#&lTqnhCkOW) zrX!pA=Cf+`&ojFg{JL7LImM@o^WehIdyJk|pPJo~l)5w^@`bPL#^MgOPj#(W(G%LO`?Dvb~R&KM+uFu%VJv7&zmQ#9N4wWmVQOgt&E;F6`msZHw+ zs|SXzQ~e?GqB$|F zu958j?TTN&i}ub~W^QY%xi>=nww<@t+xjefvYerF&x-}65+OlLq%9hM=pCAKwafZ) z`L-$l8K$55_@AM3zWp@|(T#5f>w?9Sw=UB9>E2U)L4M_|?KjtbtvPc~#@*>{)sws= z>Aychdl+u4+*R~yRPzfll|J;qHCk)dM1XxF<6$B=CO>8!uKJ+!B4k`gP%3-CwJp^~p8ZI!;}5>VaJuAu z^Nt_+4GB#hsDyzd1L9rg|EiF?Ex)(XjFPU{sU;0b)-OT6T!rLQ6xMTAfZ#|miRrHwk z{k{uf9#RK#Kg*`(ww*Js^!=Trz4B}O@(Q_A8$)LnU2j-3_hy3j*1}jmP9N^?olh59 z9ecIs(K!QC`FBum`9$j^b(^}X$`&RK4)lX}*&M(T|8tc|@>DION2EvOq z`J+ca1Y=*rH`&54cKK>|&euCHU%+?d1mbr!UqE zO?;*_rA#<@soa{2-?>ua(}JZBrm{Yk{Cl=#apF4T*7ii_S$6}Rdl^$Ed_62O-J&g< zb4Nk=nUd|1B`&h=?mjynh5z`oUjE0w`ZfEww&`tdy_)gq>mnW1hY^9B-|vZCtM2bm zylwZLss3lhS!ebcVZ0Md@RI&G@IUChYJ1O~n@_sS)(pGIYWg9W_1VqYaS2ns);eT`mNl5SJi7hy`qD#XAB}bAJqUg* z^5oom7NxE=7nLqEFX!%Aw)~xz!@8vxm#^fjWypJ77jPgcSZn{2oe8@bcEmEPoqQxe z{Z(w+>zjWR_tYod^>Iz92*?c3ocVa?m)!z0y;n?hoPU=^^X#-o_a%K+GjsKbT|MSs z@T7q0#*TTK#XF2%G1le@J^jzn-d~;i*>78Q5tpRy4u&{aCDYpxs#Ymxk9&@Is3aEU z+}ti*%j%v8 zwkd@n@F8QFP@cGGs{2KY&-!;WW zHuJ8|O`ajTi{0anW8;EtR{B1!8*eEed$~n}XZoTZMe~zuHY{jdrhYFj#O<~(pQP~& z)3DnnWmVo+Kk=+)zHNHXvMTE2s$F|ueVsiaC3*AQWCOK+jY$18NKNl@zjY2RkVZ~8Xh_O1QAZ}X2<`#;*d{A1k3AhlU+8L6F%?n=rm z{XXlVWYA8j9fs$6*Y2I(b()*I?Dj;y*)O-avuQ8P-Mo5k(m9Kamd-a((OvhFmwuVC zZOPJE?Y;|hcigm7U8dwKo_H{Af_(a0`}yDIAN%e9xOVyHeV5u;WLBPxv~no0?LPSpz3I4ol#vMANkch`ZG{Eu8B8i9}gGrZ(7(Kxu+t(EEPLkmVP zmh%3y1`i9C{<8@_Z}ZZt{^G~uGKI%wn?G!3&du8xX!5cuQs`7`SjL`vzg`CGT-~$P zC~xzl_$h|X8VYICSKPJhQC#q58PKB)Mbo#)19Mbmwbh0B*P8A)5EteeiYl4Zr0ETPtj zO4my=;vRczRGmCGg?zOOyt>F;=lwa(^^<0+dET(Pzgg=q*XrGuG+$ihRbLWWoO5d9 z(&GgoR@*aM?d4YOs(EC0(n@~b#haWz?q}@nJSCL1=(YWWOW!}n-49v*q;~OoyIacf zZp_>Pj}C90SNwak{L|*Q<-ZvJvTv!+m@oL&e)Sx~f}cAcA2j)rxn5|QZN%q25AMbl zMp<3|%d&s*KlSTRD%+MA#&BQOUT5W#TQqmas<@3Ft;r6FhyHL@K7Ay!X( zwW%gAo-P-Vd2Ot4b?W<vG-ga4XXxzNhrC^Ebcy&tL32a;8pH+mYuH+kXbrjA9ob zlj1yERmA|l?IvfexVWR9T))Ss*1Jl2TV(0l@0SFZX7RlEa%R$VM#D^5-gd*7NA zGiS}&eg2#s*5VWSBGYa&1XtM!y>xxoWX8B4q-2)%THSDC;W&M-@cCDEamVb|&X@C8 zs>N$%`FgqFZ$7!Z!OMjooPGE%OkExy?4zw1_MH+Y!l% zMDD7UrHlG2OJ{N^gs!RfJs=sv&Tp&CBs**AUH<;%kpVj=JvqKpt~)=j`)5*ynrrw) zn+JJ3LAMX7#mv5t{$57!h+I-a*<$NyF&P=re(yV9&7HuiHnUFb@8YiqG`O~gm8u`G z7wSB4rSZ~>OA_{{7O&g+d$NoEjKT$6`-Km8M5kR=dl9;EQKR5BmBs6poj5Z|%SE`#?`$XBEGd6$cUoL#H{(Ahw_=lfu&IU^LG#6Q( zbzdV=X%79oxTtFnzYtfn7GaoS{d`cY!9>5uGc!EdOtt5U8;ML-`b;eYn$jQ zS)TrihN$h{L07j;{})@M9ub^(wB&BDSnKQN8MP0cww~HtVDU<3=GJKabPomXS*OZ= zugNVrkYte)k>+Jtam#&i^C3sUWxG0sl^?F+vV3s<@SlC+Ecqwc%pdfjzDHAC0VD?1*S+U*%-3^Rmsh zq%f(Qr*uk0?4p=psb%MKo*#-`(6EztM)tMOy=pZrR=54PEc&RwcAtzw#xvva8$Vn< zI;C!0;x4c_>&~(`ccv7>g^QOLPTluJX~GrOga-%qcDnPf+#KEPZIi&(;NI=MPPhH% zukt&yJf<1U64aJ&d~@|+V|Q$7>zidB`~l4li&kdGWyV^xecaEyXxnk#$9wX`9qRMzn<4~*VvE++whF2c^Ea;aE3+J71a?WePDGnE_Y>x}X zAN+Yn{N~djB&tKdYR;7AAH3-lA7lo%#imGn9_C6fV;;QeF7?)YePc{W95& z2GhBjw|#io_RDm|YVC|S?~LNU7C($WA*=5=b6@u}v*e%~BD;^DjH}#GbAw-Krq8k( zea@-&+|%#goH{+>!soJ;wV9D7)AqQzPIL*~vbg>rZ(f^9pmmzEx^|0VNm+@_zRoZy z(~6D>-+U(BZom7lUVBm2KT%d)4QpOKMt`&8bon5DVP<*?hUU#RGSnIx^e{!i8 zYwe46Zj$JpzWtfrT1Af3%PUP!Fez==e#^A<>cd^n47hW|_|ND@vEIy|H=%OxT6fp8 zm!4eJ+ua_a_n#ry+JgD${4LRC2G5xLEy6n8vWVNn1aDH8a#D>TGX-Q|Q#8@njzF$Aj;&b&KrndYVh^B z*?sikevSqv<;2XNs`D}$_;0q&N(eV$eK{vrySrr8mVFy`h`apCm-YL6`9H&v{|tw+ zqD%uctgYHQ$_n}%*{hU2rA{B57Cbv_!L9Bc<&tl1g?txP5N6}OZ4%#jkNEPI-;>SAe0 z=1%aqnN8Zhwt9UYIGverRv?eMOGcJlvngEvg+9U;KsFIF$_wr!fN~YMBeMf zzS7b#-Vz`E)I)JE>x-X99elX&%sjP9Osu+4?|4AcMz@!$!9jwqyIroYe-zDnsiFK! zV&QA9w1bZh&EDL3H}}5tx%_1oyo{G-mb6Y;_wn0%nGn;n_ctdiY7kYDF=>1^0 zP0ctW(Ai<8Y%yc&)om9{A4PiicQx^^)?j#`c!Aqdzalnt!cp~)^3PfnIo!&(uCP@5 zWw-yvOy6d|LPI~r!(6ViYLic;AL#J;vf_I1XNL1@56`-MrZddV^(@EdJm1I0tEQ)J z_;F{A+PuSCJhWEur{@-Ki7!%}l-IRxvqIwzn_m4>K^d|ON>gK5Rx-9ty#3Gl?|Y`( zOHVwy@_gCHS0-r*k6&38yxVRXbzUPd`{7~7wypQu8~-!NT9v%K_Pk%Iwd1-u`vOVV ztM3Eueljfon3^{GP1}`9Wxsxv7d8`$RX!Z{iD&s2Rhk#7gR}pHEDUpE z4b*N)UwHKU=H6xIX=}Ahe{`yBeG^-gdem?g-;SvqYhrufJ`^^;9U}YJWNPQt+1E;x zwFPcz-ReSB<C@U-?av~8zAa&_7nN_UeSToSp|72IpTy6I{jle$ zy!JKS4||iOYSwLj8b9;X`ZGVmpVe4@7Sp;Q@MUR-gwLEv{vYu_=BFMtl`UB~^{`9) zqLPPZ=kIhZnU#@s%il?C{sUI7tA4!8gv~3{WJGcCuZQ_%RYJlzY=G=^mG-skJ)5`fC$c<#CmBEYpsy-CrCfwd>i=$Lmz9l)G-siCSJa zukb$u)4uuo$Nw`3e%w9dwKXsQ#6V@nAh#E3JChFm`}%NbRws~E3KJ5ST=Re_xmMsCZv%V+0F8USrL9>`M zUMugJa6y52))U$Dv5eY*S63M>T_v4AYl%#+u_c}(9{MD)1i?az@4UORDD_IrnQ zo@w>xpOyGK{`NI#oY)byXMeCq+k2Z3b#-cA%nO%SP_gz{wb=AqMeiMtc`PxJ8 zPD@cdnY3ZjqRy&QduN;$Z#G!y`_oGx$TGk9RLF&ct9I{yviYjsBeng0JuAdF3UASF z3R>5%kyR1Z{j+e+8jh{Ub{yMqfJ->G+ztCAK ztYL?1@M_*(-KU4e_Y~^RouXB9`%j&I%g=SGGq(8XZn%;C+-{8>+4?iR<0UgIy}$I9Tm4%7?JbY) zk1+B5otBReu3OZR{Yu6;)*;YRVLK-vEcnYVKrKCY}t ze7YvEChJ3!fVhs!ddBEu`yW2)UAuac)xl|^M-JrnZityWGp4-$Le2U+^LBrCUYRbM z@#ge4@7OhU^#(^7k}otpa8`XBM)tNLE;ZH)?> zm!cdjuzuy$pYuQN{~$IylxqsRd+@UFnjA%!H@D2&Q@V|P+U}ZbN+++mnQdo$$aVXb z$}&U0-A8qLy-%+=ev+yQIVzf?n8=>VdUMX4xC*s)?dGUf*2)?BqCvVI z(|D(q6dgSi*x-@2F*0t$!k7D=H}Kq^q5kO6wfgM0_FKQrzxCVyZSC@J`!4^E&v^Oe zhH;g{5eMciuCwiB_i}90{oHD_Fy_*i&mBo8AGEBFRs5=WdFv~;HO$G0xxY_soW(8M zf2PD?UC*^`@g7Nr)7ZXlS<+#$?e7AvfCW=)lNiI^2iHyXyV|mPN~`hVFlJR5#^v!_ z)}#pN%Q(!C(mcxd>1khJ$1UM0URgVzNw0G1EpEAg&M1z<(A4G4<9_egQn!77O^=`V zSxx(`!KQW=r-OyH@3nSJ;S$O3JGtlFfxf#=6H8CHEO>S(&A!KMOXiwutS75NZ{1Cp z-QKrWTOcn&(tEO3$kZtkHShnG$Ch4?{kZR=X{jpnxefomO5I)TrjWgC)wa!*Ys`0a zA5XZ<@y+K#Ya`p2C5i@FcSD|@yp|?tl3|ljDxbDQTH@aJV;Xs%j#^eG@6>X-xcW5f z+QlB$n+{hj>nwVDdb%EHMc(O|)Ai!AU;Jk{a4=ROM?3slafP}4oCE(E^0%1R#%Dyo zJN8C?&fThi7jJ*vyR2;4t>5my=Ux8ozvV~%mLL9Ge#WoRGkf*1`rxDP^a!)y54DT8 zKHYcW&JSz2C;$SVNbRs1{DgGRGyHi$3hF zyvF-T^os6lO~&Zyj}p(GjeU6kz1FFh0nTajtArzGuPXK3Z_r}0tZU}ie8F6?pWc&H zV`ojw+O+avm5lowZ?gH0~9gmLN6$`zHyjjYvwYu)Z)`sw0&Ma@E%3eOXA4%px z_bpDC@8wwQYA%hriEH{63%iy&e0#8vQ*b8Lw6r3tnCBy}o{N>iSQ!ch5ew_1E^|DYm=+ zSnq0DpB#NT;Me?jY1ij(Gt_Br5ACm?eJ3Q#IlUEG ze;y`Zuui#KyYP2Qvd)dHeIFBdh#l{0W)KKaGSvH7b9UCo#aB&k=Q9UM)!G%W|HD^R zerMkNZw=xT*3MjieTs_5>9Ty;N6A@5J-Rtu+apsPPKTSFIv!em;=SqguX`S;`zvia zr{v)+s@!!v{s`yF0$zQVw^dGFVM`t@+L^6)EHLQgy66_+-P>Ed815Q`MY_i=u3ot$fiK*09IaTq&2?Va9u*)Z5OJmep)(no!;Q!;OJUp-8+Qkxm|t1m5I<}9>Az$v#N_0-~Jt!Zg8L1#=)oV%$X=~rv%nC-k+$f@~L znV|Qjhe8{ZxGQ*GUt$*L$}F9*^h~X8dRfw~b8FoXFX)}ebn)KO9TM00l0TfD(iher zA-?Lqz3Jiy8;PTxrp24Lw8i>s3~ZO6C4I87p{{velWn}pBpt!R4kG0&#L>$OmLxH`9~eYSpNK6>_{+)7wsl{!nV9KR$D>b5u9of$FtXaj zbWG2cbG6@sQ@g^2UY5Bo42=$r5Zf5myMoy_-u?CQ)I5Ii6_Pp0)3c`VY3`V%ZksQD zHvG4(b~hegYgvMO?lD@+94@dn@oOn zaZf3|yrii5ai`Pmy@hw1A98uUnBM*^xpAfGn_FSreb&-5vfp>__?Kzrk6xTJznh*q}~&kLX_IyWD+z`4Sfwi91J@ZqTk(mc41G754k^g};vk zn0ie1Y^eO-P+L*eCMa@S%u*5Ywsy4>E3q zEq)@qbcHF;rPi<;@^%vzD=;>gaW2}(syA`BMUJuHH8antN0hsE*DSJQjatB#xccjl za{>PuI$!-~kPKcZo_1s1`iIvv^Ta|KidJ1-6TT#rFM35;&yGvY6SjmEUsH?Qdh6K{ z8R;Vu<_AQtEqvKC_j?E5!S%-kF9$HNuG*bs)p2g|^OH8O!X12O{(2T9-Z}q=>He@E zr~7Z+*}q;S{@2|XMaK@DG?TKHWxN0OOZuJJv8OMkY&z^(S6;v+{dKM^Vh(e8JSND(|}-r@GGH3Kfqozqk0VPuy&0eUG_6s&1Q|xy~E$ zDs@Kbx}A}}mN(X^wmL5PY~nVZD=EZ(;bP6H-!%edetOS6m%$uxl&?eRy&IPc%lGx? zCG-j+OidiP_wasgm{g_Zbz$k$9h)A<%I&yjESR3Te$VE>Sqc57VP{_7OIDk+^YyDk zU%1&L)E53db|^q6>cZ(V^CgN79sw(TSf%eRbz{!!G1o4Mll?3)RgrJ$e}+{%E9z8j zI5iT*M6%Z2R&T6G)l<6?mCd_ZtZV8?_qZdwb(E819gkH!Qj`4f9gb&t(nC2PLkZDn@ks*jp(HQVubVv~M+4zaJ8`ugW7 zi#hEcTbu*EOsY8?Kb9-8?dl8gKDIR@bB{^@EpvschK6Ip1e*s;+XR7F-MzZF|waqQ}YBL=xkHYu&mopN?_=iR@Hx*Uy776DR@ z&oR}P+i*AkaL3=Y$%ZcHCLK64wfb{Fa8ratyUrY+;N{_qA2PFa?cF+6V4b4I<7ArR$-0`(?K^IEy4^~kq2sgey_fGp zryMS64f0KX>8AhHieG=r4)N2i z8@!6`#m&6kRr78p+`jI#$;wt?vO}Eg#)#*cMQhA2mu^muzLXwtJy2U(v*X2$38I@` z>pm&H@r!L*<%M;#LJAYNZ2Xa>cw&`xuT~ISDff%I#4C@5)`f=l=1lbD63dUP?0(L> zf1bd_#h*5FudPaW^7+!%j&RoXQCn{+l&dlv;9%c5|I(p1KW9AY$o7q2{hxvLk1V^R z<(`>-^FqvR_!p#qDgIHoF174Y+xabM}n->VVd^FzP#L)>SWaK9OY$SbG2-e-DGZC>+mH{-$?+ZyL>HeFzF z_EwYB>m4TNzsxB&U0Y{ho;@{0G+cm1LwnML#ZzSteoXS5dSgz)G^<0Gr?uTVnlRbJ z*psivi|N^!^G`#iFFi|Lc-Qz$y}N0wWboRw$h7k+FYopy9-DAxnI!Y_R~$^Q8CfI3 zc9f_7x#bYCzT5C(MCAghWubD**CjD*y{`ARcxC5|m6t;EmxUEpELtEhek)e})4ogBAOH4$vi!rn%a8vqKmOal|J!`|w|4foYU;QA_|K5} z@!w^K3thK!cbyVHeEyM(s)yOedNcc#?ceHV{qqUF*?y^b@$L3k$-gA{!d7J)E@080 zqWovl(Z3rOEpME*<)Pq|%Ht{`*c6$5z ziyzWbXYY=AvVF@x8RMu8mfdlkN1smqxn$|-%z_Y;{k%z*iQ5|r{yq|EJhky2`&TY& zlg9PTb5o6+()xohsV%)w8FPTMwfS(o9#6At?27DS&)>ff3bGwNsk?O3_NE;(t_9a^ zJlSx7l|6Ie-S4fnhM7CHn27UoU1S>4aNqsLEJGVO4=O7ZHDEiXOw4>4+lxionlmp{a|l<{Ms>|O`Yb^4{U z7b`b;OmC`M@PMJY?a@!^3C#O_B}DG55<@!ouJN|MU#f~*(aSI(E+h4ae1`)*CJ!uQ`ytI^eG6@mV1kb$&5ji^|>`w&CxymAmiB{Z;M}5KXc%IH~>e z^R9(o?eBfGyW-hWC6%;m<|nHIho7?T*P3GA)3|ZF!_AekC5m2FtfJSg4_tW{W3{MB z^vSiJttU95wp`wl^+HH%X2xm$!o!{yHs;Rybn4@!pPyFqCe*JQO@uc}njxnTV`dPj5dRgAaWSn6B_-5zCjL7SM=gs(izWbrM z*PInU?{CRtJ-o+z^WAIb&n1~IP_NF};dbn;(v?rDk{VN^YjXA1Zj;&(W^w#m{B;9w zj|EGld!@@-LL{yWyg9i;RwnUdvrFl3jl2hv710OYOB75s9+%nhE0%a?h$TsyAy&b`X)p48T4 zZ=1FayLLZXmlesU#d+DW%KD6nUdOJ$*|&^hCVY(FtnurHOp?k1Y2D_E>Eg$OC3|Df z^1a`)OlwQTp&MFv*TwrQ@49+F?APNiCy`0lxh0*hhO+P6CMB}Ev`+jY@A|)Svu&lc z-|v-Ax@+&@y>khBOR*(`qK8D;`FD!PZnboqOf7VAVG~ZAd`oS6R`jH87k9?obtuwY z$!HzwDWwx-ZJx@Rp!0LlF`X99-KPr=?t zTV}OS$la><2e|Kau#2bCQX$+1(e^{nYaQ_Ujkw7BN>= zy_@v@n$qWTs|kl*9bEmNA$^hElb?D5uTxtto$dEf+#dK+zc(RZHOIE4+1yMA9+_@-eA!)eL_f`I)o+dm6Et}fGi%j~H)MO}D0dz@U2EEA zQs%hqoawm<>=(D^t#?}N@R@FSa zRUOu<^{4Q$T+gD_S(o+~O%CPC+jF{Muh#~>otKv+rFv(Ut>?`bc0V1&p4PX_^qjsy zMz>?uQun8RS!XZT1+yN~(SN|6eCPHxgfs`Xa1P%=^XmPb>Y|C^{J%`K0m8p zec4|4($c%)2_{W@oeyhsWF3&%(LeLo9nM{=<%Bu?M3{D&1Q&SfZP3-&SZBc1z`@en zb6G)ctrA1wiuZg!ZU=BC^FEo~f8ulVl5!h6kL(#YA56ViX(RAADfPuNrlniiuAe+` z^0&t-ZOuhVJMDfh5arq$@#*h_1#iE1l-_$V(OdiSu3{sT-tt}7b{~KCYwN8KW#NZJ zL}w=%9MbRNy88B;_nZi`o0|^`K4jX!P%3j)N4M93y*jnF`h?=KoreRiM@%T&JR@1o z@RHH8*^l*q+^*>+rP^KVfSW!l$#jlb7(pL$-vxn&7CoO=51VHyYWzbLsY5in!xS@ z&zA_8X1vZ>#d>$u;=6CAWqhqVxgfs3|Ud z@tQk)9tsT0p9QT+T5avi=fPc`kC5Y4)L8T-m|s{&-!3b9vYtudv>2yU(s`J9zYqP1^I+bg!v>y|1-(9WT5-t$kl*R_IAxu~{z! z%u*eES8bkk{k;fp@iN`LJ`$Uq7*<7?Y}Xabj}yGZ$2fJ_)sJTav~|OSHZ@&UFFEEK z^74uN?l&`ImLA-=u}@j?$hlKiv&yqCoAU37R4@EvEON1`**n``NpSXw4R7WqUs=@j zBYSy6#hc_k1#_3Cz6|QEpH;SK&vTE2HSYWsd;Y4p#u|Tb^?dzXx&HY#N8A4lDclQl zR_=QK&)UE+cVEnQ&!YAha}1=yF1jp#Sys6?LVY)T`ltGO&-h@m+xLuu*xqgMtvOl0 z+kV&icgDYa{ynzefzFUN_j|43Qg-azVu@c}Pw&R<@tvq0AA3o6w)^9#UOVF_J5?i+ zm5yxddh)s3@O`$A`F#(?kL6jm@{Mi3{_IFS&~V|y`phXwObvH!O75kxO)oW*>T%qb z#_N5-DlItVX54P>N4zN~%36#2C7Ty)x{*~N{iSaT)5d(>18Ww3ubG=MMQSd$G|Q7e zKYMB?ow(cfefe3jM(L+vYaZEaxyMSJiRxl^+U74gW9CcV!p;dk-6vO^o*BrX$eVSS zf9}H=rGryTp0VV=ij6lq%(_-@k<_WFq0ALGLnpXDe{@Z zm-yZs{PsuL@J7R}A3}HC6qkH>_A@42XodLM{laQf&qx}_3i8|%)J>{R`L?d)%dhf@ zPwJl4Y7Fyl{c{14mu$BYVVeHbNbOyVZq@DAl)a$VnP z9(Tdf=cneY@%t`N`Ph}A#^$|x-5Igsp#I2=-7eyX9&GVB)osc*bFECR`OFW&FOC1+ z>-aq((PWK=)t$`id)SY+Mq}AMO{uHsrm#FoeO!FN3@NwT#r>xKFP(br|qn$l^>}R{&cxt0(-nwr}OHFb;9|=oM5}KWHxYKo(dSw_e?Jx-C&>HQPIn7PFO_7lh(lm>gX@_iS=iFP>nW*7bh3rlQZ3(4gsY z>GLn2IFhEbDAIU+{29mC2afy-*2b4+G)3-e-t%g@QgCjp#0=|at88As7r!=rdA{0` zK#iydtJ7z%3A#L7er?`_$CX8WQ=9Ia$fj+0*HW9L#1VJ;o^!IC(NeFew&8bL>hJwE zdSc&msM~CZ=59&e?-es2ta|O0w=VIy+c(u?AG@`EW_fAVH$72!ZEUmTQ?6F(f0bQqt;uor zP0{J&SE7tw>@!wqYWlj?q+`Ag!-jbE4w2JY2Uc(I?08$Sc-FM`IVoB{>Jt=h3Y3*A zyX`vT@L996wQFDF<2~ybE_(OzhQ@}ccRbav>anazoxQze=jtcRduDd2h9@vZ7K>Kt zZ~C>mtL>0V`j?r$ehQJZk7tO_^%rj9{dMTX(@Tq{@q|vh8@))d->I}De2z_H-tMCOJ==aUHiJjL?E;8+3RV&k5BWnURZVf{$HOv zALdQ{F?C&az^?sL+uAoSsVO~{v_EFTp;-nyUK$uIo^9@SdP-VJ!HmH9SIUi}%uKy6 z?oenjQm~4R5T5k#u+q^>IZvmpYBVa>=6U_H`Tdg*>lBagJh?qA-h#hTbi$(i`YM$< zoa>{m&bZL1FP0OKwMFj%>$1qF!ApPn)R}pBPEK9LJWtsq>%01dHK~`>%({AIy5%~z z`!3ZuaCn7deu}T`uI{HAPegQ2Y+ly7Kr-NJ{EqJE3#Msvlk`JhZ~feO=B)*DlW^VS z4BzwiMe@Oa*I&L?yJU&#+y~NrU+V&Mi=zYM3kH?8UxpO})-rg@emJtlh#h z?Qv9E-Y8pPRL4JWV=nQGCrzChoP& z?(A!Nya8eRD^p%rh&+CA`tUiku1lY?qrHP)sPab6I}(%$cD)NT zST4jrQ_ntT5}odTDQe-g9JXhl)~NoSI_tDedB?q*v8%G~T3RpdU{5kH&iJ$DhSmk+&(2NPi%DNxt8jR0!zJ!JW*1ps^Bs^`6w@Tx6c?K6 z!(I`nm4eRL)&j z%E`tT%e=-nMC0k@mYSn1J6XBjePgfsXj&duY5JdmTWQV{wchxCOMicB;oZCUEM9zC z%+E&mLre71xVSg5O8*&hxlg3$TD|GnoAcPA<45;XcDKnJWp13+)a}~B@II4YCC>ZJ z>FL@p!{#@&)IVHfDqwxL+9&C*gWKzskE#y7Wr&k63}2|%J0T-;@5S}uTl^0nz1ctg z+~!AyWg;@OEcr|nS=yA^_QooPc4j^Hdh@lL@z-tMrX4%i%ZcZG$`5Vx{+tjR@;+^j zZIS;QC9>%+uU5@Ua9&cH}bd9g)#;Wvhmw)9~{x#q8Z}z=<-}m;*zR$m0 zeg5U%=U?u9hD#(}I(5_ck@3N-NLR^CMf*?Abty1qo^)mKd)19s5|;vS~}o$_6`u7a>fC3m?Wg z@3Pu&-WFjZF}b}wCZx1&+b{9WCYNj6G^cI4eCE-zaE1lS`-_5_W_(@}C1R$rSVAuK zL9`5OR;u~J&?{%X)_u5_9+mYlCFAp&FeOplN1+m>Vm5XH<{rw?A^HoSy_dhycXx+u z;h97KJbRw}IWpboQplTQ7RM&N{AqXTpZufv!+*Sg)OXhNf7E~YPxX)ek^SvIrhoX) zAXq2=C}A~Y?6zBK8+7lgcHZqMKIfsafIZmh(b9U33!ZKJ6XwsDuJ&fi-KRh12;B4d zm3grHvSlal;9gX*wHy z^t86Vh{m6jf6MB9zt6u~`}}Ks<=^mo^`Tff9-9m6ZIl>G_?3;>c5ROOoo(DGx8Vy% ztTPKo#4o1vMy1hnF+3jhu^7onez4Wg$|30g)oPRI$Kagr@c9zX6qMr?vL{P z24P;Cmkx<{P>Mzs2$Y!3oFq8GQ&>uE4`P%o=?CZYwzYR_o+*VU)_4|e3 zeB1Yo#?Ne@{;u5jnQzba{a4Tb+f^TG@M`utqxm0=H98cdRxyS4KB)EazP6UZ{FwO^ zom-|g-ON%&)292GBwUwba$K$0tf;Vd>6NR>%(9!;*r%~2-Q~Jl(Om7u`cPHcHi=us zs9`Phfz3wCuE_=Y|K2P8X1?K(bGe#V-n=zCxNy4QK7^yO>W@FgxWwuzIg zx}U~ z(QHPM?6f^vCWQekmwz$dQa30zZU0p(|548KL{Fco;4H&vOZ{1?Rt(MURk6w@2X^x> zmfNe$&71Xm!i%k(?8af!c*^u6>JBn|yEnyZL!JrKm4*+uI9B9s{4&*aVxyF)^w z4}Cwe+1m*eD9ybg^<`SfQ>(@2r=+daS=E!2pvl*|Ztb5HI~r0=H*Zl~H0k2z%c44W z+LgYBxCZMpoSjsAVxdp$jk??4Uuvz9JbwC;UiDt3WoxHrZV!s}%}SJY3U`WJAG<;YL?FoHRI`zo}(XBo; z86Q?OuQs+Z6*#;{%X!6;1fC z`oHyV^V(&2w2!=f^f%#L`qc;eUl#g`3ZGO?_S(7jTGhqE9`$vM3i!@*Wd9_3`H!wycLu`DG?v;hj1q zX{vFbZoHQjP5b(3&Auf&z9>$5wO@u(3zq2KxpSd=cgy{Y z>&mWlE!LQ=vCF+)Ghw}gV`5vvGzpgjaRm!k9#fEh{#n2vZ`nzv6;*N@h0IxxvVB-{ zX}Kxi!o`Q3iF%J< zezemk>%%P@-`+j;cj*?k_9?MaY72OGyP5GjuJhZO?)lJg?d_-HVcemm_c9I`1g(AS z?6mRE3Mbzb?zOE4u8UWPoNr>Eu=SPq=McUZy-P$t{e`UQ`o;UVf6Hej+us7p5mk4y z7jc;c`gt!l)HMFFYnR^d{n_PWH}0lNK2q;>H7|HyHS=Y_Vm%&4M^?V1)&*OxZjih7 z;B>{k4Z6)sL+uRry;~L`btCDf>p`A2iu)<@G~ zn&X6@S-7s6U~0YkK;gA4zwHyw7l!Roh)-R}n9JF7^Nq`+7thyhX*ny<&sx#=)=+$@ zQ}63XH4>byVz%FZ@t@+@9X@GBL26p5_Ghs&!HdC{4Ckh=_&qs)<-ccg&veUI_N3^v zs=k}6)4D?A^G;v=26YfOcvU8jITRh$^_}M!D+Fa*jEEhvQ zaw^8$`?_WQPwu8x<+(*ePG zZ_dXUibQE$5q0@(ug7-e==4DEm640@ZtuA`Lu~QHO)~E|GfFpGZ>+xDviIzs8&4li zh<^XlI(Zj+QecV8ni%~x7c-ujX9X_%W}Q8=>5d8ewnWDIu&h`Hmji+CIo7f{f7Je> zv3%ld12zBYGeiTW6)KiD-V5XX$9Xy2^n8Totb;s!}r#_<+tk! zdZ4&=#l9o?Z$D~o@a`55dC9PC)wy}akL^C=Kp&R%d^%;uAXI$GpquNuZQP7YKQ3{5 z9Cp1ot7cKqg}NQPi}n>fh)>V0S-s^je|Ypg&9HA9x^@&j?Fw-{5SaU1$8q(7hcAk= z=Nzch(!MQyaEk_acc{G&%56J;hn4achhzDwhO<5p9^s<-W{&-(OI`|>4UvC@631b z?)T03obc6b!NLVc)GvB$eLMBB-rrS0Jjw!>-f!HzdPeZ%xf{)*f6Pjs8KP^*a+m)B zlL)iGKleSs_F3|0S||7}jM^S>q5luh3AKgyA|8gUk1#o4Gvj-6_A~cMA6sXgm-N>C z*nL&b;O~>|?K*#-ANcqD)W1h8rMioSo-N?L7CU*}i3?vZmBx8qtyB+uGB#QF9(!!{&3*cxVWP>OHB;|z7f9nPS@z(9TCd~chdReor^UO^*&4!~ z-KM?tn9JL(o0Q77$_oFMYE7G$@%+8f583E?o>RrIU8k77H9b1lW0or4s#i{dd5Y^J zqunkUJHvZLL`Pcnkec<=` zS8AVsmB-4tR{L;ER=0lU$uQ9zvy9sY%Aby>pK0B>eb3FGll}%D%UIc)XY$XZ?p}SB z!1CEkH2!Q1$#}0jtuW)<+J6ru7Vg@ctl*%VA11%M!FEdUo%xqr<7a=>I8c+gXV2rm zH$O`L)%+;=NkYr)YR=(*Vm0jkiwtGst1VdycLB;j+`b63)iNd|?EYL=l6 z?$4}N+RQK%@*%u#8 z_In0xK*k;I) zabb4r#0`0W6_!~Xm}})5zf|Hv=<+qIrp{xtJau$on#s{;0;d_1!yjtPo;|jKbbgRL_ciVB3qq?( z`~AE6l?&3YUN&$Q)DfFL%WlGg?G*=)ow=QHR6yc|eaYgNyh`0g`?ud??C*bbXe>bJyG7Zb0RH@gQHEqgY7ONP_xHJj#y zS!j#@>R?pc#$)_(hxk(l-RSG>8T^OB+|@UW96OP>$oxl(+6S)UV>_k_@~)2Yjo9sA zqQ&lHn(Dak^G9uw0xemk?mhV|vJE0y%WkidoM#-A-o#xar;x<6MX%Z6WznpPwu5Zk zaTAm$Pv~JT-IL^;alxQpH2!n)r~5_v`l3IzcL(n*ebnsTJlk>ePoFhTBC{5TPZLg= zR#}@NYO2k`C%&k0+40kh&N{JJsaBZ(Xmv-%m z#+wH$jbHPB`Vjy8)xKx(7ymOfez>b<67pf|SG6=2ju@@g#~vxQYH{_xKkS*Bcfl%W zZrL0Ife)J7eUB=1oPP9}e|GYLx}c?J<}h=H%Dxw7cod~7=r~7v+EXFfqHd!rR?jA0 zSv_6*;l94KQxUy_%?zg#*QEx{$^NU#T+eg(XX;(1*Vq5foBGYa=aFFYt^FA?OLFe^ z1Y4d~JHF+z&+qPIF&o`)=|!pVn(Nzn#!ifj(;(~W%x_+>!LHi zj!o^kvLTBlR$i-X?Yy;js<*vqN@CW{%3fg+c;(?Vi{uj%e4ku>SFA6)aNgwDD52;z zr#QGTb_T2oPILagbLm5qW0ITKab-3yUt{+1j@Y)t&Jq67-)}IoRytg$eBT)nb6B@@ zg?L{2_1lm6Z)|Z3D4*X^Qz6{E_vxPOB`ae)mM~oqU2o-3n^vwFYtY`K$YsaL{-I$- z<1CHTE0-R0m9Fsp&v173KKUYfWs6h`MyY)zKPGSnZ1CISAK9YJx#_UOyZhe*nsZav zEMY&pSoig{o@6_LrT_u6H9@UQWP2*h1-4fFoN7Gdceae|8~0-djK-6#wl*D2`fxJpOW)Ow z3#m^ZUtD8aH|_N0lD6nNzd8xCA5a9si!FE z?j^hRUKz*y=ZM(e=i9LQP4wET(#tV!4-TdrdtF?o8rNJID4^_RK5yS-4yW?UH6omJK{y&8XJM~ZLKtu(76`QFPjB;t0?x-fY`ijBmaxiYW4 zw*+LY)lz*e$jU0QoAc8x(cNF8Mg~zHH(pbMM7b8fzEUx{K&Wby!L4Na>5z zdp6_A<~?qY!VHSD;!39fDfryzo?sAiIc$!BOxTP|x@Jo^tAt+d{NumnpYW}E&bRh0 z-{v2x_J3%*_}BX_af{3v4U!}B>daTa)q1-4>#E(6)x|U2XD0G(xq7JQka*?RT1Bs) zGk2|?HhaeOm(Ls=WxUg5EQ{wZa!m zpIF%w`Q+X0uuzfY-o>w0e&9@ak@ej7`V@{U+I*XC+DNb+ODf$Lcsuam$G+I0j*i2o zu~T}}wmjokK9E>_Dr#GU-FZ3nb*)QhoL|CH>vF|JKm6DYJyD4z-q+^KKK&Z^vW|u4 z@S)bVlh>?n&G!@DzUEM9?fJ^H&*y#qoxbPa&G+`3s?Wcl_pw7b`|*sFU-RFey13x} z(=+?0pA!2cH}OaR5j*9N(*O89KgwO!KloC9#vkVg^E3XOf21C-KZW5(t@^p&?&(k8 zvRrFjSzFk-)`)Rx^0B&##;KowINk5RR1?4b*S*T;^D3XutJ<>KnZ4D^L{O*tc;DU~ zynCK4e{qiYhy2~T4<0iT+tvQ1In!OV_<(oVJZ$xH2Gq;_*mb+FJ8qvmcY$F4Q&`QHRO9`@R{%iS}?V6xu+#XQY^lKbpE9n|fg zeFoi!8oy@?)6XRR0EN5#XZ|VG^WUoJ-}2-9qnh(ue$LPQF#kwh{6{p8HNEgl*@hHk4g`S;D zueT`GwmQH0z;(Tazip*!;48oUxrv+`^H!}`aY9U3E5wXj?)S0PH$=1fjH0z(%qnFL z+xAxf=0zX2=Q{;6R@~4wyPdmWf!ftue_ozFR^D|wQ^YshBz52Z6AR3rp4HZ$leA-9 z?rfWkuzjzYBc!H&>|LoVeSX?Uix{;DQhhs)Jj>J8kD8_+mXm1FvEWBicFfHi76oZP zdOZ^~xevbN;5w(sRl1aOz4V#w!KIU4uRYQ&V&hAaq-oJNKn{Y7R`ET6JAHOUvM_!#&d@?~aTj=e^Bm%FS^fUzv|vUP&&!Wj%qysz@nYqcf{WquB2PDbz4`XbYcYBMu4nQeHb30u zbauLCspqE7XCG%t{qop(nm@;>a_)rd(~rHkeVV`$xb`jI#iYQBxpn%vsgb)5Z`kr>)2G@!&u)IQI&E|FqiWPfiHmw$yyB)t zU)TMsSEYZ!ujG*N8b8C1j#US2#BFb{22*cyY2b-lKSjbVXo=Y&LQtwUtZ2lT_}06A)aq?@$wXzVn(e!K3Db3dRwb~qVD~e zvNa_`@cpHP>Bmf~e`RXv&h<^OpWv+Zg=`HT?5UneXEWS4X z873$!`=dN{GJk)Vw4u3x6#HsBQTEo{7gNsHCLVEPbl6_FHq^>}>9PWbsUn$szPA6` zen-`Yr!+(F!kuGcv-0~=brsJp%*lJ8{LO96rRRZ9N)MkFpLxbLl}~s2x8|#vOm!7X zN6s$!l)S>#Mr#GvhXdDT%pKI)9a=K|eP_4_+rq0h zhmQqSwCk@cvvOd*a7cPj=u7#vTi1CdA9~WTC+*~(N{hWFQyh+e$}U}-e9rt@+KQY0 zMnR`JY(DMpQWou+afjFZ=I3WgO(_pc`!DqT)T@7#ez2tH*jJI(eM>~nE31i!&P$$h z?BKiFrSS%xMcT0@Q|{^Jh-{p-SKDnPhh%8|Cj05z;zf)eE`Ik=FE`OhGpoec=GWn; zsk#LWX`h*8BaF)ZllJ6$Pd9Hqd063U-|M3*vtm==)9;s;tQA*XV17+Cyu;6QTEgO} z?~cc|ZMNUSHF2}*)a?0Bj(P8itz5zJ-eG3)G5e1@cSQ^Q3=H(Ix~6~6Sm9%L+k>>C z(9gm}(NceQI#=DFqIk5R;rb>sxe^n#y;go!+EXo_MObaOs1MlqWxIxn>hU>8&I)f| zb6Q$2oBRBlC1$4ccwY2;FPrt&!)%?LS<9pirWbf0Y&#YubHt=P?ON`0U6W3(xa@kP z6x)?ot^O%|);joUgZ2Vb&!l&^w)AZ`^*?id%EK=!gO++t)e67(GyjOsGKL)$Q{5vO zR_$TlE%={dk8tK<^NWo-2|ZW0r9BPx`5>dKwa&cBh9!qVAhu%1^9inNulb9A*<5@* zaM_6$v%LBfryo7|C_STO;kNk^*N;_9WLogMv;P<$;{wA+iQ#wBHWhTH8ONmjS*R)@ zm;Z9tkIoN&5>|e*ZCPL&`Fh3*J#LfI^STRNf9(2}V6u;P6^EpYbbhcrCngA@Sn%Ml|0QZ!>yk5cDSq(2Nncme)_NZr~mpt{kQzne+Gn17`stGkd2Gy$@NSNvmW&I z-hFZ;P{&FsSGUVeszH0=>evJcu9w2iuM$5rHeLz18u^;xPS+`Z!=Tn(KVLuJQn!$A zVa1o859eBc9GkIgZ{N@E!?T(WPLpntSgCb*eW(5p3DMH%p9i`&t=4!xS!ct62ig6% z&t=&MUV2_$t7s^;CYJlt@rn+mY0qar(t93buwcRI)ohMC*a!m`3**l(S>hiiae-&b@e0>#)34uQi*zcP@<~HdN_tO>%rYY< z&5&#F1^hF=%|BJU{L}o*Kg(~`YhrK~887^uxUt#b;-YlLBZp^NTNr$2VY=*J6WHB; zyJ2g7UT2+w!5gKU)4ehyr~VH5Hbu6b;q=r`t>;U6R!ntkK9p=9w3Rn-(fPErg+l+f zJYWB1tI+1@tBw{v72R;4-C@Sz^#**4c5ydHT))NB*y-c7%cSOT^_n^R*5*9#aG5OY zTpk`T(S3{I*v81^Qx0U<)I2s)EoA#~V6pFuV^?$E>iDf;C^3vPnELwSr1x)DRve33 zw|e&*R}aB2RjtepZ&~(U4sN`7JY&C)?uMJvKQcKbR#f`6cjgHD~xIyVf9m@%u=UEeIJjY#U!p)q8n!e8$ zbm=+sFE2hNZ?$%{-=^M)r&+T~uRdbny0xr*jv|jOQ;D=}ex*aq!51HnuaUN4k9IjW zv9tJ)s`Jh{FXe8W-K--$bLpa{c(z?H4qogH%(?ivW7hY#%lY?+eo7RKviXsgpt!SJ zP4dk_jb~fGn-}usOXq~{o0utLzrAtbu+Q)1tyZx~v#?DmO_1vz{OL+8D zLgS8bx#%N4t;wOi{KDsKm5xea7XPw`b%Bf0z7qIpvtQ=VA>O8Dp=8v@xz1dmt=KENAmPFC$aYcp9>#$4w+vVMh8>=-wfl${LvDwd*p0|* zZ+jJ(a}Dlo5R7^;&2;Jae-93IGB@UbIz3}?#IcjN4UTM#i;Y+oxyie2*8VfuyM?Fp zHSgPb$&}ah-9lbz8I!D{?7(ZXM~rs=7OZt&rXiYd=FT@Q>_yS+FM0~!Pkmb#ncVlE zp+XPt^Zpn)QT% zZt^U-*6IIoM)w)Tyz37R@b40}`*5jqqO|a5O*3y-i&@KcJN`5DulqeC>+na;)I(Y3 zTpWw9D0QgD9Zh~OnQ+zcq=br_ia$7bYOO$jC44;&o@t_@oyfkzPzGZAkj_Z{Djc5-N!yV&HG@nF175k$ApguMb>o8j#I7icof2~ysmNE zhNJI`gl?J^9@*{`Y$Wr^=<$|KQyz6Lxg+sV>%&2>%R6RnUFUb#LQ=al?0LWB*~6L> z*713~x|%O=TYXjAvXd?AIs@BJoT)S0*wnGI*=)yc>1V1Dxe7cB-*(Px*zU6V@4WeM ze12yL_SF}wwi~+y7J3ScZTm8%d%5d_$ETvSGPIM!pYtqK?YQRnR)8z|#W%ACuEb+P zAEx#enw(865L)s1dfmjN4QDw^?mx23UOZ3#tC7&g3bmCXKh?BWUi8?^Snj>+*1}Mi z&|`Z9bTb|%RUW(ZLGC}p$+!iHxnZe?_?b5SQP{ZSP{2c}>qc`lwSHTERhm5^%=`AT zOA{ExQrBLew_$d|4SW8WBVkgLZpHQA<1JUX%((uZ)-LIn)wK^Mm8xvH+q!C}^u4rEN^xU%Fn=iH>pl;%pUs@A_KT`!(kd zZ3$Q3^q*n*rF|b?7#2u1h~AZnliHkK)oyg;x+$~s(ycFa@Rhb}6rW zoFem+c7YPHSK`ZsZmnTE5U$|dvG7|LgOTQ;#}-eyKUmCoXnl{7UDGgDmH*+yoalc`->)E*r_Is|kT6}oDHzqdt+=}##8TU%oe(2`8tG4v#50xcaT8n-y zJofpL!V$Lc;uWvz5+ws;wg+xs&HSJtPi>c3bN)1=EPj<@t(hyg@I`vYR%hHl^?J*y zV;gv5lLWrzoY}ccFlx)sds+o2{TAvk-10(g?|+8F*K5zHT}b?R+A{uZU&qfY7g9M4 zTurY(UXsQ&b92_^RbEYd+Gech|CV_3w_xgvrklre zjO!+CTc_;I{*;@!w;;N!^J-<3dgFG>W@XdDDE`XzItwp!>*uI0e9X3^P>QX5gWvrf zHw7F2Ju%p)tQYFOM*qdGTcN*C#c>P1Zi!x(_qFM`SobtVf%0ieBKICUXza~eyh-13 zQD|O8Z@h`(u??-+X}AA9h);~#W~&#}*uTMhv8{2?3x;!rpQlfKUFTo#G4DOoWKVbA zx;rHku9~v0-xFKJx{7VnqJQmT&rhEUU{$iZ*Y9Mimpr@j@6+o>%t{LT*-yW?cJD`% z$m5$b2R^Ox)zMt<2{~(J|MKO3A74skQ_0b3kC`X5Y({C(eS_cr9=x`0ksj(HkqL%B zdwQN_aF`VDd$N8rUxV+q%_Rpcc4-(tGBk8qu_?mqiou6jVI15yvP6&EJJqzeck0jO zL8(UjbS4!AmZr^UKfftJ-O=UzhSv4}8D<^7%O#rSm~AX^_4&#-RY%sQx-b76@O#qR ztl*vl7f=0e+ZtFN{q;xcbZ%dV>juBRG@tuDfAt2X%}lSOvb2&x{n>blsuY^@^Y0%#7lUFSo*jS6nZ>R`Q7Z>Xz~j^&|fo zgdf#+emsBV$NEP#;UDePfAsB{b~~%vcnt$<<8~Wox3dA(ch_HT)N)_R_3N(bYomVM zJ)v9nM))pQckJ42lNJ1B?_N2HTSpt{LfJN`QPW~f1jWKeSZG;`S$Pa>hIP3 zXV?Rg_^44Kg~4qtvWvTz6i5)ORgC^`Bu4p{>Wf-bplVY}i@F`2Mr7 zQdyyL=} zUt6^c6L$tkoY9}bR-(MbRJ^}YODgw~)b`cW#MHbFxGcQ%&HISAw@27xGl7#0(N~_& zUCL<`|HRw#`j@5C>Qxeiuk-yDDEZ#KWk<&AZcVkU+4lswW3%$}mb=O6E%KfsX0zyd z+Y|?ZoNq^$eP>*4>*`nD`sW^-8}9?tXCL#I3;s>MSFicre#-axr>f6CwSE3+-shkG zm4BA+`KNp@k#iZ>;ixa&T7j=rHtpTL^xk@`^{jRRcyz}-+c3!V^>dV|UjGJ!g%kX-372o2J3!WCV zZcBo7{*1#6no->A4$V$rIXS~GYIVjQU-93ot80Ed5;@J*8=|o%rm|MkQAqaknY0~- zYxt#&R@@D)Etw&b!4u2dwfEo(+XH3`lRnvW=srm5XSQl9jxlF?Y^N~$_9?>M3wK|ROb=uGY~W;WvR5f@gTHL;vMI`Zx|dX!cQJ|0 zT4TpKAt=q^)V#?>i|*?mJ<#FS?*X7br}N;S_~r_X5W8?n2WP3ryJgxF2$OA_n&&ueN z8%CqUEVuJ7SI&D|c-FwGR&9U#mjh9br_Db;|FG~^#T&lq*RwzG_?*=<_mQx0S$oE< zXm!RtE4o{A@%M$8mIoNTl?MpgT<5>rjV5v6nMF&_;@vH87&oM zTTrVy{~@U125QGHKl5U4ngAnfwauHyYxY)bmvU>>D{wXxOIBH6`uc#lK&OIfW($Mz zhRX-fXl>ko>d}|*ZX55=Joe1s+y;X?(4Ygeqi}am}8fEO|=W2am9CojnE#spglr+warWzRZ01 zT0lVR?XNRdoKL;($OY@KQ@flo-|zCHpUy8o|4o!lwAL|RFQ$BTYU&wPUWU8Ug`ATl zPWC?+_7&KAe*eQ+M#+obpW8Xrr?pi3X8nt=`TMMY&T@`-WmtFk=Cjf?`IQTVi?`i6 zCgdB~C40!G&E!nc!P|y@i>kakU#&9q=i9}0>)?v4S6qBNMQyH*S1)D@mMhKlReNyw zWXzl9cU`Z-O!sTwZlCJ2wkyOk^H_0;lxUILW!3qTllz5@)`@JsvF1NRqlhB!w9+-f zx7prKU(lXYS?=UE{is8Ufm+9V?Z0*1Z~V1um-*(4u3fa%Y46hb>Qw19CVJhkxxXby z1+x8T2x`c>sbL!}UVO$#8VO?<7nK??kSPVP1 zL|$Rgc=2#XZ>@V^HG!}Y(GxtI2<~i>A-7Pvh zZY0OtjnXvO?eu9y%<{Um$z9f8SH9x-vn55jo2%44-QPm#%IoqfxuDfEyEX2rw{6-t zgDY-kwj}ehq==Ba*N@K#kjY%KS2o+Wr1{_cNl)7^KmT?3nn+0qPnFM-;DS9)N(=|2 zy`*lWWmkSaviW|%?Pa^?`>ESc{3os#v*VHflS18pcU!bxpV`k5v%qbEi1quIMpIsz zTu9%)Wbv&tR(|IU`LolFa* zZtZ<<<=tq}bBclY0>90Fh6eFt&!SUyuV~+GRZ@9y?-VhEt6O#~DD7Re+dFjg-+9e% zTw~`jUEmJAF-N;ggeiIIp_hD*I1V0>zM8&g!yn%8bn9H9)2Sh6lP^WEG%##VtuK7{ zkTdkVJG0T7)E3*vvsSmADT&%ASUGdktJljtPQJQvHS_W@RguEZES`z$t0vuyd2MuU z4L{f1tK20yq19(hnxhZqTsA!9tADk>Tf*zK)LY%INtad!exIWLDly;aQrAnDWc@h` zWqM8%wCyW{r@Zh+z)|}HSM>rscPxv*ZobZT^V*bC`EpXjdwVs?yBRDlAZ~- ze^Tz`$*1bpAc`*rTuJ)IR_cGWJs+(vhP>d z?Hk%0@n)izvMm05e)8UyEnHRkX!4sgX7A!NU3N|ho3`3@Psz#E;hv+54!ztK{b5V7 z$**S@ZL3}EcP32Qcwb&GE$xJIaB0mWu1oKYlAX4^7CR9pm;J*3P5L+EUz~rB{CiYi z$dox z+*2Rky6K|yV6kbw+3T;*Wo#Nv7`$I;NIDsuTFBMCI_SWaYr+@iFT0W;v+M7I2MGbW zU*{{ow{yQ&)4%73eB}qb&kt&!ANYN~@%wyc@F9Ktd)9QaG4mchKSAQc!S(0*C(Mef zUV2#ftGP0hWp`Xdc)W&80#B&kt!uwuvb8R<5j^#m_uuo91E)S1v&?IfYB${@pT7XY1j;uSx{2s(Q2a z_X!8>Wn8x3#wDR}>C3mKq1#WsWw@HfUflQZgGBYdbym(--L_0QF1|+5b9UaUc>hf; z<{lN##Adhp+s}CwJLA&6r>E4G&g8bTS*Xuyt-kMLx`)%cYxe|CoUnTJ_wkG=nlrtl z_9ofJHNH4)Vs@PIqJ&S$t5|J)zcbT|bRX^FU8XcAfiEL&OL*MGw?{0Cy<9&Fio9Tm zFne+6Ghb!t@@w;>YBRq=sbyRY+EFa^f{r?}D_*bJ5T5%}o{h=#f^nMVt*pPIlIg6O z<+o4925c2u8+w09`GO_>T0YuO*fT!nrD>RI`sUgG++>z@H*R(B_nEncuid#)ZOS&8 zA4{`Z7rJro`ZDQ%`BAOg^V;tIQPj?Odf#iI(U zi>??fy&^EpP+`{Hl3UTUyw)i^c+j!7%qDfu0z>Z;>pH&8xusb4+{53Iqe}i1@9)(K zddP3Bivqba`#-M#X61TIT2_*XRwr!q$YRZK#ffe1$kA=$^XnoMAn0;pB z+O@$;^VXm3;pV&8zd4-m3&-iQU7`gc3w@23$QCXx>Gz!BvwLSY%Yq*>tkciVKT{f~ z_T^eyyTG?}-`J-o6LRia9Nc;ea`BuOlxh&$8gr^AWKmF{rbdIwN|z;!ONBaJx7aLg zdEqe2tE986VU5@8pgD3ubG!;!wK^Qwo?0}_@>1aO`jr-cx#IAPTJvA|@(ceR|JOC8 zzW?xt{|t-vZPg0DwA5=#t)2WFJLh+uTJjI$|D5{I!1bSj`#*!$e}>TdrT-cBKiyFW zazgx@^~;Zbp4a)0)$2dQ>-q1L|1+HUnJ53#&VA08^Sl2uu>NQGH2(3Qi&!u@u zX;WvBwxh!}-;Hhx)xHlhDrQ?JE$R$BTx_0Qa(8A6n~+2C)PSifpZYG{itMTS&oHl% zMZh!c@2#yVVO9D685DhZxWlfnZP)#wxK?(m?2rEp5{tT2emk}u-7UH_b5Ff=n(2jD z4N2!To!kd3j`wa_9}=G2k+nQ!;bR%ynY9h;-mY44r(veU_PepyR)){es9AT6B}4z% zwo^CHteG_XliAv>WhehEYcTK*tzCJqah{}72G^>%PZu0r9qMQ$-Sm3X@>|5@4B0d+k-8t@#ZIgMVtWR zoXq8wI~LqX=vZKMvnp=VqGJv&`BQ#HnWetOpNFYDCS&{Q7!xM z)GLk2n++U19rw?jvG?Hxr@VqgObwg7SAVYmnf{+ax_`O6^NarsN55~F*Z8YS{hykA N_$xpApYi{10sv>IqMQH# literal 0 HcmV?d00001 diff --git a/docs/public/2wUZNWk.png b/docs/public/2wUZNWk.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e5355a4c33fff6f6a6012b814a4901e2f0fa8c GIT binary patch literal 7734 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 literal 0 HcmV?d00001 diff --git a/docs/public/3RrSjzW.png b/docs/public/3RrSjzW.png new file mode 100644 index 0000000000000000000000000000000000000000..af17f0c759103f2318105529d396976867ded790 GIT binary patch literal 10544 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 M)78&qol`;+0I8P>TmS$7 literal 0 HcmV?d00001 diff --git a/docs/public/4wjJzBU.png b/docs/public/4wjJzBU.png new file mode 100644 index 0000000000000000000000000000000000000000..c152bc0a236fbadaa239027cf9cdc94269110ca3 GIT binary patch literal 4051 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≦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

#^{@(=Ur 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

?5^YlKDg|4j*=68P^t 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 B5iS4# literal 0 HcmV?d00001 diff --git a/docs/public/AvXZShD.jpg b/docs/public/AvXZShD.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc7272e1d6703715d27c765771fb306c29d4ab59 GIT binary patch literal 94653 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

e+6Hn1(oqOJMZ6V9z@~$cI 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 literal 0 HcmV?d00001 diff --git a/docs/public/BmAvoUC.png b/docs/public/BmAvoUC.png new file mode 100644 index 0000000000000000000000000000000000000000..f44fd1ce5c3d903fffcbb5915ac382fff20de249 GIT binary patch literal 17960 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 z z9Wl}E2Y6>QCOnnY)#5vEn7TPcy#0Bl&1^>WL}LV6xGB7?$=ibK2)kpA0J=O5eu@l- od*cs<%yMS|dGx~@8hD=kXKrYJ5UQr4wh5%))78&qol`;+0H9!WPyhe` literal 0 HcmV?d00001 diff --git a/docs/public/Bu4mk9m.png b/docs/public/Bu4mk9m.png new file mode 100644 index 0000000000000000000000000000000000000000..e80e6b751ea1113e0b641c96500dc00745d2a36d GIT binary patch literal 3447 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 literal 0 HcmV?d00001 diff --git a/docs/public/CWYmsk8.png b/docs/public/CWYmsk8.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1f186cef8bd9aff408e1b3dd9cb833c0763fb2 GIT binary patch literal 31676 zcmeAS@N?(olHy`uVBq!ia0y~yV76mmU^3xgW?*1={gcOnfq|JJz$e62Oj^mn%#Mps zw60|WH@|3pY2&juUw8$@71i{31jN|61vq&{IC+G07q}>>>hK7Na`TC@^9b+?h}Aat zi%Kf;3rWbUXp2ZF=*@Rw=MgfqcH$M35D=2&6BHK}mJ$$^scGsH5|&$gBG_$j?b=8^SP}R^~-PrrBF)chcO-4~eUB~!?`!o$n6~B;J zPycWkQ8`ULGiT2rF%jvfuRs5Ym=_$GC?&5ZFD{>vUuo~+`zLYnC!ZPOGRhV8T_3%s z|BhdzYh?K~Xts)`K|y7Uikkkn&^b!tia(h9`IjMoNmxe(|4GTHF5M*;`u$ zy~i&<7FV|=q!lCAG>E~r|zX3O7{CDsle+EeY_m5oxe3Z~3jSX$R9EGGLq zcA>huLI2db?_H)u#b?GO=0s}RBxV$88(8EN)`qBCDyi%1NUN!78TqT4hsLBFJbo@N zCD+u-F)g>uK+D8i)zsL+QCq`k?dDzjGV1QWq2_YhTXr4Xec*U2j7vA}n`xU_$?IId``BqkSge-qz9XmdiffAu-M8;OeCz(RL~Z+@u?xE= z&Rn^EdvnLc{F1u!S8rR-@;!R$l8uwM-46e{=B`XVXYI*$5+XA8x>iLM_4l5<&eeC_ zwBvxQcW^~rYnrZ8qM7Hvw578aEN}0f=Av&KVd82iqoF(7v7xo+%%$t|maHzd33}@| zdHUQX-UbfoR=%}%p@BwDB~^`|zkSWK@;8~|maOAA**5l=d+j{?lwZGp?{+I&?v!O< zYU66-zJBYTjm`znU%aeo>^Se$eC5`Ix9>jOa_i_Y56#RkyB*XWX76jg#IN4ezr!iU z&e=yyU-6mOgmNSA(2Z&DV`e@Lo2-^(EFYj_yVl!&X|R=!MaaTv;|1>5-rP3sbg4Pq zsa<8I7;B{0WdF4>t+9E+#%+7kca?9vwL>-C+}hNk|IBRdTDwWX?i+6J@Xm}bICzoIjDdlHv%n*=n1O*?7=#%aX3ddcU{GN2ba4!+xb$MA|e)FxrJ}O>m6)JOn%a5&5AGDH{l{Q5`HNDEAdiv?yTX{cTT*x}>bT(k3LX6a| zl$ANwncu6{TxFcIL3H7nu%|y?3wRaXO_?5M?Zvfw>n#~a3$v76CZ;i#njGS7lUNd~ zGBn%;!uWY#vMj7xvEz3{pMuETD_Py`LM)CRy8`a~4e3+hP~URc)BV;duc^m-gEYcd zua&u)6|NojR*32PD+al>30ss?L@mO;Pt&t=@K5ue6#CKoyo;K7joX&T9}jK#)}m0e zd})=IOU;^@Mz$}Po#v~%^!LGKg}H&*r(Rv;<2j_{)bt_OBLnvNEsn%h;;QS2IiN z_Lf`o)?E0oa`MZK$}O)_>WtR@`*<_*=EAFD+;?v=7U?oK87zG(P_*@yv-qhkw~C!S zXNFmqYH^ljNNGv4M^`$nmR+xNEo&=p+(*kbSEsrCJiNT*#==VzK6<*ZnEG(@l#iK( zUzhsK!BTCtLKW%+Tz}_gj@W~lc-HCVQaU!F|62fvT1|w>a7fRYK|6*uKHCSe(un}&Ek~4 zonM`o^L9J8idj7KReSo+sfuN~Xk1=mz-qnqRwLhsMn3BgKm7z+q=I~%4=i_OJLUB2Le*4C(nE~~eyWFNQQ^6jcahr*jpF;=cTJuUwBF^d$o9BZDKCB$M7(0eaw zzGkj}AG=-NM*o)|3O*KWEU#iZ;(j63sAigpT>`tzpBDnFia#zcyTq{QdDDXf>0C@- z0zR%}%V(S7@?l}xxf#8i?tZZJ*goyUPL&BO*gja4MN}8LM29h-nep_8+p*=1Ev_Nz zTMidEd)2J*3)&L(_Q#Kk{;<`#MeDY3H7)|pMg!+Wf`S5BFr<-|A*Otd!s>+AkH8W}&=B2#apSsv>yZ&vFA0^q^2W@BR z+D%A5ZQ@yKYAL-??0nViP)>`U`72tB`kCf)tH{PGvAQcimc6yjtI5B5^lQp$7d-{{c_BBow9}-tKFYV!9*nZ6Z&=J8av&F{}j|9Nm(K&|GLgq^pze5c$>S>wwUsvj2GO0S42IW%?3 zO?BHeMV}ujMm5uP?D(oWd{4|tjpY-Ocg)CbY0%zn6}#h*(Rp55#|Ob@KSZwjq49!o zvBB+Kk`{KK)j!X8;!S(tOq9ZVI29e<$zi|G7pr)0!SFJDa$b?d!9bJG83~{ha)J?Y$S@ z{Uq(Yoi^^4IutSYwRG9hxQoK)lx^jHb3#Hc$>p-df#l(j@AGS$fTOa@bjPdL1>*M_;lo$+| zk9zyUp(uy{|gS0JiqtOUBE^ z?{%f$MSs7b>@I(I(?CoYJPXiznRfyclN$p zxY%0m{+7zmVi%tI&Mve0bz;}=6^u!L3~FZlxmbMP*}XjH)}GYghoiUK{dmwEz1?n4 z?dfI5%U&T zK7Y^eZ^ij1N&t^fYNC)dmVdiA$9-}c2h{%l9y zGv9Q?swC_-3zXh{cemiav%~r5c&!JD4153nnb*GErmp1f-J*XD-;`20&Mxs3J*=M8 zbH0|}c30-_=KR_}SJ&VD`tGvcpBVkpBm4UH3OupTUXb*|#pOxyW!~5MJFD+r^o`!O z@9VeR{r|Rx*O^)WXpCEO{kTC}S`go1^`IX9(z|kXkBm=#yQ4qZnfpDny|o-;U530x zlR)x`^{XW81e^FJ%wna|5`q3Zc*9ixfX?>~3^B_;*z`hR`?gg??-{@>Z#_~r1oQv${=UMnT+ z1Rw8SYYpG`(7E6Od(HOe_doWYm(8!=_Wq}B^!EIl zdtQE&?U%FV(l-vUev;TR!}$1zPKBC`7oUGjW1s);)xY2G_n&3Ae_#LS=Dy|gZ!pjG zFwei|B3ad9@TB0`yVP@cl8&l(X{sDOetf&x|F7%!|9$&DuJ&hf=iJ*dio1Bl@_s+q zYn)&I?`QV?o7unr&UcwFhwm}JH?r9?caH!| z{#Du9BmKtWD}7z$rf&bg=UGm;bifizTm2tjvdfHW4z-;>E~I_rTR>4t$CFRt^Y{F| zcl>usn;c7<%(**@8?B244^D^{wJnNrE|K|QY3=`m$Drm=Ms3Z@y6H>T+f_c_yIs}V zg?D1J;!T0GGiG)(blmx~jo)46evr1^YS+1b|CJ%D9(LdLeSW@NW@7la!+O5r{xbIWO&{zmO?~fh`RC_L zw@xkl9Lwy>GJoZ=&#?tPecc{Qvvymo3FC@9B^d9Z;x_a!x%*kc)>hGp)pCQ`opvU(mGYu7A^W6!_;aMkTSI(N$2mp3f_3yKEG z<;KtRI+Qldyec~X@+{5pnsbNc>#r7`-Lb0oMu(wq|Ek#%^OD3rCo_mJG$dV}vCMmE z(A*1i!k%WEc(6{D=d)Q8BzrM~=Uw#nlgr%WX4gj=&Yg|_`~JpVtBk%^-#-1!ooODqX{Fok4zK$mz`&uEJIipY*VnnvcC3nD z{PV+Mep825=in(#a=!bsd@eJ(_NJwD<@{La7QD=At)H$ zFv&e@VuW<8wFlgzs$+~7NG-o!7AxwHt?RbQm)-FH!NieX@azuH#A@T$K_D0X^edK{$aClBZJGK6`SA*)^P zEW7?CpE!84*-Ud+873|3%Q!cwo^O3XXMa*QtKFq%&rO+EnLT1ybuO!KMVsk!)8nDF zvp)08kF3f+?~y;d?&s7=oSx-x>i<7Jzwgd>nT-4U^zYa4^9Z{3B)Qc8@!9E6cW2}M zqcd+mzIo=?gw@8|m+(xKW=%JJ?jEvA^8~j*jb7Hd=d0Tk5+58%?^tqXpLK2A(p7V$ z3O^LausV9FF5&ZA5fYo=buQ~z=&DVZm%HEj01m2Bu~XKHr3Ng#{;TA6Ffnu1?7Iw# zurK#yl4War4&12k?>YCc`rG~D^SkH2t$z1Y{aeGlibrdo&#%k7Z)e~Vf48{5==S`( z&I=0PX}!MYf3I@BMX|qoi1F&#qBEOJKDA33II+xMczM?5bkhS9gypXm?(%J)BB-Es zZ31uqh?_WfD#C*T-$iR25v_kiVqaS9j{kc&2ZBFg$ z$LmF(OsN09XZ!n?+rJ4M-dOwlutCjxxkDF#5_-&Z+SgYS2oD<;=lUAy=A z-I-k8b2FoRd|lqfMHEhdw&vLz*XBE!%h$YK^Q=U_N$ULpcT>Iw-W5x(%)0WZDsJ)5 zf;lb!j@w_!ILCil+w}NnMa~CJ{l%}7SnXCZ-q<+ZWVV^(#@=sE7XF(!n0e;koGJg@ zBHzE}XJ1N)O0AQ-l&Wd1u%va}@3K<@rY=`zPVSiaZIa}q@W6(5H|zU%8*jh5-FW+p z`$s-sdbsP-+T~jhMz7D=wCR#+?F9ebS^b%9p&UE&UcBY_sWt!j*L{qK)4x4SXYRSU zyY}_G=l1^|gw32=y|1qSkaO;lK%-*L#tw-^?6PegDWdN_uKSyJy4>^JoXY~N_s{I& z;JLVF*K*O_W^-4`{Mc~)sn~*_6Ww0cz6dlr_Vsi8yvpa3*YE%Lr1`sj-K;~K9|t~) zZIn~G{NIL8Aor${b+P}6b9b!g2Ykufo6dIk)%}^=KUh0jvpdp47v2_GyN2(pL5FFHpz6m)tsHn=hyw?+@JrbvgBUeg`2r%*Bnzm z7B`#hzO(q#o1)oIZ$6b-th`R$_!_gz6@j1S&-SsTzgribU%E(X>KxbQ`~E$+YdoLz z*8Oxti(;Pn9S7YFx4*pm`r5>uzU3Z`f2=Z#5~4!$cfDLD-Jo>pf^MTlvHbq;@6_Y( zO3mmn{=PKb`1Rv?`J45AtYJE=zUfEcxix$J=0(mvKBO+U_CYA(9GMfUY)7^ zGWF22JEgDJmftO%en?33lvnz@P66ZM&#Z#87pNTi#4hAueo=%`aAi-QHVfOA02E|YO3l_dkUH5L%+?}r1&YW6yyvu=EM44Ifb(N&tbls^u ztdGv@lv<=dui|y)&i&{8Q>#?cmNdl_DX^WpbG-Z1%;d?&ZgLLSPuh4WZ9SLWJ6UoT zb9$fDB8Dv&b&a<#xPK%$nAu&y!M;dBbmz98YcuAxX{4mT>$YZ2e&NTT?q}p;%vWKh ze(p}c%Go`tvuD@^aZVDAu;sis^Yg9B>c_EsUGG%>d!H^p#rpDbH-D3aa`wAfk#qUg z8}2?*le81;y3pVB@9~@SGn;en?REU}ozdgnp4Wa}=jWDRV*OPpt~>G3vHm%Swa#3d z$$e}$?*Sd}pUrbtDYfwj2Ru0Yyb26>RRW*2CJ&XyvcJnm%^XbPvL{8v|HLp&8x45^QO-(%goVReGL2}C96ZvUD z6DQ4Kwdd}TYde3)+{M_cxc^t-vwa*B6qg#CKR>&sukESy5q&eVXrFe(&eynR9kB96wQ{5*TB}+Vrt1&GzkC zk*@#SHh{Dmg7nqixq0T*t23G&g*Eq9K5+ka?BSWpl6!pX_Vf2XexmnM`pLO13qNf> z08$^A{_aKKOvU_jcaF_xThbffa_h{h7LB%j6RY)W=Qr;;Rruccb>n=6yXOBsIW2B~ zxcSIj%lCh4_qCk6y?ythM@wCv-aE7F>RVr%|L0`(9{KvE_D=ggm6soWo81wTvbQr8u=AO*s7u#k22-MX5e{NsDTYk}c(K`Lk+@1PnUK4hltUW6}f6wQCGtWD&-}~)Ww*LM=hc09s5@IOmi^D2l3JfT^Pfq`ab1}INW#wNUatS)b!_HkX=yK> z&*RzqH9}Q! z%DeY{zBaFYdydtvcX>kp{(Ltt_CJ6B-&^_pKl9u8Cx;*XwdA<8OWmBE`SrhNWIum9 zJ+Ag)Yj}L^*IsiD=lT1;zhjR-G3CxXm$sS<{wqs%ADUTx^X^RMz5jlB>+kvaNpjci zna{u5?D_f8{aWsh)W5v@|3AAd|3`u6PtC8hpyY5bW_#x5`YI-Km-@f2Yft^Nn_c%E z6vkgJdFwN{7&)ga7`q25id^i!J@tjfldCh8s~%o8kE?qdyX&&}eB1vI4$m&1@Zov< z{-2Ne4;?%&zyGK4;r5f=Ld!R|IG8d!@Bi`o{M55+?*DstR9rRsVM2$~7qgUS8k$17 z+4>f2R?zdW#eL7^@9cXSSaAQ}mzVr?0&<@}tGDq_7N42@y7j>m zQKhB}TS6_@9E$({>ckmM$)e(C*Vd_iSW_CX+R8EoZ+g@38KXA1z1!)SUW|_-Ro^@`fKjQeHfN7M5B+e}CQUS$EmmVt6M$IkR@E zWrVlaljl)dT>UBq&+fHdTX^37|DU(U@7Kn9|BTxG?d|h#0pH*9=kJqL`}|oOCN8)K2c~n$=TlpOx&J9l6)4IQ`z=2aC5hzHHRDE4ukj_R&7uqWkjq zc&7hM{9(|_F5jvcwf0TLs?RrFp4^^U%{yl&`!%-J?B{H@v!6LHf3Ie8r2Mj@?fh4> zQjcH0S~oj#zbenq!e=%DACI3GpTBo&>FK`qe;-nIfNXA+myf$xS-sV0_uKXR``Z;K z&D~jUSG4#!fHL}YwWXLJZ&z7$^kbCqNyPU=5=MR1Ry{!(s?|34+{z3ryTef|9Xe^kvo z&d4Obn99EAMjGJJX)U z)&1Oh-kv@FopSyUn^(f~{r~$aKm7di160xxyBY|HMIw?AL3zx2%P?Kjw8{48JjM_=*d;SY&iV)E9f!hU7nT#={up)i$0 zF<4-xr9#Jt&+DEX+{-k7z0HSHzn9!@>_4(~(mVlB%(8a&3ocZ7T4d#PZRermjDk)( z8~IiN zCWVegnjaEH=hc2R-@ourjlxFfAC>a=e%##icw%YMd~jJ2pxb<9q@1qOu`R}V=A8a?buM???34Z)|zTEmhbFNu@iH`$? zh^|VF&!X81XNnqEY`L*;+I(-0g94%J_kVeHdcEb#%KxXI&#Ne~Uif^PeTAXj|HT*o z^dCR<|5C=kv&|Zw|L2?kKKvnZ*3!>v9Z8qwJiPp7gljH!?`yC7SA6r&9(`9^{rw+rU3+Wb z^M2Rv{GH{0dG~*c`g-^0M?e0j$JuRpJS<{j*Ay$F%T*QCqTSmc z5T*6Ih(-S9pPDbHwB`4H)8hH_P0P?$`h`fb-G{=5$IWf+e;izHpYX$gb#dDM^}nvH zyn6HGh0hO)mPf5U*FV3p^;tvzn+Z|5Tpw}^vg+y>FP`^azvt6DlZyB6PyDg_eu>ks z{_A(UFZ#>R&zrXI&-Tsf|Np*E7dqUY`RxaX+is~1C)?-iJ~jR%>{inR)PsV9Hi_v6j`Yj=HR&1dYpsBU-Q{QnD13STOOK!fL9=ehpxidmu-q`JQ2eE9R@ zzwhp_oS_`N^6E0t##hf~ul)V(#%p~c+uv`t_y4_?Se3Ny_eJx4nLnog|2akM-{1ZJ z>;epHW~6nV?-IS1GFh`T!C2W|@xkJtcs{22vpfGP-sMj?H0ik9@1yzer}~~RwSTn# z=kJ|jhubsDerSly&;M}RpW}zg5%$8mthzeQuga}2H`V=&Zh!ex@O=Ge{)Jg;ZA}N# zQ^VFQnq&BxZ)TG0VRfMojCEGe#pW+4*?ffmt?RGu_X`JiU`+ z>-indy@#U=YsBV8J>OKcz3uG@y+0=oe|6Y+lav2^{pa(WC+BzU-Q?u5_Te`2>zO3!#iN<-K?C<^g_~vQr!ulV{2a0E_ zDU>v{%i_Hfgt+TLN^Y466Vc6rY zohwgi_gvfYLB{ey@V}oY<n(K!FpcmI7qAMc#Pa>4%3$IJKG zqx8Re_)ot0(I&rP)7%*f0+CC)99P76ZBPg~^7$vn)GgbJ!ujOF-aq%UUpcosYM;{T zZ|V;%iwu_kxvpOS=kb5xrawYo&ga+tTHhFUh9@gYNHNpl^br=%l+;h>zFlF7x+FN= z&-W6C%x3Fuf5Wd^-4dUkx)GW2)azhGw7hVeGJB=hzxw+;obvSse?QOm|L5+rV5+fu z)@Mzp6^fFI+$!r;X9qieE^v9vvD7+8>g z?A51C|NnkA`~UO*oH54EU;Oj!e#&RB+xzX-fmh3A7iO+}?I)$%t#Lmw{mrMetC!LQ zv^$STg+aq6 z!9~-&S_3SdY|c;j_FcZgO+9~FOMsB(6{Q8*Y!lZlm1%CzocFc%-TD8&m#aVb`Tz0x z{nPGzEDC`Wg%na8?%h&J-6FeB`iNV~?jt_8R&EjKy<|@PPKXLWKj%Jjalc+Avu-PYKm=azL7#!+bY2z_0+=8-u=&=cXf51Y`4+! z&I!4a^Yf(eQJbB?e3N#)i&%0}_o&d(wy;~N>?;MMI6L3$+K_fHt)YG6A(QN*YHDt- zM}HakFfv`y?D~3c-{Ow4BIBvd>Z>BIpR@gW;o;dSYVK~PiElnX>z8BWyBwooIPr0V zeAcwIhX*PHT|M_cKNV_qUGGMx)jO`khfgHVa<1aA@8r9lr^m?UaYuAX`@+K}*S~1| z{Ma0@;|C|Z-M$Bj`-_%YE(|1@Mn*T*n_ZBa zFfl4$>_#!i&-4DP`0K<>?5_VRxD%A$=bQS5<+u5j6F)d3SFW^^*^w=-XSdEW+x5m~ zqlpKFne5Nh&u;zuQIO$m;kQ}b_O{_`BTl~HY@J_aT+N~Q`q}DrEcP)sVz#fIb4-2e zUo+=V4l{nvb_@OAB5#-NVPnTU?A*etM&Ce9L#WL-w_hHIbW_En@n&(dxj5nd&tnf6i?D=^1;p zU3flM8~@?-e;*^C-TiYW@}2IVW6#~f*d^>fe|+;#&7tnvmAA3E+r(d8e(|L6*u}kH zd$nqpO?)11^6sj5p7P=&(Qei+uN``^qSL&u@7ko+0!evwTORqg^EHo(&-(m$;j%GU zWz|Ht7iZf(mTUiz$&84b;kLW=%-#c^Yh=%~WI3*w=Cf7S?|Sd0!yghs&aOMtFEn3E zVflv5ej+DrA`Qy6TJ6^3eP-bL>s+AAvh!IkD;Uk@scqJ~a!|zHz(4FqFKDHQvHy=9 z9~Yb0bJe)H2J$8!Jl>t6JsC z1=y2a{mt_4@6C=Ad7Qd`4O3d|l3-&o&&_`hyb?8dt@)#1x@WaN>rc+$-1CNZT#uD6 zgPkdEx9@Df@O+-F7Fv~s99x@au2l2xI1}PuyTxXPt9I|1g9_`EmaUlUw^g?8F<8Ut z&AX$X9Z#&=qsBk!>L(MsvKFI+TdQ?4R|RWcpVods<;;x;j7qaj%&-^sKqKIAQ@9h;wJ6BIy#-(<9!pd!j8~SH|j1>66 z@$%!rw*{Ymcr1A^S!(I$-*(BRw_dq+^|$~0_-wCa%InG6i?r-Q=XKl3Dt6l>8?ZP| z<}mHS^C@@d5-{mo~Z7#C{X;8U!8cg(Xz&pSBxeC3PBJ~DT9EckHH zlSf{E)ugn8t~a%(E7<)z)8FDhPwGdef%*#9i$^}2POzI$yRB$$0P9(YAT_>)xg|lt zEn%L)x$XDMyAyxt#MDd@49f3*6!l#xWXF{cKNpIBe%$Hb9d&obvf45o7OCbt%cJ!F zCTd10`}?e4H{rmg)4{pz=gTMeo_9LpexocaXlKHtU;iYF{bRlQRcd%RrcP**Rn)XP zb0Vnb{)B}G)Jt1Gce|wKdp`YeI zc>L*Eb#SfeNlmtn(hirCa;DGETiO-fJDXV}CTF*6nMhAzxMXBT-loK!T;~8gCf6E6 z^`sA;?kl`j-OUPd`NY!7A^A;C;q|iDS2$ALJ%5CVDlN%Z6t!o5mJ;6Y6shkQwpvhY z%LLo9)NT$*E7koQ1QZRe=Y8H=Jmcffg-r9aYgp_H*-TB^uf2M-XK(+71<{Yc*S3Zh zclK{Odu5_UM8yw@;|=0HA1CZ#usT?%eCZcw@{$Lan&EL6o+B$~Lvogom8eG^k z>%nEu{hIA>Hwy-JbF37$^mF<7r90-wZk3(ZTIY5)&v;Y){Da-@{oF^YvrSj{e*U)a z{F!~xK4(g~dFMMz%pzD*X@;YNDHV8bJ+#TQ>wu*D1RbRI236*F)!G(XW-g#BiQnI1F$~4{2`NWyR zUXG^7%GzEm?*vW- z%Ut_?E}Ucj{y-M{cRQPxWL;)Dcs%-ruyC>L{sSL0kIp!@^Lc^%btU}?I!^9fz0IeT zj#pmR7LV?{eY7w}>eTa96K1Vzy`j!!neu3dmC%WhwF*BjJa^xocV@YMMwm4}Yx%=$ zP~5!#dzWYD_Uz}CYnoj<&ztp>Pd>!(?rGU+?honPxRdV~8^}2RSfaS(&HBw!3)$H1 zt`^0x{CFX7N{4-6kq4{FY6jtE(GMq8rA?dsw~2?Pi80xo<*KQ9CzDsh^zojUgq_^N z^G=7=!A;aV|L%nCo)EvuM)zS)!ll2F7ep&YHn%y`!kzOx$fsK zd|({pHRbf&BRf_uEj-f3eaUj2(BpaDy~lHQcxN2hVV_uZM9lGrgI6SfW6ipbE0QwX zc^AHNS!X8P>2^YXL5kkuxoYd)a)d4|(spm0prmrFcupXHB(tDmsMz$Wy#ajYy%)^- zj9+uwg>u{!wk%fL(Xg*iaNBH_gMybO&$NyyN}Tc? zbplQIVwJvZeUK0%`C=8*xoLsD6EqI}=R6Xl!18uQsEOzTeRq!--XAYs%6%{}78K&; zn0Q9oQ?SD%`a$;d4UZQa*msN0f6C1$-z_A+aE&^vzl_$>_|U%PH*#zzIBej%Vel^d zC1XvO^3&E0m|rFXkp z==XE+dNjHpN`SztGP3)cA9aGgx%*h{~gBH6AvzLdU*IlWX2Djx z=RG|9VWxe}zT+Pfe;DZI)XehcH$SEO{@A6!Oq+8jZO%nhNr)A7@m*Rt$LmwioRRQ4Xt2Ga| zgS;epyh4D(@=)QS!dvS%Etva&S;|x_;f{5O;W^ftpd1%#%RcL{0E3IB7q4EuEg*aM zf}vSi%x&X)CYzQmN?MY;W5@3!A(3(*qpp0^JXkT~@vPq;B#!eY*IYW$yX-+X%ls)5 zEBdTkKeG1Sp4POS!_N0)%%>e^zlj`=)p?QKKX2YEsXMZ=ckfzDSU;w_Z8e74!Sv;pS%Ni>vj&iCG%u z-b-vePb;Q`&g`8HhWy$8Gilvp01UTeR6+SwwD)Rl{cXp8H z3RAZ=iE97i;!>M+u9VqsTK8Tt$@y32w%>B=i?yg(^+u%lo`jvZynKa!9=|s7J<^Tdl%&wXxysV_}$>(@`Z`MuHVa#zj$r8E?;>@>a}U`H`yCQydKEn=UeeRka; zVNEM`yIhIsQziIse=zWj`962koL8G~dRclqI<~9+yrFO~eM$M7-MN*EeSNKiwSDey zox8y&-YzW6@+7F4Zfs}I^ZNEJ8TBugn^+ABbgxdhTxooB$+D2{MK?v3O_S0tSi-kx zvA@UJW#3Fiv-LbzHaDNCoSiG0z!iIc^6r>+QTcNgHjTO4Ec0JXEWS1G<3pQIn_g~HzI!)#DyPo3 z#B1sM*7iTy+bSq8QSEIQx83k~@x472R&|pnFfHbcdis9x;>*iLZP#t?>1r%1JG$u# zV{pp@;RPCYd_Sd^YxSkxn;~JxBd^wWUS_Y}_1n=$J|rgnX!)2M+{S--(Ghj8Gs!;; z3|rg$H$@!&keCEo2psEKqj&qQmf`)p?Q1?Ud#|4O@bHljfsd3WdY@g@n#i^AkLTu_ zIp0#$mrXpQG|gXqleuDwfdmha{IV0rj%Ng{zM2)d#%o*ms*^S@rY{pKxt8V!+?AU5 ze09c5usN&WrfGij+*)zmy)~dL&TW;Z^g^XB|B#RntHbS@my+doN9Bes<2x0&&z-@f zGa!*iQ&edR$B!40Zw?>%@Q`(DRBqsd#my@x-u-ye?NvyWkV{JX4+Fy*4ZEEW_AIsf z*qC`BH1EqA#}&bP=_+XkH8UjaSmuW`Tj|HoeSSclYoSd`$+{mBf<`;nB!ILrNHteY zb>+RtcXT=1${!|Eo^| zs+bR+E-PA61in=5?cvYE9lw=&j+ zo6KHkH2dsIIa@bw!B;)ce%|oAr2&p_mVf*Fozl@Xcs6Kz{v~o|G;sfQDWukm*V|Es$=H%q$D1~Zi zC@V9+hzbqdxa^VJ{U2YFbPj#%1f)ty|MJ-^?&EGf7FkdVf#S(Nhsj!EO0926d4IdVL~uur zx~0`;^R%g2MLGRk3sY2mpK@G1XK%Op&i|<6TWjKX?aF=-^#57@x_!T1$^W~1|Df)V z!|IwHSMO{%Y{kpLGoK?^(8=oh{!LF;*mOS>{_yHBgJ1l|g`7QwhKJP;ZDQN>_T;JC z)7-N|be%YP2Y8YlG%N&2&lb9ns=SPIM|Fo%-PDb`FX4fz5byn|t>alx9-yDn3 zL$B@$P2eg$C7~!e+oolclH7c^JM%?3?8m*yIoDraTMJfmNxz4%W01n z<~8*%VbVVSw8WEJcFix{vZqQ@pKO?_?j+Wj7B3tiSbT5Uou423{H2fSb!K(>b06FB z{K`tXo~Gr&mzZCb7zfDcjVln8NstXCgoLbQa}FTJFMHmB9X$_D0%G0v(A3r$I2=)hbovpyqxTz{kTuF%5cMzgNu%?vH+1Yi_*8DA>ns_f{fVdv%4k^C_9=weEI$lRjE{ z9|rSSz7>{@ z@X|BTO;Vj^?NL}Jy7!I#m&Dq8cT697u<}^%?s>QEV(2!ObG-6D6r_^v?kozQCp@c2 zlgDd{^(TWGrbF$w@46IPsJS{cr##)M*R%WF+h-Qt4Kt)lDSy&vAaoT9hrqvYY^{FSTZ zlg)N`YtiHC-473&@N@CWZ`SDgYJ8};23$QjS& z8lP8k{Rm1wpsv^V@bDIo4?A_b(gLsiJgP37tL=1ilIp87E++zx7qW$%`+T`o$*D@= zw2IiZH02bJY=zmXF9e0SAA44YPmB{WUhR4F)*|y4?vw9+$kf&H%6_@VazjpJOweN0 z>r-Toe@Kkt`LW`N);+ytKNlbG32^3gI&x#p$>leTZQBDZ`J2;UCjQWw@#%^~y2I6G zRq3gd-ZZ2(cLzqIS&&#LCATmuOn%XL3|PXCArpUUv#$=2hBH8aHQ?9#SM9DV&q zoj)r;?fmLMKmjBc6l@qMm+NZ6IsaVOBwtl|biE~F~0~TA& zTYo{>&{prXUf0_i*JV-nPo=NqsajnATz9XQ;;U6NR_syHKHQ$^_;_-*!HTO{Tf3hB zteIpJk-FU1`(5J%snCx#>IO%SE4s|tpmpS8euAb|=A;L~tgBZEc0HD!G-+XuJDZ%& zl)hOz1OGKd@#gwu8-3-x_t9{hnZv6Ewl5jLCI@?bZ0wrnK8gM1q~lN1I{6etym`82 zJ`Y#k;x)1IwA+eV$E+IsTc<3YJgY;iMN5Ure`cR^=t|?0Q|w%SDcR55zN6>l5}7vs z%T34BO(nO?QaSAL$)WX9LRHmwJC0HgQ!_I&r7NCFGO3TOyH1jx4nSNsVp^G>Dc>QK`+tnnM zs?`MZ{&1m|owT@uLQG*?Mw+K~@6at}89KHPKjYU{t*zN=U1 zbcV2-x!4c@0%YK$&jUTC>RZehv+_30%^ z3Gzj?FjvXInoYMhOxp6#XWh30%RkRbJ*~BBb(CW11cfGBU!+Tw&Tn`Ayt3m;1Al(&)I}Q8j(@D#6Sel* zYu>g$SF)$8PknCv@nlolcPp`5)tbxIFxIq~6P_8xVFZ9*139Dd^P7)LXmC z^VQm}lzT?r3l{r*+j4luRbQc+ir8%$U9U`>9yaE9>{+V%>AK!}z4KvvHcSY<965Pk zPNel0s|&ITKMZuWY8LHL=i9S#Vc0|~kDRj;Zq*u9);-m8zkcD@vy7v9Vd>F9K2r?a zmhg3*daL*Tw~PDaviUb|WZ$^G%%_`2exF@wSpIA^4WXRIy&ERP#vO{gmKLS-XG`;VGpwnfp_ONv^JB`fD%*-ZgiB6d~@nGS_i>tM? zu7%t=@gXtkT6-j@!Fag66Vr&`Bab#`ZJPJ+@DULyJF&o{A0j=3B6Q_99%DMLI-7$bbw~KRKN8|Q-(GL~y;tV#4F$`H>32*2C+K%Q z6y~s7xhUf4`9CQ=QanE|<=7icUFmpr!;g;#C7f&hXH1yBNIxh3Zx_VxAk4G?~~`6!EhuEgyJn3){?%&%1xFKJljL+p3dSpM~aK zwUJa@GU>xb<&@=@=PqLImXYt1KDJ}Jabk~qqUQG}Cr>%d&tEU&vn9r>D4vUVzT=&% zKHipQ29~lv1j2pp>UXo-9Tm!oP0+txaJf^Yr|^B=@q@Pv-%aTHdqd5j=1`0ORL8Yp zhu17VX>)$I>VBS;VLKltUwElfa9$)RH}tE4~Lk;QyiEY4c#C;KAg~ zm`csYN5ukqosV}YF5;f|!{RCH{KFdxI+pC}?3(M^=5LWKzc65K{ChWltM}6Kb-h!n zvY(5a+HKm;eARki5R=B!kO%%Zs&ZtQ`0nWM(CnP zdpYrArG1SBv~`k$(J)b-s7daj_TM z%_JVYd=#wWQlh!zMy{qyjbGv&M-78-9<_=Zc6;xASb5}zOMd60Vy1nT>k?98&NbgQ zlxcq`Y*%w8>*7Hkr^$66J)JmAJviUg==t{x1ckGAb$jY_`^02LC8nh%M(G?(uXKuv z4V-n?hW|%_z?U!cZr^N;HT%Avv1j(SmqmW16IZ?4C6YAXT=&@C#V0-6kFT)z_$Ybc zN5}Lyc3p|@bG(}5EQ5BRKY4el?3UxQQ#Dy1HwM4l8LWBX71!_SK~oKCo=MEVnl(8IjIj=t_ZeNXM zym3_c^l8^F%{1o!(IaNDtA|bIm(RD8zvq08;1Zl)vbJVIw-vjc`=0Ms27Q*h4r|Tw zJuY(c6}RRkuiJvtk9_AioZk1*Gi-I3?=$DK+m=KH^v2gzOrBHWd{a{9l;0C=E5TFT zBJ$3~#l_j#+1Xm>(_b6wA3qXv?!11~zM9IZStg2)S5;M~`?_WPxG}d+d|Fh1hjRzh z{A9kG1=D96o$$<4I%^ht_u!rl1$_?J%a0VVR5q!xNL$9EhG9{Cu>gmu+gCAnTY&uEBOZ-r*tpLo?Tz_ z<5mq*|H7{4mWH!_70x`R`&dYHt%u~gA1`E|PG$R>FV{Mj;w7e6%q~y*{_66-+u4WWn2Dh87GrfT4d#?&XSO;yP9Iz zU|6hoU`~wFj)y)|riY52doKi=ht$6m-V->r z=Cq54y!QG`53gnKuSizhb824tOl7sw=V|;}Z&bPiCsdxk$9g?z$*S(XuU4%tnQK}m zd$?WG=|kpnU&l{JiiR@DP|;g+W8H3NuM+*S zChdoTZeopF<*l43jrA8V8?4~_kmAjs8cJOa}8^J)SdeL7Hci>d-{__==T!EjnkfozY6R&uSw$lwX5gpY2$Ct z#Fy#C@AKWd{p+gLTC1$H!>m4B-0Cm29%ONB&4d~JwzVnuc@HTp5uYgap|P;~%TJEZ z%W=u`wf4rvM?}nT)CATA~pt?=2+D#rTPp0yqzD-&yebO{Adxqa%_ zvyAljf!Vn|^Z(}OexR2)E@@Au{AgTKwGlHkOnSj-_)IuLKXLuY4q&SM~3s{Qt>Ul|k)g(2#LrQq+PU zE>Ca1Ej#@xlt*4|nZn15D^L8GuXJku7v6w*2NMiTz_xkS1Vy_9hJ^Y?T}lWEh!@sT zne_0%@>s$R=BOJ#IDTds=_@y+IC8{(>+9#Ld~|pXe{jp=%~5O5UAJWa6`=Tj^Xz8| zORgJ(MwGp3Shia2j|*HHzEp9_yU5GhJRGL!S|3gd9IXPS!pD=NR_HDH;^OOO`J?mG zikEW@xI2a9?==)j+WAcE_3vI7P;h4NWVO$e-`nla)OC855nj_30LmnbK6;u-gk8R3 z>KPNfe(gS)n|HOU6lZ2!WSw7@lJLX8)x@r>nZ?WK;PNg#pIztu=C_Wc0Zd2e4iUx^5TStVorl`Duehpv zuIzGXD96&B<D{uv28Z5^&of{KtotVu4ln*{{wJKl{4qS(O|AVfB)_mYs*%pTGWm z>A_ri?<QkT=MNHJEIj#O`E_&Rjlp)+(n^fERQE2{gBAT zC*LAf>Zhu>q+6gyE&9#oqv~}At}_PWgX<@btp&g zNYREAzx-pd$JU8lc1n42=txM$j~9P*^b%`6UCK)9?&nN)b+x|}{zfDFw_5Y>x1|pr zcP-vlQB%(`zr_9v!?!N}W1A1Uzc>{9&Rlqli1}kh?PJ_R^OJX^uY5dth9lR;b9pyv zd=@QQy=~E%<;OHn89xvfHy8gg<>A~uua3f?fc<;Qdi*UtcfQ!^7wiuLK4=O%79JI3AT{m3G@FL|5p<>#$cPd=`^M%h&B#CbV8|W&iOlE*~9N%-P=~ za7npEsKSm>@`S?;5B~QyJzgvMB@S(Ibm925WK~kdzIzM84rhEu9b0Q{@sAWgmTW0A z-Oi$MV{TH?qMpZoJ_$YCYHDgdGS^KE4H`d6eB6HNx8boJ?SK4Q?{#+W?PH$0zadUfpdEr}S;ymn(C8Djy#opHRDB8k&SmopCRFh8&S zLPGC=#P{ahn|Hf|KNJcdH}y-9erMJG(RHPg>=BFeU(wU|@ z!~<=Hb0$f@IwaA5GdABXV{>Bk$0G?$<}BfNFSiu7_xN8ta%98lt8-sVJ+gS`AubWJ z(1JDjj(g9GZE-ytx842Q~;lH&KSSpYafNKun~0=4?O;XlVf2_-)UEaD<@2x%JkkfNL~F{(<;~b zvM{nNFz30p(bZpJcHXHMr1x6qzYOIJ3_t4fR5jB1Q2UDckKYIjoAqS&X3tXC9}{%^ zVfGKERq6J}w(0ehPd?RSX!pY60;i4Q|G@lh50$_8TWq^&aIAgdF6YKSWmDVbCY+mh zpip^7=i?nLJ(kBMxl8iC@GuEV#6Q~6BC=_IuF$s$Di^KUOz%8R)3B3xEM(xh<3QU+ zU2(Iy3#@N>tZDwpa!frYe_6cMm%MeC3Z;aPK2PAvD>9vZMR={s^7Th|JiF9P@oa@0}9+yG*w`6WdN7V4ic@lyh$hxA}7)E0a9spF9s{N8DxjXy|mz>hi7| zLF`#9dXXiUR1Plh;!|pR^rLM_ipK4UjqKd6Z5P8j7yn`0DizliF?pr`hra%eTN#7c z-+Hn;9ZFwg`A_Cp*!*+S$F|*#S;;%SFh-8epk(SvxgQa^=M0{yu$k;A>EY*evOnrR z(<;C!{|86IaQ3iYYQ1|`X1n-fGv)L*c2A3p#a8TA-77MG;}5wS zn|~H|J|A{A6z-pWdF7Gi4Dv!24{xaU8T%!y?bCjBs6FPqMFaayw{?yO^XK7B;s;6D&4GiP6GTxNGiR9@b` zbM8OGj7btn>$F{JJgWU)FY=B#?!05MUY6Pqi6xFM30o%qQnLNotiY61dal#&N|w~` z7oTe%B%4jVq3%*M$)ohl$L8}ICR!6_-D@vAfAVe|(^Jly?;q|^Y~qzz_;|~u--n+I zSiat1ZO7i3om6~QDq+vrnX?T7y_0BWteu~!IQ=5;}zFIgn za@&l(JIt=kAl4#j=K3@vgDjp@@wMchW_F*n{!()Z05D_ohCG2c}83E9nX#z zzkeT?;*@Il!XW4Po;yDFj*bg{_!O!aN}4}CkbXzr&Qc|->58MFUdE!Xa!X}jJrNn@ z<(iA@h02OQvP#@OHv0r~LEL1%$8l9XicdNDC$%3fb&;@puz2Pd4%Md5+uWq~haVSL z+^Ev_{4>M+T(0M5*Xez^pA!|D>bd9FEBR&Zyz}=iF%o{?d^`4tKL6lyYwpK4ipNh0B`NNCP<)bkKKGH`mg*0Keb$8QuRSdBT18lq zUBu1ngUGhRbw79>JGx4Ln2~*};o6RvKH;2qKQwx#JxcSNw0LUO!Q(8MhUV(uWOg>` zamp7lYciD!ET2+wynXT^t#$L~{4v;(^tkBWx+_m-{o0`9Ugzj{^T`B{5RDnZH9g!i z^IcpFGF>#9Rn}cT=~B{aFmtih)D&TtdHrF^%~Si0JCo$*Ck9MU|5(!*m%qR4XVaOiCDchtM?@hM@Mu-XeX_v{X(&)2k% zzLh!NYjsQHaqfRpX_om#06$IA82s(qh35;rWSkiW(n3y6q!#y_vn( z;xfy(t^3%0k0si8*BITcicx;tRCe#xg6u}fY{>tW-TN8IkopQ%Yvb!={4=F8V!Bv%e#YOJ0#nSSCRgcdZe@lpd&vJ9dmfs~e zPt-bk`^9tl%4)3hd~vvfiEqZ^CV$P`ze?@%q-5qC*mm&X!8r*ZJ zAFA?sS|pQf>86tz1(h52wt=FT8LtQ@M9Z=x6ry@agH=aSNVzTYKL+Pvqifa=l*Z10< zv$*xnr@!#d#O{g@F5)>UQ-a--_1fhWE`DSU>g>vqC=V5?Vf&~keXLpRB~@QsUW zqbxF;nd6FfO6u)nkD9_bpSz+<`e5oE!9OB0{_dBa-FTE%XYkI}agD#d%-L(cVcWkP zJh_!U_Pm8DqwfJ(tEPUjT^$9(Y-D)B zzb0z!oCn?fV)6%91)tjW;l7zK#?;oeu;&2>3p5@V zUM3OEGWpGZY4zE*zvA95tJk?ZD>h?oi~ZGJ#&1*nyux&5?Ac#3;f_u?f9z&=*Ogxa zD`P?~<$V3>+Ijn|!@i_)SpX1u*P*~He8ZcqY1ValW7S2eC$2XWR&e-N8#LgpV zXi=D(pFcM*OH$YSRG6-|`8@l%gF>?{4X%HWZ}7L2vR1AU%QLap&6;P&Tod$jV{yB` z{@#msI(5qqUX`A|d(X;`n~$qse6hZQ>&KTs$+>)Xo}r>*XE#b6>~p?3aq^?d0v{hg zeB3qd{GVXO@9*Y*csuQ>{3V;eZ+Cb5@mEiI*XnO^`^w4h|DW93JUKVx@VXEEdC~eJ zcJo6+MHelas8TG-`sU#U^j$L;fDf*yn2 z+xQ!eHzXel2h=#7n84nyzVYiJ_0E^iTrc++)h?M{lJ{ZdvERAxEw8Tc`4wt9TSzlG z;6Vw6f;rxr{>)f>@e&5)#Ct8l-6L)OxU8dY0 z6^(2figT4~_MPM4R%Q)l>3t~>(G=@j%XQ$M)vg$Zj0&Agu1BALIrjbI>P3kcm&&b^ z=HuQYWcu)PB*TRVJxjQ|&TIDReUB4u+i#ZiQetXcFt2sk?2kA9zxr|E!hx3al@hm0 zR8*ysXET+&Ej8d@z_<0m=dW|krDn|gV9BqXt-UWqcz!{+^Ld7fsm1O5#XoDf^){&; zdS3B3>1WbLWvK)G*HcTLblsmXI_+<5^!GiD;rkfM|9wb2v(=)$)y1kW$?kQa-sz9k zF~40`PM>*x#Z4)5SUEg&tn+^ABpNn)!3nPU9mY z51o~2Zhhe7P;^pm;qNS|srh5{dD`2&XUWC0WEigQe63dFH{;iiYZpFz`0(Myix(@r zg9Stn#(cSO;l!OgXLr^M*e&61@b?gzvZ3Md{VBx(uNqu_lpIu7opef+k-L4??ztZn z1?^%#aB@uaG@W(6)ihhJ)_t&!i}zR^Nt zOQqNeBk2aSU$=Qr$cL@j_WAIY#SerZUaqqK;yk^&@37s&;>3?LOB~c*?g|pw(ED9h z{zTx0xvF-e8sDN+_8YH}^>a5Y+wkLt6Nk%$%94N>2D>Bf*8h}0B)Zof+2MY0d6WOv zDBmNDX&m#p8~e5Qn3%4y{@l6YWWghWsdi_yX31@Cy_s@@&--DvuXgm;jCB{!q>FKz z)b2joQXX_%{RRIX^Ev+-3Iit2ZP2}Bu++n%$9b7f)wk5l>xYaiR%b6*!tkI4sZVxw*%de>mQ$+ zX>B8aGxF2x#XCc$FH_pL;T=br{*I@QTGOA*yqnO&+b;j;OGwhi1J4taOm9fb&pog6 zuvqXzq-(k3g2_+1A5Gc3ab8|!kM8ks$zlf;#k*aq%uJR=fg-+Mtx^p~Icy5d1NfBe zRPR*EtUa}!sbN>Mwn%DcqU?MRnIOGqn;*MHoc48;2|sn<%#vr8Qs=^ht|^)wdv@?# zjX>(Lhcmhzdy}^+zdp^8oO(9CJJ~g{xkkiE_lJph@|(RjZBmo1(^*egGB{Lan%PuT zvwrDV8GSHU+`l!u=jT(_xI;=$E#1YRSe||;u(|#5=APrOKjyH==hu8?`QgL%$G1kQ z_OUTffOi;!+DvV(l}Q{2R_oVttg6&zcd79c_3}%;etW?+ufRy>l?)%(?7O=`cF}1? z(V`B1m+spPs>fC_>9BHlNF*~h6d5*~N<9+pbUt=;-A%<=YftpfVtZS(OyS)eBOf!B zB&SLd4cWK+YEMt+NF&P>yPhnx_1 zX5y*YC32_k<13G9k7dz18&26MI33k^(yY_5NA#7Efi=r~i)mn=h+YwXusKABMf!)& zx88pDTmDMshq)$n8ccJ!e33USD$K>}(Pg1MjqITe3=(#rI|6>+VK6*D<8q(*!reUC&!Y9hYrbkQ|?SMpN5R`bi{XNOpP6noBkI?LusJNs~6#&WW5H{>+Ve zz8>rLcpLtCD`OL4mpM(~oH40GRdBw{Vdf&4rt@CB27%5$=CI5+n&RK!zvIQ9+vfN0 zd{`sLFE8zIF?WaikFyqxg3ZmlcvJ!w`qj+2#GAyavAEU5y>?=pSn^~$ll5x?yH{>_ zP_*+xo&2d+4Xm|`JNj95CO&g3{qW^byKCYU%Qs?ww3Tvyq}{%>rmwMJJ zHzP}H#@sy-(a(58O6HYpbW!%0)YtRu$O~!Fg_nfqb5$egYbv|$#U6i=FsqLTIlSNPIkIQg!B;;x&OUgfF#mVt zimyl1d8RV8h%cCPpsD|eyWZN2wq2XoEL8ZI=qa!|_G4nV#3a+?`D}KYGcGmlz4v2F zyiFKWzKoKb$Cbo6s#`DfPi59wv0cn$eah>%6V65Z6}xcGm-}(V)%9aXk1p$idPVD? zZYGOU9s#abrfggK*>ZQl<99o3S3WkLy6M42k?r0U1xIiF3ym&(ssGO5(Bv=ce(@bw zUuPc9BGo3-eQ1-|+gVFr`SuC2+a0_8(bMC8pXi1(qsNP{ds+XUcy0OTt!@I!XKRZ7 zb3Hm-B+dve^1-@TEtJA02&P_UQ#*rF`i>{W+96h50?!aeQnPwxrcho-98 zt?4_w;PvZS-jn^pWsPKigru}u>hm33{`k>Z2iGGvH6moRlJnMz{GDj1fBsm(=UaL0 zN74lozHWMKEVN+;d-@SapWjE*Mcfw`H?7L;kdNFm^U}A(_<$)^Po`X3s<&IfDfDfb zyVLP>i>Xp_GBS6z<@EFNXiSZI^UCky&*`qb^M4-xsM&NN{V#80g~*%Jp9;61nRXyC zHOEe>*W^%qrtm=vizX|(pKiCLnirk#`N{H2GOdP5;f~Q0zFB8aE9qW%z2b47SC8wb zfGbA%l{~wqJH#Gv(N|+g)t(%`P5RobJ~=7je_D+N5)V7;EZ+WTaXh+BV!pHS%RqrD zm-Ua0SDAe@oVqP}`-vC(h39KE91Sj+5yURbS{`Gg_T;HA=g%pDjKQ~5+l4=#%!q7X zx83>to~Z}qG7qL}z1|n|qbFx|mbTpmb34B?Yb_bC6do0u?woOT<7~Gh%92+;8tR_q zcsMs%E;RRnv4p=WJG;2~kT?D0o;z9=uL@5-=5r{y&6pID z{k?E?z{J$!#tOYU`~v;WM~*X3;4&!|6_~KHFNRtEZGqLC?II2~DS}bLD{Xq4B<0VX zc{*D`V(Cs67wuFY>sucWwk0!6%zkt^u;6<4^TXeyC6DAuzn^|0rP|qU$N4LTlT~6M4?qetM z>1vzoPouMG!P|1!12$G}5uKkPSspy0Kf?d;y44b47Ej)X<|O)@mEOx&CZH7_%eui^ zyZrH^IX!M0Qnv;E|FI#@$@$PW(d|dvt!0W0Zwa<+v50-|y>Y$zZmAy|qJ-sxGehTu z*#0^ypD^tP|WP9;tnv`)Q6XlftYwh1Orn<}-bp z(_t>er^DQMy461{SGMckb#D3cCCu^-5==^8_)l0*l}?aa;&^=d&MW#yB>e81Jp61a zDlfwmnR9z*V`I+IdYzgLsrPQj9FEHUqTjdmJ4dhT@+j-4yVZQ{#cJ<ZFI2KU&I|e)G3M$S>)KpWRn!LLm?|00eGZB6~J5!=4`DEn^Vq}99(J+nS`YUlpA z!xAxRuj}HOdOtK)ZEzP!y^?qA_}q;VkDQsCpT?Mlm_D4WQsXh5S>9Vq^*1j^LuGQD zU&_qwvhu2Y5B9HH!|~?bwa)YDiY{u4SEW7AHJH~q{lAsL1l{LO$-FhI<~>n*=)6m1 zCG$$j3zsv5G&gMC$XC<0;c*Xxz`nd68glIds}4^#e;j=3$n<|!1`qU~Z(`=HX{!BV zr7%&C%dUH#>YFJ$vktk--`>K>@hkW6jVLC`)o%*tX2-A6cyIgLvG`eT!G-yq=l_=` zCCXXZQ79 zEWhV5om2io74M55Q~LjIDsx-0ZR5nNJz2}ot4#Xm^P}f1Z}o@84A#CiTE~y2yPwco zyy}%|jmLDB`8nNA?O!UpnXl|;kv}RP-uh}o&t>;2&*`l5m8)Zp>r9(9M}u+6J`Q=F z8l^A2*_ToesXuXlo6S}7$hb-Np{VQ3&CFN!iOBzQv3VKvFxX<(O_BITpG7|YPBa5` zTxNXmlMwx}KJ8xvN3(PFE{A-Xdt`s%p z^2V;aiTA&4e;9oBsngV`%;&GJ8om!wc=)kj&~Ax$FTX?F&mQGG=7!+FIS(c<7c|SV z3*NhSeAD)aI}R~1wAXKm37^8+zRF65?|6u|-Fx1ef7>6p)J$5P+`|9T=y9^NbfC@z zel2COfc4sb3?2s47&d5}s&3Gcz8$!5jYe^qz{8Cv*9fdW6%(>Ge5z;n;dk%e?P=vc zr_FqQy~RIxjX%bNI{rjf=}d^UxilOe5~0TYnny6Z-kYFh#n8vE4kHr z_v6Rw^pajBT;1*bV}hQwU17r_vDXTA#Xszs0AdrIveFD zPpo|}^3ZwLn;$*NI~G3+Q?cXAZRBEfjXZHP^^LN?#-e29?p0YE`)#i>%g=W|X4k_1 z^3UVXukB0!zP>(r>+c<1flHQj{J6neGi{1i8uuc}i+%nvp~f23T32M}%lgPx?15;w z-QD)@@A|kod-fM5|Jaar*|J~uKIdd#O-Qgd>-{y63 z)}wG)p`$nc_43tZ)$gtD2-69}~`5+x@Tkc&Opw_4@Bmo>%7A#3&d>GIg9d zQW_DsjKQcYiP2PJGpAEvTS&o?DTe(5o~n-mK2Pp4O5UFS->zb9K!NFpnOvc(!q>;? zirJhpum384xH9@tbjfkgc=7qpKP*|~m-fVRziGJGD;$y|%Nh{dwW;gua;A_Y?wt>P z6kY0k0*{4;ZoMtr7xLkK^Szo?o#$1|W}l1k6`SMTX&1yEo)*8a=4Vm$q>a=6h$j2| z{yFoV?aS2AQZRG6Fs>wmc_m-$xelO$fi@SgGR;=w@ZR@kMml__c z+gYl8F?H?KU$d=CWoMPoxo@nysr9f`{kwu2*Z7{V)%(rueRGYwY*f+vYq~~%*EgK! zUM%$LT)*V}^f}AptM3(^n_p{bxAM=8lOI2p9c(W>m>#}b?)v^Ie7EI=h<<;zdShJbN=6(HQ|9%-dq0PD?7iXL!Mtge2dMG_Q#(WC)V2Rt>p^; z_O|8BXWIkE-T7;lnMt|+>sj*lYOc`duppbUY=zo5%+IL z>4A&wKWD|?dMQ4Cj>&F*{|nE3=DYD2>8);Hj|sXWIzQj?xp4XXQ(o_7*F7=MEi|gB z+x2_xnhTeHA3vDh>F^`@~$H!bGh|L^Ba&4kL6mj78Lqvt*N6MbyW*Sj&r-F!9Q%FCyJy#D6hyD8iDf4t7F ze|YT=3&~=Adnf*o#W{b!Il9`Py7A`P`Sa7(`qq3fVE%pn!=Cc%TTS`$&L4YnYU>p1Lz7} z|EHtfiTfvR-Z%ZbEA!lSxsxUHHukrOZA(~Ue)LB6x$ie>&+R{Kx^&6T`_m_Xmv;Sk zpfZZvIsQ=B;@roqgx} zhl{1N6)ah6c76DKyIcJKn@<0h(=S)<{Ve?Z%&ZqL4?Nd=o>^Nob#bFtO-FnM~&RxzaQnE-zmtOcOu=!?t#6>;rg`?AIH}p`FZ(k>DfE`tA8G8IU{nt zn59j{u2;7}|9t)Qs(Z}ypGR;1C^60Y!$!}|{Yx$D?RNij*(RG)xNl}h?UOm@vwrww zA7!_D_`g(tb-_9LJ=NbG)+v7c`S5Ii#QvY1lY$Q{Z=QcYZcDgbhkw-N+NX@qx7+!= zpS%3Z!JNtS_-f>e{~ZvSc7NgzALF+Ra}J;46mM7G&^POu&0eM2Ep9*liA`7Ey1crl z*lzK|%ag1smRjbV|LV)M>*@Yl9n;kyp^R11cG8B&<_OQ(|MCF4<-YTq=G@<8m{!|o z;$QsFyJzFloNHblD)u%7rvi^8*!^^&FQZ1hf&Rw6K_wab~8h0V(^+wZsZ{~=>^`^g^F zlzcuW~<@l*(Op}&xzZ97BsCYTMU8Z*OwG!pR zwd=nYTibP-JQp^+^V(nc`HQ%J3Y*nmS4CCjyB=ph|G8ZDnW@b?Nn4{$?@XPwFNr^1 z{JGesYM-86^q$@Gwy$k3yj^Z~EUf-g5nIQ3{l_|OiXF4}KCC%^I^xa8X7=B)A3IOZ z^*b5mb4|#%=H0gg>72VQAMnL3|Ja#-=y{%bO_^!>`v!BP{P|nvxvh`>_|azfa#aT5 zUz=XC^OxPc_4s(cWU{o!+%tO=HSKKs=#&u>p74RQCf&NjJ?D4LoAqzr=jbYPHpvqE>T~axs)jx+tC6T)E&0RWyK3`0+sk77 zDd!nw*Dv)TE8E5W$t$?w5va@xjX5- zQHH3loQs04^yWM4vtQc!tY7&kCM)*Y(+<=HA>8C!Eq@5zm2;U?<;PA%M5 zqqA|I@2lDq_fA$E$$eLCYnN>MRa&6f%J%PW_s7P%_G{lM^JkAz&BsTW0w;!{zJczn7+7GdGj}lX+I@TTSugxUY&e zQlHFBJ-5$w`5~kK*$qo~>SfFWV{xtN9P&aBi}POK;5b3@~I2$(vBT(PL3C}Q#rJp|7F@vm literal 0 HcmV?d00001 diff --git a/docs/public/CnASmPo.jpg b/docs/public/CnASmPo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..128cc806a1821379906c9f165d41fe14d0b25bd5 GIT binary patch literal 289270 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 ZeM>v!7A`H{d$8n&&Ka)oNA>@20s!0Smcjr4 literal 0 HcmV?d00001 diff --git a/docs/public/DkEhj9x.png b/docs/public/DkEhj9x.png new file mode 100644 index 0000000000000000000000000000000000000000..6a31d1f1d20be30848620a97884a827e54d3c504 GIT binary patch literal 8998 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 Jmvv4FO#nAIJBR=P literal 0 HcmV?d00001 diff --git a/docs/public/DxMHpJ8.jpg b/docs/public/DxMHpJ8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..179c2b6b69d68aaa5914b839d7dd0977324aa5b4 GIT binary patch literal 32520 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

0}nm~lhL?{xd*%*;C5tp@yDVdCcH!tu6C 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 L)z4*}Q$iB}{|7a! literal 0 HcmV?d00001 diff --git a/docs/public/EVkxOt1.png b/docs/public/EVkxOt1.png new file mode 100644 index 0000000000000000000000000000000000000000..56f862ccb7f578c9db8be3f9a7c085d5aaa0f622 GIT binary patch literal 65661 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

e|oF0 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 VdGBslW?*1o@O1TaS?83{1ORr5U047B literal 0 HcmV?d00001 diff --git a/docs/public/HL5DP8H.png b/docs/public/HL5DP8H.png new file mode 100644 index 0000000000000000000000000000000000000000..523d59f98d436b42465469a3cf0c2133a25fe3b8 GIT binary patch literal 11250 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 P3=9mOu6{1-oD!M_Jz-#Ac=P7{ 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 ZXVavnL&E+Z8Zr-Dxx~}=q#XIUK6FR@ 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 literal 0 HcmV?d00001 diff --git a/docs/public/QeY6kMQ.png b/docs/public/QeY6kMQ.png new file mode 100644 index 0000000000000000000000000000000000000000..b990847c1c50630ba22993cc84782222ed04ef40 GIT binary patch literal 3572 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 literal 0 HcmV?d00001 diff --git a/docs/public/QiA3ta6.jpg b/docs/public/QiA3ta6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a10b4165c4c30c9d550ed8c2e67c34776ef15487 GIT binary patch literal 164162 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

HiG=(tO*F=QAI^ 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´OOT;!`HJm@bz&|Kai@>uuw6X%i04Ayy95of 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 literal 0 HcmV?d00001 diff --git a/docs/public/RFyNMlL.jpg b/docs/public/RFyNMlL.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cfd86f6ef2e39eda9f2a2759e8a54860c0007b6 GIT binary patch literal 166582 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�%e^Cb$tn9T9kTlhKC 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

8M_sqRbO>JlE?H-SvVGx89|O*` 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 literal 0 HcmV?d00001 diff --git a/docs/public/UlJ4ZDP.png b/docs/public/UlJ4ZDP.png new file mode 100644 index 0000000000000000000000000000000000000000..d38f40deedb0fb54876b06769673e3a51b0defba GIT binary patch literal 26297 zcmeAS@N?(olHy`uVBq!ia0y~yUv$S(_*M)=YQwUov&ZN z{`vFg)vH&ZK7Z-x=-9b)rqw6wG|r=X-~zka80etP}(y>oy6 zt}5~0`r^M<$)?{=Hva$ruBEM=k%1v?=DC=({Eljd(Xi$QvzRXt=FD%-r33h z-v9r9ADsICV(atGWiS5!U-jhAp{sBI|G&5A(22&3^fw1~@7{ANqqKR?se4xr?S6OV z(EoqmJM06}((5l~#-`_$UU~b!Z|34>FJ5^^W#51BsCDPpg4!-WU%wCk{~tPjYTCJf zzyJK*xMTmpJ-buWr`2tKcIv_3r-%Bq94hkCQ%_yEnvtHTV>9W`&o629TkF&6%WUo6 zzWea;$M3s8{lhP3_dW*@GuT47=S@6#b2eM5cYRbP(wEV=fhroQpbn>X8R4UO&m_fN=Pvvz~N zvFU>4>#jci`0xAu(6G=}1Cu3dx6eHG`peVXZqqKTzy9{n=YQ(j9hbh`NiSNopdd}h z%H{FLFSFx(OG`^LCLEejk#4m5noi=(3!lGzzO(6ee|yz}ljoP~|M>j*h-nli@OR7rfiusZQ7;Nhq^W%`uyp}`HL49FJ16t@tl7*7hIiWonbpuS4-<; znCIz@(@)qm6)nGYX|?5wx{RIOK~9M^adB~(PNh>F?Ke+s>sohB+c#ayF6QOtwfmnx zugMG6SbpU~vF5Go=kxu1uGWv$uSG2a_Wli!g>;+5AYD^!Dq6X4wlL1w>5OsW61FY+3MJ(L?Kz_~fsT|C~SG z$re6I$it#j!NaR-Lj0947W~tW*VY6+I@R2HM6^OjKtwRSV$q2t)fw8dlZ3qN4`i}9 zPAq6Oa+T9Q7*lDmaR*a7Ym?IBQ&aneE7!0Tt8&IPD$Jhf6t5;0Rh>5(EIQ@8?0 z%+5;>_UP_la(r-VD%*MEW^I9%oSuuXA03#gy?)Q9ce@MA90QgFJvx=#|IvQCt=g|2 zeepRyyOO^yd(dxYU$y?zjoej>|Jyw*+kO3Q-mN9+S1#wiV)}hUjdN?>_%8cVz0aT}yPI^IbQs z-FPeZJImI)pVBVfx_@u>l`qeP^S;0A^~}EBYgMnWTd{q^*;}Q%ckXyCZo;w1A+ul#mO~S+k)fVmY`)|Z2Z5K%43OCXS++pEy zWNLiR&x^-YURmt8JKN0O>$rvZOp~j&fyZ~N$nd{NpZ#)2{-ht;`9<~`y4Tj--dlEe z`~Dwm@;>jnd*$T9`gdYn-;O($Dy=iwd-AAb3IDs&-ObG^1*}bvj>cE|^l3|5u5avj zm~}6w%GmSFRP}3b{cas9OkJxM{_e-o`TK6{dAE0$b=dxs$!XiyCnU~RH|yN7$@Kx( z{IwU4iym(<$eU%XBWT zq!Qnv|Mt_KRK3}#Q0^MBe^Xw$@ch3KvF^4V_LuLsws81f`#1A3*Yvo*yS2hIu6^UQ z`}K3ib1$Lz4fg8J+&8x$p1%F=q35|jm+J1?(Nvknv56sk#*yVQxm)jv#WXIED1ORW z8*CJDoZs<5*R<`Me*M|&S@xKV#nJFvc!9k!C`0dHatwTWDqg5pyWa7=^Mso*FDGQg z96TMOc%o$8o#`1dJNftWJEj$@YI1UlaWwHfJ=NTKTy&2kN7I?7UhPX*M2vIOw*Ci1~%hY6A~o=q45&ndiANpsr{B{2Rw%NYZEPO(A9hsa5U+x*na<7LBze4wO{S_Puez3`ry=0BHz8GVqPxinYPyU&YY^8 zyYIsKnBHB?kL2RePwpagN zw`57|ZO!N_cc+RQojz@RG@&x(>t#oKtCANV7XJQo|N7fwoeYl0Rwn%V!W7!Rbk8^W zgE5|3>!-@UU6>p*QClY>kj=Z2fBT23uVo8=Pe}=1Hnsdkz`sda;b!)`1k)K=Bv*gE zynOxp1+x-ws(uSUm3>vSC-?!}_=`<)j-m-Q< z!o4pqFE8I88?eE*Q~T+fn8b7IHzc`o>gew*XWj59%y<2nUGpyMXog>tTUVX(b>`K) z@0VrmN_O9!Z5Ols_r$A@`PcvMcYiKZc0IT5QtiKf*=<)!UtHLdSKiKl{p~WdFY7s1 z`{&oBY`wkrq`1RHCNuk&%bxYG`S*SDJKz2_W%Jv9Gpm|}`uXu+I+^<^W+m@auiTWF z%9FB7L@Z~qWVXf}IJ&3eX_ceUx;3_cO4{AS=HI)K__p7y=pWbdsinKEbLxujzT4V< z{{P2`S4;n-FE=mCSoQkDO?m5@ihupGv;6YkIP4dUk^Ob?)^cOEPe46s1V@knOdC#Xx>)v$f@Cg+@T`E!V^uE8{+wSIVS6Fv^GMS&f z@X3n{TUH)^=Kg=j&pRuY%l|y;7B99ebFzSG?G8-=k6Mr5eY557p7`rI^OIuH0f9-{ zdyZ&|8HQ)of2g=*pY`6mDm{FsRQQa~+n(z04DRV@&Io*|-*Qk?>M}<}2G>)sc3uDC z7*JY}zgD{=^X;y?ve)FwE`Mk%dg|QQ#^jw*=*yJ6V6mMyu8@^*b8>v2dyLdZ<`PAL}fQ!XbX4=ksi`^1+2b2b08|IM@0ug%>4_x+L&2NqeJ zw>fHle$Umn>v)^BWBgi9FE7v(QeC&^?Z&+F_P^Kd&rW>gd@%muB9(vclU4RJt#c62 zS3F!4^krejU$395cb}R(sV-oiOZe@5zh2ey)?Yk5b-qd~tJvAn!h3J?o#7`PYIm$vj0Pae=K=FW$li)0!=#0S6&v+e|;hG zcGAU3(I+?UD7sj5d-jwKi_-V%vWu<#-F)S}bR+oIi* zriA?V+py;;+a39q=PC{XNt$0QIqf;>>KEQ~w?28?v0|Mti)z@pqc@&goqU%2QO1kI zOGEOnjMvV}vPN3y=t?<39oZrI`N@qr!=Zb$kAN zIt^-cxfMNqI{j|~W4Ho`QIod*ei;Vt9ZZfB3=0K5Z9`~OH43*{6so{sG(&qmh;G`? zX*qC{>^dF;m^L95bl=WuDpBw zY0;Q|uIbqvzhq(>5ABZlUb?fYc>mMgCTu$jV>c1qixOEmw~6! zD-Vbkuo}(NUVD2-Lc`^j&0E*?#i%LWfBI`qx3pf(<6Vy#j!zXnzHR5dI)91T+V}51 zJyr4B_1@W^kMeiNtm~`4`(Ap=;lA9($v^(Aj9u4PAG`L1Xrj&K_x07={`5KhI-R)d z?8Vf+#Prj#`R0}~@xCR06T3GkKF^QQSiY3?{l)!z4^RAC^>-Ujy=?PNr?u}iz9=vL zA@@sM*TjNP%8md3PfxqW3ocnq*4Nuz^>_dxP?qqcj(zc0D&?(cf<7piFPJ2QLFnzK_M%U=le zueUsw`}t>Qbq(t$=lc_jT~<7k`n5fy|KD3#-TOP6UTHk@vJ2-9UH9Y@d+8sMe32L_ z)5>*sSV5_QJN$+HzQl-aXQyub*H)e#Yd`yJ?N8}My$Un?zWeoc?{4P)d9iHfy~pz} zE;%a8t`UB3Ud`wCeYwSd6IG6jMxB}yXOgR&v*@H~__6rix$)CZ=T~LUex1Jcz5Rdd zeP6ES-jUOv^7;3vcixtYw-(n|pPIKle#z~%v04vLoilzKQ|H>NZF2PYzwRv|=R88B zOc%z#JDSP7&f!+f${Ww-Pd;h+=vU(|JZ6@&ttCgo9A_x&$wB6 zXgWE28`PN=XMDy0EU4J@%-onzXnI8M|W}f(% z();><-QmPet&U4Zbea9JfC^px*yM)_4GoYd+l?$(Um)A;tG>2p}ICsrf{Kd z?fSjy59}|TIcj9L#xl<1xUp}}numA9PKo9%<@Bw$^C{M=nQ&!S?<}sU!=j-N7bz6| zkd^a1R#K2K%d$gzip(E<|4*#7`>uTdx@dchB=d{+*}sF@rn2f+KK%aT_Pp&+oHzbl z7-PBb{=!pJ=X4%=Hf5Hx%F>_xY)s(_x%H|Uo-wTtymyJtoN?z;Jhgz+PhO`+Iebf}Son|kwfi|-IpVipsuH>Xc-Fl4R&hIC=-Ty4?{UAM zW+}W=^J(N}Kh~#?EtSvi|Lr~Rx4NKJj+@=P>WQ<;QqSc*3I(h|54p}Naq!i()}NFz zf0n`WCFP^}oYw*~(x0&vw)V69c^+RY&eE;0jwOH5y!gP!UZ-8Ie@snXciVm2u74Yz zuI`*;u5v3`ApFlO*-6`T@49VVcy6jSS1qrhOOVtKrgaWhI}WjO&DWp&(5o!|`uVi* z9Wj?>75{m)<}1qDXMN7xwe|KIGq-wI^>DGhPj}URjb8Wobkw`TuloYdwJI;N-BkEg zTQ7R?>3GKQ1ELx}>n?Cx&i}S2Ku;%9FyvWL?cM4Au^peZ_b;60_*3-Nr!Rcx*7JN+ z4So7q+iIuN>x(5vz8XwVKKcBR!biE<*}7Gy-8U)x+&M}4k=MIz7yg_Q%&b#gVFD_a zN(xg2_x>>d__%YnaiN9S&X@ajg=7D3zw^H4hkE%xgGtiYMO^Rf5%_+cVc!mgbsFc{ zUq1CZZM$xNQL$ro%=Y>NPdkrRf64dP+&)YD=XG!A#|n9B+SBKMUU=d1EPkP>Z0j1d zC+Mv!DET1#;IH52y6@X>G488y*pcRaeSLs@d;I>QKc43lE9XbQP<+HC`)AGT@Q|H{ z*2*r-6OKK6=&pk1y~Xv_Su;LfKYwfQAIF4x$I57_-4|E9uQ1O$EwJu_Xp`gXaF?Zx z+7Gyv^lSe~SRDQ;EKzi=K}*;ELe9%46kq3RZ{vKO>;CI`k@2qXosZ)4e>=6rES$&h zZahorp{4q*WCi^_o7V@_3x?M$DqVU`a(j_RYbO-6?rvZ4_!sNWiAAlO7H*%gN$?sQ`+LJ3fAs%_ zY1dur>erUcpZ_FBZ0^oCrz)z~fBNhAp8Xv^mlkgfW4J=IicVakLIJChmq{8&t(Xu? zqjtcKfXctE{4VBf&H_7_Bq!7yoLdHBoSFLF-_Oa~0aQDJFnl-zG_-+I&dz{~Hh zZ}~XW;Q`kUrk@*)jyj4wol&%ZT5kdqD0ZJ*HxXSU@My-e%)_%GN=jJ+uZrF>3tu33 zP_%%RDO>@SI3UUq)0lH`>H=582o~mb4iCBnV>shPnq3VZaHZ6y=FgD-^L$owt51yP z&+pum-7^bRe}5IX(!Fqe>Yt$Ft-o|H`MY)}ZQx*wX-r!C$ZP%f#J^0r>v*iA-`iFk z*qEU?dB4%0-Jd>v`n2ACMWO0kjWZ^d|VLseat7_uGptWKz4U zpMF}`{P>7r{@1vl59dbPH3$TKz4pEJR7_;B!6chdi(ex*`~8-IPn(TVpjT-jk#|K{K4+_*k%%l1{@ z^`7qhbms5(`oNvn4flN7D}S}tC}^5?_P+h^c9-9?+_h|h$4u?@GXEdVy;ZKaPw0$X z+PaGSzXM}yg?BKmbC`B^eZ}#24j^4PJN|h zAD*H6sb7yZ{DA0*RX?YGUjA%t-rVpL*81vwm3!~~j8RIq=&faXapU^4yQd3N1ONSs zb5gsieSYdR)%ZSzB|ko0KYJ=>=ZD|z>GzDbeEq&Z@!Wb7y|2YfrSXouJNvUH*@U0ye19r?zP&1w_laLqcb$I9s(zn~t$W{} zQ*lo~9^Um+)N1YKPiqY1L+)SL9Q45JLd}I!o4?+Bb$;5f=gnf@KdsG}_`K_U?$6$9 zRkv3ibTmFYgP$q^%;N-jQbk zWtWRF2mhXVz{Rre!B1_09ZZc#1V|KA46TC@g_?WZMVZ1C7Po%i=lp;x#U_I3^kt_f z(d(BbHLK==@-r-_I|}S*3Tss0h(W@jVhDztKt&M@D-^IcEm%>wRAw!cv=+003GekL>c%E@RgO+D-gOW~6z0=ck+x^vscV}~=Cr+Gb*l@LC zgIsd^;ve(wotY*nDOoOJ6!qL^%1XAs2Fj0*#l3OeaI5H;^9-HMzl+!%&0omY#eWy8 zN@LjkF=5%~X7h9JRv(`6JGEintLHvT-k!R#aL>k?b}fm^!eQ4VU%VEHT6%BIbJk$~ zU;auD4QBLYnzlu>Xdktge0d^OwoFvgeBaTUpy&5)oSt~PYYms}F+TTiOZjK)+_Yo* zyw52N*OiJMygnP{l3#nwQkdP~o2^lh06`*P7rl2`J#}2q=IFi z5PNisc8qOFh+F*LuNUTjj+{{|P_|Cyf5YAFYa?!l-}Ag$xR3YU+21;6ViIkNcWk?2 z8qxEJ>-4`r$C}$WOq*k^Vy&~zpiCou&5eazF&A%du}ZYxvAs`DB&u_*+pa1zt(cR0 zYnMdEXzpwOtD$|v`S2TW<(sb^7i)hjc=K)IC%LurKCf+>o4hA^O}F;`xi_p&#Uy6g z&gVWf<Es3;`V!ut;LM(iLc)r-1jS5 zb$`;b{fmrskK6sKe*JZJ#M+(ReRB+dzx(lrEBpI1pEC&^3zA>04>2h1-ruP8E}^HH zjlZDfsOYtS4|W>4v~TqLZ?(bkqpf859H~XMX+Ny>rz>VII^6t8()gh6yU*HZUM9>< zy&T!jQ#&*NT2%2|jpQ}TUxh#Pd@X4#{j4pz>rcV9O)CxUPcF;P^R^G4VimG5<*u&u zi;S~#ISv{|^Rp>svaS2kbJ+LA?1Q4QpB;DYIP|El>yJh3*+Vh>vBth$Gizn#n94=g ztW>IU+psOTaLH%K#KP9EcNQF*BYv*PV&6IL)A5OKFT~UZl{fTRc+{6Ix?wKA2NjO&Ojye<_=BK=c@^#J`>iIa9y7$Zg?B3($V! zuNQafL7#HdSM7cGq|ZFk=;+yc>wNl|t3?dIJ(pz56u%D3IK8Q4#r+ve8~+}&+WF|c z$TY(z@hnF#HQOcEpS{uB9?_yL02;|f#-IiaXn^49&PxrTOdhb#1Z%rN?D47h7r~8= zsZ5|TfsSSc4$!DUKvN;>Pf?C00d_}$l+ty3PHhP7*H+;0^7!gub~66uC1u@y2Z1RK zr@UWZJSwtIeVUT61V?)Jo+23=I)LM zUJERPca?;#ba<|(`Os{|x=Ff8Ip38#zdLU%d)%bWxU}rz3a9B;3|_B8)8?Q#*L2kd zOVu;GUTfV{I#y;sslr|)+gxvl(1hU4eCIGUfCdLZt%e;;>j+Xp`(rfO!$DPCjNuGz zSy1yShB2Jy*{Ss{>o?hF-TxO{z#0SUb1?7xbZU9uoBn@%5JQD5!~aeHulBrGme2k5 z{Hm9ay{f{(c3H**>fcm4mXjWmA?bHo^7iK7HFtM>d)8$jAM)pz(L;IJ7|-t&HuFl1 zcPt9rW9hMDJI;rkE=u)c zOf;WnmHB{c$D|1{6Z=@wdwNtGC$#P;`W#WV?nH|tNTMTVB8$_j#qmNME2YaX2X9gl z*d!3XZfDzEZKFhi9Zc&~l)_b}N5FIn&Ds`fHjT6SfM|iL;7%n;?sE~6-OP&Ig{mgG zt21=O*&4MUcsUih%5Y@%)D4&OV! zCJK}S`czZ|F4bJjFHl&L39{l~V}Qi_bhFiSQ!j1vI<_fM;PvmBOGATl^$+(P6!l%V zr0k+a`K~2xk>#EVLob}uIriFz-(u-9YTQ~dM3OgBL#uH>QWrEs-Fwd=f zd5qb@O?FP2c4_Hmui~|g)R%zeY(GGmvP*ISuc+d@sIaW{+b zt1jU@5_%~EYUhM4S47e$RDI+5cY5X|sk-7KZd zs^zXOS#cMfUpGc7r1)JvxpteWDk#WBZxb&c9R07hc4coLjM~lX!;(Xx2@NNhber~@u}elr>>AqxWn$W%tW^M zmf0hSH3sq`dp`%aefSDn3!wUrSuuE4pJlFep#*3Yw(N-)iXO)BHz%g<;BPsTVfAcF z?h|l=y)jAqqa4S~izR0=Z=X1!n68JbF*E* z4l;Y{wOv{#Q6^0x#R+6s{tM7(#e*(gWMwY>+W%R?7gaSB%5u!SP|}kb?R-d~fc0Nj z>`tNUjT1il9-p<%R0V9q?jqH7%!-d^gKY2s+feq@D~8?an7M57t!p#D@so3UY6V|Q zPrlW$Eo%)SUY@4?QHDeEKFH`~kkK(4b;BQ73K;EqDRFrl8#vP?#jiV3sE|@|*>G7d zFBjO$`(ipDJDm8iEZOI_lnB_%wL685H%@rydwkk9Q!TKAq>EMSm=zDt?$gc94v}D4 z7coscbEW1vg|BZU|4cVlHT69jp;Vd-&Q%{7E~iHvs;G86W39S*@nl!yOQHLxO<8lv z{*hK@$+E&@Y`mQjlJ1S#nVPXys}pt=PoH9vn%sG%7o4rGF;C$RPfE}c=WyNr^2ViY zQHc|Fq)go$8l>8L&g9Gt2@{p16dAd2z1NStvc!46ulHWHsj%Zp4@@tA_@X==c@Edj zAicK|0}4)RrDuCg4Y9s#keqa3LdV3yiWtr7N2g9XC-vO#xk&2c0KH`rA)8!#BKZUU zG0BuB|CC&qVI~`WE6iG2HfGbQn^HllSCK7V_UchruyO3u5Hr51mlsUZO*&K4@JU(q z)v-^;PJuaA%eLsA&Y3Xz?d1ttmWva8c%+03jrxxLo_SEznJ>UDrgPWE8U>NP%aWsW zPa8?Itc&Q?4sX=H_`K_ns>Q2gpBe+c%<9w4J-tbTJ!Yd+_^X3cUlhC6t#P>@VJ6TO zciC`h?o6?xjoKf=4~VuFsQx;(39Lag_w*JGK5#YL+FkIaH*|ws=DDu}sUy9XmgD-TUJumU~X;n6Pel*u1+D;U~omua!4M>n7eQ zbX_yc&pLPZ)0R&}%6ZRy0O9i_J;z18e*BI@j4cZtb_t-!{mt`rV%QE%=7bia_-fXC^J!28?{0}6 zTej6W`qnhlgG}pg^l4A(3*Vbv)HeHRz*GIQK=Wz)XQ{8+c=7ESi;IUrHsl-^^*p}1 z=;=;Pop!DIjorI8{<&%s*xQ?zzHN(cb`xvNM%i!`+4ZNUuB(;c3w@X*o}1jdy0S@1 z`rf&o%;;k*+&hx&*L7IOP1T+&W+b!f&{4fx$GE~jvzVIgnrke1d0P*sSb^%kol4)6 z!UK=5-p^WgUgzTcO~<^%cWX#%$DS3weB(peJCkWswRJeB{iwAs&dFM``PZ{z*LSX8 z7WIYKXYYN&rWl#Lv^#c6@6>hAIx}-BtnIH)1uK6r>FT+#mmdOcqj`pr^9(I46V|wOBmFcC( zzaI1UA37#FY1*tuQ&y$>-_O@vnYrp1|5u)0&i8)2+da3aYum>jNdvRZbGetDoa6DS z>P5H|+oY@&a~f=`v%>GQB)`7u5&u=WDo#c^{Lr~Ig|CbwPdjOv^>5l3^hwdMw>ST} zChHqkqkBq67F`HuIdbGim1&SUU%NKz#NyVykC$iI#qNzZmtC7U51a@#&&`)xz1Zbg z`i2JWut#0mMe8<{*PP&WDhL<46q{JP#!KSZgD%q@MN=7L65su>S$kUK&eWEIaE{Me z(Y1wUJCd~5Z7Bc4V}3_;hjxp>`fa9W2btC#5e>g#{copcLHL7pFT8F`%}ihnf7GS@ zM%I2OKS<%POWWAgA`VRb@rbMVxOcul)9y(f@4DgwB&LBBc59!J)!*sJ@y^R>mo|#h z_B|j`Cb+2R>LOL&x}RUy%Oypp`{oM-X&kzlmt)-)&FEt;H^q?S*t2cLY3|p)KHYTs zjPsXEf4P{MUjInm*7v_&Y5)5G?F7DEy_t#XN0nN-=U!Xey-fOZc(KIn8|NG|qqj{m zee}j;xlKgD{e^~C`P;Skcm1&B9|Lv~xDMyw5Y~1;4vDg{2Z|d?1IZ@W#>zs5{ zvya}))IV9*^ISzD_;10EOZJbRTN#$@`EO_#JTF-1ko@e`_EM*ElIuS)9$U6`vqtXe zpiOB_uK!-cuthK z^;_YyHjf`Hl?9nrx<@fMe-7`uh*s@z$-|<(ec$uVclHOrPFh~MXlA-jROhS@$I`ZL zPT8s}94_%Vr{HK_OyK*9|7CNub=(bN^3`8i?M-eI?m3R_Ljv4!Ux6aCuv zJ%4-pG>}21AcOW5s$J|oo0b03S!l+NLsIF@+GdZtsz5F`KEASa<7KOhXN<+}TTFfd zvh9l^r%y~`@8*M|-Gxhc)c*cf|4P&@{EGFx{dd>c`mODrd#p2U-o__(_gT!%*3Mlj zXe?gshr<4;W1Y-$j=6RQNo^LNmzPfJKz5Vr8pZE2G3W-IhMPF@hIXm@B zo#bDem$UxbJ+<@{d@1Me>uZ(FJR|GQUhAI47tTem|F)$4py)A+=(m?k{J+1G`_?6u zma|vNb+WeQ|Egqnmde{Y{s+1Ir={)Roo=!8_Sf0B^t(4Qo-w&MYoq9~z>Md!nEb;m zViLPIU$r~CD7kmqnYiYio&q{g!2p6G(c|WHmY&!D1D%z>)T;j{`e*CTT3~Eb!Y-XkF?3FuoBjj=V z{HnLt=G!lB*3RM-dm8xXb@aTdSJUF%Q$?ctwUss<(GFkt^2nw4)lO^kb~ql7%$&Dz zUFiY?vjab-#c%unRQF6wp!Wuio=2|2b$_m$|L&R((&m`b8NTk!%aezuT9&uh+;l$= z()Oi_Bl&ah{GUJ9uK)Wf(rn!d)rb`Hns1u3LOS1RY?BNB1Jb0E@+mmIb)Sg$EVe*f z?X$+y;`kF~L?74gpW?gqh4+S*Jdep*>-D=1f;6yz99Jc>p&)f(Pq?yYbB0as8I$Cb zUj>d`G@9lOQtn|UGD&NPy~Yfk^~W{CKN)?J__g;u&!VYpf%e*Gjjw&JagmVDl9`ls zaeBhUH6enNv>tdFM8i%bzk_vu3F#u-p-n-oF@Z+QQZ~wji^MPR4iVqLvj1Ia4u7vn$2IQiv&Lev z{E0HgkJFEs3uLNCIEAk|@m~6U`m>XtZt03W_Bzr1qIv0_2Gt*5zu2z7?9sep-;aAC z$rry09NTEZx3AGd`JmG7AlJJ4mmV&T3Oo#ID_%cZu5xT1sIxQ0R%|J&&fMKgmaxv1 zzMa~|vBdGnu}!~?&s!AOwiKS}O%2jr$SJmTs@A99V*K*GkW6a{(XOIvdUWLqo}c}} zLCw;Y=Xs4>@6>MJv+>QpGsf?33Ll$hIL&jbhmekzcIcDuvN!adU3-nU#q`c`DOz8A zX6GU;P>4iI?2KG&cYVYAqb|w4+g}~D=sM=NGsL@~$+dK8*B-0VOM#xBdy?an)fJOA zMa784&QmnqoHG3)7j!T^nKQh%pRdS}3r}l^c zS|SoUGkwj!Fk1=ti#If9y%!A9{c}1+B5YNI_S_kA(T66xJ}xZZ`0SLa&hfkHo9-;X zq`q{;DVxXH>l!z@_NcCS5TtwObjrQd$dyd%HWaohpWZFi|Gd{U{K~uokFHO7zG$|w zW0R^~uXDi1Gw1Vj>z90+t=v8@)qpKLVyDx4kD3S8SFcYwGE18~(ogq$&x>b16B0W8 zlPyF3yuC0fc9Z@}rf{VPTqmtc{2Qn4T=b1aZ2zZY&lC?bJ$`-YVb__}dIzSS*f}Zh zqlL#?P94Ux1R45 zGneu76FZL$2O=&@#CWQ#Te0qOdEeVtR|34UqL#OAI{LR@_c30Ei-!NMIvZ?j*=V~n zX>RGCX^*;I)wb(!M_846R%T4gDKyFycxt`+jPW$iKZ!Ej$G3YQA@NM|H0wWuzKsy8A`d(Q%dP95CwvxF7dH+QA5GU@zh|RP z(7Fve359HV0+U44C$k0S@qF${WvZ7reoG>zGko2ads3F+5n>xGzMl!w@KfVmbO&TH z%Rhs@t%f^gIE)?o%9l98YN8-1VF5<+ZNf#AStyJ!{i){MV&iyg2{p z4W?(3vtO)#vS;HNiFGy?;)1{H1^#)(*mibtLe2WSy=SwnY=bNXr)){_RI$FYb!+9Z ziz@>ieRh6Y^fztwzBiLr4ETM6R%>wryvp)vpvts&ji#1-MVvQrLTL*f~0F(InRl%*`E5^ep
    +@=Qt^fX-_4$zpJpPfO2sITmoh1Xkm{%2FX`N-wE+geZxym<6}-?3+=bNNDc7~gro zwc}Bb&0eQDN9vm=;lb-}XTc5M?)|zT%Vbvw z=qECUADC)zS^J3RFP|`7y&tz$fLgsWH6OPx1%)}g=pt2}2V6UZ(yCf5K(1+h)U>Ym z*76ON#~j7$tEFaNFR=A2@n{ z8OYfyc3{ z%kJKI$5QR)xl=KmmKq;FW^8fj=~*nmKC$DncFnqV{cVk3_-;u^dglvnn+pm<=SQkK zY{uDnAJ-p-4yg1G~ z3M}oceBLjDBMylE(0;fioXMQyU}EE8pU)KDICAiD%S^kld_#lw122o0 zQxEVu6+}GP&|=pLnj1Uhxt=8tY}ct@Ps{XXFN-in8Xs)g^YOs2 zFs^5dbJk2*yPWI;tp(-WG(){a!}mM=tmc=B$c2B1QJ;H$;gsmTi#|QreL=bF)-f*e`ri_>ua~SziU9?V zSoo8$^($mNUhq17I>vSVScbHA%%8W(IdPW_yK_0YcT5V1nHalwQIWzza}G_3)A7=a z^K|MzZl4J9iPkn%od;e{g|6S8DNJSN-0SFZFyh}WiPGes-TQkXj<;=Pjq%i2cjBJR z5{MC!r{km-=j&8|+&&p>#4>avPDXsYB~hDvvwQzskP%^qx`~Y8LY>;5%-L6ho!ND) z==w1UiPN!va#KMGt}B(3dxubZOy$zr-{0Q;ms1OWGJo%)G6my1Yp|-!kNH{5@~`X9 z=I|?gE=A1~W^FvP)llr1k$8QzAbg6p#2x3~YV47Z5!{Ql+ii|OmS zwO`JAr)~3c%`sC`Ic#z+PnzHB zC1Or~TBGqH<>e!l&%h?-melB=qKCSiW)F#!pUtit(ruK6AvZ*-}nN0%uXQZ8pSW-6Adz#B8=Gf@j z>1*CkIBa|E){LU3S37npJub?u&Xlx@$?I>wTk-qKTD7TbE?XRyx_TisCSj6cu}sM1 zg2Djb-pIK(|9)bAe{6y_?;mr^|G$cN6i)Ez@~~cgW#jxlkr1)!u7dO2Rz0Ot*Id4_ zhS}s|#qSVXRsXl?CHKPA#B+Y{S)2ZSv zue#{#w#0&^&t;6++84hzSzT~+4ztPCAG_MWO!;%6l&!e+rKr-j$6a4m@ILM8(Aju; zy~{-H>m^3X1t<3T+nF)n0;%3{TgFzky+V9qQR_=ykm@a0d7pU+L_T`|Z-K!Mqvgvv zo0Fr$+f#QWonoAoE%T^x#Wa~mcU?}1ZZn^EvtN7CW3xHhb(>UJ!o}jU4?W@N1Gi<3QL)5bHWb3^$H za^_8pNvyG7&AU^nEW+mzm*Vz4Vl$*S>4Q3oi`kFQixk`SZFXUUnsmE`f|RQF-Ps*G z4*jyLv@UWjd9$pr)q=U$+3Zlw>vioZxjjVv3JpXq^is?GO$6bzyUb}ws z_C#%^_M*j+-W8SfVR%_&qZ`Po%<^3u!29y<=bT6bfz_Cfc2 zt?-(ZjfUY%URx{W`rllty;0_ZoBV>8#}=Lrzv4ab@>z>@8+K`bd*W4adG;C6c{#tsiT+=t)5@ubsnZsB=E%D^=PXZ{D4>`@6As|NR~F z!q@%N-M+7^`{)j#PfAr&-9l>{_m)@{@OXkA`JTax?#hn#UKOYQIwT{$#jo zmEgMFhYD7;o}N0v%DXqT{Ll%}rEMRrb&h@A6ZJJ-{Qg9V>UB$&mb^T3Z3U<|xiVKh z>i)viHIbjz*n(2C%(jgi*(F$$U;gO}JGtnma_m)(`>}}@R}Ve)@|b({n3Q$mldhn{ z9J&c9=U0c`*W9OU_$@{eG?^#x^^N4ONUy9}zse-5dQ83KOv(gyZ(KJ?+2Gs;H`5ut zzhCR_tlx2U!mD??XZlL|Z7p!$zvbMc*vvOA6Scc|51Thmv|S%ot3L70YnkG8E>~74 zd0sDfS!BDp<7>(jMmI;J)8Qr}yX?$uUKWHOvc7ug_AQ&o9JddwkSP_2%sDbOTU_c| z3%7M-;R30OhKm97PgZT8ap(99+xr)KRcykaq&+?ZO6EC7rp{|KUGnMD)ETRu&)M;) z>&z!nUfYt`D|bbI7ac8VZ_V|atKNNV^T$VB+SetXrJULLjA7rh;Fvm4)4?n?MoODpMPv?D>&1v&>plsvFyJAm?>NcY{42zZj-fOSpSO3JlwRUIHmcxhk zv3;0!UG9h9*STtiN2j)4m%7>@b~ag}tl{Fse>t81dVG$&>*@umT=YEFv;Eyx{%|L` z0HI|f)7Kq|a+6Kia>;R5dbw0@!HJT%Ww~cWn`Omf-fNfndgTYmb~8U zaeJorF)N*2?>2^P@6cZ-v1woO!dCUzM_G*C7AJ+6#WuVs3C}qzdbc-Gd7Z@ezWbKj zvX8vJGir)|gJ_`UOP)X7)+YJd zBj-g)1kdVyb9XG-v9Eb6qZDuL<(7||&M}F-ZJQY1z36IlvhwSL7giT9Dt29dm}%XK z+VxvN>YS#ni|En57I|RNU4u{S+OL&)aYx*+a(eb?&WD(b&o@NO&|ZJ6PuuIYwS=@n z$;+;*JCbIy>fGX0p05Q7l4$o6F|&o|Y5$TD`=Pxle7EJqIa7`NV>e2L>wIPb***W( z#an(a2)XU1>>`KTTYCTe6sG$gD$=H zqgF8!HI~H$M%_Png`o&y+U5q=-HA_Z`PaUkBDP^eNz3l#(lMPE5*fo&gjKG)9T45Q z95hEg4dRiRLQrK#c+CY0RGr#Y<#udZR{PujYnN8|lxyW1Od8$TNlv&Pp>i+G20fMzv`aT(zARkZhw8f&s3Xl$D)dcu*Y80 z(p~?5s9N;D%b>a-YyX-JTB~YTY1V6P-fAp$tZL_^tNB^>+ddy#@M`v}^=}F+x}M62 ziLKkxt`NJ*QFw-~cR}mv^)1ImXD+YYTy^+ZUiw~(6OTJ5TWI)IO-OCeDx7c&>_J&} z!}%cRxU93d)?zO&^2;Ru*`L)5Z%69q&z>r(UU|FXrDL1ys;9YE<*f7PZH!yDVZOOr z=zW)U7IB>Qf4yd;Z@zdtvQK;3#LMq&CEjV2xgDM{qb$m8<*$uV`P`5-dPJ=MBdp}& z&s&cR;-|}e%bvFOTV2{|ja#;YU*&i{=brfWO?;c7;p;6uVPDTa2X#k7m;BmRExe7p z-g&n+MAbdN^EX#z*C$E~Z}vN#5o#~9?#}XV&`_#G=k1-|UQs67x$B*8S8E5p>s;}D zL520V&7s%-DH*6en=|d=>N<;PCEObYq58~$pqFWp~+gAw!18R9(F13JT5B0 zqPk?u-l+vUnH=HUWI?vFfcD2AFlb*5GDg{-BO->n+11OXp4ER^(}xh%f};r!J!c5a zW0H)Ixhckfk81_f!g^}gTr zU0Tr7vfZ=)-nY9fle6Q*_o=&9O`1G;`ltOrx>pqGKmAv_*=F;@nMa(54$&P^6W*PzZ*iPEan6}r380YxBa37P#gyLv_q%!+Rm_!@l^=gob1G7+ zvs2pr{-cvqy{r?5KGdv7hhPBW~5UrB5C_UZ`aXNI~Q}zG?-qu zuF|PruHw2+)TvnI9g~cX|0(;kz%yp&<4@r(1EGh;q3W)C{NyGrow zrk#s25|i76oXYsl#2om$_p?lV=DsC`TQ1Zx8@K+Nwr0`Q8B1#Urmvah{d(h>a)A`4 z@IC9d9X8szc)me~(EizH&KNp}7m7w%mdk8?^mC7Q{*E~7b_~g6l-;9mg@z(X<@1AGlh&lOV&-4RR?|l01Z^i!a?YD_MF+254OB0@H zG-}ImYJ`WK+q?7pab|ZxwRLOeSf@$G2ff-d^KgdbV)njBH?@>c>0b^0?OD3~15@7Q z*}s>}JN=|>liN+38D7Ue$4E{)nZKnt;n^BHd48GAJ{p-Z#*${`7Y<$Ne|{-mJ*98< zw?gZ-jdpgEZ&zJVF$@no_w{`)Eu*qJEY+ysXt?^q-b*#C z^Zb1OR=kT{xzd_tU4d)hx(`!-SG?PicCBwgw7!q6d3i`&Ky*iRfzz`?SNb()yT(Xf zQ8zXHYOrI{f|#FKk3KG3@?&p06i<|*oncf{(-c$_cF6Pey~U9Qim z^aaOry@!vF&w0!)_ukXu$0Rp?8RL*0dco>V(hGHj_N+{tS$|E-DuKj+8|MWHfSB{$TK|Oc9piOwosZdkna+c#|PBN8_xr&*N>sBPr ze0(G(F-Nc9=)9PfRj>J#PtLNgEC0%H$?NCC=U(r&-P>pJLgM)@9!2qOyoql;-hH`c zdExlf*)KgkcN*z@es;JrCnj>2mqoez&vPGkpDSiAJ+z?s&&)j&*up|rAJd68Jtkfn zvNq}ADV?lYw*S@@e|ZvbSuP^JFmM8krT5~Ur}|Gn?oX46oNBpF-1%s2!eaa8otugu z?6@fNuPyc5qQfy0waqX0uL|Q_6FhyrpHz(Gk)Ls^kMZy>(#v-D`5-C_Ns{p<2Sf{8 zML537-7U{OcSLdfUe~=79b`(5Gd60^|Nm|GZTFycAp!R`6sKO)s+Te8i~IKC#nS7^ zv&s@bYW@(ej7Uq{U3SOQN^!HSxsDpoEyH=mZ0F8DePFt7ruEF7fq&lI+3l7w-8N6+ z{nlblcBzRM0v+~h&p&v!HYn5Ti1~^a;o8qXRdSv^)XKP3tJu*X{DoZj$A8zEUYTkX zJzZBTQ|IoR@StnGU!&Qi=cguL5sh~JtN%YE{cT66-F~$lx<_<9`t_^#nDCvFxw7uA zMuBSL&Pzq-ZwcS`Sua&{e6g^-ydzWP?epqCKW&@eukr8MvHQPvC>?Rtsf@0Q72DyY zUo69RVqfu0r+cBw+h5JmPRYtIvl0)ANa=rWKF1(K$lOBwLubM{{r%Z36Sk*H^e$%a zJ1tj#J)ixa>Eu4HybqV1nsz?&cVRmw6!~S%gTL*EMe`bplk*~;HLVJr$vtJ~rjn~O z4nIE5lllU zhp6@QV*W`#>TmuL($%lMB+OWcA+s(1NcgC2t zoL1qmem+U}a7*L!)y%z&5|0IV_ zow6^F&L0w8=oeKe(Cc`d=gU#Yo8cU8I_2Zi-Dxt(uRfai&_R&BQG3s|KWoa~ z`h2>2Wc7aoqXVKv3;%qMV_X;VG(Ck!@n&tk+w#Tj_YWVM8rT^BB2yzpWi$Wgxy4Q5 zhU+5dX{SV_DI`8Fu{xjHcUpK4v)Q^SJ^V{#))iaLHTl1}OWHE@da-I@rdQ&%>D~(e ztCr<&$da`b@4UF{^X%aG#xJV4(wfi^7&>pg->n$I zIU);-Rv+U@ean%!@Avh+O}Cw{G&PDC>|k2Q67t9QSjnvYXD#eZI7PZ7*lh(I3A$9XsQ;-x7y&vfd9`?Rgu^%QhsK3>&HcvbVP+uJ#iAtyLe-PY-QbwrysvQy|lF?^u_{No?wm8J5EM*=Vsl`2q_M@ zmMC<7>Z;I#F%Qd~r++DoQCze*WFjc*20iQg!0UVB0&~(^jzmkDwb2W7U34{`a+QCG z5O4q8{AJ}T%R@{uVRc_0ExNEcddl+OCst>099f^5dQW3d8s~EJn(Cx`$yYB;*w$g( zs6FjD*AW$~k6q>0o3x=#BT$2g3z;C;rUJLFpt?~TR-~C@u^qC~SAhe()d)r$5aj^v z-b4@utW5_*k%<`4K5`@ibo>fTH^Q(3qP|b3zcP}qOP?tBdDBtlE4-`DU70QwTX}Zw zuWxtNl2?3Yc*@NfeqbugQ?HY+r^da%G0|#=(VK;y$BI?ASJfx4+2JH++FsjGI{)kx zeU=!;aG@F6H*>GfH&v_O=)fLcw7R?Jx!27-PC~}(TnZX~ntcxf?KY9w8rCnucH-i; zU$gcuc@na>{8-)p`Ae3p-S_P2sheLuw>_U;xcKVpujjO7>Ymq!R$bRuegfXitXTBG ze$ip0YG=*w<%ds}9^cdLK4H_>_1Dek$T)hOR?R@?ZOupB)*X72XqST6~ zIeBl`uOHp6YI|j|GK-XBL zzwcHa*1rDUBG7XFmXLkdBffJUSG(_Cw=QJe{lIYh{I8v-UM@LP{pG{5Q{5?F6n_<) zX@1^!y+XQlx*23!wqWB>&CJNSSeGb%KH0dP=079( zm=1qa&tEm?-Tmn7ulFwRyW^Ah_vGQl(v(cV5fu;0GjojBd!T0#8N}erq)-G4&s6M?=K(OHe zV=If9_)*8kT|Zt$hK5^~?VqoGs6C4Pg?0;DV4QupS8eHv6?#e!xOO!C>9XH{sQHPL zb8u0%LHIN7e_p{wMVqYkQ*KO^tueB++!;Ap+pd0TRcTStry%?A9h+SKoq8nLa$B?1 z!pm$=MaJn5*75chQ~aK6Gs}7Cv7_$zPwzT`6F;>7oi*Lzsno%$(8a-03m zcaxPQ*R7CU@V{YI`270@>nE(S+_CuL`KfPs#iOUaS51B04k}@A9N7crk3YVhp7i{sJ zr!B6vbLGkakh|7Tn47*g`TRL;m3Y}jpBaw-yp{aDua;=U2qwUROo`sV2qL%N8x>x?Nvy@)3s&_ybASaq4^3UX{QTV98EdC&$M?@VmKmxl9jsL@+{%UXX_h+F`9QZatG#Sh8kU$L|duZQ8z0x6}6@JtE3luG*r# zSBB5Y%37urV!ma#TYQwwBCY+uHuw8iKA(K8ZQ_#Do#kelnbuaD*F4-irIB0d+K#$AvvREE zuM}*W$!6QaUwf z7qnBg{v(HzSKRtFdRIY>8FL(-J8s9>ND)p zFFF|;2p)4hmCO|58L;jT|Bj^JdvaHo+nv0p@FdssWZP;!KGp0jJ58k}dFKyZfBhU% zB6{eDue!CWyXNy56Nyi8Dob|M{S9y`(%#E^zMlcS>DR~`973Q|RFXo$2es^A0v+1| zOAQcTLU{_wE#Fsw@@&eM5BJJJ#|8DUdmp^orS*XEg2h{|G~etLU2xLG(=frvBR&Gx zj)KOYQcS`&^vQ$TD9x?E`9L|)D5}DbX$KSNU)52s$$|7Ka9wa+l-XVn!GztvijpSFoM&A+tj>3WQG-dMzUR(nc~2xmAOhkWSM z>|)jD^Y^~&zr(*z|I&%|JTorOXpH94d1q>ziuP`P$sRK! zWa|6a{Z>lrrsVu7a!+17`<%J?^e6U33?T1|T0aZ_QqVe~G<~o7Y~=^1X3bvl@4iP~ z?VYz#mC#%lNU zey=m>u0nZS;^|L673X`N-DG}7J)2KV>)rMpb=*>*Ec+;2H~sZqc7Bc8-798J*i^ZC zI$N#Dn}wdMVieCmF)UoVDsmgkx{5~*$3czdKU&W(Ts*w|xPE}~$#@&5md;m7rRxl8 z+;%QfSXTi`Gmjzv|7vi@BO(J&vI|P*522lU3IL^=~MrO3s%`wRs^e_pL(Zl*^^yuH~*b?lV7y-Gs|iD-TzI_ z-YAHfxxH%T``vebO>Y1GR-kMD=8h?$@9k@s?do^}=}rj5f|B6J#Zz;?UakJ@At}2v zmA!qMtc=&NQ(%*dQnP}fW6I%_wMSMPWnJ3%2TSPt^21=eiyzb$Spi5z1 zp!QnjzVk)TWgnbYQc3?=;*^m${qd<1DYe4;Q@2cg#@Zek!&}4`tMb!5{Z|%Btm*zNMnRUM73AgGKo%v^jHS0fe z+)q!9S-JGzf$nGF7VFMDW7b~3{ffI${KpvHP3BXILM6aQM|j;i>a=vv{!MMawEfl8 z)y=*CicYF8IeT%YVvOd^0z*s7o3*pA#NSl-8onxAU0q$D_iK3Ct!n@s?F6bYKxIC>$TNF->eR>E+xw%tW%_jSJ=f1{c&;}yvn%Fg-Sx+n z8^zym-P7&|I#goEQ?Ii7+rQrr``Y?G^h{37$=ZlhQ`+H?L=|<>#Llx3zGW$$qD$2c}+>3BULGf6E&Q_MaP>*4?n;`?NGcQ(MDf#?DVq zI~OsleMM=~-Rb{!K07U_Yj0^#QTFb-?tQrn2SsOveyrG)S3lFwq2GGn zuXL?bo%m^+=oDe`l3&^;6Ccgym-_RR<6iv9|GRc(J?_3Q_N?ajuj`k-=4KTNXr6oY zM?_EVm6gcemOZ*Vgx1FhKAXA!_NAgq{YaA^uhUKm&r&=2*R54M-u(Ww;wMU_zHPrg zZ;O|$oH3=gzMF)Nj>nHb}iqYH`6K7R?W8$q_mE29wn!EJ*S6F>MyRPYbnvl_- zPdSHL-Go-2H5Lx~YPG-T{^vV&Uj#u}z%cxUuJuA~U#r<$lCPE)wg{XH|M+HRiykO- zTRitNS-P!nez?)QG&WG{+;w`$d+Qc(dxq0}F6R!Wb>PF&jKcoQALM;l&U0tdZ3YGg N22WQ%mvv4FO#o~JmvR6A literal 0 HcmV?d00001 diff --git a/docs/public/aEs2RuA.png b/docs/public/aEs2RuA.png new file mode 100644 index 0000000000000000000000000000000000000000..af3ad1905370c2acc879409aa8d1eb4e809c8771 GIT binary patch literal 3784 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 literal 0 HcmV?d00001 diff --git a/docs/public/aTnG8TV.jpg b/docs/public/aTnG8TV.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6337adf10e8096d57eee2d7513f0cae6e904e9f6 GIT binary patch literal 46839 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 literal 0 HcmV?d00001 diff --git a/docs/public/anw9cOL.png b/docs/public/anw9cOL.png new file mode 100644 index 0000000000000000000000000000000000000000..09740d1da57157a5e1f15571ec8daf5d47aeae0c GIT binary patch literal 82094 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 Zu0P&5&sF*Kj)8%J!PC{xWt~$(69CZ|B2)kX literal 0 HcmV?d00001 diff --git a/docs/public/b4b7KDb.jpg b/docs/public/b4b7KDb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76acd2cf5ce52929cd972878115bfa6c07c74af0 GIT binary patch literal 288162 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

    ) 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%0D#-Ae8#CCYUI-JM;E>h!=irtT+kdnv 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 z63%0DC(LV{8eOA3bIohf(pmgY8Yvjb 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ʦlU^;zv9ol%qYKSvzc(0W$&Zb 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�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 C;%B@7 literal 0 HcmV?d00001 diff --git a/docs/public/eGO0ohO.jpg b/docs/public/eGO0ohO.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1c9b730a0976f32b576eb29e2dcf148b6d2b4cd GIT binary patch literal 11793 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 literal 0 HcmV?d00001 diff --git a/docs/public/eHJjmnU.jpg b/docs/public/eHJjmnU.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aebbc9d20085a73fa71a3fd6024f858a3239af96 GIT binary patch literal 123338 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 z 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 W_N{!%KYs=W1_n=8KbLh*2~7a3!=P^f literal 0 HcmV?d00001 diff --git a/docs/public/hcegguh.png b/docs/public/hcegguh.png new file mode 100644 index 0000000000000000000000000000000000000000..98ad8ff19ca76c493a0d3bba5b08c89849f4612c GIT binary patch literal 19408 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 literal 0 HcmV?d00001 diff --git a/docs/public/nLaiYDE.jpg b/docs/public/nLaiYDE.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b31413693c333e3baae8d83b6cd8c42d95d3f92a GIT binary patch literal 222428 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

    obAo9c{YD;}jo6NP$X4)m@x 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�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 literal 0 HcmV?d00001 diff --git a/docs/public/o7WLvBl.png b/docs/public/o7WLvBl.png new file mode 100644 index 0000000000000000000000000000000000000000..abd42d8c055cace1302cb42cd9e69e1d39d195fa GIT binary patch literal 3524 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 I&MBb@0Gl8M@Bjb+ literal 0 HcmV?d00001 diff --git a/docs/public/oHYR1yW.png b/docs/public/oHYR1yW.png new file mode 100644 index 0000000000000000000000000000000000000000..77bc73238dc07ffd1051e9cff4fc6e72cf5474ce GIT binary patch literal 18766 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 GGywoLpBIz> literal 0 HcmV?d00001 diff --git a/docs/public/oITudbX.jpg b/docs/public/oITudbX.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7edcb5781a4e595e0c55bbe724b98b73f5ea1734 GIT binary patch literal 444216 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

    8FWfX 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

    hC)9GK2pNn?LM*&(OtX+aovG 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 z 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�Qs_!_Ovf}Q428p(s_qC^c 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%0AM;;CnR5Ja_O`k#oSi7C8wOge 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

    $d^_lVkA$Z@KRF7JhKCljE2@D@axFgXhVe zJ+Vd>onKmVTm(h-Cz);0Ykd>6e`E9ne@D?${q-CAQ#0BF=eD2t&v5gCUXt%~wgj=`=F&)!*_}{ zE2HFIiMzBiMlZ_RQx)Mr3&{H^~^n?bogfCgDw7zkzPK`sU7nsw3&x&IlBw{)LG&ld9@jw5xO3rGF|zsXwizclGLBdAs1OwzHLzvIeD}3 zq?w#xahGh5Zjq|yp5UY;W>ta3Wd|oenswk^RGC`JvsYrqyo#5dnSyWCovf8on<)NQ z%R6a8hj=ny>xQ*YTz*X0X?ZxEz2f>NS-Z3AH~7}q)b(%iia)B9f4}WB(>KYse~pK{ z`23tL%ms88JbAX%_tF>cRX1hd^1b?GG0Wrbt<5Sc%gYpO<2R@MQFzI+>+!_j9v+jT zcY5C_=JY=?_mEHN7u!bOn|fzirXQGY{D*tSg|))TH_8hi?@XP`?s1PPuBn?*$9alY zL2dUpRU?(%@;z&2G9>4*WSx{-!?LYR_3wn8YF-`d0uK8GmibyJ&kHv?C3In$PH&8d z+l3jzkGb1scL_a;N%U$7w|{V~W!)4b)pP%{bovsiwUQpxKYa4rebq*xB&j1@nopfL z)I1I^au(dn*^>7}R(Y~9dd9@SQOG-dQoROiQWja8ZoYh8HtFhNbw*?_SGXBsTlKJZU}xc|V%{|pa5e{{|ri!>RU}_Rs3?iYupXJ7#lrNk+>0 z_emd={V#as*m0VQNpWV)QZccTQ#`G8W`^F}iHs|f1AOv?jc#rfyla1Pxto~ijK^iF z!ID`*-&4+bwYi@2(CrLjPgC7?TJEe&^Rh#Wl9XI--DPrbtdc*`d6U_lX-Pqxii^3E z)4nNRG#_|=&|_|tO)6y3mEri$5D@+6%yZt3;2I4*m5eEEi5D^g*ES&ysqVx@KR{xE9l-S_d`03QUAyZg(gj=no0K)mj3qVo-N&}u#x#Czt_v? zn-o_R}+6W&sR#=eJ-xAnpnS9WE<&8S-k25B9yxsWd+55&XH_!PbdF)I+ zq<^EtASqnh_Q*8pTO1oSS$YgCQ}maflxCCTc9Xp^mm|aewqt7SiD}b(`AxhYEt?0BaWmNh3M=Vpc4tdBbUsxQ<68;cjE&h_O~`KB^au%0s{Wy0qkd5)Ve z%rol~^|xPGve5j&8S^Kn9pB_+?0+keaI~-|e&LKeteXTFEov(an;iNMc(U+t zl>Li&litYE(aP;y^udcK_q1N`51H3f>r1^@)eD&}T%LGd#L30snr=+zu{)s$PdNEj z|7Q@q{V9IOwP_wf3)-|jS|0gz&EZ#KR{9}!T4{+#ThY16zPtz7|J{+4+O6Qv<23VV z!Ynm`D-R@Y_5?)6GcLJsFE=N4hdS;a-6fc$a40=@x@Czrgbj6sL=82LG|st=^je1E7S5^c82)o zOwq~d6E{1uDfRd#og0%hjAl(|+^HgdJthA_)ES=OC7c|NA}TR+_~i~o@*Fa%JP{Gc z(y~(_+1dF-rd^P;$h>PZlk^Pr*e=bkP*amsJN?1rrNGfwj~2B!OnA9ayC+G?++`L= z&K6sa+~X%EyI$UE^sPg1;*;Er^NkN?c^vtra@E*vMdpEDlcj|!CPfRGWWR8ozhq*R zlfrJxjF}7DFDz46DN{T;eV$1~M7R)NX`?r@L{y1N=8Z_B{)9|(bBDJIZ=)Z~dMMuf z#Ob6;r^<{8f|4JkWCX-EIwz?XZjrP|yYzRG+N)~m`V;k+^y*9gGc2>++q&#=tYLYJ z9wTSSk~Q{jKKfG)6}Ri2Z=E_VezxA8{|rtq4JT!B+_qr3{7u`Ik*nz9iNJ;Y%Jw(x zUi|0~x!b*h-Rzo>%1LIm%A|men zLO0bLCmi!sD8BGbv^z>rYqv)9G8LtX)0>0Ni1(ZjifCT3q-7%$hbl+AyOOinhidCd z-^#*Q6iH^e)QPS1+a!=0*_4^8bi_#~%AF}WUFmS+7B7W_MdeH4D}O2Q7I|32yD!w^ z?=&>B7Gin1%iy&s+u2S2K6Pvs0nWb!U!B`Ee*NR#RPcDZCZ7nmCWFu#(Xe#|>*?&r8@}8$9EiVL4 z3aM~^*qXX(y)P+@#ay0@M z?Nrq8c$2xOYtA$QMS()M4uxp_& zD8u3GWyWM8&?Xbv)4WrP$6%BF3r?ZbJLT%-H=dn5Iiv6s`?+!BYRiNIVm*440#y>F7v$Vl^O)bZ%&euAZ))G&PLAAZ z`e&z4Gn#N$J7Us7g{iYtjO$J+v;~P>xWT=n_teQR_J05=+`=;)-Z1eJ$&dyF`F123-dh;0n(RLOmFdm`_l2`$In zR_vViGg;wni=pn*GRt<24Ocpi%91|Blxmcv3=3tU)M)``?~FKhiYrZD_C9c; z_DqKylS-qk`5N=y&G(rxzv*$r{u5Uhw-`&Q7U;Dv%+x)wSA0Q3cE{xZ3>#l4KI)G3 zws7~n?8+*0q?p(4c>W8&qLbz?%B+(r`3+2Sg6Ar({wriW#runmkk9PM&2zeMw(7r0 zUiw4+USjH@pVKm#!rF6Nx>dV*x?GQkI2=<8tbS3EE@Dz-!R36TGln}+%eCzxS7f*3$t11#pCNJW-5bS~`ds|U790K@J>kxl_Qs3VO+}H3e`B}Djx7dt z$J%$?(2ExKS^|HKlxbEiUfI4@DSs!-D0FQ03@XKs{2Nm`Id z_k>Tew(>U&7D=ByTKG_@%*JH1flqyVORBlkPNm1UMIu=P+IZSjx*rHCD{kDBW3bN3 z+)ed%M(3PPna;iaPg0C5H>^C>Eab|2bBiRS+3BRJWSL6_zCB(!b;mEOo#yj4@o!tQ zmn-(z)kIF|9bSipGdGs=+~rBl3G7|QJ9)#8DJ~@{uXkL%^kC=7tZ7CTs}(PtxIHau zr8r{&>j80wt*H}T8=05r%`AQ*)M#YqdceR_AXnN;eM0sH_rGj?-Z!~)d^?hy-YD8A zU1t(}V!L9pi}j+z0(VbH=sodm^A|8VlJH9CrqRLOvPU|L%ucR9d)U!CQ2kW)g=@|U zNlwyXmO7iCd9*efZgM;JvMTkXji8c<@9D*)Rq^UmIw70mQr@Q#{e^Q#HV-pcEg8-0r|7k*P4 zpLXJ$O0L7vtnH!eZ%QqcJ7H@k?y^&UNq?>Li`k3!b|)t@KW-C{l=CpXexi71@*Lrh zGAp^1l0D9Ca$HlR^x>AEpsb5n{NfOadF-J~C2ehUZoHVtEV1swren6p9m+EdCwVK2 zw|IX{bAKiG{wi0@4YwF~O+A)BEb~r8%6ZH_(DGKz^Vr|^bJB+^-X}}%R#i_+kdyFa zcDwJs<)rYTU&e0inVTjqs+`s5!KS|P{DMeNLE|0y5=ya(A#Y!lPA6Htj!St!7DT`5SSUBy!NX7HMAJ{?R&GS#BjA7!{S+jdt@zIn&F zfV1`Rp$NB}Ck56;4`0mtxlMnP1G96IOoeJ!gvb3m%6#cJCLGc82n(+DOtTeYm3s9@ z*oOb0&O@>6b1l<<@oP_fbEAH9hPIk$mC(se(J9lFvT{^K)J?uKnVc$1nI$LwWSem4 zboP^H`GkD+nNsABSowHO7XRJ2{}cD$hyNK0%H36ben%VL|IG2q^h)X($`rm{G{Ippr%-0ot0O-oBUZd`(hFwY;(IK~FP>@BrxQC=kF1&XD2wI7U%^j1 zKTPt}Yq2>{-< z<+yn7JALT5vuScvlFyW7%?6C;mDlKgAzSPI|H|u$(){h$aijg!Ml{7!hWuQzZ6IboIX~0BlTirkiMHK zOPGvU_hzQmM&)_Zul36xMAtVeu}+idQHuB_Ig^|7&EjN!VYgNznnr@}I?n48xzmX^St)Q(CQhX+lQZWq64VOn*CC0O@Ch0~M07dEmsT1y$U9eb>r z+1op}DP!8P0~ua{OfH;k6D1T6bpOA_z{AYQz{J4Jz`!67vg2Fat4Vq-c2$!8E@zn~ zy3}$>iEyF`Rq@ZpUt1z2cCL7{=fVdIyMBW;?JrNyivOJ$ z_2A}ueyN`VjjtB&{3*qC?3@Yf^bozW+Glyb_I^Jf)oP#FTRZ9ayUv@c-BbQE=&X6L zfc@&FD*e7AKU%qp)Muo3weTLStU532KSO0_JNwK)u0`yxkjm6QqG2tp8IT^r8N1Xwmj2b z6L@Lr;i602mLe`w?03X4Og*l-YwZ$^gtc2{t8Q;zV3w2qLG{$hMHicRICkrpy_x);>u|fO)2}ijVk8s z4gRzLqhr2Nqx6q}?w1*LI-2Qvx2&%Al~w*ew3+4Rq^(;YRNu^~l#~DVxaj^-p|!aI z>EeGgQfGfY7Qd-3ZPjw~+hzY5-imcz)cNDQ{H7E)w@U$-o7{raWT zY4`ONo8A{({i^7;yiZx|=T^-*`@3IsO)jt&6WaRpjM1B0m399aCSN)ET}RCBkDgmt zn!#>8d6|Z54C3qevESVFFU{j zXt*q>`&YV_JF(ZL;jZ_01Jz&6eCB5THjb5r4r`8ovRZIpmHhNI-+pyQ)oV5KHh${6h&J+2sDs zycG1ofp3o#gWBwZKVQpB%!OGB);!pqTf6Zn-!tCQc;TL>5*;h!JJlA=e!rh*^ZCDf zZ_hGMHu}W*kw=`%Xy@mqB#&s<`hbh4zGZ0ExIf)~ac;6^g3+CNRS|w0=6`dJH9zY} zn*QBRZVr>v#N3ESDpCIH6*r2hbpQAmX}eTkxYsOW?Xq?D`}H>bXE=M|_5KalL$^t1 z1o3THzGkMphx76^C%KikZ(GbUC*|}NZ;>BPeSS65RxDZDQN4LjY1w^-LsfBaU(cGM z#o$~VclL2-|J)xRYUc57=eoSn&d~H*$L3{~ZIyREUHAKXob$o-y%m>PRy;G=q0O=5 ziK%4AGFMCUoQYqTT`>1LHm6bI64!SLSN*e}{_g(ys5gVHU*_|Jz>6;O-yaxNtZ?^r z6590Z_&RBWB}(5voHw#=ub1c57rYjbDN}daUVD+Y-sNw5X8DKS*|~^i?s@Hm=e_Al z`mfe$*#{q%UCL7I#2Qk1F{)#G);8-%RiVwQ%zW1tS%t0lt5IKB#`n^2o5F)BQ>8tV zbT0g7(77$=+hLKkN}^oR$K>Za`$>X@>(|s=_qY4cAQ?C4qOdX5&69&;@iU3 z&3|_sj;%lJ|F4_p?PK|khtKLx7nz_NU1z+HMS*)V!!#NDCsLMET&uQMUS@y1Agsq* zS5I`YnEx#)%ND!)1`?Lvr+43Fd>OU7e6s!pg(E^zF3j)mq~-hmK6^4dBWpI_x9fMl ze)s$MpW*%En|}o4?I!WOnI`#wL0a{~B)3vAccb))7XJ3^bGaON-?}h3vd1=Y2U@P~ zXOVQ0nGw(9qr&uh8DF&TUp4zn=cHCR7~Kv}YWP@YACWS9=ObC`>ir*&-!Xar`^WQt zK__e5&$(YX{$RCq#>r6qd&TuPF51sN>>W1gOv=H~yZ;$v%XCFz&lKGH@UY`z$xGS7 z;D=W&KK3g-eP(uKh0WR0CCBSFT-(5LX~WAG=4YC9zB&G9*m?il-{-oyx6l82wy@?) z?uSh`7d9=OSM9wj`H>C7#}gJ7Z%(w%*!irxo9m%+$aA0 z9ZQsK+6+%P)&2JAF+6FxoA>$V10|elyh>N61g5rsu-*IZ_umZ*^>^R@XPe;WH|y|u z*3B29I`iV|b(ox|T{j42F0(9OeYJ~Y_0!zVta<+#=5?}GKE5BgLxy3UT60IzOja$$ zBMPl=3|-Ylcvn{C-EK)SHj8upz1PTG*F^hupO%?~e@(R9ti5@qx~j{UC+&|(5pL@2 z2w!OQVyR}sw#RD^e~sIovo1~`|AUN2N8Ks~rcYHutX6h%M>(h6&D_qC9CjojX?ZS( zOuXn9&Lo@m?suC{zut3oYDtEM!kwLy=NDJ*&T8lJ2>hiRsakpAz+!>FkLq@d-?(?x zAb-Z{TThD4E?UN|Aoq-8Tc^Rc^i%$c5ufkIJ6)M%+4`SBep7SaLPY8#l)t29=3Y z*M9P!s=4@|;qiB_`2if^=QZs6qu$7~Tzfj_O=kX_YXXZO)U3a;iuphuxA@1S-~KcB zt?s(5wb=b&U(G#^87U!G3>QTnZQHx7%D-Zs?&sZmBy!7xa%Ng=ULXC(<3B^A$-m@# z#XrU8muFo)6Z|7>Z?O8KSr;|>mwG0xY*F`Yl79c|{o&&ed-@C`8|#EvHEqSG@<|?& z{-&!;cn#9p%=-2QBNa`A<8Zw>U8rman+P;!D3o*u1_H$m%+V5&QH>J4YZ_0xODE1rCKg5jgb@-q9LeY&#V_-wFv-#(d6 z6HVn6U;M&S4c`N#+EHqHFxjggX%WqldM zHUu@4Nv&l!c@f7YbvZp^inHYEf8|-p*L7C^$(!DBXR;D^a9P^K%96)=yInU6XDS@^ z(z|jyG@IqT>nfEsN-rZW z5e;YkWq(ipUB1S&eYv}k!Dm*+@U+Q^LNoN=pNpu-F)`MQx&1sxRcra>lKsl}%N&=b zUOwg*ar=J2-s7{m5?_DzY(0^%`q{;#6K;+PlU7fX);CCVYnL*O&^(*TSE?h@y~@$^ zD(6}&`>prye6D%8P}^m)WLmaC)&8rG?j8PoDR!Au_IYb=;mjD`n5)aqrS?XD`_FK| zsl^NzQhD z?YsMoylCZ(=Hq@g62@Paq}bd(A7aZQX~U&A|j>fGd0 zhfcLGt6IOT<={etqHCd(4UWj{<^CE{rI=O}Xtwe5-ffJJg&ZPgdxa(0c{2$$3&-!y z>%1yDfsM&wNw@HI-J9(vt+RDEf0S9t_wTgdiM^tJ?k6W^l)ha1G|?sE$X@-`!o?AM zYpT!8KR8`gL{CxRgZFp+i!Zst5_nBRdT&cbYgez@AU$dBrGWIra@(B>H^aSW#4OlQ zU7mHo%dtkP=CszWU3D)KlaKyevXwVZ>5Yop0fV;x47+p!-~MV+_!r`F!Q;ohx;gIu z8D8byIr`l(zU_6wixaatk5)EKFZ8Y7?BsccQ9rjsD}EN!_B|KWT zTHk$jQ^&S7cMFBKb}f+asEvJnL@06U@^EZ0339Saeon|V$|ygby9+$SA%Mx`)b z^Se~}l?`V5%a|hCGhS*YuGLOg752J zT(Lqhl?z-dEmZrvj!jE^?SvALw`9$FhFi z1{KGQ6a$sleCn!ffhwtyp80fvHQ7YzHuDh~k=EZ0a>84l6{>iw+kV!f>RH4xyVS53TZQ;KgzmIv>2J=S zYPIq6*}ZLy%R(nwOFWp^l+P@$nI?TvId5^nua(cEGg<3@D$F%z@m}u2zjPMg=iY+3 zs|pwUNnWWqD|hyg@45|>xo`(I{p7ZngY%j3Rv0LQgVW9QwtJTxw_PIirvuuyQxuLpMcTcVE$qCZx z+w$f+9j@aH+PS_Ys;!>!#;(&>7cP14`nNxO=G}+P8m-HwIc)ji(sro*Uc_F#j$OqW z_m^wNFMCwLePoqcoX?TRshmOjCpBtVpZ2lvyJXe}{oHE&?t3)Hncj+wbK86@?zB03 zuVH?9-Lz9Y;O)r@X6qzw7c^9~A zM4eyXt07R3%zHzHxe(ScuFf37MDH@nTXaCKr$-Q%t;mk+P+6beo`cjm(+ z&4-PV%M=7&ENfY9&Z2ldbQh~wXU+LuR?(ghiyFV(Ew(C5GtfDG;lz*Ymca|N&FqiQ zvQCZbI4`}T;Gg!N^GyHVmwwmza@pD8s;Nlwxj9uAZ>EUv4~bLSkn;G}*KN|K+cx|( z>CY(hRN+6^(iQigp>4_Wu-oi+Jl?zRKkB$&R&i1HvI(r!dCNOEkGS1eTjIMXj!W@e z{<$4rS6ztx>SVy>CLa}Jz!)sizs-RA=ik)Wl`P$NYU30?PF}_95x!)>mEHwrZ=c;* zb3-c4H~;o(h82tWHwPy1m^BnWO}^WCaKpOkqA!l@|Igr;xhLp9gG$EN2kje7?ziNA zo!cJ5U65TBouI%y;l!Wqv45xLeG5KuxMHziqJl=u6%{s9zU|7Nne7zvKKOU!^`7{0 zFn+t>eYG`ba`(1a%)3zR_bu^Xk>|9u*2j@cMGrq>@;UOfXWOeCweGdWbe-6)V&CUNA5)#Ve8hh7oLj3Ntg`f01+PkHK5rT~rA%SA z=foMJK5Cnqo}K;t@`MM6?UT#LThw=WJ~$$}GWOX@#{8GA9UDp)1uPMgT)kIa@pjhc z!)v0M4&A$W$ok%c>ccs<${LA#Ui3`mn)&|mnI-+^|5D=If2cbOE}u~#9`|M1)zlx` zyF{ZRbajp%{QEEHqFiXm%AiBNuHP9BEZ5uc@UG^a8{)G}+^Q!3s3@3yNIA3VQpU!) zNp-ueCa>J;w9#;u3Cp)dJt{ecd%2e@&idTr?YZLAqTppa1lP}2SRwm!%e@7v9+8>> zF6zh4%B&?ff4cQnp2>N+>qPCBr46kyin}Jnp9oIox7aVTLU&SNmID2woYh#r{`1z& z8{+Rrx|Zqw`k8Kd!RY#qRmPbn^O%>MU;Rnex;N`KM`5e~KWpYi3+ghPS<_Y&ALXsc z&0O>Ry?AY|M!NHFkqy)Ooe~cVi<`PQX|oo8<3GGuwqnlrCi|0zYq#-4v@Kr~B(F0s zYU#FRygxV;Qg5rLJ!n{$H1)SgO1WJ8HwB*-NqxU^A$6k+JCi>rbpA8=sIDnn`K$QQ zz8S8YQe*ttf2zbKafPgoS~rn#lh?{zk?1GqeySgAoF?7B<=zaJh&j9KZrOym_-{P4 zID{{-?D?C+@~{4UTKMI{)xGM++OuPMcOPLrw8f?S=EezO^81Fk62> zFxT{)@%sBaO^aEAPp}v;|FB^F({?|8#~sTG$;vlT?^`d|zA5XvKFvJh?sngu{~1(M z?Pk9FvqkMi-UqgYdKZ5F+Id>~O=I=cj%S_9j~~c>$o?eptI)nj@IS--ihYkfN?w16 zT2Vc_uvRLmZ+1ues`&4Q-pqSDT>AXiHJz4BD~U099$J}i=eEz{o`^&;ANRiAh%Hs3 z4A*K^4kj5reRrhyud#w#Pt4Nu8>Q`X=c#wEI5=}Hr*rMKd-Ayl`kTKg1Rl2ec*NwE zqmshG89fiedDIkxR;(+IWvR)%VKr0a--7*mtJEy=Op96!)Z9Za9}#3qTHXI~5$iw8 z3op~B-E{C4oKac-wP8;9zB|7%_kYpYdcD2>hjqz98yo%@^{n~ZJ;D?xxU>9eNUxmL zRwr`uLzV9DKo0i98`ajl^Za0T!*a5Hnf19ndm1*$Db17q(Ddg=cU@!_$rovTw5xUJH=U9uEXa45e6ke24)as1Oo;TU=$QkG*oa5Of)ET zXk7UJ76S((Gb5wDK>o3cB`R&^o2HAlJa0-m%{lAXhl~(s6GwZujX{wWuF3Jok~&3v z3^NuNELk(pBSOvKW5NEl`k!X~<2RV$^^nCe^@G!mi=16CLJwwM;yv`Afx|?_mG{k> z9gC0uh<~=tyyb}8rrm8TZK93}f0F+j^7X0BB!MXX7L|{F{G1CnYS{=K5xQ_Vp8Joa zjg>vyvZ#tW&W?%)GxI+FI$X!C(_-6^)cbJqx%w1;?)5J=T~jMDd?c_`ci|T&StWs~ zvv}`6xTfBuFumot!ABR94^vNx^F(x+bl5*N*jO%e=mBsoPMw;=!3^u9XYNx zdk({g0yCTxd!452usZs|BdgLdUu1`q$3;Wi>6*PgezK>INHsZm%jl)4_pi}e;v&q+ z{_w1~{iGiM2lF&$dh>qf*s(}ps#LR+6aS1Y4{ny_J}#Q^VUG09I+2@f8|G>2$$!e` zZFdqr%-j0dW}0vu`xK*%Zk>OY&pQ0POJgEe?o$>;Avw<}`5bkcoeypD)Y3F&eE7`% zp#8ywk7sm+_4xhY%(FkVY177s4_`a7n!f+&{d~@ciinH6D&}n)S`PBGoodcVdYCr% z^X+Edv?QU&Y(6>*lf=b&oW+E4d;%s*+dG%GXasJ0H22WqGp9}|?8@n7zt6hx!ej0i z|FnPFOSiW;aaJ6@@WZsj=$p~kKMC_B4T}$U&(!ph-!T8S{f+%Df9;dMe7LFchqKC_ zvBv+vAC~nl99c$PPO3suYC(sNeDI0cVx`F6eB<<#2fH8adz4n`Z~7;VFHv!gPgF$U zHGv7I>_s{ay*o^NHeE8xmeLdd)8C$0;3w9RPqnHJ-YH3zF?8anmwvF3!^A03@xJqw`+xqOQZc!HN>Ti%!0elHogJ#r zOCQ!ux&9%-NmVXjMe+15^FQ*%g=*5m&AJykc4$>7%U8@?DkML(>4V}P6X%Qd&%M+H z?&z${wo%w{!e{BsHL9MEQq+4af_fD09y#KbT(J1x<+D#07I-dnbTO}=Dy%T`QlgPS zMf4)B{|s{<>neVdnf-Z7gm*~uwXiU;sE;%Je=g^)UlrkTPkxf5%h9&^E5iY#?& zTPED9>3+p-M*XM7ww(dZNs0O*r@K4b&zw=*v~j|WdE%%3GqC@8s;2QWu|`;0_4Hr8 zkfk5{BjPyczYExrawY!ae+D}zN2~fx7VTw@JP$rhRI5<;6RAFQcF~a~{~0z_820Qx z$UB|8epmXLJ8qguvsM2y2!Fh|toYDN!-_vr3P&E?)x2;?>r8})laC^w?B}F^`ak!J z8S)Fvm=VgDZ+$@!~4h`+u>oZuKcVwnyNa(7}bgNu8bjC)d9( zWZS=6?u3b>V&Y_hmLs2{KSdvWD10>9L$ChOpC>ETLW(z@iLCI*a8i1xxW>uHp0&gA zhvNEY$M&R2eTZ=4xN)|-DY>MgmhpEBDrQQF^8h6>~9aHczN}Dd=Q>!QN z^}(l^1%DJTr3v(NKDH5Le=uRzC)M_+oNfOZW*xe)L`jY_aG~O<5BonZb)LBU!QvY` zJKH);XU|y1&wuczlg$U`Ln+5yWRipu6<0n;U-IEWUaHM9bGJXjLK6QO7HP~CGL1Cy ziMjY)-u3=t`=v83^49U%D&}S^t;n`LxNuS0H2x$f{$mMy)DjK4!qnv1I&4%G=exV` ztrh6;W}n&?^l;M;lMnNci6p19@b*6A@s*hA68{bA{$DNCDkT&1O(qBaRF(NJ#H z$jCVI_0fj+Eph@gu1ZO%DQq-2(qU>a;e=|-O^zFvHGk<}vS+Lk*q2=ev-)QL> zjmcl^6V0MdrTtl!mnPqIY{Sfp3b&+_Q%_5(-N-V!bkXpKjy-EzmDthC_r!98@@EP4 z-?5pc(p7c8SYr0W)IavhAM6clP8Z5g*q8L9YmRVt!e9Rz`xpHc{!*X(P5g@IH`NNq zAMz9Su|KF&e~?*a`q@l$_OY|ila6&bKC0ZP&)Q+y*`oMxLQ}L9&*B{(J?opw7xuo{ z)!~;>Bha6|abAn!_d}0wd}zIVQ(OE@y^){PH}6%Q^IAXk)@c2RKWK9;XQ{TfSCH!gmSnvKw=W6kH@eAu0&D&%*f5Xd* zwf-0We(q#{=6>-<_cP~^Z5$ke~~H{-qZgf14e-!bCm_!0VH zf9s)5`(2a7rcRwLns#=!;+~wQh!(Z9L=Go`rv9uW0u#O+dz%*g0G$TI0?%cKvVj|5+qR_bzlswZZ4s^yXlU+;q3NdmuY z_UN-t-B{rC&g#&itM1De-gL_SQk8me$FsIavh0ygIae0D1x=jvXgS+y-a`wgs0k?~ zr;4cQI0`he%(Ca0^)Pkgl5Zz;rK$xY!oMuET50!mb(@K)OQ$5qpGBLDWK#LPrY64> zI^x@ZVR@XCamJ*JS6eqXzi&RbM@^vZs7R+?FQ-Sf$0Ba$n+8*bcvVDZ*{zY^_=`v2 z{2{3|A8)E$d=c%oDCNuPUv;hV9tx8T0(Y2KX+LzVVV5;~v1r*g!^mxpKSTr%cw?K*(D{(w{174oU)v5=LB^QslXLG zRGhDg_irw_^-Z0t{>8#Yix#^&WmakaXK3DcF>tZNY$s*6u9o@SANn~C73^Kg`%Oh@ zi-zXHy<&gG-~4BAieJ*Jr6Tmj|B!w}$AykY&4~v(Uv`QwsuL)2wLYl)*QB;3DPRt- z%O>Z1*FW~k3v{A$%xZP=M7eL6u<|X_$_#&V|5E$Q$zQr(u2Jw45PFkwbdi%Z=U#!= z>Ms{NdG@jLaeOoElsi5@?MzFh!1)DJ{`4Q1-z0ru?55BrF8)CENBD>P2c<>#oLFWi zMFZl8wrz+7-jpL^)7pt{19ZCcuAnOKgUzPadM*hYf%}Mj{#qs96v3lF~I}x1S%pttwhjoT~gpR<`OM*{XvKK{M$xjNHFp={iduPNguD+Km)Mg1KE;`X7 zBqbLXHCtethP1%xjW14LG8aB*_*tb|{?Zjw8>@pHW;@jGdw=*Xd-z^2qv3ysD-loo z4_~!7TzI&vx=D}gPV+kpvzA2>E-kKWyi5yR?zPRjFr$}!qsZ|Zd4s;>Mx89Xxib$M zZv1>OagEjl>uNO*St){DykHZiMZalWntI0X&!g> zq3yn5r@gn-HywG>_U7gVSKIa}D;_>x%(rx*_V$Mt`quG0kJypzbn=mvynExinHv)g zO=f&L*0IsQVln@s1IHYD_lmkJ%oY~bTId;;;d8s`{Xvxy(=QiiH3>>gJNS}!qhtRp zq2+EOi=2XWyv|oVh!OZ@$G>p0Q%S`Ync7s9vkGsviP`4JmR-p@q7b?9sci2-!+8yf zT&H|z75L5JUHE)%KR5qk3-gU19-N)9B4bxc=tG|7&qf;^dz@ANGqAh-?Cj(fdhqqe z-OoPC3s<$j@K9~}pcut|$Gpq!RHpn6$3=%UF1}Rk=i@WnVJFw^+H?Ehj#G=0HponU zLy~tazv1pf(jqN1viXAo|%(kcqUf5;V-*ihz<<1dhMQ_tt@*7KT%$O&#R3O8X z?NPvVrs!)N)|&AfXQ}d^_`{{Gu{eKC*5VJ9wMt(*axA6p1uLDu5%(-COJmV#$qlU= z%?hO#U)ZKwaftWz*&UtT7fcUJ9X-!_aP5SE-v?*uar5>*-!aLS^^nGtGrn)4nlmr% z-co(=Gy5{FFUr2Xygc_8-P!Bnd-l^aJ-sN2X|0Ez&po2v^5H$pa^v-nc`No^6UcsW z(Da*$w~38_!*s19FBS^S$-l;tEvdRDklQWhU}sFGlSe-93#aa+n_E<0bj(}=@|eI@ zr<`r3?myei#bkuyk4+aBH!8j{MJ)NS`scuJs%-xmHhJH+Ppsv?5!ZNe;r`~nK7SQ; zr5pdaY$v<*ii!$^goMOsYimrZl6%deWZD+^RO=+CjJgcm0FOlQ6L#kXRs z+k%H_LZvN=h8!8!N|fC;`YN}7o)PsamRB})pSG32@fjOBF05FwV#TtJ)n-gah6|N6 zGFGfu>Xgy6#^mfVGo~%Qvrn739sk*8s4*cgcS8&V^`w?N6*O3ID5UXVkUTTUg9j%@77j^nCj#yNGNN}>S{=(a7CypGnbnQLkxWxO4N|}TN z_1W@GlIY=k$l)n~{eg=91r%szdP zd$E;Sm-$1t4$l*Lk(U_wYqQrwXS-2J2gY=pQ)l`t6*6(8MomG)+wX zIFfF(we%*kEuQgAGFD`X^Nf&?kkAjwQZN29oC>(vX%;46qGaM?*3r>xq?6$sSt`_Y z^gPFnrgMkp9A_^(B`9Pf8!gnz86#w&eB)^Ex1(P_bpBDACA}=*ZnQ-F!n(F~h6e){ zwFGhg?c~33p-YiBN+s>cq~%TA-!#kZm*2R(SvplPVr$=d*TqL>WOE6- zIwdW9sp&0sGg8uDN1#cdMd6}kR*X``9)Y~p%eyHygRV@jikSVyYpPh6=Ctrj%`R&~q?%5CsL~CoO_UB5`BQd0S-MND zO3bW+rP0j8R!KEa?omdD^NokU1SEC4f;`16q!i^>ZurPQL!(z@(T#6rX1ZpMY|oyb zIM&eJrqxVu(xfm_0egO zK5lM4MP_@J9?WOiqIxt#d9{R+QjJ8vv*Y^467R##j{HjnKm2E4;@@GScHu3j(?ge2 zLC-64mFl>kObuMP*h^$e`#0gZ`40bPs;Ig+zuc_WmMUTrvis00jxA2PVs*`BVQR;N zlb1L~Zdw%OBzTThDn)N{!iUIggM5x}fuH3QJ!~dg3G^&fY3undt;;KUOiLkS;%`na zF8K#l5AJfEo!~o*lik>3ll;PXw+~Gd!n89RcRupTXJsnfmmw6M9M}3m^~E2KeMyUR zibDNex8=!1IL+rjZ0h9O-PgV(pym3)y+^*cFL&A3Eo`Q^NNC-}SkB%zi(NW1vQBel z9k^y@{^o|UQz*;hiJO?y78h=qu|uvaEUfG1ra8{D{!RU>{mcBI=@QB1g1?gXP5p9l z;g*n~slAhI<##FzvvFLO>WWfMNl6unc(9IRasMa5l8lXPnhWM8Cx%6X<8YRqY! zuuJnrY)%sA5{H`^Q!I2euJJoOTxjxIDkLXND5_;o`wxxVW*oPA$`hsZFaGQPVsg<(I1bf!U5Lx!-)7DA3*3a$~wog13&C!i1|*7miF;j;MBe;d8XV@n!eSn^Ngt zZakQI;0MpnmKBc=n);m+*Is-};ljBE3tRLiTen;4DU1H_@A)N~nX~S+ruQ$?YN2eW zi^=JNiaffqTHRc~IXASd^9*hBZ*pwgHz77qOGn^wnXU4TFM1PvllWy`2{Z@fF4I`? z?VZFC<7;Z04|a=geBt!4wY8_YUrcPq{4+~*avmgWH2r&cR%840x4f(${B7oPWV7t$ zEAdWIxFy_nD&ONI>x1o14pRz*k5FcWh@n1q%cu#;zpbBse%c8MpG(o6f9Yo z*q>x}{*gj!Tbbsz6PFWaCGjy!TbX&KYD+&z_Uyfw64kEBnUmvODD!yX20m`hw%9iw zD>w4w9unralDKh-wM-{M=iajq7kkxuWzK9(a#?gV@o$M+j7aW7ftGF7FH&wLyDU1s zXxgFFw$`$4vs~`Ce2e-0O{(3Mlf>k-Ze(eNwAIwHFBPhGihk+Z+dE_8OvP;>ffEAq z)NVJYv1Ci!N)GW#w{bQ9!~If)o3%_+uOE} zz3GEr#_dDrw3~v{8{f1{(Gx$Web#w}qMF2&MR`YrK2&EoxmewJvu@H%#|tx73UbE^ z74~z>_}-H~{8mOrbmOsKj{i6}1-^`DnPjtx-t87 z@{P3_UpzPV9#NR1C*We&W9;1ADDqBt`R2wK{~2DHc&6@e7m3&_Ycunhc%ict?=|n{ zUs4wr$?XyA7MdW*+B%P;M&6K5MmosQLh#WyH??_3zt~?4NSLt0#k(f8MA0g+#3{&i zOZ&7hsvdnFZ)zmB7f zhkC%NjKyhgEo;P%x3an^zRzcA>DVLRblAkjOx#`V_!2|Thl(wRyw%cs3_H7*PV&iB z{bG1}b;pZZB_1`Fb#ljA%#Nx$A9vk!eQ~pyxvxsw**W~e$(P!c?-;c! zWy3bJqdu8uIRoZ(czui7@!?+Fk>1`t8cvCCTy!@0t`jMmyfMVK(=f!;!-*p~Nz%K$ zJ!`KM_es;oMIZSRHtaBu|MX7Is(w*KV{PyDZFMQm{w#Y`Z`w`#BUQ36xRu#C=Li#@ zONwtq+H9!<`5w|@f2Zj$?@`>osNX$e*2Sw$DRF0&L-rr^kP^`nzL3l9dh~e2H=VsU z#uXDLdd28-1ip#r33(^r6_s?MIbco8sSi%cl`k^?==DC#*pe*X6e!4(9V9n-@iVDk z;tmhZOf&hrBK8Mvzp?P*_8YfXX_n4km?v=A$L)^vE(uc(n?ReOp07GWwUtvjkEsRv zCk0Fqlf2)#$2_9-OVkl5={IkFj$eI(!{I0!xz5~zwi~y;zwtV-lrQ^H#=n% zc8v-jW104p%KujFqv~D zFWUu^y)xfYe`zc=J94x$@L%%cwx8t(CA>?!ObUC2-_N))#luNXI%Vo%mlj11f3-j* z35BYRU!mJ?E@x?-`XZs?a`XmM?5oG zuJhbdU1+#H(9Zn_=Q*YGHx_kiODAr+@guiYC?{E9lFQ5;i(lODG?{#J*G4W4S4V?S z6F;_GWY*z5?|k9GM8}P0f0GxlSZMv&$Nx=7u3DJ5p}bquqLV5sBIb*g{AY0Oo3Th_ ziz27-K4(X_V`?Wmyey{d+k7Bt7k8#b9s3jG`rvQ&!Cyfr`I~t3!ex;M3q_*!R!c2X zIr5mt(@6Yf(HBG21DTDhzF4bVX`1g`rnu9uYe_vUzTFIIhu= z*zno=A&08bj13p&#jn_K?dzipUH)ndHheS;3;5=u;xw`K!HpjUK4Re?ccv&Gs#x;JnIR3D>M*KsZ+#e}5h1Li80+BhlId)W}O0~`i+$*v;Ddd8`!TrevepBM)-zl`b z)0nW2XGZhk5U*_B4>1CllLU=sdPSK=v@G%ontpWCe+J36(`{-oTlY)E2#HDjxu>yC zx^+j&ytWR>*SrgJypno<*mC~RtJtRO^WbdaMkSsd`8tM)y*!GpE&HcOE)_j`Mv-&+ zqvIEIW>n}ieJDS;(MyqS!Jdi7tUlzd7s5Upl?!zV?ov&F@bE(-oTzva73!$(*mERg0s3f??3kPS>6`Nv!l+$Ya(a=p?-dDUe2_I zS|@Cj9yf_ee{lJ*vsp~wrnkYSv(I|F1u`yVPIRC2G3lb)ri+3$B|N*ivyUY{e7YuR ziqp}Z*;<`G>R;TZbH(gXR1(PJob+ItoXWXHnoqZ>vz%^D71;iBslgxVL$kzM`gwD1 z913WWicA$gd$?L!;Mj$GeC+NLF=Fc1-E8@?xzA45LlRNg(OgumE3o%$6RG1Kr>;)`6zM5)7a8aG|kLJSWE%vhWr zZK2}Gk#T1dkIz2eA7=57=67*x^F9)qki6KNQ<&$a!M(IFuI`5lpQ`^eSii{Y708&U zlhKoOw8vi{OL=jyjM&38fA%#&8*Mfv9@rEU|8VO?!yitGT`K0h+f;4Tq6O|nv?%=H zeEMRi*?)%TnLHM#4Jje^WnyILQ9$r_T0ExB>W*cWS;hqgDaohvHGy# zpGu@GE@ z(SL?b)*Ck`7P}dWX1mAS~P_6L6IaMq&G1ExS_3$QvsmEETKj`dB{BckzanGiM z8ci;rX0#}}?UB-SIc3*Z|2+TVp`Lr;2F(>48m*L@{W=2|K76PV&pK_zw1jJc1=pKC zMC@29efZOi9ZnH8vR{my4yS&Y`H;h~`%80#PwwLRpSSFt@NwnE#J*003#}5n+oHS- zb(T*#`s~6*)|L;SHoF|3;&bVtkLp8BHH}l9O`mV9-(xz%DM_)dL*@Oa$ojK8d{5N+ zh+J8GQY23#`LJk;Slc^|sU~v5y2svyfAFdE@W~fHXw=Q&q%0&R{h`8<^Upeo6XqR; zB0B1Sd15!4he-*#e7vJ@!RJ)1%2~5Y!*1@#_(N;<#MqlYEM{G(*e$XsxtMLmwD?*2 zt%rp#cst!OTqKZrG2i^3o7!t$c7Jh!R$)205A&OgIRiC2XS)7*=@t_-`PW6xj%U)X zM+4>vFFo{OUa;<=8QD=1S9@C2q(lw{|0_ROc9?A+i(@zMbfIqDAWlc43iStjH11D1 zs#(8&W5!ZljT;{}dIcI9+CMw?j9dHB$Nvl$cH}(NcS>6NV54%gz}eHM96vWj>>`m$oOznt_ z$ViTe;}<_Q?WvYWJbUYd!$O^G8;&{hWW;eSivE|Ae605%mzi3WLH57)f+x2{(vIqF zmXnyH^?iyycl*@Ye`LfD_~fMSj83{-r^TVjVcOv&kkRC#qpRNZsp_zljN&F8vv?Mh zD&gx*ANOBM)N3;l=QefKlT27`emF5Bk7r(-l5?g=@;{yE#5P6F`;6*JiEtm?jiA_ zPkkMFiEm!ye5vL&-=w~A-)#9M%5T~u^2R<<{%gZ@I?5W1n1GQ}2`u zZW6P2FHUK347ehExQ^wvP~CAE_a9oq4}4xpsB+)YUwGq6u}-vvSIaa_5g|Rn8mS*9 zUotl2eLkq=By1;ky6&|7g(I~>0-j7k94jbAZz= zsqzZv2N!!U<+Ds=Qxy23Cj3jKj`NzMj?fN8)}=xdPPUwGdvM$SpdE)4_lICf{X)Io z7Dw~*{K>&7cJsHfG%oqD!ZS$vmb8qd{gb@aIu}G zC@|s0WaoaqzJ-P@6+X)1dM(a5eVuLJodp&yn&2#LxGSV}(`k)YkC|d};u$q23Mx!v zz0b~6Eu!POeS(j{<$Kx|#_lij>x4GD7(Mdw^gq$fE3wO5?wmpEd?(uKdu(vO4*~q?COV_HydC)bm=nojBnnSfwb& zGFhr4XF|t+2G?)u?Vs#VOyrm(?|hGs=Y3NQPaub(?8bt=BT{0?f}M-rv+2z;3CW1s zVrx;7m-Ui6C7q>9MV>`>d8QvZICBzv&_wcg0S2mr6-Uw>(Z$bN?;$_rMhM zauJq}iE28N_lmzhD9rjp`QZ=YLmPurQ{J$C$U*I&NBv)Nv{@#s4RcO;hN1;%^rl|AClvC&IQ#p=d{ia_U_3#O9A`#JPl zmb*E21!wpzoO4LnhjW{>nf90e443qm#=HINQdqH~zbPY^ul>fwB{7=2+<)31Ov;%$ z#bB;R?xvsLv=^&*zF4uk`Dp2)%?o#(Q!LS)cRtdtJHydNsrN-S|H~Tw_}2al)hyp! za)Nq~*~toj^0>Uba@vIOhcB9rhn+Yw=TJ_MSH^PI)2~&6mTU>u@G+CFJM!LF(eXSt zck3Zu8Ta3<+YNjcC71X+ojqjBdA8T%=(ZM(nRmK{Z_L=0bN+DGY%4wP#lmhU9!tz< zXIp%@$x=>Wu{_H&D^r=&jk&2wiBcs|POiZprrT&g4Ba=c<=>nGEpt^avQM#*UhE_- z{iT@uMO%lfj^?F@?*$$Smh)ch?c6*^T)^VY5h3|Qd!!d^eDifSOCNX9kyTO;cBvh^ z#=j%Vrl6?AP%HnUV3~3g?@psx_XKb3oPO|chni}r#^fm(O&8frqa^uSzV12r;GJ~O z!V+~4bFO^Ng-KsM#yCBTJZT!SO?4uJ)T#UnGtRZ#%J3H0^0no{rd=i~j)89+U-;_r zJKs2BXuYXRpjKK+oSW?}N5p>yw$;w{3)dJ24Budtyc92Cp}jnb){0Gv{!)9Cu$lBPZ)Yi(ZqcR1cjAZG{^p}i z-CrC_+7F5aYW{BXQRmpzZklxTczeKv39(91=?hIeRGb869pBt68zoDJ!uq3@Zy5bUHXe=v?O@+%y(ThjkkA-^rGKlni)w#rW^%}d^`EwPi*;6Bkiom zaztXOwr1*Iogdl9UFKc%=nu6*;@y)P!0O7b}JN6y!t)^l4qzzwqu&w0rW)O>#E{-^^&LYqfpE8P0nA zL)Ev8YZ*7a6gQ;_Jea%6H1$wwoL4=cOLyAMGnb~HO55N3L*PsJ!5S`&MK|}ezX?$2 zIC4bMV7jLM61QI7Yi*}J7EQTnn7B=GPtSlgOQSd)Qt7hS$e%5PZCuM{*Zd@tpotFFiNv&-{%f0BMOUw##qnS!v zH50vprfZ#U$z@y9blAy|my_jUkkrE*7c(olIY&=C6F63;zIKX_ThGLaoyIAtwe}Y^ zxu*L{>7UV9v*xCxB=4imNjW!;v|hN#))Ca(%O)MXo+`KIG?=ejNm=1EaU6j;V^l)3yRB_&nq~4?{84eeI zO!;Q!{<~Aqclt9Ck*r=@UJs?qLN9cdD6Ys-EQpfavFyUV^B4ar&i&_+$mwEUSdyOzPaV}v$XJPFWhk=`Ig|u@P$f>FD4!|^O2b%yx+p= z14n^*K!@Rn*$1DRN{5Mxipz4;NxEMwsg+CE)|`J&bn2Abt-lH~j&>NTU*a@mO}RP2 z#b8@Mr$CD$hm)Y7=tkZxnmf)NG3)4X+`g!Lv1)RbT5wN`N7|c+1=r4=)Nm3M6liXe zQWQ?EXWgwQY-O#br5d+6?$MzqRV`xGeS3I??msvY*A=DKUMnX3!P&_t&^736QrRB_R8 z$!2j;5?r10r1OUpM|+Nti=vn!XXg~3eJ#5)R!m~MZ1P~sj*E*HEn+#=_NcsTTbP-O zqr=q~GsRVvVXX@>iiFsAQ=jcn=8g_O zqv(Un`W=~D4+c!Ws4V&+{6Pz^#8oBXFCxiRA`dJsOg-ZnZ==OEli78lwt~~+MKiAd z2u%8AyP|gS4{2@5?oBV8s%;;9?$^J2~#ig%>_EE|@YsWvTe z@HJhyD6EFVUU}n`jrqyh$#O>?+AdD+DxKFW7@Z_|wC!F-@2>;f0=1MfstUz2Ds%KW z9)CQMdtqYyPNxv-#$#L?q_X4KE_}Hq_^%_Y|0kz8%ef9SML`$4r;mIqbSyVXJrkIt zqB31l%X*t0)H_Kjsac=O$bFdOn31({_d`{u zr1qul7dhTo?momXu;R|*4xgxGvp6Pm*5ltb`JAM0yxhdOCBkG%c1609o0ExpTH8yW z+cz&XT|9AOy3w^yM{cDWCVFqQkpCsWMsbH)Uhk?PevK@l&K7aLNkR`Z@;NUz?(KDJ zUVPDS!VbGd=jOG%Q`2ALWMUh9OG@5GF+0cUpwu4ia8B`vrY2tDl&P}f9Jizej`bPo zO@8Rv9?W*+)L(u-{g%ypv`IFZ0FJ~k z*DKd`MsrN+=Fc{k<>ux%A{{ICAw`V;qR8K_M=lb_zUfK3s0c}^UQ~8mGR5h(*scxk zN3tY0JC}1@?3odp$e-?fk!@F!+wHTm5l6k-3))T}et1l*Nk2w7;K8+RC%f6bg5L>p z3e3FAFT}?s_)F?Vb&lsj)1r&29Euk07uU0GZ@rkfO265~wsWVztc@F8W?#&$*w@(+ zapRJ%%;JwzzDP?g@)z8GNu-|T(S;9FQ!~mA*>NYi9x9PM$fLeUAfrldZ-3mLc$RB| zZ`|H|XJvJcTs$Fb(}Yd$VrCy)6w8q-Br!XVOQ1!(;MSp+*KDOq{JDL$Z|IQfORVeB z?XGiEZaNg+-jT5-R@Atot8-e%v6;p@7jDbRFkh4xRH1NF@!CS$_dMQCg0oxJyS|d@ z?R(BDn&W>+IbSr|u;?b**cd0;|Ll!U zj&ROcDc3sb@ESXg2(OJA8xH+8vC!Su8TDd|wTL>644%T@zA10fy}XwuW8I^)mrWPuu7V9OL)se-=~VU zy?6XYm)$!WAkgf%@jrvE)Uh|O|LIOix;Ek1gKvM*TK0)`Bxk=2zj(RjxXR&I!cJEd zHKZFJCM@f*XQ~ta@JDH%Tt`iZ#w{o5q`yMF(ubt~Gq@IRO1LGQ;v%Imjict!k=;Uy z_6Jv-_!Fka`6We>!{@Y9-=0hV8Q34)YrXL2+54vJb8J}`rFt)laoiBJ_y+eY{fqxj z@0DGY^wKrU%+c!OEn7Yh(?o5TRnFxt>S?fx@;vhelKOHUgQO&p)0KFjhZ z=Xpn(lf(^v%cr`!?vr==a8n>g;H${8u14Lb3%&}hU3DZ~l*L8B^4jbna^_5OSfY>XXL>T>E6H8%)cq_5c2eRmj2_Y$_cp{nrs+^S_}JGYlJDe*&uV!?9DCCWV?AM3R(6IiUuH~X7vjr&!( zCLQI)J}i^C`a^~G&U+@USkBJnc9x^>mXk-aZ$ali&YZ@jAEuZX27Hc_5iN9e3A9m9 zWV+E*5Hew9$6Idhqz69~)mqO#ER2<(++1UMTIk93Se zKjq!WU5eJFO1)CuWiH}!*Xiv!^A)UO!Pde-ANL4za-4lRWAo&%y4UOrZ?)|`m3jAI zRqfBt7S-o7-uLCq;JxcECbj-ux@q52iPd{u-`^>YOqjFwUE-eSSAq*qx}WcOYS=u3 zC;5op9E<)LZLTSg0v9(~7Yn|;vP8;|XDw^(f#pJb>QCscQqG;xY&P?&#>MlUduDyt zeI6J&V{Mr6v-n39?+dnQib>txnOGjx_iiXMJr(XRD(-2N2G6#DpE zu8@5vrxjUfm3CugaMQ!6=QDk@XT}>C&sgd2 z%+vYLaN=cvzS4h&s?NDT@4RH&o0T;0Y5Gy`P^%{^%H0F>c6CXKuh=4~?^2W|x#QdK zDG$sJ{P;LymR{6{8P_al6-QnXyQe*~Te;}g}>WFtmUpY*T{q{6^;K4H`J!R z;*@)&SdjMcx0=t^^G6&DT^_WB3TPXu&k22&!8l1H-}w&j$2|x0bu@1|{%5f0SI>Fe zomlfxta1MK&R2`ejkkoF{5^QD_>XV%3>LeNh?27*21mG8Tzsj#_xpDnn;9LS1f}kr zIPz$EfwqsqfpE*YuaD_v?EYL_yLy_f@-D--T3ol;&IotFj^Wk^g_17xfO@B}ADVJfK z-Ft7v6|1y$Kj#@fHZ;z$xq589(C4OSbMCBL8uvK-PUJu3btl%HxxYd!BlS|Cx9)MF zV*%G6)tIEQ6`$|uogTD#$Bjq)tG}{eVLknfGy1cB`I(zCSC+kfB(+&bx*(jz^o zu1%}Bwj9j;&ydAshPgJ6;~BITI?~k$Fd!d8dDOyZVZ^8}}()UnZTgpkLkmxv-l0 zwEqluEX1W6X2qrX@UN?NNDmHXD-?Ke=0=>1%kv%6yZk#t_^%udlKwqq+ZlO-?HBJH zJypuI@m|iu=c}87I>Z;>%j1u~zvA)qgI6}2{(Yoe68%{+M5_AlLEf$6QPWrdoOzVj zX?M^5`qcw9VQRK1$2H_V4hJ^@(V+FO|IePRk%oDu2h*_kxw@ z`wKhIDMonhnz8!G`k$=b^#-cF@7+ zJomUM+VF0O?!7Wc*(^2jjwv%PzT?w4BFFWPb8eP-zhS|}4y~yx{Z>x-*)-$5RDaK9 zahs69JzmBIC!;sVseKI=EHL~vFIu(ProK(TVouV+65~5%k}ICreU%G(IX%I#GA}zi zO)h=ayTG;{=Tk1uVZW!Z@zvX!vPb+%tn=0@8}|HDJNUKG==F|!^LN-Tum5T6EB=gi z_LZu<5~nk#BKrSM30xz5;H#mt9RJD_W@oQIk~kfzy>93EBM%R)$pZ`_2a&Of$-mA|864%!)74tpH*xlwA*|llcpF>yo6|e9T zNyxB_c)RPEtt4 zkz*?ht{jQ%$;;jP`&sd$gw@9dvrE^X$rD>}yXW_vwLh9}e=dC_@lo^KtI8j(cdsd> zTlaS-*IQ1XY;;`aT}_hyyU?qL&RTW77kWFblAr#`%tU;Jux5tEcRo@$~2)w^L^xSAR4+ zVp3{e`%(U~@$qMcGj7g!cZ~IHU23}Z9PJtGwx_1QUb*W?wZz;GizBh0uarM}JjeW< z>B_1l=k~hu|D8T3*6Guko2zzA`#r-h%|Gzwk>{25!iDEf+`aTDGUDnp?R@K5d8gZA zu1-I)M^xP8`;TciMA^k!e6Ie||5PIajZaRhSRuJ4`tJ(8 zp3hP*`kk+=d0ezdvh~d$m$violzV2qvU<)F?R;k6`oHIDo<)7MWXU=Ir>%U~kJcO> zZ|$O<`Zuw$2M@1Xda<#2*3);A@BS@we0_)I?vHazch*$)%`(+pyeRYBj=8LMN^SE> znF84O3qKxz#%GgzX3@LZjZZ7B`uM%SOYzA5^-|sAU{d*Arp;@XM%}uTF^w~#(i52{ z7_)00{jQ^L5_3Rr9Us@uwMEYguD{c1ubx$`owfP*j1R?9+jaIFTeSWaYm^dW;$Gj6 zbvCD+`<@z2->tND*OjG=K5kdvrQCZLYw>I6Wbeu6U+K?3a(eqezl!W<)uzuP&sZ!j z2-;fyl`DOZ@6I33crvE`XDAG6S|Xc#PcP++Tb9VmN0E_}9wen|Yz~uXe;?6Xxg)%y zT*Tns@114Wi$13)%GnO~+7hJxzyUTO0U)D$NB|F=;6}Y^gxv#X-_ZeT-<_>*R>p7Ko zGSaK=I`gH?GiEtHWBwkmtM^h%!<($0ao6t`xLf#7YI%75^W4Inzj|3>9@;IpIxjru z-O_aTJA2mb-?bvK=E%wF>w?e9jCOaXub8*abk61(`yYLbFTDFG^4^|PO7|8&vdGdi zT(LB5&#C7}qW5?FoFOb%&d#mRCRw@WoO$^E0K281E4%kSdT#y4<>8gJp;z2lYL3Kh z<=RvH%x)w1-TD)uKd1JJAF;_}DDPm8DAqRf_gfr(-GIGbn7_tbMyfCCVcU;0i#^f` z=WVs$H7BcZ|COcna;hQQqHJ7UjKVt<>Kz@1$6=S6ErL zJ-=i7D)#gx!4j24@0aLzO?QiYqV(&?-K+IC)_%Mq6S8mVhkHuTi_L3da&#Vr{+PqG ze`a0O9NDz;XNpJPExvnp%4?y+d$MxmA6bR{XSnlNG4sxv()t-~uV>`j8>?AQFTcOz z0q6OzGi?4dtekFrPU)KW6$bk|$9K(qywZ8n471%IS^m1*zxTAb&}R3qeh!`!H*R(q zFI9|*JzV*j_xVci&9~XVZDp)TZl1K~_^d1CKN?;hTc>!ozH&-={|?q|yc2YsF4(`3 zaNT_;!E%p9gSS}J`u-J9D_h$R@9Mf%9=_ss)K{rpi$3b^lAd9|qcNK~PCa!+QQqHo z>d}ACRzE-U`L;oLdC+@(!wdF1XEPTR`})M+Uy%~}=g@ocoR~FtLh4KPL+ihZ2u74t zUwL@)chjk7>>o8WOg6op_9uAJ&nx>{hFBiIcbgW+isR$IBwd`+Z?-`HrNM2D^@EZGCd&_G1I@-P4MW z-&qs$Qi;2$_1e>3@w%-VsoSfXE}A%p{O){LTzQkXPxVHrVT#S`z~_}+aruRNUdtYO z&!*nS?{ax=oGNpGZ*$G_03Y!mZBbKrvaGtfo6;2BKF&~$xoy?3<1yP(nLN$<9g{`> zc%QU2<>`K;`}D}u`W@3^zFaxkd;048J12YZa3BA{dF=T+yRFZH*Pf0y4hoC@(QNrB zcIM>HG=ulXjCqg5uj~mkHVpk}Sv7axV$ZxCv#!LLZkdW&h-<)~P3X z%3hYw%s1%iY}x)wYwhzRVV}P_~g5 z5S16)wsU5f{8v6_og%IILNj(e>_3yUdi8hB=kEho9|&F{zUJL(!zce4a?Z;9Z0|G@ z%Ue*CY^M5&?RrB-*=VM=W_e#&XcW2(><-c>1CvAQdTzMsG*J;Dho})*fZD*0LZe7n}TJd&1=v24J{2jf=})&*1aRm;4><@Xz{@pBXIga2egIQ(pG!SVH}i z8>^O=a));=;?sL4Ybx&|_#v;j=a1W_=|#_{78k6yTOh07OmOz=;-d_9jo(;uFmx?{cLf*IOpi%J11j*?4CMl z)$-CEw^#LMq@MFJy4%LKUDs#UY@2I|;i;P=9(VMMn#>Otd6hnMbNQVG#UJ10%>3(h zI%xiP;n~x3x5O#j?1-9sy+FHkO|k67U#*3|X6*5~{)qX#(dMJa_0QZ~xvw72$8$a5M24!+(Z~84t3no2TznzJA81kY(FvZQlFQvtlQ%eQqCETGct3 z_g$Ed4s*$?pf{^#KC@iN=l7~O{I8nV^B2wi=T|yCy6HM|S@2we#a)}iYh6!G#Kz974IGaN2efEN9!(VC7 zNtS)Y$bY7A>-oTYEH<-l?(yDzIAzV$b4sP3MIQ$onjQLkdQm;?CahqR$kyug^^3`=^#4`S-y0 za@ik-{PG6c!IQRHE_V6pSlr`Yr`m3}$indc8Mo4a0Oh@xhdv zI~0sNSXT(V?YdH)ccZ@`E7Cq-*Pi>vn|B=S{@E0_`a5gq!#T$5&uCljn5KEsD5(0g z?%!wD>k?gFugGlwdsufR>z-Gd;rqWD7p|N*_ptPL!MTT?PLDRfa=b_F<~v{(#pzr*PPY?Vjbes&nqlj&(tg(%p;MKT17l+xoNb%yIcoaoc14 zUi~?h)BCY_PRzErMa8E(BXk~>m;P#=6Z-G@Hl7&v=fQlxrzpkFyy7`6dPP;@^N#y- zzF%1rr>?f)-7??*3_FiKm7W%6G5z7YqVRWB{Q@TK&se|L@Aw?rcH^Q$A%DE_wZ*F* zws~v4H@N()IOcWm+}F>lezr+DY1dSCNq^T_t@>2F;z~?mcX#sSqAhVJ-aKCsFErs^ zokHGIKUYKf_lBZtPY14;K25Ppg85?njCSi8`-2W^8*t5AdhbVSM_xwr8)nFP$Z{(a}E)is~BSJ^FKUFZKuMm8;0$EGwV zYw@!EOJeW8V}AO_=Wkk=;CsPE5#_8YciegZGwf_Rv#{rM_@Bno-n4ji+XKt~CC>S3 zqRnr0F1d2gsk67Av6t_-*Ze5wtA(ljjDY8l1-A2W-PV@46E4*)(Y^4>b**0Ao`}as z_PjY_GV@N9xN%>N>#kLQkC{5=I{!H17j96MWtsN=yTCS!Umee%sosn?_;Y0Q<)1Um z{yNP3F>`}i{uQH>yi!GHx&Auj&v8lD{nfa9t>11B(>2jELJO`G2AfU~)GSo)T3OhB zq{x&*buokG6^8I_(eZ-!MP)*r=Q?OD$mP@GEAV@@ZqI@L3=>UE<>#FLGk@io@?M9S zRYi5Fa>>tw=Gmnm&e`?u*{s&Rj=iq>@x-FI!Ng6KW`RpQn zZTUNkVzVoo4xTx|Qn34@*4-rLRj&)uId#gPaZYH@+ts-Ck?2XO<=-CeJ@Yvt*;Q?C zNc8an-L_?pSH#c$XtUk)A?(4226wfkNoW1nTTbP>Zf@xNYBMj_N2YGYy@}JFRyS;O zp7n4}*h#;;c1oejHS$4cFFwD%LR;^~!P@syQ~xt;)oR?9ne#I%TOld;Sn8u+77e+2 zCnJ_yrnSxVE$)!`{!G)LQ`2&PN2OlDcfHi+)cByQb6r>iOV5;-t~Xo|%(HEV{gpMV zzgiUw9ba4B8+?rTpB{gd zbSqD*_#8*{`7_?9H6!^p>lvQBb8wz9m*igO$(FlkI`Vw%JzZJdu9arFYpqZGyOh<} z<{QQ=tvIv$T>WL%ANzy9blr@8E_izGxkIm{jDJnP^?NSk>_>~c_T22eIH#27b5L*H z(wSGUSRDS(pjfl{K&uR|&;05mhUUS#0oiv-D~_D|x4^vF?xEJ^!hJFVTOJu?{OrBD z{js6(tl9Uq`KEtf;Seg~pcCSk`LSc_VFR;YY8LZ&z1Pm3xr+a%=z{lxg-3EX3#^{i zp0kIq{&;xhm6*8)&n3P-vSurv)~cs->=dV*@!_{QU)6E+e&9p#nSbv*SsD2(G-G;5 zIoFRrz8j4{>zi&>GWXfS-W+VY%xsU*75&G5N&`yL^v}<&Z|0W|EIxBv{IX=ejC0?D zW#$np9@s4?lISZo+Q@ITlS$3IVphS?nxx-XcHjGZCi{=T?xXJejhVl*Z8%u)=w!p5 zonJ*`vS%b{*SOo9nR!w!Yu|SRn=`xioXXg{zjMy3h*htoR|IS?>OR(Sv*Gy4^A@f5 zN<~)Wtv8xyYRJnfD*W$kl=>UBXN4B`f>(`w9dScP_LZtV?!Xb3b~n>7JB^^uMkR$6qBpDD3F$vY1mbBjMW8Y43hEUH_;NU6(Fb z@tJ$g=4n4Z8@A7X_f(oC%DC#tuJZGO*&b&j_8d&TJ@?F%n4^AQ<@t|9*?M1iW~Gy5 zwMe~cMQYenk=MeFw>8%3J<`)%vHRxSn2&Wap{FYD%RMVH_dFA|+Wc8+;yat?0x>hL zoVqu&Gs-qA!E*7DqU6Gd_R+~}Uf)~9$F`tpzSSSMRp&e|*dEq-7alQl5BqDw@*3Cm z!A{d3W6wVIoHD0XI}0@(URi6szOr%0?b5)=+;s|;ryntIu2x+iZev;9 z)pfLbrcj;T!v74yN*DGe9v09p5KD+egQi^wC z9vm@?{W)*>_rTRA8{fQRUAI*F+_Kq+XZ&Zl!gc@1(PJar+(J;W_{@NmFE$Ab%T2sN5VE!}qHindv$a`Kg9+W#3+r!&lx zcu^eHx&N!C!4;{MZNFz)u6}27v9#dOQ+H+E$Q|tGEm}KyFI<*(+H?9t{mHxc6x(i1 zkL+GL<6ZT4y(urIasMb^ad25oms`RN`*#)|uYb0^xN=Jh-_e(X4JA3Xv z{c|RM<>!vD^FC!C{~TLw-g_YO-Nr|e=hX$Z=67!Ux7aQEKf}hu_7ZdE`3*Mhm<7!x1wEda&$hbC1zG^Jmt47MoYxlsoz7 z)LKDXw?!X<#h;1om-uROZgGRm&oiPKhWb5^3kv-8jjzb1KHu^2ig}-U+^j~|1vNg! zQft)yEtC1IZ}H=^oH1YChG!Pv^&dRTmQ$MAmg=T)@v9zJXf-W5qk8Pp&9t9WO$%4ety`4h&9r#Ve+HwMYfkB#&*-xcYHniF zJ$&S3--CD`ruO4^4CSo;x@z-m;(H}p-N#>Sx@W?wkFSa&HXHZz9Mk&ypW#Vpdxyyf zFHdjQob>W5dyXs_XZaNvn%rEiw!=o|mv_@2Q*7(Noua<(hlo zr5@w4U(?okte*OnRpIY>)`Le>zom8`ms`G0Pc7B&s_N;K*x-kKQ?d%ypE)&s(wBpK z=g)k%y7*46*F~`pJmt0%Z#+wT_Wa20Ba-D;HlFYMXv4qb;W4W@*G1VC^~+udcbWJU z-*veVeTD!0%2r;D-j2@w&&)IbIIWgB?7G8T`q;kh z8jI>4I;{FA%sTaoVPyVyOV%mRt)}+etDJUE#xPm!=KJ5B4IjS>o6i5Lb?WTh_x&Hj zUKYONn|D4?v}wl2_;=5Ozw0enIrl4f;P%2~`*%s-j{H3~H&*E5I&GhqhSD(+g`~FCFyCG|3OJeO6?oDrA#c|D1{LhexNgn#6&ORef#RC;7- z;k*2Y%^UWlrL0>nAtPv(Wly&xp6bCTsrhS$AH7Y`ws-y_<9Vxqi31 zEkFIE?@)5{zvDT~M@swZ($3}w|7f3-b1kB%HE6MO|C!v!k#p3HxtHXbwVr-#-F7oi z-)GzU!ehog2alU;b-#aZT>q12O@xlx!d2lrYqRRL`UKYG>Dph4O}0ED$Lrdgraj&N znMJ7h`hrUf?k#=yHmUtxTw%ek!#m~{8dtnGtoeLr&z=2&eU;7Ac1|g_Jk78(v)%CH z8JSAe>+eMD_NjXxsX5qsgexUT;nBuBB^KLsi`Olh8no}>FR!K73U#in@3?UNk@(t& zbJ(lf-y5v=+1>ZC{LG`?&1y}{E%!LSoxa46hr$~tJrK_v?yo7KAGb?4sZH>#duP%(Cu9f@$(JV zt6q8Dm&&!g;AZ>^i_gY)PIY~@C|!|XaPMJR^p5G*k7!+ORJf$$ZF9%b>z>jC(=)z5 zo4cp)jr*$iU1sW;TMXeVHy`=B^0Bxj{j{F&$JGTzwFM$R_$jw=k7Y(Gz#2#W7>jq23vo(bL$pl8YMC z9(w)iHT1dd`YPD>{*^cKGq>+KULoCZulzIf>}TJ3W|)NRDlY%ep!8n&aDlg9s%B5A znQ6_by&3T{4Ab^4Uo&|Q??(}X?8s?Wch7~ES2pjuv$ywI_0%~V*QwnXcyKV&@X)!c7v_tv+fWsY|!-oak?8)p+yhDV=rdYX6oVC_1Qh`G`!k z-knnqu6WgW^VlVU{k=c30a^|yiu?H4+bdT?_I9_a%r+lr{ zj(diw?(3pYQ=c0**x$+99Cd$2-omCh{ZgCHe1$V3el%LnzUn?*#cucXnB)Dcx>&Dx zuGSC8@@fis`fs_^w1npFgn4<1&!lBSjW)fid@#MI=#)UVt+PVF*?PgutT>H-N~&`X zHB0rqimcdeb2#$5^||GWeae$<4_v=<_R;I2Z;uwo*4%lr&Q$Nx9M{j2wD)}#tdxkF zctp!q_15bD460w{)~{Imc&_&@sfOE`8s}_}t+!lTIm5V{^^BNucE_dQRXakh`#H8p zcFZbYS@mqLpXcI7X6!rGCYBn<&*;-Xl|miqB$WUd$O^vMh@J+jIqi%BH(;ObS! zAC)ETG7YTyH!)t~^O3k6-FB9(R!fs?*cL^Y&iXxV?K8RCsqCWhXO?XBQ}15#C~x6W zU+E*f?JLBmw9P5}C+VZN+~Uqs^K*YsuW>m3$~K1kl*7rM8FQ|8R)lCpwd{`mbDX>P znckwbi@zEpj_-JQF4*jRNk~nN`?jwJS@HT(XEKg$FMlM{VWBPS^n2#x?>m+m&Up9n z%B2^_7G(r>dUquB$cDOpeE&yUJm#pjqEM`SXZ7b54<7N?9I$zOWzXKj!85(?dX@fX zNDBGANpk0vxUKT}zvmVHTaY3>D`RDeYNG0UfzKaj#5I35)|d48(Oq%AW5%IFt4%{^ zJ~re_(-(O5POmQM>=C0Zu~PO)3$r_`kEuSksc$s9;{JW*!D8>u3XL?6tHFWy=ij;9 ze~0(!!I_RnLN9FkAbI^x__{}Twa?UeuU;k<-4=W1(&4xy89|;MM-Q!7#~J=`PWhec z^&jG`8t3hrd9lE5nYa4XGnU8Fn+o%v+2!q;e)&H`!qhcB<*)38O=hJ1yJ7i}zvrFx zv8L#GHD5&gCo4;@$5G;^sKSTGVs# z_l*3{vdMp4iXL%a`phpg({bCFkUV9bndTfE# z>0fu^R;3o@Nj%*a8~%)QcCve?udPGDQkU#sKC9*&C@p0yoy4FyEU0$qRQSb zrL@mRfmbr)9_8xKh`lL)W?y{J$1^dqwP$xUJhvCNSdnr5j{A`v<}+T;xYlENrdmJf zQ>oO>$7X(pB8=Jk1mz_&%E8SE#b55^qsR-|5kV|eI>8$`^sNa-Re~5J(97_k`PIIdP~OV&cSc% zcit>r@s9InTSTDNqiqQ@w4(kxPiWqJ=U|_L%&K_`GBX={-WQry6*I5yo44qi@pqn{ zl79-z*LX|s4KWJX|4lq5Ccn0jH;*}G+Txkb6Z*;ve)hIb|IVlVO!Q3Ag)BMtj$INP z3r_D@_4NEJqs=8kQ{9$LKT`i&?72kpZ5K9=>xL0uoK!zcB&oa*x9Q@+1a&F@tzBPRYygrw^&hr$yf0SOu z{d2Xld-(oft|fn6&Xv4+lqGsDGU3^;nyMKOHqWV=Rrq_xXWihnMjsM8k2=mx(@I^{ zR#87A+4+-+!rGej)X zEuQJ-Jql>I>YDK{FL8nPtK$2Ar|f^C7In6CXN7s2O~n;W|4vJ{ zK6;k_GsCU*6`f9fh0j=jt@JmS-rpH^YioQ#Udn?V6>~3($z}_lwv_Zy@is8}A*MP{ zvF%l`==x_Sg>g!2Z_fCjq^CF8kWa3_IkK_4oUx?FAAU(`)lgX?Eeg#SDV@g#~bJ#{r6bs=F=ma-TZf! z8qZ9=vmj73YMPH!@2&lhSQ0*q78oD<&#s|Pjy~1iG&zfSjzOp{=%xwK?{I+hv zhAg9<73tsgo=dasdB=4_kMCn}i*K@5Ai;igktY0?qanUN5pA$w*Dvw3XZNNWHA5j=a%i z9qBajs8;1g=hi7F$30+rE?_+S>hU{XIXh=N97fjpLp&o$65hY#=V! zd-|xry@Wj~_1~21wmuRLt!l3IQ@q5s?}2F6>CZeY?iy|@5o5OPiaPeJ*-`?J0|vRD16G z-vLY3++6Yg`uw-P;W5st)8$!qAF!Nr*ZVr(S2OXbcj;;Sl5$ReEq31&#y;zaW%yxv zE2-J(eMwL6sd49Y&lWzH^w2QHc+Tks`v1JI8_fo+uj=boG$|KuF zwj~=b-?{kAtqJR|6kOkN?axw!J8Vq%76jhecKYX(hjz=ReU@6&U6~r^u>V==US~e( z?`DT18WbI#<{Nc$fKRp*8F?M6A~`YIkUU_$l<1?k7r3vm%Q?|@Vs>cB_&GUnKU0)X@vs+BL`zOD1vdwFQT|9xdSvpIfyF8EjX*}_-8B4OLhyxHaFM@9$2Dl(9ZE|hUu@V)BRU`-C8wQ`Bi*`s%Ynf z&Lg}B?(gVZVB?kjN9YxM!84POGBWPx&#XOlDw^S@R-v=NvoMX`Vng;Tr^G)z3wE-6 zUOm(HU0O^1n}xHd2Q59R+n@EvTWjV+8Ijxi*?(778P3zHa6a5$c;I@^xtZrX;uhaN z{x0p0?|!2-*NxR4&&`?c7nyHxJN8bEy{-3}=x6+n-$fShxcgqbz{lrXvS9I_1BU+| ziJJzs7w-5f_nGhOBTMN!H8n?Ss#{+^54XIQ`shSZxzSb|nPXA$f7;r2wXNAT-R%6= z*_nKX{Ey6!{bwlZ((EiR4>oO*nPb^~q-6gYrmT}iYj?Iw>^j6Ic*R9*ZHkdI)psj@RV91add_{hrCWV%UFVBy9zA_`;?K`Kck>v88_v3(b<7s{ z^s}R8(~hI9{=7d*c_VqB|7YNIPQR=zx~+n{(3ks})!BE8Lvtg4&c4}hb%%}lvEb2g zarS#US56A4)m(8}w_x}BXOC|rNiE&-G61<=3T#Lvf8DZPp?yAiFI1_`b=Q0j|J1;Gr=*Z3}>{a@AO)z9gxyzU$`i; z_jrHT)Xbya{)JnQtUF_u*5B20yS}n3`&}g0!@cJVj_aQFP3qrSYvAAU+Ek`B)|vO2 z{q!U2)(aXx?aY1m!1?<39jjKJ*|d>$-Ftx$bNeZk5CGHcN)g9EC1j{^Tm#Q)IEN}qXVXJq=$)7JkP zcpoi29{+HMq5IGMAO15;`uU$hZzIDa`;Pq&`)ACnKm1SPn07I@+h;jr`6*}e1vPls zqRyP1FeT2(^v%KicAsinHTc+Vpf z^E-v{JK_ZnZvXu#+4Midq?N~yRI>%%QLp}|`tYRAi{@W5)AjfTH6nMm1fF^KW$tmS zkaEFeg(mrO%1-;QDXR;oW-0v$iZJ}opql97YI5q~UvFc-h0pTK%dai2wZCu77q#P) z_!-`-F}?|(c^_>x+v)n^*fL(>UH#vdu6lM==AiWBkFw_94gMVc*}VDpkG7pNO?TE_ zId9{i7FqY7;m)OBf87s@TQ|?n=Q9+o*gfsh`_sC8(a#v;O4mOVowa>`(EIq``i{(E zx&2DJuS6_wHkvZGx}5!B{r#VU+t}=lXP>>gA@bR~q*>GM>shyLESHtOe`jIg&Nn|+ z_OEdW)9QQlaP^9tvrqne@&YjoNv`*ubd%`W4etf@AgpT+bgEc*J?q zyJZ&-uADRZh~8(7&r&kk9m{%;f0{Pqm|{+hbomPFPrIi< zv3JkA?KwW_^vc9LVKql==bzbgzwf!_`mZvvuNXF$M?4c`R(cmy|HGX5Oj_%+!dd?r z*z5m<9KZkbj{PxHowij5i7{>x;zo}ibsn+)&mg`tP3g|F`1Jn_R`Zmj%vU_Q5_Cm& zVMzIo(Cd$u^#=xCdz_Va`R+M=!D;NTQs-H=IjnrORqu?upVaj7E7}z+%&rSPUinh% zi(FFJYom?(jTPOGL}YChEBxIyv321s^O@P+CO5w`OZ9Nfjdfp>mLL}PTwdU=acZ~L z^#Y$cJ~y5R9k_b4BT9G2qS%Di@ShDkUU&Z4Z2xHK^v}#J+viRe?W^$%4_tlJ<=yTh z85j2$F1YqD`K@PijZ(rKtf~b1dH%`d`#>dbj$s+4JCr9jm8iiJGj^_-Nq! zJpPkR;LL7~e`&#NY}yn`S9lv&BJvyE{D&5l& zbAO+CkX-)RVEa7Pz`RFCWwLm4Uf#FK!Owmr^V)+2 z&F9$`uRZ#_^Lf8u;j@HmTXlZUDV%Zhe9b8n$(={T7KERPI=OQ9)@h%^d}7o8y4}kw z2r+wX<886mb+5|uU(=Q?IBVYjC}Dd*rBb`i>E3rdT@Q|xiWwY~Te#w<^2+q!j{gk( zo%=r&+Sd2J{Ldis_)p#A$Nw4HUKg`OORoLQ_UOCVe}>~lPfyS8sXyNTp*X=LJ0)~- z)t$%%_jj1vr)*Z^H(FC#%v&VTT=`Whrq^I`@XTq~9>p<6$j-R)=xuAU#X4T+kl$18 z+z;L=uzF$J?bTDSp1$zs$bW`;$=fBnl1q+co!jeYc%=I1yi_*pS$t1rf6p*&Ss`lg z`BUNU-8=f`QrA-Tz2Xu>J7yd^ne*d{dFh#K=fD+@mfp#aQ=Ijm;iO}Xo5zjlYx@l+ z$j{Jz#*(+bV^i3}we=?xk~<6TF`351d@(p4G2>oV!7*i@gT2+y?Ebh{J+qn7)mM4M z?bc_}~*Md9AocaN++$CJC_)yBU^_OAHiw)R}1v9HhN z0^|16X1k|9NU!L++%8aftS@1yU!-5&W>&q=k5@d`4T{;cZNsyrTVo1){ieMxo}=m` zr7w6j(r=^a=SS8{9|dIJH`e30@nCAD*|U7z$=;{y1s8~X19xK=T`YOFBbcq;S zv2gwOAFYed9G+h&ymI2>pL05w3v|C@R@>39zklbe_gA#%*__#Cacp60sn&v7^=k?j zsmeWGTqxGkFOM_W?3YxtUPYK=h&CHVJkWr>7sWKm4QF*5~U#+hfMkSE5dR zO1vyBGpnoXuut{W04LE$S1USs^lkK4_RjezH8s!b$br_W`yNQ9{XN_G*IoZ7+o6n) zM?P0i?>V+w-neS-=}e0`-ww-IcOU&dC4O#_)uCjeo80fD|1)g3<`MDW{EoTF=DJyb z+_=qcR&eFC@m`UuKe#SA=KRmTPapZuE!|Yed^Ec6QDIew|NNB>B6A%U37lESH#5<5 z@9D6YQ}T_y;v=pw7(9!d7V$OEPd{k-5#eUxv{wt~{B=A#JtBSmoP!^{^^3ml+L_$; zpP{gf<=>1uC82-apG$S_wfJKgwdaxP;<+1&-?1jIF!{%^&9vvczQnYhTUYGf5oA^` zE?ri8L_hbV$+OFW7o)D^oi2Yo)73nCQe@Ti`jx)cbIkW8WadSE%0IHEqjHw=1*4-y z?*q1;+j-=+wRbOLsOiRaNy>?H4vT$$Bo_n>VH zFPfZ<6p%VT_sFS_ch*`Q`_J%3Pm9g%d%>i`cbIL?&CTpJ6P1m=E8QC^xk5^J2K%49 zIfd~S-D_P!MVY-i^!g_WT(U1b?HpJVrjxXaz2|r1MdO7ZS9)n}EU=XDNHH+DSD_gsY>7CDbk9=l(xAd#Nso2(k zyy1oUSH8<0XW3IZ{gvF)qpzxFK8ydc|AU{o{Kw9Iqi3H?F6h-MaYTREl3#LquKV9M zQO%603=6J(eiiUm#5o{C)qiKOFwZ_M&CdnPFmh&l} z*s&qp;Jnq$cWHOajZ3a~mLCp$@Z#)$hQ@Q+t=+fFWn+F!OFyz|qx_18$xJ=fv%Mdm zk$LpF@9E`vPpyJvA6c(3ZZ-|Ih#JW2ZS;QY)CG6ay~e$eMYhWBmHK9*o}7|otSZc$CkkF%XF#|+a%_9+%xP5 z%hA8GbZdE`vFqdgkC@hco*5GuUCefQjZ4(xs%bHjUzxh{=J-V%f5*0F*>|2~qg_e= zmS!HRnaI1n;PkQ+7h}B&cKwv`!0*&iJumaor5?dGiBekFYC!yoTV50=#DDRn%Z zrsZ^K+iUAK(PPVHH-;56ZuqWi3s+_vk}>anC)~bp6g4_v|xnOkZMLPYWbJGKst*#y{iT`)3RCOWD>3 zyeORMusf@&{>J8+>-QVmt!?-JYLKw%QE*tz@vuMMl2`v8o6hdzIBTuQX_lJ$?*9zt zbMpU`K2yF^eZkl5c4KxxHcyRD{pa7)dCv>~J!{!hf6!?Ck7tW6_J7=4sDJ#&{*T9h z+_W|oyKp%4d*o+^MW@s5c;p-r3Sir&|NThOk~3l9S9F*6`R~}0UUP2WgKcZi&Aeso z*vgyI<{luqO*3N0#?FWT88+R#{K(`v3&WcK3@Zv|Ju9l3A3RZFYtO+`yXQVWVl!dM z`M_}JmvfS5EEPDpdZl;#{h3*k^WEdQm7*(v2s ztJOcU?EJoG!P1S>j`4kaSG7xN;k4EEcfw|0J$h@xu~fcP%c7qvE57Sbs+`Hybnng1 ztmKmVH+$mhQxa#@2zpO^m!gqYcq!!BtaGapKmIxI=Ak=%WqPo?=DJsz2P%(fYwlk3 zR4ngR=CS3nr)o{(zo|!d9{<`KZo2pC>C>5aO1O4+?9(!h;NCe|HSX1;NUgRbj}~9D zS{^?`{#wzNyP*@57azH}`~80gg(urPH^&R;n(s`WQ*~QYsQult&4n?sf3G@jHz-fM za&fOvgYJcEY8KB+Wn#a|OuMF)S@XMddv|O8c4IdCKt+@LLfb>zWLEA@+aVOSVY#4% z3+Cl^Ge*~s`%P7p&JjbTlCycFV5ZkneFvEr&7*rjZ3p!|C|5#-UHA3R3Cg^8MeOg z{h8A4)xV}z`0Jk9k`?XuZ;|rCo#!~6&9aTfw=H;V`mp2bRNZ^ug(Y?s8b^HPO1&>o z_vqGsqiKf!mL9g)ms;ev=g@{IXK@4Nf9A1%33E1I**;_Uv{JUO%$C#V)OWA{T;r$u z@Lm0r`jh|o?H}JgY;5-YKf|Q2N2KO`G++Ore$JH5w+m#Bv?Y56x-Ttxd?sto!Wmmc zFKn$Vmbs&?xBAY(28+D?S8`3`&x9s_mDw0-IPcL{!zInvUlq^4>s=G;a$dMZY`d99 zPMVz1!}5-ui)Sp&Ds)?=H=*g?_BDANQ>NR!(h0Yo^T$W|m4d|n6-;6kz2f1=je7IM z=1*C*+SdKJasP|}*Sps{F86#jTc@qUcA~kyW2TF-PVAmEzIFV&j<1N>w)suFN@@D5 zscsM**&CZxPWY?MR;pS7$zlt;dY`S`d?%l(YTDMi_iCO=3*=!tDd*s2h2UA70 z?yDH?Gv`TM)%I#T&x|#BX|J|2Clnf8sC>rL1xLOzdwF}M^YwX8lV#7wzETR>*_XBES#aeu>ElxBsTNgh z9P_l~T<3Q-FKxEi^C&V@&d+c~M$`7X<-6CPaaa7xvH0iosa;KROz$LStPGQWq&IWg zM!sb%Po|z;S$9lc>U>AK_Ut)xj&*rYQ#E9`tTFRD<7L78qPvUBg08xY_q@vqe;0SI z;A^n#sUt4~PajkJ8d&^Za8GFQndf{S7mjV!59iAj{>nE|gz>Yqi+FoElSJPq->vf^ zVp&R`>DQi_r&e4lEP2L5SF-N$yUVpp>Jlg0Bo}-RW(c~n zG&cTO;WI7$e+M^B*xa#ZbNnVAuNeK#c|n#^(=59lUFkf%e#e7H(*GGYonr3X61?i2 z-ZgvU(zLIvvp-s@y^{0Tdd4W{q^QWzl2_4T*Q^ry_j=WzNZR_ybdfW6{@)|kU3<=M z_|I_i=9Py#D^AN6Tc(*T?mAN1ENIxVs=VCjNuK0?22WQThwsw`@7aH=^f|pJ`;AxId|VM$-NBo-d&N$}UI!Z&$EuYF5?)0~-43`J^?k(x**m32E`K!jwA%Hb zq0susi;J~Kx7|LoZmUcXdw;Q<{&y3b!WE&S|2CVK?r31Ed6iloXDqWLecG%mI+?q_ z@}J*%Y};#b_G620mYhxQ`aOep_cFD$_g7B1c%&lDxPQje$SYOnj6d_wHx4`HpKfd_ z_ugv$BJTFtojozT-rd-yws?+W-Sftu^W{9)^mB}^&zQk_MqQRefSc zVqi{)(XwN9&%BK+_8Y1)o}1%U_t~&rAZPZ1{`We^t-r4j&E~#t_{HU1@}$1{nc0Sn zJ7+I$e^(SQZ+!Jp@ywg?#oW7?>HePP&Ro>jTmdL4@$9~(ryXy!`xco!<( zbF8SwcTQ?oam8m#ZbjNZI26F^|qY(T6o_xZT&~0N9vEy`p+QspMmk8Y<=IOn}J{d=?ULi z_DVH<{>Rl2e1AuqFvFv|MCXrl4sNnu ze0^tO#_m&(&n&eyaGW-YgMDRsWw)5%9!@Xu-}54mU0ICB4OV&2SQC52^qF3PKpb1)vv}FMq<5QjwyYQa)T|qFU_;^jxMj=c zZC>lZo!llNSC_c!>e>B;>t7pL7+yIpZ}%YekJs9|=Ozd2>I3hY|LV`JU+H`2@#z`w zA4#miKSR3eu|5A8D(9w2 zyZ5@?UU5-$5C89(Yc_jMKKUw{*>Ps<)!+RVSY&t#TdFU&)qT_WHD;^gwKYKu9pSgfsF`rg= zc;{Tx!UK}$>XM(oT4eE~d#=@t9K-cNr!=bU5}xceaCpbDHB?w)#-_iUW3s~5v9UcY z6XMW3x7b;_c)Q{0*{=f3%f9Z|wSMNw?=oUecjoxFYCFqiuXR-X(n2U9;m#zTx?u2aFl_eijy%0eI$*)8et2=rlBfHjp z=ehRbV28Sedg|YEfyNit_^dg6xo`uE*e$8|1%*MI&#!xQ^x0pZmZhvNChHan3m#t) znq;0R`dzL>2A zANLDg%{y^DO=(5g;syJ(_kZmBaeRf9Z{5<_;f8BfpC3)rnf{+a>EXR))z_Z0-k;-s zYrio2-0!Sx`i0lH*Ccm#pMEcD8FepBYU{K*RkQgW&(#G(`6cE!tvr+WAt`mAWbD<6 z#TCHhp^4^19C?GMjq}pK)C~TRClq z7JK9V!sGG=rPo6Rj3r{iJDqiRP5YE2#>`lHM*d29|KFKDk7s0Cv~9fdU2oT&r^ed* zi>}W7$dqo#JI(Fm%HBVPLR*S$o>{q9H)r0-DHOh@loESvbM=+*#jn(gc@~w1c&8uP z^Vs_pqraW1uj*lmrdQG7QlFpqACaxt(VHCjB-U}?`d6YK`G1Pft&689w|=|95Cv<$ngXXBO>0Jo7AO?m0EHRN{Ac zU{(M65627UE?)2|^720m<<)aG$~OJzx&F4d^3us*PUGB(+Z)c$n7V8Aio}(#uW0>P zIq8IrtmBRQIop1I=i+{#_#pkv#^*uZE0TM>&fY6!mgxW7nXgh2*wkSZ_VkpPOhx0I zBX>hK7OUcD%Fx@WkuJNuP?eApm1$-V!o;;R(bB>%bciG|PclNIR&oH4d zeEBQhnYa1$n^iXLxqoGk@9lePJHBi0j65rG#55{RQ0Ht?vj2{iSDv1ZIlI~5Mpfd= zm0d@~l1v_CuAju5I?>{|z&e8^yY87=md^Ki9@(|Wt2~11%5sTgk1IYO7AyR0d-yX~ z(5s{$AC4XuI=%4BzWA@Qv(Dso@9ur*|6cI%@4wH&>+L(%wCh(j_vm^pk}!IFrTXaA zN`;Cu(mQ_r?p67I_#TH{eW%}bwq+R(2X{P)4?8q@5ueq`cWEo_KXLEP>DzO#rDJ92 zs<~m7KW8#6*f*;s{%5dA0l$o^^Kzf!rH{|rs{J2I>OGq630 z$TWYH$ZOj4v-Lpf&qr}n&X$X={&mjFnE9!!;aXRnTF1gU-dC?J^kSTUW!GKTrLwPb z?*6^vruTGa#=pNuC*4>t+1(*|G>PH9&-os=w^QApF^3jio%eixN9f!muPhD<6?T@# zI_pO?CEZO^e#Ue24CCIWVyQ=Z2?}PISZ1bN%sBh+!;1$eM>es|&UoQ-B?>(c}!56Vj(aDb? z&-$4~&4#_t_r_$;+o*Z>xa@z1oz-hU8wGb?S(lo2`}4c(s#$M--iiJu;1m5!dzs?B z_!(0}@31*NUM*fZJK>pW`W-!^U3Q3xm;&w+oEr$i+GPrd+vMMEyWmXiYZX&ue@~g2eZ=U| zUw6%UX_oc|#$8hnzP@wzKSSYXwuv95)-L}j&se`BUj8Sa*#0}*ddts!WNiV60Qz8BJg{En%wA2oFrdHS+oVNAe zTz_Qq^fS-X|1?H&1ZYQn^E#K5Ebj97jMfLCDUbHP3a)WDnBMs=e!X$>-xVwG2b}Kw ztLpHGPo3w`nqoV3^J1SreibwKW%uN9<(ZybFL*lJII=1Gt4#jP%Fe3&-`Q%i?|gAB ztvUFx*lhDNb^f}gjQ4||{+haL|BB+=<_%N-w}3QxN}w1 zpCgJQ(Raj_@h;uBkkM}Tl*fLCq7Ekc^NZCUZ!&STaXjB!)h%&HPTpYSwyk=h^-t`L zruH5VI1%>zu5xnbnTabVGyC>?;rUub3&{x!b2y^x*7A zvX3epUkjVhcy5!G9sa27PwKp{8s{F(Wd163v2XEzhKbqLHpd;*5<^@bPMx;p$m@>H zXD6GSRHoR%_sZ@f%%n#BH&m%HDz7FDF(TdrSo?Cc%4qvk)S zz2Qrr^Y_r^JJx!7-n;s^e^0x{rra(NUCO5~|Bc<{)}K<=v#MsPiwhm|zU$~qE17yn z7wUcam)NsGXWQ=`mGZ%=%&w0fpT8ov-FUjytHfE;R*RJ#eW#jn_}ufw{YTbb{%q;< zc!&7gx&?f4iCe1HsTn^?QrGNlPWvvnzw_98W2GL}?DaZ)RY^Ry%e0yTPh1i1NjCc3 z-z;;gV7v5z*?-Q-K0j_Oxmz-A^OcDHh<5W;vtBO zbN=g7a%#%uIOX>;r}R(S6^rY49?M>Pbd~DSHIvO2cFc`guJ3+CM_;b?NalZr;#n0} z_B^s!pn8*^eWnlZtCZgff;-IbJ$$zB;pzVj^#Uun_CHfv6)t}E`kC>#D{`0(FEZ8jZ^FIS`z0u}>k;|6) zpOW-iRWGa@+W#tZ=J7>=1`~8!7+<{ZITzSaFSNk^H`|uOpYJKW+PC0lzl(lcV$cb1;|tBn5)9t`m_ zdcStfID0v0-QNRS8<_U55PfBTyS=r)`^{&wPe(O^b&Pk^eV3j7&bqXCr=!k)hRMw{ zGLJ2~SHEP>m8>7rANF@o@3lQQG41vFndgr`%jwp6a=s(aY{v7$(o$`VKlAiXY>{&6!Oi?ubIqIND!c9(TgEIYxwqm>)T-M&^Jj)>m;IPx zT54EP%-d`E)lwrZP_NT%{%eEm<}-ntKL~5>SoJzU>QT_cUA-4qJ?}hjdm!v?e6T|J z3bXfoPaoY|uv;ce`nyp?>bf-7f1A}_>}jlX9a z$(%C|T4BhSf2Ue;$DIPxl~-f*yVoU8k7(Z2SiT}hddJnJ!m{G}6Q5c2-raDrN!;>7 zU3#5rZPk>+7LQJ*oENyKUH(erZqnjx|0AdTO4U!`S=_DW`Jd{$_kTXK@@oCW=@E~@ zf2_#58C&1IIOx_c)gM#u|JYgnPyXXP^)totKK3)jybpPETT5NEIF_)~`UuyFvofy@ zVuhK%o7F_mcy#ID)bqbPRvl&GxmYnRd|tZFd)1@oGAf&E|G2#j4dyfCYP~0uS7Mbu z#hqySK)KK4z|hun6h@)lrVM!^O!5=t$%g@T)C~j z!13HNAJbTvAp#NFnr2h;?9}9LK4nOn7^}+WUJ5I9Q zT$v|t=uz}4l`C=eS+~~{66?~#tXfme{;9tY`XJ-IXJKylN3Qj^*!?2=f>ai-$Z*|% z=X=DRV=adDpZLo=7vH(RvMg=&qwE!yd4JE;?YL9$ReG`A<5dimZ8G;eFK$!zgt~AnfBk36(rXsuaWqtbpLvB16*uy)8*bSgu;=3Ag43#Y+oi*cHb3H$ zoL=6RyT|)&=Itv-j!vzwzcnY!Zt-qCDZO`A8Ft@o)GFKdI3Bfo^i%0?p@#KA!Ied-|SjS$DU^ZhNC$(|nBXtY7irak1{*mPeB!e>AuD@mGGA+T$$!_qbK^ zQRm3sxY(pH_McOF(|3H1alhCAm=4tQPnPnTD|EPG%HT6pi z;=Io2?rNQQ=4Gcb->zP!y5d8cOKN96YJGiRJ`MTME@rqgtpF}@gwosBbHSM^ul6`M_Z-WAE{h3;hw2D@20J7R*G}>`ikuC&3vWR zyfW29N8@hom9G`=N}oyXK2!d8tWJ>1Rw)$-A@t4Ag0t*=ZAKleOe z?6Z~m^_`Jg55Ct&&(7O%ru6C5JH?w-3ZAX~+0Ps~M|97fk1@`^jYrn`oMr9V8k|@j zYI)+E!TI_#hu*DGo%dPFBEHvgW3u*nwJX&?9G=GugeSxj{g?p5rN!^}P)w%4?LDLCur*Ks^o_uD0eg2N% zN31_pla^_l7PF>V-)0brdsKepXr4*Euq98L)Onf1zJiNaTrKQzws>SWYpTuE=sB-A zBX-XTURHS2Xx5&?{M`DPJ5qQ0<$UCSr+V4r+#jFWmu1$3?yfp+cy;yU&!VCESC$lq z3pCU%OxpEW=s;_1b#Ka!!X0bkcihv>i>%vh#<~5oW!$=dY1wzyvbq>2c1C5-@wxdZ zkXQHnGnOvjX09$nUfIJJEtBpSezf(A?BmF0|IZ-#{{0^t+jD9APjfy0qwD*+vtYjQ znf$bcGN3WOlmBG?Gkkp~{l#nk?46EFSQS@Rgy?A-?>^#MGKptF=T_IR-1W@W4U3S!ji3z)t>Xt?|lC2*y}U3A5E&%Ee>ze zJ`*wJxB+q2K1@62@Jh~jyP~qg!lK_# zmE*pI{m!PeckhqHywbh-=Xj}hj=|+=q7hGK?2LRBUHPNyoUJd{dA8*}J{2Dg<5$+s z=sNqO`=Io@naj=RU)j`|@SwY~Yg^lPvt5Qd*X>uV?iZ-v)h1`;SgkIRs>k_mUDA&Q zXSQjstABE?dJcP&F>D@m)0%+;K=Z7#*ecH4?I62{ci8Ol1BZ>T0f2pEROpscw+txcI&^B z&b0saHxKHqz4zco(9K7Y20M;0welo|=Xd_DH#DAo=TXD`D+ZS~d+*)R_4)PA8tG@I zKl&ff?z-o#=)JF8JH|ml;IyK~NiGF;vxD6Co-U495&QC>VdQ0#V}E__^;~_#`=+-! z@Y`uirRam2j~+(vxZl+u-TO#%(y7_q`{f_r-CEqUVO_%EYp*P?uyO3V{w_>s&V{q< zjW3@GySUf&#;bzm0=3bC=WE>4q}z2ZcE&t8IWvGu&7Sjxc%Gs8^6N_uzWKPfd&(OUx*4=PR&fNbDb3X<>T>t5#C1Lz9}e;EpL1M&T+{wD%&7KSd${)dpUsnIo?Ew-Pw&qehEnd6Ev?B%w41~v z?mXm8?#%SrUGq`2@SS$n4N-Z+Z5)v&AK8`boa|PME-scz?!Nnb%B?%jdk$QSJ+k)C zsmk3`pK;rzsk~zPI@xZi1mpD>$92o1XVrKg`z*t~bJs`lgU^yaS?*k&|L=&=?mu4D z^LNeP_TW+S%HK0qm9DT@FFA96;Lq+kM)PWZw0#WjmN{*B-#D+*a+c`Mb9r*Ij_-GM zJuc^3-JW{bTDjN!QFgh{%4NT&e0*oe`!4wC6~Et8?q2!Pt0j7G!L~h{_eTFrJJPQD z^;yFGJNsA7*z{ZB=e#wAuVNVrKkJv9-8_=DUzsN*Yp_7u;s*#G{OHSdpUf&UgymaRQ2e)xB*g)xIc^3T4M z!nKE9`bBl7_MTa~hG$#LvdpaCvrO5`uc_ue+PR$Nv}s|!PWBnUx(5M{ced~OdB-w2 z^2}Msv*!OEd|%ytEQw$*&$$98FT8=U!6(@xA#+|^qWFWK*BU#t-K_`wvtbu)YW|8~v2derH> zfVZDUxvb!E!K9hrne6iXl1)RleAeLU;klD4R%!QOjmvW358cu03%4JMv6^-Ds6LzJ ze+Hp>XpR@kYAQpM@j=I-6RohTohdoP-4!M}8-*MOEW-4^vI@S>gqOEpDBgYc-OtW6Y)Ig=I)Qrn2jqHA{%Bt3*6rIPBgX6 z+}1Fn>uU3nm_N_7;))&>Sg!b9F0TF6;@G3Covk(XMyKw$pMS--dFSbO@hTFFlzZ>| zX!~+H?JLvk6&;U7*|x4VKK%Iz)27~}3Zvg$chxL9TGN#86fo-Z#=dNhu57(;@o~l7 z&&3D-Gwe&_2|0g$=95S9-#cDcuGqd}`(CNGTWzMY5*LGAm!FX@JOBDzV#6M%RicN! z>qzWUZI+t%^udn%wza3rX9RsL{k!7se})^o*48&CKCbTClgGh(cVqa|j_Y+vyXs|c;sXF^Zpe&jppI^#cs@Y8PoE0+Bo{~6lzdn;P+eTm^sIl^_-=ksOmBi&E1w8ILn&-Ys zXP$X`ZqdD}JIh6ColAQ5ymqnt%rE`Sve5m=s^VYW=|Z2vW~fD;EL`wNboT0d-{s52 zc{3V4-A-8iXV_4lEH6-#U;JHakJObbasQO}oHKk^AD8f4>Q`sd#XB;b)8{4KGu7S2 z|0vyhhc#o{ydV84%Wm!Yk@&uE`A*-5)BQFY-QN3|TQBj@Dc*Yu_e;ElGTV5r)b4d= z?`-+{vupR2Yx?I`mPDi*Yl*&7onhecPF4D&^pdG}W6Hk%?yURO_D;l=z2c6@J)!vO z8s9h1@04&P%+nX%>u3CH_SGk|v!98celWG$yztbuN14a$g{RF|(Y$cgd++R}XWgxA zP9HKXFVA1LAnJ2`zt9VfKc_#We-+nTw<=6GN;%By%sQ@h@&a$eI$Al;Y4bdN{Z(J& zwY{L|Yq`hGn~L7NKJ)9$alO2hOLkfThsAbvXX@tec@*`c-njmE)7G%F$r5LRD?67* z?aVuu`q-c%Mn&q*p4V1abeHaNTr~a6cKIKt&v!J3-(fp$boTcQvyFS@l=m1uFZ%T= z^qQU0b^fSnR}b#pxLC5=e9yVUc;lbb*SH?_N*7#Qx-(s3-m1dhBh}p!H+MRpsWp5u zCF|qQrezgv$!vGxmOk*m5;y-3&JylZaUvwM1_QQt+xUrsCh%w=0K zvo27Qp>T4)fT9RnzpzV1r*TDVvE@3>Gfo@->90Bdr}{sG_`m2hzx{{4{?q$=teE$B zx!jL=H|rnk)_<=x{A|Ad^Of=9Tx4hy#T3hSX_u%Wb)ajLP zk7z&Q)^&OGd>fzPG#Rclk8?zd>q`%WkPv+;L<(yER{{a2z66>V;}Opu@BeNL;R^2C9M@$aM# zB^z9Q{?{k=yS!(*={k$v=lx#=(|y+T-u%_MOY7QmEB!lLmCRZFr0$3n{%me)eE2A9 z!lP)>Yd%NBe%ZR7F6}=Oer|D0=nQqScjBjxeK5JV^m61Z&Z~J3YkKb~ZkTq->Y%3U z`$WFe`)bcz4T(7AI7^>TvBxYgcBkZtH4^(CS4BKIxk83bL3GKk<1<<#EAQm25j&f9 z$2p=;;<2g7x`Lznb?U9(uN407kGya9cx~vpy1$2RFunNCu(4uKshnJGu|2PAfb`lk zcgyv@AF<}B_|FiKUs}9$(~-C=`3@_7%dgTu{vIsoFAU7y>wfEm^(w38n@7&Z6zx;K zv+cfN+*fVY9n<23?FC+j>aR77UR?Au<6pw#*~+c1`QN$ssh9m{F#7%Xc>R&f=T}ZN z@74~}dXZdyFR}89Ht*4*U-M)fwGHpjxLD3ME7x;+U(zMLwbM49IjUG69G!h+WzmAn zgwm`dcW;_byA%I$?g#&x{|wW1w0_iI|H1yjSIhql%vX5tMEz&rul2M2&(OE$IRB5Y zE5eP{f7Bn_F7uzE`#*!VI*!5()Y)nJ~+Aal}(aN z$7eUsEtc&9!JXcxC+P=wdFJW;nEfoFRC>>(RUJ9k66X3EoRi)$E3^44%d_=84tuYu z=JgvMds^R`7C!&V*;kKr`IIsqSQ=VQT5U5a|`E&&fmd(==tBXi+8P$=(uOK=J4V_uE$KCMF{ab zOCK%px&8OZv2a`WqgQy+C%?)MuUoY4UD~?Kf{QDzuUOn%-kJK*W$nB9#v)ONmiHB# zzYk}Z*!TC?{IBip#*KE>)1+6~>jZkQ^|87Vy;y=TVZ4!qC4pvO9dT~j+)F{x!b ziso_Ut7kf$@i#1b6r6S^&ouC9#8+<9o^t)~w)1B!&C_%YEHO^`=)SUqdByAWJ8phk zH8kpPOqJaqz!_>#Z?Iy$)}Yq5<3hWq?lsvzqgPGU;<~`~6`pH87Tk`NC>K4t zU^An?L6+pvx`d!oqmAKz4m(uwoPBwfw~U4~HclG*w4T zS$LAw#Q8&8?>uGiSy^m4(`zPcA6@qB^!g)*rbqYdCKq3EYivrnmzCRYu=@G4!djp1 z>HV|1r_b?C+w`-~F>2b*Rj*|JI_ZCxy;k5=aou?Hv884SDSyu1OMZG@V(Q5$R~E@V zxU{3qndNKXWy#(+i^HA2x~ukNsjf{(wsqPR8FS9e{r38fEe4B~dylM{Z1`zT+U7@5 z;WkE}7rlR{*YmUc`MIUHWqNjg)~|k75LLv^RQ=17wsNM?=Q?gDx4T_B<)>l?2(Gc0?TgZJik8E z<;<>2A9>6Uz1{V3#k%_H>AAD62m98UT1~GJWcuE}W6@g0;yp>PwDq(jcD?P(n&WbN z?&)<2kEI{+-uLb(&38F)Y^%P_lCQdtmhP*+vifv=aa-YcnLkHgne1xJj{KQ6Q+c!9 zf(-#%iyy^lTwm1}`+zOh#+^@m$M&N!?xsbj9>wSVIi0r6zVL8Fxh!Yke})^~3$K)C zI3B!X6Y?XeUH53p8NWBPBX&-ac~voc>iRnZ7H8tWi{~EHKXRua$$IUdf z9(ed!_Vtm>$={EJS9O&~oRPkearoJd73mV{EZJ_W0?+*JU;lB3f9GeL{|q0hr~k`e z@u=Xy&`=YM>c+$NP)fAXKi-XjT9HpX}-UAle#pZBs`ACG)DaaQjS zlwywhZlLv!q4*WsE;r3!hS;cJW)W9?(WtJM5r17W zPd*w%7jwIY?>%@p##^5|u;@ZXZ(8?Sr_=j8QVhRyEA8*Fv32IPi0_Ek4iwk!E0$UF z^9=XGBVlX(AE`fibARRxaj8GSoDn8CW|AlR&kX$S8VxfY?k%iM8hD)x^kwGLE)5LGt258 zw6V`$@j;?#^{(lU%`Fc1DHUw3o_~F2%Qu`Ee@UQ zwPudf)Y@{LXuCA)Gr_@z$7d{_Z`c#3es1r1%NWC^l=Cyar8G_?{n_Z;dnGLKu+BgG z^E=KI{*!)Zy!}teq4j@?!Hf1ZFEZ~u_SAjF40XXf+UbRoT~~H|mAEcwe_Xi!@$^5+ z5lQE6&h0iZ=VUxP=a0(+)1NAazO82?(tm#zFb|lydEdIwlq+ktK2vGCxm;K?Yl5M8 zW4&eYiAM_NGYTezh6p@ccJn%aU~zwO>)Lk-!LzP+gzGvB-JP&v8ADdM-+P0lL8q-} zbIndXVq^6zcjlw7;zC|-XPXWzK2w@^%{=#LkKH4~ zb9pw`@)FJ5V;ruzC6#@YKa`*?b7=RX1)pbZNm^wY^J8|*pRfNJQhV=Big>-gPh2=RFX)_mSW6 zif&ZBVH{&re^>rT?#K+`lGAL0GPkO^P{dvYSEp>L3R*GTmXN_a;l)?;NC70yyzjHIY za($rHieBO11*`T{wq8nNTfNI>Vnfbv!cQ%~68D&|UCs}l@Zt0xuGgBk4$d><} zu|y&B;`;#mJ3F}F|7^Z5w9Dg%-H%qQoomCE-kl$~X?1<4*ZF@(O}-XBSbi+&Y_ZI% zht=}GZB`#KsyV*A^PZu}vE?kDy^olKJ8~VoxZjzHJv_2P=_|K(hwZDyrSl6j@_+w5 zk}q!Y=j@!%LYwPU^^g1wQ#$xhQ}}3-TKFl|+Ez;$Kd0Xl>#tl3)fWF(ktMe%`A@Or z?|IA1|H($%)=x_R^I1;&&(c%XQ_WU&-pTtYd&%Y1QN{~4xC%|CHs{->B6QPt3^N#>t>+Kx0yiKyNAdn__1 zSRg=~aow_6A1!as{d4dmZ}Gddxv#V}SHxEKek>P^{r-+4zen&9?^V{Sxu-TXcbC4C z{yM`_D}KfA?#ID0UWXjdIsZMlKb*%<>iL~VC!fp=dzAF{`idXRlHK<>)E@4avoCI} zQ+l~0sp0cl_oMESuRE(UkI0yQ6tol9NZ2>id;N-?kK)dixu|YDrnCN;_42}!$5(dU z7AUou+#;3#h<8r9Vd2c0zen>-<<5GCDdp=wtEhhylVB{~b<|&R#Y^X+KFjYKX5wrW zuW}Afof5&TbLsAX1_9QO-vh3l{o{0gZRJdfRaas+$Z7YyiqqWxTSq3$ctz;F4TR~9j+7rm}aeJq=1cCAonXYp5o zYpZ7jBphLs@jfbAU^wql-qH=TpGlYAdvvPukGH;Beeo5U%sYE4_9gG`?)o)b?%Aw! zF{cks+tKx7zTBcqq29({d0r(vuzX~7uGr$V@TzlJ!8@MTW+|Mr`mQ1J{*}hA_Q~R3 zpM|iVH8MXFUn&#(wX@N2_8IR*;-1m3m^Ur+lke)wv%5EAdq6hJhn0bcZX9(^o28t} z!}3)_#OLdeu2;dDbCzz8nD$CmFMfvgnf-y4z0+K;Y!{v^@X79Rod3?KP`jskZ`Kzz zPnmUh@>LC^$!BFG`-Ki{m)`WQION7fsfynnyOa-2H1FSWbE1J^Z>6bR|DF2p$J+Yu zERKC$;GA|cTjCUhUPa%>$k~s7|7V!EsZKlpPp`zfy9b;KyLWwk6|t}~XZep_rB6(c zPhMnVOfUXD<8rd*v%jaWWj)`#=d9*!;mG6L{~ZyHF19c&H!@sb)$#m4L&EK#dwi*v zPqY5EIp0|koT5J?_E}`*Bi?Dp-uyjiSYF&AU*leLWshjZ-1Q%Iop#h5n;M;9xqC{U z!tI@t^{r>hI0v4|y0CA%rR{m`^&eIr;d***aY$AS@8(TBnO(n{{%y#;EI28y;5d8d zw$k$!GoJrvP}3Hl!T<2cp1k-_5zQ-mCv)vud#?Mw(Z@6U=0B2%%i?`fSZea;w3I{l zG{wSmzE#bBF$c=muV_|Yp*(*^_p#S&UDoc}ap_^{j-|8TX)m0%CjU-M?d#AP+JF4YweqiePyE@7KG&bw`?l@WwM7+suFrJ+dF@8x z#B~po8+K^6Ejz|4+P~sbedL3h*M$sXrNJ`6pT#ZqJ-&X;^YHpB8!C@%`dq!^>3(D7 zWPb<$@DTnHhu*OU?7#C?UQ0$^p%9 zemXaQ&h(Kw|H!udjQh-oL9b1Z?02gdNbYP5&wQopE>eEw%--$MS2(*?#01qIKPpui zey5uALGqR5E8A0+uk=rKHBn9tQeWboekSYS?_LXu86l|>Y3J%S=1+Xa_S5jjnmjGR zFr!VMclGuqH8jV4mD<^qvP0rU=6Ci}@!jifU80K_#TGeDzjJo!chP*!X{!>s|1(UU z8gX^|Uq{RO!2RiG^op*(6X!APxx&=)!1>3I1gG`xdXv{1bP8sM*||xacaJ%I?9f_v z{++9$SdL}A;uGocjo;jU#P!Hp_sNoN2j5kjuh5$RlJ!|x(xoex9~*H0P2zg9tD?6p z{kY&>)uJiic|U5#cV5vw^Jnq&uKCh;vNylW3gfTu4A}Q9fBwqXpQSHIb-Y>sUEfPa z*z9$Ie=>TM|f%jS&L ze}-U(#DcZOM~wAepIfw8>R3|a;qL-`dk(#tS2-ud-hLCm#Ezv`ll~qq>;B_?_ScW* z{wsy2-szbnbemuK8u}`C@0qs$40n9;1Gmlz7v6C1U(#a}+i$0K7j2z+GI{ln2F}-V zifJ|Bg$n}2cmB@4VsJL4V|^Z1EBo=l!p#;*k7cq?imufN`Q>8m^!M+f_aCoFEq#F}&Ax;dz2``tskOXgnjj{JHi=h0KGS3f&v z?fYsherNmf=trtci;q~Iu0OIj{BdV)V%IE_w3Nq_5<}w)j};a-IlWk}Z_fQ}#Yc_) zD>4_ujl<&>w#{CDMST8_?}w#ZuM4dHyHWa?Ugm?=Q1gFFr-lYxtM!@X7N%`-WLdpE8=E|;c1%iieon%F$s!h&;`7W7_qZq+i~Wq&8{jq=&YD=gO}<=Y-T z-m!Dl!A>^;hN(HC-u)46?5fW{3hoJEo@#rz>4av9Tg`OKqxptY4r?7fEAuS%=AT2} z-AalfHrEBx(zIlDsJT64T~i_;dBf;jaj8aXfwRfla@kEcc1@qMF2{J)e#7o;yVUL3 zJZq;0{?xNM(!674O{bGY6ev95X1dmYtHf6XfV&Utdj zz3eN;d0$2CON+W3AGlfW8JFeEq^~Af+M#YYHoiAre@5uO#q_mz4Ay0d=BE8Q%%k-! zWRFjC;We$$;?Tp~Qdc%D$8!t;j>pDg|^C;EG4*5T(uS2f@7kaSo*DQ3;AD@(mzJ!RT$d%8>Ky!1?` zx2H8amLGLsSuSsMWYPQ;3i|OoBK|YT9{4(A*{fCm83cIsbZgw-?tRDcibn=9W^y63KNl7@quomLBuy;pS!$XO4RvTj$#s zeVX%CYRl6RwW9OvD>jxwqfkVT#pXdpu(P z>44>GPw)3V+TO9Qvn04&Y`yw-L)MUkcK=l0Eob=IZ>d&UxMJVa=bgvQ^`?Cl6FQ-P zlAUAiQNPmfqF3LEEnfNLwuVGQ)T;JS(N&LRl|RbPzT@=m9owyU5fRDn!fyO$sC%f< zCjIlug}VBK@PJ&R@SHNHV#Wx{8QMj z5#8&Q%Xa>y7-QVZBdSiiYt{*CH1bYaX5!t~{=3~Q@<7Lh4g2RUyYXO&>B`XW+zfvX z8Z#Ex2Xeh#U*J%=`V8xq;v-7YWibarc5$>8Z!)+tyK6=EtUGH(`X>B!(%2Oj{<||I zv{cvOiFZo^;|if^vlRl?q;*(%nWq?pT@QGZx3sJEp3baed%aj^d^Ikye{!}@F(|y_ zM7Xe(Vd~$*3|C#wTQ{ib8+@*+ypqJdP)#o}F;7SO?}Wn1VyAk7pGrhFw50RxZc1Uj zogX`4?Q)a7Kc|Isg`}U^`R&xsd8Kn z^`F7#px+6TH|LUKlio`-tl2KkZqX4Z#(8*#?(&aDiAl>9XTI8V`mFg^nXdIatWN5S zrtEl{<1Qd9HML})D)(LQA4k}BH!j;BY&)xY+ee|7S&wcf#S6yeeU+R4PPO=};4zt3 z8cfGNu2}D1b;ZqX-GYz)M`X2+wsxA;WSK>;7Lcv$n%5+fm_BRz3LBwoYyK2UnRzb= zUF)PtLdv^TDXu8nt=MhhK@lG>zCFn5FzG;6dEe>CLZ#W_T65RJa^$co%qB zJz%k`SFA!0-?In)oS_T`>K!voe5|y%jAErbN=k)8TCxuKMlXK3FWy%CJgDjHL7jd2M-MgK zF*q9|V9_Ww;pdY=r(b){n((`^X=P;SVQs6X@Eq@~l9ysTb zv10$LxLlhFZ}PO-J8mr6tod22@w3sRxU5Bq{(;v!68U_67R<4PUmsa~ z8SZNKRj|0M6u7@*rM8_`#EY&24k6c6pFC`D{Lym7G<`?ZoJ0A&PAm5&+HhaVZ{C$hO2N_Ksd=#@3s3wixrY%1&CkkHf9pA|m+x2(?3 z_>4hzmFu15)_3Ff7%ePbS3fgkt#$0-bE1zDg?HS3TwtZ}W{&``&Sth77vH^4r!$B(`)}bko`$X?u=@ZjAWK)_Pd*WXSaU zkJ6a-Y&BWAbD}f9CS&}iXYM|3n|Qt)P@MW>ZvV?E1?%3oSaS7U_t08(IHGC8L}kS{ zO@ZaxBy_8Hq;C~H!?eZbY3F7^2G+bh3HR$eXFPoMNG7eg<=`L5rs()Z<|6vF-l@ww zn^y?WSTA+QI9bPp*QuxHBg^XYmErsn4KrnZW`%y`&Sfx54dXrjpTVT+ejwXHJsIPf z>7H(yUl{`AgLWJdI5^jP&w^}~6%JEuyq>cqIyUL1r5;Vv`^x&+FgN0D$7AuWM*?;= za;vU6-DY}bsk!h8r=AU)mg-8he-GLoXf)-shGbL5lt&2`T`T6L?vOY%?fRMcNl%}w zb&ajhQfs>ZTeIh@0e9gmE2BE4%i(j9cRc3o*nRWJ*_r$J1%i)$6@U2e75An06;q=h z<=V~h;xc>{?|S;IMDOHSmP6Z@Ih&vNH-yT@nSo__gz z?Ct)7+LtR{cdhk%<;-%@d>IQgS*cZo&9_4-TA^@+ZI@?-}%mZk4v_U>lwyr!rgmY46d4g zyn9NmdHwrGMvR@ewAqhv>F7O_aGdOKC_N`ycR^AR^G=twF-e9KJG{$-8hD+#Rtqy# z%~*By_#vS!&+jadTgUKDW@X6H`$ukeEHT^tirJ+8Nz{6y-uGq|T}?YU*1VFEKL04} z>Bp5jOY1KwH5Y9uE$U(2@JdU+xVC!6mzWwoj~!oj_w|-CR4I6v=&-(IIkjNlmS1n1 zuHN~2%z*pc#8popE@-`?vCXW0#}zh(UI(c+rq_4){_Nhrg>9|JU9M}{_bh#yw<(9H zEAKDbS+SUR_L&Qv&4;2Gw0|WzIv-Fy_;7{O2CGG8tows?!yX*sj5^~I@rbcBsZ=^s z=UtGW3j2|*GIPH&X>e@Y@Kl`T#`VB57U8B6{*}(li}tW=%&7I6cE;yOgS1C63)8Gk z0Z&!iI}-UmSZtV5|0wK(q0ANU{g0BD^qRSJH7=K$X^_OubLEw)hF2@k-E*D?W=_-e zwK-Lpa53Pm{)*zFog8x8bzXKl&ge@Lmw&KwUa5s4)L?0(!Kw7sU z>Jwab|ID$eGai4Qx#@Iapr5(UrdN`t(GBa*7o6BIE$O|Ty`XgLoqbQYzVS?(dv?bO z?~8{!z4lprXVcgIk7O7qQ?Y;sO^RiG|BOKfiLGmj3H? zO1qZrI1+AAw?J=QaKidK8C%#bdgh8MEXpo9;`HS0t5}=24mS?1E&tIvsibbil(LQ=b29zi3vq^Tx|LGp4b=+2iB;wL?TUDelzP0&ZF7pp^6r-i(Ek zo*it~D|*d~bz~eqODZfW?AZBkx#68{xmUI}CGhi}i|@D?_PRLg+(y=)6F>cN&c9M| z=kA#oH{7OwzxMcgBww1o^tQa+D;+9!CdlY*7m%`3uv+?x`JjM-md?WX9X79z8(vud zUGviR)lWZ)DZNqu)M(KYKcTf$oq4tK@6-!BWc1h0pE-Zawl8)v2g)_ihE!g$KC@%m zL&G~_vVzyDkMJ8Xq;zEUC0H8D?9fyD+VOb8wuGqk&bUQklF7|RE0;x_6Libs)XOd{ zSRHsYb?MH&=U)xZUP|Wr%(J!Q=0}F(Gx->%htA_{;M(^{D)&^Ze(iw=-BG>1K?^>! ze%I}B(Olizw*8;lvUS1@d8#k`?%5xan3j_Dly5<65<{uj!qmHyCvFoBeJ0PzX@104 zYokWPvISQ(zw4Ut&uE+RS&Cc#&c?}ij&A-g%q{s@D$g;KEuoh+yr@?)nOAzsyNHXY zXHJ%Jsr3pg=SkE*smmYKv&M~mr-zW#wO*Gf@6{q+3G5p6I|~wyO&0jBUEV@#-^Y1FQZmx#04jq3BND>lusgeo0an|My(&o#EdjVn+P!feIp)S9CUu z@fdL2zp6R?sOW0(E8_D~*LZqu|9<2}+0V8p%Qi-d&pJWV-sRUE=6zV zD>jK*=ZW6jnTq+l1DX47gl=^YW|;q8&ffOSlz#!fwU^qt_8#5*+d-s%2RrjSrrY1$ zvfs37K5s6}U%_X$GqC+ZqQ;ABEG*|Qc=6e7Wxo=2VP?{8ufU}*{%wp2du!i6GrBgc z!ft2FZJzC#i<-9bPMCXdRsPkOa^-~CYtEiBc~)vU=VPm#z?!!+_N_`W?hFu`>MuCI zGS*u4&9i5VLuVw*rLlk1i=4bSzSy~{!Md^`>2^ie`bV*j&v$%Sx#&vF^uj+`=K9vJ z%-UqO{#&+FdcH7Ab<62zDK`HZ3?CMHHXRpVF+;oDz}9Q)9@(E$l5X6O5fIfjW^4ORA8%a=2{8%?J8wO`TNrt4%Dt@Die2x}qJtA$lZ^aX6w1Pyha#9rpV z%313brWIJ}{fKGCkczQ1|QE9S}XoTBxSd&l|JAC9e__{q=euw}$zo!u)Y z9hUvfvQ_G|)Q0+^odvn8ub7GTdufX;O@lFy2agb9vA1DwnZ5Ino)FlRmZy* zc6O85Y9Gj?eAN|MJwN`|l=Yw7m#RHryU)bBJAHP?p3FxX?L6Gh0gF#wITC+Sv!=a+ z&-qn`<8v0{$X}|u3)Xk8@R_HsW#z-%v%LL^QH&X{UE&6V=cdPh9Ox5Rw@M}{C{+BF zjFZG0x2F6D?T*14>=wv4>v4Pxzp`90XpWbFrK&c|+Jrle71u% zXYCekD2UxG7-p=oaH>XT6@ARGQZnW!?G)rD|Lyu>A+|$a)ZlyBq zXNDezleE{}nfT?Sj7-PPUmx{W?$zh3SAQ0!7g}^o#%a~e1EQ*7(+jgAe4Z}v>v%UU zH9z2dZS|D53)s{W^j3*^%@sCyD|J}B`-r0=FCVAFl0ILlrr9lPC2le(HI%*Eto^by zaQ+pUh2M)#U9fBswtS+wvXL>Q;G*^l>9?zmMpMo* zKQ0 zXydM)GVhfMtnBkrvu^)rOuZezC0W^Xw|-}2-ot4T7MmGee!6zqc)yfhaz$$ux4A{Z zVPk&xpoV3}EWz8m&KxtVPG$5Gi9O#~2AQgSgAb0Wg z2!6)3EL(F+7u$D;?dxjSpKM_E-1>}J@OSHD-?ypUia&F)&*SW~<>&A=HhwnsK z%09&F@CChez5Jlp=>Y@Z>=gwD9ND2hR{jz_3R|@PEuFJaXWRKJ%knjxV}=S=UeN-_yogfrINFZP@#3ru4L+J^vYu zgAIc3p1xSrV;&fLSlnReyO7Q2I~}Ih6?K&sx^RAH-DT0cV(*b{>jhY^@9aM{J+l0Is2sU_C*{_K8R?hj8WU}mj=Cq~Tk4RW4fBpOS zjGwHJQ1iw|=^V0>K1ItpI9{Y)*0a*+Uibb{f(+BU_wQ$PJ=c5lFZHbMY_4CbVeitG zYTr1c@k{W}gQI*rE?nC?jxw(iVAcN}J@%X+VZ$PM@gOYAg z$IXcU3<28iJNxB!p3z-!yyL9Xr7zQ)cI}#Gc4k@Vd{fQoAD?MWIc6E)YOyR?GxUnW zo}?t5B$MJJtgbP<4%=*9j&p0JHh$32?GU>DC_J}orMcAZllrcUbrREdp4nLLuWbHGk^2MJqq+7Rkbv-It-x2y~ucMpl>$*ovo-8eAP+cB#@Xa*drU&nXY|=!| zY6nhOCiT_8@mT&5m&EF(Rar|_ST8){o|NJfBP?>HA~7lb&emy3MW5wF_18UWepV76 ztY8@Wv6TBW6(${<|dK9j7xrr=;NdAGZ_xRJqyGLJP%8ch5Q( z#8Wu?$n_Y5#M6N`#)f+9x^!o5y^_+D7dbUh)F{1naewE9M@IVFJ4@nvUFUu^XT1Mo zy1=^x>HB9w+u83dnpbEc>zcy(m!~wZqVdM=uX07~HWEJGGn2DEvkN{K43@F@ES5f_ zW_tLQy>fmdSzEpN-qY4r*X-$S+a-7e_N5&^vcPFup>f%LgJ)7#GOuo$wCGcM z$JUms+nEyXPm5u>{5-&M@hoG3v=_V7Dut3xRBmZ3Ik~s>n4;mEV5UEc=awyBn5TSd z!<-Froh}SD=X3u)vgG9}=UvNuNBi4lwiTDx__?g!@oF1y^ZZjP8yBm1#)b>5T9%o% zEZUUuU{$04-u~%(o5F z|1%^p=)N-*T^5kCePzzF@_A`j;@-_$W?XUn+k)lx_YKp&Jzm)qJKWVTuK zt={{7rN`kHQ&t=}_NYaDhWD$*M=Rpe6Rt>|7qm5JRJ&s=^I1ED`R4A=8oZ~rwk=F( z5&ClNUBZC+kR*DmK9-7?w1SPP}r{5sdMwYtAU(xfb`K2-Gv?ZU-Yit zeJ4KL&4u@8BNsYCiD@jzR)5I)x8EYd&-PwPvyS7vTfsvg5U>JZ!p#zl{kMgaKY-``POsT)mEw6 z*cD5sCx4Y|Sh-IB*PY7CCjS{4s%*Wd9NJ%eutit?5`)&FD>AOZGuFIY&?23EM`-O; zQ{AJX39a0751o_U$Pt$HU2nnh!)KhC+Y%1#R~F)2`}a_Xalwih?UmaC-cDh^7r6eV z;ep~SvBAQ%Q;oKmbVX}k(bcd%_E<^|if1`xUPi9)A_X?%vgSTTo(kohiQt zYrwJ)L*3jBzZ9lT`1_rGmQd^RUoC4Frf7%C7R#!tgf*X8bWHO6VZ-o}`Wn|T2|d9X z+s`c9khVSG+JA;cDi-|b7OZ-pEqji!ajomDMgLw!9)8&EklVY^v&Lb|t@cibkd+_2 z8w}XimFwxIe&p-6aoD7)Dj2-$%!v&GchqVQ?q+wg8T548DqZgVfv-Xm9v2Jv zsBBg|ekVa|-Cu9re*tT^p7VJXbSw7sxm4MWD|1fm>fSp4$kMibCP#7$dk>iA&*0c~ z_-|THZJL^<^1;V5ujGZjQ)MwVGPjr}xawT8-_9Au49`R>%4eqLDVvA*X3WH?|jp=;Xi{))WkXu39fs2Y5NVW+ILS`-MQECm2Fn! zv^U50E>hd|BQ>x&piVybxci4Gr(Rr%5aKKe+;fFBb31!M-qEjILHawU2F?rP;<_7c z&iLsxN7Lr1Q@B0P_-gEXoVwxF!T(1Qb}=T{u<^89x3YQ$5G4PQfx+Qs*t6L8zs ze#ctlzNgNi`@waBI+x!iEcmeOb-@+83)N!T(?89K;=S1u+_XxZyCYuDXY+#=$+Kv5 z+}gt(_dr&}JNf*bD`B5|9T_x|wAq6dADNzix9nWr!-Qjt9sZ@cA6Yp^*{_!VqCOHTU&0ymuov(4CWPE zGIC8dJ(tQ|w(#DrCI#*NSLAqR+$BKg-j)8%B%(e1nZ zp4!CR*%7|u_ig{Ww3E|Xeok9(C`SC2I?Ic$fP}M8zKd5h=;hB?(y{18#c3Sd=%|-5` zXD_CI?0Bmyv8pwW-z8>Yyx>ZQ)822dcSLPZOa1wfTc>`;roCp?E!)(jRxkvcJ^o$H zAw27l4*RcS{esV&IkkmR$QTf~OaL=UBgA^4gCxD+K3#wwAE`rx+6Ca)`%K)Z&alF5}Gt+XZ)4w9hyYR<1iK zJ@B(msJU>~l?5H*9E-fxHda5^oYVu)`CmPcbIh&_LZ{A#EQqdI~0Z7T{Izdci)vu`wOy8pW$Qt%6@9m zQ~S?4fo%-y`4+6oIGE#mV|$F>=b1G@2SV(xh+R#e-F$U_K}px6{z5@^`=V#dCK^98 zxcJ0NWxw$$*Xp*rg)>4`SO1)`Y|Urwh$d-6(X5pdBjnN&rN0L}j8F~yx45$S-{Kfc z&MzBox@p;F8Avu=i6|D)s1}sHWmEBEdMVfa+a~jM@->pg=W!=TPp=4R{GE!) zt~)s!U!CX;(s+J0DI)q}uglqLroiwIio&kErJs$3tZcg)a(bQ_G@Rrrvq|E68MssK zfi#!0yoA)@&r*VZEEYY-1^2(?R2DpcMD_IM83Cma!nV&yynf{Vb732XWW(sxYsvE; zDNmmle`mwW%~917CE8Ptofo?BZj;iy-OAbJQnCfdxZJ~!9^m%gv!k#5>%V7dFVC4u zaW$JC{iPgrCRy9Q=w!Bs;XTXluxsy52xsz5}{I}?uB+#|-UclRHA#2TXL z+`m8QP}!bRIgz>f^{?zVl>fP=mXS7Lf2>=AZt|prOKZxFuC;1x{BxXlcdBXNik3b1 z?p|5N&~hPix3OT7VB?#QGY?qJv8jE;IJIt%&zmf7t!>vk(K4^z5SDzH2s)X*>(8+o?2kL#CLs|{rwqx>m_@qzP@@VF=5k&z1dez zte<;uhMX~@no(M4h{j1?uF$Uxue+v}rW`)9I49%jv`c}XwPaejQ)-U%9R197bmuJF zBMlKd9;HS9Q_5T7+Ist=rdQCPqui`#TotGB8#3tj#Xn0vRdYye^|Xn?rZdunA3RF% z{gcE#S$+kBWAayx>@y-#Pk+oTixGKjw4g`hH+ScaOCJk+v)&th-If`^F5rDoBQ#P+ zI_c)wQ&R<_oOuhit`zs&J+1kl;bvj%ri*Jfnn?Xic6fZ}aB*QXUtJ<&S*wAuc3|69 zrY))0ibc0_zyHy+JMOl^?5BLpiPPt7JhOIvT)Nmjen4Sn*Y>1;54T=h zwCQKY^!xQeAErC!Z8qY#zMNTu`^a6}Jgq62tV~?#JgbgI?fkm`4%>$L9yel2cTZuy z$Xd0TgGF`Unw8nt7z-!=XHe!^kr#6`e4bjzCDAiJ3#$A5_67xJU7jtlYR)Imu+6W9 zIQ4V{AACCNWZ+o-x~L<^Ct6pOd!D(bQiIn%(?>FM53*`7We)o%n zO+0zdbmap7Gvn_~lxvsf9cz5{ku9VErg{f(ab$%Wx^18Wr{*0?$GV4EbBwT#` zowd}ryuey+!G%AbznZ7qez%BQk#}O3xVHD#KMqP3tW2BsyX-i%q2oWpiX!E^Y*up5 z>QoE4f2=op>99kY{lezBhl)Yp-!`(=JI|8t83Z21U;SAz zJs|G1=){*z#$lnWbKmylosV(7w(0J_;&)ukfobKPnm_Ivw3=I=x^rsDSMQ%a$`z$r zZE`}XT$Z}8nEkAmI!*l>x^(?dhIiK&KT8pgcsfIJXO)8?5U zQNQ$ni#Su@e}*L1sSB?jx*;l--T%m<>Os?5L7{((@9pD{3*w0OSK9trj_uvjf~=*% zA9pv}oYAWd35_aYDE+!aOlHlw1zl&-BR{Vw=Q23*b!VfoO}6Z@$qtihO7&KKx&A6P zI?k{&)g|{d*TOm7@`l#V_x>I#3jU~3^!hgUTmP`F(re-@k1SoM$MA@+=>2Tf(EPx) zr~djp$lhDbDs$!ae};qw=2iCgpQJCWY~)T|^Eb~h^5c(b3++A%c%C+uOW9L@eP)Fj zZ*TnySCJyaxMbCfm)=gW*5PvYT!~*( z&Uel|y2km`UzZq@Z;#Rr=!XaGl#yOFqj`6{_^a4s_wOmVHLu?3FY&9*ME}fj|2
    3NW0M?_Y*&a0NJz&;fS=8rmT+ecSXVPSM{oXUZcXggzd#aWaxaRAfU4id^ z&wLM9!<$T>ne9$Cn$@kH$Xi~>>b1A{ z%wBu}4muZCLo}>akT03pbmFeiTYCpZL3LLRGTcmHGF#8K<6_GWGP)@0N2LkIyXF zv8v(wjxF2RA53XiJ-RgS`H`is-6TV;R!nE;YrZ35a>%vtk>I)Jm+{|pR?bZ2+CAm& z`3~!hu7|7tCC*wTIGb(X;^OW99zK5cOtJdR0{h?(y=N~j7l^Sj7%Q9a)LU=8C#{~i^t%1mu|=5;^5Ajj~;>i*cXKHV&J8cL6o)3cvu zsR-Pc_|LF`OV2DJIq~ZLV)meO`9GRsf@}UgoEY|fMcMA_&rU?-^8NVzyH_FfV$y!= zsgY@hSqe+4H-#`=ZQgIERy=)P=`&S7;k-I?!;rQ$b+Py5FR3QEnk@NT@XFzW*uPC1 z)N~fjoFVCEUY#$0X7eV)1;IN~wtN#?{D(P1`}8A$y=!j%JR<4fed6ABzlB~E7vfC( zRX={z?p9`tpJAeS<<7y~k50Hktda+5YIOu2^u>zGsOx5B@WpXxy+~Jy4)|?ehLRm4A-3b>zlI zem%mlHKM@2@b`mDBKO-uL)$hTcDr&o`awIJvHAY!A6+YdI*I?9xsxR_zumqw$k8Bv zPwA1BXEyt?A6s7e-sfI(|BfSP1m5kNZ!D+5bJtW~)HinZN1aI~z4iB$Ch~cOy?^#} zhnJxqw&`tY;3Dx2PS&R`GURoj|>?#Qn`KP5gZJxx1<`=|ee zsPYvV_t&a7mT$%5n5Zj;2lu>6dH8##iC(s5%p*%f>w`aL zxcS@EB`dl}>)i|q{1AWS?Bu^YE-bqLPBCbgIdACdStm&e03eVFXUgmzbvLNP%YxT7Ux?PWSnB~jaE_|-DQ$3LSIP^cm z#&b+P$pQzu?=8yVzV_@z=wR0t z$axm9Yvt@u2Qoc!Jj|SpMNcyec2D8H;I|P+iLi%_xaB$ zr7|uP=ieOs&k&tC=ZphuYR|W?&tmVtyfu0C{rz`}79A2U?J{OLtn9F% zen-$Tot58zOk1tdxMxFrK)^EYeaWl3!UFCbT)(I-QS54n+am{sM{B~JpB!Q9Ta%|T zvAaT8%HZs?m;|k7Z~nR}Z0_E_BiPOA&F_Ez7IO%EU-hfy@y&3({1;7^UM*TLwW}c~ z{m2<(#fmRymfCmND=7st@0yzA`}G#@{ImGqg-yL@7yf6cIn;W;mxCfYL_qGaXFeftSf)ToVLBIeID%(d=RE|?zpLd zVEDdy{&L3sD;*39qdA!TIJWLAn)c`D)OVRhx9&$KE!cfP$0Kgm)-HbjnT>9DqCP)j zTGT%EXuaXI$X9~iA*>f0W}aR9S8{6Po}l_U2XEzm)L@+5H}z}KyNi)0jiO@jTxfW9 zXCtH6y%`oQ8O}SirF4$%nvo^FivJ3i*w2@*rJFc{^@4BhYzgI7h@D^K;3gooMJv@> zwj}BJiq`^M+fWXBSoUjmPfR?<5azj?g(hqy0A&k;Jdt| zEv;k0!)F0kWnTraKe8^AX^#9m!(B#SS(uC;G^b=;I3O*i93C#Y1GOm*MU7?(4r){T4H@6~NWZL8LPlrHJcGgVh9 zi&(qvfmz$4*p;h)G#|XaLfdUsweZe}wfj<6|58%g(yx}{^+`!;-Tq5PTTkrRy>7!D zi^#CZ{24_|H&(29JI&Z~vwX*aioH%!tna?+B{iRL)I54^Lea{fYrXkz2&V{q@;bey zM*ep9_3c9cKK@hmc8l(6%Ge#zDtdXsiiqy-^+&=IOlR93@_qQ9;i29!!-&wIJ4Bw& zS+@Jm_e8ZYd3DW6cgj0lg5D-OEIhiV0i!ubelR zu}XgOYAWA>)9YCZZtGkvt={$gKSNrw!nC7DJe|&~uW|CVH19WM$}S2NS}=Wv>YKc8 zj~3j#cUq{a_kOuy)W$O1YY$G?xiAEsOz+t0SbUmwsofz(2AOFSs_kZcRo(tnLpLVk zV(qNXEXSVf{{(nrws&-_yLEr2qx2$za6OuP6sXgo!a!X zYtes(70&FEs}okZ{SZrtGWSzpEZ zOYh~n?>a}WF5N!8^l{L4ap~XB4cfYu>v$Qz@VN2mGQ2KSVn1_P;Tg}KwOyxfygV=X zS4ZeQ_v1nVuUXo;cRa2!ovUg+JpYc;ldM?52jUa{o?(4?b^d2#rT+|m3Sq0m>Swr! zY)`6ZJ+vn-GwRReS@*wg?aiOFK-lX|g!~a_u^5rM1=-Or{XcVN>h+&7RH>4fvQ6g4 z^sUDYB-bTG=zf&p-Rq=g^@{J~;|`&w#~w^iH%K;IQ`PrV&gFQne1*|PTKR)U#FZ^O zmM~qplBr&Q&&hhDvYt3M>$bC3?ugH=7ibQgX6vlDxL@dG+MC_GK5F&czjB|We#NZQ zED3>s4@%2S$YH%6uy4wZ=XHzTm@Z;2Sbc|WSBsmTVu6ouv8Igsrv{N@vsTS{-{CcZ zYs#8AegftzW?pgn%$mp;AnN-l`LTucJ60!l%hD@5I74z}f6X|X#wXpfIOLratKOOX zE4!K29_$F(eqS&)`^drhIo?g)7fd@eBD~K8Sz0_77h3njP)D-ik-BAzz}oJ054zlE z*BPETxHtT9$F11dt91!lKhL_#I8TlI&k%5_u`qvLVq|OOgANTg(>3ojByvm+eil`H zo7i#9`+}BM{H^~CM`ZQGUJBk5pKO07UMEpk?#7I#f1gD?+w|#Q7LVP*M=5#vp*xoH ztTsDxaQR`sJ&scB7N_O%EO@Gvx6j}FolTtkrqA&W7muDYKf0tt!26j&oSl*UIn|wl z54*W^o8$JJzOec=Q_$l1o(0a`hm!x+B{XEWDh5{-Fa-o};1-y(uu-cz_HZ9-Or2Fb zYnEjERKv=qgubgY5>lt;{#ZZ9A%S&`%sCgi!bvB5@_SGD6jn#|F2A)hvF5dL#L8($ z>xHY*rQ`1xIwbBk_Cyht#4xRYFE82-;uy(UVr}z z^Mz?s97WdNunpE=(0yk2+>`m}yw5dRoK1&+aZd{?nBVZE&FNQE$G%nXU&Z$X&HB#} zG3A4{2xH z?KZCTDJ^%a%_|6GI(%)ZbdK`j+rMVNn9}ki_S9qDYx?!S8KTWAT0@Pjxc)Po%n>NO zk~i&sLGSljjZf3psfMf#I&G5{T^!6A``kz4viq|Lk3~=QXKpyM?Pu1*22)o*kDNnM z@-J5Wl+KFS$8&m8Lg22|cW#6|4-mP=alB-EWn0x*uWcFq1~>km75EWSv%Zws>W-OQ z{%1p5Ro}QrN6#Al5oWHrrKCFLvz!p`>$?98dmNN(TedJ2Cmd9nAIy|}Ml2!f;Ifd% zrdJ&%=-yL0wczu!@Q~t}&V28*Ri8h;vugJA+bpw|Dhv87v~k&B@L-pqm}Y$8!Inb~ z5q8o4l+L#`pS}O9t!2~S`vDVTtldhNsfa$_pSgHI zd}M>RQr^04Z$7eXt1R6oaPQwD57Sd0`&T-a{fScwyYXnhaQ6Y#6>tkWq#a_4B86R03r+6+ref2=WJR3KLMB!(`>m(D`8<-_A zH&x9yntf$iQufU4!ny|-vP!)R8hU0n7_{x09wBx*>#?bX!hz>kDxGFTh%RG@5qtaG zwtmII&ckQDSp_<{S2t+#A6sz2M<(>_V>?4pE_nm*8_iso-|6V`KQ&tBde2bi>b(aO zBmM>am3SkdALF8>vT)A2zH;3~TX>Bx>gjMACF-#~TzN(DvsUQA_@WaVR>oXeQ?%x= zqE}$`Wu6tYU;MO~8ZpCL{8`Y{kBn@~7~Vb3ZT!mM@F+1N`H0hl#)hN><;edG1ry_c z>!fzo_;5Y6x^iIUuYR8}W$!Z%Ix{-HoI10&_Mu&`f#S5MOYct>*in^Q`0il>=ht5f z%Gw9kuV7I5qbfY7XycB|`!gCl&$|6*h<3RZy@2Wc?1ZY2Q)~Yz&R)Le{+BM(te*7( zA`V%v1(Yv`-|^e0k;SpUYQeg8`}iI2G(Y}vS2{jRPsL1M)qL8bBYamx-=&y)`(Hik z;Ja0!muD|X~(~QMe9F^J}_}S>KTuN>7X9o779pU`}-|p7N&zRtGIMpUiDUMHD zdn#jjX!SFF)wMgXuedx%NuU3N^SvZ}d!aR1`_w$b8nQwZGnZuUT9d@#u;BssajWSL zQ^F2@{i}HNcS!5Mh{iPm5#L2}?t7hKi+*eIuk!kiWY355me#M1%>MDmUDW(yajk2w z9g7{)zGsfYC)2CuY?D6uOT)2g59hvLJO1|W7JcyXRou-(Z&M26%hqm>54i2RUG;Ba z=Y)V=6)kW2r)_4-c)k9S*|gG$f4n7c&)Qq-uxaH-O%wg)Uzagh-qEPqyy3@GSrhq} z0!o%A3&q{E6$cc|Tbhn2W>z3pEDai_`O&BF1K>J+zAzlesi8nAs^;n z6O&F;a5(L!YR0{8ai_ucbE%6O4}aHW4DU>xIofBRa?bx*GP zTC{4Hx6OZs15?ZjnOE?6`YnubTp7DI{WEXl=87ll6a*I4)o*8zQ&=r&C>UzFfm*cOA4-+c<8m&Jw#b|1Pm&g;m^iR^*Z<(glgz4|@#kVR(r zC%5Cf7XoGf!EBn&U|KG8ri4N zJTs0<_K-t_ys3oQe})|)x;vJATetAA-@i1q?1~wWUOIVgmwT}KRcr2#D-UYp-_@_^ z>)w=emYYVqu84lxPa1&XJB*f&q<(zy-c z&w_n#yWakm^e*zy=A_4G(?1rz-%@kU-;iV16^;Pc*pI)an19yUG>0$P>GmqFCBmii zcVz9oRMYnL?;YnUhQ8~sf95gYB`Waf-y$8x8~5)Ni&+XAuAjB)PS&Tph1XYTy0E5j zutXpHHFZZ~!`zGg&vKrbXP>DKe9mW-eumq!eA9Och38hCD|x;&uhveR8dKRh#ic^? z{7i>$Mrwa1E3&fuOS*jd#Gj2m_g=dHoZ0cj|50qwypkJsLecA{GAZ* z+5K0J&b66;XWfS92lW|tEbzKvw?bfHL{;aj1zcI%JC5>2h(=rWnFlX?#@y=F%EgaV0_hi5cS$oafXiAz{AUH_fz!e8oh zUh(lYHJRAj92e|PY}&W%(bbi6?WY?|&-*HK-(89TFhvf zWfpBeKS1FAtH%jb3#Bhl-*bj}%KCx>`ZN6a*U#L4_J@S@ujRX4n(& z_q6iG&l!##x2_BSZhC0CsJF=Y_saQS{uQfMrD@Elo7B;^F{aF7QEgFD*6XT<**8sg zn`(F;?M!mEKQhJAg@3ugt!;&FKU-8z+*$CMFR3N#;nc(W0ZfONsBb(uUq@~Bh5JXm zB3TQw*R)C1Pr`eVfJo8U9l$4m_6^ zp2(T@QA>2Io>*Gp!X1qA;+rBg{1#=k8@7hV9QTbh%HZHOpzwp<9m38X&r0O;ZS2?vuTXy-!T`jd1vH!SwGlv-S%+) zfI>Y**2{B$w>7rw?+mDD6kRseE-0iy_2QiZ_IryS&d58^XF1*H>9mfBm_@une|)%i zZw~srDRM>jnW#Gg+ofmCxtLR{ly>@jM?<9PY|}UY8BScO+O+ClQp@s%Uypdc?lROm z^nCB>bE__$_}w^l*6*IoT8Gs(-dEOoH(ZQLu5sU@TeV{X)AZMm6xQjM9L(pl_{i6^ zKtS`%+Sw~#i|N%}mP(!Owp@D85rI!v=Wlayz^Gr!#?ZyuX{ddJ5cHs|+=w^Hd)i#whH2z)<#%nXce#>pPgX*TU~oAOzAN?4+jsmy}?SDYAsou6@ds$6o+pU|s+U1SeM z{bwjzqPnX8tE6W5l#Y;V4;4y3vKjum!g!eFoJ_@(-#pvpuRdetjwuwKXEh~kef5u4 z6YJvnKQ+YkJD)htI#(CQ>#9^QV@uul0}mGh+s#+qkTo5Dr26ujL81@yR9 zH9Wj}NH#0((03LG{_iYn?K2eIdX2vG^G7^uSQCDEg;UhiYq?wOucW{nuGC;+MiUmi;$jXh=)JaJ{+=WKE=dImZ(e*a z=00#@&`L^uxi0=YBw?yRf5wDI=}e;}xq3UvsbBsn~Hqbmj3g>DP{J2^D=4 zb^a#9)c{#J#U}Bc&LZorrf>-ICHOd+iLx-vXcd)=KDXf1-hE2bb-!&&n4|t9B=aky zs#z(Ux@N0f((%qx>p;c*hRJQVq1#2H-dFZ`xq7ue4qDVY{f^u*oAn2d>t#mU*TgI(le>u$y~aR6l9hfu1jz}a&)fGm-?oLR`##Dx-o_pds1iE*7yn}cDu72 zxNmr4Y1P6%lUDuiKgDypx!Qc`6s}p^?6VYIbo%1oJzKH%!|FSV>$Y((`u>V1Xlh(I zTjFCYC7q>CYxm|Y5M$xG`;mRy&fsv_8F%>3uUuJPIf2QaEBjrH!oKCws)hz%HD^By zshC#E9og_K=F4Z@{_U5Y*$lwVI#BnJd`mg3?}}G=&@dLZ9yZYMT02iQ|)G z-_29g?w(T8OP%|os@*9}o%s}pm@}_@(AJu>26}=E{xcLU%6oXVYq_va&8qOUr9yi` ze4a5*?vPpCnJs?i$SbZXsZsrtjJ7_WS>&sKeFyi1iucA#dkpgvcjU7K9{3`((df&+ zKgS-V7raO{NdCi)x-| zsd+tdYo+!F->ofYi;k?xbuSdUrhZJLZ$;2f*E=j{W6l5mp7Lbr{Ub@`T*({7n+?LX zS?B&|@X%q+{m$vH+2p7Dv+r_?@GDa}d!g@KoL8b>t&-Nu`5e%px8Q9}XRd(8{-Wl< zwabK5?s@(`BzW>8uYYIB);JITm;df)|~W?WS0pWteC+t73YBj%0givVZ4{wOw^j*LZ#BJtDNQ zD_7R+nD3668E5u!+`hSc?tcb@ZQIK9IFkHYJO3Q~;I;GO?Pm-R9vdsZ|KlubIjzC- z=l(MchRbXiO(e7zzYEYj@h)^j5`*BhJ-NoyE#4{fX?zuVyLO4s)rg zC{D)JE}hY4@{QShDyPIH`pEiN)*EV;^O-4%9f{4^#(iJUPL1z`!d{~jjdSK5xWc_C zGBSXX>!|dUCsU89O*|{TBEiI*eTkveoaHMFc$3(6biRt7b!FF=Gm}InJ6q6I#?GQQ&jYPe!AQCCBP#Q-t3&nXj9awphMP30{%2 z)-7uKGhXpRk&SKk9-AkwxY&`KB);(4;+)*|Gd^rP%lh?9!m8N)M~+P3?`(eXS#J&N z^_`w=RWovQGjE)@|L>6j!?Wqj1a9R2J#=&Pnai<0r7>PTk=2%GvMPM!lB^EzP+&io zI%T%@W23|TEDNGOGF}QxQ0+{VJ@G-!z;{M!!-4{LE01^fI~|+Wsnwk4J?wdW<=eLA z^&j`IU=sP=eMsom<1?GTD7e}#Sp1G-L8|1;14s1^{dHomt8rMEroka1>&2L}u>F}- z#H@2?p6Grrc$KtsUe2baCu+UA3>kN=3_PaJ?PxRS=+)g*X3ua|p6T#KQJ-g>QlQkM zf}M`r4X5rbIOTBlPCBQo0GIRn&ZNyn^Bn#yI>WW|*s}!D=keyNrw6Z|W%A>w^I6u? zh*XQS6CEt$A2D#uG1t7{x|qAY;IP4$uiCHP|8D5k?T=>ay;j+pv2L@bPo7+w#uWB7 z{u`yW&y;p(pa0ddA~A36<2yEU`A_y$vf5pF6tVh<-sYeu0?_^FOF<@Y_#L)k0UD{9uZx!VAqtCt37&)mu>e^|I~2ccI1X>bDq94+T(Mu zeddcz69TuM{dlKro%_3F@AHpRl$)3K$sbu5eBg8He+J{p)5Xk}rJuJ@tK8O^Gx_iS zhsU%!!*DMSI`vu)RrYD80oVC6n?zm?`TC~@G z`M|pegr(|U>9dwU}TRT$DJ$})e(WpDSsdqwn z>XqW9Y1W?q8HBb@GY)Cmu=3BOuB$ig{xiH;W~=VAE~xSFBPnyKy{E(kugo?+Xk=uf z$K7(p%H)97->U)pBX>k5ud#8~YKu**>RfN~_o&c}$;>l^vuj;+wpMmUJXj%d+5OHP zdCz|fw>&ZQJXa}yhhaful%bT`;^i|c0(Y$1aWb^9bMt8p<&rBLu0LAVU)g9gy=abC z^p#WXtNCAQnTF;5?hs3}?#nSN4O+;%_W3)uQ(E;ZPktq7SIn_{uaYNL5?8mg;f~4b z`1?o7ciuSgOwGpTJFl7S#~h^_@^@A?ybDTR5pvl@`^b4g2mXjDQ8RvB+08puzuTo}~}&=p>bPUE^@@)4s^z_PgdxYgYfChU?EHDpn@F%Mr>HerIj* z_!YzJ{WGUq1iLc|BHonx|o=aQD2&fH$`%>>D-DC?lZ17nu$r$jmqF;Q~wBTJ` zJXQAvO@7o?C#db%xoVYYio!JxVUB|qf1LLluD`Q(ySXiEeUptuztL_(p^f4NdP_y; zxZQT*@0=jZwrT3W#uP)CThPQ$GXAgbiQM&%msc-Z0oKKYtZ&r`2~`$W&fTvRQ7&sTD>o_QQGTl#nfu2iXF?0rO%#aUX)cO{8M|ydGFqR zm0xv&v+mw|)bLRItgDvvXO569c?r7;4MWcaep)E;`a6rP$nBa_mf`cytckf@xAf^A zmZviRk}Q;Zwidk8S$yAMV{uUH_0aG7AJ+ao?A$j|M1Gr^a?8%0t3;>t?pDiB@show zmh|(0hMdB^*DJUW-H+GVbZkeb*Uq4W_3zTUwuKzx(frvki{D_yPIH~MmihHR8LT7N z^rk6D8&6|y|Kd4wW8Z?>zRvRpbPs<0yy5KB#X>Vg6OOLg_Q)ah=+e;eUwukq1-h#y zO?aGI|AfsW+-t=}O%GN39j$76&!)W#TF7h}w&>K-4poPEx9i8xu>MwBAfE8_kI@^g zCjpxq?|SntHqqz4n|@_w16$RR1MO!eXEcU9lgMvMye4*X&!HuvK|SUSHgk`xK6o$b zIsc!A(91!G_DL|aEtuMMWvA0iyQN|cn;gW?#WB90VLru{b3)p!UR@)r`wX#vytTM} z9?iA+&rs`l^}=?YJvaIid#tD4kgaSuq3pC)al`fWUsKHvMycuuF|IuzVrXI!wKFK{ zasB-}`ct3B2Yq2^?Y(2*uD-tJp!?dhhO&EIA`%1DA3OA34-Sf)A;R7{L+}vmTIr86 zy{4LO(^q7u&uaHlVCn8*HxLmmZjkKBd6)f_DbP-2<%G<$ub*)(nr!ZEe`if}#;W5% zfB0rhby;}FMf4FXlO0G|OiN-fQLr7cIJU=uwX38KWK-lg51(Kj(Du2R@JebiB{A$lBu1U++a% zZO*8^6Q9U&{D|ZJBdk0dltX*ZtWFJkedg%3vOnH|zUebq<8^0r&628ab$D}|JH%;T zdY78EBCpu8(xZ8Hk1N}q^6VCDpJpn}c=W8KT8+WcfZPd|8;h+>MObpA`} zoMqCQUpaK6AIU|uq%ZpOl_P?e*J!=#yO>o+orN}Y@Cf)cA4y)vpz!;%X0~Q=_v6y& z^)J~bb_P6WIT9lhvpebU*@Yd~jlLKN6laJq2NZd|i`Z`*_Ehh2nEhcHotMckcZS_? zT;8#YOVFdooV)t?Ketsi0xr&88(*&w)8>;)WMbuyRulTp*MEdTzeBVm`=O}RtZbuG za&eVC*-kGyo!;p0?havk6*Mub@AgOAlP-JGwYZ{|@-;V^_HM8;wc0s@b9Np7ca2q# zvezCxx~Y`AQRvmW1&ytYx~Cp~Uvadp#^Sr4U|s}2TjSgH-(STa(%KzYU(`0OT`(-5 zyJD|f^PGd-m2J;n{G6#)Dqr<7zL@K5^N+@o^{+*lC(XF#*0IiXpThQ|93ozOu2nTw ztef4}$NfQ=yOKZf$i7&of}Ar4r>|eOK&UIkTW7N)+@r5X_3!8rt?|PM6(6M zxU>1Vo-Lf7HbMJ*puRKP1z{idD-z75x^C%TI}3e%&UbbO9CR$2oWQ*N{=ZX+*?}Jp z?c8(hXv-Ao!+X71MGo@BobzoxAQ&mPP{@rzl(99rW8H>`A2V+ssXd*sE8suFgf$tg zn^tf7KEr)M0LQ*v>7~&dKHsnCba-cXgdyN|&7InO>vCnBCxH;zve}}Yi0NaxM6{mQwMTCaw z?e&fo?LElwWc~Zj(4aK6*t&--I=5%_vaZ~<|JDMoH3F+YPBvP0_oBtDomm&{j?d^i zT6-jPb`Qh3$IMx~ty&fdUF~!=oSC(5Ve?G)rvD5n?u3T6 z-1-imMR&`KTFM?@)X1pl_1uu3Q#Fli^M8h>CaJcFf5V00EjORINCZrJ&9 z>PwdseU+VaHWtsE+NO~lak8l4)K-Uoe+`bXm$m;cn)*X2^c{o5!{FbqY>U4u+~PCt z4A5A?kly2Ey5eeLxAigA1E2phOuV%&>Q`@{-n+CrHA!M>-wmhk>Ih*k;Q6W>amBgf zNUG7Y*gJU}&hTvI{lK_msaA1HxO-<|=tbM3TjZ3amzhiD733}DnRGyTW@M4WsU1g> zxAe~VP~8(Py2;jU)6H!=($7E3TRG`hP56wXrtW9*3bmwK7fthKJgJ-BJ%#bYXEvvw zNvW5faWEeJew&@&|A@~V;Urnze*M7J_OjNW4oS$)y>cvY@0qa4%6tDaG_jVY{_Z)S z(x)~1JL`@MG2TH>n_AahT5Njt~!T|kqX}hj-krNgUD)2iJ~<~y$CoP4Ca zsQ%{8a-#^I9oj*! isT!Hwiqqo-o;x=#$ZDSb=i9-V8k6)Br^kLce8s^`a<%Z&p51<9`ZGWMIqY4{o~cCi^k` zQ_PKJ$zsaOg4QMI{BFxP-ZpcVW>L*_$w^m&_Z;YU*|6#K5nlN#i|(d>*U-AN=xPp^ z_X*$1Gk*TU98Xu~b>`1U!ctnLU-$q`EDiS(-{mA1}DI=$`6|lrsX; zPc36A+4n$~)lQ3x-Q;!rH-pCYFC~2nYyLAtd^`M|X+ie8pj^#}M%NJSQk{%PqPJ2- zS~tjq?-$ykYxTRKAn*0g`Q}d1lM421Ef!zdkfwBPXYY)7wltkN;RDZ5I8?XyV-`SM<4VGriq?=ywyx z28C7H!fKrJAM$*9%IC3iS(<3ve}*?p3zmJ?5^TG0@XkgCm&ex&eJuk;>(}q}ytqxV zLP>>l&33s9Gq)SgxqaryI>k^2U+=jt+pa%~Ny#2KeMv(Zr{G*0`J=Qam%>bjV*d^^yU7DoS-TyIaU44iG{t@GnDr0hU`o1`E!Qx zS@XLL*%|yh0`u2=T6=gYV}}pJq_$K1O1{jwj`2$lME}{Up_<}hmAPLareMi|y)&nI z3(U=VCAIZ^A!|_E_B%;hp^wz2s|c5-N4FRx8XtQ2PeIe<`0sYV*g}b!j%RkY2QAsj zWvp?yUaH}Z$ieVQ?~kn6wxY#r^IxaM$7gI|yrTUr&Cp}%IT;6@yicz*|I{844ZG_5 zIzO2Gdz6G!W=Y|##|P)HoyNNDX5KrAp1Pgudk-q;EcA8{I)&DyltI3%u~^Z^2{`)8> z82>2JEMn5Jq+?B?|1O=9;1Y-v;Q!g@_pq}E>X%_ut!2(=&w)F zGX+-ehMR0F+?NG+UQ#ge&Wll8y5fqfz|^H86QAr>SX%4%*g%b|W7Q@@=ioD+<-}H2 z?I zO?Qh~T4KcoBsYH6*lnt_X7g#0JCQ0vty?~>5Noe>Ui+!`kXZNr9UP6N1#LDKXRaLI zb6(_}#mA#U)6TmkM86VcQdt;!W`m#q%1!r;8m=W6?b-RC;p77AZqHMHCoQbCQ+{mm zDl>v9@uP-x_mbJFd^zh4H=JWcJ`I)5m9Wkq-L`MXs;@1JIuox5Rv#bIi=WjnLb z%R77hEx*cM^*LwN>s=q%wr#qLHLK-iv6rjQ?{s6`$+keqd6L61LmuX$t|P|`%+l1$ zg|6-WJ#)q39c-#~&pSfrdTH5KHG5rP;dgIQ+*WgZVRvH$S8p!oMX@wKclEAD=Okc@*BnP#4sB zk43y9;!f7qR{>rr6ZUy5%gnY|e?(gEeX-E8*0Z-}R4>gn)+{?<#&p%iK+39>pW(PD zoAqdg7-eC6&_yeVrI*b*MgI`7`U!0gVg7l2?PzEoL=Z z7kNngSzPFC){0{qU1Ehkx87fW7i{A2yGtgzROc}39LD`u9&FpNW|ruy0I72l1y;v9 zgFc^AxO6ka?dzsI+xa^d*O-3QlhP7gw`Dp@hvFrVV!FZz2%yM)9oHaZ|mBpxpEcH;*V0IY&EAiV$1ct=BZBG z^!y$7LpEcX*2wJV>jM>Ioh;Ys?>FW-Xkc=&ef|~0JKlD}X^TH5uK2NFd)#NkBR{>m zx>ikNy;jO|;MfC$C`~yJUOgR!=)<3-7F^i(=1E=cp^n2`l20p|N+qmThUQ7Bns+A3 zsK01c(p-NgY~|{M1ygxe-{N6lil5on(lkxY^RBMUX#uSQgDcy%N~X;`!zOa*n!!Pt z4zcw+gAXj^aVZSBUV6n$!rjhe#)jv{O65jEHeMDj+H5|r!jFYqH+g5%`Oo#Su+0kY zD(eOX@7*&SKMKu0`L-vi%ZmT~m7S^rj5|(m*dPB+P&|k2smAJ)EA9#Uo5XDUYC5yA zJx^9!8kd-{7hGb%Q)b>w;8=F9U zuw#l;!E@u-=xdUZTNtwB37#v2>4<&Te}?@>v@T?b zy|-UE?R(9kSGm*A|7l%Y%DPWUV@Y_u&>0`e)iXG}9;Dw(dwz#y{}HAGvbVM~JyUOg zq`da&5eJRC4m^1^%NcjIdS5+NtH&B1Y|3#OYJz(pXvDJd2&N*OPO`dzh_Rdv0oXPTEABA%ytQG%&I*cF+<{7 zv+S}>-_NXk^hzpp?_;AoTHG`FC8sWtIb>bFPwBzu&!6SCZ&F?CJHMl;+w!vj!!`-g zJ6m+c>(||1*;)L_Kh|3;|HriGqF42H35<6x?_81iX@2T|1_P6|kyo#j=;&O1ac5U> z?W%q6G8kH?lWDK2NQD@)uPG-~S8-n;-;%HGQ3keVzW1z3f+8F)I8^SA*-xI&Q`78 zeaGF)1y|jRd?Y27-nP)P=5VS0mLmq+dOkB7JFh6tjjp#-oHJ|r4^_o4(m($x-Rj`> zx9Z)bz3}xQrY#$*6br=f}HX!Ee4@KUP>#aWH;zu z-PEIQJg0pBBUSDz&u1=E4XvInahdxxXMTX|>g#uy0(lnh`OzeDd4-7StCWm&XSP^ruzR>DLm? zH9e+(CT*PA=)V3phY?$V&)Um+3~_f3Oc01-^t$+nA+}w(RQ9;TwFe6dR77EAS}9jD(_LH7ZDe?o}ZDiWzrA1)jm2;Z5JP~b?(i& z`R9m_@s{sQI&Ws8^NDpRTbIU{w@mrU(Y0Q0es)hVkE%JeK5T{6y$ILqYSZHl z7d5?FEp%ZaE9)NzmbFRdnx1QSPni-V*mhFnLHy1gN)tJ|rx$M5(-L6f5p(#}`dn_| zv(3-AT&{IYTRXYr@|`ff={wGdopjtJu|r7h<))_PU9Z>->%~9nAL8mR&P!Ue@YKI& zZBZ@JiYXx<($^mKI<+?Z;MqFWw%#e){=Emcbue%Gxi~=Mc(6sif!4;C(-}-P_<6!E zw>F)67uCqNnX9YH;PA|qy${00AM04>EI)q4ZB^foX*qAQ&823}Tl(VV`JMCjoJkUF zxcjoNA$0!}-XFV;pGyt<&#=9t&6Z^k&zmC$pZ-&Acyaoj;N+ekT?clFu6}jzgm(9j zTA#*4GpDjoN@ec!y>W&!<>Z&sJmwkqnqvKg{$(Y}yb3*3oj)_NVX4fa9N#7Gvd_=# zuwRtG%eglz>P=#U*zOgM`}TULHp;)3Q(idbTUGs?0`AWz>i6GSBx?Kf%!)66y_TBP zsmV*VSiX4tDDB#luGfu4?@j-lRdw*b7_ySb-N|}|UtU$iJF5*Z1v{?HJoogx&RSE) z`Wd0qWb?xt0TC$CFhE-Y|6V?|O%a<9(> zaehIe%f}D?TM)K*$&wr5TDlb-nUT|Yx89L5`rR|3Rdz<-=k!CanL;n^Ji_eu3oVIW zvhw)ON7sJ{>g8UXnX=XE--C_vQ)XBk2p8>iP~(w*JT=ek$UX&~)Wk%|SS=abX92CN z*WVF)+%2}(A;J6VRH-)0X43*Ub=UX;Qx|iu-&3T$zOrWr*8f~dt>(_o8Go; z`)+*wpS#bFse8-+o;h>--vg2SBejeoUM$BuQg*f9ND4UWbXcN8q~f!YW7V{-f>(); zEdMh!)~PWtf4|8Cf@dfBet8B-YVJyMl_yz7rwSXSto3S;e$QtYQ@ z$aORePh_d@2;5ebWB05h>^T1w#SLd}bRD(my6QXQk&W!Jts-G+I)B`5N1WI3p1*Kf zPGna99p0E29fd<|dPVMwl*^8vn3v-vJ*zu3u`W;N(8WoSKA#dLn|uYtU2Z?Im=c>K zeo#>R5&y9)HQx2r4L#d@)hwsEb(jmicz(Zd#=_>KKW7$5CO^6+(6d%N-l}Ou*RJ$C z((E!`5qC~KXAkxcS@!Xc!ygXG8PBH2ybIoJ@}su**9?i2FgqqghL6vT-uyUj$Qpco z=9Jim9leun{xj4)TIjSa=&;mOo-J{f9~o3w{SBIC&p7#XRv**jg|G8F!&MVL8(-IY zEOckb)8+AIg^X-d5;7h{2AkGQ_?WdI=rQj(j|bOC`5{?Ws>L)6SXV&>1~cKg>9XZIY_F%e=6o8Rgdpu1;No9%vMhVLB@ zcf3fDjx*%R^6~%G820j4)5-|dxU`@H29~pUXU$5TbwqG?>+AC?8)wEHKYA`BFl@!5 zBPlsQK8jpeJ$K)OgUON?&p0s#omskQ*Q0+443*-Gcj&F0a;9KHqINt@SMPxZSY zH^J?xS8rZsvgBGO%Jy85vmps`Q}ubdhm|Pf}w=PmuawoRJrM7|_f$<~t?1eR z3{Os&$USacyy6z?=QGDPT>pMXHhhO((~f`tQXdN3OW+kXY*Ll#b{9DI{C6<#%4gR5 z7G@u-pV6gs;fh@J-viu!YPmaWj{K7BRlKTDZtP*bt8Gqy?(vSjVzvL2k8(|WWm`}& z&rhwYrQuQZTc=c|IY$mO9ylYk>)&O)=KN#*#%#`Qq1?Ie3o9g-cd&kFS!1`8cOfeVQv3Ak)S29UiF^_8wFA$GCl~O*#*~ZDC#<9e7 z@t$MK8_yY=U3&fdqkv-WG35zQqnf)#yaJ3OO9<}ZD-PW83(xocr_&KNZ;ebUVRD&AS>b&j=O2J89`1@m2#u228m zQIYKU>CC2INlU#JMqGa<_x8p4t=?X!Rqtoh z#=Y~89PMS~zy2=iMzmDWt8kqyd|#_uP86?oHMzbRtWUJ3T0|q zno)7etXBM0nqrtS_s*bmj;hb14)@q|XkXo>uIc%q;-jImc~!@cF#duK+vmSOQn)KC zL{2H?yN*WM`AwoeyY3&W-+TJ+4$b{M;xaDx_N40m@l{ae%x?Xvw?Ad~?ds1$_p=RI ztUBgR|7?0r;XTj0u!nPBDH&-v89YCCo=2wPaHHe#&Vshr%6|_P=v_Uwj3?#l#BC0m z_105$d3a+FC2Y@|acb5@iR|4+3hu1uTl%ud@jJ)UfaO-5DLVFPGMy{kZ?0UnOzq@4 z4?a)hHBCePDxa@BoWbAJiWInZ^|G=?z&aTOi zeOy;9x~~zx=9RJWWWfcu{vPP;OAuT6pCM4|ViR9#!HdqbkA$c2%F7&9thyMse4k>& z?q|S=+J3qvK&VZwp8u^$-pnDEp=t>&&D-IGf$etEM%{k z@??I&v_&a(FMa==xVYv-P|cBs<;#R#%zMOeG4NUB9=D^rz6+K-W7Rpk>F9&@K4H^h z-mp-kqfGDn9yHqP9O8)iyfdnzcyC2_x@7*hF#4b0fEHc(*V7B0qNM%SlZ`H}sZtXUE z*N;+Trf`ey#RaQU+aB2qSP9MYt-P~8a+~mD%c@ zj#Kv}e>MFqm*^KW+3bDrzwDq}JKh}GvXA4Meoo{g?5M|K(&%hwgS^uD6&mZ442fI4F#ANMK8{HjyjJBQ+SivB!<)9^h{K`U6 z+o`WaQdxh`NP5N`Qv}Vc^Dyj|JwgD{PrEk|wqm_s7*et75%XGxf~syE;L& zr#Os$^ogE7>y*6Wfzi=fE4ID5dH&iWh6V3fl}mrN=*T*-JHCt9oXEz$BsYD&(X2!6 zWv#K2-L6-18#t%E-yy;)In7rix}kyl@tqYrkUJE($<=>2pj+Scnx8B7H7Fde@ zTfSfH*q+l8?!561^()s{UA%nlX?Nr5LJ0h{|rV4ye2;V z_+3ZDh5eCY;zN!0y$+jCS6|kie&2frZ>6$!?BrEM7Gp|~=t4(Lqp6&57qj`lbuD_{qX*?|$%n-^@ zw}>_A;|etkX6x0ZQX79PcYhRd*G`o`by5eH;r_3poAq1Da5?t?XF z0z_q8wZ-SzIu!|j6ElUL!Ps38^sy^Gk6?6W&7{K*`Rkq+U1^y_`O!PmWA!` z%3r!>WpD(>5OQVEyBL z^w6ShjXle}+e*bOcG#?xF=Tx@J#X=`8CE;kQX4o5yjiC;uQ!aE9aZtO!N(`^4EN$Q z+m*!y3I(+moY~sRvwBL8*oGLMs}HU`YTsaJtMx>;Uf#6OB+z->4`F&`lWWJ%{B1&M}1ws!j%UsRywIE2`$SO zE!wER`S_1;{sZ+plWsUnkeT)KUF`9D7df)Iv$o2G|MQvnZS^0EwhLLCB2uqk>|zL$7qt?mD%2K(36P2`A&$rv@B0~YUD93kshixAYaF=*RFZmjf86`ZA z>JFC~YQB5t_VP*tZWp`@* z8MCvhf^SwOR$I#YEYF)39{8W3=G4Q)$H8fr_ts~rTs-%)F)ZVn`7@3PyRWR73*HN? z7QZ5Pe~YH(@?FhO&KB#l#@-1Lxc9TMmEoQ4_B-dc{oXNKzwWV1oSiEBrzyI1$!{-p z|2CJ>=`VclUYA@_+rl_=TAvo%G4`2>hgR*H!DGzBvbeUQv3W(Z+(wpNb$d=5`)v?* z$gWaTcK_88|8>WyT`%9+8NdF0W*AOj zqt!?D+z4NxeOM)QnUcm2fndhZM!Ek|AExbYGIO^%nz26S$Xa36M;aRY19m%bOk|Jh zTlfC)?`NTHYlU?jH$A%ERrhG?j0TaVhK9y52RM2kty9{$;XgzEw4m;D*VzLOus+Ze zlZ^ZGqxsGs!Cw9DqCFMeysb6q@exzS^mqf;@9GQv&6gE zyQCuf@-s^p1|>~dD&5gHxu3C+K5U$Q^!_r5oX_`HmdrZ6$ujkn z!OFPDi#D!WRo$_6M$Mhm*_`dia; zw!niwo3HkWX)y$d7Vj{g+4gOw>A8>0XN45ky>-5krrKEJBNCFa%Ame}#zKMPcf6fe z1t`X^^xd`p%C`ev3n%2+%$v`{{mctmsBUb|=8c)x3$ z*nh;?O;l?2zJ%@Zor}CuOnLUoEijz=vHyCH-|ZN+DahPa-T#V% zcjGITTUK*t?^|5wUFLG8YA$=ER#0l#-|B`b-NloF7p!>i{%ggmp!F+cb~%*JC^@q= z*SkP8erHm1?fs9!26G~rp8xDfJft|`nJiOU%$cS6cMam^{A!R8nl|a{j4iC*la`*_ zyvIFgPn=%vWR35lNf+c^W}Os}=#E$!#(MOWd+$}R*5lq+be6p}J+g=QM%J@aJHDB_ zTndai#9Q3=aBI~LDN}uiMz7>6+croZ;c;@2jtJS>{BOA@t62LA!Ho758<-1NYrXwW z_bkW_)Z^OS88O;K34*I9Gz^wlh`H|HB#?Tn2%Rmnd? zwa-dz*~wDpYYW7pAE^ahN!)pTWzvWH1sU5cA3tKr&Yv-{(TL&tGljXj+yCz9J+E_6 zLpnH6Eq7ywe)4q|Z|kO)Y2j?&3eDL#W0REEPj*?zy8i4L58dg1T@&8-vxv-Tcuf1}h4R#iuQQ)E;oiC;gSx_7gunLxL5Ht1W_*o;&_-(YR^$aq-UlrggtnD~h~W z@;}>uGHm_kv@+YVKH!;@%;Oh51`G@Ca2T#od%5O{iNL&sNmq}BgbSR#n6mR*`VQq> zn;2$JAFVCI-?`Rx_pB^8Z1#R2$nT$Z2d8aYL8jkBlrmFJg4AC`0F-Fk56@Vt(GZ9SHPV-{Wghxo^y$jXT*u!H zCTVPKsk=qriCDEW3!YB8w11d4<{=Z9I8QD_Sls>hzs0CoeIj$M__~n)1e-Io@^WRqBf1 z1&{VWVP;+MiffK`j;xrV>-B&C8Fn_jeYIe<&Aw-=J{&hX8KH9|&guS)Ps}^I*8b{m zsHjzmeg9OKPmfFLyR1$(n`R})=MRDA;T2k32QqhcMHPS5SpHgF=oZ&+`!_2pJuXGq z2Q24*mUxoqrB+>Hh-A==v`3B;Wo@2mcYMye@wjkDLzeJ8djWw(dk>q{o^|as3e%FE za*5?XgUY!$f5W>!(`pXhlYb|e&+*FqGjoZ?$DrSdwPB;a}>lrR;Kv!pTlenk5!?yUTSZ zth#&c&)E?6!q|A8I0=!8W=8Lm-H(GAg&VH@agz3*BYfau{`%OXS10x!;1)a}qROOc zvMSH)xMIaKuFIY}%NCx=wC{9IRz0;M?>~djPWERhtL4wIm-HV~?XWp;JaB6v$AY^h zGfwnLX1#c{*Lz0J`oM*&7gux#&uE%rm#U)ikoPp}LqQ{M=@m_k7v7&ydS5H!l&jpi z;8^{)(AMl%hP&>p4$*8jo7we&d4^1Bc=?rGiW%`8yPQgY{q{<6ABD-!;C*Md)S7?hlc~)$E+Ofay>-Q6zYG7aIM^|J zo^sfYiCfG+KTA3LpP{-TJ5)dN{>rpj|I%~~o!RBo1RnoAV%5YPKchjLe`i|!*>ZEX zr-^wxzX}yyE9PDsrSLP{vM^ZPlxKTEfquNe>@m3=4X$z$n0>GgF>MQ>YoWY(RyAlMPUWO2ri*7BdO`9Dto%$|GTTz$kG!Cim6 zR_IiAY?@|gw=kSHZJE;670ZR6DNkt&`Rg{@B=!-rfow%n$vkl`;XTg0yQjRGw^5We zF5zgQK%!>#j#bMSSG8xxRL)4t8u>u{U18?ZV?D z4jZ+5q}90IMXX6bVx&>6^euyF;$0^d(QU5d`d zY+*@BYCpPGtQEMbYVmH5)16cKzn@8Kluz5^b9%>dqYK}~ogdpDIlsaBj!UTi%oJc4$_M)&c1b-Tr1TkrQCZ#nnQN>;k-;moFZU%r6p`wbkH_FNXYYZvO`cK2b| z6rK%BxI-To{q?up^;IBj`W&YTp4T6*=y13rptxs2u;j(RJGxnXALVL)-+5?%;bGrX zimA_6%nDqm*2`Khk>jv@&Oy$~Rc)@PEBD`@ncV+tik3lm$IMy1O=>m*KW7^MaQ5AB zIQ<#pVRg&4OKNM_DvksNZjQJTof>c4?>J}r3htDt$JG>b7Ji)Rn6I&fK`(mZV*Vos zydOQY^0HiUTkHPc7S6r<4JMX<=g{~excW-*WFA3LhNyeXvivtbi&omPyQ4*2yzcQP z9;;^}n`7p@7U0+x?05X5&fG&`;vagLlGBu?&Q5KKWPZjP<#@VSQzxKsy`UD;p7=Am z0T-k4c!Fb3X$XFs8hF%u#`9aREMzim73+naMQ0p&)1=>jrSU^`y;N)|2ke3k^RqLc(63|lsnVX zIWC2*kDd$u>Q~@jr*3Gc|0wc7n9|eE2lcBu3U{BW>bTx;z9a13&R+BLD?7M%#*5FF zoT(XcE9zmF%+&m#Q>#1q&OZ{VjxX4Baan($4s+`s2a~(^gZE^7G`e8<=FXCfaSOAX zYu(PUsj;{g_NkiioH}yTU;9y+xc-cT2V@?prfy%cqB+Jnl>e^xgAJK?1om9Xc=m3) z!PERR&XbOqeY~=?b!WS@PgV1@wO7A$AG_6=uJSPdSYqI+&pes(uhJfbmhVh!Og32; z`OM_`v~&Tj{|tf)R+e^fY1R~T30AyHXg{XFm$iRK)3uLR4wlYH^w>XRXHf5f@6%Le z>+`r8mT^5W{Vu>I@>)*y!g979Z3^cqrYw^WT$i_QGe_avhqDT6(h~iRnpWL6YS@+f zS?}t9hVws-Tx*^erv=absA;t0k@%GDkB?+*4VQ6@-DmT&m1pO9fh&P`4cVq&o*!ss zVZW<4G}5A3ay{>{gZxJVmgWaL)vbD%u<1e!d!X4A&g#wxme1@V!Lp9c=l-~@xhvIW zbg^j1bY>tv$xnO zFZkWZbZUmtg!7r#mb3ox-Pt<-Q$pU)x#}~cCksm~d=_xx&gn@S=VUCEx7r?D-F)

    s@iSXXrPHi2YmODJX56vs#)>bClNLS}UK763F=GY8MZr)PtxML2 zk3D$1Fzp?8gxaCLhkFFKF06H)pr3N$!mq#HPniCk-f-fIv{Qq?!F7wKy|^FDaN$l; z;N(X#ZP~v&T@v;l7g%r6`Z_)CadKwd;&mSbSMb?)T-o_P;PHN$B+b&|vftCyA4RM@ z`@1`^r?PFjM?dGZiB+eAj~_1<%zL+Ms$u@h#%b^8sVD8=(|^fyH@<1L(9{L@l#{u7 zPL+M0`?K}E*`pi0ibXq~g&mPvD;$_F_b706V^zPMD#L^2!YcPAcN|yH=n>CNcMm$W zz-;d68L|$oVsrm9)Er=7H=lc$YnkTkxcNtpYD7Qd?b5&NaMyn7!D&|Cje^$J9>}rN zKa*(KSM^zlA!_4}Tc6h#t~$1LN4k4n>E9KdjeFBF*B;Sl_@P|3#tYP=OvQJU%*yP_{zx3yb9JF2k)imOF{mMTQGF#>Dze>>w-LR59 z_=K?C$-DI{&UhzY{Jx`o&4u#6@7PxJ&aOFLv_or)os*?gvV`F)%_(P#AD#&|t!`wH zQw}J3QKuLfaBP*Lgy5pacRTf^R5SON`K}{@JZm_5xTfw!Q%cM zO`Un`5~lRECaG+-*>t#8dS$Wo(q+b)bf2VR&BXeiE^{bd$`ge3D?T|hndrDmK zUcyDHc{Snj;q$fb`890M zoK7{Eetwl0mik8b2k7W<1zxZ2i955j82;STs_~5-Ir4U^Gul;nDgTf1O&d&ibsyQaa-RQ$^jxPu|FT5p5f1{o_(}(>ZGjqraL;_kFapfd#>?ZYDKTSfUHB)%kB9^cOwdZ z^i8|h)pSpOh4x8C`4>A5+)K_obGX%ZhPrC?e})MP$6t1Mx5|FM@+SXC@N_wIfrEFy z?zpq<$gbiV$49;Y6e>=9+#zhQ-|FzEN3$LW1)8qH-5 z^O+gTqAUNnWxn6Bs4-kdZ^LPiGI7n_;+utaCyQPVHN6`@t96F)E1BI>S3VCc-#F*& z^!5 z@uRpSPII|&b>|mG+xdEZ33&93fpJo_{*$9K zSZmzoEUo+}bhSCqAZ*W>P{+3oUS*#d!$S4NA2;ciY8ZbPkzV(of&a6{Rf(PTh8NCW z6&2hoUg|%yxU+9rCx4h@+3~xsw?+Rc>2ig2RG(at8qy`fq1RK){wU;D{7U!jM=JIQ ztlaghFI;%vsx%GlcZpk@g6FRY?X8;fP(qyNbX3)pw2!=z)3!*>6yvh0ZhZe%P1=4& zxMkv*N7ikwuEopa-vw-p-19Wynas{30vch72@mc*N?gD3$Y#^^MF&=fR&^-POj)^N zz1ngy%Y#~5JUovV{R~=|DXzy}lYGRfMSraq+w=fY*BYZk=Vzu&$*)t4cptYgblYuq z$tI8Q9jpa$TQwYwqLM^Jd>L1;`bZYG*FEjjd-ZfGOW@_7Gg%jJ-x09*fVY?^Kg;9u zuOiep*WYeUnlH}XZ2F3U#V2u{<-a@Jr@5{No@M0UBAB|+PwVH*8|n}LDwJ-!dxwFQ zrRE*4#`EZv6AX9m%>SfrawTws!B;~&;ZO4xBO>K{q1pP61Wc^XIf`7%sEa$?~PwtZsr{pZ^*C|zcxHHTbSVB2+;(Wu+O>rpI@@1K&;F`;;ObmI zDc_x;M`DdOotaUQ`H1nunO!T-mK^KWk1w`8Xp*}3qv-OeD`9UQt_ZuZzPj(%jqio0 zKjrC#Ho0E<7@qF-V7kBLpR?O%n9BZVxS7j((CPSd88@y+i%h4i@8G^*I9c$Ft@$;p zo{jN7f^6q=GBzErOwgMiE`9mz{wq15*S-g=b?tLwc6OZqtibep<(xg`XSlCcm%cBI z+HP~8GHJCon@i!GJ8T7yjm>#O3p-1e8YWDyo)z9FBF0s|MW}zf&iRUjx%(%7*J7Ey z=k+Uzji&?l?Y|O`d6&uZKf|W2Yw|AsIo@?Q=+_a0+*1Eo2gbxzLL&Xo+u8m-V6LCW z^?kC#gAGUO2Ko1NAps_|_76*j5$f&EPhjSQ;~{hoTt^i|P^Nh`yb z#9Ufwv}IOj%#^&3!ew7XgBIua7XwTRZsGpE)~+O$@rXjQ`Bg>m;k z6+bVPHZa}mZM`z#U#zQX<9We5nSyD&>FEVGmj2wK_DkWh?zhva-%mYKiVmrN;(bT% zBZFw%$C+mpZgxaP>lK?e#vY!renzOM-2=f$&hDZ$I~c#S9ZGEB{XJbu_eHYe!Rt*4 zaeHSrCTC8&;p@QbvZ;F4k0X(}-%jtDus+gEsO#J3Z8jTz+>sJyms4!u5Zv|m;Hfj_ z+LiOf7w?!F5*@o(fZ_7_9DUc5|2UYKbPY^O^6maJd^1lCpMUyUzSTveOZm%7#TmZJ zT|C|XS(`_=IIu@F#C+<%B%TD(>W0kbFVmUseiaa}J^hqVw1DYBpQLA-sfX`>2A@Sc z4|i$*G-L`dOOb49?viiI&ziyeZf4nx>cd65C0|U$l1MH(8YToM(bJn5}i9y zCXpt(uKCLgZyqib?Ka$~U3+F)xY@Qp2ez^$@<=^eG?nLorjnBGKKIET$+|b?BzteF z{c&d2%UrnTU!vQo?@~cbmW)#vW4uKAEUzpsIahAMV5(W9U43WKrP}A8Sr>SHHfeTW zbA_pK`ZHy*RooMkyI4QY*bun+mEPSn-DCBEc`r@}J5H}R5I2uot}v-hoY$iH>bl|; zMH^?9&xrRuuHaBynXV%z{+&Hfe#Nf5=l*(6H-=oDm!`Pk@L@sIob`|F4!ryN_ahgh zU$GdYY(@K|9W#aIpOh~D&oF^0`P@_U$vQe01Fy(8Y40Avx0|`N7{~ zw=Ip_uD9Kpu|k`n^15MePo_Ut|FvR@~! zsgUb~>fN}$BooH@JEHb~5nB52>W7Z@&3e37_o*j;XYN}2oiVgWcH;W@v{XxjUSHYM zxi(AvSnurm!2V7yDdf+jcD22E47%5kEU%x)9A)^-a_PaBD~t5m668V`K7G+}clD;+ z{|qIm*Z(aSV*kjV8+%@%bVvBp6uIP#;J(z?FW(t6H|eZ5=5*r7-`SmdMmuwdY^IUe zv$Bon^M#jcv96!-F8;Sky1?HK!KwNMo6j8ZE1W+g?)^KlX-3VN4-#8{7|70Fv7>?a zk%ofK(){BqOK!aS*>JS5@j&vr#4YWww4J{SXq?HobfmBD;*Ra#B^#gWeE54R(Y5l5 z(ag=S7L071CZ}sUs8qQPw5vKf{crjqii5a6Xo3{vl@O-nu*C`O=W3-g|Al zr!ZcW+jvCt%z-nEUA>pogs1;?*IGS&f1Da;IFtE-*;OqJ%y*(*1ec$xIm(=KZvB4- z^&$r@)y~J2-Ho}^wm5VpTb)@sb*b5fG*zxmy*pUXKZ47x zY7W!Bq*H4w&giX~FJNq+_VDyir-%Eu9KWaNaBIQg+3o>Z42P~4x`rOj3i7ITVPUo7 zSnUJDKI8o2u-#zmqK; zqt89^m^-7_Y2w$8g$dH%4OkaWkDKwM)!X~xnGEy(s+k7+9_+R~Hm9y+)y3!1nw<;f z?}Qvl@)LT%@s41t`X6!9h&q2J^HSQ0G-WrA!*xsZ*&=S)F7aBvCa);r$ichorP~Vj&6wNy zNHcfsJL>@c9ZRHUeijqyKeP4O*B!0y8CsD~k}d2rG_zWNN=9g%pA>!i%?uaWD;WmY zcdiwyIhr^9j_!Yk%)dV2@_QV*>Xun>yITC5qF8h_#%-&JT|)P@@Ap@FuF}!}?DL)R zhiez}O4r5bmZ>mmq-guFU1&;)-?2Djnru;w+o!upi(o?q+cOT; zy2mf<@{g=qzWIDnyTU68A6BpYnf|kS>chO9c0Qd+J%T_wXIZ?8~CRJ6~)$Jf(R<_d`Lk zx66vSthuIoDL?;vD%*RGTH4forEIY*>mD^Ll!~W*m&v-IxL&$JT7`N2L!Fb;b)9|W z!iBcwLE4e17Br=e2iINA?%En?_f*9+vT5I@M)wf}Y-n zxjDVjc0W2#XP2*NPYl0vvtx0G)@HwQ4sOAODs$so`zxpF1#4*7P`F zn?rkw-#ut$`p*#P(W6YOS6x}j__{4x^7hh>v+F)RuYZ@Y$MRu9 zZ^!%iOV#WhO!p)%$<-*eRXVo?H55M-x9L5yZPlIl`-l0j-s@l45L4pSp<$>Ow9|RX zcH@;chh}FsFZ7o3-n=togPOTW!TLJ}X4jpuG#%rDAHzPgxKn|{fBS5OZF?oSm&QHwm!uM}PD z4F5e%SP;?vwq39%up>OE^!D#UfvmlUmv%?2bm6+UomY)(<|dsC6Lvx0)kS}g?l8Tx z;g;&PSyRNLT3_9$Ss8oaMe^pGN93J4mu|XymfKjQ=&x7Que{Kctv}8`;$d(&R>*W_ z--3JTY?YPWEgy6I4_!?Y+#LN(<`bsqQzR1ogkW*T zj!o}E-B~o)u77)8xxRp#@%RkkCei*MZHeoTn4PORdZY4PY{2HJGfnv!0|f3$?`XQf zYLmp-Djw0HI`^+w0tqmWNjj&UTMTG5hzRB+ITdE!$#xX1GKZC$Y$=c&b&d*L|hIrWuWq2cHEkE3WXFSiRub!rXF>g)J|29=_)M^-k^9$LU|D{uI;yJ9oy*-R`>c z1IieuwO*~9QkT6&_i4=?(MIP2K8EQNc6=zD8Tmnff5BZZYv$4!Y>Htk?GmIMB13OV ztulRT$X??p;c+w9-sqG76aTC$MN!;m1h%q1yux@q@>zmz_U)Nn4Es*5ke|dGKE2}1 zlDiXSM5fH%yv_9fli!`Z(J#$9_g&)DuFGjTsC(=`g8^&Cqtn0Fd8ROYSW|l}JV0dk zIyJw_$UkQtjGnQ@?dUekzh3ltrP3{_%_~CUIrc5>y2@IY#_FIOXmcRq;q5b5)dGJ^ z5o0l(9MsgmYkITxX9kAryk|W1{Xa__@LTN3l^m6)qSrs;bkyl<<-e!qXnZW%cY2*& z_L+)Rdj*zN=<=`8OG*4H-s07D{gFZX#b2|fvKO0bavhp|@XAT22ig<$XGGt1Y-RI* zzjIaOjNjd>TFZIQFJaY96R!Bm(Y<+^(uG@-jTS$heP`jZ#I~dpayw^CDn0*&$36EQ>zL~P zGu*i~KgD-p{EDg0zjsb*{LZH(^Dc+)U#e=@Uc>!n>kW1;STA@t{ZWFI^~$=BKc~0W zB{3a7^+c-CC6mE8?wKq1#mdI^CsWq5%OxK0;y0Ms^ytCiN1`V__BzcBUy&tR_rNvs zX;Z?l)~RkaK9(|hnf;YLWfghR=Qz)N?zr{%k;%h!!|JxV#UBM8gzwnan_bTPrMl}V z|BmP#w)>v@9^C)Uq-si*TyWz*IE4WuvBsdC)bdEk7HW@)j`dadQpkzHK~vTRE3f>|(a10v=5) zJf`jOCp%9pu@{^j{F!MDTb3Bz! z;D3e*2~%Ul9NX;;GWc$MQ@XYP?O`tMgQbREcb(V7UpHL1+9vyF+kti4|I83svug5$ zS5*oB8J@7*joDEa{46@L{YXh?|AEvBcB8H^b~&}Q1vfw5zjO0j{R-W*jh}^mLk(RP z^&g3k?!91JUbr(SYnJ(y>s-}_43_oMtxr=YgkC&;hU3uXWbm5-9 zab~o{Z3jcG?~eTM1(PnWkeU6f?&->39;c?8i-)~FwshI`{wrG3WHMTuyiRnn)Est9 zYc4s+EyndIQ1S2+gFg31sueTaR`xn9KcZVI|M6LLoV#~7i;SZ6cfFG6uKS&Pjy_Ub zeXo#vP3@mEySA@xHQn@DP@(I_0`4arZGyiKt6$Mf2^C3*Eaeuj^uC%EWE-Kt#ahuF zVK#5WvDAqDua>G!H97q%WIv1H-r3S;pBZ?W$z2wf*co2+S#l$ePNt?M`?Agm>iwhhc2_-((f5o!xcJ&nT>93eJ_6t3* zRI*~ae}}u`vzSHWd1G}=Ly;z_j;o*UF4EBVx?(kvKe{(aAxX2MWzC~S51MCv|Es)q z&(Zz=^kM{-t3~vjNq+9LeEAc_dLLeioz)j!5EtPSyGpQg_x0}94)bFRnp#D+m}D?YV@4N@h^*ay=79)H+R7l zrgL1g^}n3nS^g|SyhL`}=hE&+Wwr6QyM%lm92MW7J>xKsv86>vc3M*M$#$cQ(-!#7 zDL=D0WUte=xCcM$4TP0flYbGqYbmn5vug zb9zTwT;rLQR-a$#JdI%1TwuN9`0JF1=l2WfitSVVlW^`*k7?Bk*Q^i!6g}%VH;I?| z+h1bzxp|Vac*l-M$zefEE9SbG7al7U*Wf%{J>A^7P}}#0z%uc-SBjnrJN|x`DQ{-*d4?+k*TLz} zq;@eeX>h~`$_kzO_4mx$%j;5G9N*8lvE_11l!-_UV5ab@n*=hEhH z3l7Df3R?3!g-y0>wMe|s~5OgbA|Ux?)fu&xBH(tA1Z!E;BcJtUnkoy zm$?>i-2II4UZ~|Asf&gFLMx2UZ7q;io$D4F&bPB)U_Hy~CDQBXe`k5UCW)hoSE|V& z)yJq%&%oW*xyZTy&XJ(`XSQ@$NKbne6Zhz(OowjM#qwvOcMj^d`>*|ODEY@Ja7V1= zgW0S{{25m;Tr6qnnuZ}JM8R7$Z^it==oZ0=; zdC9C5AKO1O=r!&+wqB{mex^&~;c`P|^}Qi_EnCAuH|k#bbS+6ovl|c`g-kw%$s%<)~6e09$`(<+I{5EvhGFm&lIyaA2Cka_AgON zVUJLc)fbZ=)29hM*V=FQOfarA^JgDZy!>~TzoFv0c06NT8|yZE>66AOe~m6I{VtZl zTzjXe@!z77@^wkQ>erTqovJ#LX_9m&GUkyC;UCbjRlqMg4l)v?HFq5JPS@$v%6Jc;KG1s2Ci7^T0GST7>T;QRK->7W;u zzo#faO?v+>rYk?orEA~Sl_%^BEPl_B?6_j;pS!>&q2CGhJ5GrmC&BIc+KkR$2*Qk8BMX!zRg)G_Pf`0Ye`khgayyf zvw!BeaBk1x19`8D&d$hAe-(JUz)Jh{fp!Bko8Bl z>js|QzO(SBM7U^l)7{f)AJm`!XHc|go%FGU?emc%TYbD`f&(}1+Sni-mL__`sP}M! z^8vQKXOBLPpRu6iN6#Y0$hVwTF`GrV_U=3*CcgK~0mbd&TDNDki%6fhP~e&S`TCE3 z@146&Y@7U9O6;Q9sVNVB&RJ2kWqrp14z~79tO-SP4W^aLU*e0YaXIl=da6`-KH|^PkBIO#A#}%8oOquZBG`&dpOUK3;T7CQnLgMT6F~qG@-w3Y?s`=v17- z+tbGq*G=rKHr-#?cP;mR(YE`7ePQo^KeFkyKf@GN{aJd`mcp5l>!fb)h*}(b+EOX) zUQ+AgGMTSTrf(l^tXeL(XjAtz^J~XUCP?aw81gP*o)~aW|0#om$(`4K-#?i)P37>The~xPueO+;A zNtjfBY|GyN41sGJZ$AqV&)Ku*$W$l({a3cWoo>#WsPeZ6jmM?5dT3JhTVDm+F1iUQ-WsV47N z6zuGLYoNoQ>;3EMv#iz+v9*pxcK*+@>~<~q-E+-#XL7aA^@Ta5+a?xG6EVXfwMTeU5$cC?d9a z$BcZ=3E@vBE}WUW-@Err;v%MJ)283C=)Svof~~piYSVMv(>`6^f1_#p-7N`Hi!4us z@Xqfxyik2n$7z3jhvJ^*RwnQ9pWi)hV;B`n)Va zyjVFm0vac)uYrZvoqR$n;r=+_;z3lS5{nMu-0Ih%j-UV%Hn6F+~?{{l< zkHl@x?PY6cK0I$ObvgYRm(1rG%}wHm+F7b*30Jc`Q{*fC)wed#fAfEaMAuiBf*a>f zTDHTd#^++Gk;vc5sirSqJ#~s$a*&Gk^LCz1vlrz~|95m-{}mJM zGp__i`xJsqyg4z`){V`XT2?EaZ0jn|FJD*pYP8pK}7KeN-@{GFIw-U+)0uWy#0S$FmOoFm`%-qs9@ zpDt(X(E6iXB=6RxW&58Lp4fPHgU!U~9ZkBkD?8HWzv6DtPt-d4_-egT+Z+2GU6G=y z{$EphXZ~);y&C%G;5m!WMh1p``x5*n^7VHfaQVuj5&J6Waq2793lEw@i`gegS9KV? zz7ptK!g4zBxkYEzjEo(5qCZ0xAAD5A7PZFcK#A|fM|@!yB&Td>JDYE?th-$FTs}|2 zf||HAOZFoRE@;UZ-d}M?@kQ&;%JhdTHOkYd(1O$D3hy*|mfQ@y`LGM~^Oh9$A;V!C5Z(n8dUk*C@V6 zY@9Fd2p%%>x;A0W@s34L>IK`C_H24JHRn!|VQlE38`qg-4yAY3h9$||tUULbdHLDY z$QY(whjmx1TlrmVrTEs!Olf|dE$L6D=Wl(-Eq3qV3=h4(XBw5VEcY0@rLpDKT;^;u zigntYeC$!{0@nqad;T*Ni$&^QIk~DfWS#RRtF;+w+JcUq6Lj3}oH;Hu#mml3W_{?s ze@|UsOkrL!P3g-Noh0#J2l$`a?p74tap;I#>aq1RQ?EZ$cqTM$Bi{_6H`mH#uJ9ab zU#soel%I)bj`yB<5V3KOvu8-e((60(E`PRJ^BeWLw9@IrkBBeACFy4vq^l2oIQ>&`mEO9-l{2^=r1fm6@vfhF#k8m; zwExN{g*WC$(k93Vp>-!%3IPiH!!`7qcJOb>JR?T_5=uv9z zQq^1g3ns6MzH@*({?+5>I(GZ7?9lt=IXNMe?SUkJf!d3iak{U#c_LK=h}LK!*;sn9J&Rr>wc|09Tv3a-|yLCt}i??dH=C6 z?h=Be)oU7{l23yn#aoa z$l~&XB`@wNeA#+!RTBHZrEgy(Tw;CnPTA{E(nPoJh$&g-x4%nX`gU3)zU@^5j(t-sHfmA#N#kmvkaP9^Y8!K!P5&(G|ZR*aiyRNYV@cjfNKEk#WMdEhP$shkoELeYJrZIU+62X4a;ZxcWC|z$Ps@%Go$t0>dyxEg_6G- zFI@6g&enBW9k08=p&c_M;y-IlYOZLVw0f`OR;^v@?Nn8t`n-EEao(R@%Y>I*y*#JB zkiC4<@%s7245tD#ORhNVnKyeHLz-ohsm6bX>F3fIZx`(NF^&DR@g$$`CO+nQPj74N zOFp&!cE=NS@s*V`>#}%t>+KDut(mN}U1Gy)%SNrP*L6xFx&NMbdTzT}`s#|pnXRAs z+OF{_KbqMv_1FRi)-dbF)LYV9JMH6OW)p@Gv-0P2s zt`y#vP!X0tBRimrNw;s#sptsa!(3bI7G>RkrM00#yDqs)p)O$C#<-4$?6tu{^_Pzr zuQ{;N{Labk(`2_9?>IF7q~^3upS}wyZA}nuH|M+~zvE1Z(dlh!((83x7}oCBb=??n z$KrhORJUst4XjxmSEokV>^;sPZ)~{Qr#h82-EQ&jbvHVUeZ6}=?~>?wv0|mkSAB=~ zSGcox?*DmsM@dveb#v6o?C9kEY}e<%mafo$7vAYF|M*b|PpqLu-glude;q9tEc&kR zzu**D?EA+p_LTp|m5E+UcAOPj7q`xD+1L7;Max1`-_AAAu{@{!E@eF{XGr$qz>Q&1 zQ_b3Kd;?-t|9CNhzYx?&k6NvY7p7B&&W-stG=QmM25XDQE{a&*Qv_A z2ZSyaGM5#l6+fMJ;OfHC{(|hKeH9h6rz|;>_#o=Yau3DX4ea?xmfE_^T6Q`AUiv4o zzpnFZLVxt!UcasE@|?tTOSulHALh{3EI*dOx99O*HH%{%wU=eKunRntB)8-s? zkT`CzbM^iu26yj$Ec~k57;8c5SD&%8m<+yUuLjsLA8e z_;qEI>Fne3hA-Xsr&KQO+uw2f+~)Ef;mUPM%`T7DzvAMZezE`EgZe(MOV-SDH!{mH zE#SPgbg!Xg!O~?GnqF-EUzxJKg-&*OUY{&~ghlgX{}p4V?s9>vQY-E6^(k_apjtVYTLP0 ztW(l*EVBa|U0cc)o;F-n`JX}b%HyIR_E&habo= z)O7oFnW=x8GRIdJHOJDKCp34xGYT~;HL#pL@o1pt&L>6x8BTEQxMS=*{VRv1Woy#|@VcUaWLML|3%vddw++j8~UaBp1`s%h#J3l{| zqBO@qV%xQfVg}7KZ!GF(MDOw5dDXf#`<0k-xMlYdF~5mlKkIK;%2W7ZcLU3s+drl} znHK-DMRU6#)AM+pLa)Q~QvxLf?Tt-#g*Y(886CMa`EdUw8?}8Lx7$nAgIf7C+df?ILq(4_#qOb^JP~H}v7-z-J;Ek5AS(JMu<6$_f4(voXeO-wgYtHF3!@pV}p_ zJo7po{>-R5>C=CPohec~S%pLD1U(e2oacPKy0bG?Us}Lz->N=KvxAIojZqGZgC)aX zF+Jk%{k>zO>$(qVn%mzSHUA8{<+^)c>Z94ZRCHR&1(?#`VO z7yhgH(A!#fF0QtiJo6oLi|(8c^b3r=sll}I+w=#&=GO=EiS6pzx9<0pQ;$-<<^B0J z{kYF;M~62T6s!If@@QB6EBv=qHuK>Z2L`oNSY`KR9C%IZ@gL7Sf`?Fl&{ zu-oIpr>-k&y|?MqI#j+Bvk+dp=d-ZoP2Ui`&nK@Q-J>yM^()b`z(5|ELI#(ud%v>; ztesK6=d{C&KFM(A`W<_nT7PzhgdTBsvRHjUtT_Hm0?&mc-PK)-mbLLz%-j>|)$?F# zgXI;SD5qyLA2Dn@_(+^e7>TvW&7txB2U+^Y!P|3^D~R4d+6jV zcVxoef7IDF{qUWzhRlWQ=Q_A@>pWav^mbKf+K(wgDrd7Ep6Dwyzf{Vgvv`NF&*$0A ztj3usl5725S+b??xG9!#XNRf!uIjm;ONI0*;sWlq-L>id{|(nlSIFuDwRb@+2N@y>mh#mGQ&E(&qu(3k^1!*cCiD>oVzs zFR!I_!=n3(R096KTgo)6#6#4hBQY@z2 z*mx$zrSkJTnWm>LuTJ*LY`b&w;XBjV+h@J6hJ7@;`Q2xB`8&<0AI@g($+Gi3EfsNl zr&nkicfge&Q>0`<{xbL+2>i@-=zP&k$28AnoI8ZCFcf?)&e@l?A~~W%BD|-nRV8dI ztGeq!G0o=AC~4!*Jf;y%59Um9da_&S@g}~gyUFnd4w}}N&9-o|`fUAAdOBYxn2Sp&7fbJasg_@qO+Y2Fsf+j+%SJ zKZ*wY{V2&^m&8%rmik3tP3URUFt=$gKUVs-I6QS&Q}`?*DZuv7q!k=jnL|6W4#;d^ zI~8Cc{<>H?!t~ds8x{)Q`e)A@E3z9skUDu@{wGUwWBRhCVxMOAbHww#i(I_y(NgBP zt-P*&(dUok>t=`Rv8BD6p8t$zY3b&lA@Ui&rc4n(d#dHOWcG98NxJ70xqagcy>l}^ zfBwj27_#1QO0 zvu}xe!Ls%ISB_-exY-$W!{~m{u_K=~c9icwmcZ#=>ZADca6;<$`(0ty?~E2+=DPc< zbJ7$S)xRH^u5i`3wS5*;(Q(^dWgk$yUoP!Kz;o*(Wdh<+ZC4%!gm*K`dU-PF?oBf5 z$cf{K4|JH$6B_yKQPCCVt@BsxF41HRn|1Cf`1Y? zuXAMV(!gMsYX5hp9)}}%-o{z1d+b`etg-&{GuxaE*ZN%F|7h^E6c20_ZQ!}$dx}qQ z3#}QZuAG>u zCz9``=9)X}ovz5nUk&$I__|tNxkUEAd%85D^vGHJZ?0?augRI^vN!aK{<66b4i|=t z{!NOwCEC_*ppYcFSljEq?~#Z#TW>qpm^2?T@)3`!yE&utdF`ClrMbSHi>^C&e-%Ex zu6}mgqlUa4pADyoT$S%g^IHD#BUilJB1xM^;eLJf(-Kxb)I2`FaOtUHsVRI)TmrT+ z`!hO=zk6@{sOOyFl^htc`p8TFj!$gS6CHhOgO;Qnxnh{e6SI9vlg#_S zr^_b%=zLh#FMjE6i?X1Jj)0W>3FFCJ%=&j!@`B22(vr1U?GzOl-t2g^^u~t0wI407 z$=^%!blhkYw>U)f@fD}`Io`4J4OZ|Sles@fWdA)2hSuM|9k}LH^t+zFqP3L&_#;-Q zjWb-A3tfK|5_5BBgu-%RQNE3QH}Y(`{-x>`hX%+fmtL&8lDDANC4tvvi_bHm4X3AB z`R_~ZNX=tl4>+vCeYfU7-UBlOk6S7^p_|jcSM<+IIC_0WJp)Jm9rYuJ;@q~1?2+-8 z|2y@y>G}YD*QrcFt&`Smd8fAG^$NAy9hw$B8@X56?-$zWU|uy%w1>cokCgfMgM2m&=JO8)gchHwbmtc&VPn|%W}l3 z?kG9$t=}Q$QSKV+Wyz!&{+VxTScPFnh|>C1ot57n*{VOE@mxu3-FEY@x;ngR{}xK< zJ$vH3!)jyS+QP!(e5)V5ZX2FG3ixnownA2RrF-3{;l4xJMN|?%N%;h;_xKdz$CC$%0)En;o?G( z=x1A5l(%f{TKUR(Moar|-?hS9&wSpIEpEOe*LcOWfN}=q$L9sRv+`${eKtHI$H+WS z@4-Tck4=o9V}rY&$xM%o{ir#8?sEZlQ=YGyTQ`0#YE-*2d)ep5g(*E&il$e+{xc}- zUBBk2uo}}!s4+tId^vF!Ygvk{|-C)PFTjB^IV5D__49d&IfuTy304M zGhM+OC-KHz)yB;*k*EFnzhlkfJPsCLbs9}_G#9)&{gI8;^{Lzb?JQbX>y%ygdRr`M zR$Xw``)IlD&pDg5x%M24aTJY@S+HWg@9z$_6RBJJz2Aw}?qs-gL}|veegmN?zZ+KY ziyN%w=kOO_G0jY6gHf7gsjt_D-RoWpZQ%)F%XKp&6+-ri1hP#t-QOWTh4l{WiR&w0hOc1u zxV~%JqpLgpg=WNrYW}>UQGdgxLymKze9;&Fzui(6#fGBC@0e?(S^kJ$*?QCFOug`- zr7@CMJj+C{?1*eH+$R}y<|Btr&%CXYD;F_dQq!Eed6L#)*Bw)?8*NO#w^irEd=a;{ z2Ad^%)Cv9_Al9Rd;guPXNz)~;~us9Xe?MQG0mT|&FgA}{>;FI z+l|_0|MhcvcsA4Q$@(=%78GO@|9w{)WiK%|bN-4rhrP4DUeR0j!(mUw3NE&5Tjalg z6j=0bVU@7`bwd%ea=+!;rh!l|r& zjB^qbSaoKu|M69B`TDYd8;-u%z4brCj)3!~ZcTqS{hZzAb@Hd{o~SDu{umbOJg)Y- z#vOe$L^f1rN5i&dX0{d6o^)ThqbHKZw9K?dK%sV_WSYz+*7WrfpX^KSww&eJw9rPt zQ0B2pqW87P`m^qg?m4?YGIb=#f0aJ^tL0j3tewSd<3#i4GD1_`ce@vzJ9SMgWC7d! z?<}eh!vjQa9NA%9aORf4os}ov1|94)_VqFm+rP8HWJ}Y}u$&{(E-A z{O0p_7KxXCJKFK0i+|=M?phxeIs1Z~S)XELBO-eRmhPN0bq~AHa$eq&L#dG!GY)Ux z!MbnWL$&RN`)>LB-#L8fKf_*krFjZ{+Hs1yX*G8?IGlYm)r9rm{wEq)n;%7){%26D zcH41~L2pBHjKf=@JIRF$wp(<~S$%YglYx9P5A(F^d%V5G7JmHCF!2y`Xj9N4+0$Z8 zYTM8Mo+;I59x+)K{8aIX86%Ax8$)%8(xp2p1xwhd!g>u{BE_8yk4C67O{In8(_m!%Uj{p5y_ zfKRD?sk>!O?$#X7(AfJWCb2a(PkSl9;Z5eH9evj~>{(FQ#B+S_p-A7aiz2o!zY_QF z!ps{}&#V9Qdaap$#>+d}`I*k&CDRY))^8T`Z`G22Cns^$kg>F<~L`j>MG4wzNh?#-JJD!t+VLS#|uAlgq<}pKi<)>WnZngbavHB z$9Jbzgsp62dT*>T`CUQynJfG|YOKDlU^B9^m@>npqE+HqM)_BbM|FxXdTKk*K3imP zHp%Ei*jC|?w!|>zy-v&6SClIGvTW$rb#D5$>Z`2K>+|1NJW_V=5KssWVOTGyl9e5_ zl*M=xf9}*+!;@xg=k_nL`Ly{+VC$REo3B?ap2;@*Kf}7E2boQe*vN2ZGtS`G+MIx3*SfB2xYMvod`N&|I%qwZeo*8{PQtfG1&iWgMZoZ?<=RRLx#;S{g zA7vI#`#DdmKHTQ}5w^3gR!>?AU6)(Uy2*cFO8ObYk|Z_tRLAlUGn=l-&v~Y&y(e z(P2GvqPTu%Z{pV-+FGx)7XCeJ`Kxz(L|RPvXMwZoGcI1g!rWc+`agq$`#GI@!L5GQ z>DE)qsIj;pDndCyF7cppznbU zR@F@#p8s{5TG(4E=Q!;}cK0g-39I$rIWBPNEm&>Ze`guj{Po{W-h_AUXt{d3vSpRB z#(}!M4&HiSlAk?2p)9k-{pWVg?MIgL8no2@Eo2kpKCyiEckT|G8{t=qu73IJlls0v z`&n$9&SRl(??0T9;M=}p(f07!T`L10D!P7IWBO5qd*!i;CX)+4(~72ipY!DBe}>Ao zH>;kO%5`P@XQ=f`*mnN?j!99TY?`f-uf%t4T2apPIMy)Sx3=EUWr62ipQ6J0HHSV( zUt_+1#%HbXztj!u^#3&9pCO;abaQjauKx@ee)hfMaH%O0lIuQtx31suS?p(**|s}-qy9M0knXTt z^4C>4&@i<8QAKyQP^-S?%oUp>J{#TL)ex|NbxPYT15+-M<-N1Es{X zzWn^pGgGwIn9oq1mUk!5PG4m6n+SpDCTXgL;U15lbgmFT>A$09r9NBt--#>{nQ=$n z_H5BJUG(+2z#f`eI@9%hXI$PeXd|%ZfT_+h9USn#MvgyIqf8TZF^i(T)Wfi=Z zy`TD@AuC~KrAC`drgMCUBG;BxtUQXxP8{_Pef9W~rL2SO2Ki+RbvKk&u6WSpa&0NQ z)?bOBo_Ey&e-6|#UBYp!$KT}IX?40S`q^5r)U+;0Fp`>e?eqO1bZdkFV*bn(L55t~E_ndjQ;fi?B9{sNN1TlxD z1%BT(H*8CDHo5CP;bi8b2$rl5KR*g2tvYn^=)vd0$L}0`6m)9guJs1no9YcT_FbA8 zEX64Onc;F>a$?IXj_IP`wWP!)JA=Nu@w)I9c21cexTSE>;+ap4?DS&3GT8*jH2wXX zCG93U$NDQX=YjFZtr(z5qY@IG| z(IcTzSoz0IN3qQ$`JZ>!>iV{YPn%q1S(kP9YS=LR@qWU>lugY?;$g-(}Q*Q`I{ zFKH0KK5zbegJ&6{d4G}xu8Qy;Uw=kOBe!Wwp;$=C-9C>X$BhwR^%Pc~^}U)E+jr4u z{}DFHkSE7`PjUP1xxcbxMe4cweM(=vQ+HTYhb7<9kvFTT-!WnLhMBXTesH#av^}Qw z&@aKWRzFi)jW%bp9Ei54{m8g5-r?wX?dywW=g+@mB$h8>SHGRtVe_wl?_`;F2EC6F z*yi~_cM1bvwU_!o2^;AK4!x`f{?5!TAtHBnEqt?m%~#P=k=eP|^x_&9X1|MIj@xh4 zq_r%r?rBm}^Zl~JMh3M zv$*=`DFVFH9#~k;e3|&4f&crR0@i%{fScy8i>5VHF8>|S)bsN1W}fai-s6m>b0+Kv zbC&ta^C~v-nPQ=vlvDdF%Z%fJ4y>j$Q?17pN-P@c0{+b>*%WmF-X4m*TtEa0eYMEVsrM2OxWRwy2%e1S{62orW zDe9kf*LAk|@t>j3-e6(Wt)Dv5o0i{o^oec$AhaR;lNY1LnK@Gpb*6}geiqHmXr0(P zwPfbb6vd6p9-N&fd8}iZW}!?#{>J`-+F56$u2nWzl(SvpR>gBR z`-sTIIygL?XD${ZeQiNw++^0p0h){*CQHTVI`7zVY{5d++uubMZ|T&BuzI~y`O*CI?J+7RY`&UkLj(av=IAr!#`G@v1Gey^%|L9zr z>Q+`B+}Fau{ool>s8i>%Q!{uRQ!VA+AKAcKcy$7UXLb7TN0HZ8CN>vFFIG!qoqeUs z@|pITs8Xpb&;BzQ6!eB_=DzG$HGj&Q4Bx6M!6-?eR$T2jtxtWymhd;d(2u&d8j z_C;=3d^|X0f#m&tm7Ql~oaYrDex}95v$g)3>Wz8f^0ucwnOw~HXJ70PwBh>77>?YC zZF&-S*X|cA;=6v&{O_5=Hm#eEgqN07{F?I6;`HA?$2M*_mbXFZfqd--j$@zxGZ=(3 z-i)cQ?>M^c-R+rT!q(Tn3tWh-Eq}+ApB@^w*mJv){h9+))HK82rp{t*=6@Ew!fM-p zhBe!keAkN%J#_u^j~+(dDUo`at5#BT$=8m7~tEF+h-l(hLoVh7aRN3C=#hqNcYn_+2)pzK%y?V+Z z$sF+R1eeZn0WKfckdVWI`r^Cq=w7}3S8eUzMI1NxOE*b2osYjYWAdJ)@5VY}I;vHt zS4KV8-kFuw7T2s9%phTW<%HH2)$FHy3gIh+>sK(Glzp{|a>q_eSI);08P>xQ%G>w_MI&VFpCIxn(U zyid)c?YGK-$nyaq_nsz%3+g7znaFQ0Xv{oX&i&xTX_*_MU%8bl`+9>qD*oLO5BFLT z_A%$cWJ$;R)iOS+kKRdqiKsiorDyS#MSO8be%%7S1ask{RlzH?&YeFKvFR%NBW|tt zdbRZeTH7|HvRU_D^)~vmSZk`@p!f)a=F6$Lr4|2M9AB zx8d3S^uU&n`{o~Un_1^IT{KtcZT1~@0YST^Hzd=TSeTw(sl2XO91-)iSZsH9=Y%iC z#meEObqlmEpRwF*aQI@uk|*JF(~_9`pJh+($d;bIDD>Y_SG5=~{my2wyT%#UCfDC? zEj9i7jH~<=t1SC*!|xVqsm&(rKa@@E1-GvCIpvdFAQt~fR(Hm^1$PT#HU_&TaOKIm zZu|W#KzT~9$-^$Qp39wuk=$N+yh7KyJB}Tg-KLdkbox-(=lPGM#7=Hg{c?a~OYXBk zebZml`aXp{FfPe{+t(f5Z@g(UL;vANahLZ#ZIxmzGFr0d@r;=aulJ?>+UrzVlOEh~ z=j09n#s^<@cm2I1k+p6)lpPldMdSIh3 z{oUy8)*jcK;N!-cbvCD;F0K1}?(&p1QJ<@)U(~q!L}ubm9&gL{@&bpJOlI0YGi9DZ zn)iWVV?C1-SJ&@2p#9^KT;HsNKHEM?JUavnXpA+_e>>Ldvxz8fs8Z|ytYUHQ+jWVPep_@GxzbEHmd{HnjCz$8CW^MrCw zUGm8&{@1T09-R8O>m&OGv#Zy?Ux`q^C$O?(`cwHe2et(jtC;)%OHeDyJM$<_P&Rj&Jm)`N(?-`2i9lAhs5vTV{8&p)wS+; zqj-hYa%!BgsJ`19yQh9d40lT(F$;aIRGd&fjf?B~jFlEsLTApC^Pa`)#UKM}3K*Q; zeI;`0o+QOBUWEb+wEvzGZhFT)XMyIe5DnW)JVy$1e@_vxsX1^fV3zid>p2@lA{4*P z|CXBlsC>;?Q)B%Z=kyjz$F%I#|L3-|-2co%DaHqe0$OWb)~-Fkmpb#h;qAkm&J~6% zg{l3|J6e-2oLRY-e_Md&q*F&HU0P-9D3r8%!heQ{p01>|=Fh@pi@8_cKC@~oQ>D7# z$E!Vz*ExPo=VyEtR?UAU{K_7+!zG>f6dBJhU(v<2TR#4F>(qxkuFcx_Dlh9oe0Trm zq6KeMZ|&;5vod0P;Jy0ewGMyUgk3|0?d%ID$Lde~w`^J2-^0_k^;F58@p;p>-0hKO zzOd1pa>1u9b{P$o+a}NX%+w~i+5fxIv#DtXJqglQBQNEh5$u6&Sp7T44V#|kQ@>t4CBV~+f92A;IEwCo>EhOW&=x!VJrP_OST$W(BM5 zoU%4v;QQK*jrq@F!d@S_qcwf?$vaYUKW0pNwYFi()W823CQS?b`ig~_GjQIwT&+M}d#h=a$I`=Mj za@V_@*z9)!i}xt4F*|dF`O>BjHU>^N-T&=%iR$#-^;%-e9-~bEyoDzm6Q+LW7fHOA zsx@I|v%%vs?Q?pc`DX92aS`ti?%Mb&Y1V3mH#5HreY~(~#sRN?`wgeeG1ZXTVSU7F zWko+zwb0V$m7d zrpW~>_>VtIW9`Zo=sIyBY~jU&O&lB*9p^S)PF|6u5%a*%Xa(1m^&;HC)qQpeeLik8 zwRX(sU)j?wJOADSrD;5$cXYjAKkKwJBL2uuosA+(i+nsm_l1ocZ{!&Pp2vX);?x|bw)L=_nB})fllNhV>aze>j)NyO zbfyZuObXzAC9vqL!MQ@wW!`nldtR=4wr|?^E5b~#g$_w>(NZ}6qK*HcUf_QQ#^~Z6f8SJ_?YJVp;e;xg zS&gltp;>Vp^*eGHS2(*Vhp6%J7sS>#$$h^n|5HHj@S|l*TR#h(JL7fheSU{18{3T! zbFaUWu;x=dU~M1t_~**P*k{GnSub~`vAlbxk}ALB{YB|L=L@ebS2M3@>u31f|6Olu zm;25C3>$Q_mVEQStS9g9|D(msTq0v<-3-V0j!eHrN}pu1|1&76==C%GXIPPY>1_Y6 zna%CnQWSZnF5huQZ!xEHROcjf(}KvfcUlH-oLLt+wd{RoBpp0Is5@ZpBWtgzEtY!> z9J3zrtKKsI8BQGZp5dTy zy2j67h5uit*JheWL^fm{-TbZAZP~Gnk1hW=C|c>Oy;8SRRl09*M)KA99S)x!|7g)- zduVExq%Ci(v%a%tX3(6YAB^9HDuu~9Y!DY+;c)4D+{5Q5E5oX0&SnnVZy;={v2WRo zzID5fteW&-!Jgy3-Mi)Qe3&hl#`tDR-9z`zX__xvyvl5*>Eb_Z&DdXQOy;y+CNvDb?g4jvs%|=H~r%3{nVB zS+Du#%+m9ByuClA#fAne#h=-@Vb%U4g{-@e9z1w8FX2Vey#=iIPS&_jj1OEXnqTx} z`=tBrcka&M@>&+OvZFxFSa$c+ShL8ZLu_0xv7+YR5fCr^&zTc+4y?$x^C+`{`? zl8i$IBaHR4A2RDYlw5II5Ot~FXoA?RBg{uX=Oi;t3*!vBQnzSnY24$j<j7HLQ4M16Oe5x* z&pCZhM0$42QMUVM5@XkMKhs&a_PSxZLB*XTa>9C?+=rY!c4SH)i+Bnn zrQh$oqR76a^eeuur#U`77I3`QxB2+jwzlh^k5~vj<=G(d<@ADH`*#thogGmTa;kmv z3q>^S9$n*My|QXW((R+4pBbGij1<2qrck-rrlm` z{3tN}SpG*L)|2z2rr$jIbCYR$ePv_RpNS!>8eSzIaPRc;(@QXkw_B!r@>l%R_Plq` zHoco4=32W|PQmuLV0ra)fz{U*U)ubKCnZ*>a`WF)i5d4Q8kU&(w3T*ToVDY|QU@pH zm$E&q*V*MB*=B8+wLj=YK~upmPhZumX^(9lNvu)|Wi#CoqVexDcft|9P{AvDvp(`% zV_YV2e*QDDm4a7J=-s{}zE6!w^9)z$`j6ZvJGVZX^J}`kXTXyKP5I_=VzFj-&n(+D z?V&ke-&|*b#7T^7v-OkzGe}H0wByF5C+p{X&fIa!F7w}CgAlFmBlpjyG~8qLWfzY< z%E<7%;=Vwl2>WF7*vctv)6V5R{K7f+K+6;+-!$n7mp-4_cOZ)Sj6*Z)&(VCh6d=|Yae46QZ)D^sBp0rP@u(^}|W7^Ua zk=eF$>UZc}Y`FXSc?Tz(wotd9%q!-Aih1${j7`gUW+Y0yJKDPUcutyD#OED7%JUW~ zxN1zR+aJ{F!S>g2ZS>3p-G2!u%w1!n`q|stm*%s>>Y3HC1uR)>OFnAf?G&H0f6Fq-VCxi#5|Pq> z&zOEsIUJV6u;g}e?e)%rh||33b4&lKhE_h}uMddjN+~b>)xzp^Ok02dPlIFqbq|#8 zg=)E_B{@6N8db?U_2c4xw=DZ+rfj}l`(%$ z1z1lL+xS5Jx%Lv>n17F0uEoBcu`M|2UY?L^R)4YWUX9_t0pPMRl50kiM(xmIs4VeSKOZ);}m@#7_x*O__mqB^ihhTNoD)m zBi&4o)v`om7|gplSmoFMl#IGI|9)p@L9)>HP-o#wb~ASv>z=$6>K!zFXV>X~9LIB$ z(pB=)KkKFCHV2E!?JV?@i7ym+(w1^C?V*^e+0TyR$&+?+@ZP!E7I8PXqLHPiFf+NS z@0n`U+GmOz)l(i^UqacYj;`lq8D&AS)=L4>C8a}gi-n}oW$@QVc#4M@K#;=mg zew+-ImJ>YKZ?`b?^5l0h>{^H0VzPFuH;yv<9JJ{x>wkvo4o&CFqRQnvLa#o7_T4`s)U4uXbIQOc^NwZ{Pha`jLQaJS=G|=tt(%WuIl6ym)T-mp zDolG0xn|9A(>mzRa!dC|umTXffH_xU?4hmR=a>n6oc zx%}tMzQ|b@w#Rp7aj$GFF4Pg4*uwjfSEc4~#)UI&o6kI0rl=9Ry7)}S+SM`VAFl0u zyXMG(_gY(a{!3CdnBDyJvp`F|&jHoGbd~Rha*I9gta$a*y)V@_;+XuA)6J1<{v|TT z-v9n8QEckQ&svN}UGhF&IeYiIA=C7N3(mauLZ(AE9>|g?YtF1GdtgH7_ymIyQ(1^_G&pu6e+2OOj zPK}2z`#(ck(%FvFdQI<^UOb?6w*O98>*;{-4GkZ-KV|W!{rvn-FO@+g@=VgMo&Nq; zD}H`vS;11iBQ#C6YYyw27@Oq0_iO>LML9Pv>u-v>xGu5pLD=JEl8#}P3teT7zfE;| zS#wFXCHfgoQ|D+#5B3Y+ubXTyRq`RsfOo< z84n*?B)q-65XfxA`Mz>GP0z4CvCi9X>ozFhsSxMr#24!OmtVu{-xY`CZ!b|X&J{r8;{Gq>&k zQp^>SIU^!VY*W?jI~#O1c24-Jb+kBh|MXX?Y1t2+&wH5ijP?H3t(+TqH~nXjnO82h zT1BBRYu}|ght_!67?w=`$opzjWbzRXjx)B0S1ps!`TUCMy!<5k1Cy^@(%Dn+ zFCnU?dHJtd`g+nGENMdOk{!JNWVw5B0^84K5uIW!@%2Zt6uA2fW_hpm z-nBT@D=2!`9nFf2V~UHOcx5Sxt~&c>=DS;0oK(-dzYFc>efFQhaJQqc(OLI4!_;{e zI|}Rz7-jN*PCr;1`&HQC>XDUO?tilEcbs+g{xXRJmU^lkuXmJte*N7k{7NF$uI8ZI zdZR|}^BrDpTHANJi5$>q7g~LMy3QWH8GmcrXbn8oP7mCRwG5lvZx$J(NLSEEziAGod0H@%|$t$|m#LJIJZ7*ocIA7q))gV%} zqI2RiGk&9^M;H&*9Nw`;$t(GlK-e*ZfaeDDE=Qc%9Qxf*_kg!Zol>K7S$^EFzPC-6 zkFQwm?P#KXYo`A*^V9p(J5FwMd_8NQa#5YugKJzfuO-VZl95n#@wu{VnNrlD`Eg0i zWoKUVUNKOSK9nSuKC6#yY4V)2>ry%0;vOw9s#)L~!o8y)*@q=|gTDU38R-lR+kXi@ z3Sp2mz5UfV^~&qENG{23H#}cB?fyAU;M1oz=#m18@%yjYqXLs+Wk5MAO+E`WZ#hV(e4b4B| zrMPnj*GcAsS%T}8{&xOxTDov1&->_SIp1d%?D}q2Q&8p*_O;kq@?Yx0Kj+Vc%(>(G zVw#Cu^_AUcmTuq)_!NIR&~b-;`lG=A3;~ZXeZM|qTA}eSpQKP5>B1FBo%7Uhc(K~Q zITZPGo`%PT{f`28jh3eBzWi#~JSSdIqpL{zO4gQ-8QU+f?{JoU$N#;f;?XndkH)Gi zZu*quG3JH85`Az;|1-0-)WJaaT?^Mly#L5G)2lb{VXCb6ZuboC^}(#`g?If+IvnE| zdGV%1xJjd%*LRIjy~KwMj4R&r-WQZ@UGvfG&VBpNV8yz9`#&)yr!3!Dx_H{W1rj=q zq3bMmO=&Ta;Vb;Nc+E%u%|`^7Ccg^Mn=g1~`fY<70*g0pZG9$u;g{0So|apip2scb zoM95etub}6YWS6t;WP85>3=PJq;zs$ec?@k&qoR(7RGP4)mMi;{>#Ig_)rzV9V*6ehFE!@3oMTWwI16@1ZSO43zaNXlZsaLNBCM~_EnsVq?XTMDP?<)_~zdust znW)>yl*j!vf!jfPuHv@q+k;MfvOE87+nA8`=AUuVgEL*Xc^-efQ+a6OoL%dbPKdYO ztf-o0vnl$kMdy#(l^KsT`d5azo=GtC_^unU_kM?${u~=0 z&qxVY+1rk*;~q+}ckP)pdE+_lpN$)ABJ~eziTwMj>Da1N@!HsEp+dnu8!z3H_4gK} zTEL?E>T^`@QZM%70+()<{@dfzwQs7=5r!^tyF3XIzp@{FN?l+7 zK2mDY<}8z$V8MOz%7)fCAI(}LwGFQs#+=@g%XawrkG{8Srswd+Xr@lfG}N(rwRGYA zl~Y!Twu>@w?ey+GlE|B7RW*}CzC&}ywdz+a3s#qFxtgqvt8sKKcK)hiXK=)UeO8b5 zTmhR)OSiJ>NPBImZ17jVW7%-GE~#Mw$CtpBfoZ+J)54pVEcueT?mxqmWTBn*0#^^n zd;VuQUVUeSw^T{tVWFe?pDMc<_Rg0#6w&@{b!IbX+)@$o9bKZ!=G=wtq!x#?(UAsINOacn_Y8TO=LaJhiOUOmc3?fk$7D91^WsFh4@GnEdSZV-E;lPlz}nt zrv>V+pU~R%%22u7wCbJSDbW`jnq3O3Hg10K?aHF59?D`{J=>WDUd&^tyD^PPs6VcH zYU8n8T@M!v9n8MMH0^;*%zFcG#VfLW^DXaaJ=Ni|`Dv`JaO1*M3CG5XRsPQc8jWLo z*k}BZTkvH1s&7ue9T&GPb<5IT@6+fyYQFrA>78ue>b+iT<=h`-Oia$q;jVu6&f4jHvDNM)F1&jV-jXvE z@v;xK_%;33o(rWV_k>^Z3A<=K`ut3!K=as+-!m8T9zJ{~P-~6O^@;t8N1kymy;kcy zWn)EbbbOO-N65P7ALkzXPBl@qIaIK7xxul z+`pshGVj|x-qYC<=9n_`3M*P(pOJIsvgq#b+6dQkN595Ro1qCr`v_Q?MH2{-!X6A6d_Xad+L_Qzx$MY zRI>vQIRA4^TesJH_pa?~Gj{S`JJmQ_Z@z%n>VKcPILr3!{Lc_LL&M~7*t+$Vy;3Y8 z9k&I9Lv{ZimJREZ{Yu(K()|lr;j~GOcRqc&Epd@BGMf_u* z{U^S%Ems>;KS$Ucn^5{i{bm0Sy>w-_{pxG0r-eD_i%k#Rrz+H{`t}`TKxU6<_rISr zPK2%8ad7L5oswtX3mxW5j_P`2c)$M4V|K3HjbhgVX3ki;kL!+M=EmTy{~kVcEH4)l zP|IC&O-VaA=u?_`^@Jj4D2h;AF?XdxoSP@y65Cg8^-3#9h~eGi)X7tipV`GBZM9dJAewS6)@@;C~s+;q~ zn)-`FS|97Fdal>^`p&cpxaI&vGHJve zVrXmj3ho_yjulGtf7J~+y>HRce{+1~)@`04DkX9C)Y!-cY=9yybg}X5v z+xcppcBTf`AF1i z3Yx)tUP&(QYP)Ma%hz65=5XL)wZ*wUBCi5p-Kd+)cC~lf>93K>K_9pG|MPP>!WE+E z@J`~e$R7C$_d5r=R2H9oCLC@aT9-uFK`A`&7$mhTXe)A?u^`JbWV;_dxM zZp1y@rnlbqerKD5-se;&rfsvdxno>sa>V7Ybz<*%W)*y9gJ0qwMYD=myc#F$EaiEM zTx2ds?KgbS#HaI_=TP&q&6|(i;9m5RdwI|rp_|7GW`@kYdw<3c)z095#yT7B@=0q2 z+BO`nT_zMM6LTZ~oGNqhc%lvgWhI zn%U1pR~?R9C6f5ZqW5-WYd~hsE0g9ktGmPY9yT%E!KK#EZnWsIi&ShRUq`B%N%b~{d4ZzqO~9Q2Y+qbp?2vRQ*krv zG1Kj8Gd>%3IY&~<5x zE#9ebKDIb1YwOC1&HUdMrq(12T-^HfKf`=sf?_GI4=U8KA<2L)tSsIxR>r_*}OG*#-WEpsLE@k1~wQtF&OV$VdU~g z_dDCBNUKBQ0^dcPW{6H>WnZDQ-Qr_G*^vO&lopp}?FXNacb1$@EiQVnI%rli>m1+N zSFS8C6#pu_CAY0N|LWoR%bjJ*K1Q}Jc{IP{eXyYGoGnh%X7*)hKeN1>Y8J)#RnmFC zU6zzm^Ns%uCkmn`^DC^H-?8XY?GXhfiH4gOgw7Xr@!SqL6Lf*qM`N=e$A$S$hjl+4 zme8A9oB8*YRN9++$F$en`u8-7VZj4C>&ow96Xnf~XXm9Iye@bk^nqMs z@n`?K|J7`apWjy5{kF3qYFS!b7R#}<$ItBGuE-A6OiKN8guCncnRPZ>*BdH|v(ND| z_KERt|MpPnL;snbO&@tyR9tbsI^C`BnaXjW!k2e0KKpxk`*&u}qiG3SxjLq=4D3C0 zVB^~(OQ!N{_T!&9`^o*V)p1*cEd|YjwGCr@T>a8g#c$aLt>vG=Hn~z^i-?-7^Okev z|CV;Qtu{P+*FU-7u7Y*GsbrnH@%^1{+VjsGoVELicj114H9q%0YIz0vPiW20te@d< z_&-DcA2rVX_JZL*ocA7bGhp4PW_PM)MpKk{{5uBIc}a@SfvzQ|8K0bu)Gb$hC)4%s zKSLg0Ma!a@wjs;{hpry54-m1MtNHlMiQcH7*GIg#r@Qmd5NA9TE@;1J$BQ(@1Cphp z2@5_}9)G0Ek|r_byQW|6Ge#-fGp)({@;IlnKTF(yWIa&%rbhD}(rgLsETeVtSFzi6snPc~YOC2gS!9J7?!UtH zXwPXKahpROKW9YNE#marEx7DKj$%-+^7HFPOI}V^jOu!&x;nrpq^3WIVZmZPQ^RRqg=s`-sYBytDotp>lCCdocVf2RYqpz6sMzZU3vc*++DVwl0188)xzs6*{RXO z600N_xX-T_C{E6{tt!=yUv*{6_a8@8JQ&}!uH)Kr*NtTfZ+PE+p=+-+zBo+bmp{X5 z!8tj4=8^dCLQhux{&V_EM!Q1`qrj2i!x5|PubeEp&hY)3GSjsD$mK$ZbzPID|Ln?` zK6QG+_1_H+XIZO0cuicr#>X^Gb&A|GnP9E=1`N_`POrG4us3#N=AW}Kq<$GQH*8&( zZCi89xKDd={4AJ`bGqPW_l?y{iOJ6jqNV$Tq8H%i!58QV%g8j`vWhXoVNZ<^xCJ)RZqK? zt;)Cg(d>Fz)4=Z&@BJg2EyUCuXQy31BFvidtJ5=m{rh66`Rm!&2X+|LIxk#%;4<%K zy^IdA4|&G%+p<*m^AtKPp6$Qyk;9MMqI`vm&#)#fSd=|kJD~Y-VUuBG>z3Q^Og|j+ z?<~I@DEGTh=vr+0@lU6hJhne`Fo@|?V|TdOC7%=L%C;@$?7Dt3{-n?q<+jxyWw!EY zS58@^&3p6xXU2_FZ-3eAG&AbWcLAn$d4nu=zX@#;721#QtXJ$W<~2GZmD;f7xxL_H zW6tB7Kk}%}k~P@6v`l7A{r(+yrJ{8opV@ih+5(MKXTj?;xSw6I<8BG#`Ey2h!ImFW zFKE~naxx{>wEt&Fb=&qVZFQrE*v3h@QffSxXEASS zYVn$dHj8-K>-GyqIg8KRe6c|J%A#+}Ymc%hY>C!6DeiOmX8r93&X*r`*2f-*7cAVd zZPvo?iIOhKavRy4ZtUkhKIxaeut!#JPIQ`@@uGgkBCQdmuBl{#bGw-_BjVo-W(p~${-|-01 zG@tjZL_?bIarosmF5I#23%MSYlnOfMzc)B^%J7v^ckTNElkF92jxeq=f272gJKgAk z!O_Ly(Nnx^4}A#eGL>VkXc3wsn*H}t_(joa8tbbKLJky)a+a^}>$yGjX<*HqVwvafup7ZCdW@6WDPd4c&WUEE#H`P`KWPdcV;SO;Wf2Rhr`M*2pugi?a4S^{j(u*0oVJ(njx)H=j}Ec zEsBvmH2Fz?$}0Iw{6AI(rwe9mnAy!P>#{T}wr|(77>mwI8UFQOrI+1dO?_a;f5))X z`a$^>{iicNSnoZy;LoH5n&~qf-M+Z+8%?pfEmb^c>zOldJNI{-d@1suVMV#Gjbv_G zS?(i-fP04T4a7xS%hw+<_L2C}u$0xeqtCX=I+kUV!rK1Rx7VE6tlMV#N-*zD+n=&} z_D2E{t+)NcM6Yr!?v7i$G~mFWE56)wk|ZDNWUgws!T!r-?t^W~<x9Yoe8dM!4Z6M9DQVC)m?Zui4({PludcOPFdZJWTZ zyT`|oY3sE|V*fU+$X0a{3Cq8;_{zcOpJneJwyTc3&7!fsFX0DkviywTjh?R*!%MW+ z9Gy7*;f~CTGe_EWv!bI@*Tx53F>X9!@N>h>yk*%p!&VsnmXPFNd3bKAh9(zZ|9j(! zV*mbnFS+q&)0<3*bg8|2vIg+qHd*SvH0)DST|;V>#`* zywJb*9Z$m68(go{|Id*6RASDo3x7^e*V*7-Lcrk=>QuK1|$#aw#%`0t*n86vl1T$^58Q*CNq@pXymtFKZU z)8l8XT(#(KjFaqV!*5c*r?7vR5gxd&V3jJ*#-9z_zCIQ($&`DTxO;=wvQ=|JBsS~M zc)Rqw?1HankKU~8dmVRzEnk%HSYCdG3)%o79;7X$h+g`1o{Yoi{xx#(zn=c2hhL`8Mx1YGmF8_-0 z=qz)=ra2X@v$g-8=I+w(2)p}Ao$E&fv+w=gT^r&!e(idctu$Y{cWanl|4*Lq=GoJ4 z`+J?)Iy-c4H9qI=%r^B3YEMX*`t^N?{6{^G z?v`EZ{~45*s5!67N>jRgX#(?~RYmvxtgI~x*ZTw5Z#3UoX<4t#Y1rVMV!18u+fg~W1xx(Oe^0w%aptu2@1E8@ z(^pMnn*UXFeUDFA_1B$F;ce+AudjS7XAceA-038?_x_hTsf-W)Gn{Y}MmHYZc%coqpQUJM{zd_RxjIrWna+M{RXg7sg(j|E(eQ4SO);~#<4ng7t|_mL1@@$=P0n`z-I!3$>kyFj zU842w+jfbrZf$#=Yob$o+ZG>?*>O6GUx#nSNKUZR=%ABBA9 z7vGU%|4Ju(QO7ji*s65ZtNl^!OpY(>Z%U}mvOA{sxJ!OzkaK|dr}-Vx;;C9+1ssk) z?hG(5zxTA~UhGZD;#THYIfv&hJ@p~tM40Zc`X|wBtaXcya_}EH7^XYRDX#Wl(_M$J zy}NEaX}u-BUG@&kulU*b=Gh#4qEL3E#4v(k)2>I{tXB?McHZO>n^dt+bxP`=<4Rk4 z%A=KmV?^C|mGipGD`5Fz*W; ziKjNP-Cn;VgEjk6!KQ#66^FUk{JI*F_3MsrU)DQa-8K7-8nXmzxn)mz*@SXye&u0d z{{1dg?DLFH-`~9py4N0=y8be=Q)A#^9kErCoB?7Rg+DVryc58fr~Bihl_B-|rAw_vO&uz4o8jH7@KmII48=Pl?;o?M=)~t#@u4 zG2Zyka7EEzh4iZ8Yl%mFeu|fsNFeZ>;Y1VHHTB@F@5D&czV(uEhe94v9HGs zb&Tv39c$A9vbe1luJ1@#Zg%(iUKVLyp6hn1ff5H+PI$@GSv~c|s+TyX zE*I}{bS^FXnRfZSI zwSRXD<07`o7Db2T`S!(nuOsKr=@2?O>z$HW$|3JgKs;Hg1TiYE7JMd2Zp> z)Bb0){KOAmSs%i_rr=n|&HXc+`F5p-UE27cp&;#<>yEr#hix`+t$O3gbYa20J7?Mh z(r0>QZMJIf_%U?~yV1up7Hdy=eSg6p_n+aDygE~e*GJCS$(+&lGYl>)UVMJ0kGg=9 zP}l6e8jqL7MTNW$;L-57TFLW!`e{?4Y4>Fh>YV>t%#_=j8$HGTQ-Eek&5=p_{EZ%q z?!V%|l)196a`O>yr#j_h$!GEzZ5>uWiiwz@^}LvicSb2EbFXWzV}-E=Ym&^2JIl7- zNtpCe!-_R4;@hP8ok>Nco(AtxrES(x3^h5UUhb9 zW%R7VM?#SovOBc64#&qWOV~C^bKTB=$`0A`J4%dqymkF98d0jJYg{mEGru8+&}P{p zOU=G@Z>EdwJ>c~1*6;6}{~0@GRTSEdSva6nk>UuZhOJlS)2DBl-yQ&B(=Zp zf$r=_V$Nxmb42pCt_YUDB%60LXu+?`+y)he3{sCoTh?<(FPghGqQNw~bVWR4yXC6H znr8b;;mvmYJG8CckF5(lSX&#y)Lg!Evt-ui9W%pzTK;jZ>1s@q-s~?p(NB58l0DCs zJGc6tnHj}#=IqRwjZ!!JpC#ujr#fWVeB|n45DXMLSpg_}+Qa<%Y{+VS+#in<&dNWns8vp&C%4TY~^~_N{re;4**UK)h z0j5TJ?a>{9y1~l-8Ek!yG|Q%K{P)myQQ)Ire~vo{Xm3(n93O9VHY3Zx`wnlIR?N?v zWx4j98;==ZNxEYCQ8(!L!+^deX&S!og!-o&8dt5jVHh<%`R==@k10pg6q3Sies}tA zD6HD^pJ4@?y+z-q4RViTG=*;;$+UTJ=cKwgzw9%mRq+?whY%ET^{IiF=1Dk7FmUC^3q;KOyz z_>4nQ?cr;tdXj~6CoE_;&D3Qq+-|hg&9weEZ%B4xUgp}cT7z!3TaQF_)@{}i5)kxb zbmP8Y68{(#y5 zVh(zzmR~uU-(<1y(RJz8BDzO;&sd~ST7_ol(_N;ixe})M;sW%Qh zew4IVVfj3NVRdGqylf7hcJ02b`|NzC(=@HN{|v@P z-HVI5bYu-BwXe^(eaecf@=7jueW3aDk2`};yb8P}S#t z_~*FC=P+?hF%eW~1jPW!a@^ZZ$h;~tA}6vy6u`m^p~V3(L> z^${umBi3ex6BUimTlFU7{fqll`1^WzI_v@auQw(da_-$9r8rWcZu>Z~-$;i|5RK3ieG2K@Y zf8W>?pjbGAmH8E$hTVflV)te--eEW?#l7C;T!U|BWsA7)sy@JJaqezc8HNadg4rd&@-^KU!_yIq!b{_up66@l@*1 zFk$rKTG8-huI%YZ2YIvWuNW#PUo4gs%(UHG>({hn%AP`F-K3{%i(*PWB{QeZf0Wj> zzT?H&2^(0SOi!I&-my`kV&B4r$??BgB(8Uqw=D3<67@P{TCH!u*0!s0E6Ycn3D%D? z5|;-uf7(CO@i+T3E5EnDTO4owI{KeMaN^d~%CN_oTy-;pc{Od$JUsO0)U?;lcb3fH zj$@Y(IHJI}KxEo4VOn60aPbyw^wzHDEEM<4$)C>-TtS9@@!@B4~i z%RL8Ihko;6|0a)pBX+1@&C6`=IW{4 zv$U1BG3M?o6xgw5!fv)x>uX*1@n+N|iq*f#3VC|QO~*=c=IX`LtrfC`+^6INmrLCj z_@HKJlKi8=Y}Q}rWq0-jUQzv*W_IuWe+IR5i)nj$8^3Ba1)rVjlXdaruZ~15gN(wz ze_g}&ypjofu>Sb7B+>AwUan=EW4wbSzB7hM&S3qhVOgm4Wnb#+R_1pLmwh#J7u)~J zv@`6;#*}t`APVR&)J|@6FI7Z$lo=;NDfZ!YuT=>6&}rwT`FXDF{g9of>m} zzHzVV@Al~>c?v!k-tZEH>JoYQIhqMzwl&Jv-{}#zpe)>kH%j0yJOWc zGs@7|WzWZFN$c($PTCyzaO$3Y^)pusR<*Oe`1<#bR`)Tx$7MlRzY4ChQc0M2 zFX)4nYDU~+{>9l%2Cr7|l+T<|EU8cz|LgRu9ime`%ek)Dz7(_8zOx}P?SZ^#|B8Y~ z9R<4DD$=aWZ*iH1zCOt&uOPu^&cmzmgfFLh=Gw?}c^nFoSMOE6QeZoHeBDA(o)sS) z3}>C>Qpn$NgDWUsm+z^f*|cxZgHA2iF%^vD;-1}@+97?KQ=vCHsJVk>OFUcpmB7~6 ziVoB82T$8IC!C01|NW7)*@BE$!X2L$PyV+!NcUC1lU)`^d>6W0b&O>CQ}ljS|Ghsm zW3M$aH?VGhutT#XWZBmA$}?%Lx;uu+yb7-c*9-*}i8QtA8V|`dnCOEREcUD*&**pE}RQW|RKl^U;{=6f7 zRI~n@$sc*2Q&V}Gxe6+-tZeRXxNBe}rI72eKA-(;HTLv}$&q(Gz6)suTS# z;S9^8$YrM$pDy2&zN!Dne}=r`S_iv}3*=sjcf}mi4(JVuZVD}DpD6U(Y#B$iMc5z5 zL(`W%4qeS1Ic?hCiU$528S6#s1uvh=ZQ7ezktJQ37j?hJXMJ3)?GdpigC7g}XI;MG zyG|@QPH7I`(;WSO=T1(FTaaq%r^u1O-)|tclkJzXn$tGh16x*{Z~y*EV^PE-)5^_f zIPbV9MFj5MbkOE@;za))pQK~2o@Qr_y?Wi?7fZ6v$!F7#FmK|W_C77iQgpq|nT9{l zY^SMZMQD_ZKA!hgYt0><<||wcxkpqOPgYq^^;`R~fXn`?(UNjzulSkS=T#jFB(f6N zKJPF3DI0!8T{rGKXXv%cBS#x}9o~lSzH-7@s=4{2=^w$j*_rO~D_k$t#HsnLPPbnC zpCL8Kv?jU3;jwhBR~*}1_nI^rxikNiCAP57pK+uxv|wI)u>sqrQ|nKEXN|rsW$Ke* zR^#Yp(ZQu_6K|ZS)q5bl{MEDVR~GAOn~KP&o+&v|!}0N*WJ82)j8;pfzL-YY_DRE?$m4;f6>I__70M{`5k zhwM8KF3afl%cX5%>J7W`@4nd$xOWr&rdg!j8-Zt2-lk>YwkpCb{y~ zyPYiPd{A! z*|43B|IWdi*LO55f5sr3`dIX<&}sVsZh>=o3(Q2OpW&)!Ql6m^9R6?O<=(T7cM?*( z4{V(=rR%=v-+zx10%xnS&%b;mqVLqf>ZK?0quKx_4IUDY-S>khjMJ%(xw5jptzZAno9E|hrl$8ub4VtA| zkNS9|PV;#_v+72EfX1Kg#VqT4eojx|GuWTP-Sue>bJ6!lPfM()9yKU^e?;*#i}{Iz z7C-+p@B}agd^&sV;D%z}hElG{T#CK@cWf|RIbH4Pq4ol~@5=6tz2&ScudHC1AJ{wf@!t~(=b{g>uiCA< ze(LEJ|9ZR^hP*yT67CB3MfAT1@~eK3{w)9DN%iw}bSbPjf z+w(wmWr53zCprCo8sFE;yf$o^(Y@^%>-EC6nK`M>aY+x>hMla}dUt65H^x*}ZXXAQ z?LY5GGp$-1`%LKA`NEw&-wRoHh0QHo7qd&%DV!B* z+560T*Zvlvqkk{XY^}K~#-bmLGFtbFMHp*BLT0)Zd>OrTgjC zqa}Ka82o>~V`Vixr@o?1F(7Zvy0lWQ{|o}#74LsPQn6aLR72zFBbL%N6Pau7f0@m& z*Xj&^T9RgV*&l~JVKGO<+9a6P99awf=pN+$l5Xy9iJjf?vf7|iZl&YJQsX|Me3X_O*s61i zlU`2S&6oIkSL&j<<{|;N?}Xgj{w}D!=-`CEPOXZ5C);K^ZcG(hTV+$#utZ+OZSLcM zZKa(K`4T%~@9%8jVh%77XWh7l+pB$JXI}BXMVpVhcO1KUCBHfPE8m^Mm4V#)QxBUp zir-UR@jxy$UC%{#;t|i?q0`gY{-v9I{w%hp_VnJ+nfJf1IJmoDYS5uO+YMw|GSdDt z)C(5QQ_xDimk>Dp%Ch{&0ZeI^Z~j|8;Ys%S4n5yj88*Tq>Q8mk?H-8OC2?KQ(6=x=Vjd-^%yv$(_Ure~(RdUHJVBTkqOGXI7Q$YM&kRCyjYtr_0^z zb6g}%uY_pmJ)ZgWJWr;R#FWe17EWK1nH^hmgeBDI*}DqXYMZ*ns?)yR+?r%Fe}Zb4 zs4i#a9~b5hHfhf0uz!meT)kb`HHGW$pR*~u>J27WD`_vR{Le5!gHc)M=26C%Hzn_F z{nut6_mFG#S6ZKKrR$(0(PyeFJKVt4DXr&j!?%G4AA z`4=wJzT`bElkU~wdfn9jnejhEfYi+`ra`NCit6nJ+AI z^><1q?rQB1RBrwLRrBt&S3oaxRg8p{1xt*Xm3)3x<; zXQgw_=YNk> z>F@d{C#*FY@-sI`e?C)lJzzuZBa!4@SA`|ZXLhtKi1t5pGD2p@m& zSMK}W^sw62`I*_qjptIo-VY;*p4NgCxvMe%nfgG zQB!rb{xcXCY9?6L9^%+v%eTsIOLQc^&zcqKg$ozw#)e)LIOHA_wP~_^VYKqUj_H%5 zPkj~GpQZg>UwgOt&Mh0)WPktB)*`>Je1}D>aQTc`L3ZmH;ud&k*CjHi-g~Dn_HSd% z*(Xs`1Zz%5EbBWq|C`o>rN2sleiwQruC^_`I$zqHQqwz=Y1z#!Cbcy!S@y$~%0Y4ep$4%LPN=DkmZcDsD(3Fvxqq=z^3 z_v^1Z&GWR*3w^lfsO4vL>|p%K$Iljfi0^tQ?v`2b`s{w6(8$)K(<>4h)SRCieOtfB z{;_pvNWxv!kX08F7Eh6omGqMA-x93OKGk>Mj!b^b4uew%qAjL&_5EkK{7gWP(;=+8 zvfsYp_@{#=A@8>R5#0QsGbHZTV@=zNnf3M^8V|R;wK#aho4-qpy(wnv)|G*;H}>{y zTCJQbsLG-+WvNMG#qG2(OK$OJ3trupxNXebZ`qu>^NPFkk*mE|Gy?xV3S8S4YEivB zaEZRw>hF3twKs8_H`@pFZ~tt#=u*|92h!8yw#cne^=c7+GR10(nCVSs?wQ3U(@Lea zr|>v$y?bq;cGPSGn}c?nb*~=@UzEbM(S~_N^X~Qbm)P{Lh#2kKU+_KVyWqwGnUcEt zHTyZ&WQ8zPv>n{#Q*5kW_j9Jh(;f|mmE9Kq6jIjDONbUJWIDKS*Bk~Pt*O6{6#kod zdXreZxz>!cvntz;z2JMca>3s_c2RX{1wrgyT2gGrpLx@M*q&<^bvcrGyyJtV7KgaV z8Iyeit*ktA?eC}^S$NO*vsBczr@#7^+{{0hY!bcX{gFDmRIcCM7mIiL$p_6iTz~gK ztoV*?0W&^IZGERuJm=_}`ar$)^2uJs?ww}quG&)vrPm+f&ilA? zZ{KslU6)QTiazlAopR2q$L5A1V($Yy1&`|i(Ds>Lg(`FiCnH=SQR;rfaWhaF~8w|$ldzl-FE zl*?PN;C?BCajc=piZJaI!Q2%M+j|RxZWjG<>MJ;SI{NRaBTqI5-;SRzD9if0v%D^8 zckZTjtj4SR9!JmX4`^y+NLKvM5E;N!dpO|2`}xlzb-n95;&MNK)#i0NwQHKH+nM8f z*LOG1$@z2I@Sw2j^q|$&UQgrx`aF=y?2Y0Qx{_Y;pW()1&b5xq&lNLGjlX+ZFKqpe z1|^yNXB^LV2=bcA?cewC2J_WN5i9)mIt5-_q}IK8y`6$nvm^Hsrj5rL96pxs=;1B= zESTJ|q&sPo<&4b99cBxjPVt>}#c`|nBh76JeP_0>zr(;d>ql#t{+oWcJ4R{!^DLu& z_k_iL@^0{#XlQ@?$Eh(v>*Cd4(>xp(och=6wMy@5`h#Y%hkLr}mc7-_UGd|Yf%wPb z-#tZH$A3#S?U!J>QOL4X<56&o#gYFEoJ-2yy{cOvw(K?gU4f}7qF%w@_1ZQm*%^zw z)XhIrnR{#fX=(G-yIkCkzB+kl`k*F8d4<-G{|r_xzE4_}Ro29a-Qt-e`Y3a5Wt*c@EuCdeWnV8j&dKaap{e`FaBCkuwDVfAf zS;4o8?S*Lg>AySEt+i5RW06KuPWau%vkbBU?)?!!pX^ZT<=b+Y(AkZ z_PkYp=P%V+tFC=zJ=Y{Mb9dVMf6iO({1A>XFyxrmb4XZRC-$%VS)J@NCFXhc2E8-e z#m`>Z7_Z^DIO+3_$jY6o?krqzRJw)Pc+vLwxW%U>i`<%w*_Y_f;l8ITS{aofv0X38 zJ}@#@wBzUg$1_A9&Y7|3?$^#uSN|U3cwxtA1Cd=Zu`?M@}qe?@WFy zP*yJ78fne&SXlGTe})aKz9dIgx90BK^J8YtMx(2YXOlEKl1+cP+-2G`UDqq-^_i>O z-3hlVT~?bW%1d!K{b#tM5g@m^AiVykLFm-4g1O5!>S+|5meGG@DRMB4-RkHo8-}+> zeHU5Xx%u^7%9#~jK0jL&y+YrXGB^aSf5pHqvAbF0biIx1)I~uycS?dD_&%NEV8C?b z)6Snw>m&^s_k{ji@H}#tf{F2?gmW7|@`S#~J+q`*>**(hn4(bjh#9xmNgXY`vT&JY zfbn(tcUqPEjAfO6EsAHodfI63yXX>|8t;qYb55B>o>P6AVLd%*b^~kJAD3v|kF_q} zrBh}i5d+4*|j&dwvx1rGE1zgv2y;M}S`hb2^J&hCszJUur{MJr$M4CC^^TdHxg zh9*3F&T)Tz$F=R!V^_l)tDf)ZoV{;V-Ys92i+ysY0nOw>5ycXdypXwkpLuAu`GCLahjih>1(rhB|0m_$1sxob?sMB1Xgi40{e-^*%TKM|<(h`V|xT;vW^yO3;`oKhr@( zOS$0Ir@goST`BcsYtF8zJag&}Mb=6Uv^=_XS^Y*%wTzlDiP-8z)lspB?ohBWlhz z{XNR+6U4Ce^tRskM+~R=+!SMrMJ`IGOYsXv-Ro@ptdW+Yxc77n=kpy6Tsdu0E3 z8GYJ+>OX@3uby18VeS0yIw`t(H~L~WE#AHN-=Cubq4PVvoMl%9+)dr~Y5gySM_c#! zvb^t063aIF{qd`YcAFU6x6k^k?@PYoy65*OCv7ZRBqnXR(m`~8&>=q2&Yj01ytb}BCs#Fv zcY096#Jfv>&t4xR5PGpAW7p@7!1X(xG}f!EHmGj3-Tp2xIIN=UV&1!mJ$09k%?OuL z7S6x3-Nfqot1zykl{W>K%M0~Bp21#T8)iZfQ}|exJ)u_rEfktUVR#Zgcl=i=I&L*5!up(ycxltYSWWCZK_T zSE}g!IqKZX)BpM@+?{j!jUIPLu8f!EvdW{!%vx`sDQ!p=$Y6FeWr?<1u+ZyqsX|=Q zsaF1HkJ>k%^4{pUOL>O*otT{cW(@*dU!TP^$@QLMbl?BJ&{gZtLESx5_s{B++<)gq z+@k5;R}!v@SFZmpt>v`8;~HPkJwBzr`(LG|-Ss*vG>MNf|>`xa$AwBDJ2{QB={vrBokw(IHK+iEa#pZ?6nUNH}|A2S#s#t}O{&CrR_mtrpmuEHZZQtLC z9D2IZT)`1bxeEDg}i^-pKzpmPsN=h2ktoC{>T_Qv-(ip!_=+D zn*QJA!hf{gSy%q|88hpnD3SZ$XGFH|Q`_>mYMNEeqm-rVmdE~Qxalr?SaiZvo9L-` z_H1N7Eyg-)SNPZC0<1l``Z?ie54ZlgqU^fXe&0sDwW+gB&t5-rBJZB-^ed^eV-JWj znEZIX!!g_}V&5yy9idBXW&Se=ZB@$tJ-^e@sq%c#?TM!&cFbTq_Or2Vl})+!+@P>c zam9CXBO{)DmUXQ;CO3Zv6N84TGh=AN_5Tc_a|Ass(j9Zp7c+6+;>cpHZ}z)+Y05j{ zKE~{48Cu6?CjMvm63QA__x|6RzQTD=FUP$-_3vNmvGf_u%Z)DGFIXdf@L_{#UO}3P zX4H%m(cdgOXXY|m?Bc0zZG80UMb{tenL!gZ-fetm{w8&@#gqq4N6UBb?+6$Bb9VjP zt}v&?zSj*dEql7?e$lNr=L-+WCFr{P6>#))8SjYf%wb&j{l&~Vl9A=FS9IL2%==^L zq$nAo^s!>q{*TXJg}d^Fam*I zS{9y3)cf>msYK-|C-boCnOE4d!!^%`@hXO!OfAhhaPaQwIgIJ^CLFd`2ot~57X9?> z0bRY1Mkdrg7eR_PfpUim~JUk3w6+MYB{h&YbxXAJDyLdiiI==LUb%gnG^F z9y8i)y496&8dPjVsjrKDR*1o*88qV|NabXGdsQHgu}M=k-p1>??19o z&RKtEx#C`*)8YPtVxPo4wNn?ge(!p$!@Z`E-RtTxr5SwY9h*99T{Zp8!!^y;Sx6D|90uFc-f_`lFAxB zd;c@d-1wcjeWm{yCRpdcV?4I9@u0mxR%7}rb0%HSlXtZ97BJo2S!i&nqS1TC)S_ip z%}@U`Ob9S+)nE7c^v@)S^JGs^EO_wv=^G;YriAm+`8c7^`CfW{QPim zdw!|N#2+1N?*CR$QcJe(yHC-K(J*l;rW{xkF4hotVfI))s% zdG+efqX$y1o;`H{;ko30h8seEe%(1-K40q0%2oG+t|?>}9F6_Y z5bNTy>)^R%Y`M3cqOaAS)-vx|l`-2BWeRgph;N*$vqat)hTXqn(X{AW&wqyX|608k>^Lh~eZgl=#;IQo42u7>&2#J9=AQb` z@MU4~p|}5L{W;^A^-Tuc+~!c{cS`OzVEb*J&FC*93L+=<-Nu+Z!}? z=AMrDbIdmP{KLl`>pgU?&XQm8Of~xw>#dE(tiM~98(Q{0OEOt~giWwLXV;aH`aJCrV{+5Be^Fq-zq@nG&B2QIz0(|%3g|8$1;&Yga2E9ZYU z5DClp^I3||KEsVgZHoFk$>r0%S#`P^@6VWc&9%}?ExRkOoH1Jd_^U8oRRy8fFQ*v3 zSzfR%g)4tYc-G_@mySLA%+2b(|9$67>C(?yd55q5XE-rW<#SfbR`nhHEmjK;>TB$O zFLYJrNO@d3w|(Ia?iwd)%QMTh&Im4YO^uJg#%b$UdbTcssaeS-W_R(NE7Ah;Uztlc z`z&GjyfQH}Ts-3M-a|9Wiv}JKHhmiKH%m4fUM01FZY&e8de@(+3)?GW1)9*{f?VTE7JuwNFD6B zv7mlU*okWoBIT^w9Cq#dZY5XMRuG$hret5x+eE>1zObi4Hv&(5d6tm$ZSP0s*;hp89a_3p>|Cm( z*8Z7GKHRzX^FKqu!Pu|di=#VF#q3(LJl5^P^54^MWM5m_!S;R!gBgpu&cjba2kzz{ zU9x@N(M_ub4jXYSJ%(A^+?M|8?wpBK;5?^ND89h4NnbhYxCy;szCriHDK3hbvnOtN@BL+W(Y z)zb{qBW5%HGS%mpqRF^+f1x&~2J6a?!WS-j%jNN}3;FFfkB>RIP)EA{Wc%9x4B1Db zE@y_nGB_)|bM1=a^~(2_%APzV-gAui*=v?f+a-b)XgXh0ERNdqxG*^@O8CZjWel*!{6s zS2u1E$0p;fUb{z3tu-+>rN5uiIK(d0A^!bG<09)7Klykcg)%Sy>m#`RlU41Vzd3wL zY`4Q-6q;ZAoo93XyY$TM5~fZcCp_eTq;!Dsk#RzD%z<6{+nawEGzXj)J9sOw-hB3Z zd%>#7bK`gTa9@_y?q1#>|Lm!8S$hE6Cjr^smqq*k-rTZ@$<4#cKQL=<$z!XQ%MT~V zDL>sTxaO3p)`R*Z9$S?10-p-&20xS(U+yE*v+GQH<@bOW?WvEih_J0I7hl1!aNDXi z2mUz8{!{px&FJZF&=&Q5o8H6Uja?pB7q8B;Ti&c=ynUsolHb9%XF|26-ad0<-2<%$ zrO(15_AO&P`?GE1S2qO}`*gu&>}(p-8Fm=l-}it!^kw1!*CvMCH;oMP_ZBd;7alr& zWVKqLz2L>Qda7}cl@I@CNZa_j=-8)g=g$-{N3Kfj&1v9Tb70DphU;vMC1tWM5+z3p zf=mm-`8Ln?;49?*wW?*RcJ?-f4Li^I9O1uhxNzdyGh*ViPVczGy#6;k!*jvH&|e9n z;y)TSj!RAR$taYVSnuw_y(=jv;J732k;`IhdFm8mIA-vK%Q!z<`e<{))S_yrQi?}ZS*yLbP*Zm{n zvsNy8Yu*0a{+p%7D!=Ec0*q-UcMjyop9#q=d>*L1_ljcf!4B`lBdT1x?reMX=08K= z{eFWTK}y^)e@?MY+A2}W{h8BPK6xQqW7k^E>uK6?!HY&#FYS zdlg4COP*Y9_xGTuT+uUIGZw=U_2_x(aM-=mLyPT4FrJGkJ5V7FC^SWRExkMn0D zg7=Fv<-NFP^q=9$q2_MoPm0qQ<(Wk~u2=rIPXAxyjo@bfBbEs#r~RGX$aJly_RxaW zSAVuPTbq8B(O6?VbA?o>ZAHV%spmf&3&@oXG0eUC+~~~xf=$kZ}}=5cvL&bZrQVW%WhA(yQ;{4<+({r7VN$M z8H^r=TuW^|(00Q{Y)i$z&l)xE6MjrtGiT?ORWpw*eG$Daf;Z*%pSs0YMa3WTxhi~) z`g1yKQG<+IVEBqf9Z63NQZ1d9&b(dzH<>?l;wn~0M)!rhQUb}D-_9tQPi!@qksUO_ zY*lg4*Q?)-g#C5y?5Nw(Rn&UB@C?JPgUin)?QplbfB&CXyZ$K^?VcG|0vOgucgI#X zny_Yx)-@4+h8uw5M6y2NYF?8@%mu}p8i;DO+vhh=@L2izHtEttXnYH`z? z;+O*tcI%S(yW5o)clT&-ZE>wkzq8r2-5}Sw=U~8r=_^#Ymc4w$n*J;#$+RiW)Pwa5 zLorL#oljFA80W88*CX+tVX`{+iS#oHZ;sDn(p?y7eDqa9%F;8g$F@EDryvlQv|zW3 zUbz5k^?kzybKV!o=(s+96<;RxYwG8T-+a23Dl1jg*Dbqk|BXqGGjN&LcP*~__a2^V zE@xaT-LCpRt)eaZsA0zS-?JtMHOBWFOyvv}KE6Waqm}d>!?GFQ1x}{-*`6!;C{z7U z;>C7hbv+q}f;7eC*i#ek>^d;>*d!~4lk*?h@XI`G)w#F%S&ReYBb`-?cPJ|qi+Zz) zSN01Xdwg%Bz}YM1KmIdp?7q0_t+1g%uj!wvwuPIIzW&*5oV@(o(#jn14vjTeUl+|+ z^^&OQTpiT<di|{n_iYAdy8*jm&I4< zTh?ctrp!$;VKeMH6ydI5X8WJv&DIc^1c~d+z1LJVKOMd7zJ;yrcwu^%&YKPij=1$R zgV`GmtOm!Hn&9qNl$za{Jve&3OK!{OR_uSo`ZtIb2E&`G4(n_H|mT zB=MgiAl8E8a_Hh;O}pauscNkEJ?Aa7fA^fyv)-I}(RZS_bL&;M-_zYWt6|R{S*Ix? z!Q9&gPBZWDbX+X+{>*}|hbKGA?`g?6u8#ee8d}(UMa7vl_NEBS>1VN}5lt`RJ0|-+ z?s&X2{f~HJ)E~O5XnW`_x8LkPg>J|E;#D8$s zjAz@6xGSv-B}0!rHPn)leXYA`&D%c;ty7;Hs`>0om33=6Y<*{O>hW4{vHO>WbpPFP z>x^D||7&~Kj`Ebao+hGcnxD{;G;9(g^!vnqxs>i6|>6Jq z60g!T7Z|Enm~yPU8M0}fMT5+=w|6vV$Q3gl`|9bqKu=x7ZG&+#+ZWjbdqOg%Mcln; zJ@@oS{gns%SB7rdT&0(G>SG)^V3f;Kw&C01~ zA6rddu(jQx{!RSBjW0SLFIjf_@mD^tnBC^u@ozP>+bWs`L(T+UeN{9|ZI9f8-}0Rf zzAIbA;-dS)CO3#jG~7*8(C~eHXIaCc`E#6>K8v##FgS8rVjAD=>01xZb$i(oS@|kN z;X&iNm;-G2M|R)0WBbo=WyQt0r_6VleDGcqW*qe8)@!>o=~EedEFM{i9-HH~Yj1KX z>y2aPJ8UaH|Cmv!6KDU8q37-NtZ1F0pHtHIvYvLj-PFW0ne*R+7cBEve9)=nIk0wZ6(v15B=kw$6F1D1F=ikzVEg zJC*Xr>PNHqIzkVw;^Vl&U%-9-YsYjBJ?kB<(EmXJ1K6~~raI?&nOr`J-fTtlxvs9eNaf9a8}&%R#Sb@~eTk{0eLp$A-Z7^9{tRUC3O&|6#%aSCShdiP4E4%+Q9G)Y^2D&M3?bN38q0*L-%Qu+LPKuF3O{?3$bvle~c*}ZsKVfU_%SyrOywV#h{U`UZV`cEOfgGuyy zvC5sKhVZ=;dkyDSeAHIEYIpv40Pl2@+R{7RsXJ>7U+jHfx75P&#}uOt_sh*zZGRMF z`21|)6$h_<+~@1eUol&+GLk)@!O6I9+GTO(4Eg=A z{}~ikihnA%6u;>5prEZnK6-i?Px6&LQE^)fWo%x{9Qsunn-^Z{{iXX+!TdRA7pym& zzI>CF_|HEFD-3JSEHt>6IKjv?+~{igoYOkRS3;cqgDvOJId1!CxvZ<+#u8V9(z*2> z1?+Y~$F;(?at2F_+&{8AjoFN=F`xPOcTJDAXN=3^9`%LZyBRM2_~@=ziyj?JKG5h9 zz#z5$wOR7&S21zZd$Je~m>tv8Zjg?#OB1!cu#q)2Q~tD;OmE|g3pYQrEb3}~ATMx+ zb;2p}?mHP%L}g53mfjG|7tpT$>)trak$cD59}U$fI=$GJ-UtE zbLMkjjDP)IkgKmC=-DC;2JKRf?eCIy3qIfRFss2#~s(iS^$ISKb5!bo+&P~>R{~6vKcFqYmT2@jT^zqW|nHRVH z8<7{Gmz3u_qsgE-zExle|n6C3QKWOK{ zS!d(pD;pNf5W0USX031a^uje2Z0A3QB3h+ZK2Qq zEo9T3TYEa_mi_yn=G2*vkc8%hf&R`nSAuSx zIX5-N?Tq$!cGK=(?QYpBVH^9eXa)9Pi3orCELU)4vSsm%5JMT$AMG3#M{+9jk0_Yv zNd~Kgm%L6EQJS0B${c=&+bq6(zWuAzqiyElANhUmy|&vmO=jEYi^X9_!|%v3Ex6cGFvN1C+yIir;j9?<`rK_ zb)9Q@uKruV(l&j$k2(^2_Zw!cO@7*T>iI__iJa%<0tKNqXF6X0o^eG+ZrwwlxXppK z30D{$9zXk++MMv^^u^t4?i;3T|9fD;oVaJU${VAnzlvW`BmB*ocLCEvu|WT8OJ6B& zQ3_hEo2Qg&m%78dL6SqX?5N~Imc$jMVw>OTya+jS>$=ADD=XjoTloL!+?4mP;ON5o z>glWRt8f>6K4Xv=`D^MlDa$Dqb^jS$)be}gJuq-zJmc!D!|N1v7Z~hudb3M#am-&) z-R;5-hq^xp9gP#7xBpYZ>f_(PvWxy_IJt6F^JI}T8+PUQEwb$w+}e2eNZz#Komsnb zf^IgP{C0eYXYA>YwrNW5?yryt>RtPecfo~%`VY4&8!yDM87!TyNrb9$VW|`Ig51!nC8uzq!r)$^TV$ij}Zoyn*=dnc>q{$?tg7^nu0l zhhcn&N<7p4SFAttypOjuRNnjOnzi48Q~cY*{0DnZH`qRtHsRuOJXtyGKZBmOlK67_ zRsR_RwriSQ>wkSDQmQtUd4>VQ-(n%zZC&%bdlwu$o$|BvKZ9amkJ``AAB_#0zdlMh zI#Y(lHT-#{?GdlADDkiV878xwTWg<|q)?Hu@oi!8)2#U`J6S*eITY;37{X%REB0OI z+Q#VC(%Ju##8VGMFSm5iT>31S;rkWwwedmrsA@(jbzs{wMe1h|4=?pT+j{IH ztM=`PKN}bOpV0ZwQ1p10#A$;Cy8`piI38-xdnB0pS&#j&;nGJpE_~;`aP>ILmHX?j zXl&bYaOT#@&x;dmqK_WNuleEvt!lOoi`i$aRTk6O9xx||d#Y<p|1(`;!|J2|k~%}9 z>Q*sqbY1J#x6Z4bHzr}0r2b-^fT;9EeA7(R9y0Jq98uHQ;VCmMv|4BR=@nkr!f!7A z*|`3i8<*&0MlEfZy@@}Svm5u^b-2AhHSOtJv-K<%SARVUVd}QDdlr`Y`o7Oyg-5U6 zu`QZ9JIYuza9`mHK2i5elNqaari&i^YOq*5P^R(s^wf-)O#$ZGeuW~T%j1+dc^4#i zs7;!%W35B0^4&Xu2WRY^@Sh=&mm{@d*YYzvIz)b*DNKEAxb6Ln!bO^=)`$kKJzY3M z_wFg<3jffcL$8_*Bs1r0Z2!l$V2LZMzUZ^iM~pFre-7msUB9zqQH&{1gvFH<$Fh1u z!JOjnLT7hvjoH97=gNi+w|s8=J#FMPr}DdC#%lXOP44=RwW;AQBI1^7&Mf8H{7Cdx z)Y)GxhFp1)of-cbZYG%jXQ=8v@Z*_e*!3ejuRC8g@IFy7JNy*Cn>lw*%+6^IH`?t3 zyOV8PV$A|KUO&Ph;PB$eE}!IADbMx`K05Zb=-M3teNmk}_o9cML2t7AvOh|P7e?vp zD7OTiect(S+P@#2YcB4(ZyeNn#Km2HXX|-mH5Rsnby*u{Fc|OOp z6}#Q9DMppYJTIEKWa*j~L#Flbt*6a;@M_4IR(EJ^6L#T;7+St)=XmXR4laJ?_7vDb-r}pW(wIVNb2Ck*S=lfw2PZ zKaR)$Wu3zJpW)YLrdRp#e;9XlazBc+Jn*tDykqf#;+p-hv^#`OaJ|heT~vPmisix1 z7xp>^PrG(-DVpY&6%_lZZ+0+vJL_9+se99ZhJvWg3DVW?!W4Z){(9ebUNfV`e~0uA zt*Pc-X}ZTa^CR2kT>Cb%mrVT-6R_0Aam%!P_jjgRzB$u5IM;u1Fwu(=4l4gy@h;^S zN7S5s&ob(-Whe*V|FQF|_o9>x`#aJ`)!h<(FSoiZ{=4bL27Au`465fHyG^+G4;tQH z_G4!sug0o9zoz&<+!a6JN3+2V)q|zg|CG41S*9lQ#jniy-6P$7VadVEKmMuutm^vi zS945etz*pEK&jXN8J;YhXOf`bZ#DC2@mJv-#!r*F+_;&yoPk&M8go!75u zdU(1XJ)7EE#KRK1Fwl)NV2ZwgIe%1>uC|Q}Q^cK>=jyoybWR^RSa0imIHE)L=@f%^ zAqK`QcXf~1#QN?ywRlEX#QOYr0gih&{+v0W-<8bldh5;tQK!GYbFv>CH_-LxT7Q0K z)J=EMBODr6C3-CQmr1U8tX99(M5y-g4-dPxr@a*h(+utw2R*xg{L0PvHCFQ~;vU@G zZ9Ze~lXo|cT`k|zn|f1h_wQvMG5fAeoAx?rN8ZC$-}^!TF7G{5y6(f)po5|AZyLS6 zx=6<)oO@WY*)FjxUoMrAb>_kNqEn~m7cP@CjM}m2uH~Yj$W>VioiAFH;sjIM_Z0p) zZ4$QMW5FpUi*xofxDHM54`eM5XE1htxctX|22*2QUB*7^zikT79!xCY(+-}rV3)$v zM>1`;=d|x|2VXfNXZ%c?OQcTnh^V{G0o8h=(|U`JC|n6E4fu0sYr|DXWzom>D?XTu zR|a=T>a2P+LyVzle}T#M+V6VhoBd~mT)J1|qh-(j?dg{k=dS+@n|jt2a!rqzmb^)u z;q+T0CUGtu?@|WU8&y-bA3Y^&5n9-h`Tp0l02V&0BcZPM=P4+AO79L_dxXVp<}>|d zp*iVIypJtD8mY=Xb&Gu4pBP%O?eZV5cbDa7WQPjA{&nzZS=?8NiRI589L@du_unf< z&D9Fir?z!ULb?#KY)gM`->sBrEnk%6jX5|-3i>~_5aMR)3z8Hs>ewKG6 z%csvP73}VNEqFXUuA;G2xLt5x-Xd?|px^JL_Ox?Zd=|JdW7%%EfX4wh%`@LGpL3>G z>S+(l73*zLXN^8SlKsz6s&&qBC+`qYWq2X_QT#V=nmF~p1M^t{qr@mJj=Ka0MLein5!?CH99 znlp@2w z$ac}auPkThOMYgEweA+5lgE>DP4eKXbxUV$Jf`LxeI&H8_xJRz<+}4;{p)Vf2#{a# zN$lP4a|>CyWIokD|19gBWAm(IS|rbZh7|$l_|xJ$JL(jUPXEgDwOlC3CBHf1j*%gk zcKeajvrNPK|4u*mcHRtgmW5xB>}I~Q+G)Ow`^ov~g6x)Tg@Soa?;>B%s(Y%jy85rT zRr6k7_QwV+&Pw{vYz}jM$f-4)xF+9V!P)f4J4OqRvk1r8WC?8vzkbH`spf5)rfY`9 zhHf3Ra^-s*JS2OqNxzN!miHY6feEYXD z+^AI8wh*lbGp^eFe{&fXXQ$hEOu?&*5(Ij(E3HYT6T>@l5Rd+cKK zWuA*pdyhp`l>Uv#xFdDFPg%R#=7{||Q4#(bw-meXGH5S9~Y~z)T~#m8_K>+OA`s(SkJ!j&JBgrlaEBF9&ME9$>nAh zOfWQb;AUR5C}M^3s|QlXa@Esv7wY(}%hZlpSUrWQ^w5%5VGLCYa|Fwr)8i6+op@v% zxRrMA(2*4vjrH+8c3}N}9@p7Bo~hoyvxMpPbj6hu^0>W@_;L4{vfcSCpw+waPR8Zt zU;R^`|2>$Vf?c3yqqMxgix1Pt8~lI9V|Y zyoy>Xxh~=MnK}ECyhHch|1QgaJm;T_tMhlC*Ojxp51gr;_@7~^?yWl#tc$-he6PDK zleW0y#O$_+7;R@Uv0~QES^sWs5olO&{l}7|tL zdS}s;^}m{$Ex8{l+$&bNwg30c2eZ?6q^A0LOfc7&VlaE3Vq%}d*^8a~esb<#<5U@c z)=2!0stB9f@@Z9at%cheNoO#E8DFs!e9o|?U*!1f^L(s9=s}jzCU)kK*_fWpH(`oyWXp3F5 z_wVsx?MV=NwBXRQGZ*Tfg{{-lxN*k2yp+FZ=V?CKIR~f7sK)OQPs>)(x~;dB(INgj zt5COiN6TWS{Q`Up+l^WiX1q#lJ`)hQ#;S9((OK51S`LTiB`yx0{#3Vjy6LM6URa9W!MxX>h29_5So@lVqj~*TmP4tpRK-eHCaA1y zR^9zfQgz-VN%7Nr4fq|JJz$e6&frYcKWrB&N zldhqqe8Fo2Gdta;@4SNIifVe#-h45$b~GoBQR( z<#~l9vi{h0OVrv{*&cz(__TIw3Pw(^k37EF-Tp zQQLm=&i%#~4&TG)78tl6Jbq5Q^#1RJML(kE3rJ{W=s9)tPW20px^eG`Phg~&LCES& zJ2i68A3J+hRNHs`w!Nvkjuy5qmv7vE{PJUcOV|7*YtCQ2Z7QRw7&2EmX3dh78{gVb z$}Or)$u1VwaQ*Y=uefoHPVsFmeGBEdjX8QQlV>jA;}lQ~n#C(1GJWo1IVDY5j~4Z$ zJ=gC%5>|5%(+iNa$&>Z&R8Ku9!Y#ag&mkE;@%gsNf{HR_MqX-yvKt)oeSi_=#F7$v9P>I)ClfgJ%i>Q;kHGM72B=)pTq&_)58{&)EB2 zsnE!5j@!2%e_nn1XT8j`aqX8!p%dOk&p7ws&oj4vsYp$=Dzm`;4_5=*jVC&*CL7;$ zYCG%Rc=yF$>&CZY`igRyx_htva&CLa!ord?`{RTiUl$(!vHtYW>;<1HmVf@%ke+De zBOj=v6lLIJX!v_x@sH>~%x7*vA*(-+Vey`2?UYDs5p!+4K zM^RPt$?LBdZ!X=&z`(#+;1OBOz`!jG!i)^F=14FwC@^@sIEGZ*db79MC-~*Q|L2t_ zU2VVmamvQz8%sC8T~_s^#pR0P=AV3uy$cuKn86#Ux6wdRhSTSRfq{}-%fvG-69g7< zyx?S3R4iJg@~8C9E3*ftvpTK%ii_8s`@1Xs+?&&He*diVulxD5a^BXk>sjI49;;*S ztv};&yL4gf>e`PlpMS2LH+2HTFaQS@xowJ`)7jbC>DL{5=pq9{gS*2r{lIp8VRse= z205d!=8l~`Yb~@G8h!@6Q&RbFDbs#4+27<~-(x0*ih@m?hxaFJoxb*gZ={C*N}Y>S zjP^`tVBq&*{%Bpy5xKxImhWOgrFel)&khL&1O1Hxk9;cnChTkd^`=CJLp)koxv9pG zA>rMZpQoAcu|2BNQ&gP4V-s`j&!>Wu7|gxdW*PaN-Ln78<5213KO&nsFRpph^(HCN zY5C1X$)Ta8hP7V%PH265Xv@klL%S|^%}JZ%lNr+V&aGL}Gwav}RnME9hi2Rq=H%pz zoKkkg|7c*0jU(${*{ch?{Q|v`S3Np&L}S5nUIv43j?7ZQNBkeGHFY#!tE(JWQL%H= zT>EPIly^L_R~)NF?wcBV`(CSfwBpeTy|7Rp&9ye7>7vq2kDkoCb*r%DC_}@~6*uNj zNZ_9~D~Rb%&BMfv?U&5bot)08EWNiv%g>{uG9)9Q&_&!>RQ%1GnJId5{p-6__jdk$ z(;u?#pJ2~!W`;ANM{oW)UTnE$eT0UkgNH)SUZ$$%|7RA2EYZkYmR|V$7guUjKtzSs z<~f%>9&-BDV5@jA?uB>3vgP8dW~=k3-xU7ErM_d;>2~jDB9>ZO=fW3#<9QTc<~DJ*i{6FY)+=fJcHQCm-9{;? zRY@j+3=GfaEJ&DFndhR?`SwuBx(^%Wj=wA{RNmjZHL~QSPX3*T-X0PnmW@4`AB`0o z*^je+@nGB?eIWFD$&6IVoR<>O8^jfW^zS%lUbM4$YS3=els3S536n8i*<&+ID-E0EALQ{(8UVt2Auq&Wv%$ z%s)}~i`B|0O3f*BP6sF?`hLvpn)=4zw;;#oc?m8xJEz+&7ZREz`g-2ONbX|M@Qpl2 zIF{bzd^+XRye`IdkEG=I)6>o*nsl1iNGKE+D#RSMef(Hf>DRd>Q?_+v)OiFJaxM+s z*U}PvTvOIhniySOWqnlI^Ht2tMIOt0m$xt@QK364?fmVJ~|zoSdk z>dl$|B^u`D+uJTBcXdThvNAU}pWc;VXS{l4amY?AZz~!&#c*<-pIPDmG$cIF{`G<#GF#%xR7CkV-u7Ge=<=Ew>eF~ugl;@M{rRO& z&r~0t*POq_EvQg+^##`XO17#YcNQ0yIvv`fH~X$u-qkNDQrj=T2*@8*t%)crcV}Y*Mx-FEU|IPOx64S+u>zOdr-uh)1sv(m>!q?Vy)7- z7}~?f#c&`dbj_DnW-RHppJ#m$oqtL;XcCwCi^6MN3$$mI7R+`HE8H1i;4Q$TQSH6| zoY6>>ap5Dit@kY&#pN<*_b+eh*VupX@UGi$Kw-smbK(mv zw|GN_2M0suOi18oX}ZNd`J_wlBAs~Nv%Vf8H?Os<`B*3?Dj!}mJ$u!oGg?u`b7tN= zB6~ADcCJd(>xY)M{)@Y3cFs2rFI3B3b=t>c#iBo&Ccggj!$M-*kLt_LnI~td8g(lo z_})a8`qb3fu`HL&d2dUKy_m3QwZ!7L3=GBo0Z(?v-0Zr(hxf?*y9s8ke+0d_ch%gx zCcWoi!mLYoJ}qg~(tBv;#m?n#_)}KS(=4#iY2UP3Sr3mzUn(lof>M9{cxk!g#+f5g z##H`iGoX0qLv zp><3~grQ;QBEMs4{Czu(rN7UaP~&q|b2eXw)6Vd#Yj^agZMbIkH^X{vm#~@NC9SC2 zCC#aPeJ_sH*(~Vx^h%kY^iI|{o6TD&*bdC&}c5t;Ba)Ff7Iq;4*B%y&K>sF^S8_@V@P@T|IpHnJ3EDq zeru-gYAVHy0&M91kPGvmu+=2_?GYFE&J`a2mbNRc=Y+4Xvg%$x6f@* zD2lL|{j;k+k?meR1B0yJJh`%ud0i(|u1$SC>4bUdF}tN(oM)7|rtt9={!9&=r7E{! ze$|3>%@~=3N0#mX`OM{ovw41&NmYG;RW%xHo42$7S$mWF z$%LEf!ouvfI)8r0OF2qDzRS+QF-ujTvJ-NU-xLk9=996l{CDZ5w*0=om-I#X zI&%y|co-Ny@^#gJe%0w4%@@0;;OXJ=y37Ym=f#{sj)@mF7XJV2>SlSn-=_=i-79(& z3bJ3Wt1JF)*-@7x`)gi4n3fx0$iQ$U`lwf3(&b2F(fM~7MVT26I0t@QU;lTuaJ1g6 z89xp??=I15>t; zFQ@CxvEOOmzth4ZR4oPM?4XaUXP3>bvCc?(`@B7zf2E#V0w_SkKK41w+nude@7YuQ z@gV-;J|4IK^N_#(-{<-NKZ(y@Z#gxQkwHg)!J{3ke(e7*AN;XDe12_} zK7XsdW%ai=Q>TaMZ~lMtfc3ja^#&);A5@l>3yR$bNmd)m+WWp7N}zVgeF zcWY-~Hx##L6K7@+ZN9N$M*C4|vwYjYU8%<-#YErRR)2VK(z%^)u1&?iH`e~|MH`KZ zzuXr0m%A}_`_eBzZKJoZzrA7FPK%?v{&DV*U|1n>#O0`s^G410HlN>3UChq+=Kj{~ z>;IVB`QrW-=%1H+|J1AQ+abqm$$K*IEp9e(yU`nyg1 zu2$A#;`hb$>N?$zueis^Alf{m{b*PB^-T#gsw=iWdUiIte15>{@~&=Hh-}4<9~-Y~ z^>fbXG0(rhH$Pg_KPaZ^xvDHgcE+k1yDgp?_KF-#wrM^yS;Xt>J5@pP&o?9>US${O zmfk!+%&$w&;M%HktAM@C3|ed(OFvev-e7qB!!PxD6;7Q~wjPLBd+(*gS3Xc;a6H!4 zE}w3*aO!8CtGm;`8o5D)uN>{SSFDIJTsg~$Z}q*GseityPJT64)RT*0LDGi@W_5oG zYh6w&r(S+_ck`^iK(IB1{?QW5$zgk~kE|{~ZzOH3Xx|M9pUpkTq{*r*z)yK=jef0{E@#$Is83~*VjB@u;~i(8aH}=?Mqh|k(}MX*BP9K zA5B?O5f{Gqa!n7!P4$xwrM$VTe&&$VG5!62l)(BPEMz-&>c;NP@AsTZel#6oHovBU z+4_5X{}^%i-rO%y4N8J?ZV57L?&SurD%by{!&?6Fw7&GQd$|sim_Wg4?YS`I{k^(K zcCd*G|2(;3zxqj6FE59BT#@}))K@>4EXbYjocDG^?NT=2ldUfQaH_jXa(4K80SQok zw@}rbcRlodoC_#kek6X>|Nrs4wm6UH$HSGEI)A~mI`%g4K=GR|T#eN_rQvO4gaP2hK z6HdV&|Nq=R^|b5JuvfV6a>Djje{_BKP&~fo=TULPVl{^1e;0o4Nj|%BWx&TX zh98-XKc3pL@0NPdo3ny3IdOY;A2^h>E;%hZQt+>Z%;60~vWx&Tb5j%N8bIRS~GVF?<9pu)3kqV0W%}OWPMV*fZ-jl!Nqj!zz z@rGA-x%C%Ru^-U!+!nDQX~mDmkTa7+{Acv+wf=vyTYukyf64#%D6A^4)bZRX3eI9H zES_og*?jBs{=q5-acF>Hh>XAJ?2z|nnpby=$6d$)Sp*Uc7j<8EZ|{OxKU&4(Ah}Je zZ+VyVs`6bM%k?w%{5W)bI$zhTyLR9*XW^q8t1XJYzGIc$?*xi!i+fuC8a_`wIZ6Ir z#pCw&b&p)``Ydkz0aD|q4+`cA15xX6gGp&K?2BFV8t?2r6Z*$^cEXo?^3LLW(>Cw@ zdLcB%q1nfd1>}gAv42EXl{46MbV;Wk{PJ{{#=dtGQrA6t)3YRXebVf+-|jjE8`f%Q z^+oLcJvHvwnyT&GSFIW3e2#9?F?Ws8bf0Ezb5qQ_O{ZKhUG)Cn$MXMwJY8`%?ROgE ziXEj12?-0PT`K(c`QeHgtj7|s?v7nlC4QxF$t&3uo&}FqXuXrv+ZA&%=8jb6(%wyP z0;lX*6Z(hk_s`}2S2z4<&fov{z=}uf|NWSi_A>w9kGs+GD>9#LZ`vMS_xVP*Tn{9t~aZY(pkg9*ozKz8@{3@@^yKgZ^zt=m&lU3y51+d zKdo~+&V3fy8?$ryZ_TBD=T3>6u5$A5y9;&xJs~n1tG-`ZA6M}(eE*~Wdp>A`aI(pW-&1a*5>EZjo^{TL1c1|Ck-PwCj8Csz>MV1q7X3zc%LQ^4+I$w{cd_S^Ib8 zjR>26GYt&ypHBZAx^ZvVNlE$1Dwz(a72>Ba344}UW^L=H)fclj*yK#hADEl0QZ1*i zoN;;1!n6t2p`zt2t9E$CE>*Sp_-1>APV=d^F?GhblL}96iaEjiF8+vC+Ofa7HQ%mj?EcHh-(j500f*C)LimWNa9` zG4pGl{px$Hl@G&L+++NZpyfCHsdCKG%ZDYOPAiO*i=X&p;!`H?&6|U#U7qXLeOdqX z^tpbemzg5(y*O)kR{8mYF6qsGb2r(X5I!Sod2SA0q~CU))1NjR-4q;FUm?D{>wVq# zyXD_=?rgo^p>y<6MhIN{1?=iPGi zH^}zYZ7q6we&7Fp&6VmJQBe_DN$N|LgRGWbfBWcMspqb9a+8*T4eVs&a-ijz@3$?Djcov({Rz=n(5Bn`4jfulcYkR^Fds{e-8+yXMZ_7NPTV zQ_M-_hk4ycgARq7Z;CBny?k;JP)FpY|vT>gr#LF+45!KWvF&&i8kBcb89>oVNN0`_qa3 zx!>AL%e;V(r}FoS+!c#A6sNAyx)2iS4XWg4&zP+~m zdfM-4te1~n+j{=r4>tXWXZ?>J*Ua7G9i$h$aemOur(M-8U6J*z`x`FZidb#2rE0tX z+IzN3r+=LKSv_zsa{`~%x6_;EtY0~!bIQ?mxf4U@sGiO}DYmV3WtVPSr1qRmHY%qr zr(OOuk#CxQ+!0w3r@8VPdk?O^`#VVY_Q$r4soMMZm%sl#)hz7nioVxlWxYWe0A3QsOgj{)svPdL+0G@&s=)nUd2k|SoyO}7iL_N zs$LTcD(TkUJNiE9jV#0F@QwX5cPxkuE^Ip?ncm`h)b^KR#p6Xw&&C{GepJ9VKTl8E z;L_pfClRyR-Y<$cqE**j9*WS?^njdX9yZs{nev-4ry(Dk@zu&f+S2Q&p zy?DRwzixio?^o;2mc74izp1x!?)&Zc|9{BjnRU}jLpMXp;+U{V(BysVe;6#yeHocM zCG41uR-e%~y)9Mc3|Flg(n3C7czRmt_3hM)A$QKWmH)8a>n56hdQ(kRgr|PV>7w<= z>n(%U&3LNvd@!+qJFBE z`ilLjTQ4oSXx;x~;h#e{x^I4Oa9US$Z2;LUS&zDytGT7k|-KVG@4o;;FKOiVEq+ru^7-Flpl)&TSbwMxy^SLp)Xf zC~V@Fuld<_>)(g99=?BGTALmEsn=h)Kb3p`pJ~>=()VP2Z=12>QFYyOx%|Y(iJxP` z4paw-e%G>mu*~yTyzvu3t!Ya>JzV2pymarH#}V(=FAQb9859GqmJGYwMdj^VU&%5U zuZ)n~6Ju#|rakXRRb{$?bj@|e)0d@J@2qSW6^-6h{FE=Z=Gcvd^*Z6tLfAsz1S;J# z{v>#B^1-kdZ$*-wmi=t7R=b~dI6wYO_{Se_HeXm-Q}^xW`6h1O>{m6vBMrFzT~42W z^o5q(*|V>1+7&N5uBY_W@neUv;jd+%gEnrg+HSj~YWWU}B~{zSu39sQo|n6Sqh~cs z`#sl$Gu_-;wr{w#WS5of+PrIVThRYEW;5n@Ee?A>uj-ZNNB!0J-afx-&2o%E>lo|Q zY0X{cs}9?;rSEjSRMQ`IWMjF1q3GxT;7&(enAWsc=X@@$I-K5?zWd)EaAJKI>^S9> z?6G@{D)04@ zJ4>srYvH4cRTfWnm1li@_e8aJ(xHI8hi_Ojh&mq)*w}UTUC+gNN}=z+=+&`Zwcb$U z`Dv-s(an$NPhZ%jo_8!OeDlhCwyhh>6K+28Y3WKoS+8R)YCrMi=Hq$!&#vxXJzrvy z$clT7si#`DOKQ!N{lDo=$Q+}G-A~^gT3sGp@%5eL-kzziVplG#YCj;MQyH`;8Ppj5 zaXoce(rVjjjvGb7_TF9`_TH}U)yj0ARpm1*g>}@K?zPU=jZ4t__jA9lx~Tocq

    Z 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 literal 0 HcmV?d00001 diff --git a/docs/reference_configurator_support.md b/docs/reference_configurator_support.md index d0824c7705..4f2ddfffe8 100644 --- a/docs/reference_configurator_support.md +++ b/docs/reference_configurator_support.md @@ -189,15 +189,25 @@ Currently, the Configurator does not support key rotation or non-rectangular key For ISO Enter keys, QMK custom is to display it as a rectangular key, 1.25u wide and 2u high, aligned so its right edge is aligned with the right edge of the alphanumeric key block. -![](https://i.imgur.com/JKngtTw.png) +![](/JKngtTw.png) *A 60% keyboard in standard ISO layout, as rendered by QMK Configurator.* #### Vertically-offset keys For vertically-offset keys, place them in KLE as if they were not offset, then edit the Y-values as needed in the converted JSON file -![](https://i.imgur.com/fmDvDzR.png) +![](/fmDvDzR.png) *An 1800-layout keyboard as rendered in Keyboard Layout Editor, without the vertical offset applied to the arrow keys.* -![](https://i.imgur.com/8beYMBR.png) -*A Unix diff file, showing the changes needed to vertically-offset the arrow keys in our keyboard's JSON file.* +```diff +-{"label": "\u2191", "x", 14.25, "y": 5}, ++{"label": "\u2191", "x", 14.25, "y": 5.25}, +... +-{"label": "\u2190", "x", 13.25, "y": 6}, +-{"label": "\u2193", "x", 14.25, "y": 6}, +-{"label": "\u2192", "x", 15.25, "y": 6}, ++{"label": "\u2190", "x", 13.25, "y": 6.25}, ++{"label": "\u2193", "x", 14.25, "y": 6.25}, ++{"label": "\u2192", "x", 15.25, "y": 6.25}, +``` +*A diff showing the changes needed to vertically-offset the arrow keys in our keyboard's JSON file.* From a1096e1dec7abae4c3cb957c992b7ac47877fe83 Mon Sep 17 00:00:00 2001 From: Andrew C <47721334+polarbearhoodie@users.noreply.github.com> Date: Mon, 3 Nov 2025 23:06:56 -0800 Subject: [PATCH 582/592] Deprecate LAYOUT() macro in favor of JSON matrix definitions * Indicate .h LAYOUT() deprecation in understanding_qmk.md Initial documentation uses .json to define matrix pin definitions, rather than having users #define the LAYOUT() macro in .h - This change brings this docs inline with the [porting_guidelines](https://docs.qmk.fm/porting_your_keyboard_to_qmk), QMK MSYS will also throw an error if this is attempted. * Update understanding_qmk.md enclosed '<' using backtick * style guideline, now builds correctly prior version indicates directory, new indicates config. still the same idea. --- docs/understanding_qmk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md index ad5afdc56a..a47617c418 100644 --- a/docs/understanding_qmk.md +++ b/docs/understanding_qmk.md @@ -51,7 +51,7 @@ Matrix Scanning runs many times per second. The exact rate varies but typically Once we know the state of every switch on our keyboard we have to map that to a keycode. In QMK this is done by making use of C macros to allow us to separate the definition of the physical layout from the definition of keycodes. -At the keyboard level we define a C macro (typically named `LAYOUT()`) which maps our keyboard's matrix to physical keys. Sometimes the matrix does not have a switch in every location, and we can use this macro to pre-populate those with KC_NO, making the keymap definition easier to work with. Here's an example `LAYOUT()` macro for a numpad: +At the keyboard level, QMK will generate a macro (typically named `LAYOUT()`) from our configuration file `info.json`, which then maps our keyboard's matrix to physical keys. Sometimes the matrix does not have a switch in every location, and QMK will use this macro to pre-populate those with KC_NO, making the keymap definition easier to work with. Here's an example `LAYOUT()` macro for a numpad: ```c #define LAYOUT( \ @@ -71,7 +71,7 @@ At the keyboard level we define a C macro (typically named `LAYOUT()`) which map Notice how the second block of our `LAYOUT()` macro matches the Matrix Scanning array above? This macro is what will map the matrix scanning array to keycodes. However, if you look at a 17 key numpad you'll notice that it has 3 places where the matrix could have a switch but doesn't, due to larger keys. We have populated those spaces with `KC_NO` so that our keymap definition doesn't have to. -You can also use this macro to handle unusual matrix layouts, for example the [Alice](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/sneakbox/aliceclone/aliceclone.h#L24). Explaining that is outside the scope of this document. +This macro can handle unusual matrix layouts, for example the [Alice](https://github.com/qmk/qmk_firmware/blob/325da02e57fe7374e77b82cb00360ba45167e25c/keyboards/sneakbox/aliceclone/aliceclone.h#L24). Explaining that is outside the scope of this document. ##### Keycode Assignment From aa5a6d38de72e9aa2547302c64769f0536de1de6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 23:05:36 +0000 Subject: [PATCH 583/592] Bump JamesIves/github-pages-deploy-action from 4.7.3 to 4.7.4 (#25771) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.3 to 4.7.4. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.7.3...v4.7.4) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-version: 4.7.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 275e2b2483..fe5d6027e2 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -56,7 +56,7 @@ jobs: - name: Deploy if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }} - uses: JamesIves/github-pages-deploy-action@v4.7.3 + uses: JamesIves/github-pages-deploy-action@v4.7.4 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages From cbeab2ac4f69292283ed94049675aaa89128ec34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 23:38:23 +0000 Subject: [PATCH 584/592] Bump actions/upload-artifact from 4 to 5 (#25745) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci_build_major_branch_keymap.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_build_major_branch_keymap.yml b/.github/workflows/ci_build_major_branch_keymap.yml index 1a0b44b908..228dd0025d 100644 --- a/.github/workflows/ci_build_major_branch_keymap.yml +++ b/.github/workflows/ci_build_major_branch_keymap.yml @@ -62,7 +62,7 @@ jobs: echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT - name: Upload targets json - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: targets-${{ inputs.keymap }} path: targets.json @@ -112,7 +112,7 @@ jobs: qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $(jq -r '.["${{ matrix.target }}"].targets' targets.json) || touch .failed - name: Upload binaries - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{ inputs.keymap }}-${{ matrix.target }} if-no-files-found: ignore @@ -146,7 +146,7 @@ jobs: merge-multiple: true - name: Upload all firmwares - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{ inputs.keymap }} if-no-files-found: ignore From 8522449ccfa36d19c82317e8a49e58862e366c66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 23:38:36 +0000 Subject: [PATCH 585/592] Bump actions/download-artifact from 5 to 6 (#25746) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci_build_major_branch.yml | 2 +- .github/workflows/ci_build_major_branch_keymap.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_build_major_branch.yml b/.github/workflows/ci_build_major_branch.yml index c37e1377b1..6cefd58901 100644 --- a/.github/workflows/ci_build_major_branch.yml +++ b/.github/workflows/ci_build_major_branch.yml @@ -87,7 +87,7 @@ jobs: fetch-depth: 0 - name: Download firmwares - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: firmware-* path: . diff --git a/.github/workflows/ci_build_major_branch_keymap.yml b/.github/workflows/ci_build_major_branch_keymap.yml index 228dd0025d..f5533cf07a 100644 --- a/.github/workflows/ci_build_major_branch_keymap.yml +++ b/.github/workflows/ci_build_major_branch_keymap.yml @@ -92,7 +92,7 @@ jobs: uses: actions/checkout@v5 - name: Get target definitions - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: targets-${{ inputs.keymap }} path: . @@ -139,7 +139,7 @@ jobs: uses: actions/checkout@v5 - name: Download firmwares - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: firmware-${{ inputs.keymap }}-* path: . From 22b213e1915a49cc8419fe0d449ca26fb372b43c Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Date: Sat, 8 Nov 2025 15:43:34 -0300 Subject: [PATCH 586/592] Add LED index map to `qmk info` cli command (#25743) --- lib/python/qmk/cli/info.py | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py index 5925b57258..26f7f0269d 100755 --- a/lib/python/qmk/cli/info.py +++ b/lib/python/qmk/cli/info.py @@ -102,6 +102,48 @@ def show_matrix(kb_info_json, title_caps=True): print(render_layout(kb_info_json['layouts'][layout_name]['layout'], cli.config.info.ascii, labels)) +def show_leds(kb_info_json, title_caps=True): + """Render LED indices per key, using the keyboard's key layout geometry. + + We build a map from (row, col) -> LED index using rgb_matrix/led_matrix layout, + then label each key with its LED index. Keys without an associated LED are left blank. + """ + # Prefer rgb_matrix, fall back to led_matrix + led_feature = None + for feature in ['rgb_matrix', 'led_matrix']: + if 'layout' in kb_info_json.get(feature, {}): + led_feature = feature + break + + if not led_feature: + cli.echo('{fg_yellow}No rgb_matrix/led_matrix layout found to derive LED indices.{fg_reset}') + return + + # Build mapping from matrix position -> LED indices for faster lookup later + by_matrix = {} + for idx, led in enumerate(kb_info_json[led_feature]['layout']): + if 'matrix' in led: + led_key = tuple(led.get('matrix')) + by_matrix[led_key] = idx + + # For each keyboard layout (e.g., LAYOUT), render keys labeled with LED index (or blank) + for layout_name, layout in kb_info_json['layouts'].items(): + labels = [] + for key in layout['layout']: + led_key = tuple(key.get('matrix')) + label = str(by_matrix[led_key]) if led_key in by_matrix else '' + + labels.append(label) + + # Header + if title_caps: + cli.echo('{fg_blue}LED indices for "%s"{fg_reset}:', layout_name) + else: + cli.echo('{fg_blue}leds_%s{fg_reset}:', layout_name) + + print(render_layout(kb_info_json['layouts'][layout_name]['layout'], cli.config.info.ascii, labels)) + + def print_friendly_output(kb_info_json): """Print the info.json in a friendly text format. """ @@ -169,6 +211,7 @@ def print_parsed_rules_mk(keyboard_name): @cli.argument('-km', '--keymap', help='Keymap to show info for (Optional).') @cli.argument('-l', '--layouts', action='store_true', help='Render the layouts.') @cli.argument('-m', '--matrix', action='store_true', help='Render the layouts with matrix information.') +@cli.argument('-L', '--leds', action='store_true', help='Render the LED layout with LED indices (rgb_matrix/led_matrix).') @cli.argument('-f', '--format', default='friendly', arg_only=True, help='Format to display the data in (friendly, text, json) (Default: friendly).') @cli.argument('--ascii', action='store_true', default=not UNICODE_SUPPORT, help='Render layout box drawings in ASCII only.') @cli.argument('-r', '--rules-mk', action='store_true', help='Render the parsed values of the keyboard\'s rules.mk file.') @@ -227,5 +270,8 @@ def info(cli): if cli.config.info.matrix: show_matrix(kb_info_json, title_caps) + if cli.config.info.leds: + show_leds(kb_info_json, title_caps) + if cli.config.info.keymap: show_keymap(kb_info_json, title_caps) From 00eebfb575d6ea0660755cee2c6ccf3b21110312 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 8 Nov 2025 20:49:15 +0000 Subject: [PATCH 587/592] Fix pmw33xx sensor initialisation (#25777) --- drivers/sensors/pmw33xx_common.c | 2 +- platforms/progmem.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/sensors/pmw33xx_common.c b/drivers/sensors/pmw33xx_common.c index 61e309ea27..95d0fe6b4b 100644 --- a/drivers/sensors/pmw33xx_common.c +++ b/drivers/sensors/pmw33xx_common.c @@ -108,7 +108,7 @@ __attribute__((weak)) bool pmw33xx_check_signature(uint8_t sensor) { pmw33xx_read(sensor, REG_Inverse_Product_ID), }; - return memcmp(pmw33xx_firmware_signature, signature_dump, sizeof(signature_dump)) == 0; + return memcmp_P(signature_dump, pmw33xx_firmware_signature, sizeof(signature_dump)) == 0; } bool pmw33xx_upload_firmware(uint8_t sensor) { diff --git a/platforms/progmem.h b/platforms/progmem.h index 3a7a169682..6c4ebcaa01 100644 --- a/platforms/progmem.h +++ b/platforms/progmem.h @@ -7,6 +7,7 @@ # define PROGMEM # define PSTR(x) x # define PGM_P const char* +# define memcmp_P(s1, s2, n) memcmp(s1, s2, n) # define memcpy_P(dest, src, n) memcpy(dest, src, n) # define pgm_read_byte(address_short) *((uint8_t*)(address_short)) # define pgm_read_word(address_short) *((uint16_t*)(address_short)) From 024c4ef85395f3230ab1599a4f1c87ffeab7e553 Mon Sep 17 00:00:00 2001 From: leyew <102467346+itsme-zeix@users.noreply.github.com> Date: Sun, 9 Nov 2025 05:01:36 +0800 Subject: [PATCH 588/592] [Keyboard] Add Rubrehaku (#24907) --- keyboards/zeix/singa/rubrehaku/config.h | 20 + keyboards/zeix/singa/rubrehaku/keyboard.json | 694 ++++++++++++++++++ .../singa/rubrehaku/keymaps/default/keymap.c | 35 + .../zeix/singa/rubrehaku/matrix_diagram.md | 30 + keyboards/zeix/singa/rubrehaku/readme.md | 27 + 5 files changed, 806 insertions(+) create mode 100644 keyboards/zeix/singa/rubrehaku/config.h create mode 100644 keyboards/zeix/singa/rubrehaku/keyboard.json create mode 100644 keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c create mode 100644 keyboards/zeix/singa/rubrehaku/matrix_diagram.md create mode 100644 keyboards/zeix/singa/rubrehaku/readme.md diff --git a/keyboards/zeix/singa/rubrehaku/config.h b/keyboards/zeix/singa/rubrehaku/config.h new file mode 100644 index 0000000000..e47dae35e6 --- /dev/null +++ b/keyboards/zeix/singa/rubrehaku/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2024 zeix (@itsme-zeix) + +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 RP2040_BOOTLOADER_DOUBLE_TAP_RESET +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U diff --git a/keyboards/zeix/singa/rubrehaku/keyboard.json b/keyboards/zeix/singa/rubrehaku/keyboard.json new file mode 100644 index 0000000000..3dbed82aab --- /dev/null +++ b/keyboards/zeix/singa/rubrehaku/keyboard.json @@ -0,0 +1,694 @@ +{ + "manufacturer": "KLC", + "keyboard_name": "Rubrehaku", + "maintainer": "itsme-zeix", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "GP29" + }, + "matrix_pins": { + "cols": ["GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"], + "rows": ["GP27", "GP28", "GP10", "GP11", "GP18", "GP19", "GP23", "GP24", "GP25", "GP26"] + }, + "processor": "RP2040", + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "default": { + "hue": 210, + "sat": 100, + "val": 8 + }, + "driver": "ws2812", + "led_count": 16, + "sleep": true + }, + "url": "https://klc-playground.com", + "usb": { + "device_version": "0.0.1", + "pid": "0x8889", + "vid": "0x4C27" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP20" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [1, 6], "x": 13, "y": 0}, + {"matrix": [0, 7], "x": 14, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [4, 6], "x": 12.75, "y": 2}, + {"matrix": [5, 6], "x": 13.75, "y": 2, "w": 1.25}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [7, 0], "x": 1.25, "y": 3}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [9, 2], "x": 3.75, "y": 4, "w": 2.75}, + {"matrix": [8, 3], "x": 6.5, "y": 4, "w": 1.25}, + {"matrix": [9, 4], "x": 7.75, "y": 4, "w": 2.25}, + {"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [0, 7], "x": 13, "y": 0, "w": 2}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_ansi_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [1, 6], "x": 13, "y": 0}, + {"matrix": [0, 7], "x": 14, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [0, 7], "x": 13, "y": 0, "w": 2}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [9, 0], "x": 1.5, "y": 4}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_ansi_tsangan_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [1, 6], "x": 13, "y": 0}, + {"matrix": [0, 7], "x": 14, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [9, 0], "x": 1.5, "y": 4}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [0, 7], "x": 13, "y": 0, "w": 2}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [4, 6], "x": 12.75, "y": 2}, + {"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [7, 0], "x": 1.25, "y": 3}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_iso_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [1, 6], "x": 13, "y": 0}, + {"matrix": [0, 7], "x": 14, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [4, 6], "x": 12.75, "y": 2}, + {"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [7, 0], "x": 1.25, "y": 3}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_iso_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [0, 7], "x": 13, "y": 0, "w": 2}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [4, 6], "x": 12.75, "y": 2}, + {"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [7, 0], "x": 1.25, "y": 3}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [9, 0], "x": 1.5, "y": 4}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + }, + "LAYOUT_iso_tsangan_split_bs": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [1, 0], "x": 1, "y": 0}, + {"matrix": [0, 1], "x": 2, "y": 0}, + {"matrix": [1, 1], "x": 3, "y": 0}, + {"matrix": [0, 2], "x": 4, "y": 0}, + {"matrix": [1, 2], "x": 5, "y": 0}, + {"matrix": [0, 3], "x": 6, "y": 0}, + {"matrix": [1, 3], "x": 7, "y": 0}, + {"matrix": [0, 4], "x": 8, "y": 0}, + {"matrix": [1, 4], "x": 9, "y": 0}, + {"matrix": [0, 5], "x": 10, "y": 0}, + {"matrix": [1, 5], "x": 11, "y": 0}, + {"matrix": [0, 6], "x": 12, "y": 0}, + {"matrix": [1, 6], "x": 13, "y": 0}, + {"matrix": [0, 7], "x": 14, "y": 0}, + {"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [3, 0], "x": 1.5, "y": 1}, + {"matrix": [2, 1], "x": 2.5, "y": 1}, + {"matrix": [3, 1], "x": 3.5, "y": 1}, + {"matrix": [2, 2], "x": 4.5, "y": 1}, + {"matrix": [3, 2], "x": 5.5, "y": 1}, + {"matrix": [2, 3], "x": 6.5, "y": 1}, + {"matrix": [3, 3], "x": 7.5, "y": 1}, + {"matrix": [2, 4], "x": 8.5, "y": 1}, + {"matrix": [3, 4], "x": 9.5, "y": 1}, + {"matrix": [2, 5], "x": 10.5, "y": 1}, + {"matrix": [3, 5], "x": 11.5, "y": 1}, + {"matrix": [2, 6], "x": 12.5, "y": 1}, + {"matrix": [3, 7], "x": 15, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [5, 0], "x": 1.75, "y": 2}, + {"matrix": [4, 1], "x": 2.75, "y": 2}, + {"matrix": [5, 1], "x": 3.75, "y": 2}, + {"matrix": [4, 2], "x": 4.75, "y": 2}, + {"matrix": [5, 2], "x": 5.75, "y": 2}, + {"matrix": [4, 3], "x": 6.75, "y": 2}, + {"matrix": [5, 3], "x": 7.75, "y": 2}, + {"matrix": [4, 4], "x": 8.75, "y": 2}, + {"matrix": [5, 4], "x": 9.75, "y": 2}, + {"matrix": [4, 5], "x": 10.75, "y": 2}, + {"matrix": [5, 5], "x": 11.75, "y": 2}, + {"matrix": [4, 6], "x": 12.75, "y": 2}, + {"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [5, 7], "x": 15, "y": 2}, + {"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [7, 0], "x": 1.25, "y": 3}, + {"matrix": [6, 1], "x": 2.25, "y": 3}, + {"matrix": [7, 1], "x": 3.25, "y": 3}, + {"matrix": [6, 2], "x": 4.25, "y": 3}, + {"matrix": [7, 2], "x": 5.25, "y": 3}, + {"matrix": [6, 3], "x": 6.25, "y": 3}, + {"matrix": [7, 3], "x": 7.25, "y": 3}, + {"matrix": [6, 4], "x": 8.25, "y": 3}, + {"matrix": [7, 4], "x": 9.25, "y": 3}, + {"matrix": [6, 5], "x": 10.25, "y": 3}, + {"matrix": [7, 5], "x": 11.25, "y": 3}, + {"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [7, 6], "x": 14, "y": 3}, + {"matrix": [7, 7], "x": 15, "y": 3}, + {"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [9, 0], "x": 1.5, "y": 4}, + {"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [8, 3], "x": 4, "y": 4, "w": 7}, + {"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [8, 6], "x": 13, "y": 4}, + {"matrix": [9, 6], "x": 14, "y": 4}, + {"matrix": [9, 7], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c b/keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c new file mode 100644 index 0000000000..17e226b98c --- /dev/null +++ b/keyboards/zeix/singa/rubrehaku/keymaps/default/keymap.c @@ -0,0 +1,35 @@ +/* +Copyright 2024 zeix (@itsme-zeix) + +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 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[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_BSLS, 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_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_ENT, 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_TRNS, 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_TRNS, KC_DEL, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; diff --git a/keyboards/zeix/singa/rubrehaku/matrix_diagram.md b/keyboards/zeix/singa/rubrehaku/matrix_diagram.md new file mode 100644 index 0000000000..cd11c0070a --- /dev/null +++ b/keyboards/zeix/singa/rubrehaku/matrix_diagram.md @@ -0,0 +1,30 @@ +# Matrix Diagram for Rubrehaku + +``` + ┌───┬───┐ + Split Backspace │16 │07 │ + └───┴───┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ +│00 │10 │01 │11 │02 │12 │03 │13 │04 │14 │05 │15 │06 │07 │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┐ ┌─────┐ +│20 │30 │21 │31 │22 │32 │23 │33 │24 │34 │25 │35 │26 │36 │37 │ │ │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐56 │ ISO Enter +│40 │50 │41 │51 │42 │52 │43 │53 │44 │54 │45 │55 │56 │57 │ │46 │ │ +├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘ +│60 │61 │71 │62 │72 │63 │73 │64 │74 │65 │75 │66 │76 │77 │ +├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤ +│80 │90 │81 │83 │95 │ │86 │96 │97 │ +└─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘ +┌────┬───┐ +│60 │70 │ Split Left Shift +└────┴───┘ +┌────┬────┬────┬────────────────────────┬────┬────┐ +│80 │90 │81 │83 │85 │95 │ 6.25u +└────┴────┴────┴────────────────────────┴────┴────┘ +┌────┬────┬────┬───────────┬────┬───────┬────┬────┐ +│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.75u) +└────┴────┴────┴───────────┴────┴───────┴────┴────┘ +┌────┬────┬────┬───────┬────┬───────────┬────┬────┐ +│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.25u) +└────┴────┴────┴───────┴────┴───────────┴────┴────┘ +``` diff --git a/keyboards/zeix/singa/rubrehaku/readme.md b/keyboards/zeix/singa/rubrehaku/readme.md new file mode 100644 index 0000000000..f7fcc1f871 --- /dev/null +++ b/keyboards/zeix/singa/rubrehaku/readme.md @@ -0,0 +1,27 @@ +# SINGA Rubrehaku (PCB designed by Zeix) + +![Layout Compatibility](https://i.imgur.com/jTkWkJd.png) + +65% PCB designed to support Rubrehaku + +* Keyboard Maintainer: [Zeix](https://github.com/itsme-zeix) +* Hardware Supported: KLC x SINGA x Rubrehose Rubrehaku +* Hardware Availability: https://klc-playground.com/ + +Make example for this keyboard (after setting up your build environment): + + make zeix/singa/rubrehaku:default + +Flashing example for this keyboard: + + make zeix/singa/rubrehaku: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 top left key and plug in the keyboard. +* **Physical reset button**: Briefly press the `RESET` button twice or short the 'USB_BOOT' and `GND` pads and plug in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT`. From e7ad19bb953c6f430fb3501386b96962dbe9912c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Mart=C3=ADnez?= <58857054+elpekenin@users.noreply.github.com> Date: Tue, 11 Nov 2025 13:20:48 +0100 Subject: [PATCH 589/592] [Bugfix] QP error handling (#25591) * change QP so that any func can return error (`void` -> `bool` returns) --- drivers/painter/comms/qp_comms_dummy.c | 3 ++- drivers/painter/comms/qp_comms_i2c.c | 17 +++++++++++----- drivers/painter/comms/qp_comms_i2c.h | 2 +- drivers/painter/comms/qp_comms_spi.c | 10 ++++++--- drivers/painter/comms/qp_comms_spi.h | 6 +++--- drivers/painter/gc9xxx/qp_gc9107.c | 8 ++++---- drivers/painter/gc9xxx/qp_gc9a01.c | 8 ++++---- drivers/painter/ili9xxx/qp_ili9163.c | 8 ++++---- drivers/painter/ili9xxx/qp_ili9341.c | 8 ++++---- drivers/painter/ili9xxx/qp_ili9486.c | 16 +++++++++------ drivers/painter/ili9xxx/qp_ili9488.c | 8 ++++---- drivers/painter/ld7032/qp_ld7032.c | 28 ++++++++++++++++++-------- drivers/painter/sh1106/qp_sh1106.c | 3 +-- drivers/painter/sh1107/qp_sh1107.c | 3 +-- drivers/painter/ssd1351/qp_ssd1351.c | 12 ++++++----- drivers/painter/st77xx/qp_st7735.c | 8 ++++++-- drivers/painter/st77xx/qp_st7789.c | 8 ++++++-- quantum/painter/qp_comms.c | 12 +++++------ quantum/painter/qp_comms.h | 6 +++--- quantum/painter/qp_internal_driver.h | 6 +++--- 20 files changed, 108 insertions(+), 72 deletions(-) diff --git a/drivers/painter/comms/qp_comms_dummy.c b/drivers/painter/comms/qp_comms_dummy.c index 2ed49d2232..7a2aef5d37 100644 --- a/drivers/painter/comms/qp_comms_dummy.c +++ b/drivers/painter/comms/qp_comms_dummy.c @@ -15,8 +15,9 @@ static bool dummy_comms_start(painter_device_t device) { return true; } -static void dummy_comms_stop(painter_device_t device) { +static bool dummy_comms_stop(painter_device_t device) { // No-op. + return true; } uint32_t dummy_comms_send(painter_device_t device, const void *data, uint32_t byte_count) { diff --git a/drivers/painter/comms/qp_comms_i2c.c b/drivers/painter/comms/qp_comms_i2c.c index 93f503f3dd..f093c87ee4 100644 --- a/drivers/painter/comms/qp_comms_i2c.c +++ b/drivers/painter/comms/qp_comms_i2c.c @@ -35,7 +35,9 @@ uint32_t qp_comms_i2c_send_data(painter_device_t device, const void *data, uint3 return qp_comms_i2c_send_raw(device, data, byte_count); } -void qp_comms_i2c_stop(painter_device_t device) {} +bool qp_comms_i2c_stop(painter_device_t device) { + return true; +} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Command+Data I2C support @@ -43,9 +45,9 @@ void qp_comms_i2c_stop(painter_device_t device) {} static const uint8_t cmd_byte = 0x00; static const uint8_t data_byte = 0x40; -void qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) { +bool qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) { uint8_t buf[2] = {cmd_byte, cmd}; - qp_comms_i2c_send_raw(device, &buf, 2); + return qp_comms_i2c_send_raw(device, &buf, 2); } uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *data, uint32_t byte_count) { @@ -58,7 +60,7 @@ uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *dat return byte_count; } -void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { +bool qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { uint8_t buf[32]; for (size_t i = 0; i < sequence_len;) { uint8_t command = sequence[i]; @@ -67,12 +69,17 @@ void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t * buf[0] = cmd_byte; buf[1] = command; memcpy(&buf[2], &sequence[i + 3], num_bytes); - qp_comms_i2c_send_raw(device, buf, num_bytes + 2); + if (!qp_comms_i2c_send_raw(device, buf, num_bytes + 2)) { + return false; + } + if (delay > 0) { wait_ms(delay); } i += (3 + num_bytes); } + + return true; } const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable = { diff --git a/drivers/painter/comms/qp_comms_i2c.h b/drivers/painter/comms/qp_comms_i2c.h index 70083d6526..06a284dc15 100644 --- a/drivers/painter/comms/qp_comms_i2c.h +++ b/drivers/painter/comms/qp_comms_i2c.h @@ -19,7 +19,7 @@ typedef struct qp_comms_i2c_config_t { bool qp_comms_i2c_init(painter_device_t device); bool qp_comms_i2c_start(painter_device_t device); uint32_t qp_comms_i2c_send_data(painter_device_t device, const void* data, uint32_t byte_count); -void qp_comms_i2c_stop(painter_device_t device); +bool qp_comms_i2c_stop(painter_device_t device); extern const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable; diff --git a/drivers/painter/comms/qp_comms_spi.c b/drivers/painter/comms/qp_comms_spi.c index 4e6067394b..31b68dfdf6 100644 --- a/drivers/painter/comms/qp_comms_spi.c +++ b/drivers/painter/comms/qp_comms_spi.c @@ -45,11 +45,12 @@ uint32_t qp_comms_spi_send_data(painter_device_t device, const void *data, uint3 return byte_count - bytes_remaining; } -void qp_comms_spi_stop(painter_device_t device) { +bool qp_comms_spi_stop(painter_device_t device) { painter_driver_t * driver = (painter_driver_t *)device; qp_comms_spi_config_t *comms_config = (qp_comms_spi_config_t *)driver->comms_config; spi_stop(); gpio_write_pin_high(comms_config->chip_select_pin); + return true; } const painter_comms_vtable_t spi_comms_vtable = { @@ -97,14 +98,15 @@ uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void *da return qp_comms_spi_send_data(device, data, byte_count); } -void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) { +bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) { painter_driver_t * driver = (painter_driver_t *)device; qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config; gpio_write_pin_low(comms_config->dc_pin); spi_write(cmd); + return true; } -void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { +bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { painter_driver_t * driver = (painter_driver_t *)device; qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config; for (size_t i = 0; i < sequence_len;) { @@ -126,6 +128,8 @@ void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const } i += (3 + num_bytes); } + + return true; } const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable = { diff --git a/drivers/painter/comms/qp_comms_spi.h b/drivers/painter/comms/qp_comms_spi.h index c39ea95f72..bb1a841519 100644 --- a/drivers/painter/comms/qp_comms_spi.h +++ b/drivers/painter/comms/qp_comms_spi.h @@ -22,7 +22,7 @@ typedef struct qp_comms_spi_config_t { bool qp_comms_spi_init(painter_device_t device); bool qp_comms_spi_start(painter_device_t device); uint32_t qp_comms_spi_send_data(painter_device_t device, const void* data, uint32_t byte_count); -void qp_comms_spi_stop(painter_device_t device); +bool qp_comms_spi_stop(painter_device_t device); extern const painter_comms_vtable_t spi_comms_vtable; @@ -39,9 +39,9 @@ typedef struct qp_comms_spi_dc_reset_config_t { } qp_comms_spi_dc_reset_config_t; bool qp_comms_spi_dc_reset_init(painter_device_t device); -void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd); +bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd); uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void* data, uint32_t byte_count); -void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len); +bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len); extern const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable; diff --git a/drivers/painter/gc9xxx/qp_gc9107.c b/drivers/painter/gc9xxx/qp_gc9107.c index 108344da4f..f0eb24d0cd 100644 --- a/drivers/painter/gc9xxx/qp_gc9107.c +++ b/drivers/painter/gc9xxx/qp_gc9107.c @@ -32,7 +32,9 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat }; // clang-format on - qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -41,9 +43,7 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat [QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY, [QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY, }; - qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]); - - return true; + return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/gc9xxx/qp_gc9a01.c b/drivers/painter/gc9xxx/qp_gc9a01.c index f037a4cc87..a9b5e4b057 100644 --- a/drivers/painter/gc9xxx/qp_gc9a01.c +++ b/drivers/painter/gc9xxx/qp_gc9a01.c @@ -45,7 +45,9 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat }; // clang-format on - qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -54,9 +56,7 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat [QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY, [QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY, }; - qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]); - - return true; + return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/ili9xxx/qp_ili9163.c b/drivers/painter/ili9xxx/qp_ili9163.c index 7f439dc317..74c5cb28ee 100644 --- a/drivers/painter/ili9xxx/qp_ili9163.c +++ b/drivers/painter/ili9xxx/qp_ili9163.c @@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota ILI9XXX_CMD_DISPLAY_ON, 20, 0 }; // clang-format on - qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota [QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY, [QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY, }; - qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); - - return true; + return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/ili9xxx/qp_ili9341.c b/drivers/painter/ili9xxx/qp_ili9341.c index a101b292aa..4ca22d8a73 100644 --- a/drivers/painter/ili9xxx/qp_ili9341.c +++ b/drivers/painter/ili9xxx/qp_ili9341.c @@ -48,7 +48,9 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota ILI9XXX_CMD_DISPLAY_ON, 20, 0 }; // clang-format on - qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -57,9 +59,7 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota [QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY, [QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY, }; - qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); - - return true; + return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/ili9xxx/qp_ili9486.c b/drivers/painter/ili9xxx/qp_ili9486.c index 48db779c04..df2d084aa3 100644 --- a/drivers/painter/ili9xxx/qp_ili9486.c +++ b/drivers/painter/ili9xxx/qp_ili9486.c @@ -37,7 +37,9 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) { ILI9XXX_SET_INVERSION_CTL, 0, 1, 0x02, }; // clang-format on - qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -62,22 +64,22 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) { ILI9XXX_CMD_DISPLAY_ON, 5, 0, }; // clang-format on - qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence)); - - return true; + return qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence)); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Driver vtable // waveshare variant needs some tweaks due to shift registers -static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) { +static bool qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) { painter_driver_t * driver = (painter_driver_t *)device; qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config; gpio_write_pin_low(comms_config->spi_config.chip_select_pin); qp_comms_spi_dc_reset_send_command(device, cmd); gpio_write_pin_high(comms_config->spi_config.chip_select_pin); + + return true; } static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) { @@ -124,7 +126,7 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin return ret; } -static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { +static bool qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { for (size_t i = 0; i < sequence_len;) { uint8_t command = sequence[i]; uint8_t delay = sequence[i + 1]; @@ -140,6 +142,8 @@ static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t dev } i += (3 + num_bytes); } + + return true; } static bool qp_ili9486_viewport(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom) { diff --git a/drivers/painter/ili9xxx/qp_ili9488.c b/drivers/painter/ili9xxx/qp_ili9488.c index 63deaf5f2e..fd05db8751 100644 --- a/drivers/painter/ili9xxx/qp_ili9488.c +++ b/drivers/painter/ili9xxx/qp_ili9488.c @@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota ILI9XXX_CMD_DISPLAY_ON, 20, 0 }; // clang-format on - qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota [QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX, [QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV, }; - qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); - - return true; + return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/ld7032/qp_ld7032.c b/drivers/painter/ld7032/qp_ld7032.c index f43ae8e60d..d73430cc75 100644 --- a/drivers/painter/ld7032/qp_ld7032.c +++ b/drivers/painter/ld7032/qp_ld7032.c @@ -10,7 +10,7 @@ #include "qp_surface.h" #include "qp_surface_internal.h" -typedef void (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data); +typedef bool (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data); typedef uint32_t (*ld7032_driver_comms_send_command_and_databuf_func)(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count); typedef struct ld7032_comms_with_command_vtable_t { @@ -25,12 +25,13 @@ typedef struct ld7032_comms_with_command_vtable_t { // LD7032 Internal API //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) { +#ifdef QUANTUM_PAINTER_LD7032_I2C_ENABLE +bool ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) { uint8_t buf[2] = {cmd, data}; - qp_comms_i2c_send_data(device, buf, 2); + return qp_comms_i2c_send_data(device, buf, 2); } -void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { +bool ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { uint8_t buf[32]; for (size_t i = 0; i < sequence_len;) { uint8_t command = sequence[i]; @@ -38,12 +39,16 @@ void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8 uint8_t num_bytes = sequence[i + 2]; buf[0] = command; memcpy(&buf[1], &sequence[i + 3], num_bytes); - qp_comms_i2c_send_data(device, buf, num_bytes + 1); + if (!qp_comms_i2c_send_data(device, buf, num_bytes + 1)) { + return false; + } if (delay > 0) { wait_ms(delay); } i += (3 + num_bytes); } + + return true; } uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) { @@ -53,6 +58,7 @@ uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint memcpy(&buf[1], data, byte_count); return qp_comms_send(device, buf, byte_count + 1); } +#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE // Power control bool qp_ld7032_power(painter_device_t device, bool power_on) { @@ -201,7 +207,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat }; // clang-format on - qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence))) { + return false; + } uint8_t display_y_start = 40 - driver->oled.base.panel_height; uint8_t display_x_start = (128 - driver->oled.base.panel_width) / 2; @@ -223,7 +231,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat ld7032_memory_setup[13] = ld7032_memory_setup[4] + 1; ld7032_memory_setup[17] = driver->oled.base.panel_height; - qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup)); + if (!qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup))) { + return false; + } uint8_t write_direction = 0; switch (rotation) { @@ -245,7 +255,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat painter_driver_t * pdriver = (painter_driver_t *)device; ld7032_comms_with_command_vtable_t *comms_vtable = (ld7032_comms_with_command_vtable_t *)pdriver->comms_vtable; - comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction); + if (!comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction)) { + return false; + } qp_ld7032_power(device, true); diff --git a/drivers/painter/sh1106/qp_sh1106.c b/drivers/painter/sh1106/qp_sh1106.c index 4117115aec..85da4a973a 100644 --- a/drivers/painter/sh1106/qp_sh1106.c +++ b/drivers/painter/sh1106/qp_sh1106.c @@ -71,8 +71,7 @@ __attribute__((weak)) bool qp_sh1106_init(painter_device_t device, painter_rotat sh1106_init_sequence[20] = 0x02; } - qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence)); - return true; + return qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence)); } // Screen flush diff --git a/drivers/painter/sh1107/qp_sh1107.c b/drivers/painter/sh1107/qp_sh1107.c index f4cbd49e40..0b48690803 100644 --- a/drivers/painter/sh1107/qp_sh1107.c +++ b/drivers/painter/sh1107/qp_sh1107.c @@ -73,8 +73,7 @@ __attribute__((weak)) bool qp_sh1107_init(painter_device_t device, painter_rotat sh1107_init_sequence[20] = 0x02; } - qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence)); - return true; + return qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence)); } // Screen flush diff --git a/drivers/painter/ssd1351/qp_ssd1351.c b/drivers/painter/ssd1351/qp_ssd1351.c index 3270a362c2..3f652e674e 100644 --- a/drivers/painter/ssd1351/qp_ssd1351.c +++ b/drivers/painter/ssd1351/qp_ssd1351.c @@ -44,7 +44,9 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota SSD1351_DISPLAYON, 5, 0, }; // clang-format on - qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -53,10 +55,10 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota [QP_ROTATION_180] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MX, [QP_ROTATION_270] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MV, }; - qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation]); - qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0); - - return true; + if (!qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation])) { + return false; + } + return qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/drivers/painter/st77xx/qp_st7735.c b/drivers/painter/st77xx/qp_st7735.c index 1db0d01dcb..9e3df477c8 100644 --- a/drivers/painter/st77xx/qp_st7735.c +++ b/drivers/painter/st77xx/qp_st7735.c @@ -63,7 +63,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat ST77XX_CMD_DISPLAY_ON, 20, 0 }; // clang-format on - qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -72,7 +74,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat [QP_ROTATION_180] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY, [QP_ROTATION_270] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY, }; - qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]); + if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) { + return false; + } #ifndef ST7735_NO_AUTOMATIC_VIEWPORT_OFFSETS st7735_automatic_viewport_offsets(device, rotation); diff --git a/drivers/painter/st77xx/qp_st7789.c b/drivers/painter/st77xx/qp_st7789.c index 855a9cc0c8..b4e24886da 100644 --- a/drivers/painter/st77xx/qp_st7789.c +++ b/drivers/painter/st77xx/qp_st7789.c @@ -60,7 +60,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat ST77XX_CMD_DISPLAY_ON, 20, 0 }; // clang-format on - qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence)); + if (!qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence))) { + return false; + } // Configure the rotation (i.e. the ordering and direction of memory writes in GRAM) const uint8_t madctl[] = { @@ -69,7 +71,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat [QP_ROTATION_180] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY, [QP_ROTATION_270] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY, }; - qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]); + if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) { + return false; + } #ifndef ST7789_NO_AUTOMATIC_VIEWPORT_OFFSETS st7789_automatic_viewport_offsets(device, rotation); diff --git a/quantum/painter/qp_comms.c b/quantum/painter/qp_comms.c index 63667783e1..402165b119 100644 --- a/quantum/painter/qp_comms.c +++ b/quantum/painter/qp_comms.c @@ -49,15 +49,15 @@ uint32_t qp_comms_send(painter_device_t device, const void *data, uint32_t byte_ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Comms APIs that use a D/C pin -void qp_comms_command(painter_device_t device, uint8_t cmd) { +bool qp_comms_command(painter_device_t device, uint8_t cmd) { painter_driver_t * driver = (painter_driver_t *)device; painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable; - comms_vtable->send_command(device, cmd); + return comms_vtable->send_command(device, cmd); } -void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) { +bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) { qp_comms_command(device, cmd); - qp_comms_send(device, &data, sizeof(data)); + return qp_comms_send(device, &data, sizeof(data)); } uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) { @@ -65,8 +65,8 @@ uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const vo return qp_comms_send(device, data, byte_count); } -void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { +bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) { painter_driver_t * driver = (painter_driver_t *)device; painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable; - comms_vtable->bulk_command_sequence(device, sequence, sequence_len); + return comms_vtable->bulk_command_sequence(device, sequence, sequence_len); } diff --git a/quantum/painter/qp_comms.h b/quantum/painter/qp_comms.h index 8fbf25c201..dc5892b1bb 100644 --- a/quantum/painter/qp_comms.h +++ b/quantum/painter/qp_comms.h @@ -19,7 +19,7 @@ uint32_t qp_comms_send(painter_device_t device, const void* data, uint32_t byte_ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Comms APIs that use a D/C pin -void qp_comms_command(painter_device_t device, uint8_t cmd); -void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data); +bool qp_comms_command(painter_device_t device, uint8_t cmd); +bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data); uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void* data, uint32_t byte_count); -void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len); +bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len); diff --git a/quantum/painter/qp_internal_driver.h b/quantum/painter/qp_internal_driver.h index 69da966f8c..5b6efe2c83 100644 --- a/quantum/painter/qp_internal_driver.h +++ b/quantum/painter/qp_internal_driver.h @@ -36,7 +36,7 @@ typedef struct painter_driver_vtable_t { typedef bool (*painter_driver_comms_init_func)(painter_device_t device); typedef bool (*painter_driver_comms_start_func)(painter_device_t device); -typedef void (*painter_driver_comms_stop_func)(painter_device_t device); +typedef bool (*painter_driver_comms_stop_func)(painter_device_t device); typedef uint32_t (*painter_driver_comms_send_func)(painter_device_t device, const void *data, uint32_t byte_count); typedef struct painter_comms_vtable_t { @@ -46,8 +46,8 @@ typedef struct painter_comms_vtable_t { painter_driver_comms_send_func comms_send; } painter_comms_vtable_t; -typedef void (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd); -typedef void (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len); +typedef bool (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd); +typedef bool (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len); typedef struct painter_comms_with_command_vtable_t { painter_comms_vtable_t base; // must be first, so this object can be cast from the painter_comms_vtable_t* type From ed343ddad4832a0a48c8ad794e949a595dcf3cfb Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:21:50 +0900 Subject: [PATCH 590/592] VIA Keylog Change (#25504) * WIP * Update via.c temptive fix in formatting for lint errors. * Update via.c let's try this one, thanks mobile GitHub app to not showing spaces right. * Update quantum/via.c Co-authored-by: Joel Challis * Update quantum/via.c Co-authored-by: Joel Challis * Merge branch 'qmk:master' into via_keylog_change --- quantum/via.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/quantum/via.c b/quantum/via.c index 9446811af6..130ff74794 100644 --- a/quantum/via.c +++ b/quantum/via.c @@ -37,6 +37,10 @@ #include "version.h" // for QMK_BUILDDATE used in EEPROM magic #include "nvm_via.h" +#if defined(SECURE_ENABLE) +# include "secure.h" +#endif + #if defined(AUDIO_ENABLE) # include "audio.h" #endif @@ -322,8 +326,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) { uint8_t rows = 28 / ((MATRIX_COLS + 7) / 8); uint8_t i = 2; for (uint8_t row = 0; row < rows && row + offset < MATRIX_ROWS; row++) { -#ifdef VIA_INSECURE +#if defined(VIA_INSECURE) matrix_row_t value = matrix_get_row(row + offset); +#elif defined(SECURE_ENABLE) + matrix_row_t value = 0; + if (secure_is_unlocked()) { + value = matrix_get_row(row + offset); + } #else matrix_row_t value = 0; #endif From a58d2dd7c9d0fcd5d86a1d63c7429af934c18f4c Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sat, 15 Nov 2025 18:39:35 +0100 Subject: [PATCH 591/592] wip --- keyboards/mkbd65/config.h | 19 +- keyboards/mkbd65/info.json | 16 -- keyboards/mkbd65/keyboard.json | 167 ++++++++++++++++++ keyboards/mkbd65/keymaps/ansi/README.md | 5 +- keyboards/mkbd65/keymaps/ansi/keymap.c | 1 + keyboards/mkbd65/keymaps/de/README.md | 5 +- keyboards/mkbd65/keymaps/en_us_intl/README.md | 5 +- keyboards/mkbd65/keymaps/iso/README.md | 1 + keyboards/mkbd65/rev0/mkbd65.c | 2 + keyboards/mkbd65/rev0/mkbd65.h | 2 - keyboards/mkbd65/rules.mk | 31 +++- 11 files changed, 219 insertions(+), 35 deletions(-) delete mode 100644 keyboards/mkbd65/info.json create mode 100644 keyboards/mkbd65/keyboard.json diff --git a/keyboards/mkbd65/config.h b/keyboards/mkbd65/config.h index 4ac3a7eaf5..4b3907c132 100644 --- a/keyboards/mkbd65/config.h +++ b/keyboards/mkbd65/config.h @@ -1,13 +1,12 @@ -// Copyright 2023 XenGi (@XenGi) +// Copyright 2023 XenGi // SPDX-License-Identifier: GPL-2.0-or-later -#pragma once +// optimize firmware +#undef LOCKING_SUPPORT_ENABLE +#undef LOCKING_RESYNC_ENABLE +#define LAYER_STATE_8BIT + +// disable features to save on code size +#define NO_ACTION_TAPPING +#define NO_ACTION_ONESHOT -// disable debugging -//#define NO_DEBUG -// disable printing/debugging using hid_listen -//#define NO_PRINT -// disable tap dance and other tapping features -//#define NO_ACTION_TAPPING -// disable one-shot modifiers -//#define NO_ACTION_ONESHOT diff --git a/keyboards/mkbd65/info.json b/keyboards/mkbd65/info.json deleted file mode 100644 index 7a2cd0c8f7..0000000000 --- a/keyboards/mkbd65/info.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "keyboard_name": "mkbd65", - "manufacturer": "XenGi", - "url": "https://mkbd65.xengi.de", - "maintainer": "XenGi", - "author": ["XenGi"], - "debounce": 5, - "diode_direction": "ROW2COL", - "bootmagic": { - "enabled": true, - "matrix": [0, 0] - }, - "tags": ["mobile", "65%"], - "description": "A mobile keyboard addon for modern smartphones. Fits any smartphones within some minimal size requirements. Supports any keyboard layout you want, as long as it doesn't need more keys.", - "short": "A mobile keyboard addon for modern smartphones." -} diff --git a/keyboards/mkbd65/keyboard.json b/keyboards/mkbd65/keyboard.json new file mode 100644 index 0000000000..3d1fe2ec2a --- /dev/null +++ b/keyboards/mkbd65/keyboard.json @@ -0,0 +1,167 @@ +{ + "manufacturer": "XenGi", + "keyboard_name": "mkbd65", + "maintainer": "XenGi", + "bootloader": "atmel-dfu", + "diode_direction": "ROW2COL", + "debounce": 5, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": false, + "rgblight": false + }, + "bootmagic": { + "enabled": true, + "matrix": [0, 0] + }, + "matrix_pins": { + "cols": ["D4", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5", "F4", "F1", "F0"], + "rows": ["D5", "D3", "D2", "D1", "D0"] + }, + "processor": "atmega32u4", + "url": "https://mkbd65.xengi.de", + "bootloader_instructions": "Press the button marked RESET on the back of the PCB", + "tags": ["mobile", "65%"], + "usb": { + "device_version": "0.0.1", + "pid": "0x4803", + "vid": "0x1209" + }, + "build": { + "lto": true + }, + "layouts": { + "LAYOUT": { + "layout_ansi": [ + { "matrix": [0, 0], "x": 0, "y": 0, "label": "Esc" }, + { "matrix": [0, 1], "x": 1, "y": 0, "label": "1" }, + { "matrix": [0, 2], "x": 2, "y": 0, "label": "2" }, + { "matrix": [0, 3], "x": 3, "y": 0, "label": "3" }, + { "matrix": [0, 4], "x": 4, "y": 0, "label": "4" }, + { "matrix": [0, 5], "x": 5, "y": 0, "label": "5" }, + { "matrix": [0, 6], "x": 6, "y": 0, "label": "6" }, + { "matrix": [0, 7], "x": 7, "y": 0, "label": "7" }, + { "matrix": [0, 8], "x": 8, "y": 0, "label": "8" }, + { "matrix": [0, 9], "x": 9, "y": 0, "label": "9" }, + { "matrix": [0, 10], "x": 10, "y": 0, "label": "0" }, + { "matrix": [0, 11], "x": 11, "y": 0, "w": 2, "label": "Backspace" }, + { "matrix": [1, 0], "x": 1, "y": 0, "label": "Q" }, + { "matrix": [1, 1], "x": 1, "y": 1, "label": "W" }, + { "matrix": [1, 2], "x": 1, "y": 2, "label": "E" }, + { "matrix": [1, 3], "x": 1, "y": 3, "label": "R" }, + { "matrix": [1, 4], "x": 1, "y": 4, "label": "T" }, + { "matrix": [1, 5], "x": 1, "y": 5, "label": "Y" }, + { "matrix": [1, 6], "x": 1, "y": 6, "label": "U" }, + { "matrix": [1, 7], "x": 1, "y": 7, "label": "I" }, + { "matrix": [1, 8], "x": 1, "y": 8, "label": "O" }, + { "matrix": [1, 9], "x": 1, "y": 9, "label": "P" }, + { "matrix": [1, 10], "x": 1, "y": 10, "label": "[" }, + { "matrix": [1, 11], "x": 1, "y": 11, "label": "]" }, + { "matrix": [1, 11], "x": 1, "y": 12, "label": "\\" }, + { "matrix": [2, 0], "x": 2, "y": 0, "label": "A" }, + { "matrix": [2, 1], "x": 2, "y": 1, "label": "S" }, + { "matrix": [2, 2], "x": 2, "y": 2, "label": "D" }, + { "matrix": [2, 3], "x": 2, "y": 3, "label": "F" }, + { "matrix": [2, 4], "x": 2, "y": 4, "label": "G" }, + { "matrix": [2, 5], "x": 2, "y": 5, "label": "H" }, + { "matrix": [2, 6], "x": 2, "y": 6, "label": "J" }, + { "matrix": [2, 7], "x": 2, "y": 7, "label": "K" }, + { "matrix": [2, 8], "x": 2, "y": 8, "label": "L" }, + { "matrix": [2, 9], "x": 2, "y": 9, "label": ";" }, + { "matrix": [2, 10], "x": 2, "y": 10, "label": "'" }, + { "matrix": [2, 11], "x": 2, "y": 11, "w": 2, "label": "Enter" }, + { "matrix": [3, 0], "x": 3, "y": 0, "label": "Z" }, + { "matrix": [3, 1], "x": 3, "y": 1, "label": "X" }, + { "matrix": [3, 2], "x": 3, "y": 2, "label": "C" }, + { "matrix": [3, 3], "x": 3, "y": 3, "label": "V" }, + { "matrix": [3, 4], "x": 3, "y": 4, "label": "B" }, + { "matrix": [3, 5], "x": 3, "y": 5, "label": "N" }, + { "matrix": [3, 6], "x": 3, "y": 6, "label": "M" }, + { "matrix": [3, 7], "x": 3, "y": 7, "label": "," }, + { "matrix": [3, 8], "x": 3, "y": 8, "label": "." }, + { "matrix": [3, 9], "x": 3, "y": 9, "label": "/" }, + { "matrix": [3, 10], "x": 3, "y": 10, "label": "Up" }, + { "matrix": [3, 11], "x": 3, "y": 11, "w": 2, "label": "ShiftR" }, + { "matrix": [4, 0], "x": 4, "y": 0, "label": "CtrlL" }, + { "matrix": [4, 1], "x": 4, "y": 1, "label": "Fn" }, + { "matrix": [4, 2], "x": 4, "y": 2, "label": "ShiftL" }, + { "matrix": [4, 3], "x": 4, "y": 3, "label": "Alt" }, + { "matrix": [4, 4], "x": 4, "y": 4, "w": 3, "label": "Space" }, + { "matrix": [4, 7], "x": 4, "y": 7, "label": "-" }, + { "matrix": [4, 8], "x": 4, "y": 8, "label": "=" }, + { "matrix": [4, 9], "x": 4, "y": 9, "label": "Left" }, + { "matrix": [4, 10], "x": 4, "y": 10, "label": "Down" }, + { "matrix": [4, 11], "x": 4, "y": 11, "label": "Right" }, + { "matrix": [4, 12], "x": 4, "y": 12, "label": "CtrlR" } + ], + "layout_iso": [ + { "matrix": [0, 0], "x": 0, "y": 0, "label": "Esc" }, + { "matrix": [0, 1], "x": 1, "y": 0, "label": "1" }, + { "matrix": [0, 2], "x": 2, "y": 0, "label": "2" }, + { "matrix": [0, 3], "x": 3, "y": 0, "label": "3" }, + { "matrix": [0, 4], "x": 4, "y": 0, "label": "4" }, + { "matrix": [0, 5], "x": 5, "y": 0, "label": "5" }, + { "matrix": [0, 6], "x": 6, "y": 0, "label": "6" }, + { "matrix": [0, 7], "x": 7, "y": 0, "label": "7" }, + { "matrix": [0, 8], "x": 8, "y": 0, "label": "8" }, + { "matrix": [0, 9], "x": 9, "y": 0, "label": "9" }, + { "matrix": [0, 10], "x": 10, "y": 0, "label": "0" }, + { "matrix": [0, 11], "x": 11, "y": 0, "w": 2, "label": "Backspace" }, + { "matrix": [1, 0], "x": 1, "y": 0, "label": "Q" }, + { "matrix": [1, 1], "x": 1, "y": 1, "label": "W" }, + { "matrix": [1, 2], "x": 1, "y": 2, "label": "E" }, + { "matrix": [1, 3], "x": 1, "y": 3, "label": "R" }, + { "matrix": [1, 4], "x": 1, "y": 4, "label": "T" }, + { "matrix": [1, 5], "x": 1, "y": 5, "label": "Y" }, + { "matrix": [1, 6], "x": 1, "y": 6, "label": "U" }, + { "matrix": [1, 7], "x": 1, "y": 7, "label": "I" }, + { "matrix": [1, 8], "x": 1, "y": 8, "label": "O" }, + { "matrix": [1, 9], "x": 1, "y": 9, "label": "P" }, + { "matrix": [1, 10], "x": 1, "y": 10, "label": "[" }, + { "matrix": [1, 11], "x": 1, "y": 11, "label": "]" }, + { "matrix": [2, 0], "x": 2, "y": 0, "label": "A" }, + { "matrix": [2, 1], "x": 2, "y": 1, "label": "S" }, + { "matrix": [2, 2], "x": 2, "y": 2, "label": "D" }, + { "matrix": [2, 3], "x": 2, "y": 3, "label": "F" }, + { "matrix": [2, 4], "x": 2, "y": 4, "label": "G" }, + { "matrix": [2, 5], "x": 2, "y": 5, "label": "H" }, + { "matrix": [2, 6], "x": 2, "y": 6, "label": "J" }, + { "matrix": [2, 7], "x": 2, "y": 7, "label": "K" }, + { "matrix": [2, 8], "x": 2, "y": 8, "label": "L" }, + { "matrix": [2, 9], "x": 2, "y": 9, "label": ";" }, + { "matrix": [2, 10], "x": 2, "y": 10, "label": "'" }, + { "matrix": [2, 11], "x": 2, "y": 11, "label": "\\" }, + { "matrix": [1, 12], "x": 1, "y": 12, "h": 2, "label": "Enter" }, + { "matrix": [3, 0], "x": 3, "y": 0, "label": "Z" }, + { "matrix": [3, 1], "x": 3, "y": 1, "label": "X" }, + { "matrix": [3, 2], "x": 3, "y": 2, "label": "C" }, + { "matrix": [3, 3], "x": 3, "y": 3, "label": "V" }, + { "matrix": [3, 4], "x": 3, "y": 4, "label": "B" }, + { "matrix": [3, 5], "x": 3, "y": 5, "label": "N" }, + { "matrix": [3, 6], "x": 3, "y": 6, "label": "M" }, + { "matrix": [3, 7], "x": 3, "y": 7, "label": "," }, + { "matrix": [3, 8], "x": 3, "y": 8, "label": "." }, + { "matrix": [3, 9], "x": 3, "y": 9, "label": "/" }, + { "matrix": [3, 10], "x": 3, "y": 10, "label": "Up" }, + { "matrix": [3, 11], "x": 3, "y": 11, "w": 2, "label": "ShiftR" }, + { "matrix": [4, 0], "x": 4, "y": 0, "label": "CtrlL" }, + { "matrix": [4, 1], "x": 4, "y": 1, "label": "Fn" }, + { "matrix": [4, 2], "x": 4, "y": 2, "label": "ShiftL" }, + { "matrix": [4, 3], "x": 4, "y": 3, "label": "Alt" }, + { "matrix": [4, 4], "x": 4, "y": 4, "w": 3, "label": "Space" }, + { "matrix": [4, 7], "x": 4, "y": 7, "label": "-" }, + { "matrix": [4, 8], "x": 4, "y": 8, "label": "=" }, + { "matrix": [4, 9], "x": 4, "y": 9, "label": "Left" }, + { "matrix": [4, 10], "x": 4, "y": 10, "label": "Down" }, + { "matrix": [4, 11], "x": 4, "y": 11, "label": "Right" }, + { "matrix": [4, 12], "x": 4, "y": 12, "label": "CtrlR" } + ] + } + } +} + diff --git a/keyboards/mkbd65/keymaps/ansi/README.md b/keyboards/mkbd65/keymaps/ansi/README.md index 96e8f7bb14..f68aaf41fc 100644 --- a/keyboards/mkbd65/keymaps/ansi/README.md +++ b/keyboards/mkbd65/keymaps/ansi/README.md @@ -39,7 +39,7 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ ║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║░░░░║ ║ ║ ║ ║ ║ ║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ @@ -49,10 +49,11 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ ║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` + diff --git a/keyboards/mkbd65/keymaps/ansi/keymap.c b/keyboards/mkbd65/keymaps/ansi/keymap.c index fb5f196098..b023feab91 100644 --- a/keyboards/mkbd65/keymaps/ansi/keymap.c +++ b/keyboards/mkbd65/keymaps/ansi/keymap.c @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H +#include "quantum.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_ansi( /* Base layer */ diff --git a/keyboards/mkbd65/keymaps/de/README.md b/keyboards/mkbd65/keymaps/de/README.md index f5c29d8e85..c37325f914 100644 --- a/keyboards/mkbd65/keymaps/de/README.md +++ b/keyboards/mkbd65/keymaps/de/README.md @@ -37,7 +37,7 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ║ ║ | ║ ║ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ║ ║ | ║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ ║ ║ ║ ║░░░░║ ║ \ ║ ║ ║ ║ ║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ @@ -47,10 +47,11 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣Supr║ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ^ ║ ║ ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ^ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╬════╣ ║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` + diff --git a/keyboards/mkbd65/keymaps/en_us_intl/README.md b/keyboards/mkbd65/keymaps/en_us_intl/README.md index 96e8f7bb14..f68aaf41fc 100644 --- a/keyboards/mkbd65/keymaps/en_us_intl/README.md +++ b/keyboards/mkbd65/keymaps/en_us_intl/README.md @@ -39,7 +39,7 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ ║ ║ ß ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ -║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ +║ ║ ║ ║ ║ ║ ║ µ ║ ║ ║ ¿ ║ ║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║░░░░║ ║ ║ ║ ║ ║ ║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ @@ -49,10 +49,11 @@ This is the key matrix (no label means the key from layer 0 will be used): ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╦════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ F11║ F12║ ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╩════╣ -║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ +║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ` ║ Super ║ ╠════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬════╬═════════╣ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║PgUp║ ║ ╠════╬════╬════╬════╬════╩════╩════╬════╬════╬════╬════╬════╦════╣ ║ ║░░░░║ ║ ║ Tab ║ ║ ║Pos1║PgDn║ End║ ║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` + diff --git a/keyboards/mkbd65/keymaps/iso/README.md b/keyboards/mkbd65/keymaps/iso/README.md index beb5cc2783..9a5f9b176f 100644 --- a/keyboards/mkbd65/keymaps/iso/README.md +++ b/keyboards/mkbd65/keymaps/iso/README.md @@ -52,3 +52,4 @@ It's actually just ANSI but with an upright `Enter` key. ║Ctrl║░░░░║Shft║AltG║ Tab ║ ║ ` ║Pos1║PgDn║ End║Ctrl║ ╚════╩════╩════╩════╩══════════════╩════╩════╩════╩════╩════╩════╝ ``` + diff --git a/keyboards/mkbd65/rev0/mkbd65.c b/keyboards/mkbd65/rev0/mkbd65.c index baca6508d4..2cde260fa0 100644 --- a/keyboards/mkbd65/rev0/mkbd65.c +++ b/keyboards/mkbd65/rev0/mkbd65.c @@ -2,3 +2,5 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "mkbd65.h" +#include "quantum.h" + diff --git a/keyboards/mkbd65/rev0/mkbd65.h b/keyboards/mkbd65/rev0/mkbd65.h index aae0d388fa..798a87ce44 100644 --- a/keyboards/mkbd65/rev0/mkbd65.h +++ b/keyboards/mkbd65/rev0/mkbd65.h @@ -4,8 +4,6 @@ #ifndef MKBD65_H #define MKBD65_H -#include "quantum.h" - /* LAYOUT_ansi * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ * │ │ │ │ │ │ │ │ │ │ │ │ 2.0U │ diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk index cc4a04ee68..da0535c8f2 100644 --- a/keyboards/mkbd65/rules.mk +++ b/keyboards/mkbd65/rules.mk @@ -1,6 +1,35 @@ +# build options +#LAYOUTS = [] + +# AVR MCU Options +MCU = atmega32u4 +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +BOOTLOADER = atmel-dfu + +# Feature Options +MAGIC_ENABLE = no +COMBO_ENABLE = no +AUDIO_ENABLE = no +KEY_OVERRIDE_ENABLE = no +LEADER_ENABLE = no +MIDI_ENABLE = no +UNICODE_ENABLE = no +BLUETOOTH_ENABLE = no +SPLIT_KEYBOARD = no +MUSIC_ENABLE = no +SPACE_CADET_ENABLE = no +GRAVE_ESC_ENABLE = yes +AVR_USE_MINIMAL_PRINTF = yes +ENCODER_ENABLE = no + DEFAULT_FOLDER = rev1 # Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can # significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). LTO_ENABLE = yes -EXTRAKEY_ENABLE = yes # Audio control and System control +# Audio control and System control +EXTRAKEY_ENABLE = yes + From f91cd00de8ff373d616bcbc7e5935a3cc66333ad Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sat, 15 Nov 2025 21:21:55 +0100 Subject: [PATCH 592/592] fix rev0 --- keyboards/mkbd65/rev0/info.json | 149 ------------------ keyboards/mkbd65/rev0/keyboard.json | 174 ++++++++++++++++++++++ keyboards/mkbd65/rev0/rules.mk | 2 - keyboards/mkbd65/rev1/info.json | 159 -------------------- keyboards/mkbd65/{ => rev1}/keyboard.json | 64 +++++--- keyboards/mkbd65/rules.mk | 16 -- 6 files changed, 216 insertions(+), 348 deletions(-) delete mode 100644 keyboards/mkbd65/rev0/info.json create mode 100644 keyboards/mkbd65/rev0/keyboard.json delete mode 100644 keyboards/mkbd65/rev1/info.json rename keyboards/mkbd65/{ => rev1}/keyboard.json (79%) diff --git a/keyboards/mkbd65/rev0/info.json b/keyboards/mkbd65/rev0/info.json deleted file mode 100644 index 5d2c940129..0000000000 --- a/keyboards/mkbd65/rev0/info.json +++ /dev/null @@ -1,149 +0,0 @@ -{ - "usb": { - "vid": "0x1209", - "pid": "0x4803", - "device_version": "0.0.0" - }, - "layouts": { - "LAYOUT_ansi": { - "layout": [ - {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, - {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, - {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, - {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, - {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, - {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, - {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, - {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, - {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, - {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, - {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, - {"x": 11, "y": 0, "w": 2, "label": "Backspace", "matrix": [0, 11]}, - - {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, - {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, - {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, - {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, - {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, - {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, - {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, - {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, - {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, - {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, - {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, - {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, - {"x": 12, "y": 1, "label": "\\", "matrix": [1, 12]}, - - {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, - {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, - {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, - {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, - {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, - {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, - {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, - {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, - {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, - {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, - {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, - {"x": 11, "y": 2, "w": 2, "label": "Enter", "matrix": [2, 11]}, - - {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, - {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, - {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, - {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, - {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, - {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, - {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, - {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, - {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, - {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, - {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, - {"x": 11, "y": 3, "w": 2, "label": "RShift", "matrix": [3, 11]}, - - {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, - {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, - {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, - {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, - {"x": 4, "y": 4, "w": 3, "label": "Space", "matrix": [4, 4]}, - {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, - {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, - {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, - {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, - {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, - {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} - ] - }, - "LAYOUT_iso": { - "layout": [ - {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, - {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, - {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, - {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, - {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, - {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, - {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, - {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, - {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, - {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, - {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, - {"x": 11, "y": 0, "w": 2, "label": "Backspace", "matrix": [0, 11]}, - - {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, - {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, - {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, - {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, - {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, - {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, - {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, - {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, - {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, - {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, - {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, - {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, - - {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, - {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, - {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, - {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, - {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, - {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, - {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, - {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, - {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, - {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, - {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, - {"x": 11, "y": 2, "label": "\\", "matrix": [2, 11]}, - {"x": 12, "y": 2, "h": 2, "label": "Enter", "matrix": [2, 12]}, - - {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, - {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, - {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, - {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, - {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, - {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, - {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, - {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, - {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, - {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, - {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, - {"x": 11, "y": 3, "w": 2, "label": "RShift", "matrix": [3, 11]}, - - {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, - {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, - {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, - {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, - {"x": 4, "y": 4, "w": 3, "label": "Space", "matrix": [4, 4]}, - {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, - {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, - {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, - {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, - {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, - {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} - ] - } - }, - "matrix_pins": { - "cols": ["D4", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5", "F4", "F1", "F0"], - "rows": ["D5", "D3", "D2", "D1", "D0"] - } -} diff --git a/keyboards/mkbd65/rev0/keyboard.json b/keyboards/mkbd65/rev0/keyboard.json new file mode 100644 index 0000000000..35269aaa5c --- /dev/null +++ b/keyboards/mkbd65/rev0/keyboard.json @@ -0,0 +1,174 @@ +{ + "manufacturer": "XenGi", + "keyboard_name": "mkbd65", + "maintainer": "XenGi", + "bootloader": "atmel-dfu", + "bootloader_instructions": "Press the button marked RESET on the back of the PCB", + "bootmagic": { + "enabled": true, + "matrix": [0, 0] + }, + "build": { + "lto": true + }, + "debounce": 5, + "diode_direction": "ROW2COL", + "encoder": { + "enabled": false + }, + "features": { + "bootmagic": true, + "command": false, + "console": false, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": false, + "rgblight": false + }, + "matrix_pins": { + "cols": ["D4", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5", "F4", "F1", "F0"], + "rows": ["D5", "D3", "D2", "D1", "D0"] + }, + "processor": "atmega32u4", + "split": { + "enabled": false + }, + "tags": ["mobile", "65%"], + "url": "https://mkbd65.xengi.de", + "usb": { + "device_version": "0.0.1", + "pid": "0x4803", + "vid": "0x1209" + }, + "layouts": { + "LAYOUT_ansi": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "Backspace", "matrix": [0, 11], "x": 11, "y": 0, "w": 2}, + {"label": "Q", "matrix": [1, 0], "x": 1, "y": 0}, + {"label": "W", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "E", "matrix": [1, 2], "x": 1, "y": 2}, + {"label": "R", "matrix": [1, 3], "x": 1, "y": 3}, + {"label": "T", "matrix": [1, 4], "x": 1, "y": 4}, + {"label": "Y", "matrix": [1, 5], "x": 1, "y": 5}, + {"label": "U", "matrix": [1, 6], "x": 1, "y": 6}, + {"label": "I", "matrix": [1, 7], "x": 1, "y": 7}, + {"label": "O", "matrix": [1, 8], "x": 1, "y": 8}, + {"label": "P", "matrix": [1, 9], "x": 1, "y": 9}, + {"label": "[", "matrix": [1, 10], "x": 1, "y": 10}, + {"label": "]", "matrix": [1, 11], "x": 1, "y": 11}, + {"label": "\\", "matrix": [1, 12], "x": 1, "y": 12}, + {"label": "A", "matrix": [2, 0], "x": 2, "y": 0}, + {"label": "S", "matrix": [2, 1], "x": 2, "y": 1}, + {"label": "D", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "F", "matrix": [2, 3], "x": 2, "y": 3}, + {"label": "G", "matrix": [2, 4], "x": 2, "y": 4}, + {"label": "H", "matrix": [2, 5], "x": 2, "y": 5}, + {"label": "J", "matrix": [2, 6], "x": 2, "y": 6}, + {"label": "K", "matrix": [2, 7], "x": 2, "y": 7}, + {"label": "L", "matrix": [2, 8], "x": 2, "y": 8}, + {"label": ";", "matrix": [2, 9], "x": 2, "y": 9}, + {"label": "'", "matrix": [2, 10], "x": 2, "y": 10}, + {"label": "Enter", "matrix": [2, 11], "x": 2, "y": 11, "w": 2}, + {"label": "Z", "matrix": [3, 0], "x": 3, "y": 0}, + {"label": "X", "matrix": [3, 1], "x": 3, "y": 1}, + {"label": "C", "matrix": [3, 2], "x": 3, "y": 2}, + {"label": "V", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "B", "matrix": [3, 4], "x": 3, "y": 4}, + {"label": "N", "matrix": [3, 5], "x": 3, "y": 5}, + {"label": "M", "matrix": [3, 6], "x": 3, "y": 6}, + {"label": ",", "matrix": [3, 7], "x": 3, "y": 7}, + {"label": ".", "matrix": [3, 8], "x": 3, "y": 8}, + {"label": "/", "matrix": [3, 9], "x": 3, "y": 9}, + {"label": "Up", "matrix": [3, 10], "x": 3, "y": 10}, + {"label": "ShiftR", "matrix": [3, 11], "x": 3, "y": 11, "w": 2}, + {"label": "CtrlL", "matrix": [4, 0], "x": 4, "y": 0}, + {"label": "Fn", "matrix": [4, 1], "x": 4, "y": 1}, + {"label": "ShiftL", "matrix": [4, 2], "x": 4, "y": 2}, + {"label": "Alt", "matrix": [4, 3], "x": 4, "y": 3}, + {"label": "Space", "matrix": [4, 4], "x": 4, "y": 4, "w": 3}, + {"label": "-", "matrix": [4, 7], "x": 4, "y": 7}, + {"label": "=", "matrix": [4, 8], "x": 4, "y": 8}, + {"label": "Left", "matrix": [4, 9], "x": 4, "y": 9}, + {"label": "Down", "matrix": [4, 10], "x": 4, "y": 10}, + {"label": "Right", "matrix": [4, 11], "x": 4, "y": 11}, + {"label": "CtrlR", "matrix": [4, 12], "x": 4, "y": 12} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "1", "matrix": [0, 1], "x": 1, "y": 0}, + {"label": "2", "matrix": [0, 2], "x": 2, "y": 0}, + {"label": "3", "matrix": [0, 3], "x": 3, "y": 0}, + {"label": "4", "matrix": [0, 4], "x": 4, "y": 0}, + {"label": "5", "matrix": [0, 5], "x": 5, "y": 0}, + {"label": "6", "matrix": [0, 6], "x": 6, "y": 0}, + {"label": "7", "matrix": [0, 7], "x": 7, "y": 0}, + {"label": "8", "matrix": [0, 8], "x": 8, "y": 0}, + {"label": "9", "matrix": [0, 9], "x": 9, "y": 0}, + {"label": "0", "matrix": [0, 10], "x": 10, "y": 0}, + {"label": "Backspace", "matrix": [0, 11], "x": 11, "y": 0, "w": 2}, + {"label": "Q", "matrix": [1, 0], "x": 1, "y": 0}, + {"label": "W", "matrix": [1, 1], "x": 1, "y": 1}, + {"label": "E", "matrix": [1, 2], "x": 1, "y": 2}, + {"label": "R", "matrix": [1, 3], "x": 1, "y": 3}, + {"label": "T", "matrix": [1, 4], "x": 1, "y": 4}, + {"label": "Y", "matrix": [1, 5], "x": 1, "y": 5}, + {"label": "U", "matrix": [1, 6], "x": 1, "y": 6}, + {"label": "I", "matrix": [1, 7], "x": 1, "y": 7}, + {"label": "O", "matrix": [1, 8], "x": 1, "y": 8}, + {"label": "P", "matrix": [1, 9], "x": 1, "y": 9}, + {"label": "[", "matrix": [1, 10], "x": 1, "y": 10}, + {"label": "]", "matrix": [1, 11], "x": 1, "y": 11}, + {"label": "A", "matrix": [2, 0], "x": 2, "y": 0}, + {"label": "S", "matrix": [2, 1], "x": 2, "y": 1}, + {"label": "D", "matrix": [2, 2], "x": 2, "y": 2}, + {"label": "F", "matrix": [2, 3], "x": 2, "y": 3}, + {"label": "G", "matrix": [2, 4], "x": 2, "y": 4}, + {"label": "H", "matrix": [2, 5], "x": 2, "y": 5}, + {"label": "J", "matrix": [2, 6], "x": 2, "y": 6}, + {"label": "K", "matrix": [2, 7], "x": 2, "y": 7}, + {"label": "L", "matrix": [2, 8], "x": 2, "y": 8}, + {"label": ";", "matrix": [2, 9], "x": 2, "y": 9}, + {"label": "'", "matrix": [2, 10], "x": 2, "y": 10}, + {"label": "\\", "matrix": [2, 11], "x": 2, "y": 11}, + {"label": "Enter", "matrix": [1, 12], "x": 1, "y": 12, "h": 2}, + {"label": "Z", "matrix": [3, 0], "x": 3, "y": 0}, + {"label": "X", "matrix": [3, 1], "x": 3, "y": 1}, + {"label": "C", "matrix": [3, 2], "x": 3, "y": 2}, + {"label": "V", "matrix": [3, 3], "x": 3, "y": 3}, + {"label": "B", "matrix": [3, 4], "x": 3, "y": 4}, + {"label": "N", "matrix": [3, 5], "x": 3, "y": 5}, + {"label": "M", "matrix": [3, 6], "x": 3, "y": 6}, + {"label": ",", "matrix": [3, 7], "x": 3, "y": 7}, + {"label": ".", "matrix": [3, 8], "x": 3, "y": 8}, + {"label": "/", "matrix": [3, 9], "x": 3, "y": 9}, + {"label": "Up", "matrix": [3, 10], "x": 3, "y": 10}, + {"label": "ShiftR", "matrix": [3, 11], "x": 3, "y": 11, "w": 2}, + {"label": "CtrlL", "matrix": [4, 0], "x": 4, "y": 0}, + {"label": "Fn", "matrix": [4, 1], "x": 4, "y": 1}, + {"label": "ShiftL", "matrix": [4, 2], "x": 4, "y": 2}, + {"label": "Alt", "matrix": [4, 3], "x": 4, "y": 3}, + {"label": "Space", "matrix": [4, 4], "x": 4, "y": 4, "w": 3}, + {"label": "-", "matrix": [4, 7], "x": 4, "y": 7}, + {"label": "=", "matrix": [4, 8], "x": 4, "y": 8}, + {"label": "Left", "matrix": [4, 9], "x": 4, "y": 9}, + {"label": "Down", "matrix": [4, 10], "x": 4, "y": 10}, + {"label": "Right", "matrix": [4, 11], "x": 4, "y": 11}, + {"label": "CtrlR", "matrix": [4, 12], "x": 4, "y": 12} + ] + } + } +} \ No newline at end of file diff --git a/keyboards/mkbd65/rev0/rules.mk b/keyboards/mkbd65/rev0/rules.mk index 2d23977af0..de2da8afe1 100644 --- a/keyboards/mkbd65/rev0/rules.mk +++ b/keyboards/mkbd65/rev0/rules.mk @@ -1,6 +1,4 @@ -MCU = atmega32u4 F_CPU = 16000000 ARCH = AVR8 F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -BOOTLOADER = atmel-dfu diff --git a/keyboards/mkbd65/rev1/info.json b/keyboards/mkbd65/rev1/info.json deleted file mode 100644 index 42ed48f137..0000000000 --- a/keyboards/mkbd65/rev1/info.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "usb": { - "vid": "0x1209", - "pid": "0x4803", - "device_version": "1.0.0" - }, - "layouts": { - "LAYOUT_en_us_intl": { - "layout": [ - {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, - {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, - {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, - {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, - {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, - {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, - {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, - {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, - {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, - {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, - {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, - {"x": 11, "y": 0, "label": "Backspace", "matrix": [0, 11]}, - {"x": 12, "y": 0, "label": "Backspace", "matrix": [0, 12]}, - - {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, - {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, - {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, - {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, - {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, - {"x": 5, "y": 1, "label": "Y", "matrix": [1, 5]}, - {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, - {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, - {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, - {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, - {"x": 10, "y": 1, "label": "[", "matrix": [1, 10]}, - {"x": 11, "y": 1, "label": "]", "matrix": [1, 11]}, - {"x": 12, "y": 1, "label": "\\", "matrix": [1, 12]}, - - {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, - {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, - {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, - {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, - {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, - {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, - {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, - {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, - {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, - {"x": 9, "y": 2, "label": ";", "matrix": [2, 9]}, - {"x": 10, "y": 2, "label": "'", "matrix": [2, 10]}, - {"x": 11, "y": 2, "label": "Enter", "matrix": [2, 11]}, - {"x": 12, "y": 2, "label": "Enter", "matrix": [2, 12]}, - - {"x": 0, "y": 3, "label": "Z", "matrix": [3, 0]}, - {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, - {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, - {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, - {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, - {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, - {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, - {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, - {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, - {"x": 9, "y": 3, "label": "/", "matrix": [3, 9]}, - {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, - {"x": 11, "y": 3, "label": "RShift", "matrix": [3, 11]}, - {"x": 12, "y": 3, "label": "RShift", "matrix": [3, 12]}, - - {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, - {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, - {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, - {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, - {"x": 4, "y": 4, "label": "Space", "matrix": [4, 4]}, - {"x": 5, "y": 4, "label": "Space", "matrix": [4, 5]}, - {"x": 6, "y": 4, "label": "Space", "matrix": [4, 6]}, - {"x": 7, "y": 4, "label": "-", "matrix": [4, 7]}, - {"x": 8, "y": 4, "label": "=", "matrix": [4, 8]}, - {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, - {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, - {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, - {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} - ] - }, - "LAYOUT_de": { - "layout": [ - {"x": 0, "y": 0, "label": "Esc", "matrix": [0, 0]}, - {"x": 1, "y": 0, "label": "1", "matrix": [0, 1]}, - {"x": 2, "y": 0, "label": "2", "matrix": [0, 2]}, - {"x": 3, "y": 0, "label": "3", "matrix": [0, 3]}, - {"x": 4, "y": 0, "label": "4", "matrix": [0, 4]}, - {"x": 5, "y": 0, "label": "5", "matrix": [0, 5]}, - {"x": 6, "y": 0, "label": "6", "matrix": [0, 6]}, - {"x": 7, "y": 0, "label": "7", "matrix": [0, 7]}, - {"x": 8, "y": 0, "label": "8", "matrix": [0, 8]}, - {"x": 9, "y": 0, "label": "9", "matrix": [0, 9]}, - {"x": 10, "y": 0, "label": "0", "matrix": [0, 10]}, - {"x": 11, "y": 0, "label": "Backspace", "matrix": [0, 11]}, - {"x": 12, "y": 0, "label": "Backspace", "matrix": [0, 12]}, - - {"x": 0, "y": 1, "label": "Q", "matrix": [1, 0]}, - {"x": 1, "y": 1, "label": "W", "matrix": [1, 1]}, - {"x": 2, "y": 1, "label": "E", "matrix": [1, 2]}, - {"x": 3, "y": 1, "label": "R", "matrix": [1, 3]}, - {"x": 4, "y": 1, "label": "T", "matrix": [1, 4]}, - {"x": 5, "y": 1, "label": "Z", "matrix": [1, 5]}, - {"x": 6, "y": 1, "label": "U", "matrix": [1, 6]}, - {"x": 7, "y": 1, "label": "I", "matrix": [1, 7]}, - {"x": 8, "y": 1, "label": "O", "matrix": [1, 8]}, - {"x": 9, "y": 1, "label": "P", "matrix": [1, 9]}, - {"x": 10, "y": 1, "label": "Ü", "matrix": [1, 10]}, - {"x": 11, "y": 1, "label": "+", "matrix": [1, 11]}, - {"x": 12, "y": 1, "label": "Enter", "matrix": [1, 12]}, - - {"x": 0, "y": 2, "label": "A", "matrix": [2, 0]}, - {"x": 1, "y": 2, "label": "S", "matrix": [2, 1]}, - {"x": 2, "y": 2, "label": "D", "matrix": [2, 2]}, - {"x": 3, "y": 2, "label": "F", "matrix": [2, 3]}, - {"x": 4, "y": 2, "label": "G", "matrix": [2, 4]}, - {"x": 5, "y": 2, "label": "H", "matrix": [2, 5]}, - {"x": 6, "y": 2, "label": "J", "matrix": [2, 6]}, - {"x": 7, "y": 2, "label": "K", "matrix": [2, 7]}, - {"x": 8, "y": 2, "label": "L", "matrix": [2, 8]}, - {"x": 9, "y": 2, "label": "Ö", "matrix": [2, 9]}, - {"x": 10, "y": 2, "label": "Ä", "matrix": [2, 10]}, - {"x": 11, "y": 2, "label": "#", "matrix": [2, 11]}, - {"x": 12, "y": 2, "label": "Enter", "matrix": [2, 12]}, - - {"x": 0, "y": 3, "label": "Y", "matrix": [3, 0]}, - {"x": 1, "y": 3, "label": "X", "matrix": [3, 1]}, - {"x": 2, "y": 3, "label": "C", "matrix": [3, 2]}, - {"x": 3, "y": 3, "label": "V", "matrix": [3, 3]}, - {"x": 4, "y": 3, "label": "B", "matrix": [3, 4]}, - {"x": 5, "y": 3, "label": "N", "matrix": [3, 5]}, - {"x": 6, "y": 3, "label": "M", "matrix": [3, 6]}, - {"x": 7, "y": 3, "label": ",", "matrix": [3, 7]}, - {"x": 8, "y": 3, "label": ".", "matrix": [3, 8]}, - {"x": 9, "y": 3, "label": "-", "matrix": [3, 9]}, - {"x": 10, "y": 3, "label": "Up", "matrix": [3, 10]}, - {"x": 11, "y": 3, "label": "<", "matrix": [3, 11]}, - {"x": 12, "y": 3, "label": "RShift", "matrix": [3, 12]}, - - {"x": 0, "y": 4, "label": "LCtrl", "matrix": [4, 0]}, - {"x": 1, "y": 4, "label": "LShift", "matrix": [4, 1]}, - {"x": 2, "y": 4, "label": "Fn", "matrix": [4, 2]}, - {"x": 3, "y": 4, "label": "AltGr", "matrix": [4, 3]}, - {"x": 4, "y": 4, "label": "Space", "matrix": [4, 4]}, - {"x": 5, "y": 4, "label": "Space", "matrix": [4, 5]}, - {"x": 6, "y": 4, "label": "Space", "matrix": [4, 6]}, - {"x": 7, "y": 4, "label": "ß", "matrix": [4, 7]}, - {"x": 8, "y": 4, "label": "´", "matrix": [4, 8]}, - {"x": 9, "y": 4, "label": "Left", "matrix": [4, 9]}, - {"x": 10, "y": 4, "label": "Down", "matrix": [4, 10]}, - {"x": 11, "y": 4, "label": "Right", "matrix": [4, 11]}, - {"x": 12, "y": 4, "label": "RCtrl", "matrix": [4, 12]} - ] - } - }, - "matrix_pins": { - "cols": ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "B2", "B10", "B11"], - "rows": ["B12", "B13", "B14", "B15", "A8"] - } -} diff --git a/keyboards/mkbd65/keyboard.json b/keyboards/mkbd65/rev1/keyboard.json similarity index 79% rename from keyboards/mkbd65/keyboard.json rename to keyboards/mkbd65/rev1/keyboard.json index 3d1fe2ec2a..2329e8bc52 100644 --- a/keyboards/mkbd65/keyboard.json +++ b/keyboards/mkbd65/rev1/keyboard.json @@ -20,15 +20,15 @@ "matrix": [0, 0] }, "matrix_pins": { - "cols": ["D4", "D7", "B4", "B5", "B6", "C6", "C7", "F7", "F6", "F5", "F4", "F1", "F0"], - "rows": ["D5", "D3", "D2", "D1", "D0"] + "cols": ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "B2", "B10", "B11"], + "rows": ["B12", "B13", "B14", "B15", "A8"] }, "processor": "atmega32u4", "url": "https://mkbd65.xengi.de", "bootloader_instructions": "Press the button marked RESET on the back of the PCB", "tags": ["mobile", "65%"], "usb": { - "device_version": "0.0.1", + "device_version": "1.0.0", "pid": "0x4803", "vid": "0x1209" }, @@ -36,8 +36,8 @@ "lto": true }, "layouts": { - "LAYOUT": { - "layout_ansi": [ + "LAYOUT_ansi": { + "layout": [ { "matrix": [0, 0], "x": 0, "y": 0, "label": "Esc" }, { "matrix": [0, 1], "x": 1, "y": 0, "label": "1" }, { "matrix": [0, 2], "x": 2, "y": 0, "label": "2" }, @@ -49,7 +49,9 @@ { "matrix": [0, 8], "x": 8, "y": 0, "label": "8" }, { "matrix": [0, 9], "x": 9, "y": 0, "label": "9" }, { "matrix": [0, 10], "x": 10, "y": 0, "label": "0" }, - { "matrix": [0, 11], "x": 11, "y": 0, "w": 2, "label": "Backspace" }, + { "matrix": [0, 11], "x": 11, "y": 0, "label": "Backspace" }, + { "matrix": [0, 12], "x": 12, "y": 0, "label": "Backspace" }, + { "matrix": [1, 0], "x": 1, "y": 0, "label": "Q" }, { "matrix": [1, 1], "x": 1, "y": 1, "label": "W" }, { "matrix": [1, 2], "x": 1, "y": 2, "label": "E" }, @@ -62,7 +64,8 @@ { "matrix": [1, 9], "x": 1, "y": 9, "label": "P" }, { "matrix": [1, 10], "x": 1, "y": 10, "label": "[" }, { "matrix": [1, 11], "x": 1, "y": 11, "label": "]" }, - { "matrix": [1, 11], "x": 1, "y": 12, "label": "\\" }, + { "matrix": [1, 12], "x": 1, "y": 12, "label": "\\" }, + { "matrix": [2, 0], "x": 2, "y": 0, "label": "A" }, { "matrix": [2, 1], "x": 2, "y": 1, "label": "S" }, { "matrix": [2, 2], "x": 2, "y": 2, "label": "D" }, @@ -74,7 +77,9 @@ { "matrix": [2, 8], "x": 2, "y": 8, "label": "L" }, { "matrix": [2, 9], "x": 2, "y": 9, "label": ";" }, { "matrix": [2, 10], "x": 2, "y": 10, "label": "'" }, - { "matrix": [2, 11], "x": 2, "y": 11, "w": 2, "label": "Enter" }, + { "matrix": [2, 11], "x": 2, "y": 11, "label": "Enter" }, + { "matrix": [2, 12], "x": 2, "y": 12, "label": "Enter" }, + { "matrix": [3, 0], "x": 3, "y": 0, "label": "Z" }, { "matrix": [3, 1], "x": 3, "y": 1, "label": "X" }, { "matrix": [3, 2], "x": 3, "y": 2, "label": "C" }, @@ -86,20 +91,26 @@ { "matrix": [3, 8], "x": 3, "y": 8, "label": "." }, { "matrix": [3, 9], "x": 3, "y": 9, "label": "/" }, { "matrix": [3, 10], "x": 3, "y": 10, "label": "Up" }, - { "matrix": [3, 11], "x": 3, "y": 11, "w": 2, "label": "ShiftR" }, - { "matrix": [4, 0], "x": 4, "y": 0, "label": "CtrlL" }, + { "matrix": [3, 11], "x": 3, "y": 11, "w": 2, "label": "RShift" }, + { "matrix": [3, 12], "x": 3, "y": 11, "w": 2, "label": "RShift" }, + + { "matrix": [4, 0], "x": 4, "y": 0, "label": "LCtrl" }, { "matrix": [4, 1], "x": 4, "y": 1, "label": "Fn" }, - { "matrix": [4, 2], "x": 4, "y": 2, "label": "ShiftL" }, + { "matrix": [4, 2], "x": 4, "y": 2, "label": "LShift" }, { "matrix": [4, 3], "x": 4, "y": 3, "label": "Alt" }, - { "matrix": [4, 4], "x": 4, "y": 4, "w": 3, "label": "Space" }, + { "matrix": [4, 4], "x": 4, "y": 4, "label": "Space" }, + { "matrix": [4, 5], "x": 4, "y": 5, "label": "Space" }, + { "matrix": [4, 6], "x": 4, "y": 6, "label": "Space" }, { "matrix": [4, 7], "x": 4, "y": 7, "label": "-" }, { "matrix": [4, 8], "x": 4, "y": 8, "label": "=" }, { "matrix": [4, 9], "x": 4, "y": 9, "label": "Left" }, { "matrix": [4, 10], "x": 4, "y": 10, "label": "Down" }, { "matrix": [4, 11], "x": 4, "y": 11, "label": "Right" }, - { "matrix": [4, 12], "x": 4, "y": 12, "label": "CtrlR" } - ], - "layout_iso": [ + { "matrix": [4, 12], "x": 4, "y": 12, "label": "RCtrl" } + ] + }, + "LAYOUT_iso": { + "layout": [ { "matrix": [0, 0], "x": 0, "y": 0, "label": "Esc" }, { "matrix": [0, 1], "x": 1, "y": 0, "label": "1" }, { "matrix": [0, 2], "x": 2, "y": 0, "label": "2" }, @@ -111,7 +122,9 @@ { "matrix": [0, 8], "x": 8, "y": 0, "label": "8" }, { "matrix": [0, 9], "x": 9, "y": 0, "label": "9" }, { "matrix": [0, 10], "x": 10, "y": 0, "label": "0" }, - { "matrix": [0, 11], "x": 11, "y": 0, "w": 2, "label": "Backspace" }, + { "matrix": [0, 11], "x": 11, "y": 0, "label": "Backspace" }, + { "matrix": [0, 12], "x": 12, "y": 0, "label": "Backspace" }, + { "matrix": [1, 0], "x": 1, "y": 0, "label": "Q" }, { "matrix": [1, 1], "x": 1, "y": 1, "label": "W" }, { "matrix": [1, 2], "x": 1, "y": 2, "label": "E" }, @@ -124,6 +137,8 @@ { "matrix": [1, 9], "x": 1, "y": 9, "label": "P" }, { "matrix": [1, 10], "x": 1, "y": 10, "label": "[" }, { "matrix": [1, 11], "x": 1, "y": 11, "label": "]" }, + { "matrix": [1, 12], "x": 1, "y": 12, "label": "Enter" }, + { "matrix": [2, 0], "x": 2, "y": 0, "label": "A" }, { "matrix": [2, 1], "x": 2, "y": 1, "label": "S" }, { "matrix": [2, 2], "x": 2, "y": 2, "label": "D" }, @@ -136,7 +151,8 @@ { "matrix": [2, 9], "x": 2, "y": 9, "label": ";" }, { "matrix": [2, 10], "x": 2, "y": 10, "label": "'" }, { "matrix": [2, 11], "x": 2, "y": 11, "label": "\\" }, - { "matrix": [1, 12], "x": 1, "y": 12, "h": 2, "label": "Enter" }, + { "matrix": [2, 12], "x": 2, "y": 12, "label": "Enter" }, + { "matrix": [3, 0], "x": 3, "y": 0, "label": "Z" }, { "matrix": [3, 1], "x": 3, "y": 1, "label": "X" }, { "matrix": [3, 2], "x": 3, "y": 2, "label": "C" }, @@ -148,18 +164,22 @@ { "matrix": [3, 8], "x": 3, "y": 8, "label": "." }, { "matrix": [3, 9], "x": 3, "y": 9, "label": "/" }, { "matrix": [3, 10], "x": 3, "y": 10, "label": "Up" }, - { "matrix": [3, 11], "x": 3, "y": 11, "w": 2, "label": "ShiftR" }, - { "matrix": [4, 0], "x": 4, "y": 0, "label": "CtrlL" }, + { "matrix": [3, 11], "x": 3, "y": 11, "label": "RShift" }, + { "matrix": [3, 12], "x": 3, "y": 12, "label": "RShift" }, + + { "matrix": [4, 0], "x": 4, "y": 0, "label": "LCtrl" }, { "matrix": [4, 1], "x": 4, "y": 1, "label": "Fn" }, - { "matrix": [4, 2], "x": 4, "y": 2, "label": "ShiftL" }, + { "matrix": [4, 2], "x": 4, "y": 2, "label": "LShift" }, { "matrix": [4, 3], "x": 4, "y": 3, "label": "Alt" }, - { "matrix": [4, 4], "x": 4, "y": 4, "w": 3, "label": "Space" }, + { "matrix": [4, 4], "x": 4, "y": 4, "label": "Space" }, + { "matrix": [4, 5], "x": 4, "y": 5, "label": "Space" }, + { "matrix": [4, 6], "x": 4, "y": 6, "label": "Space" }, { "matrix": [4, 7], "x": 4, "y": 7, "label": "-" }, { "matrix": [4, 8], "x": 4, "y": 8, "label": "=" }, { "matrix": [4, 9], "x": 4, "y": 9, "label": "Left" }, { "matrix": [4, 10], "x": 4, "y": 10, "label": "Down" }, { "matrix": [4, 11], "x": 4, "y": 11, "label": "Right" }, - { "matrix": [4, 12], "x": 4, "y": 12, "label": "CtrlR" } + { "matrix": [4, 12], "x": 4, "y": 12, "label": "RCtrl" } ] } } diff --git a/keyboards/mkbd65/rules.mk b/keyboards/mkbd65/rules.mk index da0535c8f2..3287da9fbd 100644 --- a/keyboards/mkbd65/rules.mk +++ b/keyboards/mkbd65/rules.mk @@ -1,35 +1,19 @@ -# build options -#LAYOUTS = [] - # AVR MCU Options -MCU = atmega32u4 F_CPU = 16000000 ARCH = AVR8 F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -BOOTLOADER = atmel-dfu # Feature Options MAGIC_ENABLE = no -COMBO_ENABLE = no AUDIO_ENABLE = no KEY_OVERRIDE_ENABLE = no LEADER_ENABLE = no MIDI_ENABLE = no UNICODE_ENABLE = no BLUETOOTH_ENABLE = no -SPLIT_KEYBOARD = no MUSIC_ENABLE = no SPACE_CADET_ENABLE = no GRAVE_ESC_ENABLE = yes AVR_USE_MINIMAL_PRINTF = yes -ENCODER_ENABLE = no - -DEFAULT_FOLDER = rev1 -# Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can -# significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). -LTO_ENABLE = yes - -# Audio control and System control -EXTRAKEY_ENABLE = yes