Merge remote-tracking branch 'upstream/develop'

This commit is contained in:
Nick Brassel 2025-05-26 21:41:49 +10:00
commit 75a037d2f0
No known key found for this signature in database
3274 changed files with 13777 additions and 11322 deletions

View File

@ -38,4 +38,4 @@ body:
- type: textarea
attributes:
label: Additional Context
description: Add any other relevant information about the problem here.
description: Add any other relevant information about the problem here.

27
.vscode/settings.json vendored
View File

@ -10,6 +10,13 @@
"**/*.uf2": true
},
"files.associations": {
// QMK Filetypes
"keyboard.json": "jsonc",
"info.json": "jsonc",
"keymap.json": "jsonc",
"qmk.json": "jsonc",
"qmk_module.json": "jsonc",
// Standard filetypes
"*.h": "c",
"*.c": "c",
"*.inc": "c",
@ -28,7 +35,23 @@
"[json]": {
"editor.formatOnSave": false
},
"clangd.arguments": [
"--header-insertion=never"
"clangd.arguments": ["--header-insertion=never"],
"json.schemas": [
{
"fileMatch": ["qmk.json"],
"url": "./data/schemas/user_repo_v1_1.jsonschema"
},
{
"fileMatch": ["qmk_module.json"],
"url": "./data/schemas/community_module.jsonschema"
},
{
"fileMatch": ["keyboard.json", "info.json"],
"url": "./data/schemas/keyboard.jsonschema"
},
{
"fileMatch": ["keymap.json"],
"url": "./data/schemas/keymap.jsonschema"
}
]
}

View File

@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
endif
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
ERROR_FILE := $(BUILD_DIR)/error_occurred

View File

@ -25,8 +25,6 @@ $(TEST_OUTPUT)_SRC := \
tests/test_common/test_driver.cpp \
tests/test_common/keyboard_report_util.cpp \
tests/test_common/mouse_report_util.cpp \
tests/test_common/keycode_util.cpp \
tests/test_common/keycode_table.cpp \
tests/test_common/test_fixture.cpp \
tests/test_common/test_keymap_key.cpp \
tests/test_common/test_logger.cpp \

View File

@ -11,6 +11,7 @@ endif
.DEFAULT_GOAL := all
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk
# Helper to add defines with a 'QMK_' prefix
@ -97,21 +98,12 @@ endif
# Pull in rules.mk files from all our subfolders
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
include $(KEYBOARD_PATH_5)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
include $(KEYBOARD_PATH_4)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
include $(KEYBOARD_PATH_3)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
include $(KEYBOARD_PATH_2)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
include $(KEYBOARD_PATH_1)/rules.mk
endif
-include $(KEYBOARD_PATH_5)/rules.mk
-include $(KEYBOARD_PATH_4)/rules.mk
-include $(KEYBOARD_PATH_3)/rules.mk
-include $(KEYBOARD_PATH_2)/rules.mk
-include $(KEYBOARD_PATH_1)/rules.mk
# Create dependencies on DD keyboard config - structure validated elsewhere
DD_CONFIG_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
@ -260,6 +252,9 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/
endif
# Community modules
COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
include $(COMMUNITY_RULES_MK)
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
@ -280,10 +275,19 @@ $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(D
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
include $(BUILDDEFS_PATH)/converters.mk
@ -487,21 +491,11 @@ ifneq ("$(CONVERTER)","")
endif
# Pull in post_rules.mk files from all our subfolders
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","")
include $(KEYBOARD_PATH_1)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","")
include $(KEYBOARD_PATH_2)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
include $(KEYBOARD_PATH_3)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","")
include $(KEYBOARD_PATH_4)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","")
include $(KEYBOARD_PATH_5)/post_rules.mk
endif
-include $(KEYBOARD_PATH_1)/post_rules.mk
-include $(KEYBOARD_PATH_2)/post_rules.mk
-include $(KEYBOARD_PATH_3)/post_rules.mk
-include $(KEYBOARD_PATH_4)/post_rules.mk
-include $(KEYBOARD_PATH_5)/post_rules.mk
define post_rules_mk_community_module_includer
ifneq ("$(wildcard $(1)/post_rules.mk)","")

View File

@ -7,6 +7,7 @@ endif
OPT = g
include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk
TARGET=test/$(TEST_OUTPUT)

View File

@ -30,6 +30,8 @@ QUANTUM_SRC += \
$(QUANTUM_DIR)/logging/sendchar.c \
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
include $(QUANTUM_DIR)/nvm/rules.mk
VPATH += $(QUANTUM_DIR)/logging
# Fall back to lib/printf if there is no platform provided print
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
@ -169,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 STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
# Wear-leveling EEPROM implementation, backed by MCU flash
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c
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
@ -263,18 +267,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
OPT_DEFS += -DHAL_USE_EFL
SRC += wear_leveling_efl.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
FLASH_DRIVER := spi
SRC += wear_leveling_flash_spi.c
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
SRC += wear_leveling_rp2040_flash.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
SRC += legacy_flash_ops.c wear_leveling_legacy.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
endif
endif
endif
@ -635,6 +635,11 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
TRI_LAYER_ENABLE := yes
endif
ifeq ($(strip $(RAW_ENABLE)), yes)
OPT_DEFS += -DRAW_ENABLE
SRC += raw_hid.c
endif
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
SEND_STRING_ENABLE := yes
endif
@ -717,6 +722,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes)
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
OPT_DEFS += -DLIB8_ATTINY
endif
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
endif
@ -888,19 +894,19 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_ENABLE
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
NO_USB_STARTUP_CHECK := yes
CONNECTION_ENABLE := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
SRC += outputselect.c process_connection.c
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
SPI_DRIVER_REQUIRED = yes
ANALOG_DRIVER_REQUIRED = yes
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
UART_DRIVER_REQUIRED = yes
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
endif
endif
@ -934,6 +940,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
endif
endif
VALID_BATTERY_DRIVER_TYPES := adc custom vendor
BATTERY_DRIVER ?= adc
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
endif
OPT_DEFS += -DBATTERY_DRIVER
OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/battery
SRC += battery.c
SRC += battery_$(strip $(BATTERY_DRIVER)).c
# add extra deps
ifeq ($(strip $(BATTERY_DRIVER)), adc)
ANALOG_DRIVER_REQUIRED = yes
endif
endif
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
WS2812_DRIVER ?= bitbang

View File

@ -168,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
# For a ChibiOS build, ensure that the board files have the hook overrides injected
define BOARDSRC_INJECT_HOOKS
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
endef
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
@ -289,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
ifneq ($$(VERBOSE_C_INCLUDE),)
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
endif
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
ifneq ($$(DUMP_C_MACROS),)
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
endif
@ -300,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
# Assemble: create object files from assembler source files.

View File

@ -1,10 +1,3 @@
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
# and should not be replicated for new boards. These will be removed from
# documentation as well as existing keymaps in due course.
ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
endif
ifneq (,$(filter $(MCU),atmega32u4))
# TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro

View File

@ -25,6 +25,7 @@ GENERIC_FEATURES = \
CAPS_WORD \
COMBO \
COMMAND \
CONNECTION \
CRC \
DEFERRED_EXEC \
DIGITIZER \
@ -34,6 +35,7 @@ GENERIC_FEATURES = \
DYNAMIC_TAPPING_TERM \
GRAVE_ESC \
HAPTIC \
KEYCODE_STRING \
KEY_LOCK \
KEY_OVERRIDE \
LAYER_LOCK \
@ -60,6 +62,7 @@ define HANDLE_GENERIC_FEATURE
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
OPT_DEFS += -D$1_ENABLE
endef

11
builddefs/support.mk Normal file
View File

@ -0,0 +1,11 @@
# Helper to determine if a compiler option is supported
# Args:
# $(1) = option to test, if successful will be output
# $(2) = option to use if $(1) is not supported
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
cc-option = $(shell \
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
then echo "$(1)"; else echo "$(2)"; fi)
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
, := ,

View File

@ -372,4 +372,4 @@
"label": "~",
}
}
}
}

View File

@ -629,4 +629,4 @@
"label": "(narrow non-breaking space)",
}
}
}
}

View File

@ -376,4 +376,4 @@
"label": "₢",
}
}
}
}

View File

@ -638,4 +638,4 @@
"label": "÷",
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": "?",
}
}
}
}

View File

@ -400,4 +400,4 @@
"label": "§",
}
}
}
}

View File

@ -432,4 +432,4 @@
"label": "*",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "µ",
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": ":",
}
}
}
}

View File

@ -314,4 +314,4 @@
"label": "@",
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": "\"",
}
}
}
}

View File

@ -364,4 +364,4 @@
"label": "ž",
}
}
}
}

View File

@ -593,4 +593,4 @@
"label": "…",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "µ",
}
}
}
}

View File

@ -364,4 +364,4 @@
"label": "¤",
}
}
}
}

View File

@ -620,4 +620,4 @@
"label": "≠",
}
}
}
}

View File

@ -673,4 +673,4 @@
"label": "±",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "µ",
}
}
}
}

View File

@ -653,4 +653,4 @@
"label": "—",
}
}
}
}

View File

@ -388,4 +388,4 @@
"label": "©",
}
}
}
}

View File

@ -344,4 +344,4 @@
"label": "÷",
}
}
}
}

View File

@ -432,4 +432,4 @@
"label": "*",
}
}
}
}

View File

@ -352,4 +352,4 @@
"label": "µ",
}
}
}
}

View File

@ -352,4 +352,4 @@
"label": "´ (dead)",
}
}
}
}

View File

@ -361,4 +361,4 @@
"label": "}",
}
}
}
}

View File

@ -681,4 +681,4 @@
"label": "—",
}
}
}
}

View File

@ -685,4 +685,4 @@
"label": "—",
}
}
}
}

View File

@ -327,4 +327,4 @@
"label": "_",
}
}
}
}

View File

@ -307,4 +307,4 @@
"label": "?",
}
}
}
}

View File

@ -437,4 +437,4 @@
"label": "¨ (dead)",
}
}
}
}

View File

@ -372,4 +372,4 @@
"label": "\\",
}
}
}
}

View File

@ -365,4 +365,4 @@
"label": "+",
}
}
}
}

View File

@ -214,4 +214,4 @@
"label": "(layer 4)",
}
}
}
}

View File

@ -113,4 +113,4 @@
"key": "NO_MU"
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": "?",
}
}
}
}

View File

@ -352,4 +352,4 @@
"label": "µ",
}
}
}
}

View File

@ -83,4 +83,4 @@
"key": "PV_U"
}
}
}
}

View File

@ -70,4 +70,4 @@
"key": "PD_U"
}
}
}
}

View File

@ -352,4 +352,4 @@
"label": "Ń",
}
}
}
}

View File

@ -352,4 +352,4 @@
"label": "€",
}
}
}
}

View File

@ -617,4 +617,4 @@
"label": "",
}
}
}
}

View File

@ -441,4 +441,4 @@
"label": "»",
}
}
}
}

View File

@ -288,4 +288,4 @@
"label": "₽",
}
}
}
}

View File

@ -304,4 +304,4 @@
"label": "€",
}
}
}
}

View File

@ -404,4 +404,4 @@
"label": "§",
}
}
}
}

View File

@ -440,4 +440,4 @@
"label": "}",
}
}
}
}

View File

@ -400,4 +400,4 @@
"label": "§",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "}",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "}",
}
}
}
}

View File

@ -340,4 +340,4 @@
"label": "`",
}
}
}
}

View File

@ -356,4 +356,4 @@
"label": "µ",
}
}
}
}

View File

@ -639,4 +639,4 @@
"label": "—",
}
}
}
}

View File

@ -637,4 +637,4 @@
"label": "—",
}
}
}
}

View File

@ -639,4 +639,4 @@
"label": "—",
}
}
}
}

View File

@ -637,4 +637,4 @@
"label": "—",
}
}
}
}

View File

@ -376,4 +376,4 @@
"label": "\\",
}
}
}
}

View File

@ -376,4 +376,4 @@
"label": "\\",
}
}
}
}

View File

@ -477,4 +477,4 @@
"label": "º",
}
}
}
}

View File

@ -372,4 +372,4 @@
"label": "` (dead)",
}
}
}
}

View File

@ -350,4 +350,4 @@
"label": "Á"
}
}
}
}

View File

@ -292,4 +292,4 @@
"label": "ґ",
}
}
}
}

View File

@ -585,4 +585,4 @@
"label": "̉ (dead)",
}
}
}
}

View File

@ -505,4 +505,4 @@
"label": "¢",
}
}
}
}

View File

@ -573,4 +573,4 @@
"label": "̉ (dead)",
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": "?",
}
}
}
}

View File

@ -299,4 +299,4 @@
"label": "?",
}
}
}
}

View File

@ -93,4 +93,4 @@
"key": "SAFE_RANGE"
}
}
}
}

View File

@ -225,4 +225,4 @@
]
}
}
}
}

View File

@ -246,4 +246,4 @@
]
}
}
}
}

View File

@ -225,4 +225,4 @@
]
}
}
}
}

View File

@ -37,4 +37,4 @@
"key": "SQ_SCLR"
}
}
}
}

View File

@ -17,4 +17,4 @@
]
}
}
}
}

View File

@ -248,4 +248,4 @@
]
}
}
}
}

View File

@ -66,4 +66,4 @@
]
}
}
}
}

View File

@ -0,0 +1,55 @@
{
pointing_device_init: {
ret_type: void
args: void
guard: defined(POINTING_DEVICE_ENABLE)
}
pointing_device_task: {
ret_type: report_mouse_t
args: report_mouse_t mouse_report
call_params: mouse_report
guard: defined(POINTING_DEVICE_ENABLE)
header: report.h
}
rgb_matrix_indicators: {
ret_type: bool
args: void
guard: defined(RGB_MATRIX_ENABLE)
header: rgb_matrix.h
}
rgb_matrix_indicators_advanced: {
ret_type: bool
args: uint8_t led_min, uint8_t led_max
call_params: led_min, led_max
guard: defined(RGB_MATRIX_ENABLE)
header: rgb_matrix.h
}
led_matrix_indicators: {
ret_type: bool
args: void
guard: defined(LED_MATRIX_ENABLE)
header: led_matrix.h
}
led_matrix_indicators_advanced: {
ret_type: bool
args: uint8_t led_min, uint8_t led_max
call_params: led_min, led_max
guard: defined(LED_MATRIX_ENABLE)
header: led_matrix.h
}
default_layer_state_set: {
ret_type: layer_state_t
args: layer_state_t state
call_params: state
guard: !defined(NO_ACTION_LAYER)
header: action_layer.h
}
layer_state_set: {
ret_type: layer_state_t
args: layer_state_t state
call_params: state
guard: !defined(NO_ACTION_LAYER)
header: action_layer.h
}
}

View File

@ -0,0 +1,3 @@
{
// This version exists to signify addition of LED/RGB effect support.
}

View File

@ -64,6 +64,9 @@
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
// host
"NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"},
// Layer locking
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
@ -201,6 +204,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"},
@ -214,7 +218,6 @@
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
// USB
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
@ -252,6 +255,7 @@
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
// Items we want flagged in lint
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},

View File

@ -0,0 +1,74 @@
{
"bootmagic": {
"matrix": [0, 0]
},
"backlight": {
"default": {
"on": true
},
"breathing_period": 6,
"levels": 3,
"on_state": 1
},
"debounce": 5,
"features": {
"command": false,
"console": false
},
"indicators": {
"on_state": 1
},
"led_matrix": {
"default": {
"animation": "solid",
"on": true,
"val": 255,
"speed": 128
},
"led_flush_limit": 16,
"max_brightness": 255,
"sleep": false,
"speed_steps": 16,
"val_steps": 16
},
"rgblight": {
"default": {
"animation": "static_light",
"on": true,
"hue": 0,
"sat": 255,
"val": 255,
"speed": 0
},
"brightness_steps": 17,
"hue_steps": 8,
"max_brightness": 255,
"saturation_steps": 17,
"sleep": false
},
"rgb_matrix": {
"default": {
"animation": "cycle_left_right",
"on": true,
"hue": 0,
"sat": 255,
"val": 255,
"speed": 128
},
"hue_steps": 8,
"led_flush_limit": 16,
"max_brightness": 255,
"sat_steps": 16,
"sleep": false,
"speed_steps": 16,
"val_steps": 16
},
"split": {
"serial": {
"driver": "bitbang"
}
},
"ws2812": {
"driver": "bitbang"
}
}

View File

@ -53,8 +53,8 @@
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
// Items we want flagged in lint
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
"CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
"CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
}

View File

@ -146,6 +146,9 @@
"daisy": {
"target": "ktec/daisy"
},
"deemen17/de60": {
"target": "deemen17/de60/r1"
},
"dp3000": {
"target": "dp3000/rev1"
},
@ -347,6 +350,9 @@
"keycapsss/plaid_pad": {
"target": "keycapsss/plaid_pad/rev1"
},
"keyten/kt60hs_t": {
"target": "keyten/kt60hs_t/v1"
},
"kira75": {
"target": "kira/kira75"
},
@ -581,6 +587,9 @@
"ploopyco/trackball": {
"target": "ploopyco/trackball/rev1_005"
},
"plywrks/ply8x": {
"target": "plywrks/ply8x/solder"
},
"polilla": {
"target": "polilla/rev1"
},
@ -1033,7 +1042,7 @@
"target": "kprepublic/bm68hsrgb/rev1"
},
"late9/rev1": {
"target": "rookiebwoy/late9/rev1"
"target": "ivndbt/late9/rev1"
},
"latin17rgb": {
"target": "latincompass/latin17rgb"
@ -1198,7 +1207,7 @@
"target": "spaceholdings/nebula68b"
},
"neopad/rev1": {
"target": "rookiebwoy/neopad/rev1"
"target": "ivndbt/neopad/rev1"
},
"niu_mini": {
"target": "kbdfans/niu_mini"
@ -2095,10 +2104,16 @@
"target": "rmi_kb/wete/v2"
},
"rookiebwoy/late9": {
"target": "rookiebwoy/late9/rev1"
"target": "ivndbt/late9/rev1"
},
"rookiebwoy/neopad": {
"target": "rookiebwoy/neopad/rev1"
"target": "ivndbt/neopad/rev1"
},
"ivndbt/late9": {
"target": "ivndbt/late9/rev1"
},
"ivndbt/neopad": {
"target": "ivndbt/neopad/rev1"
},
"rura66": {
"target": "rura66/rev1"

View File

@ -1,7 +1,7 @@
{
"$id": "qmk.api.keyboard.v1",
"allOf": [
{"$ref": "qmk.keyboard.v1"},
{"$ref": "./keyboard.jsonschema#"},
{
"properties": {
"keymaps": {
@ -10,8 +10,8 @@
"url": {"type": "string"}
}
},
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"},
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"},
"parse_errors": {"$ref": "./definitions.jsonschema#/string_array"},
"parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"},
"processor_type": {"type": "string"},
"protocol": {"type": "string"},
"keyboard_folder": {"type": "string"},

View File

@ -5,13 +5,14 @@
"type": "object",
"required": ["module_name", "maintainer"],
"properties": {
"module_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
"module_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"license": {"type": "string"},
"url": {
"type": "string",
"format": "uri"
},
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
"features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"}
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"}
}
}

View File

@ -17,9 +17,9 @@
"additionalProperties": false,
"required": ["pin_a", "pin_b"],
"properties": {
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
}
}
@ -28,22 +28,22 @@
"dip_switch_config": {
"type": "object",
"properties": {
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
}
},
"features_config": {
"$ref": "qmk.definitions.v1#/boolean_array",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
"$ref": "./definitions.jsonschema#/boolean_array",
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"not": {"required": ["lto"]}
}
},
"type": "object",
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
"properties": {
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"},
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"url": {
"type": "string",
"format": "uri"
@ -84,6 +84,7 @@
"STM32F407",
"STM32F411",
"STM32F446",
"STM32G0B1",
"STM32G431",
"STM32G474",
"STM32H723",
@ -118,8 +119,8 @@
"type": "object",
"additionalProperties": false,
"properties": {
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"default_brightness": {
"type": "integer",
"minimum": 0,
@ -144,13 +145,13 @@
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
},
"macro_beep": {"type": "boolean"},
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"power_control": {
"type": "object",
"additionalProperties": false,
"properties": {
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
}
},
"voices": {"type": "boolean"}
@ -170,20 +171,20 @@
"properties": {
"on": {"type": "boolean"},
"breathing": {"type": "boolean"},
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
},
"breathing": {"type": "boolean"},
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"levels": {
"type": "integer",
"minimum": 1,
"maximum": 31
},
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
"as_caps_lock": {"type": "boolean"}
}
},
@ -268,7 +269,7 @@
"type": "string",
"enum": ["COL2ROW", "ROW2COL"]
},
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"caps_word": {
"type": "object",
"additionalProperties": false,
@ -276,20 +277,20 @@
"enabled": {"type": "boolean"},
"both_shifts_turns_on": {"type": "boolean"},
"double_tap_shift_turns_on": {"type": "boolean"},
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"invert_on_shift": {"type": "boolean"}
}
},
"combo": {
"type": "object",
"properties": {
"count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"community_layouts": {
"type": "array",
"items": {"$ref": "qmk.definitions.v1#/filename"}
"items": {"$ref": "./definitions.jsonschema#/filename"}
},
"dip_switch": {
"$ref": "#/definitions/dip_switch_config",
@ -319,10 +320,10 @@
"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"}
"backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
}
}
@ -337,12 +338,12 @@
"indicators": {
"type": "object",
"properties": {
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
"caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"compose": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"kana": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"on_state": {"$ref": "./definitions.jsonschema#/bit"}
}
},
"joystick": {
@ -350,8 +351,8 @@
"properties": {
"enabled": {"type": "boolean"},
"driver": {"type": "string"},
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"axes": {
"type": "object",
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]},
@ -360,10 +361,10 @@
{
"type": "object",
"properties": {
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"low": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"rest": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"high": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
{
@ -375,20 +376,20 @@
}
}
},
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"layer_lock": {
"type": "object",
"properties": {
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"layout_aliases": {
"type": "object",
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
"additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"}
},
"layouts": {
"type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
"propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"},
"additionalProperties": {
"type": "object",
"additionalProperties": false,
@ -403,7 +404,7 @@
"additionalProperties": false,
"required": ["x", "y"],
"properties": {
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"label": {
"type": "string",
"pattern": "^[^\\n]*$"
@ -417,13 +418,13 @@
"minimum": 0
}
},
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
"w": {"$ref": "qmk.definitions.v1#/key_unit"},
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
"r": {"$ref": "./definitions.jsonschema#/signed_decimal"},
"rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
"ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
"h": {"$ref": "./definitions.jsonschema#/key_unit"},
"w": {"$ref": "./definitions.jsonschema#/key_unit"},
"x": {"$ref": "./definitions.jsonschema#/key_unit"},
"y": {"$ref": "./definitions.jsonschema#/key_unit"},
"hand": {
"type": "string",
"enum": ["L", "R", "*"]
@ -443,12 +444,24 @@
}
}
},
"host": {
"type": "object",
"properties": {
"default": {
"type": "object",
"additionalProperties": false,
"properties": {
"nkro": {"type": "boolean"}
}
}
}
},
"leader_key": {
"type": "object",
"properties": {
"timing": {"type": "boolean"},
"strict_processing": {"type": "boolean"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"matrix_pins": {
@ -458,14 +471,14 @@
"custom": {"type": "boolean"},
"custom_lite": {"type": "boolean"},
"ghost": {"type": "boolean"},
"input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"direct": {
"type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
},
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
}
},
"modules": {
@ -478,18 +491,18 @@
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
},
"oneshot": {
"type": "object",
"properties": {
"tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"led_matrix": {
@ -497,7 +510,7 @@
"properties": {
"animations": {
"type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"}
},
"default": {
@ -506,8 +519,8 @@
"properties": {
"on": {"type": "boolean"},
"animation": {"type": "string"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
},
"driver": {
@ -533,27 +546,28 @@
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
},
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"react_on_keyup": {"type": "boolean"},
"sleep": {"type": "boolean"},
"split_count": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
},
"layout": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["x", "y"],
"properties": {
"matrix": {
"type": "array",
@ -564,9 +578,9 @@
"minimum": 0
}
},
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
}
}
@ -577,7 +591,7 @@
"properties": {
"animations": {
"type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"}
},
"default": {
@ -586,10 +600,10 @@
"properties": {
"on": {"type": "boolean"},
"animation": {"type": "string"},
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
},
"driver": {
@ -617,29 +631,30 @@
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
},
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"react_on_keyup": {"type": "boolean"},
"sleep": {"type": "boolean"},
"split_count": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
},
"layout": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["x", "y"],
"properties": {
"matrix": {
"type": "array",
@ -650,9 +665,9 @@
"minimum": 0
}
},
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
}
}
@ -664,27 +679,27 @@
"properties": {
"animations": {
"type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"}
},
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"default": {
"type": "object",
"additionalProperties": false,
"properties": {
"on": {"type": "boolean"},
"animation": {"type": "string"},
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}
},
"driver": {
"type": "string",
"enum": ["apa102", "custom", "ws2812"]
},
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"layers": {
"type": "object",
"additionalProperties": false,
@ -699,29 +714,29 @@
"override_rgb": {"type": "boolean"}
}
},
"led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_map": {
"type": "array",
"minItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
},
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"pin": {
"$ref": "qmk.definitions.v1#/mcu_pin",
"$ref": "./definitions.jsonschema#/mcu_pin",
"$comment": "Deprecated: use ws2812.pin instead"
},
"rgbw": {
"type": "boolean",
"$comment": "Deprecated: use ws2812.rgbw instead"
},
"saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sleep": {"type": "boolean"},
"split": {"type": "boolean"},
"split_count": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
}
},
@ -730,8 +745,8 @@
"additionalProperties": false,
"properties": {
"enabled": {"type": "boolean"},
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"unlock_sequence": {
"type": "array",
"minItems": 1,
@ -765,8 +780,8 @@
"properties": {
"enabled": {"type": "boolean"},
"mouse_enabled": {"type": "boolean"},
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"driver": {
"type": "string",
"enum": ["busywait", "interrupt", "usart", "vendor"]
@ -803,11 +818,11 @@
"properties": {
"direct": {
"type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
},
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
"unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
}
}
}
@ -834,16 +849,16 @@
"type": "object",
"additionalProperties": false,
"properties": {
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"matrix_grid": {
"$ref": "qmk.definitions.v1#/mcu_pin_array",
"$ref": "./definitions.jsonschema#/mcu_pin_array",
"minItems": 2,
"maxItems": 2
}
}
},
"soft_serial_pin": {
"$ref": "qmk.definitions.v1#/mcu_pin",
"$ref": "./definitions.jsonschema#/mcu_pin",
"$comment": "Deprecated: use split.serial.pin instead"
},
"soft_serial_speed": {
@ -859,7 +874,7 @@
"type": "string",
"enum": ["bitbang", "usart", "vendor"]
},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
}
},
"transport": {
@ -887,7 +902,7 @@
}
},
"watchdog": {"type": "boolean"},
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sync_matrix_state": {
"type": "boolean",
"$comment": "Deprecated: use sync.matrix_state instead"
@ -903,8 +918,8 @@
"additionalProperties": false,
"properties": {
"enabled": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"main": {
@ -914,7 +929,7 @@
},
"matrix_grid": {
"type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"items": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
}
}
@ -936,9 +951,9 @@
"permissive_hold_per_key": {"type": "boolean"},
"retro": {"type": "boolean"},
"retro_per_key": {"type": "boolean"},
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"term_per_key": {"type": "boolean"},
"toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
},
"usb": {
@ -946,16 +961,20 @@
"additionalProperties": false,
"properties": {
"device_ver": {
"$ref": "qmk.definitions.v1#/hex_number_4d",
"$ref": "./definitions.jsonschema#/hex_number_4d",
"$comment": "Deprecated: use device_version instead"
},
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
"force_nkro": {"type": "boolean"},
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"device_version": {"$ref": "./definitions.jsonschema#/bcd_version"},
"force_nkro": {
"type": "boolean",
"$comment": "Deprecated: use host.default.nkro instead"
},
"pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
"vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
"max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"no_startup_check": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"shared_endpoint": {
"type": "object",
"additionalProperties": false,
@ -964,7 +983,7 @@
"mouse": {"type": "boolean"}
}
},
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"wait_for_enumeration": {"type": "boolean"}
}
},
@ -972,9 +991,9 @@
"type": "object",
"additionalProperties": false,
"properties": {
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"locking": {
"type": "object",
"additionalProperties": false,
@ -989,10 +1008,10 @@
"type": "object",
"additionalProperties": false,
"properties": {
"esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"led": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"}
"esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"led": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"}
}
},
"ws2812": {
@ -1003,10 +1022,10 @@
"type": "string",
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"rgbw": {"type": "boolean"},
"i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"},
"i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
"i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"},
"i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}
}
}

View File

@ -30,10 +30,10 @@
"keycodes": {
"type": "object",
"propertyNames": {
"$ref": "qmk.definitions.v1#/hex_number_4d"
"$ref": "./definitions.jsonschema#/hex_number_4d"
},
"additionalProperties": {
"type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed
"type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed
"required": [
"key"
],

View File

@ -10,10 +10,10 @@
"minLength": 1,
"pattern": "^[a-z][0-9a-z_]*$"
},
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
"layout": {"$ref": "qmk.definitions.v1#/layout_macro"},
"host_language": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keymap": {"$ref": "./definitions.jsonschema#/text_identifier"},
"layout": {"$ref": "./definitions.jsonschema#/layout_macro"},
"layers": {
"type": "array",
"items": {
@ -55,11 +55,11 @@
"keycodes": {
"type": "array",
"items": {
"$ref": "qmk.definitions.v1#/text_identifier"
"$ref": "./definitions.jsonschema#/text_identifier"
}
},
"duration": {
"$ref": "qmk.definitions.v1#/unsigned_int"
"$ref": "./definitions.jsonschema#/unsigned_int"
}
}
}
@ -67,8 +67,8 @@
}
}
},
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
"config": {"$ref": "qmk.keyboard.v1"},
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"config": {"$ref": "./keyboard.jsonschema#"},
"notes": {
"type": "string"
},

View File

@ -6,8 +6,8 @@
"definitions": {
"build_target": {
"oneOf": [
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
{"$ref": "qmk.definitions.v1#/json_file_path"}
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
{"$ref": "./definitions.jsonschema#/json_file_path"}
]
}
},

View File

@ -6,9 +6,9 @@
"definitions": {
"build_target": {
"oneOf": [
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
{"$ref": "qmk.definitions.v1#/json_file_path"}
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
{"$ref": "./definitions.jsonschema#/keyboard_keymap_env"},
{"$ref": "./definitions.jsonschema#/json_file_path"}
]
}
},

View File

@ -14,8 +14,6 @@
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true

299
docs/ChangeLog/20250525.md Normal file
View File

@ -0,0 +1,299 @@
# QMK Breaking Changes - 2025 May 25 Changelog
## Notable Features
### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
See the [Flow Tap documentation](../tap_hold#flow-tap) for more information.
### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187))
Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks.
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
## Changes Requiring User Action
### Updated Keyboard Codebases
| Old Keyboard Name | New Keyboard Name |
|------------------------|----------------------|
| chew | chew/split |
| deemen17/de60fs | deemen17/de60/r1 |
| keyten/kt60hs_t | keyten/kt60hs_t/v1 |
| plywrks/ply8x | plywrks/ply8x/solder |
| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 |
| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 |
## Deprecation Notices
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
The new defaults can be configured in the following ways:
:::::tabs
==== keyboard.json
```json [keyboard.json]
{
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
```
==== keymap.json
```json [keymap.json]
{
"config": {
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
}
```
==== config.h
```c [config.h]
#pragma once
#define NKRO_DEFAULT_ON true // [!code focus]
```
:::::
The deprecated options will be removed in a future breaking changes cycle.
### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`.
see the [Converters Feature](../feature_converters) documentation for more information.
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
Parent folders containing common configuration would create invalid build targets.
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
Backwards compatibility of build targets has been maintained where possible.
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
Converter support will be further limited to only function if a keyboard declares that is is compatible.
This can be configured in the following ways:
:::::tabs
==== keyboard.json
```json [keyboard.json]
{
"development_board": "promicro", // [!code focus]
}
```
==== rules.mk
```make [rules.mk]
PIN_COMPATIBLE = promicro
```
:::::
see the [Converters Feature](../feature_converters) documentation for more information.
### Deprecation of `encoder_update_{kb|user}`
These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map).
`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely.
To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`:
:::::tabs
=== 1. Add keycode definitions
Define new keycodes:
```c
enum {
MY_ENCODER_LEFT = QK_USER, // [!code focus]
MY_ENCODER_RIGHT, // [!code focus]
};
```
=== 2. Add encoder mapping
Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence):
```c
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus]
[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
};
#endif
```
=== 3. Add keycode processing
Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap:
```c
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MY_ENCODER_LEFT: // [!code focus]
if (record->event.pressed) { // [!code focus]
// Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus]
} // [!code focus]
return false; // Skip all further processing of this keycode // [!code focus]
case MY_ENCODER_RIGHT: // [!code focus]
if (record->event.pressed) { // [!code focus]
// Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus]
} // [!code focus]
return false; // Skip all further processing of this keycode // [!code focus]
}
}
```
=== 4. Remove old code
Remove your implementation of `encoder_update_user` from your `keymap.c`.
::::::
If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above.
## Full changelist
Core:
* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356))
* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423))
* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666))
* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787))
* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952))
* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990))
* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042))
* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050))
* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129))
* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135))
* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141))
* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171))
* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173))
* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176))
* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184))
* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187))
* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199))
* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200))
* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201))
* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203))
* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207))
* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219))
* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255))
* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271))
* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280))
CLI:
* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553))
* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680))
* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061))
* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085))
* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116))
* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149))
* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182))
* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251))
Submodule updates:
* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301))
* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178))
* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274))
Keyboards:
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459))
* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558))
* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884))
* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690))
* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723))
* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764))
* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785))
* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932))
* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001))
* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005))
* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010))
* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046))
* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070))
* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080))
* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088))
* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142))
* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146))
* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157))
* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169))
* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181))
* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189))
* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190))
* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193))
* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208))
* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246))
* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266))
* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268))
* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287))
* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288))
* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293))
* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294))
Keyboard fixes:
* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018))
* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209))
* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295))
Others:
* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997))
* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191))
Bugs:
* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015))
* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060))
* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121))
* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166))
* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175))
* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194))
* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204))
* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210))
* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238))
* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250))
* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254))
* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263))
* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272))
* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298))

Some files were not shown because too many files have changed in this diff Show More