aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clangd2
-rw-r--r--builddefs/common_features.mk147
-rw-r--r--data/mappings/info_config.hjson1
-rw-r--r--data/schemas/community_module.jsonschema4
-rw-r--r--data/schemas/keyboard.jsonschema8
-rw-r--r--data/schemas/user_repo_v0.jsonschema4
-rw-r--r--data/schemas/user_repo_v1.jsonschema2
-rw-r--r--data/schemas/user_repo_v1_1.jsonschema2
-rw-r--r--docs/config_options.md1
-rw-r--r--docs/features/led_matrix.md2
-rw-r--r--docs/features/rgb_matrix.md4
-rw-r--r--docs/features/rgblight.md6
-rw-r--r--docs/reference_info_json.md22
-rw-r--r--docs/tap_hold.md83
-rw-r--r--drivers/bluetooth/bluefruit_le.cpp21
-rw-r--r--drivers/bluetooth/bluefruit_le.h4
-rw-r--r--drivers/sensors/pimoroni_trackball.c12
-rw-r--r--keyboards/adm42/rev4/keyboard.json1
-rw-r--r--keyboards/anavi/knobs3/keyboard.json3
-rw-r--r--keyboards/anavi/macropad10/keyboard.json3
-rw-r--r--keyboards/ashwing66/keyboard.json1
-rw-r--r--keyboards/ask55/keyboard.json2
-rw-r--r--keyboards/cannonkeys/link/config.h27
-rw-r--r--keyboards/cannonkeys/link/halconf.h7
-rw-r--r--keyboards/cannonkeys/link/keyboard.json135
-rw-r--r--keyboards/cannonkeys/link/keymaps/default/keymap.c31
-rw-r--r--keyboards/cannonkeys/link/link.c93
-rw-r--r--keyboards/cannonkeys/link/readme.md27
-rw-r--r--keyboards/cannonkeys/ripple/keyboard.json2
-rw-r--r--keyboards/cannonkeys/savage65/keyboard.json207
-rw-r--r--keyboards/cannonkeys/vida/config.h9
-rw-r--r--keyboards/cannonkeys/vida/hotswap/keyboard.json272
-rw-r--r--keyboards/cannonkeys/vida/hotswap/keymaps/default/keymap.c27
-rw-r--r--keyboards/cannonkeys/vida/info.json28
-rw-r--r--keyboards/cannonkeys/vida/readme.md31
-rw-r--r--keyboards/cannonkeys/vida/solderable/config.h7
-rw-r--r--keyboards/cannonkeys/vida/solderable/halconf.h8
-rw-r--r--keyboards/cannonkeys/vida/solderable/keyboard.json680
-rw-r--r--keyboards/cannonkeys/vida/solderable/keymaps/default/keymap.c27
-rw-r--r--keyboards/cannonkeys/vida/solderable/matrix_diagram.md24
-rw-r--r--keyboards/cannonkeys/vida/solderable/mcuconf.h9
-rw-r--r--keyboards/chickenman/ciel65/keyboard.json2
-rw-r--r--keyboards/clueboard/17/keyboard.json4
-rw-r--r--keyboards/clueboard/2x1800/2018/keyboard.json1
-rw-r--r--keyboards/clueboard/66/rev1/keyboard.json4
-rw-r--r--keyboards/clueboard/66/rev2/keyboard.json4
-rw-r--r--keyboards/clueboard/66/rev3/keyboard.json4
-rw-r--r--keyboards/clueboard/66/rev4/keyboard.json4
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/keyboard.json4
-rw-r--r--keyboards/clueboard/card/keyboard.json4
-rw-r--r--keyboards/djreisch/lumpy27/keyboard.json55
-rw-r--r--keyboards/djreisch/lumpy27/keymaps/default/keymap.c76
-rw-r--r--keyboards/djreisch/lumpy27/readme.md29
-rw-r--r--keyboards/eek/info.json1
-rw-r--r--keyboards/ein_60/keyboard.json1
-rw-r--r--keyboards/fs_streampad/keyboard.json3
-rw-r--r--keyboards/geekboards/macropad_v2/keyboard.json1
-rw-r--r--keyboards/ghs/jem/info.json2
-rw-r--r--keyboards/handwired/hnah40rgb/keyboard.json1
-rw-r--r--keyboards/handwired/promethium/config.h5
-rw-r--r--keyboards/handwired/promethium/promethium.c17
-rw-r--r--keyboards/handwired/promethium/rules.mk2
-rw-r--r--keyboards/hillside/46/0_1/keyboard.json1
-rw-r--r--keyboards/hillside/48/0_1/keyboard.json1
-rw-r--r--keyboards/hillside/52/0_1/keyboard.json1
-rw-r--r--keyboards/jaykeeb/kamigakushi/keyboard.json2
-rw-r--r--keyboards/jaykeeb/sriwedari70/keyboard.json2
-rw-r--r--keyboards/kbdfans/odinmini/keyboard.json1
-rw-r--r--keyboards/keycapsss/3w6_2040/keyboard.json1
-rw-r--r--keyboards/keyspensory/kp60/keyboard.json1
-rw-r--r--keyboards/kprepublic/jj50/rev2/keyboard.json1
-rw-r--r--keyboards/kradoindustries/promenade/keyboard.json75
-rw-r--r--keyboards/lxxt/keyboard.json2
-rw-r--r--keyboards/marcopad/keyboard.json3
-rw-r--r--keyboards/matrix/falcon/config.h1
-rw-r--r--keyboards/mechboards/crkbd/pro/keyboard.json3
-rw-r--r--keyboards/mechboards/lily58/pro/keyboard.json3
-rw-r--r--keyboards/mechboards/sofle/pro/keyboard.json3
-rw-r--r--keyboards/mechwild/bde/info.json3
-rw-r--r--keyboards/mechwild/bde/rev2/keyboard.json1
-rw-r--r--keyboards/mechwild/sugarglider/info.json2
-rw-r--r--keyboards/mk65/keyboard.json2
-rw-r--r--keyboards/mlego/m65/rev1/keyboard.json1
-rw-r--r--keyboards/mlego/m65/rev2/keyboard.json1
-rw-r--r--keyboards/mlego/m65/rev3/keyboard.json1
-rw-r--r--keyboards/mlego/m65/rev4/keyboard.json1
-rw-r--r--keyboards/momokai/aurora/keyboard.json1
-rw-r--r--keyboards/momokai/tap_duo/keyboard.json1
-rw-r--r--keyboards/momokai/tap_trio/keyboard.json1
-rw-r--r--keyboards/mwstudio/mw80/keyboard.json2
-rw-r--r--keyboards/nightly_boards/octopadplus/keyboard.json2
-rw-r--r--keyboards/pauperboards/brick/keyboard.json1
-rw-r--r--keyboards/plywrks/allaro/keyboard.json2
-rw-r--r--keyboards/preonic/config.h2
-rw-r--r--keyboards/prototypist/oceanographer/keyboard.json2
-rw-r--r--keyboards/rastersoft/minitkl/keyboard.json1
-rw-r--r--keyboards/reedskeebs/alish40/keyboard.json4
-rw-r--r--keyboards/rot13labs/veilid_sao/keyboard.json3
-rw-r--r--keyboards/rubi/lib/calc.c1
-rw-r--r--keyboards/salicylic_acid3/guide68/keyboard.json1
-rw-r--r--keyboards/sawnsprojects/eclipse/eclipse60/keyboard.json2
-rw-r--r--keyboards/sawnsprojects/eclipse/tinyneko/keyboard.json2
-rw-r--r--keyboards/shuguet/shu89/keyboard.json22
-rw-r--r--keyboards/sofle/keyhive/keyboard.json1
-rw-r--r--keyboards/sofle/keyhive/readme.md54
-rw-r--r--keyboards/sofle/keymaps/rgb_default/config.h124
-rw-r--r--keyboards/sofle/keymaps/rgb_default/keymap.c559
-rw-r--r--keyboards/sofle/keymaps/rgb_default/rules.mk7
-rw-r--r--keyboards/sofle/readme.md25
-rw-r--r--keyboards/sofle/rev1/readme.md27
-rwxr-xr-xkeyboards/splitkb/halcyon/kyria/rev4/keyboard.json3
-rw-r--r--keyboards/studiokestra/galatea/rev2/keyboard.json1
-rw-r--r--keyboards/studiokestra/galatea/rev3/keyboard.json1
-rw-r--r--keyboards/suikagiken/suika83opti/keyboard.json115
-rw-r--r--keyboards/suikagiken/suika83opti/keymaps/default/keymap.json24
-rw-r--r--keyboards/suikagiken/suika83opti/readme.md43
-rw-r--r--keyboards/system76/launch_1/keyboard.json4
-rw-r--r--keyboards/takashicompany/goat51/keyboard.json2
-rw-r--r--keyboards/takashicompany/spreadwriter/keyboard.json2
-rw-r--r--keyboards/tau4/keyboard.json1
-rw-r--r--keyboards/terrazzo/terrazzo.c1
-rw-r--r--keyboards/tokyokeyboard/alix40/config.h18
-rw-r--r--keyboards/tweetydabird/lbs4/keyboard.json3
-rw-r--r--keyboards/tweetydabird/lbs6/keyboard.json3
-rw-r--r--keyboards/tzarc/kobold/config.h29
-rw-r--r--keyboards/tzarc/kobold/halconf.h8
-rw-r--r--keyboards/tzarc/kobold/info.json82
-rw-r--r--keyboards/tzarc/kobold/keymaps/default/keymap.c14
-rw-r--r--keyboards/tzarc/kobold/kobold.c18
-rw-r--r--keyboards/tzarc/kobold/mcuconf.h12
-rw-r--r--keyboards/tzarc/kobold/r1/keyboard.json5
-rw-r--r--keyboards/tzarc/kobold/readme.md29
-rw-r--r--keyboards/vinhcatba/uncertainty/keyboard.json1
-rw-r--r--keyboards/void/voidhhkb_hotswap/keyboard.json97
-rw-r--r--keyboards/void/voidhhkb_hotswap/keymaps/default/keymap.c21
-rw-r--r--keyboards/void/voidhhkb_hotswap/readme.md29
-rw-r--r--keyboards/work_louder/micro/keyboard.json1
-rw-r--r--keyboards/work_louder/numpad/keyboard.json1
-rw-r--r--keyboards/work_louder/rgb_functions.c4
-rw-r--r--keyboards/ymdk/id75/f103/keyboard.json1
-rw-r--r--keyboards/ymdk/id75/info.json2
-rw-r--r--keyboards/ymdk/id75/readme.md4
-rw-r--r--keyboards/ymdk/id75/rp2040/config.h20
-rw-r--r--keyboards/ymdk/id75/rp2040/keyboard.json12
-rw-r--r--keyboards/yoichiro/lunakey_pico/keyboard.json4
m---------lib/pico-sdk0
-rw-r--r--lib/python/qmk/build_targets.py22
-rw-r--r--lib/python/qmk/cli/doctor/check.py26
-rwxr-xr-xlib/python/qmk/cli/generate/make_dependencies.py4
-rw-r--r--lib/python/qmk/cli/lint.py13
-rw-r--r--lib/python/qmk/commands.py3
-rw-r--r--lib/python/qmk/keymap.py11
-rw-r--r--platforms/chibios/converters/promicro_to_promicro_rp2040/pre_converter.mk6
-rw-r--r--platforms/chibios/errno.h13
-rw-r--r--quantum/action.c17
-rw-r--r--quantum/action.h6
-rw-r--r--quantum/action_tapping.c138
-rw-r--r--quantum/action_tapping.h57
-rw-r--r--quantum/dynamic_keymap.c2
-rw-r--r--quantum/eeconfig.c26
-rw-r--r--quantum/led_matrix/led_matrix.c1
-rw-r--r--quantum/pointing_device/pointing_device.c16
-rw-r--r--quantum/pointing_device/pointing_device.h10
-rw-r--r--quantum/process_keycode/process_caps_word.c7
-rw-r--r--quantum/process_keycode/process_leader.c6
-rw-r--r--quantum/process_keycode/process_repeat_key.c5
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c1
-rw-r--r--quantum/unicode/unicode.c1
-rw-r--r--quantum/via.c1
-rw-r--r--tests/caps_word/test.mk2
-rw-r--r--tests/caps_word/test_caps_word.cpp52
-rw-r--r--tests/repeat_key/test.mk1
-rw-r--r--tests/repeat_key/test_repeat_key.cpp33
-rw-r--r--tests/tap_hold_configurations/flow_tap/config.h (renamed from keyboards/sofle/keyhive/config.h)11
-rw-r--r--tests/tap_hold_configurations/flow_tap/test.mk18
-rw-r--r--tests/tap_hold_configurations/flow_tap/test_keymap.c23
-rw-r--r--tests/tap_hold_configurations/flow_tap/test_tap_hold.cpp313
-rw-r--r--tmk_core/protocol/report.h8
178 files changed, 3365 insertions, 1273 deletions
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
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index 802e01de43..ec856715b0 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
@@ -895,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/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/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema
index a237e210ce..feced00508 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"},
@@ -13,6 +13,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 eee2915fcb..4e8bae1084 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...
@@ -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"}
@@ -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",
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`
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` <Badge type="info">Number</Badge>
* 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` <Badge type="info">Number</Badge>
* 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` <Badge type="info">Number</Badge>
- * The number of speed adjustment steps.
+ * The value by which to increment the speed.
* Default: `16`
* `split_count` <Badge type="info">Array: Number</Badge>
* 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` <Badge type="info">Number</Badge>
- * 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` <Badge type="info">Number</Badge>
- * The number of brightness adjustment steps.
+ * The value by which to increment the brightness.
* Default: `17`
* `default`
* `animation` <Badge type="info">String</Badge>
@@ -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` <Badge type="info">Number</Badge>
- * The number of hue adjustment steps.
+ * The value by which to increment the hue.
* Default: `8`
* `layers`
* `blink` <Badge type="info">Boolean</Badge>
@@ -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` <Badge type="info">Number</Badge>
- * The number of saturation adjustment steps.
+ * The value by which to increment the suturation.
* Default: `17`
* `sleep` <Badge type="info">Boolean</Badge>
* Turn off the LEDs when the host goes to sleep.
@@ -645,7 +645,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
* `driver` <Badge type="info">String</Badge> <Badge>Required</Badge>
* 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` <Badge type="info">Number</Badge>
- * The number of hue adjustment steps.
+ * The value by which to increment the hue.
* Default: `8`
* `layout` <Badge type="info">Array: Object</Badge> <Badge>Required</Badge>
* 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` <Badge type="info">Number</Badge>
* 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` <Badge type="info">Number</Badge>
* 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` <Badge type="info">Number</Badge>
- * The number of saturation adjustment steps.
+ * The value by which to increment the saturation.
* Default: `16`
* `sleep` <Badge type="info">Boolean</Badge>
* Turn off the LEDs when the host goes to sleep.
* Default: `false`
* `speed_steps` <Badge type="info">Number</Badge>
- * The number of speed adjustment steps.
+ * The value by which to increment the speed.
* Default: `16`
* `split_count` <Badge type="info">Array: Number</Badge>
* 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` <Badge type="info">Number</Badge>
- * The number of brightness adjustment steps.
+ * The value by which to increment the brightness.
* Default: `16`
## Secure {#secure}
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&nbsp;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`&ndash;`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/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/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/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/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/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/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/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 <halconf.h>
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
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/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,63 +1,63 @@
{
- "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
+ "processor": "STM32F072",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
},
"rgblight": {
- "led_count": 20,
"animations": {
+ "alternating": true,
"breathing": true,
+ "christmas": true,
+ "knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
+ "rgb_test": true,
"snake": true,
- "knight": true,
- "christmas": true,
"static_gradient": true,
- "rgb_test": true,
- "alternating": true,
"twinkle": true
- }
- },
- "ws2812": {
- "pin": "B15",
- "driver": "spi"
+ },
+ "led_count": 20
},
- "processor": "STM32F072",
- "bootloader": "stm32-dfu",
- "features": {
- "bootmagic": true,
- "mousekey": true,
- "extrakey": true,
- "console": true,
- "command": true,
- "nkro": true,
- "backlight": true,
- "rgblight": true
+ "url": "https://cannonkeys.com",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x5A65",
+ "vid": "0xCA04"
},
- "qmk": {
- "locking": {
- "enabled": true,
- "resync": true
- }
+ "ws2812": {
+ "driver": "spi",
+ "pin": "B15"
},
- "community_layouts": ["65_ansi_blocker", "65_ansi_blocker_split_bs", "65_ansi_blocker_tsangan", "65_iso_blocker"],
+ "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_default": {
+ "LAYOUT_65_ansi_blocker": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
@@ -72,10 +72,8 @@
{"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, 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},
@@ -91,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},
@@ -104,12 +101,9 @@
{"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, 13], "x": 12.75, "y": 2, "w": 2.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, 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},
@@ -123,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},
@@ -135,7 +128,7 @@
{"matrix": [4, 15], "x": 15, "y": 4}
]
},
- "LAYOUT_65_ansi_blocker": {
+ "LAYOUT_65_ansi_blocker_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
@@ -150,9 +143,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},
+ {"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},
@@ -168,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},
@@ -183,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},
@@ -198,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},
@@ -210,7 +200,7 @@
{"matrix": [4, 15], "x": 15, "y": 4}
]
},
- "LAYOUT_65_ansi_blocker_split_bs": {
+ "LAYOUT_65_ansi_blocker_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
@@ -225,10 +215,8 @@
{"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, 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},
@@ -244,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},
@@ -259,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},
@@ -274,19 +260,17 @@
{"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, 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": {
+ "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
@@ -301,9 +285,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},
+ {"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},
@@ -319,7 +303,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 +317,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 +331,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.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},
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 <halconf.h>
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 <mcuconf.h>
+
+#undef RP_PWM_USE_PWM3
+#define RP_PWM_USE_PWM3 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/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 <http://www.gnu.org/licenses/>.
+ */
+
+#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
+
+
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/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/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/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 <http://www.gnu.org/licenses/>.
//#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/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/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},
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/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/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/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/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/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/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/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 <http://www.gnu.org/licenses/>.
#define AUDIO_VOICES
#define AUDIO_PIN C6
+#define AUDIO_INIT_DELAY
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
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/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/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 <math.h>
#include "rubi.h"
static uint8_t calc_current_operand = 0;
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/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},
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 <http://www.gnu.org/licenses/>.
-*/
- #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 <http://www.gnu.org/licenses/>.
- */
- // SOFLE RGB
-#include <stdio.h>
-
-#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).
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/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/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
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,
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/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 <http://www.gnu.org/licenses/>.
*/
+#include <math.h>
#include "terrazzo.h"
#ifdef LED_MATRIX_ENABLE
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 <james@quadcube.xyz>
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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
-
-/* Bluetooth */
-#define BATTERY_LEVEL_PIN B6
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/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 <halconf.h>
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 <mcuconf.h>
+
+// 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
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/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
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/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 <http://www.gnu.org/licenses/>.
*/
+#ifdef RGBLIGHT_ENABLE
+
#include "rgblight.h"
-#include "rgb_matrix.h"
-#ifdef RGBLIGHT_ENABLE
#undef WS2812_DI_PIN
#define WS2812_DI_PIN RGBLIGHT_DI_PIN
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 <http://www.gnu.org/licenses/>.
+ */
+
+#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"
+ }
+}
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,
diff --git a/lib/pico-sdk b/lib/pico-sdk
-Subproject a3398d8d3a772f37fef44a74743a1de69770e9c
+Subproject d0c5cac430cc955b65efa0e899748853d9a8092
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/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 <newlib.h>\nint main() { return __NEWLIB__ * __NEWLIB_MINOR__ * __NEWLIB_PATCHLEVEL__; }')
+ temp_in.write_text('#include <newlib.h>\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'
+
+ temp_in.write_text('int main() { return 0; }', encoding='utf-8')
- 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; }')
+ 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:
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/cli/lint.py b/lib/python/qmk/cli/lint.py
index bcf905f579..e2c76e4465 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)
@@ -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:
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
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:
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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
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 <errno.h>
+
+// 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
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/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..addc07ae53 100644
--- a/quantum/eeconfig.c
+++ b/quantum/eeconfig.c
@@ -2,16 +2,11 @@
#include <stdint.h>
#include <stdbool.h>
#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
@@ -103,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
@@ -117,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
@@ -150,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) {
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/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/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_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/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/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"
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
diff --git a/keyboards/sofle/keyhive/config.h b/tests/tap_hold_configurations/flow_tap/config.h
index cda0be789e..a17d488214 100644
--- a/keyboards/sofle/keyhive/config.h
+++ b/tests/tap_hold_configurations/flow_tap/config.h
@@ -1,6 +1,5 @@
-/* Copyright
- * 2021 solartempest
- * 2021 QMK
+/* 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
@@ -18,6 +17,6 @@
#pragma once
-// OLED settings
-#define OLED_TIMEOUT 80000
-#define OLED_BRIGHTNESS 90
+#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 <http://www.gnu.org/licenses/>.
+
+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);
+}
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